Explorar o código

hrzz模块代码改造

chenzhfa %!s(int64=3) %!d(string=hai) anos
pai
achega
a63a8966f8

+ 20 - 0
hrzz/.classpath

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="hrzz/classes" path="hrzz/src/public"/>
+	<classpathentry kind="src" output="hrzz/classes" path="hrzz/src/client"/>
+	<classpathentry kind="src" output="hrzz/classes" path="hrzz/src/private"/>
+	<classpathentry kind="src" output="hrzz/classes" path="hrzz/resources"/>
+	<classpathentry kind="src" output="hrzz/classes" path="hrzz/src/test"/>
+	<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"/>
+	<classpathentry kind="con" path="nc.uap.mde.library.container/Product_Common_Library"/>
+	<classpathentry kind="con" path="nc.uap.mde.library.container/Middleware_Library"/>
+	<classpathentry kind="con" path="nc.uap.mde.library.container/Framework_Library"/>
+	<classpathentry kind="con" path="nc.uap.mde.library.container/Module_Public_Library"/>
+	<classpathentry kind="con" path="nc.uap.mde.library.container/Module_Client_Library"/>
+	<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 kind="output" path="bin"/>
+</classpath>

+ 5 - 0
hrzz/.module_prj

@@ -0,0 +1,5 @@
+#
+#Mon Jun 28 18:14:19 CST 2021
+module.name=hrzz
+bcp.manifest.ts=1624875009521
+module.defConfig=module.xml

+ 24 - 0
hrzz/.project

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>hrzz</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>nc.uap.mde.ModuleBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>nc.uap.mde.ModuleProjectNature</nature>
+		<nature>nc.uap.mde.BizCompProjectNature</nature>
+	</natures>
+</projectDescription>

+ 7 - 0
hrzz/META-INF/module.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="gb2312"?>
+<module name="hrzz">
+    <public>
+    </public>
+    <private>
+    </private>
+</module>

+ 55 - 0
hrzz/hrzz/src/client/nccloud/web/hryf/psninfoapprove/action/PsndocSubQueryPKAction.java

@@ -0,0 +1,55 @@
+package nccloud.web.hryf.psninfoapprove.action;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import nc.itf.hi.IPsndocQryService;
+import nc.md.model.IBean;
+import nc.vo.hi.psndoc.PsndocAggVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.BusinessRuntimeException;
+import nc.vo.pub.SuperVO;
+import nc.vo.uif2.LoginContext;
+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.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!");
+        }
+        String billId = param.getString("billId", null);
+
+        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();
+        Map<String,String> map = new HashMap();
+        map.put("subBillId", pk);
+        PsndocAggVO psndocAggVO = ServiceLocator.find(IPsndocQryService.class).queryPsndocVOByPk(billId, true, true);
+        map.put("psndocName", psndocAggVO.getParentVO().getName());
+        return map;
+    }
+}

+ 272 - 0
hrzz/hrzz/src/client/nccloud/web/hryf/psninfoapprove/action/PsninfoApproveDetailAction.java

