Browse Source

hrhi后端代码

chenzhfa 3 năm trước cách đây
mục cha
commit
51b3ab7ef4
42 tập tin đã thay đổi với 11073 bổ sung962 xóa
  1. 3 2
      hrhi/.classpath
  2. 12 0
      hrhi/META-INF/trainpsn.upm
  3. 10 0
      hrhi/resources/cloudapi.properties
  4. 0 137
      hrhi/src/client/nccloud/web/hrcm/contopinion/action/OpinionRemcSendMsgAction.java
  5. 218 0
      hrhi/src/client/nccloud/web/hrhi/cardrep/action/CardrptBaseAction.java
  6. 45 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/action/PsndocSubQueryPKAction.java
  7. 51 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/action/TrainExportAction.java
  8. 39 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/action/TrainExportErrorAction.java
  9. 59 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/action/TrainImportAction.java
  10. 139 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/action/TrainImportInDBAction.java
  11. 343 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/action/ZipDownLoadAction.java
  12. 75 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/vo/DefdocRefDatas.java
  13. 44 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/vo/ExportFile.java
  14. 81 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/vo/ImportBean.java
  15. 100 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/vo/ImportHead.java
  16. 352 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/vo/TrainPsndocXlsExporter.java
  17. 686 0
      hrhi/src/client/nccloud/web/hrhi/psndoc/vo/TrainPsndocXlsImport.java
  18. 248 0
      hrhi/src/client/yyconfig/modules/hrhi/psndoc/config/action/hrhi_psndoc.xml
  19. 58 0
      hrhi/src/client/yyconfig/modules/hrhi/psndoc/config/authorize/60071020_authorize.xml
  20. 232 0
      hrhi/src/private/nc/impl/hi/psndoc/PsndocTrainServiceImpl.java
  21. 3518 0
      hrhi/src/private/nc/impl/hr/pub/PersonRecordImpl.java
  22. 139 0
      hrhi/src/private/nc/impl/hr/train/CloudFinshDetailPlugin.java
  23. 94 0
      hrhi/src/private/nc/impl/hr/train/CloudKngcatalogsPlugin.java
  24. 116 0
      hrhi/src/private/nc/impl/hr/train/CloudKnowledgesPlugin.java
  25. 301 0
      hrhi/src/private/nc/impl/hr/train/CloudOnlineuserknowledgePlugin.java
  26. 143 0
      hrhi/src/private/nc/impl/hr/train/CloudPlanDetailPlugin.java
  27. 116 0
      hrhi/src/private/nc/impl/hr/train/CloudPsnPlugin.java
  28. 135 0
      hrhi/src/private/nc/impl/hr/train/CloudTrainningContentPlugin.java
  29. 262 0
      hrhi/src/private/nc/impl/hr/train/TrainCloudSchoolImpl.java
  30. 130 0
      hrhi/src/private/nc/impl/hr/train/TrainSubImportPlugin.java
  31. 0 734
      hrhi/src/private/nc/impl/hrcm/contopinion/ContopinionManageServiceImpl.java
  32. 16 0
      hrhi/src/public/nc/itf/hi/IPsndocTrainService.java
  33. 0 89
      hrhi/src/public/nc/itf/hrcm/IContopinionManageService.java
  34. 228 0
      hrhi/src/public/nc/vo/hi/cloud/train/CloudFinshDetailVO.java
  35. 57 0
      hrhi/src/public/nc/vo/hi/cloud/train/CloudKngcatalogsVO.java
  36. 314 0
      hrhi/src/public/nc/vo/hi/cloud/train/CloudKnowledgesVO.java
  37. 234 0
      hrhi/src/public/nc/vo/hi/cloud/train/CloudOnlineuserknowledge.java
  38. 236 0
      hrhi/src/public/nc/vo/hi/cloud/train/CloudPlanDetailVO.java
  39. 288 0
      hrhi/src/public/nc/vo/hi/cloud/train/CloudPsnVO.java
  40. 220 0
      hrhi/src/public/nc/vo/hi/cloud/train/CloudTrainingContentVO.java
  41. 647 0
      hrhi/src/public/nc/vo/hi/entrymng/EntryapplyVO.java
  42. 1084 0
      hrhi/src/public/nc/vo/hi/psndoc/TrainVO.java

+ 3 - 2
hrhi/.classpath

@@ -4,6 +4,9 @@
 	<classpathentry kind="src" output="out/private" path="src/private"/>
 	<classpathentry kind="src" output="out/client" path="src/client"/>
 	<classpathentry kind="src" output="out/test" path="src/test"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/hrcm"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/hrtrn"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/hrwa"/>
 	<classpathentry kind="src" output="out/resources" path="resources"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="con" path="nc.uap.mde.library.container/Ant_Library"/>
@@ -15,7 +18,5 @@
 	<classpathentry kind="con" path="nc.uap.mde.library.container/Module_Private_Library"/>
 	<classpathentry kind="con" path="nc.uap.mde.library.container/Module_Lang_Library"/>
 	<classpathentry kind="con" path="nc.uap.mde.library.container/Generated_EJB"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/hrcm"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/hrtrn"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>

+ 12 - 0
hrhi/META-INF/trainpsn.upm

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module name="nccloud.itf.hr.hi.HRhiEJB">
+	<public>
+
+		<component priority="0" singleton="true" remote="true" tx="CMT" supportAlias="true">
+			<interface>nc.itf.hi.IPsndocTrainService</interface>
+			<implementation>nc.impl.hi.psndoc.PsndocTrainServiceImpl</implementation>
+		</component>
+
+	</public>
+</module>
+

+ 10 - 0
hrhi/resources/cloudapi.properties

@@ -0,0 +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
+
+#prod
+cloudapi.apikey=e8765865-58b1-4d11-8c33-95e6b5336fea
+cloudapi.secretKey=54705a73-1f8f-43f0-baff-6b9b6c964a87
+cloudapi.url=http://sdcs-api-dpb.yunxuetang.cn
+

+ 0 - 137
hrhi/src/client/nccloud/web/hrcm/contopinion/action/OpinionRemcSendMsgAction.java

@@ -1,137 +0,0 @@
-package nccloud.web.hrcm.contopinion.action;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import nc.hr.utils.ResHelper;
-import nc.itf.hrcm.IContopinionManageService;
-import nc.pub.tools.HRCMCommonValue;
-import nc.vo.hrcm.contopinion.ContopinionVO;
-import nc.vo.pub.BusinessException;
-import nc.vo.pub.BusinessRuntimeException;
-import nc.vo.uif2.LoginContext;
-import nccloud.commons.lang.ArrayUtils;
-import nccloud.commons.lang.StringUtils;
-import nccloud.framework.service.ServiceLocator;
-import nccloud.framework.web.container.IRequest;
-import nccloud.web.hr.pub.HRCommonAction;
-import nccloud.web.hr.pub.HRNccTemplateUtils;
-import nccloud.web.hr.pub.HRNccUtils;
-import nccloud.web.uapbd.commons.web.ParamUtils;
-
-/**
- * 合同续签意见征询【发送续签征询消息】操作
- * @author tianxfc
- *
- */
-public class OpinionRemcSendMsgAction extends HRCommonAction{
-	
-	private Integer	icntsucc = 0;	// 成功发送的消息数
-	
-	@Override
-	public <T> Object execute(IRequest request, T para) throws Exception {
-		ParamUtils param = new ParamUtils(request);
-		LoginContext context = HRNccUtils.getLoginContext(param);
-		
-		String pk_org = param.getString("pk_org", null);
-		if(StringUtils.isEmpty(pk_org)){
-			throw new BusinessRuntimeException(ResHelper.getString("6001uif2", "06001uif20070")/* @res 请先选择人力资源组织! */);
-		}
-		// 是否发送标识,第一次调用接口传N,第二次调用接口传Y
-		String sendCheckStr = param.getString("sendCheck", "Y");
-        boolean sendCheck = "Y".equals(sendCheckStr);
-		ContopinionVO[] selDatas = HRNccTemplateUtils.getVOFromGrid(ContopinionVO.class, OpinionCommon.getModelStr(param, "contopiniongrid"));
-		if(ArrayUtils.isEmpty(selDatas)){
-			throw new BusinessRuntimeException(ResHelper.getString("6011opin", "06011opin0025")/* @res"请选择要操作的记录!" */);
-		}
-		return sendContOpinion(selDatas, context, sendCheck);
-	}
-	
-	private String sendContOpinion(ContopinionVO[] contopinionVOs, LoginContext context, boolean sendCheck) throws Exception {
-		/**未征询或者未反馈续签意见*/
-		ArrayList<ContopinionVO> vtemp = new ArrayList<ContopinionVO>();
-		/**反馈中的续签意见*/
-		ArrayList<ContopinionVO> inFeedbackList = new ArrayList<ContopinionVO>();
-		for (int i = 0; i < contopinionVOs.length; i++) {
-			// conttype: 处理结果: 0=未征询,1=未反馈,2=反馈中,3=已反馈,4=已续签,5=已终止
-			if (contopinionVOs[i].getConttype().equals(HRCMCommonValue.STATE_NOCONSULT) || contopinionVOs[i].getConttype().equals(HRCMCommonValue.STATE_NOFEEDBACK)) {
-				vtemp.add(contopinionVOs[i]);
-			}
-			//modify by@chenzf 续签意见征询员工续签期限 2021-1-11 17:21:49 begin
-//			if(contopinionVOs[i].getConttype().equals(HRCMCommonValue.STATE_INFEEDBACK)){
-//				inFeedbackList.add(contopinionVOs[i]);
-//			}
-			if(contopinionVOs[i].getConttype().equals(HRCMCommonValue.STATE_INFEEDBACK) || contopinionVOs[i].getConttype().equals(HRCMCommonValue.STATE_NOCONSULT) || contopinionVOs[i].getConttype().equals(HRCMCommonValue.STATE_NOFEEDBACK)){
-				inFeedbackList.add(contopinionVOs[i]);
-			}
-			//modify by@chenzf 续签意见征询员工续签期限 2021-1-11 17:21:49 end
-		}
-		if (vtemp.size() < 1 && inFeedbackList.size() < 1) {
-			throw new BusinessException(ResHelper.getString("6011opin", "06011opin0008")/* @res"只有未反馈、未征询、反馈中的人员才能发送通知!" */);
-		}
-		// 校验是否存在符合征询条件的记录
-		HashMap<String, Object> map = ServiceLocator.find(IContopinionManageService.class).getPsnjobDeptMap(vtemp.toArray(new ContopinionVO[0]));
-		String[] deptPKs = (String[]) map.get("pks");
-
-		String msg=null;
-		if(inFeedbackList.size()<1){
-			msg = (String) map.get("msg");
-			//当反馈中的数据为0,包含未反馈的数据,并且未征询和未反馈的都没有部门负责人时,不能征询意见
-			if(ArrayUtils.isEmpty(deptPKs)){
-				throw new BusinessException(ResHelper.getString("6011opin", "06011opin0019"));
-			}
-		}else if(ArrayUtils.isEmpty(deptPKs) || deptPKs.length < 1){
-			//只有反馈中
-			/*"您选中的部分人员的处理状态为“反馈中”,系统将给符合条件员工发送征询意见催办通知,确认发送吗?"*/;
-			msg = ResHelper.getString("6011opin", "06011opin0060");
-		}else{
-			//同时包含反馈中和未反馈
-			/*"您选中的人员的处理状态包含“未反馈”和“反馈中”,系统将给符合条件人员的部门负责人或员工发送征询意见通知,确认发送吗?"*/
-			msg = ResHelper.getString("6011opin", "06011opin0061");
-		}
-		
-		if(msg != null) {
-			msg = "您好!您与公司的劳动合同即将到期,您满足签订无固定期限劳动合同的条件,请您反馈您的意向劳动合同期限类型。无固定期限/固定期限";
-		}
-		
-		// 是否发送标识,第一次调用接口false,第二次调用接口true
-		if(sendCheck){
-//			return ResHelper.getString("6011opin", "06011opin0057")/* @res "确认发送" */ + "\n" + msg;
-			return msg;
-		}
-		ContopinionVO[] vos = (ContopinionVO[]) map.get("vos");
-		HashMap<String, List<ContopinionVO>> contopMap = new HashMap<String, List<ContopinionVO>>();
-		HashMap<String, List<String>> psndeptMap = new HashMap<String, List<String>>();
-		if(!ArrayUtils.isEmpty(deptPKs)){			
-			for(int i = 0; i < deptPKs.length; i++){// 一个部门生成一个对应的通知
-				List<ContopinionVO> depttemp = new ArrayList<ContopinionVO>();
-				List<String> psndocList = new ArrayList<String>();
-				for(ContopinionVO vo : vos){
-					if(vo.getPk_dept().equals(deptPKs[i])){
-						depttemp.add(vo);
-						psndocList.add(vo.getPk_psnjob());
-					}
-				}
-				contopMap.put(deptPKs[i], depttemp);
-				psndeptMap.put(deptPKs[i], psndocList);
-			}
-		}
-
-		//modify by@chenzf 续签意见征询员工续签期限 2021-1-11 17:21:49 begin
-//		HashMap<String, Object> sendMsgMap = ServiceLocator.find(IContopinionManageService.class)
-//				.sendNoticeToDeptManager(psndeptMap, contopMap, context.getPk_group(), context.getPk_org(), vos, inFeedbackList);
-		HashMap<String, Object> sendMsgMap = ServiceLocator.find(IContopinionManageService.class)
-				.sendNoticeToPsn(psndeptMap, contopMap, context.getPk_group(), context.getPk_org(), vos, inFeedbackList);
-		//modify by@chenzf 续签意见征询员工续签期限 2021-1-11 17:21:49 end
-		icntsucc = (Integer) sendMsgMap.get("cnt");
-		if(icntsucc > 0){
-			// 提示发送成功信息
-			return ResHelper.getString("6011opin", "06011opin0010"/* @res "发送消息成功,共发送消息[{0}]条。" */, icntsucc.toString());
-		}else{
-			// 如果发送不成功,提示错误信息
-			throw new BusinessException(ResHelper.getString("6011opin", "06011opin0011")/* @res "发送消息失败!" */);
-		}
-	}
-	
-}

+ 218 - 0
hrhi/src/client/nccloud/web/hrhi/cardrep/action/CardrptBaseAction.java

@@ -0,0 +1,218 @@
+package nccloud.web.hrhi.cardrep.action;
+
+import nc.bs.logging.Logger;
+import nc.hr.utils.MultiLangHelper;
+import nc.hr.utils.ResHelper;
+import nc.itf.hr.frame.IPersistenceRetrieve;
+import nc.itf.hr.tools.rtf.IGenerateRTFDocument;
+import nc.ui.hr.tools.rtf.jacob.RtfHelper;
+import nc.ui.hr.tools.rtf.jacob.WordUtil;
+import nc.vo.hi.repdef.RepDefVO;
+import nc.vo.hr.tools.rtf.RtfTemplateVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.uif2.LoginContext;
+import nccloud.commons.lang.StringUtils;
+import nccloud.framework.core.io.WebFile;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.web.hr.pub.HRCommonAction;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.poi.hwpf.HWPFDocument;
+import org.apache.poi.hwpf.converter.PicturesManager;
+import org.apache.poi.hwpf.converter.WordToHtmlConverter;
+import org.apache.poi.hwpf.usermodel.PictureType;
+import org.jodconverter.JodConverter;
+import org.jodconverter.office.LocalOfficeManager;
+import org.jodconverter.office.LocalOfficeUtils;
+import org.jodconverter.office.OfficeException;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.util.Base64;
+
+/**
+ * 人员卡片基础类
+ *
+ * @author chenchgf
+ */
+public abstract class CardrptBaseAction extends HRCommonAction {
+
+	protected Object getObject(String operateType, ParamUtils param, LoginContext context) throws BusinessException {
+		String pk_psnjob = param.getString("pk_psnjob", null);
+		if (StringUtils.isBlank(pk_psnjob)) {
+			throw new BusinessException(ResHelper.getString("6007psn", "16007psn0084")/* @res "未选择人员!" */);
+		}
+		String pk_rpt_def = param.getString("pk_rpt_def", null);
+		if (StringUtils.isBlank(pk_rpt_def)) {
+			throw new BusinessException(ResHelper.getString("6007psn", "16007psn0085")/* @res "未选择人员卡片!" */);
+		}
+		RepDefVO rptVO = (RepDefVO) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByPk(null, RepDefVO.class, pk_rpt_def);
+
+		String filePathName = null;
+		String tempFile = null;
+		String temprtfFile = null;
+		try {
+			String previewFileName = "preview_word_" + System.currentTimeMillis();
+			tempFile = RtfHelper.strDocTempletDirPath + previewFileName + ".doc"; // ui包可用???
+			temprtfFile = tempFile.replace(".doc", ".rtf");
+
+			if (System.getProperty("os.name").startsWith("Windows")) {
+				byte[] ba = WordUtil.changeTemplete(((RtfTemplateVO) rptVO.getObj_rpt_def()).getRtfDocument(), tempFile);
+				((RtfTemplateVO) rptVO.getObj_rpt_def()).setRtfDocument(ba);
+			}
+
+			IGenerateRTFDocument grd = ServiceLocator.find(IGenerateRTFDocument.class);
+			byte bytes[] = grd.createRtfFile(context, pk_psnjob, "psndoc", rptVO, null);
+
+			String rptName = (String) rptVO.getAttributeValue(RepDefVO.RPT_NAME + MultiLangHelper.getLangIndex());
+			String currentTime = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss").format(System.currentTimeMillis());
+			String filename = rptName + "_" + currentTime;
+			filePathName = RtfHelper.strDocTempletDirPath + filename;
+			FileUtils.writeByteArrayToFile(new File(filePathName + ".rtf"), bytes);
+
+			if ("preview".equals(operateType)) {
+				// 使用JodConverter直接将rtf转为html后内容有问题,所以先用JodConverter将rtf转为doc,再用poi将doc转为html
+				convertFileFormatWithJod(filePathName + ".rtf", filePathName + ".doc");
+				convertDocToHtmlWithPoi(filePathName + ".doc", filePathName + ".html");
+				return FileUtils.readFileToString(new File(filePathName + ".html"), "UTF-8");
+			} else if ("export".equals(operateType)) {
+				ByteArrayInputStream bis = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(filePathName + ".rtf")));
+				WebFile webfile = new WebFile(filename + ".rtf", bis);
+				return webfile;
+			} else {
+				return null;
+			}
+		} catch (Exception e) {
+			Logger.error(e.getMessage(), e);
+			throw new BusinessException(ResHelper.getString("6007psn", "06007psn0015")/* @res "卡片报表导出发生错误!" */ + " " + e.getMessage());
+		} finally {
+			WordUtil.deleteTempFile(tempFile);
+			WordUtil.deleteTempFile(temprtfFile);
+			WordUtil.deleteTempFile(filePathName + ".rtf");
+			WordUtil.deleteTempFile(filePathName + ".html");
+			deleteAllTempFile(filePathName + ".files");
+		}
+	}
+
+	/**
+	 * 使用JodConverter转换文件格式
+	 *
+	 * @param inputFilename
+	 * @param outputFilename
+	 * @throws BusinessException
+	 */
+	private void convertFileFormatWithJod(String inputFilename, String outputFilename) throws BusinessException {
+		Logger.error("JodConverter: convert begin...");
+		LocalOfficeManager officeManager = null;
+		try {
+
+			if (System.getProperty("os.name").startsWith("Windows")) {
+				Logger.error("JodConverter for Windows: os.name : " + System.getProperty("os.name"));
+				officeManager = LocalOfficeManager.builder().install().build();
+			} else if (System.getProperty("os.name").startsWith("Linux")) {
+				Logger.error("JodConverter for Linux: os.name : " + System.getProperty("os.name"));
+				officeManager = LocalOfficeManager.builder().install().build();
+			} else {
+				Logger.error("JodConverter for Other System: os.name : " + System.getProperty("os.name"));
+				officeManager = LocalOfficeManager.builder().install().build();
+				// throw new BusinessException("JodConverter: Unsupported System!");
+			}
+			Logger.error("JodConverter using office home: " + LocalOfficeUtils.getDefaultOfficeHome());
+		} catch (Exception e) {
+			throw new BusinessException(ResHelper.getString("6007psn", "16007psn0088")/* @res "未安装" */ + " OpenOffice " +
+					ResHelper.getString("6007psn", "16007psn0089")/* @res "或" */ + " LibreOffice!\n", e);
+		}
+
+		try {
+			officeManager.start();
+		} catch (OfficeException e) {
+			Logger.error("Office manager failed to start!", e);
+			throw new BusinessException("Office manager failed to start! Please check if you have any disk space left!", e);
+		}
+		try {
+			JodConverter.convert(new File(inputFilename)).to(new File(outputFilename)).execute();
+		} catch (OfficeException e) {
+			Logger.error("Office manager failed to convert!", e);
+			// throw new BusinessException("JodConverter converting gets wrong!", e);
+		}
+		try {
+			officeManager.stop();
+		} catch (OfficeException e) {
+			Logger.error("Office manager failed to stop!", e);
+			throw new BusinessException("Office manager failed to stop!", e);
+		}
+		Logger.error("JodConverter: convert rtf to doc finished...");
+	}
+
+	/**
+	 * poi方式 - convert doc to html
+	 *
+	 * @param inputFilename
+	 * @param outputFilename
+	 * @throws TransformerException
+	 * @throws IOException
+	 * @throws ParserConfigurationException
+	 */
+	public static void convertDocToHtmlWithPoi(String inputFilename, String outputFilename)
+			throws TransformerException, IOException, ParserConfigurationException {
+		Base64.Encoder encoder = Base64.getEncoder();
+		HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(inputFilename));
+
+		WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
+				DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
+		wordToHtmlConverter.setPicturesManager(new PicturesManager() {
+			public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches,
+									  float heightInches) {
+				String encodedText = new String(encoder.encode(content));
+				String imgSrc = "data:" + pictureType.getMime() + ";" + "base64," + encodedText;
+				return imgSrc;
+			}
+		});
+		wordToHtmlConverter.processDocument(wordDocument);
+
+		org.w3c.dom.Document htmlDocument = wordToHtmlConverter.getDocument();
+		DOMSource domSource = new DOMSource(htmlDocument);
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		StreamResult streamResult = new StreamResult(out);
+
+		TransformerFactory tf = TransformerFactory.newInstance();
+		Transformer serializer = tf.newTransformer();
+		serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+		serializer.setOutputProperty(OutputKeys.INDENT, "yes");
+		serializer.setOutputProperty(OutputKeys.METHOD, "html");
+		serializer.transform(domSource, streamResult);
+		out.close();
+		FileUtils.writeByteArrayToFile(new File(outputFilename), out.toByteArray());
+		Logger.error("PoiConverter: convert doc to html finished...");
+	}
+
+	/**
+	 * 删除临时文件夹
+	 *
+	 * @param strBaseDir
+	 */
+	private void deleteAllTempFile(String strBaseDir) {
+		File f = new File(strBaseDir);
+		if (!f.exists()) {
+			return;
+		}
+		File fa[] = f.listFiles();
+
+		try {
+			for (int i = 0; i < fa.length; i++) {
+				fa[i].delete();
+			}
+			f.delete();
+		} catch (Exception e) {
+			/** 忽略,有可能正在被使用 */
+		}
+	}
+}

+ 45 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/action/PsndocSubQueryPKAction.java

@@ -0,0 +1,45 @@
+package nccloud.web.hrhi.psndoc.action;
+
+import nc.md.model.IBean;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.BusinessRuntimeException;
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.lang.UFDate;
+import nc.vo.pubapp.AppContext;
+import nc.vo.uif2.LoginContext;
+import nccloud.commons.lang.StringUtils;
+import nccloud.framework.web.container.IRequest;
+import nccloud.web.hr.pub.HRCommonAction;
+import nccloud.web.hr.pub.HRNccTemplateUtils;
+import nccloud.web.hr.pub.HRNccUtils;
+import nccloud.web.hrhi.pub.MetaDataUtils;
+import nccloud.web.hrhi.pub.PsndocTempUtils;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+
+/**
+ * 查询行主键
+ */
+public class PsndocSubQueryPKAction extends HRCommonAction {
+    @Override
+    public <T> Object execute(IRequest request, T para) throws Exception {
+        ParamUtils param = new ParamUtils(request);
+        LoginContext context = HRNccUtils.getLoginContext(param);
+        // hr组织id,
+        if (StringUtils.isBlank(context.getPk_org())) {
+            throw new BusinessRuntimeException("Parameter Error!");
+        }
+        String tableCode = param.getString("table_code", null);
+        if (StringUtils.isBlank(tableCode)) {
+            // 参数错误 
+            throw new BusinessRuntimeException("tableCode Parameter Error!");
+        }
+        IBean bean = MetaDataUtils.getBeanByName("hrhi", tableCode);
+        Class subClass = Class.forName(bean.getFullClassName());
+        SuperVO[] subSetVOs = (SuperVO[]) HRNccTemplateUtils.getVOFromGrid(subClass, PsndocTempUtils.getModelStr(param, null));
+        if (subSetVOs == null || subSetVOs.length == 0) {
+            throw new BusinessException("没有要上传附件的行");
+        }
+        String pk = subSetVOs[0].getPrimaryKey();
+        return pk;
+    }
+}

+ 51 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/action/TrainExportAction.java

@@ -0,0 +1,51 @@
+package nccloud.web.hrhi.psndoc.action;
+
+import java.util.List;
+import java.util.Map;
+
+import nc.vo.bd.pub.NODE_TYPE;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.uif2.LoginContext;
+import nccloud.framework.core.io.WebFile;
+import nccloud.framework.web.action.itf.ICommonAction;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.json.JsonFactory;
+import nccloud.web.hr.pub.HRNccUtils;
+import nccloud.web.hrhi.psndoc.vo.ExportFile;
+import nccloud.web.hrhi.psndoc.vo.ImportHead;
+import nccloud.web.hrhi.psndoc.vo.TrainPsndocXlsExporter;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+import nccloud.base.exception.ExceptionUtils;
+import nccloud.commons.lang.ArrayUtils;
+
+public class TrainExportAction implements ICommonAction{
+
+	@Override
+	public Object doAction(IRequest request) {
+//		Map<String, String[]> readParameters = request.readParameters();
+//		ParamUtils param = new ParamUtils(request);
+//        LoginContext context = HRNccUtils.getLoginContext(param);
+		Map<String, String[]> readParameters = request.readParameters();
+		if (readParameters.isEmpty()) {
+			return null;
+		}
+		String[] querys = (String[])readParameters.get("querystr");
+		if (ArrayUtils.isEmpty(querys)) {
+			return null;
+		}
+		String jsonStr = ((String[])readParameters.get("querystr"))[0];
+		Map<String, String> map = (Map)JsonFactory.create().fromJson(jsonStr, Map.class);
+		map.put("node_type", NODE_TYPE.ORG_NODE.toString());
+		List<Map<String, Object>> headList = ImportHead.getHead();
+		
+		TrainPsndocXlsExporter exporter = new TrainPsndocXlsExporter();
+		try {
+			ExportFile importFile = exporter.exportToFile(null, headList, UFBoolean.TRUE, map.get("pk_org"), map.get("pk_group"));
+			return new WebFile(importFile.getFileName(), importFile.getInputStream());
+		} catch (Exception e) {
+			ExceptionUtils.wrapBusinessException(e.getMessage());
+			return null;
+		}
+	}
+
+}

+ 39 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/action/TrainExportErrorAction.java

@@ -0,0 +1,39 @@
+package nccloud.web.hrhi.psndoc.action;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.Map;
+import nc.hr.utils.HRFileUtils;
+import nccloud.base.exception.ExceptionUtils;
+import nccloud.commons.lang.ArrayUtils;
+import nccloud.framework.core.io.WebFile;
+import nccloud.framework.web.action.itf.ICommonAction;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.container.SessionContext;
+import nccloud.web.hrwa.helper.DeleteFileUtil;
+
+public class TrainExportErrorAction implements ICommonAction {
+
+	@Override
+	public Object doAction(IRequest request) {
+	    Map<String, String[]> readParameters = request.readParameters();
+	    
+	    String errorFile = ArrayUtils.isEmpty((Object[])readParameters.get("errorFile")) ? null : (String)readParameters.get("errorFile")[0];
+	    String pk_loginUser = SessionContext.getInstance().getClientInfo().getUserid();
+	    
+	    File file = new File(HRFileUtils.getExportPath() + "/hrhifile/psndoc/errorfile/" + pk_loginUser + "/" + errorFile);
+	    if (!file.exists()) {
+	      ExceptionUtils.wrapBusinessException("²ÎÊýÎÞЧ");
+	    }
+	    
+	    WebFile webfile = null;
+	    try {
+	      webfile = new WebFile(errorFile, new FileInputStream(file));
+	    } catch (FileNotFoundException e) {
+	      ExceptionUtils.wrapBusinessException(e.getMessage());
+	    } 
+	    return webfile;
+	  }
+
+}

+ 59 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/action/TrainImportAction.java

@@ -0,0 +1,59 @@
+package nccloud.web.hrhi.psndoc.action;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import nc.bs.logging.Logger;
+import nc.vo.pub.BusinessException;
+import nc.vo.uif2.LoginContext;
+import nccloud.base.exception.ExceptionUtils;
+import nccloud.commons.lang.ArrayUtils;
+import nccloud.framework.core.io.WebFile;
+import nccloud.framework.web.action.itf.ICommonAction;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.container.SessionContext;
+import nccloud.web.hr.pub.HRNccUtils;
+import nccloud.web.hrhi.psndoc.vo.ImportBean;
+import nccloud.web.hrhi.psndoc.vo.ImportHead;
+import nccloud.web.hrhi.psndoc.vo.TrainPsndocXlsImport;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+
+public class TrainImportAction implements ICommonAction {
+
+	@Override
+	public Object doAction(IRequest request) {
+		WebFile[] webfiles = request.readFiles();
+	    if (ArrayUtils.isEmpty(webfiles)) {
+	    	ExceptionUtils.wrapBusinessException("ÉÏ´«ÎļþΪ¿Õ");
+	    }
+	    ParamUtils param = new ParamUtils(request);
+        LoginContext context = HRNccUtils.getLoginContext(param);
+	    List<Map<String, Object>> headList = ImportHead.getHead();
+	    String pk_group = context.getPk_group();
+	    String pk_org = context.getPk_org();
+	    ImportBean datas = null;
+	    try {
+	        TrainPsndocXlsImport importer = new TrainPsndocXlsImport();
+	        String pk_loginUser = SessionContext.getInstance().getClientInfo().getUserid();
+	        datas = importer.importFormFile(webfiles[0].getInputStream(), headList, webfiles[0].getFileName(), pk_group, pk_org, pk_loginUser);
+	      }
+	      catch (BusinessException e) {
+	        Logger.error(e.getMessage(), e);
+	      } 
+	    
+	    
+	    Map<String, Object> map = new HashMap<String, Object>();
+	    if (datas != null && datas.isError()) {
+	      map.put("isSuccess", "Y");
+	      map.put("datas", datas.getVector());
+	      map.put("head", datas.getHeadVector());
+	    } else {
+	      map.put("isSuccess", "N");
+	      map.put("errorMessage", datas.getErrorMessage());
+	      map.put("errorFile", datas.getErrorFile());
+	    } 
+	    return map;
+	}
+
+}

+ 139 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/action/TrainImportInDBAction.java

