소스 검색

初始化hrbm

Timo 1 년 전
커밋
78ae614ef3

+ 6 - 0
.gitignore

@@ -0,0 +1,6 @@
+/out/
+/bin/
+.idea/
+*.iml
+*.classpath
+*.project

+ 13 - 0
Dtype/db2.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<module datatype='DB2V7'>
+<row><objtype>CHAR</objtype><objcode>C</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>VARCHAR</objtype><objcode>VC</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>SMALLINT</objtype><objcode>SI</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>INTEGER</objtype><objcode>I</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>FLOAT</objtype><objcode>FL</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>DECIMAL</objtype><objcode>NUM</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>TIMESTAMP</objtype><objcode>DATE</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>CLOB</objtype><objcode>TX</objcode><objscale>TRUE</objscale><objdefault>2M</objdefault></row>
+<row><objtype>BLOB</objtype><objcode>IMG</objcode><objscale>TRUE</objscale><objdefault>128M</objdefault></row>
+<row><objtype>TIMESTAMP</objtype><objcode>TS</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+</module>

+ 18 - 0
Dtype/mssql.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<module datatype='MSSQL7'>
+<row><objtype>CHAR</objtype><objcode>C</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>VARCHAR</objtype><objcode>VC</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>SMALLINT</objtype><objcode>SI</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>BIGINT</objtype><objcode>BI</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>INT</objtype><objcode>I</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>FLOAT</objtype><objcode>FL</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>DECIMAL</objtype><objcode>NUM</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NUMERIC</objtype><objcode>NUM</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>DATETIME</objtype><objcode>DATE</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>TEXT</objtype><objcode>TX</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>IMAGE</objtype><objcode>IMG</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NTEXT</objtype><objcode>IMG</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>TIMESTAMP</objtype><objcode>TS</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NCHAR</objtype><objcode>C</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NVARCHAR</objtype><objcode>VC</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+</module>  

+ 14 - 0
Dtype/oracle.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<module datatype='ORA817'>
+<row><objtype>CHAR</objtype><objcode>C</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>VARCHAR2</objtype><objcode>VC</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NUMBER</objtype><objcode>SI</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NUMBER</objtype><objcode>I</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NUMBER</objtype><objcode>BI</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>FLOAT</objtype><objcode>FL</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NUMBER</objtype><objcode>NUM</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>DATE</objtype><objcode>DATE</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>CLOB</objtype><objcode>TX</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>BLOB</objtype><objcode>IMG</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>TIMESTAMP</objtype><objcode>TS</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+</module>

+ 14 - 0
Dtype/postgre.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<module datatype='POSTGRE'>
+<row><objtype>CHAR</objtype><objcode>C</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>VARCHAR</objtype><objcode>VC</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>SMALLINT</objtype><objcode>SI</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>BIGINT</objtype><objcode>BI</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>INT</objtype><objcode>I</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NUMERIC</objtype><objcode>FL</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>NUMERIC</objtype><objcode>NUM</objcode><objscale>TRUE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>DATE</objtype><objcode>DATE</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>BYTEA</objtype><objcode>IMG</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>TIMESTAMP</objtype><objcode>TS</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+<row><objtype>TEXT</objtype><objcode>TX</objcode><objscale>FALSE</objscale><objdefault>NULL</objdefault></row>
+</module>  

+ 7 - 0
META-INF/module.xml

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

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 127 - 0
METADATA/bmdata.bmf


+ 58 - 0
ORACLE/00001/_table.sql

@@ -0,0 +1,58 @@
+create table bm_data (
+pk_bm_data char(20) NOT NULL,
+pk_psndoc varchar(20) default '~' NULL,
+pk_psnjob varchar(20) default '~' NULL,
+pk_psnorg varchar(20) NULL,
+assgid int NULL,
+pk_group varchar(20) NULL,
+pk_org varchar(20) NULL,
+pk_bm_class varchar(20) default '~' NULL,
+cyear char(4) NULL,
+cperiod char(2) NULL,
+caculateflag char(1) NULL,
+checkflag char(1) NULL,
+bmaccountno varchar(40) NULL,
+paylocation varchar(20) default '~' NULL,
+dbegindate char(10) NULL,
+accountstate char(50) NULL,
+accounttype char(1) NULL,
+vcancelreason varchar(500) NULL,
+pk_transferorg varchar(20) default '~' NULL,
+workorg varchar(20) default '~' NULL,
+workorgvid varchar(20) default '~' NULL,
+workdept varchar(20) default '~' NULL,
+workdeptvid varchar(20) default '~' NULL,
+pk_financeorg varchar(20) default '~' NULL,
+fiporgvid varchar(20) default '~' NULL,
+pk_financedept varchar(20) default '~' NULL,
+fipdeptvid varchar(20) default '~' NULL,
+pk_liabilityorg varchar(20) default '~' NULL,
+pk_liabilitydept varchar(20) default '~' NULL,
+libdeptvid varchar(20) default '~' NULL,
+pk_sourcecls varchar(20) default '~' NULL,
+glbdef1 varchar(101) NULL,
+glbdef2 varchar(101) NULL,
+glbdef3 varchar(101) NULL,
+glbdef4 varchar(101) NULL,
+glbdef5 varchar(101) NULL,
+glbdef6 varchar(101) NULL,
+glbdef7 varchar(101) NULL,
+glbdef8 varchar(101) NULL,
+glbdef9 varchar(101) NULL,
+glbdef10 varchar(101) NULL,
+glbdef11 varchar(101) NULL,
+glbdef12 varchar(101) NULL,
+glbdef13 varchar(101) NULL,
+glbdef14 varchar(101) NULL,
+glbdef15 varchar(101) NULL,
+glbdef16 varchar(101) NULL,
+glbdef17 varchar(101) NULL,
+glbdef18 varchar(101) NULL,
+glbdef19 varchar(101) NULL,
+glbdef20 varchar(101) NULL,
+CONSTRAINT PK_BM_DATA PRIMARY KEY (pk_bm_data),
+ts char(19) NULL,
+dr smallint default 0 
+)
+
+

+ 0 - 0
ORACLE/00002/_constraint.sql


+ 729 - 0
hrbm/src/client/nccloud/web/hrbm/bmdata/action/NewBmDataTempletUtils.java