@@ -0,0 +1,272 @@
+package nccloud.web.hryf.psninfoapprove.action;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.logging.Logger;
+import nc.hr.utils.ResHelper;
+import nc.itf.hr.infoset.IInfoSetQry;
+import nc.vo.hr.infoset.InfoSetVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.BusinessRuntimeException;
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.VOStatus;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.uif2.LoginContext;
+import nccloud.commons.lang.StringUtils;
+import nccloud.dto.hryf.appconf.AppConfItemVO;
+import nccloud.dto.hryf.appconf.AppConfSetVO;
+import nccloud.dto.hryf.psninfo.PsnInfoApproveVO;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.ui.config.PageTemplet;
+import nccloud.framework.web.ui.pattern.form.Form;
+import nccloud.framework.web.ui.pattern.grid.Grid;
+import nccloud.itf.hryf.appconf.IAppconfService;
+import nccloud.itf.hryf.psninfoapprove.IPsninfoApproveService;
+import nccloud.vo.hr.json.HRJsonUtils;
+import nccloud.web.hr.pub.HRCommonAction;
+import nccloud.web.hr.pub.HRNccTemplateUtils;
+import nccloud.web.hr.pub.HRNccUtils;
+import nccloud.web.hryf.psninfoapprove.util.PsninfoApproveUtils;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+
+/**
+ * 员工信息审核【详情】操作
+ * 
+ * @author tianxfc
+ *
+ */
+public class PsninfoApproveDetailAction extends HRCommonAction {
+	private static final String pageCode = "600920A0nccloud"; // 员工信息审核页面编码
+	private static final String areaCode = "psninfoappform"; // 员工信息审核详情表头模版id
+
+	private static final String tempAppCode = "60651010"; // 自助应用-人员自助应用-部门人员信息应用编码
+	private static final String tempPageCode = "60651010nccloud"; // 自助应用-人员自助应用-部门人员信息页面编码
+
+	@Override
+	public <T> Object execute(IRequest request, T para) throws Exception {
+		Map<String, Object> map = new HashMap<String, Object>();
+		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 请先选择人力资源组织! */);
+		}
+		String pk_psninfoapprove = param.getString("pk_psninfoapprove", null);
+		if (StringUtils.isEmpty(pk_psninfoapprove)) {
+			throw new BusinessException(ResHelper.getString("6008hrgx", "06008hrgx0007")/* @res "参数不能为空!" */);
+		}
+
+		// 查询员工信息审核vo
+		PsnInfoApproveVO vo = ServiceLocator.find(IPsninfoApproveService.class).queryByPk(pk_psninfoapprove);
+		if (vo == null) {
+			map.put("data", null);
+			return map;
+		}
+
+		// 信息集
+		String condition = " pk_infoset = '" + vo.getPk_infoset() + "'";
+		InfoSetVO[] infosets = ServiceLocator.find(IInfoSetQry.class).queryInfoSet(context, condition);
+		// 信息集编码
+		String infoset_code = null;
+		// 信息集名称
+		String infoset_name = null;
+		String vo_class_name = null;
+		if (infosets != null && infosets.length > 0) {
+			infoset_code = infosets[0].getInfoset_code();
+			infoset_name = infosets[0].getInfoset_name();
+			vo_class_name = infosets[0].getVo_class_name();
+		}
+		List<AppConfSetVO> appConflist = ServiceLocator.find(IAppconfService.class).queryAppConfSetVOByCond(pk_org, infoset_code);
+		if (appConflist == null || appConflist.isEmpty()) {
+			throw new BusinessException(ResHelper.getString("6008hrgx", "06008hrgx0027")
+			/* @res "个人信息项配置数据为空!" */);
+		}
+		// 获取个人信息模版
+		PageTemplet pt = PsninfoApproveUtils.getPageTemplet(tempAppCode, tempPageCode);
+		pt = PsninfoApproveUtils.filteByAppConfSet(pt, pk_org, infoset_code);
+
+		// 组装要显示的信息集的信息项数据字典,key:信息项编码code, value:信息项的名称name
+		Map<String, String> codeMap = new HashMap<String, String>();
+		codeMap.put("status", ResHelper.getString("6008hrgx", "06008hrgx0028")
+		/* @res "变更类型" */);
+		// 修改前的信息集的数据集合
+		// List<Map<String, String>> oldvoList = new ArrayList<Map<String, String>>();
+		// 修改后的信息集的数据集合
+		// List<Map<String, String>> newvoList = new ArrayList<Map<String, String>>();
+
+		List<AppConfItemVO> itemList = appConflist.get(0).getItemList();
+		if (itemList == null || itemList.isEmpty()) {
+			throw new BusinessException(ResHelper.getString("6008hrgx", "06008hrgx0027")
+			/* @res "个人信息项配置数据为空!" */);
+		}
+		for (AppConfItemVO itemvo : itemList) {
+			UFBoolean entry_card_show_edit = itemvo.getEntry_card_show_edit() == null ? UFBoolean.FALSE : itemvo.getEntry_card_show_edit();
+			UFBoolean unentry_card_show_edit = itemvo.getUnentry_card_show_edit() == null ? UFBoolean.FALSE : itemvo.getUnentry_card_show_edit();
+			UFBoolean manager_card_show = itemvo.getManager_card_show() == null ? UFBoolean.FALSE: itemvo.getManager_card_show();
+
+			if (entry_card_show_edit.booleanValue() || unentry_card_show_edit.booleanValue() || manager_card_show.booleanValue()) {
+				if (!codeMap.containsKey(itemvo.getInfoset_item_code())) {
+					codeMap.put(itemvo.getInfoset_item_code(), itemvo.getInfoset_item_name());
+				}
+			}
+		}
+		Class<?> clazzVO = null;
+		try {
+			clazzVO = Class.forName(vo_class_name);
+		} catch (ClassNotFoundException ex) {
+			Logger.error(ex);
+		}
+		// IJson json = JsonFactory.create();
+
+		Form oldPsndocForm = null;
+		Form newPsndocForm = null;
+		Grid oldGrid = null;
+		String oldValue = null;
+		if (vo.getOldvalue() != null) {
+			byte[] old = (byte[]) vo.getOldvalue();
+			oldValue = new String(old);
+			if (StringUtils.isNotEmpty(oldValue) && !"[null]".equals(oldValue)) {
+				// 如果是人员基本信息
+				if ("bd_psndoc".equals(infoset_code)) {
+					// res = json2map(oldValue);
+					SuperVO superVO = HRJsonUtils.fromJson(oldValue, clazzVO);
+					// 组装要显示的信息集的信息项数据字典,key:信息项编码code, value:信息项的值value
+					Map<String, String> valueMap = new HashMap<String, String>();
+					String[] attrs = superVO.getAttributeNames();
+					for (String code : attrs) {
+						if (codeMap.containsKey(code)) {
+							if (superVO.getAttributeValue(code) != null) {
+								valueMap.put(code, superVO.getAttributeValue(code).toString());
+							}
+						}
+					}
+					// oldvoList.add(valueMap);
+					oldPsndocForm = HRNccTemplateUtils.getFormWithArea(tempAppCode, tempPageCode, infoset_code, superVO);
+				} else {
+					// 如果是人员基本信息子集
+					List<SuperVO> oldSubVOList = new ArrayList<SuperVO>();
+					if (StringUtils.isNotEmpty(oldValue)) {
+						JSONArray jsonArray = (JSONArray) JSONArray.parse(oldValue);
+						if (jsonArray != null && jsonArray.size() > 0) {
+							for (Object obj : jsonArray) {
+								if (obj != null) {
+									JSONObject jo = (JSONObject) obj;
+									String joStr = jo.toString();
+									SuperVO superVO = HRJsonUtils.fromJson(joStr, clazzVO);
+									oldSubVOList.add(superVO);
+								}
+							}
+						}
+					}
+					if (oldSubVOList != null && !oldSubVOList.isEmpty()) {
+						SuperVO[] chgedVOs = filterOldNoChangVO(oldSubVOList.toArray(new SuperVO[0]));
+						if(chgedVOs!=null&&chgedVOs.length>0){
+							oldGrid = HRNccTemplateUtils.getGridWithArea(tempAppCode, tempPageCode, infoset_code,chgedVOs);
+						}
+					}
+				}
+
+			}
+		}
+
+		Grid newGrid = null;
+		String newValue = null;
+		if (vo.getNewvalue() != null) {
+			byte[] newb = (byte[]) vo.getNewvalue();
+			newValue = new String(newb);
+			if (StringUtils.isNotEmpty(newValue) || !"[null]".equals(newValue)) {
+				if ("bd_psndoc".equals(infoset_code)) {
+					// 如果是人员基本信息
+					// res = json2map(newValue);
+					SuperVO superVO = HRJsonUtils.fromJson(newValue, clazzVO);
+					// 组装要显示的信息集的信息项数据字典,key:信息项编码code, value:信息项的值value
+					Map<String, String> valueMap = new HashMap<String, String>();
+					String[] attrs = superVO.getAttributeNames();
+					// 人员基本信息新增和删除不做处理
+					valueMap.put("status", ResHelper.getString("6008hrgx", "06008hrgx0029")
+					/* @res "更新" */);
+					for (String code : attrs) {
+						if (codeMap.containsKey(code)) {
+							if (superVO.getAttributeValue(code) != null) {
+								valueMap.put(code, superVO.getAttributeValue(code).toString());
+							}
+						}
+					}
+					// newvoList.add(valueMap);
+					newPsndocForm = HRNccTemplateUtils.getFormWithArea(tempAppCode, tempPageCode, infoset_code, superVO);
+				} else {
+					// 如果是人员基本信息子集
+					List<SuperVO> newSubVOList = new ArrayList<SuperVO>();
+					if (StringUtils.isNotEmpty(newValue)) {
+						JSONArray jsonArray = (JSONArray) JSONArray.parse(newValue);
+						if (jsonArray != null && jsonArray.size() > 0) {
+							for (Object obj : jsonArray) {
+								if (obj != null) {
+									JSONObject jo = (JSONObject) obj;
+									String joStr = jo.toString();
+									SuperVO superVO = HRJsonUtils.fromJson(joStr, clazzVO);
+									newSubVOList.add(superVO);
+								}
+							}
+						}
+					}
+					if (newSubVOList != null && !newSubVOList.isEmpty()) {
+						SuperVO[] chgedVOs = filterNoChangVO(newSubVOList.toArray(new SuperVO[0]));
+						if(chgedVOs!=null&&chgedVOs.length>0){
+							newGrid = HRNccTemplateUtils.getGridWithArea(tempAppCode, tempPageCode, infoset_code, chgedVOs);
+						}
+					}
+				}
+			}
+		}
+		vo.setOldvalue(null);
+		vo.setNewvalue(null);
+		Form form = HRNccTemplateUtils.getFormWithArea(pageCode, areaCode, vo);
+		map.put("headform", form);
+		map.put("ptArea", pt);
+		map.put("infoset_code", infoset_code);
+		map.put("infoset_name", infoset_name);
+
+		Map<String, Form> formMap = new HashMap<String, Form>();
+		formMap.put("oldForm", oldPsndocForm);
+		formMap.put("newForm", newPsndocForm);
+		map.put("formMap", formMap);
+
+		Map<String, Grid> gridMap = new HashMap<String, Grid>();
+		gridMap.put("oldGrid", oldGrid);
+		gridMap.put("newGrid", newGrid);
+		map.put("gridMap", gridMap);
+		return map;
+	}
+	
+	//过滤掉没变化的数据
+	private SuperVO[] filterNoChangVO(SuperVO[] vos) {
+		List<SuperVO> list = new ArrayList<>();
+		for(int i=0;vos!=null&&i<vos.length;i++){
+			if(vos[i].getStatus()==VOStatus.UNCHANGED){
+				continue;
+			}
+			list.add(vos[i]);
+		}
+		return list.toArray(new SuperVO[0]);
+	}
+	
+	//过滤掉没变化的数据
+	private SuperVO[] filterOldNoChangVO(SuperVO[] vos) {
+		List<SuperVO> list = new ArrayList<>();
+		for(int i=0;vos!=null&&i<vos.length;i++){
+//			if(vos[i].getStatus()==VOStatus.UNCHANGED){
+//				continue;
+//			}
+			list.add(vos[i]);
+		}
+		return list.toArray(new SuperVO[0]);
+	}
+}