@@ -0,0 +1,139 @@
+package nccloud.web.hrhi.psndoc.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.mozilla.javascript.edu.emory.mathcs.backport.java.util.Collections;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.itf.hi.IPsndocTrainService;
+import nc.vo.hi.psndoc.TrainVO;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.pub.lang.UFDouble;
+import nc.vo.pub.lang.UFLiteralDate;
+import nc.vo.uif2.LoginContext;
+import nccloud.base.exception.ExceptionUtils;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.container.IRequest;
+import nccloud.web.hr.pub.HRCommonAction;
+import nccloud.web.hr.pub.HRNccUtils;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+
+public class TrainImportInDBAction extends HRCommonAction {
+
+	@Override
+	public <T> Object execute(IRequest request, T para) throws Exception {
+		ParamUtils param = new ParamUtils(request);
+	    LoginContext loginContext = HRNccUtils.getLoginContext(param);
+	    
+	    List list = param.getList("datas", null);
+	    if (null == list || list.isEmpty()) {
+	      ExceptionUtils.wrapBusinessException("没有可导入的数据");
+	    }
+	    
+	    TrainVO[] trainVOs = new TrainVO[list.size()];
+	    Set<String> set = new HashSet<String>();
+	    for (int i = 0; i < list.size(); i++) {
+	        JSONObject obj = JSON.parseObject(JSON.toJSONString(list.get(i)));
+	        TrainVO vo = new TrainVO();
+	        vo.setPk_psndoc(obj.getString("pk_psndoc"));
+	        vo.setAct_name(obj.getString("act_name"));
+	        if (StringUtils.isNotBlank(obj.getString("begindate"))) {
+	        	vo.setBegindate(new UFLiteralDate(obj.getString("begindate")));
+	        }
+	        if (StringUtils.isNotBlank(obj.getString("enddate"))) {
+	        	vo.setEnddate(new UFLiteralDate(obj.getString("enddate")));
+	        }
+	        vo.setTra_type(obj.getString("tra_type"));
+	        vo.setTra_mode(obj.getString("tra_mode"));
+	        vo.setTraim(obj.getString("traim"));
+	        vo.setTra_content(obj.getString("tra_content"));
+	        vo.setTrm_location(obj.getString("trm_location"));
+	        if(StringUtils.isNotBlank(obj.getString("tra_time"))) {
+	        	vo.setTra_time(new UFDouble(obj.getString("tra_time")));
+	        }
+	        if(StringUtils.isNotBlank(obj.getString("tra_cost"))) {
+	        	vo.setTra_cost(new UFDouble(obj.getString("tra_cost")));
+	        }
+	        vo.setContcode(obj.getString("contcode"));
+	        vo.setTrm_certif_code(obj.getString("trm_certif_code"));
+	        vo.setTrm_certif_name(obj.getString("trm_certif_name"));
+	        if (StringUtils.isNotBlank(obj.getString("certificate_date"))) {
+	        	vo.setCertificate_date(new UFLiteralDate(obj.getString("certificate_date")));
+	        }
+	        vo.setCertificate_unit(obj.getString("certificate_unit"));
+	        vo.setSource_type(obj.getInteger("source_type"));
+	        if (StringUtils.isNotBlank(obj.getString("signon_dt"))) {
+	        	vo.setSignon_dt(new UFLiteralDate(obj.getString("signon_dt")));
+	        }
+	        vo.setTaketrm_method(obj.getInteger("taketrm_method"));
+	        vo.setEntrepreneur(obj.getString("entrepreneur"));
+	        vo.setAssist_unit(obj.getString("assist_unit"));
+	        vo.setPurveyor(obj.getString("purveyor"));
+	        if (StringUtils.isNotBlank(obj.getString("isallduty"))) {
+	        	vo.setIsallduty(new UFBoolean(obj.getBoolean(("isallduty"))));
+	        }
+	        vo.setAbsence_count(obj.getInteger("absence_count"));
+	        if(StringUtils.isNotBlank(obj.getString("ass_result"))) {
+	        	vo.setAss_result(new UFDouble(obj.getString("ass_result")));
+	        }
+	        vo.setAss_option(obj.getString("ass_option"));
+	        vo.setMemo(obj.getString("memo"));
+	        vo.setAct_code(obj.getString("act_code"));
+	        
+	        vo.setPk_group(loginContext.getPk_group());
+	        vo.setPk_org(loginContext.getPk_org());
+	        vo.setPsnCode(obj.getString("psnCode"));
+	        vo.setPsnName(obj.getString("psnName"));
+	        String[] names = vo.getAttributeNames();
+	        for(String key : names) {
+	        	if(key.contains("glbdef")) {
+	        		vo.setAttributeValue(key, obj.get(key));
+	        	}
+	        }
+	        trainVOs[i] = vo;
+	    }
+	    
+	    int importBefLen = trainVOs.length;
+//	    Arrays.sort(trainVOs);
+	    Collections.sort(Arrays.asList(trainVOs), new Comparator<TrainVO>() {
+			@Override
+			public int compare(TrainVO vo1, TrainVO vo2) {
+				if(vo1.getBegindate().compareTo(vo2.getBegindate()) > 0) {
+					return -1;
+				}else {
+					return 1;
+				}
+			}
+	    	
+	    });
+	    
+	    IPsndocTrainService service = (IPsndocTrainService)ServiceLocator.find(IPsndocTrainService.class);
+	    TrainVO[] failtureReports = service.importData2DB(trainVOs, loginContext);
+	    
+	    int importAftLen = failtureReports.length;
+	    StringBuffer sbMessage = new StringBuffer();
+	    sbMessage.append("成功导入条数:{"+(importBefLen - importAftLen)+"},导入失败条数:{"+importAftLen+"}。");
+	    sbMessage.append("\n");
+	    Arrays.sort(failtureReports);
+	    Map<String, Object> map = new HashMap<String, Object>();
+	    map.put("message", sbMessage.toString());
+	    if (importAftLen > 0) {
+	      sbMessage.append("失败原因请参考最后的【失败原因】一列。\\n 错误数据已经导出,请修改后重试!");
+	      map.put("errorNum", Integer.valueOf(importAftLen));
+	      map.put("errorDatas", failtureReports);
+	    } 
+	    return map;
+	    
+	}
+
+}

+ 343 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/action/ZipDownLoadAction.java

@@ -0,0 +1,343 @@
+package nccloud.web.hrhi.psndoc.action;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.framework.common.RuntimeEnv;
+import nc.bs.logging.Logger;
+import nc.bs.pub.filesystem.IAttachManageConst;
+import nc.itf.uap.IUAPQueryBS;
+import nc.jdbc.framework.processor.BeanListProcessor;
+import nc.ui.querytemplate.querytree.FromWhereSQL;
+import nc.vo.hr.infoset.InfoSetVO;
+import nc.vo.pub.filesystem.NCFileVO;
+import nc.vo.pub.lang.UFDate;
+import nccloud.framework.core.exception.ExceptionUtils;
+import nccloud.framework.core.io.WebFile;
+import nccloud.framework.core.json.IJson;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.action.itf.ICommonAction;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.container.RequestJsonVO;
+import nccloud.framework.web.json.JsonFactory;
+import nccloud.pubitf.platform.attachment.IAttachmentService;
+import nccloud.pubitf.platform.attachment.IFileStorageConst;
+import nccloud.web.hr.pub.HRNccQueryHelper;
+import uap.pub.fs.client.FileStorageClient;
+import uap.pub.fs.domain.basic.FileHeader;
+import uap.pub.fs.domain.ext.IFileStorageExt;
+
+public class ZipDownLoadAction implements ICommonAction {
+	
+	@SuppressWarnings("unchecked")
+	public Object doAction(IRequest request) {
+		try {
+			IJson gson = JsonFactory.create();
+			RequestJsonVO requestJsonVO = new RequestJsonVO();
+			IUAPQueryBS uapQueryBS = ServiceLocator.find(IUAPQueryBS.class);
+			IAttachmentService service = ServiceLocator.find(IAttachmentService.class);
+			 
+			Map<String, String[]> info = request.readParameters();
+			//downloadModel:1-按条件,2-按信息集
+			int downloadModel = Integer.valueOf(info.get("downloadModel")[0]);
+			//groupModel:1-按人,2-按信息集
+			int groupModel = Integer.valueOf(info.get("groupModel")[0]);
+			String[] allpks = info.get("allpks");
+			String downloadSearchModalValue = info.get("downloadSearchModalValue") == null ? null : ((String[])info.get("downloadSearchModalValue"))[0];
+			
+			String infosetPKs = info.get("infosetPKs") == null ? null : ((String[])info.get("infosetPKs"))[0];
+			String[] infoSetPks = null;
+			if(infosetPKs!=null) {
+				infoSetPks = infosetPKs.split(",");
+			}
+			//查询信息集
+			Map<String, InfoSetVO> infoSetVOMap = new HashMap<String, InfoSetVO>();
+			StringBuilder tableInfoSql = new StringBuilder("select table_code, infoset_name,infoset_code, pk_field_code \n");
+			tableInfoSql.append(" from hr_infoset").append("\n");
+			tableInfoSql.append(" where pk_infoset_sort = '1001Z710000000002XPO'").append("\n");
+			if(infoSetPks!=null){
+				tableInfoSql.append(" and ").append(nc.vo.pf.pub.util.SQLUtil.buildSqlForIn(" pk_infoset ", infoSetPks)).append("\n");
+			}
+			List<InfoSetVO> infoSetVOList = (List<InfoSetVO>) uapQueryBS.executeQuery(tableInfoSql.toString(),new BeanListProcessor(InfoSetVO.class));
+			for (InfoSetVO infoSetVO : infoSetVOList) {
+				infoSetVOMap.put(infoSetVO.getInfoset_code(), infoSetVO);
+			}
+			
+			Map<String,JSONArray> infosetCodeConditionJsonArrayMap = new HashMap<String,JSONArray>();
+			JSONObject jsonSearchinfo = null;
+            if(downloadModel==1 && downloadSearchModalValue!=null) {
+            	//按条件下载
+            	jsonSearchinfo = gson.fromJson(downloadSearchModalValue, JSONObject.class);
+    			JSONObject querycondition = jsonSearchinfo.getJSONObject("querycondition");
+    			JSONArray conditionJsonArray = querycondition.getJSONArray("conditions");
+    			
+    			for(int size=conditionJsonArray.size(),i=0;i<size;i++) {
+    				JSONObject conditionJson = conditionJsonArray.getJSONObject(i);
+    				String field = conditionJson.getString("field");
+    				String infosetCode = null;
+    				String[] fields = field.split("\\.");
+    				if (fields.length == 1) {
+    					infosetCode = "bd_psndoc";
+    				} else {
+    					infosetCode = fields[0];
+    				}
+    				JSONArray tmpConditionJsonArray = infosetCodeConditionJsonArrayMap.get(infosetCode);
+    				if (tmpConditionJsonArray == null) {
+    					tmpConditionJsonArray = new JSONArray();
+    					infosetCodeConditionJsonArrayMap.put(infosetCode, tmpConditionJsonArray);
+    				}
+    				tmpConditionJsonArray.add(conditionJson);
+    			}	
+    		}
+    			
+			StringBuilder unionSql = new StringBuilder();
+			StringBuilder sql = new StringBuilder();
+			sql.append("select sm_pub_filesystem.filepath path,\n");
+			sql.append("       sm_pub_filesystem.pk_doc,\n");
+			sql.append("       psndoc.code        creator,\n");
+			sql.append("       psndoc.name        isdoc,\n");
+			sql.append("       tableName        filetype\n");
+			sql.append("  from sm_pub_filesystem\n");
+			sql.append(" inner join (");
+			
+			for (InfoSetVO infoSetVO : infoSetVOList) {
+				String infosetCode = infoSetVO.getInfoset_code();
+				String tableCode = infoSetVO.getTable_code();
+				String pk_field_code = infoSetVO.getPk_field_code();
+				String whereSql = null;
+				String tableAlias = tableCode;
+				
+				JSONArray tmpConditionJsonArray = infosetCodeConditionJsonArrayMap.get(infosetCode);
+				if(downloadModel==1 && tmpConditionJsonArray==null) {
+					continue;
+				}
+				if(downloadModel==1 && tmpConditionJsonArray!=null) {
+					jsonSearchinfo.getJSONObject("querycondition").put("conditions", tmpConditionJsonArray);
+					JSONObject busiParamJson = new JSONObject();
+					busiParamJson.put("busiParamJson", jsonSearchinfo);
+					requestJsonVO.setBusiParamJson(jsonSearchinfo.toJSONString());
+					
+					request.setRequestJsonVO(requestJsonVO);
+					request.setJson(busiParamJson.toJSONString());
+					
+					HRNccQueryHelper queryHelper = new HRNccQueryHelper(request);
+					FromWhereSQL fromWhereSQL = queryHelper.getQueryScheme().getTableJoinFromWhereSQL();
+					whereSql = fromWhereSQL.getWhere();
+					tableAlias = fromWhereSQL.getTableAliasByAttrpath(infosetCode);
+					tableAlias = tableAlias==null?infosetCode:tableAlias;
+				}
+    				
+				
+				if(unionSql.length()>0){
+					unionSql.append("\n").append(" union ").append("\n");
+				}
+				unionSql.append("select ");
+				unionSql.append("concat(");
+				unionSql.append(pk_field_code);
+				unionSql.append(",'/') as pk_psndoc_sub,");
+				unionSql.append(" pk_psndoc, ");
+				unionSql.append("'");
+				unionSql.append(infosetCode);
+				unionSql.append("'");
+				unionSql.append(" tableName");
+				unionSql.append(" from ");
+				unionSql.append(tableCode);
+				unionSql.append(" ");
+				unionSql.append(tableAlias);
+				if(whereSql!=null){
+					unionSql.append(" where ");
+					unionSql.append(whereSql);
+	                if (infosetCode.equals("hi_psndoc_parttime")) {
+	                    unionSql.append(" and ismainjob = 'N' ");
+	                }else if (infosetCode.equals("hi_psnjob")) {
+	                    unionSql.append(" and ismainjob = 'Y' ");
+	                }
+				}else{
+					if (infosetCode.equals("hi_psndoc_parttime")) {
+						unionSql.append(" where ");
+	                    unionSql.append(" ismainjob = 'N' ");
+	                }else if (infosetCode.equals("hi_psnjob")) {
+	                	unionSql.append(" where ");
+	                    unionSql.append(" ismainjob = 'Y' ");
+	                }
+				}
+				
+			}
+			
+			sql.append(unionSql);
+			sql.append(" ) psndoc_sub ");
+			sql.append("    on concat(substr(sm_pub_filesystem.filepath, 0, 20), '/') = psndoc_sub.pk_psndoc_sub");
+			sql.append(" inner join (");
+			sql.append("select bd_psndoc.pk_psndoc,bd_psndoc.code,bd_psndoc.name\n");
+			sql.append("  from bd_psndoc\n");
+			sql.append(" inner join hi_psnjob hi_psnjob\n");
+			sql.append("    on bd_psndoc.pk_psndoc = hi_psnjob.pk_psndoc\n");
+			sql.append(" where  \n");
+			sql.append(nc.vo.pf.pub.util.SQLUtil.buildSqlForIn(" hi_psnjob.pk_psnjob ", allpks));
+			sql.append(" \n) psndoc ");
+			sql.append("    on psndoc.pk_psndoc = psndoc_sub.pk_psndoc\n");
+			sql.append(" where sm_pub_filesystem.isfolder = 'n' ");
+			
+			List<NCFileVO> fileVOList = (List<NCFileVO>)uapQueryBS.executeQuery(sql.toString(), new BeanListProcessor(NCFileVO.class));
+			
+			// 压缩包名
+			String nowDate = new UFDate().toStdString().replaceAll("-", "");
+			long currentTimeMillis = System.currentTimeMillis();
+			String zipFileName = "员工附件【"+(downloadModel==1?"条件下载":"信息集下载")+(groupModel==1?"按人分组":"按信息集分组")+"】"+nowDate+currentTimeMillis+".zip";
+			String defaultPathPfxZip = File.separator + "hrhisubfiletempload" + File.separator + "appcode" + File.separator
+					+ zipFileName;
+			String prefixFilePathZip = RuntimeEnv.getInstance().getNCHome() + File.separator + "hotwebs"
+					+ File.separator + "nccloud" + File.separator + "WEB-INF" + defaultPathPfxZip;
+			// 在home里面生成zip文件
+			File zipFile = new File(prefixFilePathZip);
+			File filePath = zipFile.getParentFile();
+			if (!filePath.exists()) {
+				filePath.mkdirs();
+			}
+			OutputStream os = null;
+			BufferedOutputStream bos = null;
+			ZipOutputStream zos = null;
+			
+			try {
+				os = new FileOutputStream(zipFile);
+				bos = new BufferedOutputStream(os);
+				zos = new ZipOutputStream(bos);
+				for(NCFileVO ncFileVO:fileVOList){
+					String pk_doc = ncFileVO.getPk_doc();
+					String fileName = ncFileVO.getName();
+					String tableName = ncFileVO.getFiletype();
+					String psn_code = ncFileVO.getCreator();
+					String psn_name = ncFileVO.getIsdoc();
+					String folderName = null;
+					String defaultType = null;
+					InfoSetVO infoSetVO = infoSetVOMap.get(tableName);
+					if(psn_code==null || psn_name==null || infoSetVO==null){
+						continue;
+					}
+					if(groupModel==1){
+						//按人分组
+						folderName = psn_name+psn_code;
+					}else{
+						//按信息集分组
+						folderName = infoSetVO.getInfoset_name();
+					}
+					
+					fileName = psn_code+"-"+fileName;
+					
+					if (fileName != null && fileName.contains(".")) {
+						defaultType = fileName.substring(fileName.lastIndexOf("."), fileName.length());
+					}
+					if (!fileName.contains(".")&& defaultType != null) {
+						fileName = fileName + defaultType;
+					}
+					InputStream inStream = null;
+					BufferedInputStream buffInStream = null;
+					try {
+						inStream = service.download("z", pk_doc, IFileStorageConst.Bucket);
+						buffInStream = new BufferedInputStream(inStream);
+						ZipEntry zipEntry = new ZipEntry(folderName + "\\" + fileName);
+						zos.putNextEntry(zipEntry);
+						int length = 0;
+						byte[] buf = new byte[1024];
+						while ((length = buffInStream.read(buf)) > 0) {
+							zos.write(buf, 0, length);
+						}
+						zos.closeEntry();
+					} catch (Exception ex) {
+						Logger.error(ex.getMessage(), ex);
+					} finally {
+						if (buffInStream != null) {
+							buffInStream.close();
+						} else {
+							if (inStream != null) {
+								inStream.close();
+							}
+						}
+					}
+				}
+			}catch (Exception ex) {
+				Logger.error(ex.getMessage(), ex);
+				ExceptionUtils.wrapException(ex);
+			} finally {
+				if (zos != null) {
+					zos.close();
+				} else {
+					if (bos != null) {
+						bos.close();
+					} else if (os != null) {
+						os.close();
+					}
+				}
+			}
+			
+			// 上传服务器
+			String downloadFilePath = null;
+			try {
+				FileInputStream input = new FileInputStream(prefixFilePathZip);
+				try {
+					FileHeader fileHeader = FileStorageClient.getInstance().uploadFile(IAttachManageConst.RIAMoudleID, zipFileName, input, false, new IFileStorageExt[0]);
+					if (fileHeader != null) {
+						downloadFilePath = fileHeader.getPath();
+					}
+				} catch (Exception ex) {
+					Logger.error(ex.getMessage(), ex);
+					ExceptionUtils.wrapException(ex);
+				} finally {
+					if (input != null) {
+						input.close();
+					}
+				}
+
+			} catch (Exception ex) {
+				Logger.error(ex.getMessage(), ex);
+				ExceptionUtils.wrapException(ex);
+			}
+			// 删除home里面的文件
+			deleteFileOrFolders(prefixFilePathZip);
+			// 下载
+			InputStream in = service.download("z", downloadFilePath, IFileStorageConst.Bucket);
+			//返回前端
+			return new WebFile(zipFileName, in);
+		}catch(Exception ex) {
+			Logger.error(ex.getMessage(), ex);
+			ExceptionUtils.wrapException(ex);
+		}
+		return null;
+	}
+
+	private void deleteFileOrFolders(String tarFilePath) {
+		if (tarFilePath.endsWith("WEB-INF")) {
+			return;
+		}
+		File file = new File(tarFilePath);
+		String parentPath = file.getParent();
+		if ((file.isFile()) && (file.exists())) {
+			file.delete();
+		}
+		for (;;) {
+			File parentDir = new File(parentPath);
+			parentPath = parentDir.getParent();
+
+			File[] files = parentDir.listFiles();
+			if ((files != null) && (files.length != 0)) {
+				break;
+			}
+			parentDir.delete();
+			deleteFileOrFolders(parentPath);
+		}
+	}
+
+}

+ 75 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/vo/DefdocRefDatas.java

@@ -0,0 +1,75 @@
+package nccloud.web.hrhi.psndoc.vo;
+
+import java.util.Vector;
+
+import nccloud.commons.lang.StringUtils;
+
+import nc.ui.bd.ref.AbstractRefModel;
+import nc.ui.bd.ref.RefPubUtil;
+import nccloud.framework.web.container.SessionContext;
+
+/**
+ * 获取薪资变动原因参照的数据 
+ * @author lenovo
+ *
+ */
+public class DefdocRefDatas {
+	
+	/**
+	 * 获取薪资变动原因参照的数据 
+	 * @param className
+	 * @return
+	 */
+	public Vector<Vector> getDefDocRefDatas(String pk_org, String className){
+		AbstractRefModel refModeByClassName = RefPubUtil.getRefModeByClassName(className);
+		refModeByClassName.setPara2("bd_defdoc");
+		refModeByClassName.setTableName("bd_defdoc");
+		refModeByClassName.setWherePart("  pk_defdoclist = '1002Z710000000004MO1' and enablestate=2");
+		refModeByClassName.setPara1("1002Z710000000004MO1");
+		refModeByClassName.setPk_org(pk_org);
+		refModeByClassName.setPk_group(SessionContext.getInstance().getClientInfo().getPk_group());
+		refModeByClassName.reset();
+		Vector<Vector> data = refModeByClassName.getData();
+		return data;
+	}
+	
+	/**
+	 * 根据主键匹配值
+	 * @param datas
+	 * @param pk_changecause
+	 * @return
+	 */
+	public String matchName(Vector<Vector> datas, String pk_changecause){
+		if(StringUtils.isBlank(pk_changecause) || null == datas || datas.isEmpty()){
+			return "";
+		}
+		for(Vector vector : datas){
+			String changecause = vector.get(4) + "";//变动主键
+			if(pk_changecause.equals(changecause)){
+				String name = vector.get(1) + "";//名称
+				return name;
+			}
+		}
+		return "";
+	}
+	
+	/**
+	 * 根据值匹配主键
+	 * @param datas
+	 * @param pk_changecause
+	 * @return
+	 */
+	public String matchPkChangecause(@SuppressWarnings("rawtypes") Vector<Vector> datas, String name){
+		if(StringUtils.isBlank(name) || null == datas || datas.isEmpty()){
+			return "";
+		}
+		for(Vector vector : datas){
+			String realName = vector.get(1) + "";//名称
+			if(name.equals(realName)){
+				String changecause = vector.get(4) + "";//变动主键
+				return changecause;
+			}
+		}
+		return "";
+	}
+}

+ 44 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/vo/ExportFile.java