@@ -0,0 +1,729 @@
+package nccloud.web.hrbm.bmdata.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import nc.bs.dao.BaseDAO;
+import nc.bs.dao.DAOException;
+import nc.bs.logging.Logger;
+import nc.hr.utils.ResHelper;
+import nc.itf.bm.bmdata.IBmdataQueryService;
+import nc.itf.hr.bm.IBmPub;
+import nc.itf.hr.frame.IPersistenceRetrieve;
+import nc.jdbc.framework.processor.ColumnProcessor;
+import nc.ui.hr.frame.persistence.PersitenceDelegator;
+import nc.vo.bd.util.StringUtil;
+import nc.vo.bm.bmclass.BmClassItemVO;
+import nc.vo.bm.data.BmDataVO;
+import nc.vo.bm.data.BmdataDspVO;
+import nc.vo.bm.data.BmdataShowInfVO;
+import nc.vo.bm.file.BmBaseDspVO;
+import nc.vo.bm.item.BmFromEnumVO;
+import nc.vo.bm.period.BmPeriodstateVO;
+import nc.vo.bm.pub.BmLoginContext;
+import nc.vo.bm.pub.BmLoginVO;
+import nc.vo.hr.combinesort.SortVO;
+import nc.vo.hr.combinesort.SortconVO;
+import nc.vo.hr.pub.YearPeriodSeperatorVO;
+import nc.vo.hr.tools.pub.HRAggVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.SuperVO;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.pub.lang.UFDouble;
+import nccloud.commons.collections.CollectionUtils;
+import nccloud.commons.lang.ArrayUtils;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.convert.pattern.FormConvertor;
+import nccloud.framework.web.convert.pattern.GridConvertor;
+import nccloud.framework.web.ui.config.Area;
+import nccloud.framework.web.ui.config.Item;
+import nccloud.framework.web.ui.config.PageTemplet;
+import nccloud.framework.web.ui.conver.DataTypeEnum;
+import nccloud.framework.web.ui.meta.ComponentType;
+import nccloud.framework.web.ui.meta.ItemOption;
+import nccloud.framework.web.ui.model.PageInfo;
+import nccloud.framework.web.ui.model.row.Cell;
+import nccloud.framework.web.ui.model.row.Row;
+import nccloud.framework.web.ui.pattern.form.Form;
+import nccloud.framework.web.ui.pattern.grid.Grid;
+import nccloud.web.hrbm.helper.BmTempletUtils;
+import org.apache.poi.ss.formula.functions.T;
+
+public class NewBmDataTempletUtils {
+    public static final String TEMPLET_TABLE = "60150bmdata_table";
+    public static final String TEMPLET_FORM = "60150bmdata_form";
+    public static final String AREA_HEAD = "bm_info";
+    public static final String AREA_STATE = "bm_state";
+    public static final String AREA_ITEM = "bm_item";
+    public static final String PSNCODE = "psncode";/* 人员编码 */
+    public static final String CLERKCODE = "clerkcode";/* 员工号 */
+    public static final String PSNNAME = "psnname";/* 姓名 */
+    public static final String PLSNAME = "plsname";/* 人员类别 */
+    public static final String ORGNAME = "orgname";/* 任职组织 */
+    public static final String DEPTNAME = "deptname";/* 所在部门 */
+    public static final String POSTNAME = "postname";/* 所在岗位 */
+    public static final String CLASSCODE = "classcode";/* 险种编码 */
+    public static final String CLASSNAME = "classname";/* 险种名称 */
+    public static final String CACULATEFLAG = "caculateflag";/* 计算标志 */
+    public static final String CHECKFLAG = "checkflag";/* 审核标志 */
+    public static final String CYEAR = "cyear";/* 年度 */
+    public static final String CPERIOD = "cperiod";/* 期间 */
+    public static final String FINANCEORGNAME = "financeorgname";/* 财务组织 */
+    public static final String FINANCEDEPTNAME = "financedeptname";/* 财务部门 */
+    public static final String LOCATIONNAME = "locationname";/* 缴交地 */
+    public static final String GLBDEF1 = "glbdef1";
+    public static final String GLBDEF2 = "glbdef2";
+    public static final String GLBDEF3 = "glbdef4";
+    public static final String GLBDEF4 = "glbdef4";
+    public static final String GLBDEF5 = "glbdef5";
+    public static final String GLBDEF6 = "glbdef6";
+    public static final String GLBDEF7 = "glbdef7";
+    public static final String GLBDEF8 = "glbdef8";
+    public static final String GLBDEF9 = "glbdef9";
+    public static final String GLBDEF10 = "glbdef10";
+
+    /**
+     * 获取列表模板
+     *
+     * @param context
+     * @param typeCode
+     * @return
+     */
+    public static PageTemplet getTableTemplet(BmLoginContext context) {
+        String templetName = ResHelper.getString("60150bmdata",
+                "160150bmdata0001")/* @res "社保缴交" */;
+        String clzName = BmDataVO.class.getName();
+        PageTemplet templet = BmTempletUtils.getDefaultTemplet(TEMPLET_TABLE, templetName, clzName, AREA_HEAD);
+        // 获取信息项
+        BmdataShowInfVO showInfo = queryShowInfo(context);
+        BmBaseDspVO[] dspVo = showInfo.getBmdataDspVOs();
+        List<Item> itemList = getBasicItems();
+        itemList.addAll(getStateItems());
+        List<Item> extList = getExtItems(showInfo.getBmClassItemVOs());
+        if (CollectionUtils.isNotEmpty(extList)) {
+            itemList.addAll(extList);
+        }
+        if (StringUtil.isNotEmpty(context.getPk_bm_class())) {
+            BmTempletUtils.adjustBySetting(itemList, dspVo);
+        } else {
+            BmTempletUtils.adjustBySetting(itemList, concat(queryFixedDsp(), dspVo));
+        }
+        // 创建区域
+        Area area = BmTempletUtils.createTableArea(AREA_HEAD, ResHelper.getString("common", "UC000-0000085"), clzName,
+                0, itemList);
+        templet.addArea(area);
+        return templet;
+    }
+
+    public static Grid getGridInfo(PageTemplet templet, PageInfo pageInfo, String[] allPKs, SuperVO[] vos) {
+        if (ArrayUtils.isEmpty(vos)) {
+            return null;
+        }
+        BaseDAO dao = new BaseDAO();
+        GridConvertor convertor = new GridConvertor();
+        Grid grid = convertor.toGrid(AREA_HEAD, vos);
+        grid.getModel().setPageinfo(pageInfo);
+        grid.getModel().setAllpks(allPKs);
+        Row[] rs = grid.getModel().getRows();
+        List<Item> itemList = BmTempletUtils.getTempletItems(templet);
+        // 逐行处理返回结果
+        for (int i = 0; i < rs.length; i++) {
+            // 清空原来的row
+            String[] names = rs[i].getCellNames();
+            for (String name : names) {
+                rs[i].removeCell(name);
+            }
+            if (CollectionUtils.isEmpty(itemList)) {
+                continue;
+            }
+            // 重新设置单元格
+            for (Item item : itemList) {
+                Cell cell = new Cell();
+                String code = item.getCode();
+                Object value = vos[i].getAttributeValue(code);
+
+                // 自定义字段1 ERP财务组织
+                try {
+                    if ("glbdef1".equals(code)) {
+                        String glbdef1 = (String) vos[i].getAttributeValue("glbdef1");
+                        String glbdef1Name = (String) dao.executeQuery(" SELECT name FROM BD_DEFDOC WHERE PK_DEFDOC = '"+glbdef1+"' ", new ColumnProcessor());
+                        cell.setDisplay(glbdef1Name);
+                    }
+                    // 自定义字段2 ERP财务部门
+                    if ("glbdef2".equals(code)) {
+                        String glbdef2 = (String) vos[i].getAttributeValue("glbdef2");
+                        String glbdef2Name = (String) dao.executeQuery(" SELECT name FROM BD_DEFDOC WHERE PK_DEFDOC = '"+glbdef2+"' ", new ColumnProcessor());
+                        cell.setDisplay(glbdef2Name);
+                    }
+                } catch (DAOException e) {
+                    e.printStackTrace();
+                }
+                // 数值型特殊处理
+                if (Integer.valueOf(DataTypeEnum.Number.value()).equals(item.getDatatype())) {
+                    if (value instanceof UFDouble) {
+                        UFDouble dbValue = (UFDouble) value;
+                        value = dbValue.setScale(-item.getScale(), UFDouble.ROUND_HALF_UP);
+                        cell.setScale(item.getScale());
+                    }
+                }
+                // 布尔型特殊处理
+                if (value instanceof UFBoolean
+                        || (Integer.valueOf(DataTypeEnum.Radio.value())).equals(item.getDatatype())) {
+                    boolean isTrue = value != null && ((UFBoolean) value).booleanValue();
+                    cell.setDisplay(
+                            isTrue ? ResHelper.getString("uif2", "AbstractDirectPrintAction-000000")/** @res "是" */
+                                    : ResHelper.getString("uif2", "AbstractDirectPrintAction-000001")/** @res "否" */
+                    );
+                }
+                cell.setValue(value);
+                rs[i].addCell(code, cell);
+            }
+        }
+        return grid;
+    }
+
+    public static Form getFormInfo(PageTemplet templet, SuperVO[] vos) {
+        FormConvertor convertor = new FormConvertor();
+        Form form = convertor.toForm(AREA_HEAD, vos[0]);
+        Row[] rs = form.getModel().getRows();
+
+        List<Item> itemList = BmTempletUtils.getTempletItems(templet);
+        // 逐行处理返回结果
+        for (int i = 0; i < rs.length; i++) {
+            // 清空原来的row
+            String[] names = rs[i].getCellNames();
+            for (String name : names) {
+                rs[i].removeCell(name);
+            }
+            if (CollectionUtils.isEmpty(itemList)) {
+                continue;
+            }
+            // 重新设置单元格
+            for (Item item : itemList) {
+                Cell cell = new Cell();
+                Object value = vos[i].getAttributeValue(item.getCode());
+                // 数值型特殊处理
+                if (Integer.valueOf(DataTypeEnum.Number.value()).equals(item.getDatatype())) {
+                    if (value instanceof UFDouble) {
+                        UFDouble dbValue = (UFDouble) value;
+                        value = dbValue.setScale(-item.getScale(), UFDouble.ROUND_HALF_UP);
+                        cell.setScale(item.getScale());
+                    }
+                }
+                // 布尔型特殊处理
+                if (value instanceof UFBoolean
+                        || (Integer.valueOf(DataTypeEnum.Radio.value())).equals(item.getDatatype())) {
+                    boolean isTrue = value != null && ((UFBoolean) value).booleanValue();
+                    cell.setDisplay(
+                            isTrue ? ResHelper.getString("uif2", "AbstractDirectPrintAction-000000")/** @res "是" */
+                                    : ResHelper.getString("uif2", "AbstractDirectPrintAction-000001")/** @res "否" */
+                    );
+                }
+                cell.setValue(value);
+                rs[i].addCell(item.getCode(), cell);
+            }
+        }
+        return form;
+    }
+
+    /**
+     * 获卡片模板
+     *
+     * @param context
+     * @param typeCode
+     * @return
+     */
+    public static PageTemplet getFormTemplet(BmLoginContext context, String pk_bm_data) {
+        if (StringUtil.isNotEmpty(context.getPk_bm_class())) {
+            String templetName = ResHelper.getString("60150bmdata",
+                    "160150bmdata0001")/* @res "社保缴交" */;
+            String clzName = BmDataVO.class.getName();
+            PageTemplet templet = BmTempletUtils.getDefaultTemplet(TEMPLET_FORM, templetName, clzName, AREA_HEAD);
+            // 获取显示配置
+            BmdataShowInfVO showInfo = queryShowInfo(context);
+            // 人员信息
+            List<Item> itemList = getBasicItems();
+            BmTempletUtils.adjustBySetting(itemList, showInfo == null ? null : showInfo.getBmdataDspVOs());
+            Area area = BmTempletUtils.createFormArea(AREA_HEAD, ResHelper.getString("60150bmdata", "060150bmdata0023"),
+                    clzName, 0, null, itemList);
+            if (area != null) {
+                templet.addArea(area);
+            }
+            // 状态信息
+            itemList = getStateItems();
+            BmTempletUtils.adjustBySetting(itemList, showInfo == null ? null : showInfo.getBmdataDspVOs());
+            area = BmTempletUtils.createFormArea(AREA_STATE, ResHelper.getString("60150bmdata", "060150bmdata0024"),
+                    clzName, 1, AREA_HEAD, itemList);
+            if (area != null) {
+                templet.addArea(area);
+            }
+            // 社保项目
+            itemList = getNewExtItems(pk_bm_data, showInfo == null ? null : showInfo.getBmClassItemVOs());
+            BmTempletUtils.adjustBySetting(itemList, showInfo == null ? null : showInfo.getBmdataDspVOs());
+            area = BmTempletUtils.createFormArea(AREA_ITEM, ResHelper.getString("60150bmdata", "060150bmdata0025"),
+                    clzName, 2, AREA_HEAD, itemList);
+            if (area != null) {
+                templet.addArea(area);
+            }
+            return templet;
+        } else {
+            String templetName = ResHelper.getString("60150bmdata",
+                    "160150bmdata0001")/* @res "社保缴交" */;
+            String clzName = BmDataVO.class.getName();
+            PageTemplet templet = BmTempletUtils.getDefaultTemplet(TEMPLET_FORM, templetName, clzName, AREA_HEAD);
+            // 获取显示配置
+            BmdataShowInfVO showInfo = queryShowInfo(context);
+            BmBaseDspVO[] dspVo = concat(queryFixedDsp(), showInfo.getBmdataDspVOs());
+            // 人员信息
+            List<Item> itemList = getBasicItems();
+            Area area = BmTempletUtils.createFormArea(AREA_HEAD, ResHelper.getString("60150bmdata", "060150bmdata0023"),
+                    clzName, 0, null, itemList);
+            templet.addArea(area);
+            // 状态信息
+            itemList = getStateItems();
+            BmTempletUtils.adjustBySetting(itemList, dspVo);
+            area = BmTempletUtils.createFormArea(AREA_STATE, ResHelper.getString("60150bmdata", "060150bmdata0024"),
+                    clzName, 1, AREA_HEAD, itemList);
+            templet.addArea(area);
+            // 社保项目
+            itemList = getNewExtItems(pk_bm_data, showInfo.getBmClassItemVOs());
+            BmTempletUtils.adjustBySetting(itemList, dspVo);
+            area = BmTempletUtils.createFormArea(AREA_ITEM, ResHelper.getString("60150bmdata", "060150bmdata0025"),
+                    clzName, 2, AREA_HEAD, itemList);
+            if (area != null) {
+                templet.addArea(area);
+            }
+            return templet;
+        }
+
+    }
+
+    /**
+     * 查询显示配置
+     *
+     * @param context
+     * @return
+     */
+    private static BmdataShowInfVO queryShowInfo(BmLoginContext context) {
+        BmdataShowInfVO<BmdataDspVO> info = null;
+        try {
+            info = ServiceLocator.find(IBmdataQueryService.class).getBmdataShowInfVO(context);
+        } catch (BusinessException e) {
+            Logger.error(e.getMessage());
+        }
+        return info;
+    }
+
+    /**
+     * 自定义信息项
+     *
+     * @return
+     */
+    private static List<Item> getExtItems(BmClassItemVO[] classItemVOs) {
+        if (ArrayUtils.isEmpty(classItemVOs)) {
+            return null;
+        }
+        List<Item> itemList = new ArrayList<Item>();
+        for (BmClassItemVO classItemVO : classItemVOs) {
+            Item item = BmTempletUtils.convert2Item(classItemVO);
+            if (classItemVO.getIfromflag().equals(BmFromEnumVO.USER_INPUT.value())) {
+                item.setDisabled(Boolean.FALSE);
+            } else {
+                item.setDisabled(Boolean.TRUE);
+            }
+            itemList.add(item);
+        }
+        return itemList;
+    }
+
+    /**
+     * 自定义信息项
+     *
+     * @return
+     */
+    private static List<Item> getNewExtItems(String pk_bm_data, BmClassItemVO[] classItemVOs) {
+        if (ArrayUtils.isEmpty(classItemVOs)) {
+            return null;
+        }
+        List<Item> itemList = new ArrayList<Item>();
+        if ("Disabled".equals(pk_bm_data)) {
+            for (BmClassItemVO classItemVO : classItemVOs) {
+                Item item = BmTempletUtils.convert2Item(classItemVO);
+                if (classItemVO.getIfromflag().equals(BmFromEnumVO.USER_INPUT.value())) {
+                    item.setDisabled(Boolean.FALSE);
+                } else {
+                    item.setDisabled(Boolean.TRUE);
+                }
+                itemList.add(item);
+            }
+        } else {
+            try {
+                String Pk_bm_class = ServiceLocator.find(IBmdataQueryService.class).queryByPk(pk_bm_data)
+                        .getPk_bm_class();
+                for (BmClassItemVO classItemVO : classItemVOs) {
+                    Item item = BmTempletUtils.convert2Item(classItemVO);
+                    if (Pk_bm_class.equals(classItemVO.getPk_bm_class())) {
+                        if (classItemVO.getIfromflag().equals(BmFromEnumVO.USER_INPUT.value())) {
+                            item.setDisabled(Boolean.FALSE);
+                        } else {
+                            item.setDisabled(Boolean.TRUE);
+                        }
+                        itemList.add(item);
+                    }
+                }
+            } catch (BusinessException e) {
+                e.printStackTrace();
+            }
+        }
+        return itemList;
+    }
+
+    /**
+     * 发放状态信息项
+     *
+     * @return
+     */
+    private static List<Item> getStateItems() {
+        List<Item> itemList = new ArrayList<Item>();
+        ItemOption[] yesAndNo = BmTempletUtils.getYesNoOptions();
+        Item item = BmTempletUtils.getBaseItem();
+        item.setCode(CLASSCODE);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0008")/* @res "险种编码" */);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(CLASSNAME);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0009")/* @res "险种名称" */);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(CACULATEFLAG);
+        item.setItemtype(ComponentType.Radio);
+        item.setDatatype(Integer.valueOf(DataTypeEnum.Radio.value()).intValue());
+        item.setOptions(yesAndNo);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "060150bmdata0031")/* @res "计算标志" */
+        );
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(CHECKFLAG);
+        item.setOptions(yesAndNo);
+        item.setItemtype(ComponentType.Radio);
+        item.setDatatype(Integer.valueOf(DataTypeEnum.Radio.value()).intValue());
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "060150bmdata0032")/* @res "审核标志" */
+        );
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(CYEAR);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0012")/* @res "年度" */);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(CPERIOD);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0013")/* @res "期间" */);
+        itemList.add(item);
+
+//        item = BmTempletUtils.getBaseItem();
+//        item = BmTempletUtils.getBaseItem();
+//        item.setCode(FINANCEORGNAME);
+//        item.setLabel(ResHelper.getString("60150bmdata",
+//                "160150bmdata0015")/* @res "财务组织" */);
+//        itemList.add(item);
+//
+//        item = BmTempletUtils.getBaseItem();
+//        item.setCode(FINANCEDEPTNAME);
+//        item.setLabel(ResHelper.getString("60150bmdata",
+//                "160150bmdata0016")/* @res "财务部门" */);
+//        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(LOCATIONNAME);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0017")/* @res "缴交地" */);
+        itemList.add(item);
+
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(GLBDEF1);
+        item.setLabel("ERP财务组织"/* @res "任职岗位" */);
+        item.setVisible(true);
+        itemList.add(item);
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(GLBDEF2);
+        item.setLabel("ERP财务部门"/* @res "任职岗位" */);
+        item.setVisible(true);
+        itemList.add(item);
+        return itemList;
+    }
+
+    /**
+     * 基本信息项
+     *
+     * @return
+     */
+
+    private static List<Item> getBasicItems() {
+        List<Item> itemList = new ArrayList<Item>();
+
+        // 主键
+        Item item = BmTempletUtils.getBaseItem();
+        item.setCode(BmDataVO.PK_BM_DATA);
+        item.setLabel(BmDataVO.PK_BM_DATA);
+        item.setVisible(false);
+        itemList.add(item);
+
+        // 时间戳
+        item = BmTempletUtils.getBaseItem();
+        item.setCode("ts");
+        item.setLabel("ts");
+        item.setVisible(false);
+        itemList.add(item);
+
+        // 显示部分
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(PSNCODE);
+        item.setLabel(
+                ResHelper.getString("common", "UC000-0000147")/* @res "人员编码 */);
+        item.setVisible(true);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(CLERKCODE);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "060150bmdata0026")/* @res "员工号" */);
+        item.setVisible(true);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(PSNNAME);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0003")/* @res "姓名" */);
+        item.setVisible(true);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(PLSNAME);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0004")/* @res "人员类别" */);
+        item.setVisible(true);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(ORGNAME);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0005")/* @res "任职组织" */);
+        item.setVisible(true);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(DEPTNAME);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0006")/* @res "任职部门" */);
+        item.setVisible(true);
+        itemList.add(item);
+
+        item = BmTempletUtils.getBaseItem();
+        item.setCode(POSTNAME);
+        item.setLabel(ResHelper.getString("60150bmdata",
+                "160150bmdata0007")/* @res "任职岗位" */);
+        item.setVisible(true);
+        itemList.add(item);
+
+
+        return itemList;
+    }
+
+    /**
+     * 缴交项目处理
+     *
+     * @param dataVOs
+     * @param updateRows
+     * @return
+     */
+    public static BmDataVO[] appValueHashMapDispose(BmDataVO[] dataVOs, JSONArray updateRows) {
+        if (null != dataVOs && dataVOs.length > 0) {
+            for (int j = dataVOs.length, i = 0; i < j; i++) {
+                HashMap<String, Object> appValueHashMap = new HashMap<>();
+                JSONObject values = updateRows.getJSONObject(i).getJSONObject("values");
+                for (String key : values.keySet()) {
+                    if (isAppendAttribute(key)) {
+                        appValueHashMap.put(key, values.getJSONObject(key).get("value"));
+                    }
+                }
+                dataVOs[i].appValueHashMap = appValueHashMap;
+            }
+        }
+        return dataVOs;
+    }
+
+    public static boolean isAppendAttribute(String attributeName) {
+        Pattern pattern = Pattern.compile("f_\\d+");// 数值型
+        Matcher matcher = pattern.matcher(attributeName);
+        if (matcher.find()) {
+            return true;
+        }
+        pattern = Pattern.compile("c_\\d+");// 字符型
+        matcher = pattern.matcher(attributeName);
+        if (matcher.find()) {
+            return true;
+        }
+        pattern = Pattern.compile("d_\\d+");// 日期型
+        matcher = pattern.matcher(attributeName);
+        if (matcher.find()) {
+            return true;
+        }
+
+        return false;
+    }
+
+    public static HRAggVO querySortItem(BmLoginContext context) throws BusinessException {
+        HRAggVO aggVO = new HRAggVO();
+
+        SortVO sortVOs[] = null;
+        SortconVO sortconVOs[] = null;
+        String strCondition = " func_code='60150bmdata'" + " and group_code='TableCode'  and ((pk_corp='"
+                + context.getPk_group() + "' and pk_user='" + context.getPk_loginUser()
+                + "') or pk_corp ='@@@@') order by pk_corp";
+
+        sortVOs = (SortVO[]) PersitenceDelegator.retrieveByClause(SortVO.class, strCondition);
+
+        if (sortVOs != null && sortVOs.length > 0) {
+            strCondition = "pk_hr_sort='" + sortVOs[0].getPrimaryKey() + "' order by field_seq ";
+
+            sortconVOs = (SortconVO[]) PersitenceDelegator.retrieveByClause(SortconVO.class, strCondition);
+
+            aggVO.setParentVO(sortVOs[0]);
+            aggVO.setChildrenVO(sortconVOs);
+        }
+        return aggVO;
+    }
+
+    public static BmLoginVO getBmLoginVO(BmLoginContext context) throws BusinessException {
+        BmLoginVO bmLoginVO = context.getBmLoginVO();
+        if (StringUtil.isNotBlank(context.getPk_bm_class())) {
+            try {
+                bmLoginVO = (BmLoginVO) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByPk(null,
+                        BmLoginVO.class, context.getPk_bm_class());
+            } catch (BusinessException e) {
+                e.printStackTrace();
+            }
+        } else {
+            if (bmLoginVO == null) {
+                bmLoginVO = new BmLoginVO();
+            }
+        }
+
+        bmLoginVO.setPk_org(context.getPk_org());
+        BmPeriodstateVO periodStateVO = bmLoginVO.getPeriodVO();
+        if (periodStateVO == null) {
+            periodStateVO = new BmPeriodstateVO();
+        }
+
+        bmLoginVO.setPk_bm_class(context.getPk_bm_class());
+        periodStateVO.setPk_bm_class(context.getPk_bm_class());
+        String period = context.getCyear() + context.getCperiod();
+        YearPeriodSeperatorVO seperatorVO = new YearPeriodSeperatorVO(period);
+        if (context.getPk_bm_class() == null) {
+            periodStateVO.setPk_periodstate(null);
+        }
+        periodStateVO.setYear(seperatorVO.getYear());
+        periodStateVO.setPeriod(seperatorVO.getPeriod());
+
+        bmLoginVO.setPeriodVO(periodStateVO);
+        if (StringUtil.isNotBlank(context.getPk_bm_class())) {
+            bmLoginVO = ServiceLocator.find(IBmPub.class).getBmclassVOWithState(bmLoginVO);
+        }
+        return bmLoginVO;
+    }
+
+    protected static Map<String, String> initShowNameMap() {
+        Map<String, String> nameMap = new HashMap<String, String>();
+        nameMap.put(PSNCODE, ResHelper.getString("commonres",
+                "UC000-0000147")/* @res "人员编码 */);
+        nameMap.put(CLERKCODE, ResHelper.getString("60150bmdata",
+                "160150bmdata0002")/* @res "员工号" */);
+        nameMap.put(PSNNAME, ResHelper.getString("60150bmdata",
+                "160150bmdata0003")/* @res "姓名" */);
+        nameMap.put(PLSNAME, ResHelper.getString("60150bmdata",
+                "160150bmdata0004")/* @res "人员类别" */);
+        nameMap.put(ORGNAME, ResHelper.getString("60150bmdata",
+                "160150bmdata0005")/* @res "任职组织" */);
+        nameMap.put(DEPTNAME, ResHelper.getString("60150bmdata",
+                "160150bmdata0006")/* @res "所在部门" */);
+        nameMap.put(POSTNAME, ResHelper.getString("60150bmdata",
+                "160150bmdata0007")/* @res "所在岗位" */);
+        nameMap.put(CLASSCODE, ResHelper.getString("60150bmdata",
+                "160150bmdata0008")/* @res "险种编码" */);
+        nameMap.put(CLASSNAME, ResHelper.getString("60150bmdata",
+                "160150bmdata0009")/* @res "险种名称" */);
+        nameMap.put(CACULATEFLAG, ResHelper.getString("60150bmdata",
+                "160150bmdata0010")/* @res "计算标志" */);
+        nameMap.put(CHECKFLAG, ResHelper.getString("60150bmdata",
+                "160150bmdata0011")/* @res "审核标志" */);
+        nameMap.put(CYEAR, ResHelper.getString("60150bmdata",
+                "160150bmdata0012")/* @res "年度" */);
+        nameMap.put(CPERIOD, ResHelper.getString("60150bmdata",
+                "160150bmdata0013")/* @res "期间" */);
+//        nameMap.put(FINANCEORGNAME, ResHelper.getString("60150bmdata",
+//                "160150bmdata0015")/* @res "财务组织" */);
+//        nameMap.put(FINANCEDEPTNAME, ResHelper.getString("60150bmdata",
+//                "160150bmdata0016")/* @res "财务部门" */);
+        nameMap.put(LOCATIONNAME, ResHelper.getString("60150bmdata",
+                "160150bmdata0017")/* @res "缴交地" */);
+        // 这里加了 显示设置改了都没用  一定显示
+//        nameMap.put(GLBDEF1, "ERP财务组织");
+//        nameMap.put(GLBDEF2, "ERP财务部门");
+        return nameMap;
+    }
+
+    public static BmdataDspVO[] queryFixedDsp() {
+        // 界面上显示的名称
+        BmdataDspVO[] dspList = new BmdataDspVO[defaultFixedColKey.length];
+        Map<String, String> showNameMap = initShowNameMap();
+        for (int i = 0; i < defaultFixedColKey.length; i++) {
+            BmdataDspVO vo = new BmdataDspVO();
+            vo.setItem_key(defaultFixedColKey[i]);
+            vo.setItemName(showNameMap.get(defaultFixedColKey[i]));
+            vo.setBshow(UFBoolean.TRUE);
+            vo.setIsBmItem(UFBoolean.FALSE);
+            dspList[i] = vo;
+        }
+        return dspList;
+    }
+
+    // 薪资档案默认显示的字段及顺序
+    // 20150804 xiejie3 补丁合并,NCdp205399130社保缴交节点,有任职组织,人员类别,岗位等字段无法控制是否显示,begin
+    // zhoumxc
+    // 20150923 xiejie3 当按照人员显示的时候,需要有使得下面的几个为固定列,进行单元格合并。begin
+    public final static String[] defaultFixedColKey = new String[]{
+
+            PSNCODE/* 人员编码 */, CLERKCODE/* 员工号 */, PSNNAME/* 姓名 */, PLSNAME/* 人员类别 */, ORGNAME/* 任职组织 */,
+            DEPTNAME/* 所在部门 */, POSTNAME/* 所在岗位 */,
+//            FINANCEORGNAME/* 财务组织 */, FINANCEDEPTNAME/* 财务部门 */,
+//            GLBDEF1,GLBDEF2 // ERP财务组织 ERP财务部门 //这个加了 加固定显示了 显示设置那里配置没用了
+    };
+
+    public static <T> T[] concat(T[] a, T[] b) {
+        List<T> list = new ArrayList<T>(Arrays.asList(a));
+        if (ArrayUtils.isNotEmpty(b)) {
+            list.addAll(new ArrayList<T>(Arrays.asList(b)));
+        }
+        return list.toArray(a);
+
+    }
+}