+ 224 - 0
hrzz/hrzz/src/client/nccloud/web/hrzz/psninfo/action/PsninfoQueryAction.java

@@ -0,0 +1,224 @@
+package nccloud.web.hrzz.psninfo.action;
+
+import nc.hr.utils.HRFileUtils;
+import nc.hr.utils.ResHelper;
+import nc.itf.bd.pubinfo.IPubinfoService;
+import nc.itf.hi.IPsndocQryService;
+import nc.itf.hr.frame.IPersistenceRetrieve;
+import nc.itf.hr.frame.IPersistenceUpdate;
+import nc.vo.bd.address.AddressVO;
+import nc.vo.hi.psndoc.PsndocAggVO;
+import nc.vo.hi.psndoc.PsndocVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.BusinessRuntimeException;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.uif2.LoginContext;
+import nccloud.commons.lang.ArrayUtils;
+import nccloud.commons.lang.StringUtils;
+import nccloud.dto.hryf.psninfo.PsnInfoApproveCheckEnum;
+import nccloud.dto.hryf.psninfo.PsnInfoApproveVO;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.json.JsonFactory;
+import nccloud.itf.hryf.psninfoapprove.IPsninfoApproveService;
+import nccloud.itf.hrzz.pub.HRZZConst;
+import nccloud.web.hr.pub.HRCommonAction;
+import nccloud.web.hr.pub.HRNccTemplateUtils;
+import nccloud.web.hr.pub.HRNccUtils;
+import nccloud.web.hrzz.pub.util.HrzzPubUtils;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 个人信息填写功能-【人员基本信息-查询】操作
+ * 
+ * @author tianxfc
+ */
+public class PsninfoQueryAction extends HRCommonAction {
+
+	@Override
+	public <T> Object execute(IRequest request, T para) throws Exception {
+		ParamUtils param = new ParamUtils(request);
+		LoginContext context = HRNccUtils.getLoginContext(param);
+		// 获取用户ID
+		String cuserid = context.getPk_loginUser();
+		if (StringUtils.isEmpty(cuserid)) {
+			throw new BusinessRuntimeException(ResHelper.getString("6065hrzz",
+					"06065hrzz0016")/* @res "用户ID不能为空!" */);
+		}
+		// 获取人员信息
+		PsndocAggVO psndocAgg = null;
+		String pk_psndoc = param.getString("pk_psndoc", null);
+		String areaCode = param.getString("areaCode", null);
+		boolean isTeam ;
+		if (StringUtils.isNotBlank(pk_psndoc)) {// pk_psndoc有值 表示是在我的团队中查看团队成员信息
+			psndocAgg = ServiceLocator.find(IPsndocQryService.class).queryPsndocVOByPk(pk_psndoc);
+			isTeam = true;
+		} else { // 查看自己的信息
+			psndocAgg = HrzzPubUtils.queryPsndocByUserID(cuserid);
+			isTeam = false;
+		}
+		if (psndocAgg == null) {
+			throw new BusinessRuntimeException(ResHelper.getString("6065hrzz",
+					"06065hrzz0015")/* @res "没有找到对应的人员信息!" */);
+		}
+		PsndocVO psndocVO = psndocAgg.getParentVO();
+		// 计算人员类别:1:在职人员;2:未入职人员; 3:我的团队
+		int psntype = -1;
+		if (StringUtils.isNotBlank(pk_psndoc)) {
+			psntype = 3;
+		} else {
+			// 根据是否已转档判断是否在职人员
+			UFBoolean indocFlag = psndocVO.getPsnOrgVO() == null ? null : psndocVO.getPsnOrgVO().getIndocflag();
+			psntype = indocFlag != null && indocFlag.booleanValue() ? 1 : 2;
+			pk_psndoc = psndocVO.getPk_psndoc();
+		}
+		// 取人员所属组织
+		String pk_org = psndocVO.getPsnJobVO().getPk_hrorg();
+		// 合并我的待审核的信息
+		Map<String, String> hasSubmitMap = mergeSubmitInfos(pk_org, psndocVO);
+		boolean hasSubmit = UFBoolean.valueOf((String) hasSubmitMap.get("mergeSubmit")).booleanValue();
+		// 返回结果
+		Map<String, Object> retMap = new HashMap<String, Object>();
+		if (!hasSubmit) {
+			Map<String, String> valiMap = getCheckstatus(pk_org, psndocVO);
+			if (null != valiMap && !valiMap.isEmpty()) {
+				String isapproved = valiMap.get("isapproved");
+				if (null != isapproved && "Y".equals(isapproved)) {
+					// 返回是否已审核标识:isapproved :Y-审核通过 N-审核不通过
+					retMap.put("isapproved", "Y");
+				} else if (null != isapproved && "N".equals(isapproved)) {
+					retMap.put("isapproved", "N");
+				}
+				// 个人信息审核数据主键
+				retMap.put("pk_psninfoapprove", valiMap.get("pk_psninfoapprove"));
+				// 审核信息
+				retMap.put("checknote", valiMap.get("checknote"));
+			}
+		} else {
+			if (psntype != 3) {
+				retMap.put("pk_psninfoapprove", (String) hasSubmitMap.get("pk_psninfoapprove"));
+			}
+		}
+		psndocVO.setPhoto(null);
+	
+		retMap.put("bd_psndoc", HRNccTemplateUtils.getFormWithArea(HRZZConst.APPCODE_DEPTPSNINFO,
+				HRZZConst.PAGECODE_DEPTPSNINFO, PsndocVO.getDefaultTableName(), psndocVO));
+		retMap.put("isedit", UFBoolean.valueOf(psntype != 3 && !hasSubmit).toString()); // 查本人信息且没有待审核时可编辑
+		retMap.put("isneedapp", UFBoolean.valueOf(hasSubmit).toString());
+		
+		//返回子表审核信息
+		Map<String, Object> voMap = ServiceLocator.find(IPsninfoApproveService.class).queryPsnInfoByTableCode(areaCode, psndocVO.getPk_psndoc(), isTeam);
+		retMap.put("submitPsnInfos",voMap.get("submitPsnInfos"));
+		//由于家庭地址审核问题,这里先复制一条数据,如果存在家庭地址修改则进行审核,审核通过后更新这条旧的数据
+		if (psndocVO.getAddr() != null) {
+			AddressVO addressVO = (AddressVO) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByPk(null, AddressVO.class, psndocVO.getAddr());
+			AddressVO tempVO = (AddressVO) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByPk(null, AddressVO.class, psndocVO.getAddr().substring(0, 16) + "ABCD");
+			if (addressVO != null) {
+				if (tempVO == null && addressVO.getPk_address() != null) {
+					addressVO.setPk_address(addressVO.getPk_address().substring(0, 16) + "ABCD");
+					addressVO.setStatus(2);
+					ServiceLocator.find(IPubinfoService.class).update(addressVO);
+				}
+			} else {
+				if (!hasSubmit) {
+					String whereCond = " pk_org = '" + pk_org
+							+ "' and checkstatus = 1 and pk_infoset = '1002Z7100000000046GP' and pk_psndoc = '"
+							+ psndocVO.getPk_psndoc() + "' order by ts desc ";
+					PsnInfoApproveVO[] approveVOs = ServiceLocator.find(IPsninfoApproveService.class).queryByCondition(whereCond);
+					if (approveVOs != null && approveVOs.length > 0) {
+						String psnInfo = new String((byte[]) approveVOs[0].getNewvalue());
+						PsndocVO newPsndocVO = JsonFactory.create().fromJson(psnInfo, PsndocVO.class);
+						if (newPsndocVO.getAddr() != null) {
+							ServiceLocator.find(IPersistenceUpdate.class).deleteVO(null, tempVO, null);
+							addressVO.setPk_address(addressVO.getPk_address().substring(0, 16) + "ABCD");
+							addressVO.setStatus(2);
+							ServiceLocator.find(IPubinfoService.class).update(addressVO);
+						}
+					}
+				}
+			}
+		}
+		return retMap;
+	}
+
+	/**
+	 *
+	 * @param pk_org
+	 * @param psndocVO
+	 * @return
+	 * @throws BusinessException
+	 */
+	private Map<String, String> getCheckstatus(String pk_org, PsndocVO psndocVO) throws BusinessException {
+		Map<String, String> retMap = new HashMap<String, String>();
+		// readstatus:预览状态 0-未读 1-已读
+		String whereCond = " pk_org = '" + pk_org
+				+ "' and checkstatus <> 0 and readstatus <> 1 and pk_infoset = '1002Z7100000000046GP' and pk_psndoc = '"
+				+ psndocVO.getPk_psndoc() + "' order by ts desc ";
+		PsnInfoApproveVO[] vos = ServiceLocator.find(IPsninfoApproveService.class).queryByCondition(whereCond);
+		if (ArrayUtils.isEmpty(vos) || vos[0].getNewvalue() == null) {
+			return null;
+		}
+		// 审核通过 并且 未读状态 返回isapproved 等于Y,如果是通过且已读,就不再返回【 预览状态 0-未读 1-已读】
+		if (PsnInfoApproveCheckEnum.CHECK_SUCCESS.getIndex() == vos[0].getCheckstatus() ) {
+			retMap.put("isapproved", "Y");
+		} // 审核不通过
+		else if (PsnInfoApproveCheckEnum.CHECK_FAIL.getIndex() == vos[0].getCheckstatus()) {
+			retMap.put("isapproved", "N");
+		}
+		retMap.put("checknote", vos[0].getChecknote());
+		retMap.put("pk_psninfoapprove", vos[0].getPk_psninfoapprove());
+		return retMap;
+	}
+
+	/**
+	 * 合并已提交的基本信息
+	 * 
+	 * @param pk_org
+	 * @param psndocVO
+	 * @return 是否有待审核的信息
+	 * @throws BusinessException
+	 */
+	private Map<String, String> mergeSubmitInfos(String pk_org, PsndocVO psndocVO) throws BusinessException {
+		Map<String, String> retMap = new HashMap<String, String>();
+		String whereCond = " pk_org = '" + pk_org
+				+ "' and checkstatus = 0 and pk_infoset = '1002Z7100000000046GP' and pk_psndoc = '"
+				+ psndocVO.getPk_psndoc() + "'";
+		PsnInfoApproveVO[] approveVOs = ServiceLocator.find(IPsninfoApproveService.class).queryByCondition(whereCond);
+		if (ArrayUtils.isEmpty(approveVOs) || approveVOs[0].getNewvalue() == null) {
+			retMap.put("mergeSubmit", "N");
+			return retMap;
+		}
+		String psnInfo = new String((byte[]) approveVOs[0].getNewvalue());
+		PsndocVO newPsndocVO = JsonFactory.create().fromJson(psnInfo, PsndocVO.class);
+		if (newPsndocVO == null) {
+			retMap.put("mergeSubmit", "N");
+			return retMap;
+		}
+		retMap.put("pk_psninfoapprove", approveVOs[0].getPk_psninfoapprove());
+		newPsndocVO.setPhoto(null);
+		// 拷贝至原vo中
+		String[] attrs = psndocVO.getAttributeNames();
+		for (String attr : attrs) {
+			if (PsndocVO.PK_PSNDOC.equals(attr) || "status".equals(attr)) {
+				continue;
+			}
+			if (newPsndocVO.getAttributeValue(attr) == null) {
+				continue;
+			}
+			if ("photo".equals(attr) && newPsndocVO.getPhoto() != null) {
+				if (newPsndocVO.getPhoto().equals("cleanphoto")) {
+					newPsndocVO.setPhoto(null);
+				} else {
+					newPsndocVO.setPhoto(HRFileUtils.base64Decode(newPsndocVO.getPhoto().toString()));
+				}
+			}
+			psndocVO.setAttributeValue(attr, newPsndocVO.getAttributeValue(attr));
+		}
+		retMap.put("mergeSubmit", "Y");
+		return retMap;
+	}
+
+}