@@ -0,0 +1,44 @@
+package nccloud.web.hrhi.psndoc.vo;
+
+import java.io.InputStream;
+
+public class ExportFile {
+
+	private String fileName;
+	private long fileSize;
+	private String type;
+	private InputStream inputStream;
+
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	public long getFileSize() {
+		return fileSize;
+	}
+
+	public void setFileSize(long fileSize) {
+		this.fileSize = fileSize;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public InputStream getInputStream() {
+		return inputStream;
+	}
+
+	public void setInputStream(InputStream inputStream) {
+		this.inputStream = inputStream;
+	}
+
+}

+ 81 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/vo/ImportBean.java

@@ -0,0 +1,81 @@
+package nccloud.web.hrhi.psndoc.vo;
+
+import java.util.Map;
+import java.util.Vector;
+
+import nc.vo.hi.psndoc.TrainVO;
+
+/**
+ * 导入结果类
+ * 
+ * @author lenovo
+ *
+ */
+public class ImportBean {
+
+	/**
+	 * 结果数据
+	 */
+	private Vector<TrainVO> vector = new Vector<TrainVO>();
+
+	/**
+	 * 表头
+	 */
+	private Vector<Map<String, Object>> headVector = new Vector<>();
+
+	/**
+	 * 是否成功标志
+	 */
+	private boolean error = true;
+
+	/**
+	 * 错误的提示语
+	 */
+	private String errorMessage;
+
+	/**
+	 * 错误的文件名
+	 */
+	private String errorFile;
+
+	public Vector<TrainVO> getVector() {
+		return vector;
+	}
+
+	public void setVector(Vector<TrainVO> vector) {
+		this.vector = vector;
+	}
+
+	public Vector<Map<String, Object>> getHeadVector() {
+		return headVector;
+	}
+
+	public void setHeadVector(Vector<Map<String, Object>> headVector) {
+		this.headVector = headVector;
+	}
+
+	public boolean isError() {
+		return error;
+	}
+
+	public void setError(boolean error) {
+		this.error = error;
+	}
+
+	public String getErrorMessage() {
+		return errorMessage;
+	}
+
+	public void setErrorMessage(String errorMessage) {
+		this.errorMessage = errorMessage;
+	}
+
+	public String getErrorFile() {
+		return errorFile;
+	}
+
+	public void setErrorFile(String errorFile) {
+		this.errorFile = errorFile;
+	}
+
+}

+ 100 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/vo/ImportHead.java

@@ -0,0 +1,100 @@
+package nccloud.web.hrhi.psndoc.vo;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import nc.bs.framework.common.NCLocator;
+import nc.hr.utils.ResHelper;
+import nc.itf.uap.IUAPQueryBS;
+import nc.jdbc.framework.processor.BeanListProcessor;
+import nc.md.persist.framework.IMDPersistenceQueryService;
+import nc.vo.bd.ref.RefInfoVO;
+import nc.vo.hi.repdef.InfoSetItemVO;
+import nc.vo.hr.infoset.InfoItemVO;
+import nc.vo.pub.BusinessException;
+import nccloud.framework.service.ServiceLocator;
+
+public class ImportHead {
+	
+	public static IUAPQueryBS iUapQueryBS;
+	
+	public static IUAPQueryBS getIUAPQueryBS() {
+		if(iUapQueryBS == null) {
+			iUapQueryBS = ServiceLocator.find(IUAPQueryBS.class);
+		}
+		return iUapQueryBS;
+	}
+	
+	/**
+	 * 获取培训子集的表头字段
+	 * @return
+	 */
+	public static List<InfoItemVO> getInfoSetItems(){
+		String sql = "select * from hr_infoset_item where pk_infoset = (select pk_infoset from hr_infoset where infoset_code = 'hi_psndoc_train') and hided = 'N' order by showorder";
+		List<InfoItemVO> result = new ArrayList<InfoItemVO>();
+		try {
+			result = (List<InfoItemVO>) getIUAPQueryBS().executeQuery(sql, new BeanListProcessor(InfoItemVO.class));
+		} catch (BusinessException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+	
+	public static RefInfoVO getRefInfoVO(String pk_refinfo) {
+		RefInfoVO vo = null;
+		try {
+			vo = (RefInfoVO) getIUAPQueryBS().retrieveByPK(RefInfoVO.class, pk_refinfo);
+		} catch (BusinessException e) {
+			e.printStackTrace();
+		}
+		return vo;
+	}
+	
+	public static List<Map<String, Object>> getHead(){
+		LinkedList listBillItems = new LinkedList();
+		Map<String, Object> billItem1 = new HashMap<String, Object>();
+		billItem1.put("name", ResHelper.getString("common", "UC000-0000147"));
+	    billItem1.put("key", "psnCode");
+	    billItem1.put("dataType", Integer.valueOf(0));
+	    billItem1.put("length", Integer.valueOf(40));
+	    billItem1.put("width", Integer.valueOf(100));
+	    billItem1.put("nullable", "N");
+	    listBillItems.add(billItem1);
+	     
+	    Map<String, Object> billItem2 = new HashMap<String, Object>();
+	    billItem2.put("name", ResHelper.getString("common", "UC000-0001403"));
+	    billItem2.put("key", "psnName");
+	    billItem2.put("dataType", Integer.valueOf(0));
+	    billItem2.put("length", Integer.valueOf(200));
+	    billItem2.put("width", Integer.valueOf(100));
+	    billItem2.put("nullable", "N");
+	    listBillItems.add(billItem2);
+		
+	    List<InfoItemVO> items = getInfoSetItems();
+		if(items != null && items.size() > 0) {
+			for(InfoItemVO vo : items) {
+				Map<String, Object> billItem = new HashMap<String, Object>();
+				billItem.put("name", vo.getItem_name());
+				billItem.put("key", vo.getItem_code());
+				billItem.put("dataType", vo.getData_type());
+				billItem.put("length", vo.getMax_length());
+				billItem.put("width", Integer.valueOf(100));
+				billItem.put("nullable", vo.getNullable().toString());
+				if(vo.getData_type() == 5) {
+					RefInfoVO refVO = getRefInfoVO(vo.getRef_model_name());
+					billItem.put("className", refVO.getRefclass());
+					billItem.put("pk_refinfo",refVO.getPk_refinfo());
+				}
+				if(vo.getData_type() == 6) {
+					billItem.put("enum_id", vo.getEnum_id());
+				}
+			    listBillItems.add(billItem);
+			}
+		}
+		
+		return listBillItems;
+	}
+}

+ 352 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/vo/TrainPsndocXlsExporter.java

@@ -0,0 +1,352 @@
+package nccloud.web.hrhi.psndoc.vo;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
+import org.apache.poi.hssf.usermodel.HSSFRichTextString;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Comment;
+import org.apache.poi.ss.usermodel.DataValidation;
+import org.apache.poi.ss.usermodel.DataValidationConstraint;
+import org.apache.poi.ss.usermodel.DataValidationHelper;
+import org.apache.poi.ss.usermodel.Drawing;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddressList;
+import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
+import org.apache.poi.xssf.usermodel.XSSFRichTextString;
+
+import nc.hr.utils.HRFileUtils;
+import nc.hr.utils.ResHelper;
+import nc.itf.uap.IUAPQueryBS;
+import nc.jdbc.framework.processor.BeanListProcessor;
+import nc.ui.pub.bill.IBillItem;
+import nc.vo.bd.defdoc.DefdocVO;
+import nc.vo.hi.psndoc.TrainVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFBoolean;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.web.hrwa.helper.DeleteFileUtil;
+import uap.lfw.md.vo.EnumValueVO;
+
+public class TrainPsndocXlsExporter {
+	private CellStyle titleCellStyle;
+	
+	private static final String MAIN_SHEET_NAME = "template";
+    private static final String HIDDEN_SHEET1_NAME = "hidden1";
+    private static final String DEVICE_NAMES = "devices";
+    private static final String DEVICE_TYPE_NAMES = "deviceTypes";
+    
+    public static String getTimeStamp(){
+		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddhhmmssSSS");
+		return sdf.format(new Date());
+	}
+
+	/**
+	 * 导出文件
+	 * 
+	 * @return
+	 * @throws Exception
+	 */
+	@SuppressWarnings("unchecked")
+	public ExportFile exportToFile(TrainVO[] exprotvos, List<Map<String, Object>> headList, UFBoolean allowed,
+			String pk_org, String pk_loginUser) throws Exception {
+
+		String filePath = HRFileUtils.getExportPath() + "/hrhifile/psndoc/excel/";
+		// 删除过期文件
+		DeleteFileUtil.delete(filePath);
+
+		String fileName = filePath + pk_loginUser + "/templet.xls";
+		File file = new File(fileName);
+		if (!file.exists()) {
+			file.mkdirs();
+		}
+		if (file.exists()) {
+			file.delete();
+		}
+		FileOutputStream fileOut = null;
+		try {
+			fileOut = new FileOutputStream(file);
+			HSSFWorkbook hSSFWorkbook = new HSSFWorkbook();
+			Sheet sheet = hSSFWorkbook.createSheet();
+			// 超过四千条 style会报错
+			if(null == titleCellStyle){
+				this.titleCellStyle = hSSFWorkbook.createCellStyle();
+			}
+			// 参照缓存
+			DefdocRefDatas defdocRefDatas = new DefdocRefDatas();
+			Vector<Vector> datas = null;
+
+			// 输出表头
+			Row headrow = sheet.createRow(0);// 表头行,也就是首行
+			int nLineNo = 0;
+			
+			for (int j = 0; j < headList.size(); j++) {
+				//设置下拉
+				Map<String, Object> headMap = headList.get(j);
+				int dataType = (Integer) headMap.get("dataType");
+				//自定义档案
+				if(dataType == 5) {
+					addList(sheet, headMap,j);
+				}
+				//枚举类
+				if(dataType == 6) {
+					addEnum(sheet, headMap,j);
+				}
+			}
+			
+			
+			// 输出序号
+			Cell headcell = headrow.createCell((short) nLineNo);// 首个单元格
+			headcell.setCellValue(ResHelper.getString("common",
+					"UC000-0001821")/* @res "序号" */);
+			this.setCellStyle4Head(headcell, titleCellStyle);
+			nLineNo++;
+			int nLineNo2 = nLineNo - 2;
+
+			for (int j = 0; j < headList.size(); j++) {
+//				if ((j == 2 || j == 3) && !allowed.booleanValue()) {
+//					continue;
+//				}
+//				if (j > 3 && !allowed.booleanValue()) {
+//					nLineNo = nLineNo2;
+//				}
+				headcell = headrow.createCell((short) (j + nLineNo));
+				Map<String, Object> headMap = headList.get(j);
+				headcell.setCellValue(headMap.get("name") + "");
+				this.setCellCommentStyle(sheet, headcell, headMap, "2003");
+				this.setCellStyle4Head(headcell, titleCellStyle);
+			}
+
+			// 输出表体
+			int nRowIdx = 1;
+			int i = 0;//记录额外创建的sheet数量
+			sheet.setDefaultColumnWidth((short) 12);
+			sheet.autoSizeColumn((short) 25);
+			hSSFWorkbook.write(fileOut);
+
+			InputStream inputStream = new FileInputStream(file);
+			ExportFile importFile = new ExportFile();
+			importFile.setFileName("templet.xls");
+			importFile.setInputStream(inputStream);
+			return importFile;
+		} finally {
+			if (fileOut != null) {
+				fileOut.close();
+			}
+		}
+	}
+
+	private void addEnum(Sheet sheet, Map<String, Object> headMap,int j) throws BusinessException {
+		List<EnumValueVO> enumList = this.getEnumVO(headMap.get("enum_id").toString());
+		if(enumList != null && enumList.size() > 0) {
+			List<String> list = new ArrayList();
+			for(EnumValueVO vo : enumList) {
+				list.add(vo.getName());
+			}
+			CellRangeAddressList regions = new CellRangeAddressList(1, 1000, j+1, j+1);  
+			DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();
+			DataValidationConstraint createExplicitListConstraint = dataValidationHelper.createExplicitListConstraint(list.toArray(new String[0]));
+			DataValidation createValidation = dataValidationHelper.createValidation(createExplicitListConstraint, regions);
+			if (createValidation instanceof XSSFDataValidation) {
+	            createValidation.setSuppressDropDownArrow(true);
+	            createValidation.setShowErrorBox(true);
+	        } else {
+	            createValidation.setSuppressDropDownArrow(false);
+	        }
+			sheet.addValidationData(createValidation);
+		}
+	}
+	
+	private void addList(Sheet sheet, Map<String, Object> headMap,int j) throws BusinessException {
+		List<DefdocVO> traTypeList = this.getDefdocVO(headMap.get("pk_refinfo").toString());
+		if(traTypeList != null && traTypeList.size() > 0) {
+			List<String> list = new ArrayList();
+			for(DefdocVO vo : traTypeList) {
+				list.add(vo.getName());
+			}
+			CellRangeAddressList regions = new CellRangeAddressList(1, 1000, j+1, j+1);  
+			DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();
+			DataValidationConstraint createExplicitListConstraint = dataValidationHelper.createExplicitListConstraint(list.toArray(new String[0]));
+			DataValidation createValidation = dataValidationHelper.createValidation(createExplicitListConstraint, regions);
+			if (createValidation instanceof XSSFDataValidation) {
+	            createValidation.setSuppressDropDownArrow(true);
+	            createValidation.setShowErrorBox(true);
+	        } else {
+	            createValidation.setSuppressDropDownArrow(false);
+	        }
+			sheet.addValidationData(createValidation);
+		}
+	}
+
+	/**
+	 * 设置单元格的式样<BR>
+	 * <BR>
+	 *
+	 * @author xuhw on 2010-4-10
+	 * @param cell
+	 * @param wb
+	 * @return
+	 */
+	private Cell setCellStyle4Head(Cell cell, CellStyle titleCellStyle) {
+		titleCellStyle.setBorderBottom(BorderStyle.THIN);
+		titleCellStyle.setBorderLeft(BorderStyle.THIN);
+		titleCellStyle.setBorderRight(BorderStyle.THIN);
+		titleCellStyle.setBorderTop(BorderStyle.THIN);
+
+		cell.setCellStyle(titleCellStyle);
+		return cell;
+	}
+
+	/**
+	 * 设定批注
+	 *
+	 * @author xuhw on 2010-4-20
+	 * @param cell
+	 * @param wb
+	 * @return
+	 */
+	private void setCellCommentStyle(Sheet sheet, Cell cell, Map<String, Object> headMap, String version) {
+		Drawing p = sheet.createDrawingPatriarch();
+		// 创建绘图对象
+		Comment comment = null;
+		if (null != version && version.equals("2003")) {
+			comment = p.createCellComment(new HSSFClientAnchor(1, 2, 3, 4, (short) 3, 3, (short) 5, 6));
+			// 输入批注信息
+			comment.setString(new HSSFRichTextString(this.getCommentContent(headMap)));
+			// 添加作者,选中B5单元格,看状态栏
+			comment.setAuthor("toad");
+		} else if (null != version && version.equals("2007")) {
+			comment = p.createCellComment(new XSSFClientAnchor(1, 2, 3, 4, (short) 3, 3, (short) 5, 6));
+			// 输入批注信息
+			comment.setString(new XSSFRichTextString(this.getCommentContent(headMap)));
+			// 添加作者,选中B5单元格,看状态栏
+			comment.setAuthor("toad");
+		}
+
+		// 将批注添加到单元格对象中
+		cell.setCellComment(comment);
+	}
+
+	/**
+	 * 核查单元值是否合法 如果不合法,则将相应的单元cell 变为红色
+	 *
+	 * @param item
+	 * @param aValue
+	 * @return
+	 */
+	private String getCommentContent(Map<String, Object> headMap) {
+		// 当心类型不统一
+		int datatype = (Integer) headMap.get("dataType");
+		// int maxinputlength = item.getLength();
+		StringBuffer sbMessage = new StringBuffer();
+		switch (datatype) {
+		case IBillItem.DECIMAL:// 数值型
+			sbMessage.append(ResHelper.getString("60130adjmtc",
+					"060130adjmtc0150")/* @res "输入类型:数值类型(31.8)\n" */);
+			sbMessage.append(ResHelper.getString("60130adjmtc",
+					"060130adjmtc0151")/* @res "输入举例:256.123\n" */);
+			// sbMessage.append(ResHelper.getString("60130adjmtc","060130adjmtc0152")/*@res
+			// "最大长度:"*/ + maxinputlength);
+			break;
+		case IBillItem.BOOLEAN:
+			sbMessage.append(ResHelper.getString("60130adjmtc",
+					"060130adjmtc0153")/* @res "输入类型:布尔类型\n" */);
+			sbMessage.append(ResHelper.getString("60130adjmtc",
+					"060130adjmtc0154")/* @res "输入举例:{N}或者{Y}\n" */);
+			// sbMessage.append(ResHelper.getString("60130adjmtc","060130adjmtc0152")/*@res
+			// "最大长度:"*/ + maxinputlength);
+			break;
+		case IBillItem.DATE:
+			sbMessage.append(ResHelper.getString("60130adjmtc",
+					"060130adjmtc0155")/* @res "输入类型:日期类型\n" */);
+			sbMessage.append(ResHelper.getString("60130adjmtc",
+					"060130adjmtc0156")/* @res "输入举例:2012-12-12\n" */);
+			// sbMessage.append(ResHelper.getString("60130adjmtc","060130adjmtc0152")/*@res
+			// "最大长度:"*/ + maxinputlength);
+		}
+		return sbMessage.toString();
+	}
+
+	/**
+	 * 设置单元格的式样<BR>
+	 * <BR>
+	 *
+	 * @author xuhw on 2010-4-10
+	 * @param cell
+	 * @param wb
+	 * @return
+	 */
+	private Cell setCellStyle4Body(final Cell cell, final CellStyle titleCellStyle,final Font font, int intErrorPos, int curentLineNO, short alignment) {
+		titleCellStyle.setBorderBottom(BorderStyle.THIN);
+		titleCellStyle.setBorderLeft(BorderStyle.THIN);
+		titleCellStyle.setBorderRight(BorderStyle.THIN);
+		titleCellStyle.setBorderTop(BorderStyle.THIN);
+
+		titleCellStyle.setAlignment(HorizontalAlignment.forInt(alignment));
+
+
+		if (curentLineNO == intErrorPos) {
+			font.setColor(Font.COLOR_RED);
+			titleCellStyle.setFont(font);
+		}
+		cell.setCellStyle(titleCellStyle);
+		return cell;
+	}
+	
+	public static IUAPQueryBS iUapQueryBS;
+	
+	public static IUAPQueryBS getIUAPQueryBS() {
+		if(iUapQueryBS == null) {
+			iUapQueryBS = ServiceLocator.find(IUAPQueryBS.class);
+		}
+		return iUapQueryBS;
+	}
+	
+	public  List<EnumValueVO> getEnumVO(String emunid) throws BusinessException{
+		String sql = "select * from md_enumvalue where id = '"+emunid+"' and nvl(dr,0) = 0";
+        return (List<EnumValueVO>) getIUAPQueryBS().executeQuery(sql, new BeanListProcessor(EnumValueVO.class));
+    }
+	
+    public  List<DefdocVO> getDefdocVO(String pk_refinfo) throws BusinessException{
+		String sql = "select * from bd_defdoc where nvl(dr,0) = 0 and pk_defdoclist = (select para1 from bd_refinfo where pk_refinfo = '"+pk_refinfo+"')";
+        return (List<DefdocVO>) getIUAPQueryBS().executeQuery(sql, new BeanListProcessor(DefdocVO.class));
+    }
+	
+	public Map<String,String> getSourceType(){
+//		指定参训=0,报名参训=1,其他=2,手工添加=3 source_type
+		Map<String,String> result = new HashMap();
+		result.put("指定参训", "0");
+		result.put("报名参训", "1");
+		result.put("其他", "2");
+		result.put("手工添加", "3");
+		return result;
+	}
+	
+	public Map<String,String> getTaketrmMethod(){
+//		全部参训=0,部分参训=1,中途参训=2,其他=3 taketrm_method
+		Map<String,String> result = new HashMap();
+		result.put("全部参训", "0");
+		result.put("部分参训", "1");
+		result.put("中途参训", "2");
+		result.put("其他", "3");
+		return result;
+
+	}
+}

+ 686 - 0
hrhi/src/client/nccloud/web/hrhi/psndoc/vo/TrainPsndocXlsImport.java

@@ -0,0 +1,686 @@
+package nccloud.web.hrhi.psndoc.vo;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.Vector;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import nc.bs.logging.Logger;
+import nc.hr.utils.HRFileUtils;
+import nc.hr.utils.ResHelper;
+import nc.itf.hr.wa.ISalaryadjmgtConstant;
+import nc.itf.uap.IUAPQueryBS;
+import nc.jdbc.framework.processor.BeanListProcessor;
+import nc.jdbc.framework.processor.ColumnProcessor;
+import nc.ui.pub.bill.IBillItem;
+import nc.vo.bd.defdoc.DefdocVO;
+import nc.vo.hi.psndoc.TrainVO;
+import nc.vo.hr.dataio.Validator;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.pub.lang.UFDate;
+import nc.vo.pub.lang.UFDateTime;
+import nc.vo.pub.lang.UFDouble;
+import nc.vo.pub.lang.UFLiteralDate;
+import nccloud.base.exception.ExceptionUtils;
+import nccloud.commons.lang.StringUtils;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.web.hrwa.helper.DeleteFileUtil;
+import nccloud.web.hrwa.pub.ErrorContent;
+import uap.lfw.md.vo.EnumValueVO;
+
+/**
+ * 培训子集 导入数据
+ * 
+ * @author lenovo
+ *
+ */
+public class TrainPsndocXlsImport {
+
+	public ImportBean importFormFile(InputStream fileInput, List<Map<String, Object>> headList, String fileName,
+			String pk_group, String pk_org, String pk_loginUser) throws BusinessException {
+		ImportBean importBean = new ImportBean();
+		FileOutputStream fileOut = null;
+		// 表头
+		Vector<Map<String, Object>> headVector = new Vector<>();
+		// 数据
+		Vector<TrainVO> vector = new Vector<TrainVO>();
+		try {
+			boolean error = true;
+			if (null == fileInput || StringUtils.isBlank(fileName)) {
+				return null;
+			}
+			if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) {
+				ExceptionUtils.wrapBusinessException(ErrorContent.FILETYPEERROR);
+			}
+			String version = fileName.endsWith(".xls") ? "2003" : "2007";
+			Workbook wb = null;
+			if (version.equals("2003")) {
+				wb = new HSSFWorkbook(fileInput);
+			} else if (version.equals("2007")) {
+				wb = new XSSFWorkbook(fileInput);
+			}
+			Sheet sheet = wb.getSheetAt(0);
+			TrainVO vo = null;
+			// 当前行数据
+			Row row = null;
+			// 当前单元格对象
+			Cell cell = null;
+			// 当前单元格的内容
+			String sValue = null;
+			// 模板上的所有ITEMs
+			int index = 0;
+			StringBuffer sbMessage = null;
+
+			// 循环处理每一行数据
+			for (int currentSequence = 0; currentSequence <= sheet.getLastRowNum(); currentSequence++) {
+				// 行数据验证消息
+				sbMessage = new StringBuffer();
+				try {
+					vo = new TrainVO();
+
+					// 处理行号
+					boolean linflag = false;
+					int offset = 0;// 有行号,则产生偏移
+					if (!linflag) {
+						offset++;
+						linflag = true;
+					}
+					int offset2 = offset - 2;
+
+					// 处理表头
+					if (currentSequence == 0) {
+						for (int currentColumn = 0; currentColumn < headList.size(); currentColumn++) {
+//							if ((currentColumn == 2 || currentColumn == 3) && !allowed.booleanValue()) {
+//								continue;
+//							}
+//							if (currentColumn > 3 && !allowed.booleanValue()) {
+//								offset = offset2;
+//							}
+							headVector.add(headList.get(currentColumn));
+						}
+						importBean.setHeadVector(headVector);
+						continue;
+					}
+					// 得到一行数据
+					row = sheet.getRow(currentSequence);
+
+					for (int currentColumn = 0; currentColumn < headList.size(); currentColumn++) {
+//						if ((currentColumn == 1)) {
+//							continue;
+//						}
+						if (currentColumn > 3) {
+//							offset = offset2;
+						}
+						// 循环处理每一个单元格
+						cell = row.getCell((short) (currentColumn + offset));
+						if (cell == null) {
+							cell = row.createCell((short) (currentColumn + offset));
+						}
+						sValue = this.getCellValue(cell);
+						sValue = sValue == null ? "" : sValue.trim();
+
+						// 验证数据是否正确
+						if (!this.checkData(headList.get(currentColumn), sValue, sbMessage)) {
+							this.renderCell(cell, wb);
+							error = false;
+						} else {
+							int dataType = (Integer) headList.get(currentColumn).get("dataType");
+							//人员编码
+							if("psnCode".equals(headList.get(currentColumn).get("key"))) {
+								vo.setPsnCode(sValue);
+								vo.setAttributeValue("pk_psndoc",this.getValue(headList.get(currentColumn), sValue).toString());
+							}else if("psnName".equals(headList.get(currentColumn).get("key"))) {
+								vo.setPsnName(sValue);
+							}else if(dataType == 5) {
+								//自定义档案
+								vo.setAttributeValue(headList.get(currentColumn).get("key") + "",
+										this.getValue(headList.get(currentColumn), sValue));
+							}else if(dataType == 6) {
+								//枚举
+								vo.setAttributeValue(headList.get(currentColumn).get("key") + "",
+										this.getValue(headList.get(currentColumn), sValue));
+							}
+//							else if ("tra_type".equals(headList.get(currentColumn).get("key")) || "tra_mode".equals(headList.get(currentColumn).get("key"))) {
+//								vo.setAttributeValue(headList.get(currentColumn).get("key") + "",this.getValue(headList.get(currentColumn), sValue).toString());
+//							} else if ("source_type".equals(headList.get(currentColumn).get("key"))) {
+//								vo.setAttributeValue(headList.get(currentColumn).get("key") + "",this.getSourceType().get(sValue) == null ? sValue : this.getSourceType().get(sValue));
+//							} else if ("taketrm_method".equals(headList.get(currentColumn).get("key"))) {
+//								vo.setAttributeValue(headList.get(currentColumn).get("key") + "",this.getTaketrmMethod().get(sValue) == null ? sValue : this.getTaketrmMethod().get(sValue));
+//							} 
+//							else if ("absence_count".equals(headList.get(currentColumn).get("key")) || "tra_time".equals(headList.get(currentColumn).get("key"))) { 
+//								vo.setAttributeValue(headList.get(currentColumn).get("key") + "",Integer.valueOf(sValue == null ? "0" : sValue.toString().replaceAll("\\.0", "")));
+//							} 
+							else {
+								vo.setAttributeValue(headList.get(currentColumn).get("key") + "",
+										this.getValue(headList.get(currentColumn), sValue));
+							}
+						}
+					}
+
+					// ------------------设置默认值--------------------
+					vo.setAttributeValue(TrainVO.PK_GROUP, pk_group);
+					vo.setAttributeValue(TrainVO.PK_ORG, pk_org);
+					// 是否是来自于流程 N 手工加入
+//					vo.setAttributeValue(PsndocWadocVO.WORKFLOWFLAG, UFBoolean.valueOf(false));
+//					// 业务类型 1:定级;
+//					vo.setAttributeValue(PsndocWadocVO.IADJUSTMATTER, 1);
+					String strErrorMessage = sbMessage.toString();
+					if (!StringUtils.isBlank(strErrorMessage)) {
+						// 2015-11-21 zhousze 错误信息列应该在最后一列 为第19列 begin
+						// 20150911 xiejie3
+						// NCdp205468851错误信息写入excel时,由于列从0开始创建,所以应该减去1,又由于前面不知为啥要加1,所以减去2.
+						cell = row.createCell(headList.size()+1, CellType.STRING);
+						// end
+						cell.setCellValue(strErrorMessage);
+
+					}
+					vo.setAttributeValue("reason", strErrorMessage);
+				} catch (Exception ex) {
+					continue;
+				}
+				vector.add(vo);
+			}
+			importBean.setVector(vector);
+			if (!error) {
+				String filePath = HRFileUtils.getExportPath() + "/hrhifile/psndoc/errorfile/";
+				// 删除过期文件
+				DeleteFileUtil.delete(filePath);
+				// 将错误文件保存在服务器上
+				String name = UUID.randomUUID().toString() + ".xls";
+				String errorFileName = filePath + pk_loginUser + "/" + name;
+
+				File file = new File(errorFileName);
+				if (!file.isDirectory()) {
+					file.mkdirs();
+				}
+				if (file.exists()) {
+					file.delete();
+				}
+				fileOut = new FileOutputStream(file);
+				wb.write(fileOut);
+				importBean.setError(error);
+				/* @res "源文件数据存在错误,错误数据已经用红色字体标注,请仔细检查!" */
+				importBean.setErrorMessage(ResHelper.getString("6013datainterface", "06013datainterface0121"));
+				importBean.setErrorFile(name);
+			}
+		} catch (IOException e) {
+			Logger.error(e.getMessage(), e);
+            throw new BusinessException(ResHelper.getString("6001hrimp", "06001hrimp0235")/* @res "文件读取错误!" */);
+		} finally {
+			IOUtils.closeQuietly(fileInput);
+			IOUtils.closeQuietly(fileOut);
+		}
+		return importBean;
+	}
+
+	/**
+	 * 核查单元值是否合法 如果不合法,则将相应的单元cell 变为红色
+	 *
+	 * @param item
+	 * @param aValue
+	 * @return
+	 */
+	private boolean checkData(Map<String, Object> headMap, String aValue, StringBuffer sbMessage) {
+		if (aValue == null) {
+			aValue = "";
+		}
+		// 当心类型不统一
+		int datatype = (Integer) headMap.get("dataType");
+		String strItemKey = (String) headMap.get("key");
+		int length = (Integer) headMap.get("width");
+		int decimals = (Integer) headMap.get("length");
+		String name = (String) headMap.get("name");
+		// 检验是否通过
+		boolean isLost = true;
+
+		if (!this.notNullValidator(headMap, aValue, name, sbMessage)) {
+			return false;
+		}
+
+		String nullable = (String) headMap.get("nullable");
+		if("Y".equals(nullable)) {
+			if(StringUtils.isBlank(aValue)) {
+				return isLost;
+			}
+		}
+		
+		// 数据格式校验
+		switch (datatype) {
+		case IBillItem.DECIMAL:// 数值型
+			// -----为设置精度增加的代码,对于小数的增加如下监听------------------
+			if (!Validator.isUFDouble(aValue.toString().trim())) {
+				isLost = false;
+				sbMessage.append("[{"+aValue+"}] 不是数值类型 不符合设定的格式!");
+			} else {
+				// 验证数据长度与小数位数
+				// 数据长度是指整数部分的长度,小数位数是指小数位的长度
+				int digitsLength = 0;// 小数位数默认为0;
+				int intLength = 0;// 整数长度默认是0
+				int dotPosition = aValue.toString().trim().indexOf(ISalaryadjmgtConstant.POINT);// 小数点的位置
+				if (decimals > 0) {// 因为设置列的数据长度=整数位数+小数位数+1,所以这里进行还原.
+					length = length - decimals - 1;
+				}
+				if (dotPosition > 0) {
+					digitsLength = aValue.toString().trim().substring(dotPosition).length() - 1;
+					intLength = aValue.toString().trim().substring(0, dotPosition).length();
+				} else {// 没有小数
+					digitsLength = 0;
+					intLength = aValue.toString().trim().length();
+				}
+				// 验证数据长度,小数位数
+				if (intLength > length || digitsLength > decimals) {
+					isLost = false;
+					sbMessage.append("[{"+aValue+"}]数据长度或者小数位数  不符合设定的格式!");
+				}
+			}
+			break;
+		case IBillItem.BOOLEAN:
+			if (!Validator.isUFBoolean(aValue.toString().trim()) || (!"N".equals(aValue.toString().trim()) && !"Y".equals(aValue.toString().trim()))) {
+				isLost = false;
+				sbMessage.append("[{"+aValue+"}]不符合设定的格式  输入的内容必须是{N}或者{Y}!");
+			} else {// 验证数据长度
+				if (aValue.toString().length() > length) {
+					isLost = false;
+					sbMessage.append("[{"+aValue+"}]数据长度  不符合设定的格式!");
+				}
+			}
+
+			// 谈判工资肯定在 薪资级别和薪资档别之前
+//			if (PsndocWadocVO.NEGOTIATION_WAGE.equalsIgnoreCase(strItemKey)) {
+//				isNegotiation_wage = UFBoolean.valueOf(aValue.toString()).booleanValue();
+//			}
+
+			break;
+		case IBillItem.DATE:
+			if (StringUtils.isBlank(aValue.toString()) || !this.isUFDate(aValue.toString())) {
+				isLost = false;
+				sbMessage.append("[{"+aValue+"}]不是日期类型,不符合设定的格式!");
+			} else {// 验证数据长度
+				if (aValue.toString().length() > decimals) {
+					isLost = false;
+					sbMessage.append("[{"+aValue+"}]数据长度不正确,不符合设定的格式!");
+				}
+			}
+			break;
+		case IBillItem.LITERALDATE:
+			if (StringUtils.isBlank(aValue.toString()) || !this.isUFDate(aValue.toString())) {
+				isLost = false;
+				sbMessage.append("[{"+aValue+"}]不是日期类型,不符合设定的格式!");
+			} else {// 验证数据长度
+				if (aValue.toString().length() > decimals) {
+					isLost = false;
+					sbMessage.append("[{"+aValue+"}]数据长度不正确,不符合设定的格式!");
+				}
+			}
+			break;
+		case IBillItem.UFREF:
+			Object pk_defdoc = this.getValue(headMap, aValue);
+			if(pk_defdoc == null || "".equals(pk_defdoc)) {
+				isLost = false;
+				sbMessage.append("[{"+aValue+"}]"+headMap.get("name")+"在自定义档案中找不到对应数据!");
+			}
+			break;
+		// 字符串型不需要解析!因为 aValue 就是一个字符串!
+		default:
+			if (aValue.toString().length() > decimals && !"taketrm_method".equals(strItemKey) && !"source_type".equals(strItemKey)) {
+				// 验证数据长度
+				isLost = false;
+				sbMessage.append("[{"+aValue+"}]数据长度不正确,不符合设定的格式!");
+			}
+			break;
+		}
+		
+		if("psnCode".equals(strItemKey)) {
+			Object pk_psndoc = this.getValue(headMap, aValue);
+			if(pk_psndoc == null || "".equals(pk_psndoc)) {
+				// 验证人员编码是否存在
+				isLost = false;
+				sbMessage.append("[{"+aValue+"}]人员编码系统中找不到对应数据!");
+			}
+		}
+
+//		if("tra_type".equals(strItemKey)) {
+//			Object tra_type = this.getValue(headMap, aValue);
+//			if(tra_type == null || "".equals(tra_type)) {
+//				isLost = false;
+//				sbMessage.append("[{"+aValue+"}]培训类别在自定义档案中找不到对应数据!");
+//			}
+//		}else if("tra_mode".equals(strItemKey)) {
+//			Object tra_mode = this.getValue(headMap, aValue);
+//			if(tra_mode == null || "".equals(tra_mode)) {
+//				isLost = false;
+//				sbMessage.append("[{"+aValue+"}]培训方式在自定义档案中找不到对应数据!");
+//			}
+//		}
+		
+		if (!isLost) {
+			sbMessage.append("\n");
+		}
+		return isLost;
+	}
+	
+	/**
+     * 验证一个字符串是合法的UFDate
+     * @param strDate
+     * @return
+     */
+    private boolean isUFDate(String strDate)
+    {
+        if (StringUtils.isBlank(strDate))
+        {
+            return false;
+        }
+        try
+        {
+        	if (strDate.length() == 10)
+        	{
+        		UFDate date = new UFDate(strDate);
+        	}
+        	else if (strDate.length() == 19)
+        	{
+        		UFDateTime date = new UFDateTime(strDate);
+        	}
+        	else
+        	{
+        		return false;
+        	}
+        	
+        }
+        catch (Exception e)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+	/**
+	 * 读取cell中的内容<BR>
+	 * <BR>
+	 *
+	 * @author xuhw on 2010-4-12
+	 * @param cell
+	 * @return
+	 * @throws ParseException
+	 */
+	private String getCellValue(Cell cell) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if (cell == null) {
+			return "";
+		}
+		CellType type = cell.getCellType();
+		String value = "";
+		switch (type) {
+			case NUMERIC:
+			if (HSSFDateUtil.isCellDateFormatted(cell)) {
+				value = sdf.format(cell.getDateCellValue());
+				break;
+			}
+			value = String.valueOf(cell.getNumericCellValue());
+			if (value.indexOf("E") > 0) {
+				value = parseDouble(value);
+			}
+			break;
+			case STRING:
+			value = cell.getStringCellValue();
+			break;
+			case BOOLEAN:
+			value = String.valueOf(cell.getBooleanCellValue());
+			break;
+		default:
+		}
+		return value;
+	}
+
+	/**
+	 * 处理数值型的科学计数法
+	 *
+	 * @author xuhw on 2010-8-3
+	 * @param strDigt
+	 * @return
+	 */
+	private String parseDouble(String strDigt) {
+		int pos = strDigt.indexOf("E");
+		int dotPos = strDigt.indexOf(".");
+		String betweenValue = strDigt.substring(dotPos + 1, pos);
+		String temp = "";
+		int power = Integer.parseInt(strDigt.substring(pos + 1));
+		if (power > 0) {
+			StringBuilder sbd = new StringBuilder();
+			sbd.append(strDigt.substring(0, dotPos));
+			for (int index = 0; index < power; index++) {
+				if (index < betweenValue.length()) {
+					sbd.append(betweenValue.charAt(index));
+				} else {
+					sbd.append("0");
+				}
+			}
+
+			if (power < betweenValue.length()) {
+				temp = betweenValue.substring(power);
+				sbd.append((new StringBuilder()).append(".").append(temp).toString());
+			}
+			return sbd.toString();
+		} else {
+			return strDigt;
+		}
+	}
+
+	/**
+	 * 导入文件数据非空校验
+	 *
+	 * @author xuhw on 2010-4-23
+	 * @param strItemKey
+	 * @param aValue
+	 * @param name
+	 * @param sbMessage
+	 * @return
+	 */
+	private boolean notNullValidator(Map<String, Object> headMap, String aValue, String name, StringBuffer sbMessage) {
+		// 谈判工资,档别 级别 必须为空, 其它都为非空
+		boolean isLost = true;
+		
+		String nullable = (String) headMap.get("nullable");
+		
+		if("N".equals(nullable)) {
+			if(StringUtils.isBlank(aValue)) {
+				sbMessage.append(headMap.get("name")+"不能为空");
+				return false;
+			}
+		}
+//		if (TrainVO.ACT_NAME.equalsIgnoreCase((String)headMap.get("key")) && StringUtils.isBlank(aValue)) {
+//			sbMessage.append("培训活动名称不能为空");
+//			return false;
+//		}
+//		if (TrainVO.TRA_TYPE.equalsIgnoreCase(strItemKey) && StringUtils.isBlank(aValue)) {
+//			sbMessage.append("培训类别不能为空");
+//			return false;
+//		}
+//		if ("psnCode".equalsIgnoreCase(strItemKey) && StringUtils.isBlank(aValue)) {
+//			sbMessage.append("人员编码不能为空");
+//			return false;
+//		}
+
+		if (!isLost) {
+			sbMessage.append("\n");
+			return false;
+		}
+
+		return isLost;
+	}
+
+	private Cell renderCell(Cell cell, Workbook wb) {
+		CellStyle titleCellStyle = wb.createCellStyle();
+		Font font = wb.createFont();
+		font.setColor(Font.COLOR_RED);
+		titleCellStyle.setFont(font);
+//		titleCellStyle.setFillBackgroundColor(IndexedColors.RED.getIndex());
+//		titleCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());// 设置背景色
+//		titleCellStyle.setFillForegroundColor(IndexedColors.CORNFLOWER_BLUE.getIndex());// 设置背景色
+		cell.setCellStyle(titleCellStyle);
+		return cell;
+	}
+
+	private Object getValue(Map<String, Object> headMap, Object sValue) {
+		int dataType = (Integer) headMap.get("dataType");
+		Object value = "";
+		if (dataType != IBillItem.DECIMAL && (sValue == null || sValue.equals(""))) {
+			return null;
+		}
+		switch (dataType) {
+		
+		case IBillItem.INTEGER:
+			if (sValue == null || sValue.equals("")) {
+				value = Integer.valueOf(0);
+				break;
+			}
+			value = Integer.valueOf(sValue.toString().replaceAll("\\.0", ""));
+			break;
+		case IBillItem.DECIMAL:
+			if (sValue == null || sValue.equals("")) {
+				value = new UFDouble(0);
+				break;
+			}
+			value = new UFDouble(sValue.toString());
+			break;
+		case IBillItem.STRING:
+			value = sValue;
+			// 由于从excls中读取的数据如果是字符类型的输入数字,会自动在加上.0结尾
+			value = value.toString().replaceAll("\\.0", "");
+			break;
+		case IBillItem.BOOLEAN:
+			value = UFBoolean.valueOf(sValue.toString());
+			break;
+		case IBillItem.DATE:
+			value = new UFDate(sValue.toString());
+			break;
+		case IBillItem.LITERALDATE:
+			value = new UFLiteralDate(sValue.toString());
+			break;
+		case IBillItem.COMBO:
+			//枚举
+			value = sValue;
+			String enum_id = (String) headMap.get("enum_id");
+			if(StringUtils.isNotBlank(enum_id)) {
+				try {
+					List<EnumValueVO> enumList = this.getEnumVO(enum_id,value.toString());
+					if(enumList != null && enumList.size() > 0) {
+						value = enumList.get(0).getValue();
+					}
+				} catch (BusinessException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+			break;
+		case IBillItem.UFREF:
+			value = sValue;
+			String pk_refinfo = (String) headMap.get("pk_refinfo");
+			if(StringUtils.isNotBlank(pk_refinfo)) {
+				try {
+					List<DefdocVO> defList = this.getDefdocVO(pk_refinfo,value.toString());
+					if(defList != null && defList.size() > 0) {
+						value = defList.get(0).getPk_defdoc();
+					}
+				} catch (BusinessException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+//				String sql = "select pk_defdoc from bd_defdoc where (code='"+sValue+"' or name = '"+sValue+"') and nvl(dr,0) = 0 and pk_defdoclist = (select bd_defdoclist.pk_defdoclist from bd_defdoclist where code = 'HR021_0xx')";
+//				try {
+//					String pk_defdoc = (String) getIUAPQueryBS().executeQuery(sql, new ColumnProcessor());
+//					value = pk_defdoc;
+//				} catch (BusinessException e) {
+//					e.printStackTrace();
+//				}
+//			}else if("tra_mode".equals(headMap.get("key"))) {
+//				String sql = "select pk_defdoc from bd_defdoc where (code='"+sValue+"' or name = '"+sValue+"') and nvl(dr,0) = 0 and pk_defdoclist = (select bd_defdoclist.pk_defdoclist from bd_defdoclist where code = 'HR020_0xx')";
+//				try {
+//					String pk_defdoc = (String) getIUAPQueryBS().executeQuery(sql, new ColumnProcessor());
+//					value = pk_defdoc;
+//				} catch (BusinessException e) {
+//					e.printStackTrace();
+//				}
+//			}
+			
+			break;
+		default:
+			value = sValue;
+		}
+		
+		if("psnCode".equals(headMap.get("key"))) {
+			String sql = "select pk_psndoc from bd_psndoc where code='"+sValue+"'";
+			String pk_psndoc = "";
+			try {
+				pk_psndoc = (String) getIUAPQueryBS().executeQuery(sql, new ColumnProcessor());
+			} catch (BusinessException e) {
+				e.printStackTrace();
+			}
+			value = pk_psndoc;
+		}
+		
+		return value;
+	}
+	
+	public  List<DefdocVO> getDefdocVO(String pk_refinfo,String value) throws BusinessException{
+		String sql = "select * from bd_defdoc where nvl(dr,0) = 0 and (code = '"+value+"' or name = '"+value+"') and pk_defdoclist = (select para1 from bd_refinfo where pk_refinfo = '"+pk_refinfo+"')";
+        return (List<DefdocVO>) getIUAPQueryBS().executeQuery(sql, new BeanListProcessor(DefdocVO.class));
+    }
+	
+	public  List<EnumValueVO> getEnumVO(String emunid,String name) throws BusinessException{
+		String sql = "select * from md_enumvalue where id = '"+emunid+"' and name = '"+name+"' and nvl(dr,0) = 0";
+        return (List<EnumValueVO>) getIUAPQueryBS().executeQuery(sql, new BeanListProcessor(EnumValueVO.class));
+    }
+	
+	public static IUAPQueryBS iUapQueryBS;
+	
+	public static IUAPQueryBS getIUAPQueryBS() {
+		if(iUapQueryBS == null) {
+			iUapQueryBS = ServiceLocator.find(IUAPQueryBS.class);
+		}
+		return iUapQueryBS;
+	}
+	
+	public Map<String,String> getSourceType(){
+//		指定参训=0,报名参训=1,其他=2,手工添加=3 source_type
+		Map<String,String> result = new HashMap();
+		result.put("指定参训", "0");
+		result.put("报名参训", "1");
+		result.put("其他", "2");
+		result.put("手工添加", "3");
+		return result;
+	}
+	
+	public Map<String,String> getTaketrmMethod(){
+//		全部参训=0,部分参训=1,中途参训=2,其他=3 taketrm_method
+		Map<String,String> result = new HashMap();
+		result.put("全部参训", "0");
+		result.put("部分参训", "1");
+		result.put("中途参训", "2");
+		result.put("其他", "3");
+		return result;
+
+	}
+}

+ 248 - 0
hrhi/src/client/yyconfig/modules/hrhi/psndoc/config/action/hrhi_psndoc.xml

@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<actions>
+    <action>
+        <name>hrhi.psndoc.PsndocTreeRootAction</name>
+        <label>委托树/行政树取根</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocTreeMsRootAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocTreeFirstChildAction</name>
+        <label>委托树取一层下级节点</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocTreeMsFirstChildAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocTreeAosRootAction</name>
+        <label>行政树取根</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocTreeAosRootAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocTreeAosFirstChildAction</name>
+        <label>行政树取一层下级节点</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocTreeAosFirstChildAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocTreePsnclAction</name>
+        <label>人员类别树</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocTreePsnclAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocMsQueryAction</name>
+        <label>查询人员列表(兼容所有)</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocQueryAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocQueryOneAction</name>
+        <label>查询人员单条</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocQueryOneAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocQueryOneNoTempAction</name>
+        <label>查询人员单条(不含模板)</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocQueryOneNoTempAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocDeleteAction</name>
+        <label>删除人员</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocDeleteAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocAdjustSortAction</name>
+        <label>调整顺序-保存</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocAdjustSortAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocListReptQueryAction</name>
+        <label>联查花名册</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocListReptQueryAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocLoadSubDataAction</name>
+        <label>查询子集数据</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocLoadSubDataAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchEditInitAction</name>
+        <label>批改初始化</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchEditInitAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchEditTableChgAction</name>
+        <label>批改选择信息集</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchEditTableChgAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchEditFieldChgAction</name>
+        <label>批改选择信息项</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchEditFieldChgAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchEditDoAction</name>
+        <label>批改执行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchEditDoAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchAddSubSetInitAction</name>
+        <label>批量增加子集初始化</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchAddSubSetInitAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchAddSubSetNextAction</name>
+        <label>批量增加子集下一步</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchAddSubSetNextAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchAddSubSetDoAction</name>
+        <label>批量增加子集执行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchAddSubSetDoAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocSaveCheckAction</name>
+        <label>人员保存-校验</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocSaveCheckAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocSaveDoAction</name>
+        <label>人员保存-执行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocSaveDoAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocEditAction</name>
+        <label>人员修改</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocQueryJobHistroyAction</name>
+        <label>联查任职历史</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocQueryJobHistroyAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocQueryReptObjectAction</name>
+        <label>联查汇报关系</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocQueryReptObjectAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocCreateUserInitAction</name>
+        <label>生成用户-初始化</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocCreateUserInitAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocCreateUserDoAction</name>
+        <label>生成用户-执行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocCreateUserDoAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocExportPhotoAction</name>
+        <label>导出照片</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocExportPhotoAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocImportPhotoAction</name>
+        <label>导入照片</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocImportPhotoAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocExportPsninfoInitAction</name>
+        <label>导出(导出全部)-初始化</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocExportPsninfoInitAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocExportPsninfoDoAction</name>
+        <label>导出(导出全部)-执行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocExportPsninfoDoAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocTemplatePrintAction</name>
+        <label>模版打印</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocTemplatePrintAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBodyAfterEditAction</name>
+        <label>表体编辑后</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBodyAfterEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBodyBeforeEditAction</name>
+        <label>表体编辑前</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBodyBeforeEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocHeadAfterEditAction</name>
+        <label>表头编辑后</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocHeadAfterEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocHeadBeforeEditAction</name>
+        <label>表头编辑前</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocHeadBeforeEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocSubAddAction</name>
+        <label>新增行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocSubAddAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocSubDeleteAction</name>
+        <label>删除行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocSubDeleteAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocSubInsertAction</name>
+        <label>插入行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocSubInsertAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocSubPasteAction</name>
+        <label>粘贴行</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocSubPasteAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchAddSub1stAfterEditAction</name>
+        <label>第一步编辑后</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchAddSub1stAfterEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchAddSub1stBeforeEditAction</name>
+        <label>第一步编辑前</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchAddSub1stBeforeEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchAddSub2ndAfterEditAction</name>
+        <label>第二步编辑后</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchAddSub2ndAfterEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocBatchAddSub2ndBeforeEditAction</name>
+        <label>第二步编辑前</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocBatchAddSub2ndBeforeEditAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.PsndocSubQueryPKAction</name>
+        <label>查询子表行主键</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocSubQueryPKAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.ZipDownLoadAction</name>
+        <label>打包下载</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.ZipDownLoadAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.TrainExportAction</name>
+        <label>打包下载</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.TrainExportAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.TrainImportAction</name>
+        <label>导入</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.TrainImportAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.TrainExportErrorAction</name>
+        <label>导出错误</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.TrainExportErrorAction</clazz>
+    </action>
+    <action>
+        <name>hrhi.psndoc.TrainImportInDBAction</name>
+        <label>导入数据库</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.TrainImportInDBAction</clazz>
+    </action>
+</actions>

+ 58 - 0
hrhi/src/client/yyconfig/modules/hrhi/psndoc/config/authorize/60071020_authorize.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<authorizes>
+    <authorize>
+        <appcode>60071010,60071020,60071030,60071025,60023090,600710C0,60072050,60072060,60072070,60071026,600230A0,60651040</appcode>
+        <actions>
+            <action>hrhi.psndoc.PsndocTreeRootAction</action>
+            <action>hrhi.psndoc.PsndocTreeFirstChildAction</action>
+            <action>hrhi.psndoc.PsndocTreeAosRootAction</action>
+            <action>hrhi.psndoc.PsndocTreeAosFirstChildAction</action>
+            <action>hrhi.psndoc.PsndocTreePsnclAction</action>
+            <action>hrhi.psndoc.PsndocMsQueryAction</action>
+            <action>hrhi.psndoc.PsndocQueryOneAction</action>
+            <action>hrhi.psndoc.PsndocQueryOneNoTempAction</action>
+            <action>hrhi.psndoc.PsndocDeleteAction</action>
+            <action>hrhi.psndoc.PsndocAdjustSortAction</action>
+            <action>hrhi.psndoc.PsndocListReptQueryAction</action>
+            <action>hrhi.psndoc.PsndocLoadSubDataAction</action>
+            <action>hrhi.psndoc.PsndocBatchEditInitAction</action>
+            <action>hrhi.psndoc.PsndocBatchEditTableChgAction</action>
+            <action>hrhi.psndoc.PsndocBatchEditFieldChgAction</action>
+            <action>hrhi.psndoc.PsndocBatchEditDoAction</action>
+            <action>hrhi.psndoc.PsndocBatchAddSubSetInitAction</action>
+            <action>hrhi.psndoc.PsndocBatchAddSubSetNextAction</action>
+            <action>hrhi.psndoc.PsndocBatchAddSubSetDoAction</action>
+            <action>hrhi.psndoc.PsndocSaveCheckAction</action>
+            <action>hrhi.psndoc.PsndocSaveDoAction</action>
+            <action>hrhi.psndoc.PsndocEditAction</action>
+            <action>hrhi.psndoc.PsndocQueryJobHistroyAction</action>
+            <action>hrhi.psndoc.PsndocQueryReptObjectAction</action>
+            <action>hrhi.psndoc.PsndocCreateUserInitAction</action>
+            <action>hrhi.psndoc.PsndocCreateUserDoAction</action>
+            <action>hrhi.psndoc.PsndocExportPhotoAction</action>
+            <action>hrhi.psndoc.PsndocImportPhotoAction</action>
+            <action>hrhi.psndoc.PsndocExportPsninfoInitAction</action>
+            <action>hrhi.psndoc.PsndocExportPsninfoDoAction</action>
+            <action>hrhi.psndoc.PsndocTemplatePrintAction</action>
+            <action>hrhi.psndoc.PsndocBodyAfterEditAction</action>
+            <action>hrhi.psndoc.PsndocBodyBeforeEditAction</action>
+            <action>hrhi.psndoc.PsndocHeadAfterEditAction</action>
+            <action>hrhi.psndoc.PsndocHeadBeforeEditAction</action>
+            <action>hrhi.psndoc.PsndocSubAddAction</action>
+            <action>hrhi.psndoc.PsndocSubDeleteAction</action>
+            <action>hrhi.psndoc.PsndocSubInsertAction</action>
+            <action>hrhi.psndoc.PsndocSubPasteAction</action>
+            <action>hrhi.psndoc.PsndocBatchAddSub1stAfterEditAction</action>
+            <action>hrhi.psndoc.PsndocBatchAddSub1stBeforeEditAction</action>
+            <action>hrhi.psndoc.PsndocBatchAddSub2ndAfterEditAction</action>
+            <action>hrhi.psndoc.PsndocBatchAddSub2ndBeforeEditAction</action>
+            <action>hrhi.psndoc.PsndocSubQueryPKAction</action>
+            <action>hrhi.psndoc.ZipDownLoadAction</action>
+            <action>hrhi.psndoc.TrainExportAction</action>
+            <action>hrhi.psndoc.TrainImportAction</action>
+            <action>hrhi.psndoc.TrainExportErrorAction</action>
+            <action>hrhi.psndoc.TrainImportInDBAction</action>
+        </actions>
+    </authorize>
+</authorizes>

+ 232 - 0
hrhi/src/private/nc/impl/hi/psndoc/PsndocTrainServiceImpl.java

@@ -0,0 +1,232 @@
+package nc.impl.hi.psndoc;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.dao.DAOException;
+import nc.bs.logging.Logger;
+import nc.hr.utils.InSQLCreator;
+import nc.hr.utils.ResHelper;
+import nc.hr.utils.SQLHelper;
+import nc.itf.hi.IPsndocTrainService;
+import nc.jdbc.framework.processor.BeanListProcessor;
+import nc.vo.hi.psndoc.TrainVO;
+import nc.vo.hi.wadoc.PsndocWadocVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.uif2.LoginContext;
+import nccloud.commons.lang.ArrayUtils;
+
+public class PsndocTrainServiceImpl implements IPsndocTrainService {
+	
+	private final int PSNNAME = 1;
+	private final int PSNCODE = 0;
+	
+	private BaseDAO baseDAO;
+	public BaseDAO getBaseDAO() {
+		if(baseDAO == null) {
+			baseDAO = new BaseDAO();
+		}
+		return baseDAO;
+	}
+
+	@Override
+	public TrainVO[] importData2DB(TrainVO[] trainVOs, LoginContext context)
+			throws BusinessException {
+		return extendInertVoinfo(trainVOs, context);
+	}
+
+	/**
+	 * 对导入的数据集进行分析处理<BR>
+	 * 1)判断导入数据的各项目是否合法<BR>
+	 * 合法:导入数据库<BR>
+	 * 非法:判断原因存储,回显给用户<BR>
+	 * 2)返回 导入后信息<BR>
+	 *
+	 * @author xuhw on 2010-4-21
+	 * @param psndocWadocVOs
+	 * @return
+	 * @throws BusinessException
+	 */
+	private TrainVO[] extendInertVoinfo(TrainVO[] trainVOs, LoginContext context)
+			throws BusinessException{
+		// 数据合法的记录集合
+		List<TrainVO> successImportList = new ArrayList<TrainVO>();
+		// 不合法的记录集合
+		List<TrainVO> failtureImportList = new ArrayList<TrainVO>();
+		TrainVO aftProVO = null;
+		if (ArrayUtils.isEmpty(trainVOs)) {
+			return trainVOs;
+		}
+		int inttt = 0;
+		for (TrainVO trainVO : trainVOs) {
+			
+			aftProVO = this.expandInertVOInfo(trainVO,context);
+			if(aftProVO == null){
+				//added by zengcheng 2012-07-12,没有查到人,则需要放入不合法的记录,一般都是因为非谈判薪酬,然后金额不符合级档的规定
+				failtureImportList.add(aftProVO);
+				continue;
+			}
+			if (aftProVO == null) {
+				failtureImportList.add(trainVO);
+				continue;
+			}
+			successImportList.add(aftProVO);
+		}
+		
+		if(successImportList.size() > 0) {
+			getBaseDAO().insertVOArray(successImportList.toArray(new TrainVO[0]));
+		}
+		return queryWaFailedReason(failtureImportList, context);
+	}
+	
+	private TrainVO expandInertVOInfo(TrainVO trainVO, LoginContext context) throws BusinessException{
+		StringBuffer sbSql = new StringBuffer();
+		sbSql.append("	select  ");
+		sbSql.append("	 "+ SQLHelper.getMultiLangNameColumn("bd_psndoc.name")+ "  as psnName,  ");
+		sbSql.append("	bd_psndoc.code as psnCode,   ");
+		sbSql.append("	hi_psnorg.pk_psnorg,");
+		sbSql.append("	hi_psnjob.pk_psnjob ");
+		sbSql.append("	from  ");
+		sbSql.append("	bd_psndoc   ");
+		sbSql.append("	inner join hi_psnorg on bd_psndoc.pk_psndoc = hi_psnorg.pk_psndoc  ");
+		sbSql.append("  inner join hi_psnjob on hi_psnjob.pk_psndoc = bd_psndoc.pk_psndoc and hi_psnorg.pk_psnorg = hi_psnjob.pk_psnorg");
+		sbSql.append("	where  ");
+		sbSql.append("	bd_psndoc.code = '").append(trainVO.getPsnCode()).append("' and  ");
+		sbSql.append("	hi_psnorg.indocflag = 'Y' and  ");
+		sbSql.append("	hi_psnorg.lastflag = 'Y'   ");
+		TrainVO[] trainVOs = this.executeQueryVOs(sbSql.toString());
+		if(trainVOs != null && trainVOs.length > 0) {
+			trainVO.setPk_psnjob(trainVOs[0].getPk_psnjob());
+			trainVO.setPk_psnorg(trainVOs[0].getPk_psnorg());
+			return trainVO;
+		}
+		return null;
+	}
+	
+	/**
+	 * 查询理由<BR>
+	 * <BR>
+	 *
+	 * @author xuhw on 2010-4-22
+	 * @param failtureImportList
+	 * @param content
+	 * @return
+	 * @throws BusinessException
+	 */
+	private TrainVO[] queryWaFailedReason(List<TrainVO> failtureImportList, LoginContext context)
+			throws BusinessException{
+		try {
+			// 员工信息中无此员工编码的人员
+			List<TrainVO> vNotInBdpsndocByCode = checkFailedInResult(failtureImportList, this
+					.queryInBdpsndocByCode(failtureImportList, context));
+			failtureImportList = new ArrayList<TrainVO>();
+			failtureImportList.addAll(vNotInBdpsndocByCode);
+		} catch (Exception ex) {
+			throw new BusinessException(ex.getMessage(), ex);
+		}
+		return failtureImportList.toArray(new TrainVO[0]);
+	}
+	
+	/**
+	 * 从结果中剔除已经能够判断错误原因的人员的人员
+	 *
+	 * @param results
+	 *            待确认错误原因的人员
+	 * @param inQueryResult
+	 *            已经存在的人员
+	 * @return 剔除了已经存在人员的结果
+	 */
+	private List<TrainVO> checkFailedInResult(List<TrainVO> failtureImportList,
+			TrainVO[] inQueryResult){
+
+		List<TrainVO> psnReasonPersons = new ArrayList<TrainVO>();
+		List<TrainVO> otherReasonPsn = new ArrayList<TrainVO>();
+
+		int length = 0;
+		if (!ArrayUtils.isEmpty(inQueryResult)) {
+			length = inQueryResult.length;
+		}
+		for (int i = 0; i < failtureImportList.size(); i++) {
+			Logger.debug(new Date() + " : checkFailedInResult ----> + " + i);
+			TrainVO trainVO = failtureImportList.get(i);
+			trainVO.setReason("员工信息中编码为[{"+trainVO.getPsnCode()+"}]的员工不存在!\n");
+			trainVO.setError_flag(PSNCODE);
+			psnReasonPersons.add(trainVO);
+			for (int j = 0; j < length; j++) {
+				String psncode = inQueryResult[j].getPsnCode();
+				String psnName = inQueryResult[j].getPsnName();
+				if (psncode.equals(trainVO.getPsnCode())) {
+					if (!psnName.equals(trainVO.getPsnName())) {
+						trainVO.setReason("员工信息中无姓名为[{"+trainVO.getPsnName()+"}]的员工不存在!\n");
+						trainVO.setError_flag(PSNNAME);
+					} else {
+						psnReasonPersons.remove(trainVO);
+						trainVO.setReason(null);
+						otherReasonPsn.add(trainVO);
+					}
+				}
+			}
+		}
+
+		failtureImportList.clear();//removeAll(failtureImportList);
+		failtureImportList.addAll(otherReasonPsn);
+		return psnReasonPersons;
+	}
+	
+	/**
+	 * 查询人员编码确定的人是否在人员档案中
+	 * 
+	 * @author xuhw on 2010-4-21
+	 * @param results
+	 * @param context
+	 * @return
+	 * @throws BusinessException 
+	 * @throws Exception
+	 */
+	public TrainVO[] queryInBdpsndocByCode(List<TrainVO> failtureImportList, LoginContext context) throws BusinessException
+	{
+
+		if (failtureImportList == null || failtureImportList.size() == 0)
+		{
+			return new TrainVO[0];
+		}
+		String in = new InSQLCreator().getInSQL(failtureImportList.toArray(new TrainVO[0]), TrainVO.PSNCODE);
+//		List<CircularlyAccessibleValueObject[]> list = FormatVO.seperateValueObject(failtureImportList.toArray(new PsndocWadocVO[0]));
+//		String in = "";
+//		for (CircularlyAccessibleValueObject[] circularlyAccessibleValueObjects : list)
+//		{
+//			if(!StringUtils.isEmpty(in)){
+//				in += ",";
+//			}
+//			in += FormatVO.formatArrayToString(circularlyAccessibleValueObjects, PsndocWadocVO.PSNCODE, "'");
+//		}
+		StringBuffer sbSql = new StringBuffer();
+		sbSql.append("	select  ");
+		sbSql.append("	 "+ SQLHelper.getMultiLangNameColumn("bd_psndoc.name")+ "  as psnname,  ");
+		sbSql.append("	bd_psndoc.code as psncode   ");
+		sbSql.append("	from  ");
+		sbSql.append("	bd_psndoc   ");
+		sbSql.append("	inner join hi_psnorg on bd_psndoc.pk_psndoc = hi_psnorg.pk_psndoc  ");
+		sbSql.append("	where  ");
+		sbSql.append("	bd_psndoc.code in (").append(in).append(") and  ");
+		//sbSql.append("	bd_psndoc.pk_org = '").append(context.getPk_org()).append("' and  ");
+		
+		//sbSql.append("	bd_psndoc.pk_group = '").append(context.getPk_group()).append("'  and  ");  //跨集团兼职人员定调资数据无法导入
+		sbSql.append("	hi_psnorg.indocflag = 'Y' and  ");
+		// sbSql.append("	hi_psnorg.endflag = 'N' and  ");
+		sbSql.append("	hi_psnorg.lastflag = 'Y'   ");
+		return this.executeQueryVOs(sbSql.toString());
+	}
+	
+	public TrainVO[] executeQueryVOs(String sql) throws DAOException {
+		List<TrainVO> list = (List)getBaseDAO().executeQuery(sql, new BeanListProcessor(TrainVO.class));
+		if (list == null || list.size() == 0) {
+			return (TrainVO[])(Object[])Array.newInstance(TrainVO.class, 0);
+		}
+		return (TrainVO[])list.toArray((Object[])Array.newInstance(TrainVO.class, list.size()));
+	}
+	
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 3518 - 0
hrhi/src/private/nc/impl/hr/pub/PersonRecordImpl.java


+ 139 - 0
hrhi/src/private/nc/impl/hr/train/CloudFinshDetailPlugin.java

@@ -0,0 +1,139 @@
+package nc.impl.hr.train;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.pub.pa.PreAlertObject;
+import nc.bs.pub.taskcenter.BgWorkingContext;
+import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
+import nc.bs.uap.lock.PKLock;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.vo.hi.cloud.train.CloudFinshDetailVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFDate;
+
+/**
+ * (线下)培训课程完成情况到NCC后台表
+ * @author chenzf
+ * @date 2022-4-20 20:30:06
+ * 
+ */
+public class CloudFinshDetailPlugin implements IBackgroundWorkPlugin {
+
+	@Override
+	public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException {
+		PreAlertObject alertObj = new PreAlertObject();
+		if(!PKLock.getInstance().addDynamicLock("CloudFinshDetailPlugin")) {
+			alertObj.setReturnObj("任务执行中,请勿重复执行!");
+			return alertObj;
+	    }
+		TrainCloudSchoolImpl impl = new TrainCloudSchoolImpl();
+		Map<String,Object> bodyMap = impl.getBodyMap();
+		Map map = arg0.getKeyMap();
+		String updateDate = "";//"yyyy-MM-dd"
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date today = new Date();//获取今天的日期
+		Calendar c = Calendar.getInstance();
+		c.setTime(today);
+		if(map.get("nums") != null && !"".equals(map.get("nums"))) {
+			int nums = Integer.valueOf(arg0.getKeyMap().get("nums").toString());
+			if(nums == 0) {
+				updateDate = "1997-01-01";
+			} else {
+				c.add(Calendar.DAY_OF_MONTH, nums);
+				updateDate = sdf.format(c.getTime());
+			}
+		} else {
+			c.add(Calendar.DAY_OF_MONTH, 1);
+			updateDate = sdf.format(c.getTime());
+		}
+		BaseDAO dao = new BaseDAO();
+		int totalPages = 0;
+		//培训内容id 必填
+		String trainContentID = "";
+		String result = impl.getcontentfinshdetaillist(bodyMap, 1, 500, trainContentID);
+		if(StringUtils.isNotBlank(result)) {
+			JSONObject jsonObject = JSONObject.parseObject(result);
+			String code = jsonObject.getString("code");
+			String sql = "select id from cloud_finsh_detail where nvl(dr,0) = 0";
+			List<String> list = (List<String>) dao.executeQuery(sql, new ColumnListProcessor());
+			List<CloudFinshDetailVO> insertList = new ArrayList();
+			if("0".equals(code)) {
+				JSONObject paging = jsonObject.getJSONObject("paging");
+				if(paging != null) {
+					totalPages = paging.getInteger("totalPages");//总页数
+					int totalCount = paging.getInteger("totalCount");//总条数
+//					if(totalPages > 1) {
+//						count = Integer.valueOf(totalCount) / 500;
+//					}
+				}
+				JSONArray jsonArray = jsonObject.getJSONArray("data");//数据data
+				if(jsonArray != null) {
+					List<CloudFinshDetailVO> finshList = JSONArray.parseArray(jsonArray.toJSONString(), CloudFinshDetailVO.class);
+					if(finshList != null) {
+//						for(int i = 0;i < jsonArray.size(); i++) {
+//							JSONObject obj = jsonArray.getJSONObject(i);
+//							for(CloudFinshDetailVO finsh : finshList) {
+//								if(finsh.getId() != null && finsh.getId().equals(obj.get("id"))) {
+//									finsh.setFinshStatus(obj.getString("status"));
+//								}
+//							}
+//						}
+						for(CloudFinshDetailVO finsh : finshList) {
+							if(!list.contains(finsh.getId())) {
+								insertList.add(finsh);
+							}
+						}
+					}
+				}
+			}
+			if(totalPages > 1) {
+				for(int i = 2; i < totalPages;i++) {
+					result = impl.getcontentfinshdetaillist(bodyMap, i, 500, trainContentID);
+					JSONObject ijsonObject = JSONObject.parseObject(result);
+					String icode = jsonObject.getString("code");
+					if("0".equals(icode)) {
+						JSONArray jsonArray = ijsonObject.getJSONArray("data");//数据data
+						if(jsonArray != null) {
+							List<CloudFinshDetailVO> finshList = JSONArray.parseArray(jsonArray.toJSONString(), CloudFinshDetailVO.class);
+							if(finshList != null) {
+//								for(int j = 0;j < jsonArray.size(); j++) {
+//									JSONObject obj = jsonArray.getJSONObject(j);
+//									for(CloudFinshDetailVO finsh : finshList) {
+//										if(finsh.getId() != null && finsh.getId().equals(obj.get("id"))) {
+//											finsh.setFinshStatus(obj.getString("status"));
+//										}
+//									}
+//								}
+								for(CloudFinshDetailVO finsh : finshList) {
+									if(!list.contains(finsh.getId())) {
+										insertList.add(finsh);
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+			
+			//判断是否已存在中间表
+			if(insertList.size() > 0) {
+				String[] pks = dao.insertVOList(insertList);
+				alertObj.setReturnObj(pks);
+				alertObj.setMsgTitle("保存(线下)培训课程完成情况"+pks.length+"条数据");
+			}
+		}
+		return alertObj;
+	}
+
+}

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

@@ -0,0 +1,94 @@
+package nc.impl.hr.train;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.pub.pa.PreAlertObject;
+import nc.bs.pub.pa.PreAlertReturnType;
+import nc.bs.pub.taskcenter.BgWorkingContext;
+import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
+import nc.bs.uap.lock.PKLock;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.vo.hi.cloud.train.CloudKngcatalogsVO;
+import nc.vo.pub.BusinessException;
+/**
+ * 获取知识目录列表到NCC后台表
+ * @author chenzf
+ * @date 2022-4-20 20:30:06
+ * 
+ */
+public class CloudKngcatalogsPlugin implements IBackgroundWorkPlugin {
+
+	@Override
+	public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException {
+		PreAlertObject alertObj = new PreAlertObject();
+		if(!PKLock.getInstance().addDynamicLock("CloudKngcatalogsPlugin")) {
+			alertObj.setReturnObj("任务执行中,请勿重复执行!");
+			return alertObj;
+	    }
+		TrainCloudSchoolImpl impl = new TrainCloudSchoolImpl();
+		Map<String,Object> bodyMap = impl.getBodyMap();
+		Map map = arg0.getKeyMap();
+		String result = impl.getKngcatalogs(bodyMap, 0, 0);
+		if(StringUtils.isNotBlank(result)) {
+			BaseDAO dao = new BaseDAO();
+			JSONObject jsonObject = JSONObject.parseObject(result);
+			String code = jsonObject.getString("code");
+			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);
+					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());
+						List<String> list = new ArrayList();//存id的list
+						Map<String,String> idMap = new HashMap();//id为key,pk_kngcatalogs为value
+						if(list != null && list.size() >0) {
+							for(Map<String,String> m : listMap) {
+								list.add(m.get("id"));
+								idMap.put(m.get("id"), m.get("pk_kngcatalogs"));
+							}
+						}
+						
+						List<CloudKngcatalogsVO> insertList = new ArrayList();
+						List<CloudKngcatalogsVO> updList = new ArrayList();
+						//判断是否已存在中间表
+						for(CloudKngcatalogsVO vo : vosList) {
+							if(!list.contains(vo.getId())) {
+								insertList.add(vo);
+							} else {
+								vo.setPk_kngcatalogs(idMap.get(vo.getId()));
+								updList.add(vo);
+							}
+						}
+						alertObj.setMsgTitle("");
+						if(insertList.size() > 0) {
+							String[] pks = dao.insertVOList(insertList);
+							alertObj.setReturnObj(pks);
+							alertObj.setMsgTitle("新增知识目录"+pks.length+"条数据!");
+						}
+						if(updList.size() > 0) {
+							dao.updateVOList(updList);
+							alertObj.setMsgTitle(alertObj.getMsgTitle()+"修改知识目录"+updList.size()+"条数据!");
+						}
+					}
+				}
+			} else {
+				throw new BusinessException(jsonObject.getString("message"));
+			}
+		} else {
+			throw new BusinessException("查询结果result为空");
+		}
+		alertObj.setReturnType(PreAlertReturnType.RETURNMESSAGE);
+		return alertObj;
+	}
+
+}

+ 116 - 0
hrhi/src/private/nc/impl/hr/train/CloudKnowledgesPlugin.java

@@ -0,0 +1,116 @@
+package nc.impl.hr.train;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.pub.pa.PreAlertObject;
+import nc.bs.pub.pa.PreAlertReturnType;
+import nc.bs.pub.taskcenter.BgWorkingContext;
+import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
+import nc.bs.uap.lock.PKLock;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.vo.hi.cloud.train.CloudKngcatalogsVO;
+import nc.vo.hi.cloud.train.CloudKnowledgesVO;
+import nc.vo.pub.BusinessException;
+
+/**
+ * 知识列表到NCC后台表
+ * @author chenzf
+ * @date 2022-5-7 17:21:17
+ */
+public class CloudKnowledgesPlugin implements IBackgroundWorkPlugin {
+
+	@Override
+	public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException {
+		PreAlertObject alertObj = new PreAlertObject();
+		if(!PKLock.getInstance().addDynamicLock("CloudKngcatalogsPlugin")) {
+			alertObj.setReturnObj("任务执行中,请勿重复执行!");
+			return alertObj;
+	    }
+		TrainCloudSchoolImpl impl = new TrainCloudSchoolImpl();
+		Map<String,Object> bodyMap = impl.getBodyMap();
+		Map map = arg0.getKeyMap();
+		String updateDate = "";//"yyyy-MM-dd"
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date today = new Date();//获取今天的日期
+		Calendar c = Calendar.getInstance();
+		c.setTime(today);
+		if(map.get("nums") != null && !"".equals(map.get("nums"))) {
+			int nums = Integer.valueOf(arg0.getKeyMap().get("nums").toString());
+			if(nums == 0) {
+				updateDate = "2019-01-01";
+			} else {
+				c.add(Calendar.DAY_OF_MONTH, nums);
+				updateDate = sdf.format(c.getTime());
+			}
+		} else {
+			c.add(Calendar.DAY_OF_MONTH, 1);
+			updateDate = sdf.format(c.getTime());
+		}
+		bodyMap.put("updateDate", updateDate);
+		String result = impl.getKnowledges(bodyMap, 0, 0);
+		if(StringUtils.isNotBlank(result)) {
+			BaseDAO dao = new BaseDAO();
+			JSONObject jsonObject = JSONObject.parseObject(result);
+			String code = jsonObject.getString("code");
+			if("0".equals(code)) {
+				JSONArray jsonArray = jsonObject.getJSONArray("data");//数据data
+				if(jsonArray != null && jsonArray.size() > 0) {
+					List<CloudKnowledgesVO> vosList = JSONArray.parseArray(jsonArray.toJSONString().replaceAll("status", "cloudStatus"), CloudKnowledgesVO.class);
+					if(vosList != null) {
+						String sql = "select id,pk_knowledges from cloud_knowledges where nvl(dr,0) = 0";
+						List<Map<String,String>> listMap = (List<Map<String,String>>) dao.executeQuery(sql, new ColumnListProcessor());
+						List<String> list = new ArrayList();//存id的list
+						Map<String,String> idMap = new HashMap();//id为key,pk_kngcatalogs为value
+						if(list != null && list.size() >0) {
+							for(Map<String,String> m : listMap) {
+								list.add(m.get("id"));
+								idMap.put(m.get("id"), m.get("pk_knowledges"));
+							}
+						}
+						
+						List<CloudKnowledgesVO> insertList = new ArrayList();
+						List<CloudKnowledgesVO> updList = new ArrayList();
+						//判断是否已存在中间表
+						for(CloudKnowledgesVO vo : vosList) {
+							if(!list.contains(vo.getId())) {
+								insertList.add(vo);
+							} else {
+								vo.setPk_knowledges(idMap.get(vo.getId()));
+								updList.add(vo);
+							}
+						}
+						alertObj.setMsgTitle("");
+						if(insertList.size() > 0) {
+							String[] pks = dao.insertVOList(insertList);
+							alertObj.setReturnObj(pks);
+							alertObj.setMsgTitle("新增知识列表"+pks.length+"条数据!");
+						}
+						if(updList.size() > 0) {
+							dao.updateVOList(updList);
+							alertObj.setMsgTitle(alertObj.getMsgTitle()+"修改知识列表"+updList.size()+"条数据!");
+						}
+					}
+				}
+			} else {
+				throw new BusinessException(jsonObject.getString("message"));
+			}
+		} else {
+			throw new BusinessException("查询结果result为空");
+		}
+		alertObj.setReturnType(PreAlertReturnType.RETURNMESSAGE);
+		return alertObj;
+	}
+
+}

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

@@ -0,0 +1,301 @@
+package nc.impl.hr.train;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.text.ParseException;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.pub.pa.PreAlertObject;
+import nc.bs.pub.pa.PreAlertReturnType;
+import nc.bs.pub.taskcenter.BgWorkingContext;
+import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
+import nc.bs.uap.lock.PKLock;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.vo.hi.cloud.train.CloudFinshDetailVO;
+import nc.vo.hi.cloud.train.CloudKnowledgesVO;
+import nc.vo.hi.cloud.train.CloudOnlineuserknowledge;
+import nc.vo.pub.BusinessException;
+/**
+ * 员工所有线上学习记录到NCC后台表
+ * @author chenzf
+ * @date 2022-4-20 20:30:06
+ * 
+ */
+public class CloudOnlineuserknowledgePlugin implements IBackgroundWorkPlugin {
+
+	/**
+	  * 获取两个日期相差多少个月
+	  */
+	public int getMonthSpace(String date1, String date2)
+            throws ParseException {
+
+        int result = 0;
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        Calendar c1 = Calendar.getInstance();
+        Calendar c2 = Calendar.getInstance();
+
+        c1.setTime(sdf.parse(date1));
+        c2.setTime(sdf.parse(date2));
+
+        int i = c2.get(Calendar.YEAR)-c1.get(Calendar.YEAR);
+        int month = 0;
+        if (i<0)
+        {
+            month = -i*12;
+        }else if(i>0)
+        {
+            month =  i*12;
+        }
+        result = (c2.get(Calendar.MONDAY) - c1.get(Calendar.MONTH)) + month;
+        
+        return result == 0 ? 1 : Math.abs(result);
+
+    }
+	
+	@Override
+	public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException {
+		PreAlertObject alertObj = new PreAlertObject();
+		if(!PKLock.getInstance().addDynamicLock("CloudFinshDetailPlugin")) {
+			alertObj.setReturnObj("任务执行中,请勿重复执行!");
+			return alertObj;
+	    }
+		TrainCloudSchoolImpl impl = new TrainCloudSchoolImpl();
+		Map<String,Object> bodyMap = impl.getBodyMap();
+		Map map = arg0.getKeyMap();
+		String updateDate = "";//"yyyy-MM-dd"
+		String updateEndDate = "";
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date today = new Date();//获取今天的日期
+		Calendar c = Calendar.getInstance();
+		c.setTime(today);
+		int months = 0;//当前年到2020-01具体多少个月
+		if(map.get("nums") != null && !"".equals(map.get("nums"))) {
+			int nums = Integer.valueOf(arg0.getKeyMap().get("nums").toString());
+			if(nums == 0) {
+				try {
+					months = getMonthSpace(sdf.format(c.getTime()),"2019-01-01");
+				} catch (ParseException e) {
+					e.printStackTrace();
+				}
+				updateEndDate = sdf.format(c.getTime());
+				c.add(Calendar.DAY_OF_MONTH, -30);
+				updateDate = sdf.format(c.getTime());
+			} else {
+				c.add(Calendar.DAY_OF_MONTH, -nums);
+				updateDate = sdf.format(c.getTime());
+				c.add(Calendar.DAY_OF_MONTH, 30-nums);
+				updateEndDate = sdf.format(c.getTime());
+			}
+		} else {
+			c.add(Calendar.DAY_OF_MONTH, -1);
+			updateDate = sdf.format(c.getTime());
+			c.add(Calendar.DAY_OF_MONTH, 30);
+			updateEndDate = sdf.format(c.getTime());
+		}
+		BaseDAO dao = new BaseDAO();
+		List<CloudOnlineuserknowledge> insertList = new ArrayList();
+		List<CloudOnlineuserknowledge> updList = new ArrayList();
+		if(months == 0) {
+			bodyMap.put("updateDate", updateDate);
+			bodyMap.put("updateEndDate", updateEndDate);
+			Map<String,List<CloudOnlineuserknowledge>> resultMap = this.onlineuserknowledge(bodyMap, dao, impl);
+			if(resultMap.size() > 0) {
+				insertList.addAll(resultMap.get("insert"));
+				insertList.addAll(resultMap.get("update"));
+			}
+		}else if(months > 0) {
+			c.setTime(today);
+			for(int i = 0; i < months; i++) {
+				updateEndDate = sdf.format(c.getTime());
+				c.add(Calendar.MONTH, -1);
+				updateDate = sdf.format(c.getTime());
+				bodyMap.put("updateDate", updateDate);
+				bodyMap.put("updateEndDate", updateEndDate);
+				Map<String,List<CloudOnlineuserknowledge>> resultMap = this.onlineuserknowledge(bodyMap, dao, impl);
+				if(resultMap.size() > 0) {
+					insertList.addAll(resultMap.get("insert"));
+					insertList.addAll(resultMap.get("update"));
+				}
+			}
+		}
+		
+		alertObj.setMsgTitle("");
+		if(insertList.size() > 0) {
+			String[] pks = dao.insertVOList(insertList);
+			alertObj.setReturnObj(pks);
+			alertObj.setMsgTitle("新增员工所有线上学习记录"+pks.length+"条数据");
+		}
+		if(updList.size() > 0) {
+			dao.updateVOList(updList);
+			alertObj.setMsgTitle(alertObj.getMsgTitle()+"修改员工所有线上学习记录"+updList.size()+"条数据!");
+		}
+		
+//		bodyMap.put("updateDate", updateDate);
+//		bodyMap.put("updateEndDate", updateEndDate);
+//		BaseDAO dao = new BaseDAO();
+//		int totalPages = 0;
+//		String result = impl.getOnlineuserknowledge(bodyMap, 1, 300);
+//		if(StringUtils.isNotBlank(result)) {
+//			JSONObject jsonObject = JSONObject.parseObject(result);
+//			String code = jsonObject.getString("code");
+//			List<CloudOnlineuserknowledge> insertList = new ArrayList();
+//			List<CloudOnlineuserknowledge> updList = new ArrayList();
+//			if("0".equals(code)) {
+//				JSONObject data = jsonObject.getJSONObject("data");
+//				JSONObject paging = data.getJSONObject("paging");
+//				if(paging != null) {
+//					totalPages = paging.getInteger("totalPages");//总页数
+//					int totalCount = paging.getInteger("totalCount");//总条数
+//				}
+//				JSONArray jsonArray = data.getJSONArray("datas");//数据data
+//				String sql = "select id,pk_onlineuserknowledge from cloud_onlineuserknowledge where nvl(dr,0) = 0";
+//				List<Map<String,String>> listMap = (List<Map<String,String>>) dao.executeQuery(sql, new ColumnListProcessor());
+//				List<String> list = new ArrayList();//存id的list
+//				Map<String,String> idMap = new HashMap();//id为key,pk_kngcatalogs为value
+//				if(list != null && list.size() >0) {
+//					for(Map<String,String> m : listMap) {
+//						list.add(m.get("id"));
+//						idMap.put(m.get("id"), m.get("pk_onlineuserknowledge"));
+//					}
+//				}
+//				if(jsonArray != null) {
+//					List<CloudOnlineuserknowledge> vosList = JSONArray.parseArray(jsonArray.toJSONString().replaceAll("status", "cloudStatus"), CloudOnlineuserknowledge.class);
+//					if(vosList != null) {
+//						for(CloudOnlineuserknowledge vo : vosList) {
+//							if(!list.contains(vo.getId())) {
+//								insertList.add(vo);
+//							}else {
+//								vo.setPk_onlineuserknowledge(idMap.get(vo.getId()));
+//								updList.add(vo);
+//							}
+//						}
+//					}
+//				}
+//				if(totalPages > 1) {
+//					for(int i = 2; i < totalPages+1;i++) {
+//						result = impl.getOnlineuserknowledge(bodyMap, i, 300);
+//						JSONObject ijsonObject = JSONObject.parseObject(result);
+//						JSONObject datai = ijsonObject.getJSONObject("data");
+//						String icode = ijsonObject.getString("code");
+//						if("0".equals(icode)) {
+//							JSONArray jsonArrayi = datai.getJSONArray("datas");//数据data
+//							if(jsonArrayi != null) {
+//								List<CloudOnlineuserknowledge> vosList = JSONArray.parseArray(jsonArrayi.toJSONString(), CloudOnlineuserknowledge.class);
+//								//判断是否已存在中间表
+//								if(vosList != null) {
+//									for(CloudOnlineuserknowledge vo : vosList) {
+//										if(!list.contains(vo.getId())) {
+//											insertList.add(vo);
+//										}else {
+//											vo.setPk_onlineuserknowledge(idMap.get(vo.getId()));
+//											updList.add(vo);
+//										}
+//									}
+//								}
+//							}
+//						}
+//					}
+//				}
+//			}
+//			alertObj.setMsgTitle("");
+//			if(insertList.size() > 0) {
+//				String[] pks = dao.insertVOList(insertList);
+//				alertObj.setReturnObj(pks);
+//				alertObj.setMsgTitle("新增员工所有线上学习记录"+pks.length+"条数据");
+//			}
+//			if(updList.size() > 0) {
+//				dao.updateVOList(updList);
+//				alertObj.setMsgTitle(alertObj.getMsgTitle()+"修改员工所有线上学习记录"+updList.size()+"条数据!");
+//			}
+//		}
+		alertObj.setReturnType(PreAlertReturnType.RETURNMESSAGE);
+		return alertObj;
+	}
+	
+	public Map<String,List<CloudOnlineuserknowledge>> onlineuserknowledge(Map<String,Object> bodyMap,BaseDAO dao,TrainCloudSchoolImpl impl) throws BusinessException{
+		Map<String,List<CloudOnlineuserknowledge>> resultMap = new HashMap();
+		int totalPages = 0;
+		String result = impl.getOnlineuserknowledge(bodyMap, 1, 300);
+		if(StringUtils.isNotBlank(result)) {
+			JSONObject jsonObject = JSONObject.parseObject(result);
+			String code = jsonObject.getString("code");
+			List<CloudOnlineuserknowledge> insertList = new ArrayList();
+			List<CloudOnlineuserknowledge> updList = new ArrayList();
+			if("0".equals(code)) {
+				JSONObject data = jsonObject.getJSONObject("data");
+				JSONObject paging = data.getJSONObject("paging");
+				if(paging != null) {
+					totalPages = paging.getInteger("totalPages");//总页数
+					int totalCount = paging.getInteger("totalCount");//总条数
+				}
+				JSONArray jsonArray = data.getJSONArray("datas");//数据data
+				String sql = "select id,pk_onlineuserknowledge from cloud_onlineuserknowledge where nvl(dr,0) = 0";
+				List<Map<String,String>> listMap = (List<Map<String,String>>) dao.executeQuery(sql, new ColumnListProcessor());
+				List<String> list = new ArrayList();//存id的list
+				Map<String,String> idMap = new HashMap();//id为key,pk_kngcatalogs为value
+				if(list != null && list.size() >0) {
+					for(Map<String,String> m : listMap) {
+						list.add(m.get("id"));
+						idMap.put(m.get("id"), m.get("pk_onlineuserknowledge"));
+					}
+				}
+				if(jsonArray != null) {
+					List<CloudOnlineuserknowledge> vosList = JSONArray.parseArray(jsonArray.toJSONString().replaceAll("status", "cloudStatus"), CloudOnlineuserknowledge.class);
+					if(vosList != null) {
+						for(CloudOnlineuserknowledge vo : vosList) {
+							if(!list.contains(vo.getId())) {
+								insertList.add(vo);
+							}else {
+								vo.setPk_onlineuserknowledge(idMap.get(vo.getId()));
+								updList.add(vo);
+							}
+						}
+					}
+				}
+				if(totalPages > 1) {
+					for(int i = 2; i < totalPages+1;i++) {
+						result = impl.getOnlineuserknowledge(bodyMap, i, 300);
+						JSONObject ijsonObject = JSONObject.parseObject(result);
+						JSONObject datai = ijsonObject.getJSONObject("data");
+						String icode = ijsonObject.getString("code");
+						if("0".equals(icode)) {
+							JSONArray jsonArrayi = datai.getJSONArray("datas");//数据data
+							if(jsonArrayi != null) {
+								List<CloudOnlineuserknowledge> vosList = JSONArray.parseArray(jsonArrayi.toJSONString(), CloudOnlineuserknowledge.class);
+								//判断是否已存在中间表
+								if(vosList != null) {
+									for(CloudOnlineuserknowledge vo : vosList) {
+										if(!list.contains(vo.getId())) {
+											insertList.add(vo);
+										}else {
+											vo.setPk_onlineuserknowledge(idMap.get(vo.getId()));
+											updList.add(vo);
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+				resultMap.put("insert", insertList);
+				resultMap.put("update", updList);
+			}else {
+				throw new BusinessException(jsonObject.getString("message"));
+			}
+		}
+		return resultMap;
+	}
+
+}

+ 143 - 0
hrhi/src/private/nc/impl/hr/train/CloudPlanDetailPlugin.java

@@ -0,0 +1,143 @@
+package nc.impl.hr.train;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.pub.pa.PreAlertObject;
+import nc.bs.pub.taskcenter.BgWorkingContext;
+import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
+import nc.bs.uap.lock.PKLock;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.vo.hi.cloud.train.CloudPlanDetailVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFDate;
+import nc.vo.pubapp.AppContext;
+/**
+ * 学习计划执行明细数据到NCC后台表
+ * @author chenzf
+ * @date 2022-4-19 15:53:04
+ *
+ */
+public class CloudPlanDetailPlugin implements IBackgroundWorkPlugin {
+
+	@Override
+	public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException {
+		PreAlertObject alertObj = new PreAlertObject();
+		if(!PKLock.getInstance().addDynamicLock("CloudPlanDetailPlugin")) {
+			alertObj.setReturnObj("任务执行中,请勿重复执行!");
+			return alertObj;
+	    }
+		TrainCloudSchoolImpl impl = new TrainCloudSchoolImpl();
+		Map<String,Object> bodyMap = impl.getBodyMap();
+		Map map = arg0.getKeyMap();
+		String updateDate = "";//"yyyy-MM-dd"
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date today = new Date();//获取今天的日期
+		Calendar c = Calendar.getInstance();
+		c.setTime(today);
+		if(map.get("nums") != null && !"".equals(map.get("nums"))) {
+			int nums = Integer.valueOf(arg0.getKeyMap().get("nums").toString());
+			if(nums == 0) {
+				updateDate = "2019-01-01";
+			} else {
+				c.add(Calendar.DAY_OF_MONTH, nums);
+				updateDate = sdf.format(c.getTime());
+			}
+		} else {
+			c.add(Calendar.DAY_OF_MONTH, 1);
+			updateDate = sdf.format(c.getTime());
+		}
+		String result = impl.getStudyplandetailpagelist(bodyMap, 1, 500);
+		BaseDAO dao = new BaseDAO();
+		int totalPages = 0;
+		if(StringUtils.isNotBlank(result)) {
+
+			JSONObject jsonObject = JSONObject.parseObject(result);
+			String code = jsonObject.getString("code");
+			String sql = "select planID || userId from cloud_plan_detail where nvl(dr,0) = 0";
+			List<String> list = (List<String>) dao.executeQuery(sql, new ColumnListProcessor());
+			List<CloudPlanDetailVO> insertList = new ArrayList();
+			if("0".equals(code)) {
+				JSONObject paging = jsonObject.getJSONObject("paging");
+				if(paging != null) {
+					totalPages = paging.getInteger("totalPages");//总页数
+					int totalCount = paging.getInteger("totalCount");//总条数
+//					if(totalPages > 1) {
+//						count = Integer.valueOf(totalCount) / 500;
+//					}
+				}
+				JSONArray jsonArray = jsonObject.getJSONArray("data");//数据data
+				if(jsonArray != null) {
+					List<CloudPlanDetailVO> planList = JSONArray.parseArray(jsonArray.toJSONString(), CloudPlanDetailVO.class);
+					if(planList != null) {
+//						for(int i = 0;i < jsonArray.size(); i++) {
+//							JSONObject obj = jsonArray.getJSONObject(i);
+//							for(CloudPlanDetailVO plan : planList) {
+//								if(plan.getPlanID() != null && plan.getPlanID().equals(obj.get("planID"))
+//									&& plan.getUserId().equals(obj.get("userId"))	
+//										) {
+//									plan.setPlanStatus(obj.getString("status"));
+//								}
+//							}
+//						}
+						for(CloudPlanDetailVO plan : planList) {
+							if(!list.contains(plan.getPlanID()+plan.getUserId())) {
+								insertList.add(plan);
+							}
+						}
+					}
+				}
+			}
+			if(totalPages > 1) {
+				for(int i = 2; i < totalPages;i++) {
+					result = impl.getStudyplandetailpagelist(bodyMap, i, 500);
+					JSONObject ijsonObject = JSONObject.parseObject(result);
+					String icode = jsonObject.getString("code");
+					if("0".equals(icode)) {
+						JSONArray jsonArray = ijsonObject.getJSONArray("data");//数据data
+						if(jsonArray != null) {
+							List<CloudPlanDetailVO> planList = JSONArray.parseArray(jsonArray.toJSONString(), CloudPlanDetailVO.class);
+							if(planList != null) {
+//								for(int j = 0;j < jsonArray.size(); j++) {
+//									JSONObject obj = jsonArray.getJSONObject(j);
+//									for(CloudPlanDetailVO plan : planList) {
+//										if(plan.getPlanID() != null && plan.getPlanID().equals(obj.get("planID"))
+//											&& plan.getUserId().equals(obj.get("userId"))	
+//												) {
+//											plan.setPlanStatus(obj.getString("status"));
+//										}
+//									}
+//								}
+								for(CloudPlanDetailVO plan : planList) {
+									if(!list.contains(plan.getPlanID()+plan.getUserId())) {
+										insertList.add(plan);
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+			
+			//判断是否已存在中间表
+			if(insertList.size() > 0) {
+				String[] pks = dao.insertVOList(insertList);
+				alertObj.setReturnObj(pks);
+				alertObj.setMsgTitle("保存学习计划执行明细"+pks.length+"条数据");
+			}
+		
+		}
+		return alertObj;
+	}
+
+}

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

@@ -0,0 +1,116 @@
+package nc.impl.hr.train;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.pub.pa.PreAlertObject;
+import nc.bs.pub.pa.PreAlertReturnType;
+import nc.bs.pub.taskcenter.BgWorkingContext;
+import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
+import nc.bs.uap.lock.PKLock;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.vo.hi.cloud.train.CloudPsnVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFDate;
+
+/**
+ * 同步云学堂员工列表数据到NCC后台表
+ * @author chenzf
+ * @date 2022-4-19 15:53:04
+ *
+ */
+public class CloudPsnPlugin implements IBackgroundWorkPlugin {
+
+	@Override
+	public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException {
+		PreAlertObject alertObj = new PreAlertObject();
+		if(!PKLock.getInstance().addDynamicLock("CloudPsnPlugin")) {
+			alertObj.setReturnObj("任务执行中,请勿重复执行!");
+			return alertObj;
+	    }
+		TrainCloudSchoolImpl impl = new TrainCloudSchoolImpl();
+		Map<String,Object> bodyMap = impl.getBodyMap();
+		Map map = arg0.getKeyMap();
+		String updateDate = "";//"yyyy-MM-dd"
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date today = new Date();//获取今天的日期
+		Calendar c = Calendar.getInstance();
+		c.setTime(today);
+		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";
+			} else {
+				c.add(Calendar.DAY_OF_MONTH, nums);
+				updateDate = sdf.format(c.getTime());
+			}
+		} else {
+			c.add(Calendar.DAY_OF_MONTH, 1);
+			updateDate = sdf.format(c.getTime());
+		}
+		bodyMap.put("updateDate", updateDate);
+		String result = impl.getUserList(bodyMap);
+		if(StringUtils.isNotBlank(result)) {
+			BaseDAO dao = new BaseDAO();
+			JSONObject jsonObject = JSONObject.parseObject(result);
+			String code = jsonObject.getString("code");
+			if("0".equals(code)) {
+				JSONArray jsonArray = jsonObject.getJSONArray("data");//数据data
+				if(jsonArray != null && jsonArray.size() > 0) {
+					List<CloudPsnVO> psnVOs = JSONArray.parseArray(jsonArray.toJSONString().replaceAll("status", "cloudStatus"), CloudPsnVO.class);
+					if(psnVOs != null) {
+						String sql = "select id,pk_cloud from cloud_psndoc where nvl(dr,0) = 0";
+						List<Map<String,String>> listMap = (List<Map<String,String>>) dao.executeQuery(sql, new ColumnListProcessor());
+						List<String> list = new ArrayList();//存id的list
+						Map<String,String> idMap = new HashMap();//id为key,pk_kngcatalogs为value
+						if(list != null && list.size() >0) {
+							for(Map<String,String> m : listMap) {
+								list.add(m.get("id"));
+								idMap.put(m.get("id"), m.get("pk_cloud"));
+							}
+						}
+						List<CloudPsnVO> insertList = new ArrayList();
+						List<CloudPsnVO> updList = new ArrayList();
+						//判断是否已存在中间表
+						for(CloudPsnVO psnVO : psnVOs) {
+							if(!list.contains(psnVO.getId())) {
+								insertList.add(psnVO);
+							} else {
+								psnVO.setPk_cloud(idMap.get("id"));
+								updList.add(psnVO);
+							}
+						}
+						alertObj.setMsgTitle("");
+						if(insertList.size() > 0) {
+							String[] pks = dao.insertVOList(insertList);
+							alertObj.setReturnObj(pks);
+							alertObj.setMsgTitle("新增员工信息"+pks.length+"条数据!");
+						}
+						if(updList.size() > 0) {
+							dao.updateVOList(updList);
+							alertObj.setMsgTitle(alertObj.getMsgTitle()+"修改员工信息"+updList.size()+"条数据!");
+						}
+					}
+				}
+			} else {
+				throw new BusinessException(jsonObject.getString("message"));
+			}
+		} else {
+			throw new BusinessException("查询结果result为空");
+		}
+		alertObj.setReturnType(PreAlertReturnType.RETURNMESSAGE);
+		return alertObj;
+	}
+
+}

+ 135 - 0
hrhi/src/private/nc/impl/hr/train/CloudTrainningContentPlugin.java

@@ -0,0 +1,135 @@
+package nc.impl.hr.train;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.pub.pa.PreAlertObject;
+import nc.bs.pub.taskcenter.BgWorkingContext;
+import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
+import nc.bs.uap.lock.PKLock;
+import nc.jdbc.framework.processor.ColumnListProcessor;
+import nc.vo.hi.cloud.train.CloudTrainingContentVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFDate;
+/**
+ * 所有培训课程同步到NCC后台表
+ * @author chenzf
+ * @date 2022-4-21 08:38:14
+ *
+ */
+public class CloudTrainningContentPlugin implements IBackgroundWorkPlugin {
+
+	@Override
+	public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException {
+		PreAlertObject alertObj = new PreAlertObject();
+		if(!PKLock.getInstance().addDynamicLock("CloudTrainningContentPlugin")) {
+			alertObj.setReturnObj("任务执行中,请勿重复执行!");
+			return alertObj;
+	    }
+		TrainCloudSchoolImpl impl = new TrainCloudSchoolImpl();
+		Map<String,Object> bodyMap = impl.getBodyMap();
+		Map map = arg0.getKeyMap();
+		String updateDate = "";//"yyyy-MM-dd"
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date today = new Date();//获取今天的日期
+		Calendar c = Calendar.getInstance();
+		c.setTime(today);
+		if(map.get("nums") != null && !"".equals(map.get("nums"))) {
+			int nums = Integer.valueOf(arg0.getKeyMap().get("nums").toString());
+			if(nums == 0) {
+				updateDate = "1997-01-01";
+			} else {
+				c.add(Calendar.DAY_OF_MONTH, nums);
+				updateDate = sdf.format(c.getTime());
+			}
+		} else {
+			c.add(Calendar.DAY_OF_MONTH, 1);
+			updateDate = sdf.format(c.getTime());
+		}
+		BaseDAO dao = new BaseDAO();
+		int totalPages = 0;
+		String result = impl.gettrainingcontentlistpage(bodyMap, 1, 500);
+		if(StringUtils.isNotBlank(result)) {
+			JSONObject jsonObject = JSONObject.parseObject(result);
+			String code = jsonObject.getString("code");
+			String sql = "select trainingId from cloud_train_content where nvl(dr,0) = 0";
+			List<String> list = (List<String>) dao.executeQuery(sql, new ColumnListProcessor());
+			List<CloudTrainingContentVO> insertList = new ArrayList();
+			if("0".equals(code)) {
+				JSONObject paging = jsonObject.getJSONObject("paging");
+				if(paging != null) {
+					totalPages = paging.getInteger("totalPages");//总页数
+					int totalCount = paging.getInteger("totalCount");//总条数
+//					if(totalPages > 1) {
+//						count = Integer.valueOf(totalCount) / 500;
+//					}
+				}
+				JSONArray jsonArray = jsonObject.getJSONArray("data");//数据data
+				if(jsonArray != null) {
+					List<CloudTrainingContentVO> trainList = JSONArray.parseArray(jsonArray.toJSONString(), CloudTrainingContentVO.class);
+					if(trainList != null) {
+//						for(int i = 0;i < jsonArray.size(); i++) {
+//							JSONObject obj = jsonArray.getJSONObject(i);
+//							for(CloudTrainingContentVO train : trainList) {
+//								if(train.getTrainingId() != null && train.getTrainingId().equals(obj.get("trainingId"))) {
+//									train.setTrianStatus(obj.getString("status"));
+//								}
+//							}
+//						}
+						for(CloudTrainingContentVO psnVO : trainList) {
+							if(!list.contains(psnVO.getTrainingId())) {
+								insertList.add(psnVO);
+							}
+						}
+					}
+				}
+			}
+			if(totalPages > 1) {
+				for(int i = 2; i < totalPages;i++) {
+					result = impl.gettrainingcontentlistpage(bodyMap, i, 500);
+					JSONObject ijsonObject = JSONObject.parseObject(result);
+					String icode = jsonObject.getString("code");
+					if("0".equals(icode)) {
+						JSONArray jsonArray = ijsonObject.getJSONArray("data");//数据data
+						if(jsonArray != null) {
+							List<CloudTrainingContentVO> trainList = JSONArray.parseArray(jsonArray.toJSONString(), CloudTrainingContentVO.class);
+							if(trainList != null) {
+//								for(int j = 0;j < jsonArray.size(); j++) {
+//									JSONObject obj = jsonArray.getJSONObject(j);
+//									for(CloudTrainingContentVO train : trainList) {
+//										if(train.getTrainingId() != null && train.getTrainingId().equals(obj.get("trainingId"))) {
+//											train.setTrianStatus(obj.getString("status"));
+//										}
+//									}
+//								}
+								for(CloudTrainingContentVO psnVO : trainList) {
+									if(!list.contains(psnVO.getTrainingId())) {
+										insertList.add(psnVO);
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+			
+			//判断是否已存在中间表
+			if(insertList.size() > 0) {
+				String[] pks = dao.insertVOList(insertList);
+				alertObj.setReturnObj(pks);
+				alertObj.setMsgTitle("保存所有培训课程"+pks.length+"条数据");
+			}
+		}
+		return alertObj;
+	}
+}

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

@@ -0,0 +1,262 @@
+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;
+	}
+	
+}

+ 130 - 0
hrhi/src/private/nc/impl/hr/train/TrainSubImportPlugin.java

@@ -0,0 +1,130 @@
+package nc.impl.hr.train;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.pub.pa.PreAlertObject;
+import nc.bs.pub.pa.PreAlertReturnType;
+import nc.bs.pub.taskcenter.BgWorkingContext;
+import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
+import nc.bs.uap.lock.PKLock;
+import nc.jdbc.framework.processor.BeanListProcessor;
+import nc.jdbc.framework.processor.ColumnProcessor;
+import nc.vo.hi.psndoc.TrainVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFBoolean;
+
+/**
+ * 定时同步培训结果到人员培训信息子集中
+ * @author chenzf
+ * @date 2022-4-21 16:08:58
+ */
+public class TrainSubImportPlugin implements IBackgroundWorkPlugin {
+
+	@Override
+	public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException {
+		PreAlertObject alertObj = new PreAlertObject();
+		if(!PKLock.getInstance().addDynamicLock("TrainSubImportPlugin")) {
+			alertObj.setReturnObj("任务执行中,请勿重复执行!");
+			return alertObj;
+	    }
+		List<TrainVO> recordList = new ArrayList();
+		BaseDAO dao = new BaseDAO();
+		Map map = arg0.getKeyMap();
+		Date date = new Date();
+		int dyear = date.getYear();
+		int qyear = date.getYear();
+		if(map.get("nums") != null && !"".equals(map.get("nums"))) {
+			int nums = Integer.valueOf(arg0.getKeyMap().get("nums").toString());
+			if(nums == 0) {
+				qyear = 2020;
+			} else {
+				qyear = dyear - Integer.valueOf(map.get("nums").toString());
+			}
+		} else {
+			
+		}
+		String sql = 
+			"select bd_psndoc.pk_psndoc,\n" +
+			"       bd_psndoc.pk_group,\n" + 
+			"       hi_psnjob.pk_psnjob,\n" + 
+			"       hi_psnjob.pk_psnorg,\n" + 
+			"       hi_psnjob.pk_org,\n" + 
+			"       hi_psndoc_train.pk_psndoc_sub,\n" + 
+			"       hi_psndoc_train.lastflag,\n" + 
+			"       hi_psndoc_train.recordnum,\n" + 
+			"       '正气云学堂' || substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) || '年度学习情况' act_name,\n" + 
+			"       substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) || '-01-01' begindate,\n" + 
+			"       substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) || '-12-31' enddate,\n" + 
+			"       sum(nvl(actualStudyHours,0)) tra_time\n" + 
+			"        from cloud_onlineuserknowledge\n" + 
+			"       left join cloud_psndoc\n" + 
+			"            on cloud_psndoc.id = cloud_onlineuserknowledge.userid\n" + 
+			"       inner join bd_psndoc\n" + 
+			"            on bd_psndoc.mobile = cloud_psndoc.mobile or bd_psndoc.mobile = cloud_psndoc.userName\n" + 
+			"       inner join hi_psnorg\n" + 
+			"            on hi_psnorg.pk_psndoc = bd_psndoc.pk_psndoc and hi_psnorg.indocflag = 'Y' and hi_psnorg.lastflag = 'Y'\n" + 
+			"            and hi_psnorg.endflag = 'N'\n" + 
+			"       inner join hi_psnjob\n" + 
+			"            on hi_psnjob.pk_psndoc = bd_psndoc.pk_psndoc and hi_psnjob.lastflag = 'Y' and hi_psnjob.ismainjob = 'Y'\n" + 
+			"            and hi_psnorg.pk_psnorg = hi_psnjob.pk_psnorg and hi_psnjob.endflag = 'N'\n" + 
+			"       left join hi_psndoc_train\n" + 
+			"            on hi_psndoc_train.pk_psndoc = hi_psndoc_train.pk_psndoc\n" + 
+			"            and substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) || '-01-01' = hi_psndoc_train.begindate\n" + 
+			"            and substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) || '-12-31' = hi_psndoc_train.enddate\n" + 
+			"      where cloud_onlineuserknowledge.actualstudyfinishdate is not null and nvl(bd_psndoc.dr,0) = 0\n" + 
+			"      and substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) > '"+qyear+"' and substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) <= '"+dyear+"'\n" + 
+			"      group by bd_psndoc.pk_psndoc,\n" + 
+			"            bd_psndoc.pk_group,\n" + 
+			"            hi_psnjob.pk_psnjob,\n" + 
+			"            hi_psnjob.pk_psnorg,\n" + 
+			"            hi_psnjob.pk_org,\n" + 
+			"            hi_psndoc_train.pk_psndoc_sub,\n" + 
+			"            hi_psndoc_train.lastflag,\n" + 
+			"            hi_psndoc_train.recordnum,\n" + 
+			"            '正气云学堂' || substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) || '年度学习情况',\n" + 
+			"            substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) || '-01-01',\n" + 
+			"            substr(cloud_onlineuserknowledge.actualStudyFinishDate,0,4) || '-12-31'";
+
+		List<TrainVO> list = (List<TrainVO>) dao.executeQuery(sql, new BeanListProcessor(TrainVO.class));
+		
+		//培训类别
+		String defdocSql = "select pk_defdoc from bd_defdoc where code = '99' and pk_defdoclist = (select pk_defdoclist from bd_defdoclist where code = 'HR021_0xx')";
+		String pk_defdoc = (String) dao.executeQuery(defdocSql, new ColumnProcessor());
+		
+		List<TrainVO> insertList = new ArrayList();//新增数据list
+		List<TrainVO> updList = new ArrayList();//更新数据list
+
+		if(list != null && list.size() > 0) {
+			for(TrainVO vo : list) {
+				vo.setTra_type(pk_defdoc);
+				if(StringUtils.isBlank(vo.getPk_psndoc_sub())) {
+					insertList.add(vo);
+					vo.setRecordnum(0);
+					vo.setLastflag(UFBoolean.TRUE);
+				} else {
+					updList.add(vo);
+				}
+			}
+		}
+		alertObj.setMsgTitle("");
+		if(insertList.size() > 0) {
+			String[] pks = dao.insertVOList(insertList);
+			alertObj.setReturnObj(pks);
+			alertObj.setMsgTitle("新增培训记录数据"+pks.length+"条数据");
+		}
+		if(updList.size() > 0) {
+			dao.updateVOList(updList);
+			alertObj.setMsgTitle(alertObj.getMsgTitle() + "更新培训记录数据"+updList.size()+"条数据");
+		}
+		
+		alertObj.setReturnType(PreAlertReturnType.RETURNMESSAGE);
+		return alertObj;
+	}
+
+}

+ 0 - 734
hrhi/src/private/nc/impl/hrcm/contopinion/ContopinionManageServiceImpl.java

@@ -1,734 +0,0 @@
-package nc.impl.hrcm.contopinion;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import nc.bs.dao.BaseDAO;
-import nc.bs.framework.common.NCLocator;
-import nc.bs.logging.Logger;
-import nc.bs.uif2.validation.ValidationException;
-import nc.bs.uif2.validation.ValidationFailure;
-import nc.hr.frame.persistence.HrBaseServiceImpl;
-import nc.hr.frame.persistence.SimpleDocServiceTemplate;
-import nc.hr.utils.HRCMTermUnitUtils;
-import nc.hr.utils.InSQLCreator;
-import nc.hr.utils.MultiLangHelper;
-import nc.hr.utils.PubEnv;
-import nc.hr.utils.ResHelper;
-import nc.itf.hi.IPsndocQryService;
-import nc.itf.hr.frame.IPersistenceRetrieve;
-import nc.itf.hr.hrss.IURLGenerator;
-import nc.itf.hr.managescope.ManagescopeFacade;
-import nc.itf.hr.message.IHRMessageSend;
-import nc.itf.hrcm.IContopinionManageService;
-import nc.itf.hrcm.IContopinionQueryService;
-import nc.itf.uap.rbac.IUserManageQuery;
-import nc.pub.tools.HRCMBusilogUtil;
-import nc.pub.tools.HRCMCommonValue;
-import nc.pubitf.rbac.IUserPubService;
-import nc.vo.bd.meta.BatchOperateVO;
-import nc.vo.hi.psndoc.PsnJobVO;
-import nc.vo.hi.psndoc.PsndocAggVO;
-import nc.vo.hi.psndoc.PsndocVO;
-import nc.vo.hr.managescope.ManagescopeBusiregionEnum;
-import nc.vo.hr.message.HRBusiMessageVO;
-import nc.vo.hrcm.contopinion.ContopinionVO;
-import nc.vo.hrcm.share.PsnSelListVO;
-import nc.vo.ml.LanguageVO;
-import nc.vo.ml.MultiLangContext;
-import nc.vo.om.hrdept.HRDeptVO;
-import nc.vo.pub.BusinessException;
-import nc.vo.pub.VOStatus;
-import nc.vo.pub.lang.UFBoolean;
-import nc.vo.pub.lang.UFLiteralDate;
-import nc.vo.sm.UserVO;
-import nc.vo.sm.enumfactory.UserIdentityTypeEnumFactory;
-import nc.vo.uif2.LoginContext;
-import nc.vo.util.BDVersionValidationUtil;
-import nccloud.commons.lang.ArrayUtils;
-import nccloud.commons.lang.StringUtils;
-
-/**
- * 批量维护 Service实现
- * 
- * @author fengwei
- */
-public class ContopinionManageServiceImpl extends HrBaseServiceImpl<ContopinionVO> implements IContopinionManageService
-{
-
-	private BaseDAO	baseDAO;
-
-	private BaseDAO getBaseDAO()
-	{
-		if (null == baseDAO)
-		{
-			baseDAO = new BaseDAO();
-		}
-		return baseDAO;
-	}
-
-	private final String				DOC_NAME	= "hrcm_contopinion";
-
-	private SimpleDocServiceTemplate	serviceTemplate;
-
-	private SimpleDocServiceTemplate getServiceTemplate()
-	{
-		if (null == serviceTemplate)
-		{
-			serviceTemplate = new SimpleDocServiceTemplate(DOC_NAME);
-		}
-		return serviceTemplate;
-	}
-
-	public ContopinionManageServiceImpl()
-	{
-		super("60e4471d-f208-4407-bdf7-682247ed0068");
-	}
-
-	@Override
-	public ContopinionVO[] batchSave(ContopinionVO[] vos) throws BusinessException {
-		if(vos == null || vos.length == 0){
-			return null;
-		}
-		//待修改的数据
-		List<ContopinionVO> updList = new ArrayList<ContopinionVO>();
-		//待删除的数据
-		List<ContopinionVO> delList = new ArrayList<ContopinionVO>();
-		for(ContopinionVO vo : vos){
-			if(vo.getStatus() == VOStatus.DELETED){
-				delList.add(vo);
-			}else{
-				updList.add(vo);
-			}
-		}
-		if(delList != null && !delList.isEmpty()){
-			deleteValidate(delList);
-			delete(delList.toArray(new ContopinionVO[0]));
-		}
-		if(updList != null && !updList.isEmpty()){
-			BatchOperateVO batchVO = new BatchOperateVO();
-			batchVO.setUpdObjs(updList.toArray());
-			BatchOperateVO returnObj = batchSave(batchVO, ContopinionVO.class);
-			return (ContopinionVO[]) returnObj.getUpdObjs();
-		}
-		return null;
-	}
-	
-	/**
-	 * 合同删除校验
-	 * @author tianxfc
-	 * @param vos
-	 * @throws ValidationException
-	 * @exception 异常描述
-	 */
-	public void deleteValidate(List<ContopinionVO> delList) throws ValidationException{
-		
-		List<ValidationFailure> failures = new ArrayList<ValidationFailure>();
-		for(ContopinionVO vo : delList){
-			int conttype = vo.getConttype();  //处理结果: 0=未征询,1=未反馈,2=反馈中,3=已反馈,4=已续签,5=已终止
-			if (HRCMCommonValue.STATE_NOCONSULT != conttype && HRCMCommonValue.STATE_NOFEEDBACK != conttype){
-				failures.add(new ValidationFailure(ResHelper.getString("6011opin", "06011opin0024")/* @res"只能删除状态为“未征询”和“未反馈”的征询记录!" */));
-				break;
-			}
-		}
-		if (!failures.isEmpty()){
-			throw new ValidationException(failures);
-		}
-	}
-
-	@Override
-	public HashMap<String, Object> sendNoticeToDeptManager(Map<String, List<String>> psndeptMap, Map<String, List<ContopinionVO>> contopMap,
-			String pk_group, String pk_org, ContopinionVO[] vos,ArrayList<ContopinionVO> inFeedbackList) throws BusinessException {
-		if(!ArrayUtils.isEmpty(vos)){
-			//时间戳校验
-			BDVersionValidationUtil.validateSuperVO(vos);
-		}
-		int icntsucc = 0;
-		IHRMessageSend messageSendService = NCLocator.getInstance().lookup(IHRMessageSend.class);
-		/**给部门负责人发送消息*/
-		if(!ArrayUtils.isEmpty(vos)){
-			Set<String> keySet = psndeptMap.keySet();
-			Iterator<String> it = keySet.iterator();
-			while (it.hasNext()) {
-				String pk_dept = it.next();// 部门主键
-				List<String> pk_psndocs = psndeptMap.get(pk_dept);// 部门内要续签的人员
-				List<ContopinionVO> opinionVOList = contopMap.get(pk_dept);// 部门内要续签人员的征询意见VO。
-				
-				// 续签人员列表
-				String employeeList = "";
-				InSQLCreator creator = new InSQLCreator();
-				
-				String inSQL = creator.getInSQL(pk_psndocs.toArray(new String[pk_psndocs.size()]));
-				ContopinionDAO dao = new ContopinionDAO();
-				List<String> nameList = dao.getPsnnameByPkjob(inSQL);
-				for (String name : nameList) {
-					employeeList += name + ", ";
-				}
-				
-				if (!StringUtils.isBlank(employeeList)) {
-					employeeList = employeeList.substring(0, employeeList.length() - 2);
-				}
-				
-				// 得到URL
-				//String url = getURL(pk_dept, opinionVOList);
-//				String url = SysinitAccessor.getInstance().getParaString(IOrgConst.GLOBEORG, "HR0002");
-//				if (StringUtils.isBlank(url)) {
-//					url = "";
-//				}
-				//url += "/nccloud/resources/hrcm/contractmgt/contopinion/main/index.html?appcode=60110313";
-				//url = "<a target='balck' href ='/nccloud/resources/hrcm/contractmgt/contopinion/main/index.html?appcode=60110313'>/nccloud/resources/hrcm/contractmgt/contopinion/main/index.html</a>";
-				String url = "请前往移动端【续签意见征询-经理】节点处理";
-				// 组织消息VO
-				HRBusiMessageVO messageInfoVO = new HRBusiMessageVO();
-				messageInfoVO.setBillVO(opinionVOList.get(0));// 关联元数据实体VO
-				messageInfoVO.setMsgrescode(HRCMCommonValue.DEPT_MSGTEMP_CODE);// 消息源编码
-				Hashtable<String, Object> transferValues = new Hashtable<String, Object>();
-				transferValues.put(HRCMCommonValue.EMPLOYEELIST, employeeList);
-				transferValues.put(HRCMCommonValue.URL, url);
-				messageInfoVO.setBusiVarValues(transferValues);// 业务函数值
-				messageInfoVO.setPkorgs(new String[] { opinionVOList.get(0).getPk_org() });
-				
-				setReciverInfo(messageInfoVO, pk_dept);
-				//征询意见-记录日志
-				HRCMBusilogUtil.writeContopinion(vos,"Contopin");
-				// 发送消息
-				//messageSendService.sendBuziMessage_RequiresNew(messageInfoVO, new String[] { getUserContentLangCode(PubEnv.getPk_user()) });
-				messageSendService.sendBuziMessage_RequiresNew(messageInfoVO);
-				icntsucc++;
-			}
-			
-			for(ContopinionVO vo : vos){
-				vo.setConttype(HRCMCommonValue.STATE_NOFEEDBACK);// 修改状态为未反馈
-				vo.setOpdate(PubEnv.getServerTime());// 征询时间为当前时间
-				vo.setIssendsuccess(UFBoolean.TRUE);
-			}
-			// 更新修改状态
-			vos = NCLocator.getInstance().lookup(IContopinionManageService.class).updateArray(vos);
-		}
-
-		/**如果需要发送催办消息的vo list 不为空  员工消息暂时不能发送*/
-		if(!inFeedbackList.isEmpty()){
-			int succ = sendMessageToEmp(inFeedbackList, pk_org, messageSendService);
-			icntsucc += succ;
-		}
-		HashMap<String, Object> map = new HashMap<String, Object>();
-		map.put("cnt", icntsucc);
-		return map;
-	}
-	
-	private String getUserContentLangCode(String userPk) throws BusinessException {
-		UserVO[] users = NCLocator.getInstance().lookup(IUserPubService.class).getUsersByPKs(new String[] { userPk });
-		if (ArrayUtils.isEmpty(users))
-			return null;
-		UserVO user = users[0];
-		String pk_langcode = user.getContentlang();
-		LanguageVO[] all = getAllEnabledLangVO();
-		if (ArrayUtils.isEmpty(all))
-			return null;
-		for (LanguageVO languageVO : all) {
-			if (languageVO.getPk_multilang().equals(pk_langcode))
-				return languageVO.getLangcode();
-		}
-		return null;
-
-	}
-
-	private static LanguageVO[] getAllEnabledLangVO() {
-		LanguageVO[] langvos = MultiLangContext.getInstance().getEnableLangVOs();
-		if (ArrayUtils.isEmpty(langvos))
-			return null;
-		return langvos;
-	}
-	
-	/**
-	 * 给员工发送征询催办消息
-	 * 2019-09-02 下午02:07:30
-	 * tianxfc
-	 * @param inFeedbackList
-	 * @param pk_org
-	 * @param messageSendService
-	 * @return
-	 * @throws BusinessException
-	 */
-	@SuppressWarnings("rawtypes")
-	private int sendMessageToEmp(ArrayList<ContopinionVO> inFeedbackList, String pk_org, IHRMessageSend messageSendService) throws BusinessException{
-		/**征询意见的工作记录主键*/
-		String[] psnjobPks = new String[inFeedbackList.size()];
-		for(int i=0; i<psnjobPks.length; i++){
-			psnjobPks[i] = inFeedbackList.get(i).getPk_psnjob();
-		}
-		/**查询每个工作记录主键所对应的aggVO*/
-		IPsndocQryService is = NCLocator.getInstance().lookup(IPsndocQryService.class);
-		PsndocAggVO[] psnaggVos = is.queryPsndocVOByPks(psnjobPks);
-		/**工作记录主键为KEY,aggVO为VALUE*/
-		HashMap<String,PsndocAggVO> psnMap = new HashMap<String, PsndocAggVO>();
-		/**K:pk_psndoc, V:pk_psnjob*/
-		HashMap<String,String> psndocPkMap = new HashMap<String, String>();
-		for (PsndocAggVO vo : psnaggVos) {// 缓存人员信息
-			String psndocPk = vo.getParentVO().getPk_psndoc();
-			String psnjobPk = vo.getParentVO().getPsnJobVO().getPk_psnjob();
-			psnMap.put(psnjobPk, vo);
-			psndocPkMap.put(psndocPk, psnjobPk);
-		}
-		/**人员主键*/
-		String[] psndocPks = new String[psnaggVos.length];
-		for (int i = 0; i < psnaggVos.length; i++) {
-			psndocPks[i] = psnaggVos[i].getParentVO().getPk_psndoc();
-		}
-		
-		InSQLCreator isc1 = new InSQLCreator();
-		String docInSql = isc1.getInSQL(psndocPks);
-		String userCondition = " pk_base_doc in ("+docInSql+") and base_doc_type = " + UserIdentityTypeEnumFactory.TYPE_PERSON + " ";
-		/**自助用户*/
-		UserVO[] uservos = (UserVO[]) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByClause(null, UserVO.class, userCondition);
-		/**K:工作记录主键,V:UserVO的Cuserid*/
-		HashMap<String,String> userMap = new HashMap<String, String>();
-		if(ArrayUtils.isEmpty(uservos)){
-			throw new BusinessException(ResHelper.getString("6011opin", "06011opin0064")/*"当前员工未设置自助用户不能发送催办消息"*/);
-		}
-		for(int i=0; i<uservos.length; i++){
-			String pk_psndoc = uservos[i].getPk_base_doc();
-			String psnjobPk = psndocPkMap.get(pk_psndoc);
-			userMap.put(psnjobPk, uservos[i].getCuserid());
-		}
-		int icntsucc = 0;
-		//组装消息VO
-		for (Iterator iterator = inFeedbackList.iterator(); iterator.hasNext();) {
-			ContopinionVO contopinionVO = (ContopinionVO) iterator.next();
-			HRBusiMessageVO messageInfoVO = new HRBusiMessageVO();
-			messageInfoVO.setMsgrescode(HRCMCommonValue.EMPLOYEE_MSGTEMP_CODE);// 消息源编码
-			messageInfoVO.setPkorgs(new String[] { pk_org });
-			setReciverInfoForEmp(messageInfoVO, contopinionVO, psnMap, userMap);
-			// 发送消息
-			messageSendService.sendBuziMessage_RequiresNew(messageInfoVO);
-			icntsucc++;
-		}
-		return icntsucc;
-	}
-	
-	private void setReciverInfoForEmp(HRBusiMessageVO messageInfoVO,ContopinionVO contopinionVO,HashMap<String,PsndocAggVO> psnMap,HashMap<String,String> userMap) throws BusinessException{
-		String psnjobPk = contopinionVO.getPk_psnjob();
-		PsndocVO psndocVO = psnMap.get(psnjobPk).getParentVO();
-		String[] emails = { psndocVO.getEmail() };
-		String[] mobiles = { psndocVO.getMobile() };
-		String userPk = userMap.get(psnjobPk);
-		String[] userpks = { userPk };
-		messageInfoVO.setReceiverEmails(emails);
-		messageInfoVO.setReceiverMobiles(mobiles);
-		messageInfoVO.setReceiverPkUsers(userpks);
-		messageInfoVO.setBillVO(contopinionVO);// 关联元数据实体VO
-		
-		Hashtable<String, Object> transferValues = new Hashtable<String, Object>();
-		String url = "请前往移动端【续签意见征询-员工】节点处理";
-		transferValues.put(HRCMCommonValue.URL, url);
-		messageInfoVO.setBusiVarValues(transferValues);// 业务函数值
-		
-//		//添加URL
-//		SSOInfo ssinfo = new SSOInfo();
-//		ssinfo.setUserPK(userPk);
-//		UFDateTime ut = new UFDateTime();
-//		ssinfo.setTtl(ut.getDateTimeAfter(30));
-//		ssinfo.setLocation("/portal/app/MyContopinApp?nodecode=E20200704&pk_opinion=" + contopinionVO.getPk_opinion());
-//		ssinfo.setWindowType(SSOInfo.WINDOW_TYPE_CURRENT);
-//		IURLGenerator IurlDirect = OpinionHrssUtils.getUrlDirect();
-//		if(IurlDirect!=null){			
-//			Hashtable<String, Object> transferValues = new Hashtable<String, Object>();
-//			transferValues.put(HRCMCommonValue.URL, IurlDirect.buildURLString(ssinfo));
-//			messageInfoVO.setBusiVarValues(transferValues);// 业务函数值
-//		}
-	}
-	
-	private IURLGenerator getUrlDirect() {
-		try {
-//			return ServiceLocator.lookup(IURLGenerator.class);
-			return null;
-		} catch (Throwable e) {
-			Logger.error(e.getMessage(), e);
-		}
-		return null;
-	}
-	
-	private void setReciverInfo(HRBusiMessageVO messageInfoVO, String pk_dept) throws BusinessException{
-		PsndocVO psndocVO = this.getDeptManager(pk_dept);
-		String[] emails = { psndocVO.getEmail() };
-		String[] mobiles = { psndocVO.getMobile() };
-		messageInfoVO.setReceiverEmails(emails);
-		messageInfoVO.setReceiverMobiles(mobiles);
-		UserVO uservo = getUserManageQuery(psndocVO.getPk_psndoc());
-		if(uservo != null){
-			String[] userpks = { uservo.getCuserid() };
-			messageInfoVO.setReceiverPkUsers(userpks);
-		}
-	}
-
-	private UserVO getUserManageQuery(String pk_psndoc) throws BusinessException{
-		return NCLocator.getInstance().lookup(IUserManageQuery.class).queryUserVOByPsnDocID(pk_psndoc);
-	}
-
-	private PsndocVO getDeptManager(String pk_dept) throws BusinessException{
-		HRDeptVO deptVO = (HRDeptVO) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByPk(null, HRDeptVO.class, pk_dept);
-		String pk_managerPk = deptVO.getPrincipal();
-		PsndocVO psndocVO = (PsndocVO) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByPk(null, PsndocVO.class, pk_managerPk);
-		return psndocVO;
-	}
-
-//	private String getURL(String pk_dept, List<ContopinionVO> opinionVOList) throws BusinessException
-//	{
-//		IContopinionQueryService queryService = NCLocator.getInstance().lookup(IContopinionQueryService.class);
-//		HRDeptVO deptVO = queryService.queryDeptManagerByPK(pk_dept);// 得到部门负责人VO
-//		// 部门负责人主键
-//		String principal = deptVO.getPrincipal();
-//		if (principal == null)
-//		{
-//			return null;
-//		}
-//
-//		// 续签人员主键
-//		String pk_opinionList = "";
-//		for (ContopinionVO opinionVO : opinionVOList)
-//		{
-//			pk_opinionList += opinionVO.getPk_opinion() + ", ";
-//		}
-//		if (!StringUtils.isBlank(pk_opinionList))
-//		{
-//			pk_opinionList = pk_opinionList.substring(0, pk_opinionList.length() - 2);
-//		}
-//
-//		// 得到部门负责人输信息
-//		GeneralVO vo = queryService.getDeptManagerInfo(principal);
-//
-//		// 得到部门负责人对应的用户
-//		String pk_psndoc = (String) vo.getAttributeValue("pk_psndoc");
-//		UserVO user = NCLocator.getInstance().lookup(IUserManageQuery.class).queryUserVOByPsnDocID(pk_psndoc);
-//
-//		SSOInfo info = new SSOInfo();
-//		info.setFuncode("E20400704");
-//		if(user==null){	
-//			throw new BusinessException(ResHelper.getString("6011opin", "06011opin0063")/*"当前人员的部门负责人未设置自助用户,不能发送通知"*/);
-//		}
-//		info.setUserPK(user.getCuserid());
-//
-//		UFDateTime ut = new UFDateTime();
-//		info.setTtl(ut.getDateTimeAfter(30));
-//		info.addParam("pk_opinion", pk_opinionList);
-//		//String title = nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("6011opin", "06011opin0052")/* @res "员工续签意见征询" */;
-//		//String url = NCLocator.getInstance().lookup(IURLGenerator.class).buildHTML(info, title);
-//		String url = NCLocator.getInstance().lookup(IURLGenerator.class).buildURLString(info);
-//
-//		return url;
-//	}
-
-	@Override
-	public ContopinionVO[] updateArray(ContopinionVO[] vos) throws BusinessException
-	{
-		getBaseDAO().updateVOArray(vos);
-		/*
-		 * @hujr 添加 记录日志文件
-		 * 2015年10月9日14:45:17
-		 */
-		//记录日志
-        HRCMBusilogUtil.writeContopinion(vos,"Contopin");
-		return (ContopinionVO[]) NCLocator.getInstance().lookup(IPersistenceRetrieve.class)
-				.retrieveByClause(null, ContopinionVO.class, " pk_opinion in (" + new InSQLCreator().getInSQL(vos, ContopinionVO.PK_OPINION) + ")");
-	}
-
-	@Override
-	public void delete(ContopinionVO[] vos) throws BusinessException
-	{
-		//记录日志
-		HRCMBusilogUtil.writeContopinion(vos,"delete");
-		
-		getBaseDAO().deleteVOArray(vos);
-	}
-
-	/**
-	 * 根据部门主键,判断部门是否有负责人
-	 * 
-	 * @author fengwei on 2011-1-25
-	 * @param pk_dept
-	 * @return
-	 * @exception 异常描述
-	 * @see 需要参见的其它内容
-	 * @since 从类的V60版本,此方法被添加进来。(可选)
-	 */
-	public boolean hasDeptManager(String pk_dept)
-	{
-		if (pk_dept != null)
-		{
-			try
-			{
-				HRDeptVO deptVO = NCLocator.getInstance().lookup(IContopinionQueryService.class).queryDeptManagerByPK(pk_dept);
-				if (null == deptVO.getPrincipal())
-				{
-					return false;
-				}
-			}
-			catch (BusinessException e)
-			{
-				Logger.error(e.getMessage());
-			}
-		}
-		return true;
-	}
-
-	private Map<String, String> getPkpsnjob(PsnSelListVO[] psnSelListVOs) throws BusinessException
-	{
-		Map<String, String> pkjobMap = new HashMap<String, String>();
-		List<String> psndocList = new ArrayList<String>();
-		for (int i = 0; i < psnSelListVOs.length; i++)
-		{
-			psndocList.add(psnSelListVOs[i].getPk_psndoc());
-		}
-
-		InSQLCreator isc = new InSQLCreator();
-
-		String insql = isc.getInSQL(psndocList.toArray(new String[0]));
-		String condition = " pk_psndoc in (" + insql + ") and lastflag = 'Y' and ismainjob = 'Y' and endflag = 'N'";
-		PsnJobVO[] psnjobVOs = getServiceTemplate().queryByCondition(PsnJobVO.class, condition);
-		if (!ArrayUtils.isEmpty(psnjobVOs))
-		{
-			for (int i = 0; i < psnjobVOs.length; i++)
-			{
-				String pk_psndoc = psnjobVOs[i].getPk_psndoc();
-				pkjobMap.put(pk_psndoc, psnjobVOs[i].getPk_psnjob());
-				psndocList.remove(pk_psndoc);
-			}
-		}
-
-		if (!psndocList.isEmpty())
-		{
-			String psndocSql = isc.getInSQL(psndocList.toArray(new String[0]));
-			String cond = " pk_psndoc in (" + psndocSql + ")";
-			//PsndocVO[] psndocVOs = getServiceTemplate().queryByCondition(PsndocVO.class, cond);
-			PsndocVO[] psndocVOs = (PsndocVO[]) NCLocator.getInstance().lookup(IPersistenceRetrieve.class).retrieveByClause(null, PsndocVO.class, cond);
-			StringBuffer nameBuf = new StringBuffer();
-			for (int i = 0; i < psndocVOs.length; i++)
-			{
-				PsndocVO psndocVO = psndocVOs[i];
-				nameBuf.append(",").append(MultiLangHelper.getName(psndocVO));
-			}
-			String psnNames = nameBuf.toString().substring(1);
-			if (!StringUtils.isEmpty(psnNames))
-			{
-				throw new BusinessException(ResHelper.getString("6011opin", "06011opin0053", psnNames)/* @res "[{0}]是已离职人员,不能进续签意见征询!" */);
-			}
-		}
-
-		return pkjobMap;
-	}
-
-	/**
-	 * 得到业务委托人员过滤sql
-	 * 
-	 * @return
-	 * @throws BusinessException
-	 * @throws BusinessException
-	 */
-	@SuppressWarnings("unused")
-	private String getYwwt(String pk_org) throws BusinessException
-	{
-		String ywwtsql;
-		// 当前组织人员
-		HashMap<String, String> orgPkToYwwtSqlMap = new HashMap<String, String>();
-		ywwtsql = orgPkToYwwtSqlMap.get(pk_org);
-		if (ywwtsql == null)
-		{
-			// ywwtsql =
-			// ManagescopeFacade.queryPsnjobPksSQLByHrorgAndBusiregion(
-			// pk_org, ManagescopeBusiregionEnum.psndoc);
-			ywwtsql = ManagescopeFacade.queryPkOrgsSQLByHrorgAndBusiregion(pk_org, ManagescopeBusiregionEnum.psndoc, false);
-			// orgPkToYwwtSqlMap.put(pk_org, ywwtsql);
-			orgPkToYwwtSqlMap.put(pk_org, ywwtsql);
-		}
-		return ywwtsql;
-	}
-
-	@Override
-	public ContopinionVO[] insertContOpVO(PsnSelListVO[] psnVOs, String remenddate, String remmonth, String pk_psndoc_sub, String termtype,
-			Integer termUnit, LoginContext context) throws BusinessException
-	{
-		String[] remenddates = null;
-		String[] remmonths = null;
-		if (remenddate != null)
-		{
-			remenddates = remenddate.split("_");
-			remmonths = remmonth.split("_");
-		}
-
-		String[] pk_psndoc_subs = null;
-		if (pk_psndoc_sub != null)
-		{
-			pk_psndoc_subs = pk_psndoc_sub.split("_");
-		}
-
-		Map<String, String> map = getPkpsnjob(psnVOs);
-		ContopinionVO[] contopinionVOs = new ContopinionVO[pk_psndoc_subs.length];
-		for (int i = 0; i < pk_psndoc_subs.length; i++)
-		{
-			for (int j = 0; j < psnVOs.length; j++)
-			{
-				if (!psnVOs[j].getPk_psndoc_sub().equals(pk_psndoc_subs[i]))
-				{
-					continue;
-				}
-				ContopinionVO vo = new ContopinionVO();
-				vo.setPk_psndoc_sub(pk_psndoc_subs[i]);
-				vo.setTermtype(termtype);
-				vo.setContopinion_unit(termUnit);
-				if (HRCMTermUnitUtils.TERM_TYPE_NONFIXED.equals(termtype) || HRCMTermUnitUtils.TERM_TYPE_TASK.equals(termtype))
-				{
-					vo.setSedenddate(null);
-					vo.setItermmonth(null);
-				}
-				else
-				{
-					vo.setSedenddate(remenddates[i] == null ? null : new UFLiteralDate(remenddates[i]));
-					vo.setItermmonth(remmonths[i].equals("null") ? null : new Integer(remmonths[i]));
-
-				}
-				vo.setConttype(HRCMCommonValue.STATE_NOCONSULT);
-				vo.setDeptopinion(null);
-				vo.setDeptdirection(null);
-				vo.setHropinion(null);
-				vo.setPk_psnjob(map.get(psnVOs[i].getPk_psndoc()));
-				vo.setPk_org(context.getPk_org());
-				vo.setPk_group(context.getPk_group());
-				vo.setOpdate(PubEnv.getServerTime());
-				vo.setCreator(context.getPk_loginUser());
-				vo.setCreationtime(PubEnv.getServerTime());
-				contopinionVOs[i] = vo;
-			}
-		}
-		String[] pks = new ContopinionDAO().insertContopVOs(contopinionVOs);
-		/**modify start:记录合同续签意见征询增加业务日志 yunana 2013-06-08*/	
-		HRCMBusilogUtil.writeContopinionAdd(contopinionVOs);
-		/**modify end:yunana 2013-06-08*/
-		InSQLCreator isc = new InSQLCreator();
-		return (ContopinionVO[]) NCLocator.getInstance().lookup(IPersistenceRetrieve.class)
-				.retrieveByClause(null, ContopinionVO.class, " pk_opinion in (" + isc.getInSQL(pks) + ")");
-	}
-
-	
-
-	
-	@Override
-	public HashMap<String, Object> getPsnjobDeptMap(ContopinionVO[] contopinionVOs) throws BusinessException
-	{
-		PsnJobVO[] job = (PsnJobVO[]) NCLocator
-				.getInstance()
-				.lookup(IPersistenceRetrieve.class)
-				.retrieveByClause(null, PsnJobVO.class,
-						" pk_psnjob in (" + new InSQLCreator().getInSQL(contopinionVOs, ContopinionVO.PK_PSNJOB) + ")");
-		HashMap<String, String> map = new HashMap<String, String>();
-		for (int i = 0; job != null && i < job.length; i++)
-		{
-			map.put(job[i].getPk_psnjob(), job[i].getPk_dept());
-		}
-
-		for (int i = 0; i < contopinionVOs.length; i++)
-		{
-			String pk_dept = map.get(contopinionVOs[i].getPk_psnjob());
-			if (StringUtils.isBlank(pk_dept))
-			{
-				continue;
-			}
-			contopinionVOs[i].setPk_dept(pk_dept);
-		}
-
-		ArrayList<String> temp = new ArrayList<String>();// 部门id集合
-		for (ContopinionVO vo : contopinionVOs)
-		{
-			String pk_dept = vo.getPk_dept();
-			if (!temp.contains(pk_dept))
-			{
-				temp.add(pk_dept);
-			}
-		}
-		
-		/**拥有部门负责人的部门的主键*/
-		String[] deptPKs = getDeptHasPrincipal(temp.toArray(new String[0]));
-		HashMap<String, Object> result = new HashMap<String, Object>();
-		// 如果不存在部门没有负责人的情况,则提示用户是否继续进行操作
-		String msg = ResHelper.getString("6011opin", "06011opin0009")/* @res "即将向您所选人员的部门负责人发送通知,征询部门续签意见,确认发送吗?" */;
-		// 如果所有人员的所属部门都没有部门负责人,直接返回null
-		if (deptPKs == null || deptPKs.length == 0)
-		{
-			/* @res "您选中的人员的所属部门没有维护部门负责人,请维护部门负责人后再发送征询通知!" */
-			msg = ResHelper.getString("6011opin", "06011opin0019");
-			//throw new BusinessException(ResHelper.getString("6011opin", "06011opin0019"));
-			result.put("vos", null);
-			result.put("pks", null);
-			result.put("msg", msg);
-			return result;
-		}
-		
-		ArrayList<String> deptPkList = new ArrayList<String>();
-		for(int i=0; i<deptPKs.length;i++){
-			deptPkList.add(deptPKs[i]);
-		}
-		/**所在部门有负责人的征询意见*/
-		ArrayList<ContopinionVO> opinVOhasPrincipalList = new ArrayList<ContopinionVO>();
-		for(int i=0; i<contopinionVOs.length;i++){
-			if(!StringUtils.isEmpty(contopinionVOs[i].getPk_dept()) && deptPkList.contains(contopinionVOs[i].getPk_dept())){
-				opinVOhasPrincipalList.add(contopinionVOs[i]);
-			}
-		}
-
-		if (deptPKs.length < temp.size())
-		{
-			msg = ResHelper.getString("6011opin", "06011opin0020")/* @res"您选中的部分人员的所属部门没有维护部门负责人,系统将给符合条件人员的部门负责人发送征询通知!" */;
-		}
-
-		result.put("vos", opinVOhasPrincipalList.toArray(new ContopinionVO[0]));
-		result.put("pks", deptPKs);
-		result.put("msg", msg);
-
-		return result;
-	}
-
-	@Override
-	public String[] getDeptHasPrincipal(String[] deptPKs) throws BusinessException
-	{
-		if (deptPKs == null || deptPKs.length == 0)
-		{
-			return null;
-		}
-		HRDeptVO[] dept = (HRDeptVO[]) NCLocator.getInstance().lookup(IPersistenceRetrieve.class)
-				.retrieveByClause(null, HRDeptVO.class, " pk_dept in (" + new InSQLCreator().getInSQL(deptPKs) + ") and principal <> '~' ");
-
-		if (dept == null || dept.length == 0)
-		{
-			return null;
-		}
-		String[] result = new String[dept.length];
-		for (int i = 0; i < dept.length; i++)
-		{
-			result[i] = dept[i].getPk_dept();
-		}
-		return result;
-	}
-
-	@Override
-	public HashMap<String, Object> sendNoticeToPsn(Map<String, List<String>> psndeptMap,
-			Map<String, List<ContopinionVO>> contopMap, String pk_group, String pk_org, ContopinionVO[] vos,
-			ArrayList<ContopinionVO> inFeedbackList) throws BusinessException {
-		if(!ArrayUtils.isEmpty(vos)){
-			//时间戳校验
-			BDVersionValidationUtil.validateSuperVO(vos);
-		}
-		int icntsucc = 0;
-		IHRMessageSend messageSendService = NCLocator.getInstance().lookup(IHRMessageSend.class);
-		/** 员工消息发送*/
-		int succ = sendMessageToEmp(inFeedbackList, pk_org, messageSendService);
-		icntsucc += succ;
-		HashMap<String, Object> map = new HashMap<String, Object>();
-		map.put("cnt", icntsucc);
-		return map;
-	}
-
-}

+ 16 - 0
hrhi/src/public/nc/itf/hi/IPsndocTrainService.java

@@ -0,0 +1,16 @@
+package nc.itf.hi;
+
+import nc.vo.hi.psndoc.TrainVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.uif2.LoginContext;
+
+public interface IPsndocTrainService {
+	/**
+	 * Åàѵ¼Ç¼µ¼Èë
+	 * @param paramArrayOfTrainVO
+	 * @param paramLoginContext
+	 * @return
+	 * @throws BusinessException
+	 */
+	TrainVO[] importData2DB(TrainVO[] paramArrayOfTrainVO, LoginContext paramLoginContext) throws BusinessException;
+}

+ 0 - 89
hrhi/src/public/nc/itf/hrcm/IContopinionManageService.java

@@ -1,89 +0,0 @@
-package nc.itf.hrcm;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import nc.vo.hrcm.contopinion.ContopinionVO;
-import nc.vo.hrcm.share.PsnSelListVO;
-import nc.vo.pub.BusinessException;
-import nc.vo.uif2.LoginContext;
-
-/**
- * 合同续签意见征询批量维护 Service接口
- * @author fengwei
- */
-public interface IContopinionManageService
-{
-
-	/**
-	 * 批量保存续签意见
-	 * @param batchVO
-	 * @return
-	 * @throws BusinessException
-	 */
-	ContopinionVO[] batchSave(ContopinionVO[] vos) throws BusinessException;
-
-	/**
-	 * 更新续签征询意见
-	 * @author fengwei on 2011-2-17
-	 * @param vos
-	 * @return 
-	 * @throws BusinessException
-	 * @exception 异常描述
-	 * @see 需要参见的其它内容
-	 * @since 从类的V60版本,此方法被添加进来。(可选)
-	 */
-	public ContopinionVO[] updateArray(ContopinionVO[] vos) throws BusinessException;
-
-	/**
-	 * 按照部门向部门负责人发送续签征询通知
-	 * @author fengwei on 2011-1-26
-	 * @param psndeptMap
-	 *             key:部门主键 value:部门下的人员
-	 * @param pk_group
-	 * @param pk_org
-	 * @param vos 
-	 * @param inFeedbackList 反馈中的续签意见,即部门反馈,个人还没有反馈的续签意见
-	 * @return
-	 * @exception 异常描述
-	 * @see 需要参见的其它内容
-	 * @since 从类的V60版本,此方法被添加进来。(可选)
-	 */
-	public HashMap<String, Object> sendNoticeToDeptManager(Map<String, List<String>> psndeptMap, Map<String, List<ContopinionVO>> contopMap, String pk_group,
-			String pk_org, ContopinionVO[] vos,ArrayList<ContopinionVO> inFeedbackList) throws BusinessException;
-
-	/**
-	 * 删除续签征询记录
-	 * @author fengwei on 2011-4-13
-	 * @param vos
-	 * @throws BusinessException
-	 * @exception 异常描述
-	 * @see 需要参见的其它内容
-	 * @since 从类的V60版本,此方法被添加进来。(可选)
-	 */
-	public void delete(ContopinionVO[] vos) throws BusinessException;
-
-	public ContopinionVO[] insertContOpVO(PsnSelListVO[] psnVOs, String remenddate, String remmonth, String pk_psndoc_sub, String termtype,
-			Integer termUnit, LoginContext context) throws BusinessException;
-
-	public HashMap<String, Object> getPsnjobDeptMap(ContopinionVO[] contopinionVOs) throws BusinessException;
-
-	public String[] getDeptHasPrincipal(String[] deptPKs) throws BusinessException;
-	
-	/**
-	 * 发送个人消息
-	 * @param psndeptMap
-	 * @param contopMap
-	 * @param pk_group
-	 * @param pk_org
-	 * @param vos
-	 * @param inFeedbackList
-	 * @return
-	 * @throws BusinessException
-	 */
-	public HashMap<String, Object> sendNoticeToPsn(Map<String, List<String>> psndeptMap, Map<String, List<ContopinionVO>> contopMap, String pk_group,
-			String pk_org, ContopinionVO[] vos,ArrayList<ContopinionVO> inFeedbackList) throws BusinessException; 
-
-}

+ 228 - 0
hrhi/src/public/nc/vo/hi/cloud/train/CloudFinshDetailVO.java

@@ -0,0 +1,228 @@
+package nc.vo.hi.cloud.train;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.lang.UFDouble;
+
+/**
+ * (线下)培训课程完成情况
+ * @author chenzf
+ * @date 2022-4-20 16:53:56
+ *
+ */
+public class CloudFinshDetailVO extends SuperVO {
+	private String pk_finsh_detail;
+	private String attendeeId;//员工培训出勤主键(为空则代表该学员未参与考勤)
+	private String id;//培训内容id(如果课程类型是考试,则id同时也是考试安排id)
+	private String name;//课程名称
+	private String trainingid;//培训id
+	private String teachername;//讲师名称
+	private String starttime;//课程开始时间
+	private String endtime;//课程结束时间
+	private String userId;//员工id
+	private String username;//员工账号
+	private String cnname;//中文名
+	@JsonProperty(value = "status")
+	private String finshStatus;//(课程)签到状态status。此行无数据表示未签到 0已签到(表示正常时间签到) 1请假 ;如果课程类型是考试: 0 未完成 1主考已完成 2.补考已完成
+	private String questionnaireresult;//评价结果
+	private String questionnairescore;//考试回写分数(考试分数),学员参与课程评价回写分数(课程评价分数)
+	private String sigintime;//签到时间。如果状态是迟到,则表示迟到的签到时间
+	private String signouttime;//签退时间。如果此字段无数据,则表示没有签退,即早退
+	private String isleaveearly;//是否早退(默认为0,1为早退)
+	private String islate;//是否迟到(默认为0,1为迟到)
+	private String submittime;//考试交卷时间
+	private String questionnaireid;//评价Id/考试userexamid
+	private String contentType;//课程类型:0 线下课程 1 考试 2评价(默认0)
+	private String joinType;//参与人员类型 0:报名参加 1:指派参加 2:游客参加 3:现场扫码参加
+	private Integer isPass;//是否及格 -1,0都是不通过,1为通过
+	private String isComplete;//完成状态(0:否、1:是),默认值:0
+	private UFDouble duration;//课程时长(小时)
+	
+	public static final String PK_FINSH_DETAIL = "pk_finsh_detail";
+	public static final String ATTENDEEID = "attendeeId";
+	public static final String ID = "id";
+	public static final String NAME = "name";
+	public static final String TRAININGID = "trainingid";
+	public static final String TEACHERNAME = "teachername";
+	public static final String STARTTIME = "starttime";
+	public static final String ENDTIME = "endtime";
+	public static final String USERID = "userId";
+	public static final String USERNAME = "username";
+	public static final String CNNAME = "cnname";
+	public static final String FINSHSTATUS = "finshStatus";
+	public static final String QUESTIONNAIRERESULT = "questionnaireresult";
+	public static final String QUESTIONNAIRESCORE = "questionnairescore";
+	public static final String SIGINTIME = "sigintime";
+	public static final String SIGNOUTTIME = "signouttime";
+	public static final String ISLEAVEEARLY = "isleaveearly";
+	public static final String ISLATE = "islate";
+	public static final String SUBMITTIME = "submittime";
+	public static final String QUESTIONNAIREID = "questionnaireid";
+	public static final String CONTENTTYPE = "contentType";
+	public static final String JOINTYPE = "joinType";
+	public static final String ISPASS = "isPass";
+	public static final String ISCOMPLETE = "isComplete";
+	public static final String DURATION = "duration";
+	
+	public String getPk_finsh_detail() {
+		return pk_finsh_detail;
+	}
+	public void setPk_finsh_detail(String pk_finsh_detail) {
+		this.pk_finsh_detail = pk_finsh_detail;
+	}
+	public String getAttendeeId() {
+		return attendeeId;
+	}
+	public void setAttendeeId(String attendeeId) {
+		this.attendeeId = attendeeId;
+	}
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getTrainingid() {
+		return trainingid;
+	}
+	public void setTrainingid(String trainingid) {
+		this.trainingid = trainingid;
+	}
+	public String getTeachername() {
+		return teachername;
+	}
+	public void setTeachername(String teachername) {
+		this.teachername = teachername;
+	}
+	public String getStarttime() {
+		return starttime;
+	}
+	public void setStarttime(String starttime) {
+		this.starttime = starttime;
+	}
+	public String getEndtime() {
+		return endtime;
+	}
+	public void setEndtime(String endtime) {
+		this.endtime = endtime;
+	}
+	public String getUserId() {
+		return userId;
+	}
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	public String getUsername() {
+		return username;
+	}
+	public void setUsername(String username) {
+		this.username = username;
+	}
+	public String getCnname() {
+		return cnname;
+	}
+	public void setCnname(String cnname) {
+		this.cnname = cnname;
+	}
+	public String getFinshStatus() {
+		return finshStatus;
+	}
+	public void setFinshStatus(String finshStatus) {
+		this.finshStatus = finshStatus;
+	}
+	public String getQuestionnaireresult() {
+		return questionnaireresult;
+	}
+	public void setQuestionnaireresult(String questionnaireresult) {
+		this.questionnaireresult = questionnaireresult;
+	}
+	public String getQuestionnairescore() {
+		return questionnairescore;
+	}
+	public void setQuestionnairescore(String questionnairescore) {
+		this.questionnairescore = questionnairescore;
+	}
+	public String getSigintime() {
+		return sigintime;
+	}
+	public void setSigintime(String sigintime) {
+		this.sigintime = sigintime;
+	}
+	public String getSignouttime() {
+		return signouttime;
+	}
+	public void setSignouttime(String signouttime) {
+		this.signouttime = signouttime;
+	}
+	public String getIsleaveearly() {
+		return isleaveearly;
+	}
+	public void setIsleaveearly(String isleaveearly) {
+		this.isleaveearly = isleaveearly;
+	}
+	public String getIslate() {
+		return islate;
+	}
+	public void setIslate(String islate) {
+		this.islate = islate;
+	}
+	public String getSubmittime() {
+		return submittime;
+	}
+	public void setSubmittime(String submittime) {
+		this.submittime = submittime;
+	}
+	public String getQuestionnaireid() {
+		return questionnaireid;
+	}
+	public void setQuestionnaireid(String questionnaireid) {
+		this.questionnaireid = questionnaireid;
+	}
+	public String getContentType() {
+		return contentType;
+	}
+	public void setContentType(String contentType) {
+		this.contentType = contentType;
+	}
+	public String getJoinType() {
+		return joinType;
+	}
+	public void setJoinType(String joinType) {
+		this.joinType = joinType;
+	}
+	public Integer getIsPass() {
+		return isPass;
+	}
+	public void setIsPass(Integer isPass) {
+		this.isPass = isPass;
+	}
+	public String getIsComplete() {
+		return isComplete;
+	}
+	public void setIsComplete(String isComplete) {
+		this.isComplete = isComplete;
+	}
+	public UFDouble getDuration() {
+		return duration;
+	}
+	public void setDuration(UFDouble duration) {
+		this.duration = duration;
+	}
+	public String getParentPKFieldName() {
+		return null;
+	}
+	public String getPKFieldName() {
+		return "pk_finsh_detail";
+	}
+
+	public String getTableName() {
+		return "cloud_finsh_detail";
+	}
+}

+ 57 - 0
hrhi/src/public/nc/vo/hi/cloud/train/CloudKngcatalogsVO.java

@@ -0,0 +1,57 @@
+package nc.vo.hi.cloud.train;
+
+import nc.vo.pub.SuperVO;
+
+/**
+ * 列街커쩌죗깊
+ * @author chenzf
+ * @date 2022-5-7 14:55:47
+ */
+public class CloudKngcatalogsVO extends SuperVO {
+	private String pk_kngcatalogs;
+	private String id;//커쩌id
+	private String catalogName;//커쩌츰
+	private String parentId;//만섬커쩌id
+	private String catalogRoutingNumber;//커쩌꿔섬긍뵀
+	
+	public String getPk_kngcatalogs() {
+		return pk_kngcatalogs;
+	}
+	public void setPk_kngcatalogs(String pk_kngcatalogs) {
+		this.pk_kngcatalogs = pk_kngcatalogs;
+	}
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public String getCatalogName() {
+		return catalogName;
+	}
+	public void setCatalogName(String catalogName) {
+		this.catalogName = catalogName;
+	}
+	public String getParentId() {
+		return parentId;
+	}
+	public void setParentId(String parentId) {
+		this.parentId = parentId;
+	}
+	public String getCatalogRoutingNumber() {
+		return catalogRoutingNumber;
+	}
+	public void setCatalogRoutingNumber(String catalogRoutingNumber) {
+		this.catalogRoutingNumber = catalogRoutingNumber;
+	}
+	public String getParentPKFieldName() {
+		return null;
+	}
+	public String getPKFieldName() {
+		return "pk_kngcatalogs";
+	}
+
+	public String getTableName() {
+		return "cloud_kngcatalogs";
+	}
+}

+ 314 - 0
hrhi/src/public/nc/vo/hi/cloud/train/CloudKnowledgesVO.java

@@ -0,0 +1,314 @@
+package nc.vo.hi.cloud.train;
+
+
+import java.math.BigDecimal;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import nc.vo.pub.SuperVO;
+
+/**
+ * 知识列表
+ * @author showm
+ *
+ */
+public class CloudKnowledgesVO extends SuperVO {
+	private String pk_knowledges;
+	private String id;//知识id
+	private String title;//作品名称
+	private String knowledgno;//知识编号
+	private String knowledgeType;//知识类型,DocumentKnowledge、VideoKnowledge、SourceCodeKnowledge, CourseKnowledge, XuanYes
+	private String photoUrl;//作品图片
+	private String fileType;//文件类型:程序定义枚举(Article、PPT、Word、Video、SourceCode、PDF、Excel、CoursePackage、XuanYes、Image、EBookCourse)其中 CoursePackage代表课程包
+	private String fileID;//文件id
+	private String knowledgeUrl;//访问当前知识的页面相对地址
+	private String uploadDate;//创建日期
+	private BigDecimal standardStudyScore;//标准学分
+	private BigDecimal tandardStudyHours;//标准学时(按分钟)
+	private BigDecimal isSupportApp;//是否支持客户端
+	private String summary;//内容的描述(不含HTML代码)
+	private String knowledgeContent;//知识的内容
+	private String attachementUrl;//附件地址
+	private String uploadUserName;//创建用户姓名
+	private String knowledgeFileUrl;//知识文件的地址(相对地址)
+	private String knowledgeCatalogId;//知识所在目录的ID
+	private BigDecimal isdeleted;//是否删除
+	private BigDecimal isvisiableForuser;//是否可见
+	private String h5Type;//knowledgeType 的转换值
+	private String distributeSourceType;//分发来源类型: 0 运营平台; 2 商城
+	private String newVersionUploaddate;//新版本更新时间
+	private BigDecimal totalcommentscore;//总评分
+	private BigDecimal totalcommentscorecount;//评价次数
+	private BigDecimal averagecommentscore;//评价平均分
+	private String lecturesteachername;//讲师
+	private String lecturesTeacherId;//讲师id
+	private String author;//作者
+	private String authorId;//作者id
+	private BigDecimal supportcount;//点赞数
+	private BigDecimal readcount;//浏览数
+	private BigDecimal favoritedcount;//收藏数
+	private String cloudStatus;//知识状态:FileConverting 文件转换中;Approving 审核中;Unapproved 审核不通过;Approved 审核通过(课程包为已发布);Draft 设计中
+	private String expiredDate;//过期时间
+	private String updateDate;//更新时间
+	private String contributorsUserNo;//贡献者工号
+	private String contributorsName;//贡献者姓名
+	private String contributorsId;//贡献者id
+	private String h5KnowledgeUrl;//知识的h5地址(相对地址)
+	
+	public String getPk_knowledges() {
+		return pk_knowledges;
+	}
+	public void setPk_knowledges(String pk_knowledges) {
+		this.pk_knowledges = pk_knowledges;
+	}
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public String getTitle() {
+		return title;
+	}
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	public String getKnowledgno() {
+		return knowledgno;
+	}
+	public void setKnowledgno(String knowledgno) {
+		this.knowledgno = knowledgno;
+	}
+	public String getKnowledgeType() {
+		return knowledgeType;
+	}
+	public void setKnowledgeType(String knowledgeType) {
+		this.knowledgeType = knowledgeType;
+	}
+	public String getPhotoUrl() {
+		return photoUrl;
+	}
+	public void setPhotoUrl(String photoUrl) {
+		this.photoUrl = photoUrl;
+	}
+	public String getFileType() {
+		return fileType;
+	}
+	public void setFileType(String fileType) {
+		this.fileType = fileType;
+	}
+	public String getFileID() {
+		return fileID;
+	}
+	public void setFileID(String fileID) {
+		this.fileID = fileID;
+	}
+	public String getKnowledgeUrl() {
+		return knowledgeUrl;
+	}
+	public void setKnowledgeUrl(String knowledgeUrl) {
+		this.knowledgeUrl = knowledgeUrl;
+	}
+	public String getUploadDate() {
+		return uploadDate;
+	}
+	public void setUploadDate(String uploadDate) {
+		this.uploadDate = uploadDate;
+	}
+	public BigDecimal getStandardStudyScore() {
+		return standardStudyScore;
+	}
+	public void setStandardStudyScore(BigDecimal standardStudyScore) {
+		this.standardStudyScore = standardStudyScore;
+	}
+	public BigDecimal getTandardStudyHours() {
+		return tandardStudyHours;
+	}
+	public void setTandardStudyHours(BigDecimal tandardStudyHours) {
+		this.tandardStudyHours = tandardStudyHours;
+	}
+	public BigDecimal getIsSupportApp() {
+		return isSupportApp;
+	}
+	public void setIsSupportApp(BigDecimal isSupportApp) {
+		this.isSupportApp = isSupportApp;
+	}
+	public String getSummary() {
+		return summary;
+	}
+	public void setSummary(String summary) {
+		this.summary = summary;
+	}
+	public String getKnowledgeContent() {
+		return knowledgeContent;
+	}
+	public void setKnowledgeContent(String knowledgeContent) {
+		this.knowledgeContent = knowledgeContent;
+	}
+	public String getAttachementUrl() {
+		return attachementUrl;
+	}
+	public void setAttachementUrl(String attachementUrl) {
+		this.attachementUrl = attachementUrl;
+	}
+	public String getUploadUserName() {
+		return uploadUserName;
+	}
+	public void setUploadUserName(String uploadUserName) {
+		this.uploadUserName = uploadUserName;
+	}
+	public String getKnowledgeFileUrl() {
+		return knowledgeFileUrl;
+	}
+	public void setKnowledgeFileUrl(String knowledgeFileUrl) {
+		this.knowledgeFileUrl = knowledgeFileUrl;
+	}
+	public String getKnowledgeCatalogId() {
+		return knowledgeCatalogId;
+	}
+	public void setKnowledgeCatalogId(String knowledgeCatalogId) {
+		this.knowledgeCatalogId = knowledgeCatalogId;
+	}
+	public BigDecimal getIsdeleted() {
+		return isdeleted;
+	}
+	public void setIsdeleted(BigDecimal isdeleted) {
+		this.isdeleted = isdeleted;
+	}
+	public BigDecimal getIsvisiableForuser() {
+		return isvisiableForuser;
+	}
+	public void setIsvisiableForuser(BigDecimal isvisiableForuser) {
+		this.isvisiableForuser = isvisiableForuser;
+	}
+	public String getH5Type() {
+		return h5Type;
+	}
+	public void setH5Type(String h5Type) {
+		this.h5Type = h5Type;
+	}
+	public String getDistributeSourceType() {
+		return distributeSourceType;
+	}
+	public void setDistributeSourceType(String distributeSourceType) {
+		this.distributeSourceType = distributeSourceType;
+	}
+	public String getNewVersionUploaddate() {
+		return newVersionUploaddate;
+	}
+	public void setNewVersionUploaddate(String newVersionUploaddate) {
+		this.newVersionUploaddate = newVersionUploaddate;
+	}
+	public BigDecimal getTotalcommentscore() {
+		return totalcommentscore;
+	}
+	public void setTotalcommentscore(BigDecimal totalcommentscore) {
+		this.totalcommentscore = totalcommentscore;
+	}
+	public BigDecimal getTotalcommentscorecount() {
+		return totalcommentscorecount;
+	}
+	public void setTotalcommentscorecount(BigDecimal totalcommentscorecount) {
+		this.totalcommentscorecount = totalcommentscorecount;
+	}
+	public BigDecimal getAveragecommentscore() {
+		return averagecommentscore;
+	}
+	public void setAveragecommentscore(BigDecimal averagecommentscore) {
+		this.averagecommentscore = averagecommentscore;
+	}
+	public String getLecturesteachername() {
+		return lecturesteachername;
+	}
+	public void setLecturesteachername(String lecturesteachername) {
+		this.lecturesteachername = lecturesteachername;
+	}
+	public String getLecturesTeacherId() {
+		return lecturesTeacherId;
+	}
+	public void setLecturesTeacherId(String lecturesTeacherId) {
+		this.lecturesTeacherId = lecturesTeacherId;
+	}
+	public String getAuthor() {
+		return author;
+	}
+	public void setAuthor(String author) {
+		this.author = author;
+	}
+	public String getAuthorId() {
+		return authorId;
+	}
+	public void setAuthorId(String authorId) {
+		this.authorId = authorId;
+	}
+	public BigDecimal getSupportcount() {
+		return supportcount;
+	}
+	public void setSupportcount(BigDecimal supportcount) {
+		this.supportcount = supportcount;
+	}
+	public BigDecimal getReadcount() {
+		return readcount;
+	}
+	public void setReadcount(BigDecimal readcount) {
+		this.readcount = readcount;
+	}
+	public BigDecimal getFavoritedcount() {
+		return favoritedcount;
+	}
+	public void setFavoritedcount(BigDecimal favoritedcount) {
+		this.favoritedcount = favoritedcount;
+	}
+	public String getCloudStatus() {
+		return cloudStatus;
+	}
+	public void setCloudStatus(String cloudStatus) {
+		this.cloudStatus = cloudStatus;
+	}
+	public String getExpiredDate() {
+		return expiredDate;
+	}
+	public void setExpiredDate(String expiredDate) {
+		this.expiredDate = expiredDate;
+	}
+	public String getUpdateDate() {
+		return updateDate;
+	}
+	public void setUpdateDate(String updateDate) {
+		this.updateDate = updateDate;
+	}
+	public String getContributorsUserNo() {
+		return contributorsUserNo;
+	}
+	public void setContributorsUserNo(String contributorsUserNo) {
+		this.contributorsUserNo = contributorsUserNo;
+	}
+	public String getContributorsName() {
+		return contributorsName;
+	}
+	public void setContributorsName(String contributorsName) {
+		this.contributorsName = contributorsName;
+	}
+	public String getContributorsId() {
+		return contributorsId;
+	}
+	public void setContributorsId(String contributorsId) {
+		this.contributorsId = contributorsId;
+	}
+	public String getH5KnowledgeUrl() {
+		return h5KnowledgeUrl;
+	}
+	public void setH5KnowledgeUrl(String h5KnowledgeUrl) {
+		this.h5KnowledgeUrl = h5KnowledgeUrl;
+	}
+	public String getParentPKFieldName() {
+		return null;
+	}
+	public String getPKFieldName() {
+		return "pk_knowledges";
+	}
+
+	public String getTableName() {
+		return "cloud_knowledges";
+	}
+}

+ 234 - 0
hrhi/src/public/nc/vo/hi/cloud/train/CloudOnlineuserknowledge.java

@@ -0,0 +1,234 @@
+package nc.vo.hi.cloud.train;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import nc.vo.pub.SuperVO;
+
+/**
+ * 员工所有线上学习记录
+ * @author chenzf
+ * @date 2022-5-7 17:33:21
+ */
+public class CloudOnlineuserknowledge extends SuperVO {
+	private String pk_onlineuserknowledge; 
+	private String id;//主键
+	private String userId;//用户id
+	private String userName;//用户账号 
+	private String userCname;//用户姓名 
+	private String userAccount;//用户学习这个知识时的账号名
+	private String cloudStatus;//学习状态:未学习NoStart;学习中Studying;已完成 Completed 
+	private String lastStudyTime;//最后学习时间 
+	private String sourceType;//自学SingleStudy;指派DistributePlan;岗位PostStudy
+	private String knowledgeId;//知识id(如果是考试fileType=OteExam,则为对应的考试安排id) 
+	private String knowledgeTitle;//知识名称 
+	private String createDate;//创建时间 
+	private String actualStudyFinishDate;//实际完成时间 
+	private String deptName;//部门名称 
+	private String deptNo;//用户所在部门,部门编号 
+	private String userNo;//用户工号 
+	private String actualStudyHours;//实际学习时长(分钟) 
+	private String standardStudyHours;//标准学习时长(分钟) 
+	private String standardStudyScore;//标准学分
+	private String actualObtainedScore;//实际学分 
+	private String thirdMasterId;//第三方id,如果是单个知识或课程包,则为空;或者是对应的用户学习计划id;如果是课程包内明细,则为所在课程包的学习记录主键 
+	private String fileType;//文件类型程序定义枚举(Article、PPT、Word、Video、SourceCode、PDF、Excel、CoursePackage、XuanYes、Image、EBookCourse、OteExam)OteExam为考试,CoursePackage为课程包 
+	private String knowledgeType;//知识类型ArticleKnowledge、DocumentKnowledge、VideoKnowledge、SourceCodeKnowledge、QuestionKnowledge、CourseKnowledge、XuanYes 
+	private String knowledgeUrl;//知识相对地址 
+	private String examScore;//考试分数 
+	private String spare1;//备用字段1 
+	private String isExam;//是否为考试(true为考试;false非考试)
+	private String isPackageDetail;//是否为课程包明细(true为课程包内知识明细;false为单个知识或课程包) 
+	private String studySchedule;//学习进度
+	private String userStatus;//账号状态 0:禁用 1:启用 
+	
+	public String getPk_onlineuserknowledge() {
+		return pk_onlineuserknowledge;
+	}
+	public void setPk_onlineuserknowledge(String pk_onlineuserknowledge) {
+		this.pk_onlineuserknowledge = pk_onlineuserknowledge;
+	}
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public String getUserId() {
+		return userId;
+	}
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+	public String getUserCname() {
+		return userCname;
+	}
+	public void setUserCname(String userCname) {
+		this.userCname = userCname;
+	}
+	public String getUserAccount() {
+		return userAccount;
+	}
+	public void setUserAccount(String userAccount) {
+		this.userAccount = userAccount;
+	}
+	public String getCloudStatus() {
+		return cloudStatus;
+	}
+	public void setCloudStatus(String cloudStatus) {
+		this.cloudStatus = cloudStatus;
+	}
+	public String getLastStudyTime() {
+		return lastStudyTime;
+	}
+	public void setLastStudyTime(String lastStudyTime) {
+		this.lastStudyTime = lastStudyTime;
+	}
+	public String getSourceType() {
+		return sourceType;
+	}
+	public void setSourceType(String sourceType) {
+		this.sourceType = sourceType;
+	}
+	public String getKnowledgeId() {
+		return knowledgeId;
+	}
+	public void setKnowledgeId(String knowledgeId) {
+		this.knowledgeId = knowledgeId;
+	}
+	public String getKnowledgeTitle() {
+		return knowledgeTitle;
+	}
+	public void setKnowledgeTitle(String knowledgeTitle) {
+		this.knowledgeTitle = knowledgeTitle;
+	}
+	public String getCreateDate() {
+		return createDate;
+	}
+	public void setCreateDate(String createDate) {
+		this.createDate = createDate;
+	}
+	public String getActualStudyFinishDate() {
+		return actualStudyFinishDate;
+	}
+	public void setActualStudyFinishDate(String actualStudyFinishDate) {
+		this.actualStudyFinishDate = actualStudyFinishDate;
+	}
+	public String getDeptName() {
+		return deptName;
+	}
+	public void setDeptName(String deptName) {
+		this.deptName = deptName;
+	}
+	public String getDeptNo() {
+		return deptNo;
+	}
+	public void setDeptNo(String deptNo) {
+		this.deptNo = deptNo;
+	}
+	public String getUserNo() {
+		return userNo;
+	}
+	public void setUserNo(String userNo) {
+		this.userNo = userNo;
+	}
+	public String getActualStudyHours() {
+		return actualStudyHours;
+	}
+	public void setActualStudyHours(String actualStudyHours) {
+		this.actualStudyHours = actualStudyHours;
+	}
+	public String getStandardStudyHours() {
+		return standardStudyHours;
+	}
+	public void setStandardStudyHours(String standardStudyHours) {
+		this.standardStudyHours = standardStudyHours;
+	}
+	public String getStandardStudyScore() {
+		return standardStudyScore;
+	}
+	public void setStandardStudyScore(String standardStudyScore) {
+		this.standardStudyScore = standardStudyScore;
+	}
+	public String getActualObtainedScore() {
+		return actualObtainedScore;
+	}
+	public void setActualObtainedScore(String actualObtainedScore) {
+		this.actualObtainedScore = actualObtainedScore;
+	}
+	public String getThirdMasterId() {
+		return thirdMasterId;
+	}
+	public void setThirdMasterId(String thirdMasterId) {
+		this.thirdMasterId = thirdMasterId;
+	}
+	public String getFileType() {
+		return fileType;
+	}
+	public void setFileType(String fileType) {
+		this.fileType = fileType;
+	}
+	public String getKnowledgeType() {
+		return knowledgeType;
+	}
+	public void setKnowledgeType(String knowledgeType) {
+		this.knowledgeType = knowledgeType;
+	}
+	public String getKnowledgeUrl() {
+		return knowledgeUrl;
+	}
+	public void setKnowledgeUrl(String knowledgeUrl) {
+		this.knowledgeUrl = knowledgeUrl;
+	}
+	public String getExamScore() {
+		return examScore;
+	}
+	public void setExamScore(String examScore) {
+		this.examScore = examScore;
+	}
+	public String getSpare1() {
+		return spare1;
+	}
+	public void setSpare1(String spare1) {
+		this.spare1 = spare1;
+	}
+	public String getIsExam() {
+		return isExam;
+	}
+	public void setIsExam(String isExam) {
+		this.isExam = isExam;
+	}
+	public String getIsPackageDetail() {
+		return isPackageDetail;
+	}
+	public void setIsPackageDetail(String isPackageDetail) {
+		this.isPackageDetail = isPackageDetail;
+	}
+	public String getStudySchedule() {
+		return studySchedule;
+	}
+	public void setStudySchedule(String studySchedule) {
+		this.studySchedule = studySchedule;
+	}
+	public String getUserStatus() {
+		return userStatus;
+	}
+	public void setUserStatus(String userStatus) {
+		this.userStatus = userStatus;
+	}
+	public String getParentPKFieldName() {
+		return null;
+	}
+	public String getPKFieldName() {
+		return "pk_onlineuserknowledge";
+	}
+
+	public String getTableName() {
+		return "cloud_onlineuserknowledge";
+	}
+}

+ 236 - 0
hrhi/src/public/nc/vo/hi/cloud/train/CloudPlanDetailVO.java

@@ -0,0 +1,236 @@
+package nc.vo.hi.cloud.train;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.lang.UFDouble;
+
+/**
+ * 学习计划执行明细
+ * @author chenzf
+ * @date 2022-4-20 16:20:14
+ *
+ */
+public class CloudPlanDetailVO extends SuperVO {
+	private String pk_plan_detail;
+	private String planID;//学习计划id
+	private String userId;//用户id
+	private String userName;//用户账号
+	private String userNo;//用户工号
+	private String thirdSystemUserNo;//用户第三方id
+	private String planName;//计划名称
+	@JsonProperty(value = "status")
+	private String planStatus;//状态status:未学习NoStart;学习中Studying;已完成 Completed
+	private String userKnowledgeId;//用户知识id
+	private String masterTitle;//知识/考试名称(如果是课程包内知识,则名称是 "[课程包]课程")
+	private UFDouble actualStudyScore;//实际获得学分
+	private String lastStudyTime;//最后一次学习时间
+	private UFDouble studySchedule;//学习进度
+	private String actualFinishDate;//实际完成时间
+	private UFDouble examTotalScore;//试卷总分
+	private String examScore;//考试得分
+	private String isPassed;//是否通过
+	private String actualStudyHours;//实际学时(分钟)
+	private String knowledgeid;//知识id/考试安排id
+	private String packageDetailKnowledgeId;//知识id/考试安排id(课程包里的)
+	private String standardstudyscore;//标准学分
+	private String standardstudyhours;//标准学时(分钟)
+	private String filetype;//文件类型:程序定义枚举(Article、PPT、Word、Video、SourceCode、PDF、Excel、CoursePackage、XuanYes、Image、EBookCourse)其中 CoursePackage代表课程包 OteExam代表考试
+	private String actualEndDate;//计划实际结束时间
+	private String actualStartDate;//计划实际开始时间
+	private String teacherCname;//讲师名称
+	
+	public static final String PK_PLAN_DETAIL = "pk_plan_detail";
+	public static final String PLANID = "planID";
+	public static final String USERID = "userId";
+	public static final String USERNAME = "userName";
+	public static final String USERNO = "userNo";
+	public static final String THIRDSYSTEMUSERNO = "thirdSystemUserNo";
+	public static final String PLANNAME = "planName";
+	public static final String PLANSTATUS = "planStatus";
+	public static final String USERKNOWLEDGEID = "userKnowledgeId";
+	public static final String MASTERTITLE = "masterTitle";
+	public static final String ACTUALSTUDYSCORE = "actualStudyScore";
+	public static final String LASTSTUDYTIME = "lastStudyTime";
+	public static final String STUDYSCHEDULE = "studySchedule";
+	public static final String ACTUALFINISHDATE = "actualFinishDate";
+	public static final String EXAMTOTALSCORE = "examTotalScore";
+	public static final String EXAMSCORE = "examScore";
+	public static final String ISPASSED = "isPassed";
+	public static final String ACTUALSTUDYHOURS = "actualStudyHours";
+	public static final String KNOWLEDGEID = "knowledgeid";
+	public static final String PACKAGEDETAILKNOWLEDGEID = "packageDetailKnowledgeId";
+	public static final String STANDARDSTUDYSCORE = "standardstudyscore";
+	public static final String STANDARDSTUDYHOURS = "standardstudyhours";
+	public static final String FILETYPE = "filetype";
+	public static final String ACTUALENDDATE = "actualEndDate";
+	public static final String ACTUALSTARTDATE = "actualStartDate";
+	public static final String TEACHERCNAME = "teacherCname";
+	
+	public String getPk_plan_detail() {
+		return pk_plan_detail;
+	}
+	public void setPk_plan_detail(String pk_plan_detail) {
+		this.pk_plan_detail = pk_plan_detail;
+	}
+	public String getPlanID() {
+		return planID;
+	}
+	public void setPlanID(String planID) {
+		this.planID = planID;
+	}
+	public String getUserId() {
+		return userId;
+	}
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+	public String getUserNo() {
+		return userNo;
+	}
+	public void setUserNo(String userNo) {
+		this.userNo = userNo;
+	}
+	public String getThirdSystemUserNo() {
+		return thirdSystemUserNo;
+	}
+	public void setThirdSystemUserNo(String thirdSystemUserNo) {
+		this.thirdSystemUserNo = thirdSystemUserNo;
+	}
+	public String getPlanName() {
+		return planName;
+	}
+	public void setPlanName(String planName) {
+		this.planName = planName;
+	}
+	public String getPlanStatus() {
+		return planStatus;
+	}
+	public void setPlanStatus(String planStatus) {
+		this.planStatus = planStatus;
+	}
+	public String getUserKnowledgeId() {
+		return userKnowledgeId;
+	}
+	public void setUserKnowledgeId(String userKnowledgeId) {
+		this.userKnowledgeId = userKnowledgeId;
+	}
+	public String getMasterTitle() {
+		return masterTitle;
+	}
+	public void setMasterTitle(String masterTitle) {
+		this.masterTitle = masterTitle;
+	}
+	public UFDouble getActualStudyScore() {
+		return actualStudyScore;
+	}
+	public void setActualStudyScore(UFDouble actualStudyScore) {
+		this.actualStudyScore = actualStudyScore;
+	}
+	public String getLastStudyTime() {
+		return lastStudyTime;
+	}
+	public void setLastStudyTime(String lastStudyTime) {
+		this.lastStudyTime = lastStudyTime;
+	}
+	public UFDouble getStudySchedule() {
+		return studySchedule;
+	}
+	public void setStudySchedule(UFDouble studySchedule) {
+		this.studySchedule = studySchedule;
+	}
+	public String getActualFinishDate() {
+		return actualFinishDate;
+	}
+	public void setActualFinishDate(String actualFinishDate) {
+		this.actualFinishDate = actualFinishDate;
+	}
+	public UFDouble getExamTotalScore() {
+		return examTotalScore;
+	}
+	public void setExamTotalScore(UFDouble examTotalScore) {
+		this.examTotalScore = examTotalScore;
+	}
+	public String getExamScore() {
+		return examScore;
+	}
+	public void setExamScore(String examScore) {
+		this.examScore = examScore;
+	}
+	public String getIsPassed() {
+		return isPassed;
+	}
+	public void setIsPassed(String isPassed) {
+		this.isPassed = isPassed;
+	}
+	public String getActualStudyHours() {
+		return actualStudyHours;
+	}
+	public void setActualStudyHours(String actualStudyHours) {
+		this.actualStudyHours = actualStudyHours;
+	}
+	public String getKnowledgeid() {
+		return knowledgeid;
+	}
+	public void setKnowledgeid(String knowledgeid) {
+		this.knowledgeid = knowledgeid;
+	}
+	public String getPackageDetailKnowledgeId() {
+		return packageDetailKnowledgeId;
+	}
+	public void setPackageDetailKnowledgeId(String packageDetailKnowledgeId) {
+		this.packageDetailKnowledgeId = packageDetailKnowledgeId;
+	}
+	public String getStandardstudyscore() {
+		return standardstudyscore;
+	}
+	public void setStandardstudyscore(String standardstudyscore) {
+		this.standardstudyscore = standardstudyscore;
+	}
+	public String getStandardstudyhours() {
+		return standardstudyhours;
+	}
+	public void setStandardstudyhours(String standardstudyhours) {
+		this.standardstudyhours = standardstudyhours;
+	}
+	public String getFiletype() {
+		return filetype;
+	}
+	public void setFiletype(String filetype) {
+		this.filetype = filetype;
+	}
+	public String getActualEndDate() {
+		return actualEndDate;
+	}
+	public void setActualEndDate(String actualEndDate) {
+		this.actualEndDate = actualEndDate;
+	}
+	public String getActualStartDate() {
+		return actualStartDate;
+	}
+	public void setActualStartDate(String actualStartDate) {
+		this.actualStartDate = actualStartDate;
+	}
+	public String getTeacherCname() {
+		return teacherCname;
+	}
+	public void setTeacherCname(String teacherCname) {
+		this.teacherCname = teacherCname;
+	}
+	public String getParentPKFieldName() {
+		return null;
+	}
+	public String getPKFieldName() {
+		return "pk_plan_detail";
+	}
+
+	public String getTableName() {
+		return "cloud_plan_detail";
+	}
+}

+ 288 - 0
hrhi/src/public/nc/vo/hi/cloud/train/CloudPsnVO.java

@@ -0,0 +1,288 @@
+package nc.vo.hi.cloud.train;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.lang.UFBoolean;
+
+/**
+ * 员工信息列表
+ * @author chenzf
+ * @date 2022-4-21 15:53:04
+ *
+ */
+public class CloudPsnVO extends SuperVO {
+	private String pk_cloud;
+	private String id;//人员id
+	private String cnName;//用户姓名
+	private String createDate;//创建时间
+	private String currentPositionName;//岗位名
+	private String currentPositionId;//岗位id
+	private String departmentId;//部门id
+	private String departmentName;//部门名称
+	private String eMail;//邮箱
+	private String mobile;//手机
+	private String sex;//性别
+	private String cloudStatus;//状态status 0为禁用 1为启用
+	private String thirdDeptId;//第三方系统id
+	private String thirdSystemSYNCDate;//第三方系统同步时间
+	private String thirdSystemUserNo;//第三方系统用户账号
+	private String updateDate;//更新时间
+	private String entryTime;//入职时间
+	private String userName;//用户账号
+	private String userNo;//员工编号
+	private String deptNo;//部门编号
+	private String positionNo;//岗位编号
+	private String managerUserId;//直属经理id
+	private String managerUsername;//直属经理账号
+	private String managerCnName;//直属经理姓名
+	private String createUserId;//创建人id 如通过接口创建则为平台ApiKey
+	private String createUserName;//创建人名称
+	public static final String ID = "id";
+	public static final String CNNAME = "cnName";
+	public static final String CREATEDATE = "createDate";
+	public static final String PK_CLOUD = "pk_cloud";
+	public static final String CURRENTPOSITIONNAME = "currentPositionName";
+	public static final String CURRENTPOSITIONID = "currentPositionId";
+	public static final String DEPARTMENTID = "departmentId";
+	public static final String DEPARTMENTNAME = "departmentName";
+	public static final String EMAIL = "eMail";
+	public static final String MOBILE = "mobile";
+	public static final String SEX = "sex";
+	public static final String CLOUDSTATUS = "cloudStatus";
+	public static final String THIRDDEPTID = "thirdDeptId";
+	public static final String THIRDSYSTEMSYNCDATE = "thirdSystemSYNCDate";
+	public static final String THIRDSYSTEMUSERNO = "thirdSystemUserNo";
+	public static final String UPDATEDATE = "updateDate";
+	public static final String ENTRYTIME = "entryTime";
+	public static final String USERNAME = "userName";
+	public static final String USERNO = "userNo";
+	public static final String DEPTNO = "deptNo";
+	public static final String POSITIONNO = "positionNo";
+	public static final String MANAGERUSERID = "managerUserId";
+	public static final String MANAGERUSERNAME = "managerUsername";
+	public static final String MANAGERCNNAME = "managerCnName";
+	public static final String CREATEUSERID = "createUserId";
+	public static final String CREATEUSERNAME = "createUserName";
+
+	public String getPk_cloud() {
+		return pk_cloud;
+	}
+
+	public void setPk_cloud(String pk_cloud) {
+		this.pk_cloud = pk_cloud;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getCnName() {
+		return cnName;
+	}
+
+	public void setCnName(String cnName) {
+		this.cnName = cnName;
+	}
+
+	public String getCreateDate() {
+		return createDate;
+	}
+
+	public void setCreateDate(String createDate) {
+		this.createDate = createDate;
+	}
+
+	public String getCurrentPositionName() {
+		return currentPositionName;
+	}
+
+	public void setCurrentPositionName(String currentPositionName) {
+		this.currentPositionName = currentPositionName;
+	}
+
+	public String getCurrentPositionId() {
+		return currentPositionId;
+	}
+
+	public void setCurrentPositionId(String currentPositionId) {
+		this.currentPositionId = currentPositionId;
+	}
+
+	public String getDepartmentId() {
+		return departmentId;
+	}
+
+	public void setDepartmentId(String departmentId) {
+		this.departmentId = departmentId;
+	}
+
+	public String getDepartmentName() {
+		return departmentName;
+	}
+
+	public void setDepartmentName(String departmentName) {
+		this.departmentName = departmentName;
+	}
+
+	public String geteMail() {
+		return eMail;
+	}
+
+	public void seteMail(String eMail) {
+		this.eMail = eMail;
+	}
+
+	public String getMobile() {
+		return mobile;
+	}
+
+	public void setMobile(String mobile) {
+		this.mobile = mobile;
+	}
+
+	public String getSex() {
+		return sex;
+	}
+
+	public void setSex(String sex) {
+		this.sex = sex;
+	}
+
+	public String getThirdDeptId() {
+		return thirdDeptId;
+	}
+
+	public void setThirdDeptId(String thirdDeptId) {
+		this.thirdDeptId = thirdDeptId;
+	}
+
+	public String getThirdSystemSYNCDate() {
+		return thirdSystemSYNCDate;
+	}
+
+	public void setThirdSystemSYNCDate(String thirdSystemSYNCDate) {
+		this.thirdSystemSYNCDate = thirdSystemSYNCDate;
+	}
+
+	public String getThirdSystemUserNo() {
+		return thirdSystemUserNo;
+	}
+
+	public void setThirdSystemUserNo(String thirdSystemUserNo) {
+		this.thirdSystemUserNo = thirdSystemUserNo;
+	}
+
+	public String getUpdateDate() {
+		return updateDate;
+	}
+
+	public void setUpdateDate(String updateDate) {
+		this.updateDate = updateDate;
+	}
+
+	public String getEntryTime() {
+		return entryTime;
+	}
+
+	public void setEntryTime(String entryTime) {
+		this.entryTime = entryTime;
+	}
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getUserNo() {
+		return userNo;
+	}
+
+	public void setUserNo(String userNo) {
+		this.userNo = userNo;
+	}
+
+	public String getDeptNo() {
+		return deptNo;
+	}
+
+	public void setDeptNo(String deptNo) {
+		this.deptNo = deptNo;
+	}
+
+	public String getPositionNo() {
+		return positionNo;
+	}
+
+	public void setPositionNo(String positionNo) {
+		this.positionNo = positionNo;
+	}
+
+	public String getManagerUserId() {
+		return managerUserId;
+	}
+
+	public void setManagerUserId(String managerUserId) {
+		this.managerUserId = managerUserId;
+	}
+
+	public String getManagerUsername() {
+		return managerUsername;
+	}
+
+	public void setManagerUsername(String managerUsername) {
+		this.managerUsername = managerUsername;
+	}
+
+	public String getManagerCnName() {
+		return managerCnName;
+	}
+
+	public void setManagerCnName(String managerCnName) {
+		this.managerCnName = managerCnName;
+	}
+
+	public String getCreateUserId() {
+		return createUserId;
+	}
+
+	public void setCreateUserId(String createUserId) {
+		this.createUserId = createUserId;
+	}
+
+	public String getCreateUserName() {
+		return createUserName;
+	}
+
+	public void setCreateUserName(String createUserName) {
+		this.createUserName = createUserName;
+	}
+
+	public String getParentPKFieldName() {
+		return null;
+	}
+
+	public String getClouddStatus() {
+		return cloudStatus;
+	}
+
+	public void setCloudStatus(String cloudStatus) {
+		this.cloudStatus = cloudStatus;
+	}
+
+	public String getPKFieldName() {
+		return "pk_cloud";
+	}
+
+	public String getTableName() {
+		return "cloud_psndoc";
+	}
+}

+ 220 - 0
hrhi/src/public/nc/vo/hi/cloud/train/CloudTrainingContentVO.java

@@ -0,0 +1,220 @@
+package nc.vo.hi.cloud.train;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.lang.UFDouble;
+
+/**
+ * 所有培训课程
+ * @author chenzf
+ * @date 2022-4-20 16:46:16
+ *
+ */
+public class CloudTrainingContentVO extends SuperVO {
+	private String pk_train_content;
+	private String contentId;//培训内容id
+	private String trainingId;//培训id
+	private String thirdSystemUserNo;//讲师第三方系统账号
+	private String userNo;//讲师员工编号
+	private String userId;//讲师账号
+	private String teacherName;//讲师名字
+	private String name;//课程名称
+	private UFDouble duration;//课程时长(小时)
+	private String startDateTime;//开始时间
+	private String endDateTime;//结束时间
+	private String contentType;//类型:0 线下课程 1 考试 2评价 3 签到 4 签退 (默认0)
+	private String catalogName;//课程类别
+	private UFDouble totalUser;//参加人数
+	private String teacherid;//讲师ID
+	private UFDouble avgscore;//考试/评价的平均成绩
+	private String courseDesc;//简介
+	private String courseDescText;//简介文本
+	private String libraryId;//课程ID (空为新建线下课)
+	private String trainningType;//培训类型(0:内训、1:外训、2:需求调查、3:新类型的独立调查项目、4:新类型的非独立调查项目、5:内训模版、6:混合式接入内训、7:岗位接入内训、8:认证中心接入内训)
+	private String startDate;//课程时间
+	@JsonProperty(value = "status")
+	private String trainStatus;//status线下培训状态 (0 待发布 1进行中 2 已归档)
+	private String ouCode;//创建人部门编号
+	private String userName;//创建人账号
+	
+	public static final String PK_TRAIN_CONTENT = "pk_train_content";
+	public static final String CONTENTID = "contentId";
+	public static final String TRAININGID = "trainingId";
+	public static final String THIRDSYSTEMUSERNO = "thirdSystemUserNo";
+	public static final String USERNO = "userNo";
+	public static final String USERID = "userId";
+	public static final String TEACHERNAME = "teacherName";
+	public static final String NAME = "name";
+	public static final String DURATION = "duration";
+	public static final String STARTDATETIME = "startDateTime";
+	public static final String ENDDATETIME = "endDateTime";
+	public static final String CONTENTTYPE = "contentType";
+	public static final String CATALOGNAME = "catalogName";
+	public static final String TOTALUSER = "totalUser";
+	public static final String TEACHERID = "teacherid";
+	public static final String AVGSCORE = "avgscore";
+	public static final String COURSEDESC = "courseDesc";
+	public static final String COURSEDESCTEXT = "courseDescText";
+	public static final String LIBRARYID = "libraryId";
+	public static final String TRAINNINGTYPE = "trainningType";
+	public static final String STARTDATE = "startDate";
+	public static final String TRAINSTATUS = "trainStatus";
+	public static final String OUCODE = "ouCode";
+	public static final String USERNAME = "userName";
+
+	public String getPk_train_content() {
+		return pk_train_content;
+	}
+	public void setPk_train_content(String pk_train_content) {
+		this.pk_train_content = pk_train_content;
+	}
+	public String getContentId() {
+		return contentId;
+	}
+	public void setContentId(String contentId) {
+		this.contentId = contentId;
+	}
+	public String getTrainingId() {
+		return trainingId;
+	}
+	public void setTrainingId(String trainingId) {
+		this.trainingId = trainingId;
+	}
+	public String getThirdSystemUserNo() {
+		return thirdSystemUserNo;
+	}
+	public void setThirdSystemUserNo(String thirdSystemUserNo) {
+		this.thirdSystemUserNo = thirdSystemUserNo;
+	}
+	public String getUserNo() {
+		return userNo;
+	}
+	public void setUserNo(String userNo) {
+		this.userNo = userNo;
+	}
+	public String getUserId() {
+		return userId;
+	}
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	public String getTeacherName() {
+		return teacherName;
+	}
+	public void setTeacherName(String teacherName) {
+		this.teacherName = teacherName;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public UFDouble getDuration() {
+		return duration;
+	}
+	public void setDuration(UFDouble duration) {
+		this.duration = duration;
+	}
+	public String getStartDateTime() {
+		return startDateTime;
+	}
+	public void setStartDateTime(String startDateTime) {
+		this.startDateTime = startDateTime;
+	}
+	public String getEndDateTime() {
+		return endDateTime;
+	}
+	public void setEndDateTime(String endDateTime) {
+		this.endDateTime = endDateTime;
+	}
+	public String getContentType() {
+		return contentType;
+	}
+	public void setContentType(String contentType) {
+		this.contentType = contentType;
+	}
+	public String getCatalogName() {
+		return catalogName;
+	}
+	public void setCatalogName(String catalogName) {
+		this.catalogName = catalogName;
+	}
+	public UFDouble getTotalUser() {
+		return totalUser;
+	}
+	public void setTotalUser(UFDouble totalUser) {
+		this.totalUser = totalUser;
+	}
+	public String getTeacherid() {
+		return teacherid;
+	}
+	public void setTeacherid(String teacherid) {
+		this.teacherid = teacherid;
+	}
+	public UFDouble getAvgscore() {
+		return avgscore;
+	}
+	public void setAvgscore(UFDouble avgscore) {
+		this.avgscore = avgscore;
+	}
+	public String getCourseDesc() {
+		return courseDesc;
+	}
+	public void setCourseDesc(String courseDesc) {
+		this.courseDesc = courseDesc;
+	}
+	public String getCourseDescText() {
+		return courseDescText;
+	}
+	public void setCourseDescText(String courseDescText) {
+		this.courseDescText = courseDescText;
+	}
+	public String getLibraryId() {
+		return libraryId;
+	}
+	public void setLibraryId(String libraryId) {
+		this.libraryId = libraryId;
+	}
+	public String getTrainningType() {
+		return trainningType;
+	}
+	public void setTrainningType(String trainningType) {
+		this.trainningType = trainningType;
+	}
+	public String getStartDate() {
+		return startDate;
+	}
+	public void setStartDate(String startDate) {
+		this.startDate = startDate;
+	}
+	public String getTrainStatus() {
+		return trainStatus;
+	}
+	public void setTrianStatus(String trainStatus) {
+		this.trainStatus = trainStatus;
+	}
+	public String getOuCode() {
+		return ouCode;
+	}
+	public void setOuCode(String ouCode) {
+		this.ouCode = ouCode;
+	}
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+	public String getParentPKFieldName() {
+		return null;
+	}
+	public String getPKFieldName() {
+		return "pk_train_content";
+	}
+
+	public String getTableName() {
+		return "cloud_train_content";
+	}
+}

+ 647 - 0
hrhi/src/public/nc/vo/hi/entrymng/EntryapplyVO.java

@@ -0,0 +1,647 @@
+package nc.vo.hi.entrymng;
+
+import nc.vo.pub.IVOMeta;
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.pub.lang.UFDateTime;
+import nc.vo.pub.lang.UFLiteralDate;
+import nc.vo.pubapp.pattern.model.meta.entity.vo.VOMetaFactory;
+
+public class EntryapplyVO extends SuperVO
+{
+	@Override
+	public IVOMeta getMetaData()
+	{
+		return VOMetaFactory.getInstance().getVOMeta("hrhi." + getTableName());
+	}
+	private String				pk_entryapply;
+	private String				pk_psnjob;
+	private String				pk_psndoc;
+	private String				bill_code;
+	private String				pk_group;
+	private String				pk_org;
+	private String				pk_hi_org;
+	private String				pk_billtype;
+	private Integer				approve_state;
+	private Integer				workflow_state;
+	private String				business_type;
+	private String				transtype;
+	private String				transtypeid;
+	private String				billmaker;
+	private UFLiteralDate		apply_date;
+	private String				approver;
+	private UFDateTime			approve_time;
+	private String				approve_note;
+	private String				memo;
+	private String				creator;
+	private UFDateTime			creationtime;
+	private String				modifier;
+	private UFDateTime			modifiedtime;
+	private Integer				dr				= 0;
+	private UFDateTime			ts;
+	private UFBoolean			issyncwork;
+	private UFBoolean			isneedfile;
+
+	public static final String	PK_ENTRYAPPLY	= "pk_entryapply";
+	public static final String	PK_PSNJOB		= "pk_psnjob";
+	public static final String	PK_PSNDOC		= "pk_psndoc";
+	public static final String	BILL_CODE		= "bill_code";
+	public static final String	PK_GROUP		= "pk_group";
+	public static final String	PK_ORG			= "pk_org";
+	public static final String	PK_HI_ORG		= "pk_hi_org";
+	public static final String	PK_BILLTYPE		= "pk_billtype";
+	public static final String	APPROVE_STATE	= "approve_state";
+	public static final String	WORKFLOW_STATE	= "workflow_state";
+	public static final String	BUSINESS_TYPE	= "business_type";
+	public static final String	TRANSTYPE		= "transtype";
+	public static final String	TRANSTYPEID		= "transtypeid";
+	public static final String	BILLMAKER		= "billmaker";
+	public static final String	APPLY_DATE		= "apply_date";
+	public static final String	APPROVER		= "approver";
+	public static final String	APPROVE_TIME	= "approve_time";
+	public static final String	APPROVE_NOTE	= "approve_note";
+	public static final String	MEMO			= "memo";
+	public static final String	CREATOR			= "creator";
+	public static final String	CREATIONTIME	= "creationtime";
+	public static final String	MODIFIER		= "modifier";
+	public static final String	MODIFIEDTIME	= "modifiedtime";
+	public static final String	ISSYNCWORK		= "issyncwork";
+
+	/**
+	 * 属性pk_entryapply的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getPk_entryapply()
+	{
+		return pk_entryapply;
+	}
+
+	/**
+	 * 属性pk_entryapply的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newpk_entryapply String
+	 */
+	public void setPk_entryapply(String newpk_entryapply)
+	{
+		this.pk_entryapply = newpk_entryapply;
+	}
+
+	/**
+	 * 属性pk_psnjob的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getPk_psnjob()
+	{
+		return pk_psnjob;
+	}
+
+	/**
+	 * 属性pk_psnjob的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newPk_psnjob String
+	 */
+	public void setPk_psnjob(String newPk_psnjob)
+	{
+		this.pk_psnjob = newPk_psnjob;
+	}
+
+	/**
+	 * 属性pk_psndoc的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getPk_psndoc()
+	{
+		return pk_psndoc;
+	}
+
+	/**
+	 * 属性pk_psndoc的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newPk_psndoc String
+	 */
+	public void setPk_psndoc(String newPk_psndoc)
+	{
+		this.pk_psndoc = newPk_psndoc;
+	}
+
+	/**
+	 * 属性bill_code的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getBill_code()
+	{
+		return bill_code;
+	}
+
+	/**
+	 * 属性bill_code的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newBill_code String
+	 */
+	public void setBill_code(String newBill_code)
+	{
+		this.bill_code = newBill_code;
+	}
+
+	/**
+	 * 属性pk_group的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getPk_group()
+	{
+		return pk_group;
+	}
+
+	/**
+	 * 属性pk_group的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newPk_group String
+	 */
+	public void setPk_group(String newPk_group)
+	{
+		this.pk_group = newPk_group;
+	}
+
+	/**
+	 * 属性pk_org的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getPk_org()
+	{
+		return pk_org;
+	}
+
+	/**
+	 * 属性pk_org的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newPk_org String
+	 */
+	public void setPk_org(String newPk_org)
+	{
+		this.pk_org = newPk_org;
+	}
+
+	/**
+	 * 属性pk_hi_org的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getPk_hi_org()
+	{
+		return pk_hi_org;
+	}
+
+	/**
+	 * 属性pk_hi_org的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newPk_hi_org String
+	 */
+	public void setPk_hi_org(String newPk_hi_org)
+	{
+		this.pk_hi_org = newPk_hi_org;
+	}
+
+	/**
+	 * 属性pk_billtype的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getPk_billtype()
+	{
+		return pk_billtype;
+	}
+
+	/**
+	 * 属性pk_billtype的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newPk_billtype String
+	 */
+	public void setPk_billtype(String newPk_billtype)
+	{
+		this.pk_billtype = newPk_billtype;
+	}
+
+	/**
+	 * 属性approve_state的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return Integer
+	 */
+	public Integer getApprove_state()
+	{
+		return approve_state;
+	}
+
+	/**
+	 * 属性approve_state的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newApprove_state Integer
+	 */
+	public void setApprove_state(Integer newApprove_state)
+	{
+		this.approve_state = newApprove_state;
+	}
+
+	/**
+	 * 属性business_type的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getBusiness_type()
+	{
+		return business_type;
+	}
+
+	/**
+	 * 属性business_type的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newBusiness_type String
+	 */
+	public void setBusiness_type(String newBusiness_type)
+	{
+		this.business_type = newBusiness_type;
+	}
+
+	/**
+	 * 属性billmaker的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getBillmaker()
+	{
+		return billmaker;
+	}
+
+	/**
+	 * 属性billmaker的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newbillmaker String
+	 */
+	public void setBillmaker(String newbillmaker)
+	{
+		this.billmaker = newbillmaker;
+	}
+
+	/**
+	 * 属性apply_date的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return UFDate
+	 */
+	public UFLiteralDate getApply_date()
+	{
+		return apply_date;
+	}
+
+	/**
+	 * 属性apply_date的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newApply_date UFDate
+	 */
+	public void setApply_date(UFLiteralDate newApply_date)
+	{
+		this.apply_date = newApply_date;
+	}
+
+	/**
+	 * 属性approver的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getApprover()
+	{
+		return approver;
+	}
+
+	/**
+	 * 属性approver的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newApprover String
+	 */
+	public void setApprover(String newApprover)
+	{
+		this.approver = newApprover;
+	}
+
+	/**
+	 * 属性approve_time的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return UFDate
+	 */
+	public UFDateTime getApprove_time()
+	{
+		return approve_time;
+	}
+
+	/**
+	 * 属性approve_time的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newApprove_time UFDate
+	 */
+	public void setApprove_time(UFDateTime newApprove_time)
+	{
+		this.approve_time = newApprove_time;
+	}
+
+	/**
+	 * 属性approve_note的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getApprove_note()
+	{
+		return approve_note;
+	}
+
+	/**
+	 * 属性approve_note的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newApprove_note String
+	 */
+	public void setApprove_note(String newApprove_note)
+	{
+		this.approve_note = newApprove_note;
+	}
+
+	/**
+	 * 属性memo的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getMemo()
+	{
+		return memo;
+	}
+
+	/**
+	 * 属性memo的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newMemo String
+	 */
+	public void setMemo(String newMemo)
+	{
+		this.memo = newMemo;
+	}
+
+	/**
+	 * 属性creator的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getCreator()
+	{
+		return creator;
+	}
+
+	/**
+	 * 属性creator的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newCreator String
+	 */
+	public void setCreator(String newCreator)
+	{
+		this.creator = newCreator;
+	}
+
+	/**
+	 * 属性creationtime的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return UFDateTime
+	 */
+	public UFDateTime getCreationtime()
+	{
+		return creationtime;
+	}
+
+	/**
+	 * 属性creationtime的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newCreationtime UFDateTime
+	 */
+	public void setCreationtime(UFDateTime newCreationtime)
+	{
+		this.creationtime = newCreationtime;
+	}
+
+	/**
+	 * 属性modifier的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getModifier()
+	{
+		return modifier;
+	}
+
+	/**
+	 * 属性modifier的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newModifier String
+	 */
+	public void setModifier(String newModifier)
+	{
+		this.modifier = newModifier;
+	}
+
+	/**
+	 * 属性modifiedtime的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return UFDateTime
+	 */
+	public UFDateTime getModifiedtime()
+	{
+		return modifiedtime;
+	}
+
+	/**
+	 * 属性modifiedtime的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newModifiedtime UFDateTime
+	 */
+	public void setModifiedtime(UFDateTime newModifiedtime)
+	{
+		this.modifiedtime = newModifiedtime;
+	}
+
+	/**
+	 * 属性dr的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return Integer
+	 */
+	public Integer getDr()
+	{
+		return dr;
+	}
+
+	/**
+	 * 属性dr的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newDr Integer
+	 */
+	public void setDr(Integer newDr)
+	{
+		this.dr = newDr;
+	}
+
+	/**
+	 * 属性ts的Getter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return UFDateTime
+	 */
+	public UFDateTime getTs()
+	{
+		return ts;
+	}
+
+	/**
+	 * 属性ts的Setter方法.
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @param newTs UFDateTime
+	 */
+	public void setTs(UFDateTime newTs)
+	{
+		this.ts = newTs;
+	}
+
+	/**
+	 * <p>
+	 * 取得父VO主键字段.
+	 * <p>
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getParentPKFieldName()
+	{
+		return null;
+	}
+
+	/**
+	 * <p>
+	 * 取得表主键.
+	 * <p>
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getPKFieldName()
+	{
+		return "pk_entryapply";
+	}
+
+	/**
+	 * <p>
+	 * 返回表名称.
+	 * <p>
+	 * 创建日期:2009-12-11 09:15:17
+	 * 
+	 * @return String
+	 */
+	public String getTableName()
+	{
+		return "hi_entryapply";
+	}
+
+	/**
+	 * 按照默认方式创建构造子.
+	 * 创建日期:2009-12-11 09:15:17
+	 */
+	public EntryapplyVO()
+	{
+		super();
+	}
+
+	public String getTranstype()
+	{
+		return transtype;
+	}
+
+	public void setTranstype(String transtype)
+	{
+		this.transtype = transtype;
+	}
+
+	public void setTranstypeid(String transtypeid)
+	{
+		this.transtypeid = transtypeid;
+	}
+
+	public String getTranstypeid()
+	{
+		return transtypeid;
+	}
+
+	public void setIssyncwork(UFBoolean issyncwork)
+	{
+		this.issyncwork = issyncwork;
+	}
+
+	public UFBoolean getIssyncwork()
+	{
+		return issyncwork;
+	}
+
+	public Integer getWorkflow_state() {
+		return workflow_state;
+	}
+
+	public void setWorkflow_state(Integer workflow_state) {
+		this.workflow_state = workflow_state;
+	}
+
+	public UFBoolean getIsneedfile() {
+		return isneedfile;
+	}
+
+	public void setIsneedfile(UFBoolean isneedfile) {
+		this.isneedfile = isneedfile;
+	}
+}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1084 - 0
hrhi/src/public/nc/vo/hi/psndoc/TrainVO.java