+ 78 - 0
hrbm/src/client/nccloud/web/hrbm/bmfile/action/BatchSaveAction.java

@@ -0,0 +1,78 @@
+package nccloud.web.hrbm.bmfile.action;
+
+import java.util.Map;
+import java.util.Set;
+
+
+import nc.itf.bm.bmfile.IBmfileManageService;
+import nc.itf.bm.bmfile.IBmfileQueryService;
+import nc.vo.bm.data.BmDataVO;
+import nc.vo.bm.pub.BmLoginContext;
+import nc.vo.pub.lang.UFLiteralDate;
+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.hrbm.helper.BmLoginContextUtils;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+
+/**
+ * ÅúÁ¿Ð½×ÊÉç±£
+ */
+public class BatchSaveAction extends HRCommonAction {
+	@Override
+	public <T> Object execute(IRequest request, T para) throws Exception {
+		ParamUtils param = new ParamUtils(request);
+		BmLoginContext context = BmLoginContextUtils.getBmLoginContext(param);
+		String pkBmClass = param.getString("pk_bmclass", null);
+		String[] pkbms = pkBmClass.split(",");
+
+		Map<String, String> pk_psnjob_map = param.getMap("pk_psnjob_map", null);
+		
+		Map<String, String> accountno_map = param.getMap("accountno_map", null);
+		Set<String> set = pk_psnjob_map.keySet();//pk_psnjob_array
+		BmDataVO[] bmDataVOs = ServiceLocator.find(IBmfileQueryService.class).queryPsnForAddNCC(context,
+				set);
+       
+		// HashMap<String, Object> mm = bmDataVOs[0].appValueHashMap;
+		if (bmDataVOs != null && bmDataVOs.length > 0) {
+			for (int i = 0; i < bmDataVOs.length; i++) {
+				// »ñÈ¡ÏÕÖÖ
+				String pk_bm_data_array = pk_psnjob_map.get(bmDataVOs[i].getPk_psnjob());
+				String[] split = pk_bm_data_array.split(",");
+				if (!ArrayUtils.isEmpty(split)) {
+					for (String pk_bm_data : split) {
+						Object attributeValue = bmDataVOs[i].getAttributeValue(pk_bm_data);
+						if (null == attributeValue) {
+							bmDataVOs[i].setAttributeValue(pk_bm_data, "Y");
+						}
+					}
+				}
+				if (null != accountno_map) {
+					String bmaccountno = accountno_map.get(bmDataVOs[i].getPk_psnjob());
+					bmDataVOs[i].setBmaccountno(bmaccountno);
+				}
+				bmDataVOs[i].setCyear(context.getCyear());
+				bmDataVOs[i].setCperiod(context.getCperiod());
+				bmDataVOs[i].setPaylocation(null);
+			}
+		}
+
+		BmDataVO[] classInfo = new BmDataVO[pkbms.length];
+		for (int i = 0; i < classInfo.length; i++) {
+			Map map = param.getMap(pkbms[i], null);
+			classInfo[i] = new BmDataVO();
+			classInfo[i].setPk_bm_class(pkbms[i]);
+			if (StringUtils.isNotEmpty(map.get("newPaylocation").toString())) {
+				classInfo[i].setPaylocation(map.get("newPaylocation").toString());
+			}
+			if (StringUtils.isNotEmpty(map.get("newDbegindate").toString())) {
+				classInfo[i].setDbegindate(new UFLiteralDate(map.get("newDbegindate").toString()));
+			}
+		}
+		ServiceLocator.find(IBmfileManageService.class).batchAddPsn(bmDataVOs, classInfo, context);
+		return true;
+	}
+
+}