+ 134 - 0
hrzz/hrzz/src/client/nccloud/web/hrzz/psninfo/action/PsninfoSaveAction.java

@@ -0,0 +1,134 @@
+package nccloud.web.hrzz.psninfo.action;
+
+import nc.bs.logging.Logger;
+import nc.hr.utils.HRFileUtils;
+import nc.hr.utils.ResHelper;
+import nc.itf.hi.IPsndocQryService;
+import nc.md.model.IBean;
+import nc.vo.hi.psndoc.PsndocAggVO;
+import nc.vo.hi.psndoc.PsndocVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.BusinessRuntimeException;
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.VOStatus;
+import nc.vo.uif2.LoginContext;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.container.IRequest;
+import nccloud.itf.hryf.psninfoapprove.IPsninfoApproveService;
+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.hrzz.psninfo.util.PsndocValidator;
+import nccloud.web.hrzz.pub.util.HrzzPubUtils;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+import nccloud.commons.lang.StringUtils;
+
+/**
+ * 个人信息填写功能-【保存】操作
+ *
+ * @author tianxfc
+ */
+public class PsninfoSaveAction extends HRCommonAction {
+
+	@Override
+	public <T> Object execute(IRequest request, T para) throws Exception {
+		ParamUtils param = new ParamUtils(request);
+		LoginContext context = HRNccUtils.getLoginContext(param);
+		// 获取区域编码:区域编码和信息集编码、信息集对应的表名code一致
+		String strTabCode = param.getString("areaCode", null);
+		if (StringUtils.isEmpty(strTabCode)) {
+			throw new BusinessRuntimeException(ResHelper.getString("6065hrzz",
+					"06065hrzz0017")/* @res "区域编码不能为空!" */);
+		}
+		String needCheckStr = param.getString("needCheck", "Y");
+		boolean needCheck = "Y".equals(needCheckStr);
+		IBean bean = MetaDataUtils.getBeanByFullName("hrhi." + strTabCode);
+		Class<?> clazzVO = null;
+		try {
+			clazzVO = Class.forName(bean.getFullClassName());
+		} catch (ClassNotFoundException ex) {
+			Logger.error(ex);
+		}
+		PsndocAggVO psndocAgg = HrzzPubUtils.queryPsndocByUserID(context.getPk_loginUser());
+		if (psndocAgg == null) {
+			throw new BusinessRuntimeException(ResHelper.getString("6065hrzz",
+					"06065hrzz0018")/* @res "未找到用户对应的人员基本信息!" */);
+		}
+
+		PsndocVO oldPsndocVO = psndocAgg.getParentVO();
+		String pk_org = oldPsndocVO.getPsnJobVO().getPk_hrorg();
+		context.setPk_org(pk_org);
+		String modelStr = PsndocTempUtils.getModelStr(param, strTabCode);
+		if (StringUtils.isBlank(modelStr)) {
+			throw new BusinessRuntimeException(ResHelper.getString("6065hrzz",
+					"06065hrzz0019")/* @res "数据不能为空!" */);
+		}
+		// 修改人员基本信息
+		String checkInfo = null;
+		if (PsndocVO.getDefaultTableName().equals(strTabCode)) {
+			PsndocVO psndocVO = HRNccTemplateUtils.getVOFromForm(PsndocVO.class, modelStr);
+			resetPhoto(param, psndocVO, oldPsndocVO);
+			checkInfo = ServiceLocator.find(IPsninfoApproveService.class).savePsndocVO(pk_org, psndocVO, needCheck);
+		} else {
+			SuperVO[] subVOs = (SuperVO[]) HRNccTemplateUtils.getVOFromGrid(clazzVO, modelStr);
+			// 如果子集数据未做修改保存时直接返回,不做处理
+			if (subVOs != null && subVOs.length > 0) {
+				boolean changeflag = false;
+				for (int i = 0; i < subVOs.length; i++) {
+					if (VOStatus.UNCHANGED != subVOs[i].getStatus()) {
+						changeflag = true;
+					}
+				}
+				if (!changeflag) {
+					return null;
+				}
+			}
+			psndocAgg.setTableVO(strTabCode, subVOs);
+			new PsndocValidator().validate(psndocAgg);
+			checkInfo = ServiceLocator.find(IPsninfoApproveService.class).savePsnSubInfo(pk_org, oldPsndocVO, subVOs,
+					needCheck);
+		}
+		return StringUtils.isNotBlank(checkInfo) ? ResHelper.getString("6065hrzz", "06065hrzz0020")
+				/* @res "保存的信息需要审核,是否继续?" */ : null;
+	}
+
+	/**
+	 * 重置人员头像
+	 *
+	 * @param param
+	 * @param psndocVO
+	 */
+	private void resetPhoto(ParamUtils param, PsndocVO psndocVO, PsndocVO oldPsndocVO) {
+		// 获取头像是否修改标识,Y:修改;N:未修改
+		String isPhotoChange = param.getString("isphotochange", "N");
+		if (!"Y".equals(isPhotoChange)) {
+			PsndocAggVO psndocAggVO = null;
+			try {
+				psndocAggVO = ServiceLocator.find(IPsndocQryService.class).queryPsndocVOByPk(oldPsndocVO.getPk_psndoc(), true, true);
+			} catch (BusinessException e) {
+				e.printStackTrace();
+			}
+			if(psndocVO!=null&&psndocAggVO!=null&&psndocAggVO.getParentVO()!=null){
+				psndocVO.setPhoto(psndocAggVO.getParentVO().getPhoto());
+				psndocVO.setPreviewphoto(oldPsndocVO.getPreviewphoto());
+			}
+			return;
+		}
+		String image = param.getString("image", null);
+		if (StringUtils.isBlank(image)) {
+			// 删除头像,存储cleanphoto标识用
+			String cleanphoto = "cleanphoto";
+			psndocVO.setPhoto(cleanphoto.getBytes());
+			psndocVO.setPreviewphoto(null);
+			return;
+		}
+		// 去掉头像base64流的前缀image/png;base64,
+		if (image.split(",") != null && image.split(",").length > 1) {
+			image = image.split(",")[1];
+			byte[] b = HRFileUtils.base64Decode(image);
+			psndocVO.setPhoto(b);
+		}
+	}
+}

+ 33 - 0
hrzz/hrzz/src/client/yyconfig/modules/hrtrn/psninfoapprove/config/action/psninfoapprove.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<actions>
+	<action>
+		<name>hryf.psninfoapprove.PsninfoApproveQueryAction</name>
+		<label>员工信息审核【查询】操作</label>
+		<clazz>nccloud.web.hryf.psninfoapprove.action.PsninfoApproveQueryAction</clazz>
+	</action>
+	<action>
+		<name>hryf.psninfoapprove.PsninfoApproveDetailAction</name>
+		<label>员工信息审核【详情】操作</label>
+		<clazz>nccloud.web.hryf.psninfoapprove.action.PsninfoApproveDetailAction</clazz>
+	</action>
+	<action>
+		<name>hryf.psninfoapprove.PsninfoApproveDeleteAction</name>
+		<label>员工信息审核【删除】操作</label>
+		<clazz>nccloud.web.hryf.psninfoapprove.action.PsninfoApproveDeleteAction</clazz>
+	</action>
+	<action>
+		<name>hryf.psninfoapprove.PsninfoApproveAction</name>
+		<label>员工信息审核【审核】操作</label>
+		<clazz>nccloud.web.hryf.psninfoapprove.action.PsninfoApproveAction</clazz>
+	</action>
+	<action>
+		<name>hryf.psninfoapprove.BuildDataAction</name>
+		<label>员工信息设置-造数据工具接口</label>
+		<clazz>nccloud.web.hryf.psninfoapprove.action.BuildDataAction</clazz>
+	</action>
+	<action>
+        <name>hryf.psninfoapprove.PsndocSubQueryPKAction</name>
+        <label>查询子表行主键</label>
+        <clazz>nccloud.web.hryf.psninfoapprove.action.PsndocSubQueryPKAction</clazz>
+    </action>
+</actions>