+ 340 - 0
hrbm/src/client/nccloud/web/hrbm/bmfile/action/BmfileExportAction.java

@@ -0,0 +1,340 @@
+package nccloud.web.hrbm.bmfile.action;
+
+import com.alibaba.fastjson.JSONObject;
+import nc.bs.logging.Logger;
+import nc.hr.utils.MultiLangHelper;
+import nc.hr.utils.StringPiecer;
+import nc.itf.bm.bmfile.IBmfileQueryService;
+import nc.itf.hr.bm.IBmClassQueryService;
+import nc.itf.hr.frame.IPersistenceRetrieve;
+import nc.md.model.type.IType;
+import nc.vo.bm.bmclass.BmClassConstant;
+import nc.vo.bm.bmclass.BmClassItemVO;
+import nc.vo.bm.data.BmDataVO;
+import nc.vo.bm.item.BmFromEnumVO;
+import nc.vo.bm.pub.BmLoginContext;
+import nc.vo.hr.combinesort.SortVO;
+import nc.vo.hr.combinesort.SortconVO;
+import nc.vo.hr.itemsource.TypeEnumVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.CircularlyAccessibleValueObject;
+import nc.vo.pub.SuperVO;
+import nc.vo.uif2.LoginContext;
+import nccloud.base.exception.ExceptionUtils;
+import nccloud.commons.collections.CollectionUtils;
+import nccloud.commons.lang.ArrayUtils;
+import nccloud.commons.lang.StringUtils;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.ui.config.Area;
+import nccloud.framework.web.ui.config.Item;
+import nccloud.framework.web.ui.config.PageTemplet;
+import nccloud.framework.web.ui.meta.ComponentType;
+import nccloud.framework.web.ui.model.row.Cell;
+import nccloud.framework.web.ui.model.row.Row;
+import nccloud.web.hr.excel.action.AbstractExcelExportAction;
+import nccloud.web.hr.pub.HRNccQueryHelper;
+import nccloud.web.hr.pub.HRNccTemplateUtils;
+import nccloud.web.hrbm.helper.BmLoginContextUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 社保档案导出/模板下载
+ */
+public class BmfileExportAction extends AbstractExcelExportAction {
+    // 要导出的档案数据
+    private BmDataVO[] dataVOs = null;
+    // 导出的excel区域 
+    private Area exportExcelArea = null;
+    @Override
+    protected void extendFieldProcess(Map<String, Row[]> rowsMap, Map<String, List<CircularlyAccessibleValueObject>> vosMap, Map<String, List<Item>> listBillItemsMap) {
+        List<Item> items = listBillItemsMap.get("excel-template");
+        if(items!=null && items.size()>0){
+            items.removeIf(e->"paylocation".equals(e.getCode()));
+        }
+        Row [] rows = rowsMap.get("excel-template");
+        List<CircularlyAccessibleValueObject> vos = vosMap.get("excel-template");
+        if (ArrayUtils.isEmpty(rows) || CollectionUtils.isEmpty(vos)) {
+            return;
+        }
+        for (int i = 0; i < rows.length; i++) {
+            Row row = rows[i];
+            BmDataVO vo = (BmDataVO) vos.get(i);
+            //取不到档案项目,所以修改列项目取法20201204
+            //List<Item> listBillItems = listBillItemsMap.get("listBillItemsMap");
+            if (exportExcelArea == null || CollectionUtils.isEmpty(exportExcelArea.getItemList())) {
+                return;
+            }
+            List<Item> listBillItems = exportExcelArea.getItemList();
+            for (Item item : listBillItems) {
+                String key = item.getCode();
+                Cell cell = row.getCell(key);
+                if (cell != null) {
+                    continue;
+                }
+                cell = new Cell();
+                Object cellVal = vo.getAttributeValue(key);
+                /*if(key.startsWith("f_")||key.startsWith("c_")||key.startsWith("d_")){
+
+                }*/
+                cell.setValue(cellVal);
+                row.addCell(key, cell);
+            }
+        }
+        listBillItemsMap.put("excel-template",exportExcelArea.getItemList());
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    protected String getAppCode(Map<String,String> param) {
+        return "60150501";
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    protected String getPageCode(Map<String,String> param) {
+        return "60150501";
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    protected String getAreaCode(Map<String,String> param) {
+        return "excel-template";
+    }
+
+    /**
+     *
+     * @param context
+     * @param paramMap
+     * @return
+     */
+    @Override
+    protected SuperVO[] getData(LoginContext context, Map<String, String> paramMap) {
+        try {
+            BmLoginContext bmLoginContext = BmLoginContextUtils.getBmLoginContextForRef(paramMap);
+            IBmfileQueryService service = ServiceLocator.find(IBmfileQueryService.class);
+            HRNccQueryHelper queryHelper = new HRNccQueryHelper(JSONObject.toJSONString(paramMap), true);
+            String lastWhereSql = null;
+            if (StringUtils.isNotEmpty(queryHelper.getWhereSql())) {
+                lastWhereSql = queryHelper.getWhereSql();// 查询模板where
+            }
+            // 从前台传递的排序条件
+            String modelStr = paramMap.get("modelStr");
+            String orderSQL = getOrderSql(bmLoginContext, modelStr);
+            String[] pks = service.queryPKSByCondition(bmLoginContext, lastWhereSql, orderSQL);
+            int datasize = ArrayUtils.isEmpty(pks) ? 0 : pks.length;
+            dataVOs = new BmDataVO[datasize];
+            dataVOs = service.queryBmDataByPks(pks,bmLoginContext,orderSQL);
+        } catch (Exception e) {
+            Logger.error(e.getMessage());
+            ExceptionUtils.wrapBusinessException(e.getMessage());
+        }
+        return dataVOs;
+    }
+
+    /**
+     *
+     * @param loginContext
+     * @param modelStr
+     * @return
+     * @throws BusinessException
+     */
+    private String getOrderSql(LoginContext loginContext, String modelStr) throws BusinessException {
+        String orderSQL = "";
+        SortconVO[] sortconVOs = (modelStr == null || "".equals(modelStr) || "{}".equals(modelStr)) ? null
+                : HRNccTemplateUtils.getVOFromGrid(SortconVO.class, modelStr);
+        if (sortconVOs != null && sortconVOs.length > 0) {
+            orderSQL = getOrderSql(sortconVOs);
+        } else {
+            // ========从后台查询的排序sql
+            String strCondition = " func_code='60150bmfile'" + " and group_code='TableCode' and ((pk_corp='"
+                    + loginContext.getPk_group() + "' and pk_user='" + loginContext.getPk_loginUser()
+                    + "') or pk_corp ='@@@@') order by pk_corp";
+            SortVO sortVOs[] = (SortVO[]) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByClause(null,
+                    SortVO.class, strCondition);
+            if (sortVOs != null && sortVOs.length != 0) {
+                // 已选择排序项目
+                strCondition = "pk_hr_sort='" + sortVOs[0].getPrimaryKey() + "' order by field_seq ";
+                sortconVOs = (SortconVO[]) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByClause(null,
+                        SortconVO.class, strCondition);
+                orderSQL = getOrderSql(sortconVOs);
+            }
+        }
+        return orderSQL;
+    }
+
+    /**
+     *
+     * @param sortconVOs
+     * @return
+     */
+    private String getOrderSql(SortconVO[] sortconVOs) {
+        String orderSQL = null;
+        // 升序asc,降序 desc
+        String isRaise = "";
+        if (sortconVOs.length > 0) {
+            orderSQL = "";
+        } else {
+            return orderSQL;
+        }
+        for (int i = 0; i < sortconVOs.length - 1; i++) {
+            isRaise = "Y".equals(sortconVOs[i].getAscend_flag().toString()) ? " asc " : " desc ";
+            orderSQL += sortconVOs[i].getField_code() + isRaise + ",";
+        }
+        isRaise = "Y".equals(sortconVOs[sortconVOs.length - 1].getAscend_flag().toString()) ? " asc " : " desc ";
+        orderSQL += sortconVOs[sortconVOs.length - 1].getField_code() + isRaise;
+        return orderSQL;
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    protected String getFileName(Map<String,String> param) {
+        return "bmfile_excel";
+    }
+
+    /**
+     *
+     * @return
+     */
+    @Override
+    protected String importValidatorFactory() {
+        return "nccloud.impl.hrbm.bmfile.BmfileImportDataProcessServiceImpl";
+    }
+
+    /**
+     *
+     * @return
+     */
+    @Override
+    protected String getCurrentModule() {
+        return "hrbm";
+    }
+
+    /**
+     *
+     * @param request
+     * @param param
+     * @return
+     */
+    @Override
+    protected LoginContext getContext(IRequest request,Map<String,String> param) {
+        BmLoginContext bmLoginContext = null;
+        try {
+            bmLoginContext = BmLoginContextUtils.getBmLoginContextForRef(param);
+        } catch (BusinessException e) {
+            Logger.error(e.getMessage());
+        }
+        return bmLoginContext;
+    }
+
+    /**
+     * 为要导出的excel模板添加自定义的档案项目
+     * @param pageTemplet
+     * @param context
+     * @param param
+     */
+    @Override
+    protected void templateProcess(PageTemplet pageTemplet, LoginContext context,Map<String, String> param) {
+        try {
+            BmLoginContext bmLoginContext = null;
+            if (context instanceof BmLoginContext) {
+                bmLoginContext = (BmLoginContext) context;
+            }
+            if (bmLoginContext == null) {
+                Logger.error("参数出错,请检查期间参数是否正确!");
+                ExceptionUtils.wrapBusinessException("参数出错,请检查期间参数是否正确!");
+            }
+            // 没有社保档案,将要导出的excel不再添加险种项目
+            String[] pkBmClasses = getPkBmClasses(context, param);
+            if (ArrayUtils.isEmpty(pkBmClasses)) {
+                return;
+            }
+            // 导出excel的模板区域
+            Area area = pageTemplet.getArea("excel-template");
+            // 获取档案项目
+            String condition = " category_id = '" + BmClassConstant.DOC_CATEGORY_ID + "'";
+            BmClassItemVO[] classItemVOS = ServiceLocator.find(IBmClassQueryService.class).queryFileClassItem(bmLoginContext.getCyear(), bmLoginContext.getCperiod(), pkBmClasses);
+           // BmItemVO[] bmItemVOS = ServiceLocator.find(IBmItemQueryService.class).queryByCondition(context, condition);
+            if (ArrayUtils.isEmpty(classItemVOS)) {
+                exportExcelArea = area;
+                return;
+            }
+            //excel模板上追加自定义列(档案项目)
+            for (BmClassItemVO itemVO : classItemVOS) {
+                boolean flag = itemVO.getIfromflag().intValue() == BmFromEnumVO.USER_INPUT.toIntValue();
+                Item item = area.getItemByCode(itemVO.getItemkey());
+                if (item == null) {
+                    item = getDefaultItem();
+                    area.addItem(item);
+                }
+                item.setDisabled(!flag);
+                item.setLabel(MultiLangHelper.getName(itemVO));
+                item.setVisible(true);
+                item.setFieldValued("refpk");
+                item.setFieldDisplayed("refcode");
+                item.setCode(itemVO.getItemkey());
+                int type = itemVO.getIitemtype().intValue();
+                if (type == TypeEnumVO.FLOATTYPE.toIntValue()) {
+                    item.setItemtype(ComponentType.Number);
+                    item.setDatatype(IType.TYPE_UFDouble);
+                    item.setDataval(itemVO.getIflddecimal() + ",-100000000000000000000,100000000000000000000");
+                    item.setMaxlength(31);
+                } else if (type == TypeEnumVO.DATETYPE.toIntValue()) {
+                    item.setItemtype(ComponentType.Datetimepicker);
+                    item.setDatatype(34);
+                    item.setMaxlength(31);
+                } else if (type == TypeEnumVO.CHARTYPE.toIntValue()) {
+                    item.setItemtype(ComponentType.Input);
+                    item.setDatatype(1);
+                    item.setMaxlength(31);
+                }
+            }
+            exportExcelArea = (Area)area.clone();
+            List<Item> itemList = exportExcelArea.getItemList();
+            itemList.removeIf(e->e.getCode().equals("paylocation"));
+        } catch (BusinessException | CloneNotSupportedException e) {
+            Logger.error(e.getMessage());
+            ExceptionUtils.wrapBusinessException(e.getMessage());
+        }
+    }
+
+    /**
+     * 获取险种主键
+     * @return
+     */
+    private String[] getPkBmClasses(LoginContext context,Map<String, String> param){
+        Object[] vos = getData(context, param);
+        if (vos instanceof BmDataVO[]) {
+            dataVOs = (BmDataVO[]) vos;
+        }
+        return StringPiecer.getStrArrayDistinct(dataVOs,"pk_bm_class");
+    }
+
+//    @Override
+//    protected Map<String, String> getKeyInfo(Map<String, String> paramMap) throws BusinessException {
+//      /*  BmLoginContext bmLoginContext = BmLoginContextUtils.getBmLoginContextForRef(paramMap);
+//        Map<String,String> param=new HashMap<>();
+//        param.put("cyear",bmLoginContext.getCyear());
+//        param.put("cpriod",bmLoginContext.getCperiod());
+//        return param;*/
+//        return null;
+//    }
+}

+ 164 - 0
hrbm/src/client/nccloud/web/hrbm/bmfile/action/OLTP_AddAction.java

@@ -0,0 +1,164 @@
+package nccloud.web.hrbm.bmfile.action;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import nc.bs.dao.BaseDAO;
+import nc.bs.framework.common.InvocationInfoProxy;
+import nc.hr.utils.InSQLCreator;
+import nc.itf.bm.bmfile.IBmfileManageService;
+import nc.itf.bm.bmfile.IBmfileQueryService;
+import nc.itf.bm.bmfile.IHRBmfileConstant;
+import nc.jdbc.framework.processor.BeanListProcessor;
+import nc.vo.bm.data.BmDataVO;
+import nc.vo.bm.pub.BmLoginContext;
+import nc.vo.hi.psndoc.PsnJobVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFBoolean;
+import nccloud.commons.collections.CollectionUtils;
+import nccloud.framework.core.json.IJson;
+import nccloud.framework.service.ServiceLocator;
+import nccloud.framework.web.container.IRequest;
+import nccloud.framework.web.json.JsonFactory;
+import nccloud.web.hr.pub.HRCommonAction;
+import nccloud.web.hr.pub.HRNccTemplateUtils;
+import nccloud.web.hrbm.helper.BmLoginContextUtils;
+import nccloud.web.uapbd.commons.web.ParamUtils;
+
+/**
+ * 变动人员增加
+ * 
+ * @author 张亚鹏
+ *
+ */
+public class OLTP_AddAction extends HRCommonAction {
+	@Override
+	public <T> Object execute(IRequest request, T para) throws Exception {
+        //员工号集合
+		List<String> pkPsnjobList = new ArrayList<>();
+		ParamUtils param = new ParamUtils(request);
+		BmLoginContext context = BmLoginContextUtils.getBmLoginContext(param);
+		BmDataVO[] bmDataVOs = HRNccTemplateUtils.getVOFromGrid(BmDataVO.class, getModelStr(param, "model"));
+		BmDataVO[] bmDataVO = ServiceLocator.find(IBmfileQueryService.class).getPkFinanceOrg(bmDataVOs);
+		List<BmDataVO> list = new ArrayList<BmDataVO>();
+		if (bmDataVO != null && bmDataVO.length > 0) {
+			for (int i = 0; i < bmDataVO.length; i++) {
+				bmDataVO[i].setCyear(context.getCyear());
+				bmDataVO[i].setCperiod(context.getCperiod());
+				bmDataVO[i].setPk_org(context.getPk_org());
+				bmDataVO[i].setCaculateflag(UFBoolean.FALSE);
+				bmDataVO[i].setCheckflag(UFBoolean.FALSE);
+				bmDataVO[i].setAccountstate(0);
+				bmDataVO[i].setAccounttype(1);
+				pkPsnjobList.add(bmDataVO[i].getPk_psnjob());
+			}
+		}
+        //员工号和pk_psnjob的映射关系
+        Map<String, PsnJobVO> jobMap = getPsnjobMap(pkPsnjobList);
+		String pkBmClass = param.getString("pk_bmclass", null);
+		String[] pkbms = pkBmClass.split(",");
+		String s = getModelStr(param, "model");
+		JSONObject object = JSON.parseObject(s);
+		JSONObject jsobject = (JSONObject) JSONObject.toJSON(object.get("model"));
+		JSONArray bodys = jsobject.getJSONArray("rows");
+		if (null != bodys && !bodys.isEmpty()) {
+			for (int i = 0; i < bodys.size(); i++) {
+				JSONObject obj = bodys.getJSONObject(i).getJSONObject("values");
+				for (int j = 0; j < pkbms.length; j++) {
+					if ("true".equals(obj.getJSONObject(pkbms[j]).get("value").toString())) {
+						bmDataVO[i].setPk_bm_class(pkbms[j]);
+		                PsnJobVO jobVO = jobMap.get(bmDataVO[i].getPk_psnjob());
+		                ensureBmData(bmDataVO[i], jobVO);
+						list.add((BmDataVO) bmDataVO[i].clone());
+					}
+				}
+			}
+		}
+		BmDataVO[] bmDataVO2 = list.toArray(new BmDataVO[0]);
+		ServiceLocator.find(IBmfileManageService.class).insertBmDataVOs(bmDataVO2, context);
+		return true;
+	}
+
+	public static String getModelStr(ParamUtils param, String fieldName) {
+		if (fieldName == null) {
+			fieldName = "model";
+		}
+		IJson json = JsonFactory.create();
+		HashMap m = new HashMap();
+		m.put("model", param.get(fieldName));
+		return json.toJson(m);
+	}
+	
+    private void ensureBmData(BmDataVO vo, PsnJobVO jobVO) {
+        vo.setPk_group(InvocationInfoProxy.getInstance().getGroupId());
+        vo.setPk_psnjob(jobVO.getPk_psnjob());//根据员工号设置pk_psnjob
+        vo.setPk_psndoc(jobVO.getPk_psndoc());//根据员工号设置pk_psndoc
+        vo.setWorkorg(jobVO.getPk_org()); //补充任职组织
+        vo.setWorkdept(jobVO.getPk_dept()); //补充任职部门
+        vo.setWorkorgvid(jobVO.getPk_org_v()); //补充任职组织
+        vo.setWorkdeptvid(jobVO.getPk_dept_v()); //补充任职部门
+        vo.setPk_psnorg(jobVO.getPk_psnorg());
+        vo.setPk_group(jobVO.getPk_group());
+        vo.setCaculateflag(UFBoolean.FALSE);
+        vo.setCheckflag(UFBoolean.FALSE);
+        vo.setAccountstate(IHRBmfileConstant.ACCOUNTSTATE_NORMAL);
+        vo.setAccounttype(IHRBmfileConstant.ACCOUNTTYPE_NEW);
+        vo.setGlbdef1((String)jobVO.getAttributeValue("jobglbdef6"));
+        vo.setGlbdef2((String)jobVO.getAttributeValue("jobglbdef5"));
+    }
+    
+	/**
+     * 员工号和pk_psnjob的映射关系
+     * @return
+     */
+    @SuppressWarnings("ncc-java:AccessToDBInWeb")
+    private Map<String, PsnJobVO> getPsnjobMap(List<String> pkPsnjobList) {
+        Map<String, PsnJobVO> jobMap = null;
+        BaseDAO dao = new BaseDAO();
+        List<PsnJobVO> jobVOList = null;
+        try {
+            //查询所有任职
+            StringBuffer sqlBuffer = new StringBuffer();
+            sqlBuffer.append("select hi_psnjob.pk_psnjob, "); // 1
+            sqlBuffer.append("       hi_psnjob.pk_psnorg, "); // 2
+            sqlBuffer.append("       hi_psnjob.assgid, "); // 3
+            sqlBuffer.append("       hi_psnjob.pk_psndoc, "); // 4
+            sqlBuffer.append("       hi_psnjob.clerkcode, "); // 5
+            sqlBuffer.append("       hi_psnjob.jobglbdef6, "); // ERP财务组织
+            sqlBuffer.append("       hi_psnjob.jobglbdef5, "); // ERP财务部门
+            sqlBuffer.append("       org_orgs.PK_GROUP, ");
+            sqlBuffer.append("       org_orgs.pk_org, ");
+            sqlBuffer.append("       org_orgs.pk_vid as pk_org_v, ");
+            sqlBuffer.append("       org_dept.pk_dept, ");
+            sqlBuffer.append("       org_dept.pk_vid as pk_dept_v ");
+            sqlBuffer.append("  from hi_psnjob ");
+            sqlBuffer.append(" inner join bd_psndoc on bd_psndoc.pk_psndoc = hi_psnjob.pk_psndoc ");
+            sqlBuffer.append(" inner join hi_psnorg on hi_psnorg.pk_psnorg = hi_psnjob.pk_psnorg ");
+            sqlBuffer.append("  left outer join org_dept on org_dept.pk_dept = hi_psnjob.pk_dept ");
+            sqlBuffer.append("  left outer join org_orgs on org_orgs.pk_org = hi_psnjob.pk_org ");
+            sqlBuffer.append(" where hi_psnjob.pk_psnjob  in (" + new InSQLCreator().getInSQL(pkPsnjobList.toArray(new String[0])) + ")");
+            jobVOList = (List<PsnJobVO>) dao.executeQuery(sqlBuffer.toString(), new BeanListProcessor(PsnJobVO.class));
+            if (CollectionUtils.isEmpty(jobVOList)) {
+                return null;
+            } else {
+                jobMap = new HashMap<>();
+            }
+        } catch (BusinessException e) {
+            e.printStackTrace();
+        }
+        if (!CollectionUtils.isEmpty(jobVOList)) {
+        	for (PsnJobVO jobVO : jobVOList) {
+                jobMap.put(jobVO.getPk_psnjob(), jobVO);
+            }
+        }
+        
+        return jobMap;
+    }
+
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1511 - 0
hrbm/src/private/nc/impl/bm/bmdata/BmdataManageServiceImpl.java


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1917 - 0
hrbm/src/private/nc/impl/bm/bmfile/BmfileDao.java


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1208 - 0
hrbm/src/private/nc/impl/bm/bmfile/BmfileManageServiceImpl.java


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2097 - 0
hrbm/src/private/nc/impl/bm/end/MonthEndDAO.java


+ 156 - 0
hrbm/src/private/nc/impl/bm/listener/BmfileBusinessListener.java

@@ -0,0 +1,156 @@
+package nc.impl.bm.listener;
+
+import nc.bs.businessevent.BusinessEvent;
+import nc.bs.businessevent.IBusinessEvent;
+import nc.bs.businessevent.IBusinessListener;
+import nc.bs.businessevent.IEventType;
+import nc.bs.dao.BaseDAO;
+import nc.itf.uap.busibean.SysinitAccessor;
+import nc.util.bm.BmCacheUtils;
+import nc.vo.bm.pub.BmParaConstant;
+import nc.vo.hi.psndoc.PsnJobVO;
+import nc.vo.hi.pub.HICommonValue;
+import nc.vo.hi.pub.HiBatchEventValueObject;
+import nc.vo.hi.pub.HiEventValueObject;
+import nc.vo.hi.pub.IHiEventType;
+import nc.vo.pub.BusinessException;
+
+import nccloud.commons.lang.StringUtils;
+
+/**
+ * 薪资响应人事变动事件
+ */
+public class BmfileBusinessListener implements IBusinessListener{
+
+	private BmfileListenerDao dao;
+
+	private PsnJobVO psnJobAfter;
+
+	private PsnJobVO psnjobBefore;
+
+	private String pk_org;
+
+	private int changeDate = 0;
+
+	private final String IMODELCODE = "6007";
+
+	public BmfileListenerDao getDao() {
+		if (dao == null) {
+			return new BmfileListenerDao();
+		}
+		return dao;
+	}
+
+	@Override
+	public void doAction(IBusinessEvent event) throws BusinessException {
+		BusinessEvent be = (BusinessEvent) event;
+		Object obj = be.getObject();
+		if(obj == null){
+			return;
+		}
+		//人事业务变化后的工作记录。如果是转入人员档案,则变化前和变化后相同
+		String sourceID = event.getSourceID();
+		HiEventValueObject eventObj = null;
+		HiBatchEventValueObject batchObj = null;
+		if(obj instanceof HiBatchEventValueObject){
+			batchObj = (HiBatchEventValueObject)obj;
+			for (int i = 0; i < batchObj.getPsnjobs_before().length; i++) {
+				eventObj = new HiEventValueObject();
+				eventObj.setPsnjob_after(batchObj.getPsnjobs_after()[i]);
+				eventObj.setPsnjob_before(batchObj.getPsnjobs_before()[i]);
+				doSingle(sourceID,be,eventObj);
+			}
+		}else{
+			doSingle(sourceID,be,obj);
+		}
+	}
+
+	private void doSingle(String sourceID,BusinessEvent be,Object obj ) throws BusinessException{
+		//人事业务变化后的工作记录。如果是转入人员档案,则变化前和变化后相同
+
+		//人员信息变化处理
+		if(!BmCacheUtils.isModuleStarted(IMODELCODE)&&HICommonValue.MD_ID_PSNDOC.equals(sourceID)){
+			doInitParam(obj);
+			handlePsnInfoChange(be);
+			return;
+		}
+		//工作记录变化处理
+		if(HICommonValue.PSNJOBSOURCEID.equals(sourceID)) {
+			doInitParam(obj);
+			handlePsnjobChange(be);
+			return;
+		}
+	}
+
+	private void doInitParam(Object obj) throws BusinessException {
+		psnJobAfter = ((HiEventValueObject)obj).getPsnjob_after();
+		psnjobBefore = ((HiEventValueObject)obj).getPsnjob_before();
+
+		if (psnJobAfter != null && !StringUtils.isBlank(psnJobAfter.getPk_org())) {
+			pk_org = psnJobAfter.getPk_org();
+		} else if (psnjobBefore != null && !StringUtils.isBlank(psnjobBefore.getPk_org())) {
+			pk_org = psnjobBefore.getPk_org();
+		}
+		//反应变更日期(0不立即反应,1-31为立即反应天数	)
+		Integer paramValue = SysinitAccessor.getInstance().getParaInt(pk_org,BmParaConstant.CHANGE_DATE);
+		if (paramValue != null) {
+			changeDate = paramValue.intValue();
+		}
+	}
+
+	/**
+	 * 处理人员信息变化
+	 * 
+	 * @param event BusinessEvent
+	 * @throws BusinessException
+	 */
+	private void handlePsnInfoChange(BusinessEvent event) throws BusinessException{
+		String eventType = event.getEventType();
+		//员工信息保存后(HR0):更新薪资档案未审核人员为最新的工作记录,删除时HI保存了历史任职记录。
+		if(IHiEventType.SAVE_EMPLOYEE_AFTER.equals(eventType)) {
+			getDao().checkPsnChange(psnJobAfter);
+
+			getDao().updateBmDataByPsnDoc(psnJobAfter, changeDate);
+
+			return;
+		}
+		//员工信息删除前(HR0):删除前校验:只要人员在薪资档案中存在就不能删除
+		if(IHiEventType.DELETE_EMPLOYEE_BEFORE.equals(eventType)) {
+			getDao().checkPsnUsed(psnjobBefore);
+			return;
+		}
+	}
+
+	/**
+	 * 处理工作记录信息变化
+	 * 
+	 * @param event BusinessEvent
+	 * @throws BusinessException
+	 */
+	private void handlePsnjobChange(BusinessEvent event) throws BusinessException {
+		String eventType = event.getEventType();
+		//新增工作记录后:更新薪资档案未审核人员为最新的工作记录
+		if(IEventType.TYPE_INSERT_AFTER.equals(eventType)) {
+			getDao().updateBmDataByPsnJob(psnjobBefore, psnJobAfter, changeDate);
+			return;
+		}
+		if(IEventType.TYPE_UPDATE_AFTER.equals(eventType)) {
+			getDao().updateBmDataMulVer(psnJobAfter.getPk_psnjob(), null);
+			String sql = " update bm_data set glbdef1 = '"+psnJobAfter.getAttributeValue("jobglbdef6")+"',glbdef2 = '"+ psnJobAfter.getAttributeValue("jobglbdef5")+"' where pk_psnjob = '"+psnjobBefore.getPk_psnjob()+"' and checkflag = 'N'";
+			// 20230731 dzz 把psnjob表的 财务组织 财务部门也带到薪资档案
+			new BaseDAO().executeUpdate(sql);
+			return;
+		}
+		//删除前校验:只要工作记录存在在薪资档案中,并且有已经审核的数据,就不能删除。
+		//尚未审核的数据要修改正新的工作记录。
+		if(IEventType.TYPE_DELETE_BEFORE.equals(eventType)) {
+			getDao().checkPsnJobUsed(psnjobBefore);
+			//对尚未审核的数据要进行更新
+			getDao().updateBmDataByPsnJob(psnjobBefore, psnJobAfter);
+			return;
+		}
+
+	}
+
+
+}

+ 270 - 0
hrbm/src/private/nc/impl/bm/listener/BmfileListenerDao.java

@@ -0,0 +1,270 @@
+package nc.impl.bm.listener;
+
+import nc.bs.dao.DAOException;
+import nc.bs.framework.common.NCLocator;
+import nc.bs.logging.Logger;
+import nc.hr.frame.persistence.BaseDAOManager;
+import nc.hr.utils.InSQLCreator;
+import nc.hr.utils.ResHelper;
+import nc.itf.hr.wa.IWaBmfileQueryService;
+import nc.jdbc.framework.SQLParameter;
+import nc.jdbc.framework.processor.MapProcessor;
+import nc.vo.hi.psndoc.PsnJobVO;
+import nc.vo.hr.pub.WaBmFileOrgVO;
+import nc.vo.hr.tools.pub.GeneralVO;
+import nc.vo.pub.BusinessException;
+import nccloud.commons.lang.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+/**
+ * 薪资响应人事变动DAO
+ */
+public class BmfileListenerDao extends BaseDAOManager {
+
+    private String getFilterSql(PsnJobVO psnjobBefore, PsnJobVO psnJobAfter,
+                                int changeDate) throws BusinessException {
+        String sql = "  select pk_bm_data,cyear,cperiod from  bm_data "
+                + "  where   bm_data.checkflag = 'N'";
+//		if (psnjobBefore != null) {
+//			sql += " and pk_psnjob = '" + psnjobBefore.getPk_psnjob() + "'";
+//		} else {
+//		20151223 xiejie3  NCdp205564197 不修改参数反应立即变化进行调配,然后再修改参数立即变化进行调配,调配后人员的信息没有变化
+//		原因:当变动人员业务参数为0时,不立即更新社保档案人员工作记录,导致社保档案存的是上一条工作记录 job1,而此时工作记录有两条job1,job2,
+//			这时,再把参数改成31,增加人员工作记录job3,人事传过来的 工作记录 为 job2,job3,这时,用job2去社保档案去匹配人,将匹配不到,
+//		方案:不再通过工作记录去更新社保档案数据,根据人员主键查询,返回的是所有未审核的社保档案,然后再和业务参数进行比较是否符合要求。
+        sql += " and pk_psndoc = '" + psnJobAfter.getPk_psndoc() + "'";
+//			end
+//		}
+        GeneralVO[] generalVOs = executeQueryVOs(sql, GeneralVO.class);
+
+        String cchangeDay = "" + changeDate;
+        String cchangeDate = "";
+        if (changeDate < 10) {
+            cchangeDay = "0" + changeDate;
+        }
+        ArrayList<String> dataPkList = new ArrayList<String>();
+        for (GeneralVO generalVO : generalVOs) {
+            cchangeDate = generalVO.getAttributeValue("cyear").toString() + "-"
+                    + generalVO.getAttributeValue("cperiod").toString() + "-"
+                    + cchangeDay;
+
+            if (cchangeDate.compareTo(psnJobAfter.getBegindate().toString()) >= 0) {
+                dataPkList.add(generalVO.getAttributeValue("pk_bm_data")
+                        .toString());
+            }
+        }
+        String filterSql = "";
+        if (dataPkList.isEmpty()) {
+            return filterSql;
+        }
+        InSQLCreator inC = new InSQLCreator();
+        try {
+            filterSql = " and pk_bm_data in ("
+                    + inC.getInSQL(dataPkList.toArray(new String[0])) + ")";
+
+        } catch (BusinessException e) {
+            throw new DAOException(e);
+        }
+        return filterSql;
+    }
+
+    /**
+     * 更新薪资档案需要按参数指定的日期过滤
+     *
+     * @param psnjobBefore PsnJobVO
+     * @param psnJobAfter  PsnJobVO
+     * @throws BusinessException
+     */
+    public void updateBmDataByPsnJob(PsnJobVO psnjobBefore,
+                                     PsnJobVO psnJobAfter, int changeDate) throws BusinessException {
+        if (psnJobAfter == null) {
+            return;
+        }
+        String filterSql = getFilterSql(psnjobBefore, psnJobAfter, changeDate);
+        if (StringUtils.isEmpty(filterSql)) {
+            return;
+        }
+        //String sql = "";
+
+        String sql = " update bm_data set pk_psnjob = '"
+//		20151223 xiejie3  NCdp205564197 不修改参数反应立即变化进行调配,然后再修改参数立即变化进行调配,调配后人员的信息没有变化
+//		原因:当变动人员业务参数为0时,不立即更新社保档案人员工作记录,导致社保档案存的是上一条工作记录 job1,而此时工作记录有两条job1,job2,
+//			这时,再把参数改成31,增加人员工作记录job3,人事传过来的 工作记录 为 job2,job3,这时,用job2去社保档案去匹配人,将匹配不到,
+//		方案:不再通过工作记录去更新社保档案数据,根据人员主键查询,返回的是所有未审核的社保档案,然后再和业务参数进行比较是否符合要求。
+//					+ psnJobAfter.getPk_psnjob() + "' where pk_psnjob = '"
+//					+ psnjobBefore.getPk_psnjob() + "' and checkflag = 'N'";
+
+                + psnJobAfter.getPk_psnjob() + "',glbdef1 = '" + psnJobAfter.getAttributeValue("jobglbdef6") + "',glbdef2 = '" + psnJobAfter.getAttributeValue("jobglbdef6")
+                + "' where  checkflag = 'N' ";
+//			end
+        sql += filterSql;
+        getBaseDao().executeUpdate(sql);
+        updateBmDataMulVer(psnJobAfter.getPk_psnjob(), filterSql);
+
+    }
+
+    /**
+     * 更新薪资档案
+     *
+     * @param psnjobBefore PsnJobVO
+     * @param psnJobAfter  PsnJobVO
+     * @throws BusinessException
+     */
+    public void updateBmDataByPsnJob(PsnJobVO psnjobBefore, PsnJobVO psnJobAfter) throws BusinessException {
+        if (psnJobAfter == null) {
+            return;
+        }
+        String sql = " update bm_data set pk_psnjob = '" + psnJobAfter.getPk_psnjob() + "',glbdef1 = '" + psnJobAfter.getAttributeValue("jobglbdef6") + "',glbdef2 = '" + psnJobAfter.getAttributeValue("jobglbdef6")
+                + "' where pk_psnjob = '" + psnjobBefore.getPk_psnjob() + "' and checkflag = 'N'";
+
+        getBaseDao().executeUpdate(sql);
+        updateBmDataMulVer(psnJobAfter.getPk_psnjob(), null);
+    }
+
+    /**
+     * 更新薪资档案
+     *
+     * @param psnjobBefore PsnJobVO
+     * @param psnJobAfter  PsnJobVO
+     * @throws BusinessException
+     */
+    public void updateBmDataByPsnDoc(PsnJobVO psnJobAfter, int changeDate)
+            throws BusinessException {
+        String filterSql = getFilterSql(null, psnJobAfter, changeDate);
+        if (StringUtils.isEmpty(filterSql)
+                && changeDate < psnJobAfter.getBegindate().getDay()) {
+            return;
+        }
+        String sql = "update bm_data set pk_psnjob = '" + psnJobAfter.getPk_psnjob()+ "',glbdef1 = '" + psnJobAfter.getAttributeValue("jobglbdef6") + "',glbdef2 = '" + psnJobAfter.getAttributeValue("jobglbdef6") + "' where pk_psndoc = '" + psnJobAfter.getPk_psndoc() + "' and checkflag = 'N'";
+        sql += filterSql;
+        getBaseDao().executeUpdate(sql);
+        updateBmDataMulVer(psnJobAfter.getPk_psnjob(), filterSql);
+    }
+
+    /**
+     * 更新多版本信息
+     *
+     * @param pk_psnjob
+     * @throws DAOException 20220322按照产品新规划,人员任职记录发生变化时,未审核的社保档案的财务、任职、成本组织部门都要发生改变
+     */
+    public void updateBmDataMulVer(String pk_psnjob, String filterSql)
+            throws DAOException {
+        WaBmFileOrgVO payOrgVO = new WaBmFileOrgVO();
+        String pk_financeorg = null;
+        String pk_financedept = null;
+        String fiporgvid = null;
+        String fipdeptvid = null;
+        String pk_costcenter = null;
+        try {
+            // 2015-10-23 zhousze 判断该VO是否为空 begin
+            //20151212 shenliangc 人员离职记录没有对应财务组织,导致薪资档案更新报错。
+            payOrgVO = NCLocator.getInstance().lookup(IWaBmfileQueryService.class).getPkFinanceOrg(pk_psnjob);
+            if (payOrgVO != null) {
+                pk_financeorg = payOrgVO.getPk_financeorg();
+                pk_financedept = payOrgVO.getPk_financedept();
+                fiporgvid = payOrgVO.getFiporgvid();
+                fipdeptvid = payOrgVO.getFipdeptvid();
+                StringBuffer sbd = new StringBuffer();
+                sbd.append(" select resa_costcenter.pk_costcenter pk_costcenter from resa_costcenter, resa_ccdepts ");
+                sbd.append(" where resa_costcenter.pk_costcenter = resa_ccdepts.pk_costcenter and resa_ccdepts.pk_dept in ");
+                sbd.append(" (SELECT org_dept.pk_dept FROM hi_psnjob,org_dept,bm_data WHERE ");
+                sbd.append(" bm_data.pk_psnjob = hi_psnjob.pk_psnjob AND hi_psnjob.pk_dept = org_dept.pk_dept");
+                sbd.append(" and bm_data.checkflag = 'N' and bm_data.pk_psnjob = '" + pk_psnjob + "' )");
+                sbd.append(" and resa_costcenter.enablestate = '2'");
+                HashMap<String, String> map4lo = (HashMap<String, String>) getBaseDao().executeQuery(sbd.toString(), new MapProcessor());
+                if (map4lo != null && map4lo.size() > 0) {
+                    pk_costcenter = map4lo.get("pk_costcenter");
+                }
+            }
+            // end
+        } catch (BusinessException e) {
+            Logger.error(e.getMessage(), e);
+        }
+        String sqlfi = (pk_financeorg != null ? " , pk_financeorg = '" + pk_financeorg + "'" : " , pk_financeorg = null ")
+                + (pk_financedept != null ? " , pk_financedept = '" + pk_financedept + "'" : " , pk_financedept = null ")
+                + (fiporgvid != null ? " , fiporgvid = '" + fiporgvid + "'" : " , fiporgvid = null ")
+                + (fipdeptvid != null ? " , fipdeptvid = '" + fipdeptvid + "'" : " , fipdeptvid = null ");
+        String sql = "UPDATE bm_data "
+                + " SET workorg = (SELECT org_orgs.pk_org "
+                + "				FROM hi_psnjob,org_orgs "
+                + "				WHERE bm_data.pk_psnjob = hi_psnjob.pk_psnjob "
+                + "					AND hi_psnjob.pk_org = org_orgs.pk_org " + "	) "
+                + "	, workorgvid = (SELECT org_orgs.pk_vid "
+                + "					FROM hi_psnjob,org_orgs "
+                + "					WHERE bm_data.pk_psnjob = hi_psnjob.pk_psnjob "
+                + "						AND hi_psnjob.pk_org = org_orgs.pk_org " + "	) "
+                + "	, workdept = (	SELECT org_dept.pk_dept "
+                + "					FROM hi_psnjob,org_dept "
+                + "					WHERE bm_data.pk_psnjob = hi_psnjob.pk_psnjob "
+                + "						AND hi_psnjob.pk_dept = org_dept.pk_dept " + "	) "
+                + "	, workdeptvid = (	SELECT org_dept.pk_vid "
+                + "						FROM hi_psnjob,org_dept "
+                + "						WHERE bm_data.pk_psnjob = hi_psnjob.pk_psnjob "
+                + "							AND hi_psnjob.pk_dept = org_dept.pk_dept "
+                + "	) "
+                + sqlfi;
+
+        if (StringUtils.isNotBlank(pk_costcenter)) {
+            sql += ", pk_liabilityorg = '" + pk_costcenter + "'"
+                    + "	, pk_liabilitydept = (SELECT org_dept.pk_dept FROM hi_psnjob,org_dept WHERE "
+                    + "                     bm_data.pk_psnjob = hi_psnjob.pk_psnjob AND hi_psnjob.pk_dept = org_dept.pk_dept )"
+                    + "	, libdeptvid = (SELECT org_dept.pk_vid FROM hi_psnjob,org_dept WHERE bm_data.pk_psnjob = hi_psnjob.pk_psnjob AND "
+                    + "						hi_psnjob.pk_dept = org_dept.pk_dept ) ";
+        } else {
+            sql += ", pk_liabilityorg = null"
+                    + "	, pk_liabilitydept = null "
+                    + "	, libdeptvid = null ";
+        }
+        sql += " WHERE bm_data.checkflag = 'N' and pk_psnjob = ?";
+        if (!StringUtils.isEmpty(filterSql)) {
+            sql += filterSql;
+        }
+        SQLParameter param = new SQLParameter();
+        param.addParam(pk_psnjob);
+        getBaseDao().executeUpdate(sql, param);
+    }
+
+    /**
+     * 检查工作记录是否已引用
+     *
+     * @param psnjobBefore PsnJobVO
+     * @throws BusinessException
+     */
+    public void checkPsnJobUsed(PsnJobVO psnjobBefore) throws BusinessException {
+        String sql = " select pk_psndoc from bm_data where pk_psnjob = '" + psnjobBefore.getPk_psnjob() + "' and  checkflag = 'Y' ";
+        if (isValueExist(sql)) {
+            throw new BusinessException(ResHelper.getString("60150bmdata", "060150bmdata0078")
+                    /*@res "数据已被引用,不能删除!"*/);
+        }
+    }
+
+    /**
+     * 检查人员信息是否已引用
+     *
+     * @param psnjobBefore PsnJobVO
+     * @throws BusinessException
+     */
+    public void checkPsnUsed(PsnJobVO psnjobBefore) throws BusinessException {
+        String sql = "select pk_psndoc from bm_data where pk_psndoc = '" + psnjobBefore.getPk_psndoc() + "'";
+        if (isValueExist(sql)) {
+            throw new BusinessException(ResHelper.getString("60150bmdata", "060150bmdata0078")
+                    /*@res "数据已被引用,不能删除!"*/);
+        }
+    }
+
+    /**
+     * 检查工作记录是否已引用
+     *
+     * @param psnJobAfter PsnJobVO
+     * @throws BusinessException
+     */
+    public void checkPsnChange(PsnJobVO psnJobAfter) throws BusinessException {
+        String sql = "select pk_psndoc from bm_data where pk_psndoc = '" + psnJobAfter.getPk_psndoc() + "' and  pk_psnjob not in(select pk_psnjob from hi_psnjob where pk_psndoc = '" + psnJobAfter.getPk_psndoc() + "')";
+        if (isValueExist(sql)) {
+            throw new BusinessException(ResHelper.getString("60150bmdata", "060150bmdata0078")
+                    /*@res "数据已被引用,不能删除!"*/);
+        }
+    }
+}

+ 261 - 0
hrbm/src/public/nc/itf/hr/bm/BmBaseDspUtil.java

@@ -0,0 +1,261 @@
+package nc.itf.hr.bm;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import nc.bs.framework.common.NCLocator;
+import nc.bs.logging.Logger;
+import nc.hr.utils.ResHelper;
+import nc.vo.bm.bmclass.BmClassItemVO;
+import nc.vo.bm.file.BmBaseDspVO;
+import nc.vo.bm.item.BmItemVO;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.lang.UFBoolean;
+
+import nccloud.commons.lang.ArrayUtils;
+import nccloud.commons.lang.StringUtils;
+
+
+public class BmBaseDspUtil<E extends BmBaseDspVO> {
+	/*保存形式*/
+	public static final String PERSONALDSP = "1";
+	public static final String COMMONDSP = "0";
+	
+	public static final String PSNCODE = "psncode" ;/*人员编码*/
+	public static final String CLERKCODE = "clerkcode" ;/*员工号*/
+	public static final String PSNNAME = "psnname" ;/*姓名*/
+	public static final String PLSNAME = "plsname" ;/*人员类别*/
+	public static final String ORGNAME = "orgname" ;/*任职组织*/
+	public static final String DEPTNAME = "deptname" ;/*所在部门*/
+	public static final String POSTNAME = "postname" ;/*所在岗位*/
+	public static final String CLASSCODE = "classcode" ;/*险种编码*/
+	public static final String BMCLASSNAME = "classname" ;/*险种名称*/
+	public static final String CACULATEFLAG = "caculateflag" ;/*计算标志*/
+	public static final String CHECKFLAG = "checkflag" ;/*审核标志*/
+	public static final String CYEAR = "cyear" ;/*年度*/
+	public static final String CPERIOD = "cperiod" ;/*期间*/
+	public static final String FINANCEORGNAME="financeorgname";/*财务组织*/
+	public static final String FINANCEDEPTNAME="financedeptname";/*财务部门*/
+	public static final String LOCATIONNAME = "locationname" ;/*缴交地*/
+	public static final String GLBDEF1 = "glbdef1" ;/*ERP财务组织*/
+	public static final String GLBDEF2 = "glbdef2" ;/*ERP财务部门*/
+//	20151112  xiejie3  NCdp205540298 列表界面的显示设置,默认的显示顺序呢应该是人员编码、员工号、姓名、人员类别、任职组织、任职部门、任职岗位、财务组织、财务部门、险种编码、险种名称、缴交地、计算标志、年度、期间及各缴交项目在险种上的前后顺序。
+	//薪资档案默认显示的字段及顺序
+	public final static String[] defaultShowColKey = new String[]{
+		PSNCODE/*人员编码*/,
+		CLERKCODE/*员工号*/,
+		PSNNAME/*姓名*/,
+		PLSNAME/*人员类别*/,
+		ORGNAME/*任职组织*/,
+		DEPTNAME/*所在部门*/,
+		POSTNAME/*所在岗位*/,
+//		FINANCEORGNAME/*财务组织*/,
+//		FINANCEDEPTNAME/*财务部门*/,
+		CLASSCODE/*险种编码*/,
+		BMCLASSNAME/*险种名称*/,
+		LOCATIONNAME/*缴交地*/,
+		CACULATEFLAG/*计算标志*/,
+		CHECKFLAG/*审核标志*/,
+		CYEAR/*年度*/,
+		CPERIOD/*期间*/,
+		GLBDEF1,
+		GLBDEF2
+
+	};
+//	end	
+	protected static Map<String,String> initShowNameMap(){
+		Map<String,String> nameMap = new HashMap<String, String>();
+		nameMap.put(PSNCODE, ResHelper.getString("commonres", "UC000-0000147")/*@res "人员编码 */);
+		nameMap.put(CLERKCODE, ResHelper.getString("60150bmdata","160150bmdata0002")/*@res "员工号"*/);
+		nameMap.put(PSNNAME, ResHelper.getString("60150bmdata","160150bmdata0003")/*@res "姓名"*/);
+		nameMap.put(PLSNAME, ResHelper.getString("60150bmdata","160150bmdata0004")/*@res "人员类别"*/);
+		nameMap.put(ORGNAME, ResHelper.getString("60150bmdata","160150bmdata0005")/*@res "任职组织"*/);
+		nameMap.put(DEPTNAME, ResHelper.getString("60150bmdata","160150bmdata0006")/*@res "所在部门"*/);
+		nameMap.put(POSTNAME, ResHelper.getString("60150bmdata","160150bmdata0007")/*@res "所在岗位"*/);
+		nameMap.put(CLASSCODE, ResHelper.getString("60150bmdata","160150bmdata0008")/*@res "险种编码"*/);
+		nameMap.put(BMCLASSNAME, ResHelper.getString("60150bmdata","160150bmdata0009")/*@res "险种名称"*/);
+		nameMap.put(CACULATEFLAG, ResHelper.getString("60150bmdata","160150bmdata0010")/*@res "计算标志"*/);
+		nameMap.put(CHECKFLAG, ResHelper.getString("60150bmdata","160150bmdata0011")/*@res "审核标志"*/);
+		nameMap.put(CYEAR, ResHelper.getString("60150bmdata","160150bmdata0012")/*@res "年度"*/);
+		nameMap.put(CPERIOD, ResHelper.getString("60150bmdata","160150bmdata0013")/*@res "期间"*/);
+//		nameMap.put(FINANCEORGNAME, ResHelper.getString("60150bmdata","160150bmdata0015")/*@res "财务组织"*/);
+//		nameMap.put(FINANCEDEPTNAME, ResHelper.getString("60150bmdata","160150bmdata0016")/*@res "财务部门"*/);
+		nameMap.put(LOCATIONNAME, ResHelper.getString("60150bmdata","160150bmdata0017")/*@res "缴交地"*/);
+		nameMap.put(GLBDEF1, "ERP财务组织");
+		nameMap.put(GLBDEF2, "ERP财务部门");
+		return nameMap;
+	}
+	
+	private Class className;
+	
+	
+	
+	public Class getClassName() {
+		return className;
+	}
+
+	public void setClassName(Class className) {
+		this.className = className;
+	}
+
+	/**
+	 * 把getColMap()查询出的结果,转换成List<BmdataDspVO>
+	 * 
+	 * @param colMap
+	 * @return
+	 */
+	public List<E> queryDefaultDsp() {
+		List<E> dspList = new ArrayList<E>();
+		Map<String,String> showNameMap = initShowNameMap();
+		for(int i=0;i<defaultShowColKey.length;i++){
+			E vo = newObject();
+			vo.setItem_key(defaultShowColKey[i]);
+			vo.setItemName(showNameMap.get(defaultShowColKey[i]));
+			vo.setBshow(UFBoolean.TRUE);
+			vo.setIsBmItem(UFBoolean.FALSE);
+			dspList.add((E) vo);
+			
+		}
+		return dspList;
+	}
+	
+	private  E newObject(){
+		E vo = null;
+		try {
+			vo = (E) className.newInstance();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			Logger.error(e.getMessage(),e);
+		} catch (IllegalAccessException e) {
+			Logger.error(e.getMessage(), e);
+		}
+		return vo;
+	}
+	
+	private  E convertBmItemVO(BmClassItemVO itemVO){
+		E dspVO = newObject();
+		dspVO.setItem_key(itemVO.getItemkey());
+		dspVO.setItemName(itemVO.getMultilangName());
+		//显示与否应根据权限设置,待修改薪资项目权限后再修改。
+		dspVO.setBshow(UFBoolean.TRUE);
+		dspVO.setIsBmItem(UFBoolean.TRUE);
+		return (E) dspVO;
+	}
+	
+	/**
+	 * 把缴交项目转换成显示设置项目
+	 * @param itemArray
+	 * @return
+	 */
+	public  List<E> convertBmItemVO(BmClassItemVO[] itemArray){
+		List<E> dspList = new ArrayList<E>();
+		if(!ArrayUtils.isEmpty(itemArray)){
+			for(int i=0;i<itemArray.length;i++){
+				dspList.add(convertBmItemVO(itemArray[i]));
+			}
+		}
+		return dspList;
+	}
+	
+	/**
+	 * 薪资发放显示设置,设置页面显示的多语名称
+	 * @param dspList
+	 * @return
+	 */
+	public  List<E> setBmfileDisplayName(List<E> dspList) {
+		IBmItemQueryService bmItemQueryService = NCLocator.getInstance().lookup(IBmItemQueryService.class);
+		Map<String,String> showNameMap = initShowNameMap();
+		for (int i = 0; i < dspList.size(); i++) {
+			E dspVO = dspList.get(i);
+			if(dspVO.getIsBmItem().booleanValue()){
+				try {
+					BmItemVO[] itemVOs = bmItemQueryService.queryByOrg(dspVO.getPk_group(), dspVO.getPk_org(), " itemkey='"+dspVO.getItem_key()+"'");
+					if (itemVOs != null&&itemVOs.length>0) {
+						if (StringUtils.isNotEmpty(itemVOs[0].getMultilangName())) {
+							dspList.get(i).setItemName(itemVOs[0].getMultilangName());
+						}else{
+							dspList.get(i).setItemName(itemVOs[0].getName());
+						}
+					}
+				}catch (BusinessException e) {
+					Logger.error(e.getMessage());
+				}
+			}else{
+				dspList.get(i).setItemName(showNameMap.get(dspList.get(i).getItem_key()));
+			}
+		}
+		return dspList;
+	}
+//	NCdp205541842   xiejie3   按人员,显示设置项目重复且排序不生效. 
+//	重写了此方法。
+	/**
+	 * 已设置显示顺序之后,方案若有新加的项目,需要添加
+	 * @param dspList
+	 * @param itemArray
+	 */
+//	public  void addNewlyDsiplayItem3(List<E> dspList,
+//			BmClassItemVO[] itemArray) {
+//		if (ArrayUtils.isEmpty(itemArray) || dspList == null) {
+//			return;
+//		}
+//		Map<String, String> dspItemMap = new HashMap<String, String>();
+//		for (E dspVO : dspList) {
+//			if (dspVO.getIsBmItem().booleanValue()) {
+//				dspItemMap.put(dspVO.getItem_key(), dspVO.getItem_key());
+//			}
+//		}
+//		for (int i = 0; i < itemArray.length; i++) {
+//			if(!dspItemMap.containsKey(itemArray[i].getItemkey())){
+//				dspList.add(convertBmItemVO(itemArray[i]));
+//			}
+//		}
+//	}
+//	end
+	/**
+	 * 已设置显示顺序之后,方案若有新加的项目,需要添加
+	 * 已设置显示顺序之后,方案若有删除的项目,需要删除,但由于不能确定是否由于权限查询的项目减少,所以此处仅仅进行过滤。
+	 * @param dspList
+	 * @param itemArray
+	 */
+	
+//	NCdp205541842   xiejie3   按人员,显示设置项目重复且排序不生效. 
+	public  void addNewlyDsiplayItem(List<E> dspList,
+			BmClassItemVO[] itemArray) {
+		if (ArrayUtils.isEmpty(itemArray) || dspList == null) {
+			return;
+		}
+//		xiejie3  已删除的显示项目也需要进行删除过滤。
+		Map<String, BmClassItemVO> itemMap = new HashMap<String, BmClassItemVO>();
+		for(BmClassItemVO   item: itemArray){
+			itemMap.put(item.getItemkey(), item);
+		}
+		List<E> deleteList=new ArrayList<E>();
+		for(E dspVO : dspList ){
+			if (dspVO.getIsBmItem().booleanValue()) {
+				if(!itemMap.containsKey(dspVO.getItem_key())){
+					deleteList.add(dspVO);
+				}
+			}
+		}
+		dspList.removeAll(deleteList);
+		
+		Map<String, String> dspItemMap = new HashMap<String, String>();
+		for (E dspVO : dspList) {
+			if (dspVO.getIsBmItem().booleanValue()) {
+				dspItemMap.put(dspVO.getItem_key(), dspVO.getItem_key());
+			}
+		}
+		for (int i = 0; i < itemArray.length; i++) {
+			if(!dspItemMap.containsKey(itemArray[i].getItemkey())){
+				dspList.add(convertBmItemVO(itemArray[i]));
+			}
+		}
+	}
+	
+//	end
+	
+	
+	
+}

+ 109 - 0
hrbm/src/public/nc/itf/hr/bm/BmdataDspUtil.java

@@ -0,0 +1,109 @@
+package nc.itf.hr.bm;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import nc.vo.bm.data.BmdataDspVO;
+import nc.vo.pub.lang.UFBoolean;
+
+
+public class BmdataDspUtil extends BmBaseDspUtil<BmdataDspVO> {
+	
+	public static final String PSNDOCMODE = "1";
+	public static final String BMCLASSMODE = "2";
+	
+	public static final String CPERIOD = "cperiod" ;/*期间*/
+	public static final int FIXEDCOL = 9;/*固定列*/
+//	20151112 xiejie3  NCdp205540298 列表界面的显示设置,默认的显示顺序呢应该是人员编码、员工号、姓名、人员类别、任职组织、任职部门、任职岗位、财务组织、财务部门、险种编码、险种名称、缴交地、计算标志、年度、期间及各缴交项目在险种上的前后顺序。
+	//薪资档案默认显示的字段及顺序
+	public  static String[] defaultShowColKey = new String[]{
+
+		//by wangqim path to v636
+		PSNCODE/*人员编码*/,
+		CLERKCODE/*员工号*/,
+		PSNNAME/*姓名*/,
+		PLSNAME/*人员类别*/,
+		ORGNAME/*任职组织*/,
+		DEPTNAME/*所在部门*/,
+		POSTNAME/*所在岗位*/,
+//		FINANCEORGNAME/*财务组织*/,
+//		FINANCEDEPTNAME/*财务部门*/,
+		CLASSCODE/*险种编码*/,
+		BMCLASSNAME/*险种名称*/,
+        LOCATIONNAME/*缴交地*/,
+		CACULATEFLAG/*计算标志*/,
+		CHECKFLAG/*审核标志*/,
+		CYEAR/*年度*/,
+		CPERIOD/*期间*/,
+		GLBDEF1,
+		GLBDEF2
+
+	};
+	//薪资档案默认显示的字段及顺序
+    // 20150804 xiejie3 补丁合并,NCdp205399130社保缴交节点,有任职组织,人员类别,岗位等字段无法控制是否显示,begin
+	// zhoumxc
+//	20150923 xiejie3 当按照人员显示的时候,需要有使得下面的几个为固定列,进行单元格合并。begin
+	public final static String[] defaultFixedColKey = new String[]{
+
+//		PSNCODE/*人员编码*/,
+//		CLERKCODE/*员工号*/,
+//		PSNNAME/*姓名*/,
+//
+//		ORGNAME/*任职组织*/,
+//		DEPTNAME/*所在部门*/,
+//		PLSNAME/*人员类别*/,
+//		POSTNAME/*所在岗位*/
+		
+		PSNCODE/*人员编码*/,
+		CLERKCODE/*员工号*/,
+		PSNNAME/*姓名*/,
+		PLSNAME/*人员类别*/,
+		ORGNAME/*任职组织*/,
+		DEPTNAME/*所在部门*/,
+		POSTNAME/*所在岗位*/,
+		FINANCEORGNAME/*财务组织*/,
+		FINANCEDEPTNAME/*财务部门*/,
+	};
+
+	//end
+	public static List<BmdataDspVO> queryFixedDsp() {
+		//界面上显示的名称
+		List<BmdataDspVO> dspList = new ArrayList<BmdataDspVO>();
+		Map<String,String> showNameMap = initShowNameMap();
+		for(int i=0;i<defaultFixedColKey.length;i++){
+			BmdataDspVO vo = new BmdataDspVO();
+			vo.setItem_key(defaultFixedColKey[i]);
+			vo.setItemName(showNameMap.get(defaultFixedColKey[i]));
+			vo.setBshow(UFBoolean.TRUE);
+			vo.setIsBmItem(UFBoolean.FALSE);
+			dspList.add(vo);
+		}
+		return dspList;
+	}
+	
+	/**
+	 * 把getColMap()查询出的结果,转换成List<BmdataDspVO>
+	 * 
+	 * @param colMap
+	 * @return
+	 */
+	@Override
+    public List<BmdataDspVO> queryDefaultDsp() {
+		List<BmdataDspVO> dspList = new ArrayList<BmdataDspVO>();
+		Map<String,String> showNameMap = initShowNameMap();
+		for(int i=0;i<defaultShowColKey.length;i++){
+			BmdataDspVO vo = new BmdataDspVO();
+			vo.setItem_key(defaultShowColKey[i]);
+			vo.setItemName(showNameMap.get(defaultShowColKey[i]));
+			vo.setBshow(UFBoolean.TRUE);
+			vo.setIsBmItem(UFBoolean.FALSE);
+			dspList.add(vo);
+			
+		}
+		return dspList;
+	}
+	
+	
+	
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1103 - 0
hrbm/src/public/nc/vo/bm/data/BmDataVO.java


+ 5 - 0
sql/社保档案增加元数据.sql

@@ -0,0 +1,5 @@
+ALTER TABLE bm_data ADD (glbdef1 VARCHAR2(255),glbdef2 VARCHAR2(255),glbdef3 VARCHAR2(255),glbdef4 VARCHAR2(255),
+glbdef5 VARCHAR2(255),glbdef6 VARCHAR2(255),glbdef7 VARCHAR2(255),glbdef8 VARCHAR2(255),
+glbdef9 VARCHAR2(255),glbdef10 VARCHAR2(255),glbdef11 VARCHAR2(255),glbdef12 VARCHAR2(255),
+glbdef13 VARCHAR2(255),glbdef14 VARCHAR2(255),glbdef15 VARCHAR2(255),glbdef16 VARCHAR2(255),
+glbdef17 VARCHAR2(255),glbdef18 VARCHAR2(255),glbdef19 VARCHAR2(255),glbdef20 VARCHAR2(255));