+ 16 - 0
hrzz/hrzz/src/client/yyconfig/modules/hrtrn/psninfoapprove/config/authorize/psninfoapprove_authorize.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<authorizes>
+	<authorize>
+		<appcode>600920A0</appcode>
+		<actions>
+			<action>hryf.psninfoapprove.PsninfoApproveQueryAction</action>
+			<action>hryf.psninfoapprove.PsninfoApproveDetailAction</action>
+			<action>hryf.psninfoapprove.PsninfoApproveDeleteAction</action>
+			<action>hryf.psninfoapprove.PsninfoApproveAction</action>
+			
+			<action>hryf.psninfoapprove.BuildDataAction</action>
+			<action>hryf.psninfoapprove.PsndocSubQueryPKAction</action>
+		</actions>
+	</authorize>
+</authorizes>

+ 49 - 0
hrzz/hrzz/src/client/yyconfig/modules/hrzz/psninfo/config/action/psninfo.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<actions>
+	<action>
+		<name>hrzz.psninfo.PsninfoTempletQueryAction</name>
+		<label>个人信息填写功能-模版【查询】操作</label>
+		<clazz>nccloud.web.hrzz.psninfo.action.PsninfoTempletQueryAction</clazz>
+	</action>
+	<action>
+		<name>hrzz.psninfo.PsninfoQueryAction</name>
+		<label>个人信息填写功能-【人员基本信息-查询】操作</label>
+		<clazz>nccloud.web.hrzz.psninfo.action.PsninfoQueryAction</clazz>
+	</action>
+	<action>
+		<name>hrzz.psninfo.PsninfoPhotoQueryAction</name>
+		<label>个人信息填写功能-模版【人员头像-查询】操作</label>
+		<clazz>nccloud.web.hrzz.psninfo.action.PsninfoPhotoQueryAction</clazz>
+	</action>
+	<action>
+		<name>hrzz.psninfo.PsninfoSubQueryAction</name>
+		<label>个人信息填写功能-【子集-查询】操作</label>
+		<clazz>nccloud.web.hrzz.psninfo.action.PsninfoSubQueryAction</clazz>
+	</action>
+	<action>
+		<name>hrzz.psninfo.PsninfoSaveAction</name>
+		<label>个人信息填写功能-【保存】操作</label>
+		<clazz>nccloud.web.hrzz.psninfo.action.PsninfoSaveAction</clazz>
+	</action>
+	<action>
+		<name>hrzz.psninfo.PsninfoPercentAction</name>
+		<label>查询个人信息完成百分比操作</label>
+		<clazz>nccloud.web.hrzz.psninfo.action.PsninfoPercentAction</clazz>
+	</action>
+	
+	<action>
+		<name>hrzz.psninfo.PsninfoApproveRecallAction</name>
+		<label>个人信息未审核数据-【撤回删除】操作</label>
+		<clazz>nccloud.web.hrzz.psninfo.action.PsninfoApproveRecallAction</clazz>
+	</action>
+	<action>
+		<name>hrzz.psninfo.PsninfoApproveReadAction</name>
+		<label>个人信息已审核数据-【已读】操作</label>
+		<clazz>nccloud.web.hrzz.psninfo.action.PsninfoApproveReadAction</clazz>
+	</action>
+	<action>
+        <name>hrhi.psndoc.PsndocSubQueryPKAction</name>
+        <label>获取行主键</label>
+        <clazz>nccloud.web.hrhi.psndoc.action.PsndocSubQueryPKAction</clazz>
+    </action>
+</actions>

+ 18 - 0
hrzz/hrzz/src/client/yyconfig/modules/hrzz/psninfo/config/authorize/psninfo_authorize.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+
+<authorizes>
+	<authorize>
+		<appcode>60091060,60652010,60652020,60651040</appcode>
+		<actions>
+			<action>hrzz.psninfo.PsninfoTempletQueryAction</action>
+			<action>hrzz.psninfo.PsninfoQueryAction</action>
+			<action>hrzz.psninfo.PsninfoPhotoQueryAction</action>
+			<action>hrzz.psninfo.PsninfoSubQueryAction</action>
+			<action>hrzz.psninfo.PsninfoSaveAction</action>
+			<action>hrzz.psninfo.PsninfoPercentAction</action>
+			<action>hrzz.psninfo.PsninfoApproveRecallAction</action>
+			<action>hrzz.psninfo.PsninfoApproveReadAction</action>
+			<action>hrhi.psndoc.PsndocSubQueryPKAction</action>
+		</actions>
+	</authorize>
+</authorizes>

+ 21 - 0
hrzz/manifest.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Manifest>
+  <BusinessComponet name="hrzz" dispname="hrzz">
+    <public>
+      <src name="src/public"/>
+    </public>
+    <client>
+      <src name="src/client"/>
+    </client>
+    <private>
+      <src name="src/private"/>
+    </private>
+    <test>
+      <src name="src/test"/>
+    </test>
+    <resource>
+      <src name="resources"/>
+    </resource>
+    <funnodes/>
+  </BusinessComponet>
+</Manifest>