yuanzhi_kuang 7 miesięcy temu
rodzic
commit
89baa8a0e0

+ 84 - 0
GDYSL/websrc/com/kingdee/customer/Auth/handler/ConfigAddressServletUtil.java

@@ -0,0 +1,84 @@
+package com.kingdee.customer.Auth.handler;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Properties;
+
+import com.kingdee.bos.BOSException;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.log4j.Logger;
+
+/**
+ * @author dengzhouhong
+ * @version 1.0.0
+ * @ClassName ConfigAddressServletUtil.java
+ * @Description TODO
+ * @createTime 2024年04月29日 10:25
+ */
+public class ConfigAddressServletUtil {
+
+    private static Logger logger =
+            Logger.getLogger(ConfigAddressServletUtil.class);
+    static Properties prop = null;
+
+
+
+    /**
+     * 获取登陆邮箱信息
+     * @param
+     * @return
+     * @throws IOException
+     * @throws ConfigurationException
+     * @throws BOSException
+     */
+    public static void getProperties()
+    {
+        String configFilePath= System.getProperty("eas.properties.dir")+ "/adSsoConfig.properties";
+        logger.info("配置文件路径:"+configFilePath);
+        System.out.println("配置文件路径:"+configFilePath);
+        File configFile = new File(configFilePath);
+        prop = new Properties();
+
+        FileInputStream fin = null;
+        try
+        {
+            //createPropertiesFileIfNotExist(configFile);
+            fin = new FileInputStream(configFile);
+            PropertiesConfiguration config = new PropertiesConfiguration();
+            config.load(fin, "UTF-8");
+            prop.setProperty("authUrl", config.getString("authUrl"));
+            prop.setProperty("tokenUrl", config.getString("tokenUrl"));
+            prop.setProperty("refreshTokenUrl", config.getString("refreshTokenUrl"));
+            prop.setProperty("client_id", config.getString("client_id"));
+            prop.setProperty("client_secret", config.getString("client_secret"));
+            prop.setProperty("url", config.getString("shrUrl"));
+            prop.setProperty("userUrl", config.getString("userUrl"));
+            prop.setProperty("dataCenter", config.getString("dataCenter"));
+            prop.setProperty("locale", config.getString("locale"));
+            prop.setProperty("mobileEid", config.getString("mobileEid"));
+
+        }
+        catch (FileNotFoundException e) {
+            logger.error("ConfigAddressUtil.....FileNotFoundException ",e);
+        } catch (IOException e) {
+            logger.error("ConfigAddressUtil.....IOException ",e);
+        } catch (ConfigurationException e) {
+            logger.error("ConfigAddressUtil.....ConfigurationException ",e);
+        } finally {
+            try {
+                fin.close();
+            } catch (IOException e) {
+                logger.error("ConfigAddressUtil.....IOException ",e);
+            }
+        }
+    }
+
+    public static String getProperty(String fileName) {
+        getProperties();
+        return prop.getProperty(fileName);
+    }
+}

+ 201 - 0
GDYSL/websrc/com/kingdee/customer/Auth/handler/TestServlet.java

@@ -0,0 +1,201 @@
+package com.kingdee.customer.Auth.handler;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.util.Base64;
+import com.aliyun.odps.utils.StringUtils;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.eas.cp.eip.sso.util.CloudParamUtil;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class TestServlet extends HttpServlet {
+
+    private final Logger logger = LoggerFactory.getLogger(TestServlet.class);
+
+    public TestServlet() {
+        super();
+    }
+
+    /**
+     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+     */
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        logger.error("into TestServlet.doGet");
+        //标准版流程助手
+        String url = "http://bos.kingdee.com/workflow/main.html?";
+        String wfversion = request.getParameter("wfversion");
+        String storeEid = request.getParameter("storeEid");
+        //移动bos版本流程助手,客户有使用移动bos可使用这个版本
+        //if("mbos".equals(wfversion)){
+
+        /**
+         * https://mbos.kdeascloud.com/mbos/page/loadPage?
+         * path=cmpSubmit88sp1&name=submitbill.editui
+         * &lczstype=list&cometype=havedo&billID=SPKUhmbQSQifgjFU2ESznbEdulw%3D
+         * &assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM
+         * &fprocinstid=653327bb-c464-4472-aa8d-c60b35000674WFPCINST
+         * &operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1
+         * &eid=ww434cb2a638701cdd&appid=10036
+         *
+         * https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231
+         * &path=lczs2&name=approveui.navui
+         *
+         * &eid=ww434cb2a638701cdd&appid=10036
+         * &token=ZmVuZy5jaGVu
+         *
+         *
+         *
+         * &cometype=todo&assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM
+         *
+         *
+         */
+
+        /**
+         * https://mbos.kdeascloud.com/mbos/page/loadPage?
+         *          * path=cmpSubmit88sp1&name=submitbill.editui
+         *          * &lczstype=list&cometype=havedo&billID=SPKUhmbQSQifgjFU2ESznbEdulw%3D
+         *          * &assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM
+         *          * &fprocinstid=653327bb-c464-4472-aa8d-c60b35000674WFPCINST
+         *          * &operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1
+         *
+         *
+         */
+
+        //url = "https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231&path=lczs2&name=approveui.navui";
+
+
+        //TODO:加入的代码拼接跳转的参数
+        String assignmentId = "";
+        HttpSession session = request.getSession();
+        if (session != null) {
+            Map<String, String> assignmentMap = (Map) session.getAttribute("assignment");
+            if (assignmentMap != null && assignmentMap.size() > 0) {
+                assignmentId = assignmentMap.get("assignmentId");
+                logger.info("onSuccessfulValidation......assignmentId:" + assignmentId);
+            }
+        }
+        String billId = "";
+        String fprocinstid = "";
+        try {
+            Map<String,String> paramMap = getParamMapByAssignId(assignmentId);
+            billId = paramMap.get("billId");
+            fprocinstid = paramMap.get("fprocinstid");
+        } catch (BOSException e) {
+            logger.error("TestServlet.doGet" + e.getMessage());
+            throw new ServletException(e.getMessage());
+        }
+
+        url = "https://mbos.kdeascloud.com/mbos/page/loadPage?path=cmpSubmit88sp1&name=submitbill.editui&lczstype=list&billID="+billId+"&fprocinstid="+fprocinstid+"&operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1";
+        if (storeEid != null && !"".equals(storeEid) && !"null".equals(storeEid)) {
+            url = url.replace("storeEid=21231", "storeEid=" + storeEid);
+        }
+        //}
+
+        Map<String, String> infoMap = encryptUserInfo(request);
+
+        Set<String> keySet = infoMap.keySet();
+        for (String key : keySet) {
+            url += "&" + key + "=" + infoMap.get(key);
+        }
+        url = url.replace("?&", "?");
+
+
+        url += "&cometype=havedo&assignId=" + assignmentId;
+        logger.info("OtherAppPortalServlet.doget.url:" + url);
+        response.sendRedirect(url);
+    }
+
+
+    @Override
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        // TODO Auto-generated method stub
+        doGet(request, response);
+    }
+
+
+    /**
+     * accessurl
+     * 如果第三方app点击链接带token,这方法可以不写,将流程助手主页作为应用url,getLoginInfoByToken中根据第三方app的token解析到用户信息即可
+     * 如果第三方app点击链接不带token,将此接口作为应用的url,方法内获取第三方app用户对应的eas用户信息,方法返回值resultMap存跳转到流程助手的参数
+     * http://localhost:8080/otherapp/index?eid=21231&appid=10036&param=zhangsan
+     */
+    public Map<String, String> encryptUserInfo(HttpServletRequest request) {
+        HashMap<String, String> resultMap = new HashMap<String, String>();
+        String param = request.getParameter("param");
+        //下面三个参数为跳转流程助手主页参数
+        String eid = request.getParameter("eid");
+        String appid = request.getParameter("appid");
+        String token = "";
+        //........根据第三方app传来的参数,取到eas用户信息
+        try {
+            token = encrypt_Base64(param);
+        } catch (Exception e) {
+            logger.error("encryptUserInfo encrypt_Base64 Exception" + e.getMessage());
+            e.printStackTrace();
+        }
+        logger.info("encryptUserInfo.token:"+token);
+        resultMap.put("eid", eid);
+        resultMap.put("appid", appid == null ? "10036" : appid);
+        resultMap.put("token", token);
+        return resultMap;
+    }
+
+    /***
+     * Base64加密
+     * @param str 需要加密的参数
+     * @return
+     * @throws Exception
+     */
+    private static String encrypt_Base64(String str) throws Exception {
+        if(StringUtils.isEmpty(str)){
+            return "";
+        }
+        String result = Base64.getEncoder().encodeToString(str.getBytes("UTF-8"));
+        return result;
+    }
+
+
+    /**
+     * 通过assignId 查询出billId 和fprocinstId
+     * @param assignId
+     * @return
+     */
+    private  Map<String,String> getParamMapByAssignId(String assignId) throws BOSException {
+        Map<String,String> paramMap = new HashMap<String,String>();
+        String dataCenter=ConfigAddressServletUtil.getProperty("dataCenter");
+        String locale=ConfigAddressServletUtil.getProperty("locale");
+        Context ctx = CloudParamUtil.getContext(dataCenter, locale, "administrator");
+        String sql = "select fbizobjid as billId,fprocinstid from t_wfr_assign where fassignid = '"+assignId+"'";
+        String billId = "";
+        String fprocinstid = "";
+        try {
+            IRowSet result = DbUtil.executeQuery(ctx, sql);
+            while (result.next()) {
+                billId = result.getString("billId");
+                fprocinstid = result.getString("fprocinstid");
+                paramMap.put("billId",billId);
+                paramMap.put("fprocinstid",fprocinstid);
+            }
+        } catch (SQLException e) {
+            throw new BOSException(e);
+        }
+        return paramMap;
+    }
+
+
+
+}

+ 283 - 0
GDYSL/websrc/com/kingdee/customer/Auth/handler/UserEasAuthServlet.java

@@ -0,0 +1,283 @@
+package com.kingdee.customer.Auth.handler;
+
+import com.aliyun.odps.utils.StringUtils;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.eas.cp.eip.sso.util.CloudParamUtil;
+import com.kingdee.eas.util.StringUtil;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.sql.SQLException;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author dengzhouhong
+ * @version 1.0.0
+ * @ClassName UserEasAuthServlet.java
+ * @Description TODO
+ * @createTime 2024年01月09日 16:24
+ */
+public class UserEasAuthServlet extends HttpServlet{
+
+    private final Logger logger = LoggerFactory.getLogger(UserEasAuthServlet.class);
+
+    public UserEasAuthServlet() {
+        super();
+    }
+
+    /**
+     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+     */
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        logger.error("into TestServlet.doGet");
+        //标准版流程助手
+        String url = "http://bos.kingdee.com/workflow/main.html?";
+        String wfversion = request.getParameter("wfversion");
+        String storeEid = request.getParameter("storeEid");
+        //移动bos版本流程助手,客户有使用移动bos可使用这个版本
+        //if("mbos".equals(wfversion)){
+
+        /**
+         * https://mbos.kdeascloud.com/mbos/page/loadPage?
+         * path=cmpSubmit88sp1&name=submitbill.editui
+         * &lczstype=list&cometype=havedo&billID=SPKUhmbQSQifgjFU2ESznbEdulw%3D
+         * &assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM
+         * &fprocinstid=653327bb-c464-4472-aa8d-c60b35000674WFPCINST
+         * &operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1
+         * &eid=ww434cb2a638701cdd&appid=10036
+         *
+         * https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231
+         * &path=lczs2&name=approveui.navui
+         *
+         * &eid=ww434cb2a638701cdd&appid=10036
+         * &token=ZmVuZy5jaGVu
+         *
+         *
+         *
+         * &cometype=todo&assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM
+         *
+         *
+         */
+
+        /**
+         * https://mbos.kdeascloud.com/mbos/page/loadPage?
+         *          * path=cmpSubmit88sp1&name=submitbill.editui
+         *          * &lczstype=list&cometype=havedo&billID=SPKUhmbQSQifgjFU2ESznbEdulw%3D
+         *          * &assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM
+         *          * &fprocinstid=653327bb-c464-4472-aa8d-c60b35000674WFPCINST
+         *          * &operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1
+         *
+         *
+         */
+
+        //url = "https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231&path=lczs2&name=approveui.navui";
+
+
+        //TODO:加入的代码拼接跳转的参数
+        String assignmentId = "";
+        HttpSession session = request.getSession();
+        if (session != null) {
+            Map<String, String> assignmentMap = (Map) session.getAttribute("assignment");
+            if (assignmentMap != null && assignmentMap.size() > 0) {
+                assignmentId = assignmentMap.get("assignmentId");
+                logger.info("onSuccessfulValidation......assignmentId:" + assignmentId);
+            }
+        }
+        String billId = "";
+        String procinstId = "";
+        String actdefId = "";
+        String procdefId ="";
+        try {
+            Map<String,String> paramMap = getParamMapByAssignId(assignmentId);
+            billId = paramMap.get("billId");
+            procinstId = paramMap.get("procinstId");
+            actdefId = paramMap.get("actdefId");
+            procdefId = paramMap.get("procdefId");
+        } catch (BOSException e) {
+            logger.error("TestServlet.doGet" + e.getMessage());
+            throw new ServletException(e.getMessage());
+        }
+        //encode转换一下
+        if(!StringUtils.isEmpty(billId)){
+            billId = URLEncoder.encode(billId);
+        }
+
+        //url = "https://mbos.kdeascloud.com/mbos/page/loadPage?path=cmpSubmit88sp1&name=submitbill.editui&billID="+billId+"&fprocinstid="+procinstId+"&operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=1";
+        url = "&billID="+billId+"&fprocinstid="+procinstId+"&operateState=VIEW&lczsapprove=9444be02b9d40929508ff587f216a64e&canChangeLanguage=0";
+
+        if (storeEid != null && !"".equals(storeEid) && !"null".equals(storeEid)) {
+            url = url.replace("storeEid=21231", "storeEid=" + storeEid);
+        }
+        //}
+
+        Map<String, String> infoMap = null;
+        try {
+            infoMap = encryptUserInfo(request);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        Set<String> keySet = infoMap.keySet();
+        for (String key : keySet) {
+            url += "&" + key + "=" + infoMap.get(key);
+        }
+        url = url.replace("?&", "?");
+
+
+        url += "&cometype=havedo&assignId=" + assignmentId;
+
+        //替换url:  url.replace("page/loadPage", "mbosw/getWorkflowUrl");
+        String urlR = "";
+        try {
+            urlR = getUrlByWorkflow(actdefId,procdefId);
+        } catch (BOSException e) {
+            logger.error("TestServlet.getUrlByWorkflow" + e.getMessage());
+            throw new ServletException(e.getMessage());
+        }
+        if(StringUtils.isEmpty(urlR)){
+            //静态列的显示地址
+            urlR = "https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231&path=lczs2&name=approveui.navui";
+            if (storeEid != null && !"".equals(storeEid) && !"null".equals(storeEid)) {
+                urlR = urlR.replace("storeEid=21231", "storeEid=" + storeEid);
+            }
+            //https://mbos.kdeascloud.com/mbos/page/loadPage?storeEid=21231&path=lczs2&name=approveui.navui&eid=ww434cb2a638701cdd&appid=10036&token=ZmVuZy5jaGVu&cometype=todo&assignId=22910d25-d1b4-425c-9e87-eaa287f438b6WFWKITEM
+            Set<String> keySet2 = infoMap.keySet();
+            for (String key : keySet2) {
+                urlR += "&" + key + "=" + infoMap.get(key);
+            }
+            urlR = urlR.replace("?&", "?");
+            urlR += "&canChangeLanguage=0&cometype=todo&assignId=" + assignmentId;
+            logger.info("静态列的显示地址:OtherAppPortalServlet.doget.urlR:" + urlR);
+
+        }else{
+            //动态列的显示
+            urlR = urlR +url;
+            urlR = urlR.replace("page/loadPage", "mbosw/getWorkflowUrl");
+            logger.info("动态态列的显示地址:OtherAppPortalServlet.doget.urlR:" + urlR);
+        }
+
+        logger.info("OtherAppPortalServlet.doget.url:" + urlR);
+        response.sendRedirect(urlR);
+    }
+
+
+    @Override
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        // TODO Auto-generated method stub
+        doGet(request, response);
+    }
+
+
+    /**
+     * accessurl
+     * 如果第三方app点击链接带token,这方法可以不写,将流程助手主页作为应用url,getLoginInfoByToken中根据第三方app的token解析到用户信息即可
+     * 如果第三方app点击链接不带token,将此接口作为应用的url,方法内获取第三方app用户对应的eas用户信息,方法返回值resultMap存跳转到流程助手的参数
+     * http://localhost:8080/otherapp/index?eid=21231&appid=10036&param=zhangsan
+     */
+    public Map<String, String> encryptUserInfo(HttpServletRequest request) throws ServletException {
+        HashMap<String, String> resultMap = new HashMap<String, String>();
+        String param = request.getParameter("param");
+        //下面三个参数为跳转流程助手主页参数
+        String eid = request.getParameter("eid");
+        String appid = request.getParameter("appid");
+        String token = "";
+        //........根据第三方app传来的参数,取到eas用户信息
+        try {
+            token = encrypt_Base64(param);
+        } catch (Exception e) {
+            logger.error("encryptUserInfo encrypt_Base64 Exception" + e.getMessage());
+            throw new ServletException(e.getMessage());
+        }
+        logger.info("encryptUserInfo.token:"+token);
+        resultMap.put("eid", eid);
+        resultMap.put("appid", appid == null ? "10036" : appid);
+        resultMap.put("token", token);
+        return resultMap;
+    }
+
+    /***
+     * Base64加密
+     * @param str 需要加密的参数
+     * @return
+     * @throws Exception
+     */
+    private static String encrypt_Base64(String str) throws Exception {
+        if(StringUtils.isEmpty(str)){
+            return "";
+        }
+        String result = Base64.getEncoder().encodeToString(str.getBytes("UTF-8"));
+        return result;
+    }
+
+    /**
+     * 通过assignId 查询出billId 和fprocinstId,actdefId
+     * @param assignId
+     * @return
+     */
+    private  Map<String,String> getParamMapByAssignId(String assignId) throws BOSException {
+        Map<String,String> paramMap = new HashMap<String,String>();
+        String dataCenter=ConfigAddressServletUtil.getProperty("dataCenter");
+        String locale=ConfigAddressServletUtil.getProperty("locale");
+        Context ctx = CloudParamUtil.getContext(dataCenter, locale, "administrator");
+        String sql = "select fbizobjid as billId,fprocinstid as procinstId,factdefid as actdefId,fprocdefid as procdefId from t_wfr_assign where fassignid = '"+assignId+"'";
+        logger.info("UserEasAuthServlet.getParamMapByAssignId.sql:"+sql);
+        String billId = "";
+        String procinstId = "";
+        String actdefId = "";
+        String procdefId = "";
+        try {
+            IRowSet result = DbUtil.executeQuery(ctx, sql);
+            while (result.next()) {
+                billId = result.getString("billId");
+                procinstId = result.getString("procinstId");
+                actdefId = result.getString("actdefId");
+                procdefId = result.getString("procdefId");
+                paramMap.put("billId",billId);
+                paramMap.put("procinstId",procinstId);
+                paramMap.put("actdefId",actdefId);
+                paramMap.put("procdefId",procdefId);
+            }
+        } catch (SQLException e) {
+            throw new BOSException(e);
+        }
+        return paramMap;
+    }
+
+    /**
+     *  获取审批的替换的url
+     * @return
+     */
+    private String getUrlByWorkflow(String actdefId,String procdefId) throws BOSException {
+        String dataCenter=ConfigAddressServletUtil.getProperty("dataCenter");
+        String locale=ConfigAddressServletUtil.getProperty("locale");
+        Context ctx = CloudParamUtil.getContext(dataCenter, locale, "administrator");
+        String sql = " SELECT url FROM T_WFR_MBOS_WORKFLOW where actDefId ='"+actdefId+"' and procdefid = '"+procdefId+"'";
+        logger.info("UserEasAuthServlet.getUrlByWorkflow.sql:"+sql);
+        String url = "";
+        try {
+            IRowSet result = DbUtil.executeQuery(ctx, sql);
+            while (result.next()) {
+                url = result.getString("url");
+            }
+        } catch (SQLException e) {
+            throw new BOSException(e);
+        }
+        return url;
+    }
+
+
+}

+ 188 - 0
GDYSL/websrc/com/kingdee/customer/hr/emp/web/handler/SHRPersonBizManageF7ListHandlerEx.java

@@ -0,0 +1,188 @@
+package com.kingdee.customer.hr.emp.web.handler;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.metadata.MetaDataPK;
+import com.kingdee.bos.metadata.data.DataTableInfo;
+import com.kingdee.bos.metadata.entity.EntityObjectInfo;
+import com.kingdee.bos.metadata.entity.PropertyInfo;
+import com.kingdee.bos.metadata.query.*;
+import com.kingdee.eas.hr.base.util.HRUtil;
+import com.kingdee.eas.hr.emp.web.handler.SHRPersonBizManageF7ListHandler;
+import com.kingdee.eas.hr.emp.web.util.PersonF7LikeConvertInitParamUtil;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.base.syssetting.component.commonquery.CommonQueryHelper;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.util.LocaleUtils;
+import com.kingdee.shr.base.syssetting.web.dynamic.model.ListUIViewInfo;
+import com.kingdee.util.StringUtils;
+import org.springframework.ui.ModelMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.Set;
+
+public class SHRPersonBizManageF7ListHandlerEx  extends SHRPersonBizManageF7ListHandler {
+
+
+    public String getListDataAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
+        Context ctx = SHRContext.getInstance().getContext();
+        String modelFilter = (String)modelMap.get("filter");
+        if (StringUtils.isEmpty(modelFilter)) {
+            String filter = request.getParameter("filter");
+            if (null != filter) {
+                if (filter.indexOf("idRangeFromPluralityDel") != -1) {  //and     fleffdt={2199-12-31}  and  FFlowOutAffairID is null   t.fassigntype=0 and t.fisInner = 1
+                    filter = filter.replace("idRangeFromPluralityDel", " position.id in (select fpositionid from T_HR_EmpOrgRelation where FassignType=0    and FIsInner=1 and FActionID not in ('jpoAAAH/03nmaL7Z','V2vNOLaKRuGuv9/HNB5laOZovtk=')) ");
+                    modelMap.put("filter", filter);
+                }
+
+                String queryFilter;
+                String selectedOldCompanyId;
+                if (filter.indexOf("idRanFromMultiEntry") != -1) {
+                    queryFilter = filter.substring(0, filter.indexOf("idRanFromMultiEntry"));
+                    selectedOldCompanyId = filter.substring(filter.indexOf("idRanFromMultiEntry") + "idRanFromMultiEntry".length());
+                    filter = queryFilter + " id in (select fpersonid from t_hr_personposition where FPRIMARYPOSITIONID ='" + selectedOldCompanyId + "')";
+                    modelMap.put("filter", filter);
+                }
+
+                if (filter.indexOf("idRanFromMultiEntryByCompany") != -1) {
+                    queryFilter = filter.substring(0, filter.indexOf("idRanFromMultiEntryByCompany"));
+                    selectedOldCompanyId = filter.substring(filter.indexOf("idRanFromMultiEntryByCompany") + "idRanFromMultiEntryByCompany".length(), filter.length() - 2);
+                    filter = queryFilter + " id in (SELECT fpersonid FROM t_hr_personposition pp left join t_org_admin adminOrg on adminOrg.fid = pp.fpersondep where adminOrg.fcompanyid = '" + selectedOldCompanyId + "') ";
+                    if (filter.indexOf("F7query") != -1) {
+                        filter = filter.replace("F7query", "select");
+                    }
+
+                    modelMap.put("filter", filter);
+                }
+
+                if (filter.indexOf("F7query") != -1) {
+                    filter = filter.replace("F7query", "select");
+                    modelMap.put("filter", filter);
+                }
+            }
+        }
+
+        if (PersonF7LikeConvertInitParamUtil.isQueryUseLikeConvert(ctx)) {
+            this.likeQueryConvert(request, response, modelMap);
+        }
+
+        return super.getListDataAction(request, response, modelMap);
+    }
+
+
+
+    private void likeQueryConvert(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
+        Context ctx = SHRContext.getInstance().getContext();
+        String filterItems = (String)modelMap.get("filterItems");
+        if (StringUtils.isEmpty(filterItems)) {
+            filterItems = request.getParameter("filterItems");
+            String query = "";
+            ListUIViewInfo uiViewInfo = (ListUIViewInfo)this.getUIViewInfo(request);
+            if (uiViewInfo != null && uiViewInfo.getQuery() != null) {
+                query = uiViewInfo.getQuery();
+            }
+
+            if (!StringUtils.isEmpty(filterItems)) {
+                String queryEntity = "";
+                String newFilterItems = "";
+                String tempTableName = "";
+                String ids = "";
+                Boolean isUseTemplateTable = false;
+                if (filterItems.contains("like") && !StringUtils.isEmpty(query)) {
+                    QueryInfo queryInfo = CommonQueryHelper.getQueryInfo(ctx, MetaDataPK.create(query));
+                    PropertyUnitCollection units = queryInfo.getUnits();
+
+                    for(int i = 0; i < units.size(); ++i) {
+                        PropertyUnitInfo propertyUnitInfo = units.get(i);
+                        if (propertyUnitInfo instanceof QueryFieldInfo) {
+                            QueryFieldInfo queryFieldInfo = (QueryFieldInfo)units.get(i);
+                            PropertyRefCollection propertyRefs = queryFieldInfo.getPropertyRefs();
+                            String l = LocaleUtils.getShortCode(ctx);
+
+                            for(int j = 0; j < propertyRefs.size(); ++j) {
+                                PropertyRefInfo propertyRefInfo = propertyRefs.get(j);
+                                SubEntityInfo subEntity = propertyRefInfo.getSubEntity();
+                                String entityName = subEntity.getName();
+                                EntityObjectInfo entityRef = subEntity.getEntityRef();
+                                PropertyInfo refProperty = propertyRefInfo.getRefProperty();
+                                String propertyName = refProperty.getName();
+                                String[] split = filterItems.split("like");
+                                String queryRealName = split[0].replace("(", "").trim();
+                                String queryName = entityName + "." + propertyName;
+                                String sql = "";
+                                if (queryName.equalsIgnoreCase(queryRealName)) {
+                                    queryEntity = entityName;
+                                    DataTableInfo table = entityRef.getTable();
+                                    if (refProperty.getMappingField().isMultilingual()) {
+                                        sql = "select fid from " + table.getName() + " where " + refProperty.getMappingField().getName() + "_" + l + " like " + split[1].replace(")", "").trim();
+                                    } else {
+                                        sql = "select fid from " + table.getName() + " where " + refProperty.getMappingField().getName() + " like " + split[1].replace(")", "").trim();
+                                    }
+
+                                    if (!StringUtils.isEmpty(sql)) {
+                                        try {
+                                            Set<String> idSet = new HashSet();
+                                            IRowSet executeQuery = DbUtil.executeQuery(ctx, sql);
+                                            if (executeQuery.size() >= 400) {
+                                                isUseTemplateTable = true;
+                                            }
+
+                                            if (isUseTemplateTable) {
+                                                String userNumber = ctx.getUserName();
+                                                String tempTableKey = "TT4EMPLIKE_" + userNumber;
+
+                                                try {
+                                                    tempTableName = createTempTable(request, ctx, tempTableKey, sql.toString());
+                                                } catch (BOSException var37) {
+                                                    var37.printStackTrace();
+                                                    throw new SHRWebException(var37.getMessage(), var37);
+                                                }
+                                            } else {
+                                                while(executeQuery.next()) {
+                                                    idSet.add(executeQuery.getString("fid"));
+                                                }
+
+                                                ids = HRUtil.getStrFromSet(idSet);
+                                            }
+                                        } catch (BOSException var38) {
+                                            var38.printStackTrace();
+                                            throw new SHRWebException(var38.getMessage(), var38);
+                                        } catch (SQLException var39) {
+                                            var39.printStackTrace();
+                                            throw new SHRWebException(var39.getMessage(), var39);
+                                        }
+                                    }
+                                }
+
+                                if (!StringUtils.isEmpty(ids)) {
+                                    newFilterItems = queryEntity + ".id in " + ids;
+                                    break;
+                                }
+
+                                if (isUseTemplateTable) {
+                                    newFilterItems = queryEntity + ".id in " + "(select * from " + tempTableName + ")";
+                                    break;
+                                }
+                            }
+
+                            if (!StringUtils.isEmpty(newFilterItems)) {
+                                break;
+                            }
+                        }
+                    }
+
+                    if (!StringUtils.isEmpty(newFilterItems)) {
+                        modelMap.put("filterItems", newFilterItems);
+                    }
+                }
+            }
+        }
+
+    }
+
+}

+ 250 - 0
GDYSL/websrc/com/kingdee/customer/salary/handler/SalaryBag2EditHandler.java

@@ -0,0 +1,250 @@
+package com.kingdee.customer.salary.handler;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.sql.SQLException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+import org.springframework.ui.ModelMap;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.custom.bill.salary.ISalaryBag;
+import com.kingdee.eas.custom.bill.salary.SalaryBagEntryCollection;
+import com.kingdee.eas.custom.bill.salary.SalaryBagEntryInfo;
+import com.kingdee.eas.custom.bill.salary.SalaryBagFactory;
+import com.kingdee.eas.custom.bill.salary.SalaryBagInfo;
+import com.kingdee.eas.framework.CoreBaseInfo;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryInfo;
+import com.kingdee.eas.hr.base.HRBillStateEnum;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.base.syssetting.app.io.fileImport.ImportException;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+import com.kingdee.shr.base.syssetting.util.MetaDataUtil;
+import com.kingdee.shr.base.syssetting.web.handler.EditHandler;
+import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
+import com.kingdee.shr.compensation.CmpItemInfo;
+
+/**
+ * 工资包编辑处理器
+ * @author issuser
+ *
+ */
+public class SalaryBag2EditHandler extends EditHandler {
+
+    private static Logger logger =
+            Logger.getLogger("com.kingdee.customer.salary.handler.SalaryBagEditHandler");
+
+    /**
+     * 生成工资包的数据明细
+     * @param request   HTTP请求对象,包含前端传来的工资包信息
+     * @param response  HTTP响应对象,用于向前端返回结果
+     * @param modelMap  ModelMap对象,用于在请求处理过程中传递数据
+     */
+    public void createEntryDetailAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) {
+        // 从HTTP请求中获取开始日期、结束日期、补发日期、总金额、工资包ID等参数
+        String startDateStr = request.getParameter("startDate");
+        String endDateStr = request.getParameter("endDate");
+        String reissueDateStr = request.getParameter("reissueDate");
+        String money = request.getParameter("money");
+        String billId = request.getParameter("billId");
+
+        // 获取业务上下文
+        Context ctx = SHRContext.getInstance().getContext();
+        try {
+            // 构建查询SQL语句,用于获取指定工资包ID的相关信息
+            String selectSql = "SELECT  b.fid as personId,b.FNAME_l2 as personName,"
+                    + " c.FID as cmpItemId ,c.FNAME_l2 as cmpItemName,a.CFPaycurrency,a.CFendDate "
+                    + " FROM CT_SAL_SalaryBag a "
+                    + " left join t_bd_person b on a.CFPersonID = b.FID "
+                    + " left join T_HR_SCmpItem c on a.CFCmpItemID = c.fid "
+                    + " where a.fid = '" + billId + "'";
+            System.out.println("工资包变更sql=========" + selectSql);
+            // 执行查询操作
+            IRowSet rs = DbUtil.executeQuery(ctx, selectSql.toString());
+            String cmpItemId = null;
+            String cmpItemName = null;
+            String paycurrency = null;
+            Date soureEndDate = null;
+            if (rs.next()) {
+                // 从查询结果中取出相关信息
+                cmpItemId = rs.getString("cmpItemId");
+                cmpItemName = rs.getString("cmpItemName");
+                paycurrency = rs.getString("CFPaycurrency");
+                soureEndDate = rs.getDate("CFendDate");
+            }
+
+            // 创建日期格式化对象
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            // 解析前端传来的结束日期和补发日期
+            Date endDate = sdf.parse(endDateStr);
+            Date reissueDate = sdf.parse(reissueDateStr);
+
+            // 验证结束日期是否早于原始文档的过期日期
+            if (soureEndDate.after(endDate)) {
+                throw new ImportException("新的过期日期不能早于原始文档的过期日期");
+            }
+
+            // 获取月份明细列表,即从开始日期到结束日期之间的所有月份
+            List<Date> monthList = getMonthDetail(startDateStr, endDateStr);
+            System.out.println("月份=========" + monthList.size());
+            // 创建结果列表,用于存储每个月份的工资包明细
+            List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
+            // 创建总金额对象,并将其转换为BigDecimal类型
+            BigDecimal moneyAmount = new BigDecimal(money);
+
+            // 设置保留的小数位数为两位,并根据金额大小选择合适的取整模式
+            int scale = 2; // 保留两位小数
+            RoundingMode roundingMode = (moneyAmount.compareTo(BigDecimal.ZERO) < 0)
+                    ? RoundingMode.HALF_DOWN  // 负数时向下取整
+                    : RoundingMode.HALF_UP;   // 正数时四舍五入
+            // 计算平均分配到每个月的金额
+            BigDecimal avgAmount = moneyAmount.divide(BigDecimal.valueOf(monthList.size()), scale, roundingMode);
+
+            // 初始化已生成额度的金额和补发月应发金额
+            BigDecimal remainder = new BigDecimal(0);
+            BigDecimal amountPayable = new BigDecimal(0);
+
+            // 遍历每个月份,生成相应的工资包明细
+            for (int i = 0; i < monthList.size(); i++) {
+                Map<String, Object> entryMap = new HashMap<String, Object>();
+                // 获取当前月份
+                Date months = monthList.get(i);
+                // 将月份信息和其他相关数据放入entryMap中
+                entryMap.put("months", months);
+                entryMap.put("paycurrency", paycurrency);
+                entryMap.put("cmpItemId", cmpItemId);
+                entryMap.put("cmpItemName", cmpItemName);
+
+                // 如果不是最后一个月,则将平均金额加到已生成额度的金额中
+                if (monthList.size() - i > 1) {
+                    remainder = remainder.add(avgAmount);
+                } else {
+                    // 如果是最后一个月,则计算最后一个月的实际金额
+                    avgAmount = moneyAmount.subtract(remainder);
+                }
+
+                // 将平均金额放入entryMap中
+                entryMap.put("moneys", avgAmount);
+                // 获取变更前的金额
+                BigDecimal beforeAmount = getBeforeAmount(billId, sdf.format(months));
+                // 将变更前的金额放入entryMap中
+                entryMap.put("beforeAmount", beforeAmount);
+
+                // 根据当前月份与补发日期的关系,计算应发金额和补发金额
+                if (monthList.get(i).equals(reissueDate)) {
+                    // 如果当前月份等于补发日期,不应发补发金额,应发金额为平均金额
+                    entryMap.put("reissueAmount", 0);
+                    entryMap.put("amountPayable", amountPayable.add(avgAmount));
+                } else if (monthList.get(i).after(reissueDate)) {
+                    // 如果当前月份晚于补发日期,不应发补发金额,应发金额为平均金额
+                    entryMap.put("amountPayable", avgAmount);
+                    entryMap.put("reissueAmount", 0);
+                } else {
+                    // 如果当前月份早于补发日期,应发金额为0,补发金额为平均金额减去变更前金额
+                    entryMap.put("amountPayable", 0);
+                    entryMap.put("reissueAmount", avgAmount.subtract(beforeAmount));
+                    // 更新总应发差额
+                    amountPayable = amountPayable.add(avgAmount.subtract(beforeAmount));
+                }
+
+                // 输出当前月份的工资包明细
+                System.out.println("月份result=========" + entryMap);
+                // 将entryMap添加到结果列表中
+                resultList.add(entryMap);
+            }
+            // 将结果列表以JSON格式写入HTTP响应中,返回给前端
+            JSONUtils.writeJson(response, resultList);
+        } catch (BOSException e) {
+            // 捕获并打印业务异常信息
+            e.printStackTrace();
+        } catch (ParseException e) {
+            // 捕获并打印日期解析异常信息
+            e.printStackTrace();
+        } catch (SHRWebException e) {
+            // 捕获并打印Web异常信息
+            e.printStackTrace();
+        } catch (SQLException e) {
+            // 捕获并打印SQL异常信息
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 获取指定工资包ID和月份的变更前金额
+     * @param billId  工资包ID
+     * @param months  指定月份
+     * @return        变更前的金额
+     * @throws BOSException  业务异常
+     * @throws SQLException  SQL异常
+     */
+    private BigDecimal getBeforeAmount(String billId, String months) throws BOSException, SQLException {
+        // 获取业务上下文
+        Context ctx = SHRContext.getInstance().getContext();
+        // 初始化变更前的金额为0
+        BigDecimal beforeAmount = new BigDecimal(0);
+        // 构建查询SQL语句,用于获取指定工资包ID和月份的变更前金额
+        String selectSql = "SELECT CFMoneys FROM  CT_SAL_SalaryBagEntry where FBillID = '" + billId + "' and to_char(CFMonths,'yyyy-MM-dd') = '" + months + "'";
+        System.out.println("查找变更前金额=========" + selectSql);
+        // 执行查询操作
+        IRowSet rs = DbUtil.executeQuery(ctx, selectSql.toString());
+        if (rs.next()) {
+            // 从查询结果中取出变更前的金额
+            beforeAmount = rs.getBigDecimal("CFMoneys");
+        }
+        // 返回变更前的金额
+        return beforeAmount;
+    }
+
+    /**
+     * 根据开始日期和结束日期,生成月份明细列表
+     * @param startDateStr 开始日期字符串
+     * @param endDateStr   结束日期字符串
+     * @return             月份明细列表
+     * @throws ParseException 日期解析异常
+     */
+    private List<Date> getMonthDetail(String startDateStr, String endDateStr) throws ParseException {
+        // 创建日期格式化对象,只提取年月信息
+        SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM");
+        // 解析开始日期和结束日期
+        Date startDate = sdfMonth.parse(startDateStr);
+        Date endDate = sdfMonth.parse(endDateStr);
+        Date currentDate = startDate;
+        // 创建月份列表
+        List<Date> monthList = new ArrayList<Date>();
+        // 创建Calendar实例,用于月份计算
+        Calendar calendar = Calendar.getInstance();
+        // 当前日期小于等于结束日期时,继续循环
+        while (endDate.after(currentDate) || currentDate.equals(endDate)) {
+            // 将当前日期添加到月份列表中
+            monthList.add(currentDate);
+            // 设置Calendar的时间为当前日期
+            calendar.setTime(currentDate);
+            // 将Calendar的时间增加一个月
+            calendar.add(Calendar.MONTH, 1);
+            // 更新当前日期为增加一个月后的日期
+            currentDate = calendar.getTime();
+        }
+        // 返回月份明细列表
+        return monthList;
+    }
+}

+ 323 - 0
GDYSL/websrc/com/kingdee/shr/ats/web/handler/util/YearPlanFileService.java

@@ -0,0 +1,323 @@
+package com.kingdee.shr.ats.web.handler.util;
+
+
+ 
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.ICommonBOSType;
+import com.kingdee.bos.metadata.MetaDataLoaderFactory;
+import com.kingdee.bos.metadata.MetaDataPK;
+import com.kingdee.bos.metadata.entity.EntityObjectInfo;
+import com.kingdee.eas.base.codingrule.CodingRuleManagerFactory;
+import com.kingdee.eas.base.codingrule.ICodingRuleManager;
+import com.kingdee.eas.basedata.org.*;
+import com.kingdee.eas.basedata.person.IPerson;
+import com.kingdee.eas.basedata.person.PersonCollection;
+import com.kingdee.eas.basedata.person.PersonFactory;
+import com.kingdee.eas.basedata.person.PersonInfo;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.framework.*;
+import com.kingdee.eas.hr.base.HRBillStateEnum;
+import com.kingdee.eas.hr.emp.PersonPositionCollection;
+import com.kingdee.eas.hr.emp.PersonPositionFactory;
+import com.kingdee.eas.hr.emp.PersonPositionInfo;
+import com.kingdee.shr.base.syssetting.app.io.fileImport.BaseImportService;
+import com.kingdee.shr.base.syssetting.app.io.fileImport.BaseResultInfo;
+import com.kingdee.shr.base.syssetting.app.io.fileImport.BaseRowInfo;
+import com.kingdee.shr.base.syssetting.app.io.fileImport.ImportException;
+import com.kingdee.shr.base.syssetting.util.MetaDataUtil;
+import com.kingdee.shr.shrimport.SHRFileTemplateInfo;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+import java.util.*;
+
+import static com.kingdee.shr.ats.web.util.file.Constants.hrOrg;
+
+/**
+ * 年假计划批量导入
+ * @author kkuan
+ *
+ */
+public class YearPlanFileService extends BaseImportService {
+    private static Logger logger = Logger.getLogger(YearPlanFileService.class);
+
+	private static final String  PERSONNUM = "Person.number";
+	private static final String  HRORG =  "hrOrg";
+
+    	@Override
+    	public boolean isBatch(SHRFileTemplateInfo templateInfo) {
+    		return true;
+    	}
+
+    	@Override
+    	public boolean startBatchImport(Iterator<BaseRowInfo> rowIterator) {
+			Context ctx = getContext();
+			List<BaseRowInfo> list = new ArrayList<BaseRowInfo>(); //保存通过标准校验的数据
+
+    		while (rowIterator.hasNext()) {
+    			BaseRowInfo rowInfo = rowIterator.next();
+    			try {
+    				// 标准模板校验
+    				super.verifyRow(rowInfo);
+    			} catch (ImportException e) { 
+    				// 有异常说明校验不通过
+    				BaseResultInfo resultInfo = new BaseResultInfo(rowInfo);
+    				resultInfo.setSuccess(false);
+    				resultInfo.setMessage(e.getMessage());
+    				resultInfo.setE(e);
+    				super.getMonitor().completeRow(resultInfo);
+    				continue;
+    			}
+    			list.add(rowInfo);
+    		}
+
+			//根据业务组织分组; 同一业务组织的放在一张单上;
+			LinkedHashMap<String, List<BaseRowInfo>> rowMap = new LinkedHashMap ();
+			try {
+				IPerson perIns  = PersonFactory.getLocalInstance(ctx);
+				for (int i = 0; i < list.size(); i++) {
+					BaseRowInfo row = list.get(i);
+					String personNum = row.getValueOfString(PERSONNUM);
+					PersonCollection personCollection = null;
+					try {
+						personCollection = perIns.getPersonCollection("where  number = '" + personNum + "' or name = '" + personNum + "'");
+					} catch (BOSException e) {
+						throw new RuntimeException(e);
+					}
+					PersonInfo personInfo = personCollection.get(0);
+					PersonPositionInfo positionInfo = this.getAdminOrgUnit(ctx, personInfo.getId().toString());
+					HROrgUnitInfo hrOrgUnit = positionInfo.getHrOrgUnit();
+					if(null == hrOrgUnit){
+						throw new RuntimeException("人员业务组织信息为空,请检查!");
+					}
+					String  hrOrg  = hrOrgUnit.getNumber().toString();
+					 
+					if(rowMap.containsKey(hrOrg)){
+						List<BaseRowInfo>  dataList =    rowMap.get(hrOrg);
+						dataList.add(row);
+					}else{
+						List<BaseRowInfo>  dataList =  new ArrayList();
+						dataList.add(row);
+						rowMap.put(hrOrg,dataList);
+					}
+				}
+
+			} catch (BOSException e) {
+				throw new RuntimeException(e);
+			}
+
+			int sucessCount = 0; //成功数量,通过业务校验即认为是成功。
+			int count = super.getMonitor().getProgress().getCount(); // 导入的总数量
+			CoreBaseCollection billCol = new CoreBaseCollection(); //分录
+			String entityName =  "com.kingdee.eas.jiaotou.app.NJJH";
+			for (Map.Entry<String, List<BaseRowInfo>> entry : rowMap.entrySet()) {
+				List<BaseRowInfo> rowList = entry.getValue();
+				String hrOrg = entry.getKey();
+				CoreBaseInfo billInfo = null; 
+				 try {
+					 billInfo = createInfo(entityName);
+				} catch (Exception e1) {
+					e1.printStackTrace();
+				}
+
+				CoreBaseCollection coll = new CoreBaseCollection(); //分录
+				try {
+					IHROrgUnit orgIns = HROrgUnitFactory.getLocalInstance(ctx);
+					HROrgUnitCollection hrOrgCol = orgIns.getHROrgUnitCollection("where  number = '" + hrOrg + "' or name = '" + hrOrg + "'");
+					HROrgUnitInfo hrOrgUnitInfo = hrOrgCol.get(0);
+					billInfo.put("hrOrgUnit",hrOrgUnitInfo);
+					String newNumber = getNewNumber(ctx, billInfo);
+					billInfo.put("number",newNumber);
+					billInfo.put("billState", HRBillStateEnum.SAVED_VALUE);
+				} catch (BOSException e) {
+					throw new RuntimeException(e);
+				}
+				for (int i = 0; i < rowList.size(); i++) {
+					BaseRowInfo row = rowList.get(i);
+					try {
+						String personNum = row.getValueOfString(PERSONNUM);
+						 IPerson perIns = PersonFactory.getLocalInstance(ctx);
+						PersonCollection personCollection = perIns.getPersonCollection("where  number = '" + personNum + "' or name = '" + personNum + "'");
+						PersonInfo personInfo = personCollection.get(0);
+
+
+						CoreBaseInfo  transRowToObejct = super.transRowToObejct(row);
+						doCustomVerifyRow(transRowToObejct); //业务校验
+						PersonPositionInfo positionInfo = this.getAdminOrgUnit(ctx, personInfo.getId().toString());
+					 
+						AdminOrgUnitInfo personDep = positionInfo.getPersonDep();
+						PositionInfo primaryPosition = positionInfo.getPrimaryPosition();
+						transRowToObejct.put("person",personInfo);
+						transRowToObejct.put("position",primaryPosition);
+						transRowToObejct.put("adminOrg",personDep);
+						
+						coll.add(transRowToObejct); // 将每一行数据存入coll中,可以最后做批量保存
+						sucessCount++;
+					} catch (ImportException e) {
+						BaseResultInfo resultInfo = new BaseResultInfo(row);
+						resultInfo.setSuccess(false);
+						resultInfo.setMessage(e.getMessage());
+						resultInfo.setE(e);
+						super.getMonitor().completeRow(resultInfo);
+					} catch (BOSException e) {
+						throw new RuntimeException(e);
+					}
+				}
+				billInfo.put("entrys", coll);
+				billCol.add(billInfo);
+
+			}
+    		if (billCol.size() > 0) {
+    			try {
+					ICoreBase iCoreBase = MetaDataUtil.getBizInterface(entityName);
+					iCoreBase.save(billCol);
+//					iCoreBase.submit(billCol);
+    			} catch (Exception e) {
+    				//批量操作异常后,直接将成功数量设置为0
+    				super.getMonitor().getProgress().setFinish(count); // 完成数
+    				super.getMonitor().getProgress().setSuccess(0); // 设置成功数为0
+    				e.printStackTrace(); //打出日志,无法在导入报告中看到,只能查看apusic日志
+    				return true;
+    			}
+    		}
+    		// 最后设置成功的数量和完成数量 
+    		super.getMonitor().getProgress().setFinish(count); // 完成数
+    		super.getMonitor().getProgress().setSuccess(sucessCount); // 成功数量 ,最终保证:失败的数量+成功的数量 = 导入的总数量
+    		return true;
+    	}
+
+    	/**
+    	 * 业务校验,自行实现,如果校验不通过请抛出ImportException
+    	 * @return
+    	 */
+    	private void doCustomVerifyRow(CoreBaseInfo transRowToObejct) throws ImportException {
+
+    	}
+
+	protected void verifyRowBiz(BaseRowInfo row) throws ImportException {
+		Context ctx = getContext();
+		try {
+			IHROrgUnit orgIns = null;
+//			String hrOrg = row.getValueOfString(HRORG);
+//			orgIns = HROrgUnitFactory.getLocalInstance(ctx);
+//			boolean  exists= orgIns.exists("where  number = '" + hrOrg + "' or name = '" + hrOrg + "'");
+//			if (!exists  ) {
+//				throw new ImportException("业务组织填写错误,"+hrOrg+"未找到对应数据");
+//			}
+			String personNum = row.getValueOfString(PERSONNUM);
+			IPerson perIns = PersonFactory.getLocalInstance(ctx);
+			boolean  exists2=  perIns.exists("where  number = '" + personNum + "' or name = '" + personNum + "'");
+			if (!exists2  ) {
+				throw new ImportException("人员填写错误,"+personNum+"未找到对应数据");
+			}
+		} catch (BOSException e) {
+			throw new RuntimeException(e);
+		} catch (EASBizException e) {
+			throw new RuntimeException(e);
+		}
+
+	}
+	
+	
+	
+	private CoreBaseInfo createInfo(String entityName) throws Exception {
+		String clazz = MetaDataLoaderFactory.getRemoteMetaDataLoader().getEntity(new MetaDataPK(entityName))
+				.getObjectValueClass();
+		Class modelClass = Class.forName(clazz);
+		CoreBaseInfo model = (CoreBaseInfo) modelClass.newInstance();
+		if (!StringUtils.isEmpty(entityName)) {
+			MetaDataPK metaDataPK = new MetaDataPK(entityName);
+			EntityObjectInfo entityInfo = MetaDataLoaderFactory.getRemoteMetaDataLoader().getEntity(metaDataPK);
+			if (entityInfo.isDynamic() && model instanceof ICommonBOSType) {
+				ICommonBOSType commonObject = (ICommonBOSType) model;
+				commonObject.setBOSType(entityInfo.getType());
+				commonObject.setPK(metaDataPK);
+			}
+		}
+
+		return model;
+	}
+
+
+	/**
+	 * 根据编码规则获取单据编码
+	 *
+	 * @param ctx
+	 * @param info
+	 * @return
+	 */
+	public static String getNewNumber(Context ctx, CoreBaseInfo info) {
+		String number = "";
+		ICodingRuleManager iCodingRuleManager = null;
+		OrgUnitInfo orgUnit = (OrgUnitInfo) info.get("hrOrgUnit");
+		if (orgUnit == null) {
+			return null;
+		}
+		try {
+			iCodingRuleManager = CodingRuleManagerFactory.getLocalInstance(ctx);
+			if (iCodingRuleManager.isExist(info, orgUnit.getId().toString())) {
+				number = iCodingRuleManager.getNumber(info, orgUnit.getId().toString());
+			} else {
+				return null;
+			}
+		} catch (EASBizException e) {
+			e.printStackTrace();
+		} catch (BOSException e) {
+			e.printStackTrace();
+		}
+
+		return number;
+	}
+
+
+
+	public PersonPositionInfo getAdminOrgUnit(Context ctx, String personID) {
+		if (personID == null) {
+			return null;
+		} else {
+			PersonPositionInfo personPositionInfo = null;
+			StringBuffer oqlb = new StringBuffer();
+			oqlb.append("select ");
+			oqlb.append("id,");
+			oqlb.append("enterDate,");
+			oqlb.append("jobGrade.id,");
+			oqlb.append("tryoutMonth,");
+			oqlb.append("jobGrade.name,");
+			oqlb.append("jobLevel.id,");
+			oqlb.append("jobLevel.name,");
+			oqlb.append("hrOrgUnit.id,");
+			oqlb.append("hrOrgUnit.number,");
+			oqlb.append("person.number,");
+			oqlb.append("person.name,");
+			oqlb.append("person.employeeType.name,");
+			oqlb.append("personDep.id,");
+			oqlb.append("personDep.name,");
+			oqlb.append("personDep.number,");
+			oqlb.append("personDep.longnumber,");
+			oqlb.append("personDep.displayName,");
+			oqlb.append("primaryPosition.id,");
+			oqlb.append("primaryPosition.name,");
+			oqlb.append("primaryPosition.number,");
+			oqlb.append("primaryPosition.job.id,");
+			oqlb.append("primaryPosition.job.name");
+			oqlb.append(" where person.id='");
+			oqlb.append(personID);
+			oqlb.append("'");
+			PersonPositionCollection c = null;
+
+			try {
+				c = PersonPositionFactory.getLocalInstance(ctx).getPersonPositionCollection(oqlb.toString());
+			} catch (BOSException var7) {
+				var7.printStackTrace();
+			}
+
+			if (c != null && c.size() > 0) {
+				personPositionInfo = c.get(0);
+			}
+
+			return personPositionInfo;
+		}
+	}
+}

+ 279 - 0
GDYSL/websrc/com/kingdee/shr/compensation/integrate/verify/AbstractSubmitBillVerify.java

@@ -0,0 +1,279 @@
+package com.kingdee.shr.compensation.integrate.verify;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.custom.utils.DateTimeUtils;
+import com.kingdee.eas.framework.CoreBaseInfo;
+import com.kingdee.eas.hr.base.HRBillStateEnum;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.compensation.app.entity.Pair;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillCollection;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillEntryCollection;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillEntryInfo;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillFactory;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillInfo;
+import com.kingdee.shr.compensation.app.integrate.CalSubmitSchemeCollection;
+import com.kingdee.shr.compensation.app.integrate.CalSubmitSchemeFactory;
+import com.kingdee.shr.compensation.app.integrate.DateTypeEnum;
+import com.kingdee.shr.compensation.exception.SubmitBillVerifyException;
+import com.kingdee.shr.compensation.integrate.verify.ISubmitBillVerifyInterface;
+import com.kingdee.shr.compensation.util.CmpDateUtil;
+import com.kingdee.shr.compensation.util.db.CmpInSql;
+import com.kingdee.shr.compensation.util.db.CmpInSqlFactory;
+import com.kingdee.shr.compensation.util.integrate.CmpIntegrateEntryHelper;
+import com.kingdee.shr.ml.util.SHRServerResource;
+import com.kingdee.util.LocaleUtils;
+import java.sql.SQLException;
+import java.text.MessageFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+public abstract class AbstractSubmitBillVerify implements ISubmitBillVerifyInterface {
+	
+	private static Logger logger =
+	        Logger.getLogger("com.kingdee.shr.compensation.integrate.verify.AbstractSubmitBillVerify");
+	
+	public void verify(Context ctx, CoreBaseInfo model, Map<String, Object> otherParams) throws BOSException, EASBizException {
+		beforeVerify(ctx, model, otherParams);
+		runVerify(ctx, model, otherParams);
+		afterVerify(ctx, model, otherParams);
+	}
+
+	protected void beforeVerify(Context ctx, CoreBaseInfo model, Map<String, Object> otherParams) throws BOSException, EASBizException {
+		BatchSubmitShemeBillInfo info = (BatchSubmitShemeBillInfo)model;
+		checkBillNumber(ctx, info);
+		verifyBillState(ctx, (CoreBaseInfo)info);
+	}
+
+	protected void verifyBillState(Context ctx, CoreBaseInfo model) throws EASBizException, BOSException {
+		BatchSubmitShemeBillInfo info = (BatchSubmitShemeBillInfo)model;
+		BatchSubmitShemeBillCollection colsInDB = BatchSubmitShemeBillFactory.getLocalInstance(ctx).getBatchSubmitShemeBillCollection("select billState where id = '" + info.getId().toString() + "'");
+		if (colsInDB.isEmpty())
+			return;
+		HRBillStateEnum billState = colsInDB.get(0).getBillState();
+		if (HRBillStateEnum.SAVED != billState && HRBillStateEnum.SUBMITED != billState)
+			throw new SubmitBillVerifyException(SubmitBillVerifyException.EXCEPTION4);
+	}
+
+	protected void runVerify(Context ctx, CoreBaseInfo model, Map<String, Object> otherParams) throws BOSException, EASBizException {
+		BatchSubmitShemeBillInfo info = (BatchSubmitShemeBillInfo)model;
+		verifyRemovedCmpFile(ctx, info);
+		verifyCmpEmpRe(ctx, info);
+		verifySubmitPeriod(ctx, info);
+	}
+
+	protected void verifyRemovedCmpFile(Context ctx, BatchSubmitShemeBillInfo info) throws BOSException, EASBizException {
+		String billEntryTable = CmpIntegrateEntryHelper.getIntegrateDynamicEntryTableNameBySubmitSchemeId(ctx, info.getSubmitScheme().getId().toString());
+		String sqlTemplate = "SELECT entry.fpersonId, person.FName_%s personName, person.FNumber personNum FROM %s entry LEFT JOIN T_BD_PERSON person ON entry.FPersonId = person.Fid WHERE NOT EXISTS(SELECT 1 FROM T_HR_SCmpEmpORelation empOrel WHERE entry.FCmpEmpORelationID = empOrel.FID) AND entry.fbillId = '%s'";
+		Set<String> nameAndNumSet = new HashSet<>();
+		String personHint = SHRServerResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label195", ctx.getLocale());
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, String.format(sqlTemplate, new Object[] { LocaleUtils.getShortCode(ctx.getLocale()), billEntryTable, info
+					.getId().toString() }));
+			while (rs.next()) {
+				nameAndNumSet.add(MessageFormat.format(personHint, new Object[] { rs.getString("personName"), rs.getString("personNum") }));
+			}
+		} catch (SQLException e) {
+			throw new BOSException(e.getMessage(), e);
+		}
+		if (!nameAndNumSet.isEmpty())
+			throw new SubmitBillVerifyException(SubmitBillVerifyException.EXCEPTION1, nameAndNumSet.toArray());
+	}
+
+	protected void afterVerify(Context ctx, CoreBaseInfo model, Map<String, Object> otherParams) throws BOSException {}
+
+	protected void verifyCmpEmpRe(Context ctx, BatchSubmitShemeBillInfo info) throws BOSException, EASBizException {
+		Map<String, Pair<Date, Date>> empCmpRelationsFromDb = getEmpCmpRelationsFromDb(ctx, info);
+		
+		if (empCmpRelationsFromDb.isEmpty())
+			return;
+		Set<String> errorPersons = new HashSet<>();
+		DateTypeEnum effectDateDisplay = null;
+		CalSubmitSchemeCollection submitScheme = CalSubmitSchemeFactory.getLocalInstance(ctx).getCalSubmitSchemeCollection("where id = '" + info.getSubmitScheme().getId().toString() + "'");
+		if (submitScheme != null && submitScheme.size() > 0)
+			effectDateDisplay = submitScheme.get(0).getEffectDateDisplay();
+		BatchSubmitShemeBillEntryCollection coll = info.getEntry();
+		
+		int adjustMonth = 0;
+		Set<String> personSet = new HashSet<>();
+		int dataSource = info.getDatasource().getValue();
+		if(dataSource == 2) {
+			Set<String> personIdSet = new HashSet<>();
+			for (int i = 0; i < coll.size(); i++) {
+				BatchSubmitShemeBillEntryInfo entryInfo = coll.get(i);
+				String personId = entryInfo.getPerson().getId().toString();
+				personIdSet.add(personId);
+			}
+			logger.error("人员ID集合:"+personIdSet);
+			StringBuffer personIds = new StringBuffer();
+			for(String id:personIdSet) {
+				personIds.append("'"+id+"',");
+			}
+			
+			String sql = "select top 1 * from T_HR_SHRRsvItem0 where fnumber = '1005' and FState = '1'";
+			//调整月份
+			try {
+				IRowSet rs = DbUtil.executeQuery(ctx, sql);
+				while(rs.next()) {
+					adjustMonth = rs.getInt("FName_l2");
+				}
+				if(personIds.length()>0) {
+					personIds.deleteCharAt(personIds.length()-1);
+					String nowDate = DateTimeUtils.dateFormat(new Date(), "yyyy-MM-dd");
+					String personSql = "SELECT DISTINCT a.fpersonid,a.fpositionid FROM T_HR_EmpOrgRelation a "
+							+ "left join T_HR_EmpLaborRelationHis b on a.FPERSONID=b.fpersonid "
+							+ "left join T_HR_BDEmployeeType c on c.fid=b.flaborrelationstateid "
+							+ "where c.finservice not in ('2','3') and a.feffdt <= '"+nowDate+"' "
+							+ "and a.fleffdt >= '"+nowDate+"' and a.fislatestinaday = '1' "
+							+ "and b.fstartdatetime <= '"+nowDate+"' and b.fenddatetime >= '"+nowDate+"' "
+							+ "and a.fpersonid in ("+personIds+")";
+					logger.error("查询在职人员SQL:"+personSql);
+					IRowSet personRow = DbUtil.executeQuery(ctx, personSql);
+					while(personRow.next()) {
+						personSet.add(personRow.getString("fpersonid")+ "_" + personRow.getString("fpositionid"));
+					}
+					logger.error("员工+部门ID集合"+personSet);
+				}
+			} catch (BOSException e) {
+				e.printStackTrace();
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
+		}
+		
+		
+		if (coll != null && coll.size() > 0)
+			for (int i = 0; i < coll.size(); i++) {
+				BatchSubmitShemeBillEntryInfo entryInfo = coll.get(i);
+				String employeeTypeId = entryInfo.getCmpEmpORelation().getId().toString();
+				Date entryDate = entryInfo.getEffectDate();
+				String personId = entryInfo.getPerson().getId().toString();
+				String positionId = entryInfo.getPosition().getId().toString();
+				
+				//校验发生日期时根据调整月份进行调整(只针对离职员工)
+				if(!personSet.contains(personId+"_"+positionId)) {
+					Calendar calendar = Calendar.getInstance();
+					calendar.setTime(entryDate);
+					calendar.add(Calendar.MONTH, adjustMonth);
+					entryDate = calendar.getTime();
+				}
+				
+				Pair<Date, Date> pair = empCmpRelationsFromDb.get(personId + "_" + positionId + "_" + employeeTypeId);
+				if (null != pair) {
+					Date effectDate = (Date)pair.getFirst();
+					Date leffectDate = (Date)pair.getSecond();
+					String personName = getPersonNameIfVerified(entryInfo);
+					if (effectDateDisplay == DateTypeEnum.yyyyMM) {
+						if (CmpDateUtil.compareMonth(entryDate, effectDate) < 0 || CmpDateUtil.compareMonth(entryDate, leffectDate) > 0)
+							errorPersons.add(personName);
+					} else if (entryDate.compareTo(effectDate) < 0 || entryDate.compareTo(leffectDate) > 0) {
+						errorPersons.add(personName);
+					}
+				}
+			}
+		int maxSize = 30;
+		int size = 1;
+		StringBuilder errorMessage = new StringBuilder();
+		for (String errorPersonName : errorPersons) {
+			if (maxSize <= size)
+				break;
+			errorMessage.append(errorPersonName).append("、");
+					size++;
+		}
+		if (errorMessage.length() > 0) {
+			String message = errorMessage.substring(0, errorMessage.length() - 1);
+			if (size == maxSize)
+				message = message + "...";
+			throw new SubmitBillVerifyException(SubmitBillVerifyException.EXCEPTION5, new Object[] { message });
+		}
+	}
+
+	protected String getPersonNameIfVerified(BatchSubmitShemeBillEntryInfo entryInfo) throws EASBizException {
+		String personName = entryInfo.getPerson().getName();
+		if (StringUtils.isEmpty(personName))
+			throw new SubmitBillVerifyException(SubmitBillVerifyException.PERSON_PERM_ERROR);
+		return personName;
+	}
+
+	protected Map<String, Pair<Date, Date>> getEmpCmpRelationsFromDb(Context ctx, BatchSubmitShemeBillInfo info) throws BOSException, EASBizException {
+		BatchSubmitShemeBillEntryCollection coll = info.getEntry();
+		Set<String> personIds = new HashSet<>();
+		boolean personIsNull = false;
+		for (int i = 0; i < coll.size(); i++) {
+			if (coll.get(i).getPerson() == null || coll.get(i).getPerson().getId() == null) {
+				personIsNull = true;
+			} else {
+				personIds.add(coll.get(i).getPerson().getId().toString());
+			}
+		}
+		if (personIsNull) {
+			throw new SubmitBillVerifyException(SubmitBillVerifyException.EXCEPTION8);
+		}
+		CmpInSql<String> cmpInSql = CmpInSqlFactory.getInstance();
+		String personInSql = cmpInSql.createInSqlBaseOnFId(ctx, personIds);
+		String hrOrgUnitId = info.getHrOrgUnit().getId().toString();
+		String adminOrgId = info.getAdminOrg().getId().toString();
+		String longNumber = getLongNumber(ctx, adminOrgId);
+		StringBuilder filter = new StringBuilder();
+		String sql = "select p.Fid personId, p.FNumber, ce.FEffectDate, ce.FLeffectDate, pt.Fid positionId,ce.Fid employeeTypeId  FROM T_HR_SCmpEmpORelation AS ce  INNER JOIN T_HR_SPersonCmp AS pc ON ce.FPersonCmpID = pc.FID  INNER JOIN T_HR_EmpOrgRelation AS er ON ce.FEmpOrgRelationID = er.FID  INNER JOIN T_BD_Person AS p ON ce.FPersonID = p.FID  INNER JOIN T_ORG_HRO AS h ON pc.FHrOrgUnitID = h.FID  LEFT OUTER JOIN T_ORG_Admin AS ad ON er.FAdminOrgID = ad.FID  LEFT OUTER JOIN T_ORG_Position AS pt ON er.FPositionID = pt.FID LEFT OUTER JOIN T_HR_EmpLaborRelationHis AS re ON er.FlaborRelationID =re.FHistoryRelateID and er.FEndDateTime >=re.FStartDateTime and er.FEndDateTime <=re.FEndDateTime LEFT OUTER JOIN T_HR_BDEmployeeType AS et ON re.FLaborRelationStateID =et.FID ";
+		filter.append(sql);
+		filter.append(" where h.FID = '").append(hrOrgUnitId).append("'");
+		filter.append(" and ((ad.flongNumber LIKE '").append(longNumber).append("%' and ce.fuseDefault=1) or ce.fuseDefault=0)");
+		filter.append(" and p.FID in").append(personInSql);
+		Map<String, Pair<Date, Date>> dbMap = new HashMap<>();
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, filter.toString());
+			while (rs.next()) {
+				Pair<Date, Date> pair = new Pair();
+				Date effectDate = rs.getDate("FEffectDate");
+				Date leffectDate = rs.getDate("FLeffectDate");
+				pair.setFirst(effectDate);
+				pair.setSecond(leffectDate);
+				String personIdDB = rs.getString("personId");
+				String positionIdDB = rs.getString("positionId");
+				String employeeTypeId = rs.getString("employeeTypeId");
+				dbMap.put(personIdDB + "_" + positionIdDB + "_" + employeeTypeId, pair);
+			}
+		} catch (SQLException e) {
+			throw new BOSException(e.getMessage(), e);
+		}
+		cmpInSql.release(ctx);
+		return dbMap;
+	}
+
+	protected String getLongNumber(Context ctx, String id) throws BOSException {
+		String sql = "select FLongNumber from T_ORG_Admin where fid = '" + id + "'";
+		String longNumber = "";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next())
+				longNumber = rs.getString("FLongNumber");
+		} catch (SQLException e) {
+			throw new BOSException(e.getMessage(), e);
+		}
+		return longNumber;
+	}
+
+	protected void checkBillNumber(Context ctx, BatchSubmitShemeBillInfo info) throws BOSException, EASBizException {
+		String number = info.getNumber();
+		boolean flag = BatchSubmitShemeBillFactory.getLocalInstance(ctx).exists("where number = '" + number + "' and id <> '" + info
+				.getId().toString() + "'");
+		if (flag)
+			throw new SubmitBillVerifyException(SubmitBillVerifyException.EXCEPTION6, new Object[] { number });
+	}
+
+	protected void verifySubmitPeriod(Context ctx, BatchSubmitShemeBillInfo info) throws EASBizException, BOSException {}
+
+	protected String getMultiLan(Context ctx, String label) {
+		return SHRServerResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", label, ctx.getLocale());
+	}
+}

+ 542 - 0
GDYSL/websrc/com/kingdee/shr/compensation/service/CalFunctionIntegrateServiceEx.java

@@ -0,0 +1,542 @@
+ package com.kingdee.shr.compensation.service;
+ 
+ import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.metadata.MetaDataLoaderFactory;
+import com.kingdee.bos.metadata.MetaDataPK;
+import com.kingdee.bos.metadata.entity.EntityObjectInfo;
+import com.kingdee.eas.base.core.util.EmptyUtil;
+import com.kingdee.eas.util.app.ContextUtil;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.compensation.CalSchemeInfo;
+import com.kingdee.shr.compensation.app.formula.SalaryCalFunction;
+import com.kingdee.shr.compensation.app.formula.data.Tools;
+import com.kingdee.shr.compensation.app.integrate.CalSubmitItemCollection;
+import com.kingdee.shr.compensation.app.integrate.CalSubmitItemDataType;
+import com.kingdee.shr.compensation.app.integrate.CalSubmitItemFactory;
+import com.kingdee.shr.compensation.app.integrate.CalSubmitItemInfo;
+import com.kingdee.shr.compensation.app.integrate.DateTypeEnum;
+import com.kingdee.shr.compensation.app.integrate.SubmitElementCollection;
+import com.kingdee.shr.compensation.app.integrate.SubmitElementFactory;
+import com.kingdee.shr.compensation.app.integrate.SubmitElementInfo;
+import com.kingdee.shr.compensation.util.CmpDateUtil;
+import com.kingdee.util.StringUtils;
+ 
+ public class CalFunctionIntegrateServiceEx extends SalaryCalFunction
+ {
+	
+	 private static Logger logger = Logger.getLogger("com.kingdee.shr.compensation.service.CalFunctionIntegrateServiceEx");
+   public double getTransferSalaryData(Map paramMap, HashMap tempMap, Map<String, BigDecimal> currencyMap, CalSchemeInfo calScheme, String mainTableRowFilter, String calSubmitScheme, String calSubmitItem, String company, double needSubOrg, String beginDate, String endDate,String hrNum)
+   {
+     String key = new StringBuilder().append("TransferSalaryEx:").append(calScheme.getNumber()).append("-").append(calSubmitScheme).append("-").append(calSubmitItem).append("-").append(company).append("-").append(needSubOrg).append(beginDate).append("-").append(endDate).toString();
+     String relyKey = new StringBuilder().append("TransferSalaryEx-").append(calScheme.getNumber()).append("-").append(calSubmitScheme).append("-").append(calSubmitItem).append("-").append(company).append("-").append(needSubOrg).append(beginDate).append("-").append(endDate).append("-").append("Rely").toString();
+     Map salaryMap = new HashMap();
+ 
+     String calItem = (String)paramMap.get("CALITEM");
+//     logger.error("tempMap.get(key) ====="+tempMap.get(key) );
+     if (tempMap.get(key) == null) {
+	       String personFilter = getPersonFilterSql(calScheme, company, needSubOrg, beginDate, endDate, mainTableRowFilter);
+	       logger.error("personFilter====="+personFilter);
+	       Map methodParamMap = new HashMap();
+	       methodParamMap.put("calSubmitScheme", calSubmitScheme);
+	       methodParamMap.put("calSubmitItem", calSubmitItem);
+	       methodParamMap.put("personFilter", personFilter);
+	       methodParamMap.put("key", key);
+	       methodParamMap.put("relyKey", relyKey);
+	       methodParamMap.put("isNumber", Boolean.valueOf(true));
+	       methodParamMap.put("isCycleScheme", Boolean.valueOf(false));
+	       combineTransSalaryData(tempMap, currencyMap, methodParamMap,hrNum);
+//	       logger.error("tempMap=="+tempMap);
+     }
+     String personId = (String)paramMap.get("T_HR_SCMPCALTABLE_FPERSONID");
+     
+     logger.error("key=="+key);
+     logger.error("personId=="+personId);
+     salaryMap = (Map)tempMap.get(key);
+     logger.error("salaryMap=="+salaryMap);
+     putSubmitDataToParam(paramMap, tempMap, calItem, relyKey);
+     logger.error("salaryMap.containsKey(personId)="+salaryMap.containsKey(personId));
+     logger.error("((salaryMap.containsKey(personId)) ? EmptyUtil.isEmpty(salaryMap.get(personId))?0.0D:((BigDecimal)salaryMap.get(personId)).doubleValue() : 0.0D)=="+((salaryMap.containsKey(personId)) ? EmptyUtil.isEmpty(salaryMap.get(personId))?0.0D:((BigDecimal)salaryMap.get(personId)).doubleValue() : 0.0D));
+     return ((salaryMap.containsKey(personId)) ? EmptyUtil.isEmpty(salaryMap.get(personId))?0.0D:((BigDecimal)salaryMap.get(personId)).doubleValue() : 0.0D);
+   }
+ 
+ 
+   private String getPersonFilterSql(CalSchemeInfo calScheme, String company, double needSubOrg, String beginDate, String endDate, String mainTableRowFilter)
+   {
+     String calschemeid = calScheme.getId().toString();
+     int calTime = calScheme.getCalTime();
+     int periodYear = calScheme.getPeriodYear();
+     int periodMonth = calScheme.getPeriodMonth();
+     boolean haveSubOrg = 1.0D == needSubOrg;
+     String salaryPeriod = new StringBuilder().append(periodYear).append("-").append(periodMonth).append("-").append(calTime).toString();
+     String beginDateSql = new StringBuilder().append("{ts '").append(beginDate).append("'}").toString(); String endDateSql = new StringBuilder().append("{ts '").append(endDate).append("'}").toString();
+ 
+     StringBuilder str = new StringBuilder();
+     str.append(" select FPersonID from T_HR_SCmpCalTable where FcalSchemeID = '").append(calschemeid).append("' ");
+     str.append(" and FperiodYear = ").append(periodYear);
+     str.append(" and FperiodMonth = ").append(periodMonth);
+     str.append(" and FcalTime = ").append(calTime);
+     if (!(StringUtils.isEmpty(mainTableRowFilter))) {
+       str.append(" and ").append(mainTableRowFilter);
+     }
+     String personSql = str.toString();
+ 
+     String adminOrgSql = getAdminOrgIdFilterSql(company, haveSubOrg);
+ 
+     str = new StringBuilder();
+     str.append(" WHERE ").append(adminOrgSql);
+     str.append(new StringBuilder().append(" AND FPERSONID  IN ( ").append(personSql).append(" )").toString());
+     str.append(" AND FEFFECTDATE >= ").append(beginDateSql);
+     str.append(" AND FEFFECTDATE <= ").append(endDateSql);
+     str.append(" AND FCALSTATE = '03' ");
+     str.append(" AND FSALARYPERIOD ='").append(salaryPeriod).append("'");
+     return str.toString();
+   }
+ 
+   private void combineTransSalaryData(HashMap tempMap, Map<String, BigDecimal> currencyMap, Map<String, Object> methodParamMap,String hrNum)
+   {
+     String calSubmitScheme = (String)methodParamMap.get("calSubmitScheme");
+     String calSubmitItem = (String)methodParamMap.get("calSubmitItem");
+     String personFilter = (String)methodParamMap.get("personFilter");
+     String key = (String)methodParamMap.get("key");
+     String relyKey = (String)methodParamMap.get("relyKey");
+     Boolean isNumber = (Boolean)methodParamMap.get("isNumber");
+     Boolean isCycleScheme = (Boolean)methodParamMap.get("isCycleScheme");
+ 
+     
+     
+     Boolean isDate = (Boolean)methodParamMap.get("isDate");
+     Boolean dateTypeToDay = (Boolean)methodParamMap.get("dateTypeToDay");
+ 
+     Context ctx = Tools.getInstance().getCtx();
+ 
+     Map salaryMap = new HashMap();
+ 
+     Map relyMap = new HashMap();
+ 
+     List relyList = new ArrayList();
+ 
+     String calItem = (String)this.paramMap.get("CALITEM");
+ 
+     //取所有提报单对应的临时表
+     ArrayList schemeTableNameList = initSubmitSchemeTable(ctx, tempMap, calSubmitItem);
+     if (EmptyUtil.isEmpty(schemeTableNameList)) {
+       tempMap.put(key, salaryMap);
+       return;
+     }
+ 
+     CalSubmitItemInfo itemInfo = initSubmitItem(ctx, tempMap, calSubmitItem);
+     if (null == itemInfo) {
+       tempMap.put(key, salaryMap);
+       return;
+     }
+     String itemSn = new StringBuilder().append("S").append(itemInfo.getFieldSn()).toString();
+     String itemDatatTypeValue = itemInfo.getDataType().getValue();
+     DecimalFormat df = new DecimalFormat((null == itemInfo.getDataDot()) ? "0" : itemInfo.getDataDot().toString());
+     DateTypeEnum dateTypeEnum = itemInfo.getDateType();
+     if ((itemDatatTypeValue != null) && ("2".equals(itemDatatTypeValue))) {
+       isDate = Boolean.valueOf(true);
+       if ((dateTypeEnum != null) && (10 == dateTypeEnum.getValue())) {
+         dateTypeToDay = Boolean.valueOf(true);
+       }
+ 
+     }
+ 
+     Set schemeItemSet = initSchemeItem(ctx, tempMap, calSubmitItem);
+ 
+     if (!(schemeItemSet.contains(new StringBuilder().append(itemInfo.getFieldSn()).append("").toString()))) {
+       tempMap.put(key, salaryMap);
+       return;
+     }
+     //循环拼接 union all  提报临时表  按提报项目查询金额
+     StringBuilder str = new StringBuilder();
+     str.append("/*dialect*/ select t.fbillid,t.FPERSONID,t.FSALARYPERIOD,t.FID,t.FCURRENCYID, ").append("t."+itemSn).append("  from (");
+     for (int i = 0; i < schemeTableNameList.size(); i++) {
+    	 str= str.append(" SELECT fbillid,FPERSONID,FSALARYPERIOD,FID,FCURRENCYID,").append(itemSn);
+    	 str=str.append(" FROM ").append(schemeTableNameList.get(i)).append(" t ");
+    	
+    	 str.append(personFilter);
+    	
+         if (isCycleScheme.booleanValue()) {
+        	 str= str.append(" ORDER BY t.FTransYear desc,t.FTransMonth desc, t.FTransTime desc,t.FPERSONID, t.FEFFECTDATE DESC, t.FCREATETIME DESC ");
+         }
+         else if (!(isNumber.booleanValue())) {
+        	 str= str.append(" ORDER BY t.FPERSONID, t.FEFFECTDATE DESC, t.sFCREATETIME DESC ");
+         }
+     
+    	 if(schemeTableNameList.size()>1&&i!=schemeTableNameList.size()-1) {
+    		 str= str.append(" union all");
+    	 }
+	  }
+     
+     str.append(") as t ");
+     str=str.append(" left join  T_HR_SBatchSubmitShemeBill   t1  on t.fbillid = t1.fid ");
+	 str=str.append(" left join  T_ORG_BaseUnit   t2  on t1.FHrOrgUnitID = t2.fid ");
+	 str.append(" where  nvl(t2.fnumber,'##') ='"+hrNum+"' ");
+     logger.error("temp_table_sql ===== "+str.toString());
+     SimpleDateFormat yearMonthFormat = new SimpleDateFormat("yyyy-MM");
+     SimpleDateFormat yearMonthDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+     try
+     {
+       logger.error("sql===="+str.toString());
+       IRowSet rowSet = DbUtil.executeQuery(ctx, str.toString());
+ 
+       String moneyStr = "";
+ 
+       while (rowSet.next()) {
+         String personId = rowSet.getString("FPersonID");
+         logger.error("isCycleScheme ===== "+isCycleScheme);
+         Map personRelyMap = new HashMap();
+         personRelyMap.put("SUBMITITEMID", null);
+         personRelyMap.put("SUBMITITEMTABLE", null);
+         if (isCycleScheme.booleanValue()) {
+           if (isNumber.booleanValue()) {
+        	   
+             String currencyId = rowSet.getString("FCURRENCYID");
+             BigDecimal money = rowSet.getBigDecimal(itemSn);
+             personRelyMap.put("SUBMITMONEY", df.format(money.doubleValue()));
+ 
+             BigDecimal rate = (null == currencyMap.get(currencyId)) ? new BigDecimal(1) : (BigDecimal)currencyMap.get(currencyId);
+             if (salaryMap.containsKey(personId)) {
+               continue;
+             }
+             salaryMap.put(personId, money.multiply(rate));
+           }
+           else
+           {
+             if ((isDate != null) && (isDate.booleanValue())) {
+               java.sql.Date date = rowSet.getDate(itemSn);
+               if (date != null) {
+                 java.util.Date utilDate = new java.util.Date(date.getTime());
+                 if ((dateTypeToDay != null) && (dateTypeToDay.booleanValue()))
+                   moneyStr = yearMonthDateFormat.format(utilDate);
+                 else
+                   moneyStr = yearMonthFormat.format(utilDate);
+               }
+               else {
+                 moneyStr = "";
+               }
+             } else {
+               moneyStr = (null == rowSet.getString(itemSn)) ? "" : rowSet.getString(itemSn);
+ 
+               if ("0".equals(itemDatatTypeValue)) {
+                 BigDecimal money = rowSet.getBigDecimal(itemSn);
+                 if (money == null) {
+                   moneyStr = "";
+                 } else {
+                   boolean isSQLServerDB = "MS SQL Server".equalsIgnoreCase(ContextUtil.getDbType(ctx));
+                   if (isSQLServerDB)
+                     moneyStr = df.format(money.doubleValue());
+                   else {
+                     moneyStr = (null == rowSet.getString(itemSn)) ? "" : rowSet.getString(itemSn);
+                   }
+                 }
+               }
+             }
+             personRelyMap.put("SUBMITMONEY", moneyStr);
+             if (salaryMap.containsKey(personId)) {
+               continue;
+             }
+             salaryMap.put(personId, moneyStr);
+           }
+ 
+         }
+         else if (isNumber.booleanValue()) {
+           String currencyId = rowSet.getString("FCURRENCYID");
+           BigDecimal money = EmptyUtil.isEmpty(rowSet.getBigDecimal(itemSn))?BigDecimal.ZERO:rowSet.getBigDecimal(itemSn);
+           logger.error("money===="+money);
+           personRelyMap.put("SUBMITMONEY", df.format(money.doubleValue()));
+           BigDecimal rate = (null == currencyMap.get(currencyId)) ? new BigDecimal(1) : (BigDecimal)currencyMap.get(currencyId);
+           BigDecimal sum = (null == salaryMap.get(personId)) ? money.multiply(rate) : ((BigDecimal)salaryMap.get(personId)).add(money.multiply(rate));
+           salaryMap.put(personId, sum);
+          
+         } else {
+           if ((isDate != null) && (isDate.booleanValue())) {
+             java.sql.Date date = rowSet.getDate(itemSn);
+             if (date != null) {
+               java.util.Date utilDate = new java.util.Date(date.getTime());
+               if ((dateTypeToDay != null) && (dateTypeToDay.booleanValue()))
+                 moneyStr = yearMonthDateFormat.format(utilDate);
+               else
+                 moneyStr = yearMonthFormat.format(utilDate);
+             }
+             else {
+               moneyStr = "";
+             }
+           } else {
+             moneyStr = (null == rowSet.getString(itemSn)) ? "" : rowSet.getString(itemSn);
+ 
+             if ("0".equals(itemDatatTypeValue)) {
+               BigDecimal money = rowSet.getBigDecimal(itemSn);
+               if (money == null) {
+                 moneyStr = "";
+               } else {
+                 boolean isSQLServerDB = "MS SQL Server".equalsIgnoreCase(ContextUtil.getDbType(ctx));
+                 if (isSQLServerDB)
+                   moneyStr = df.format(money.doubleValue());
+                 else {
+                   moneyStr = (null == rowSet.getString(itemSn)) ? "" : rowSet.getString(itemSn);
+                 }
+               }
+             }
+           }
+           personRelyMap.put("SUBMITMONEY", moneyStr);
+           if (salaryMap.containsKey(personId)) {
+             continue;
+           }
+           salaryMap.put(personId, moneyStr);
+         }
+ 
+         personRelyMap.put("SUBMITTABLE", schemeTableNameList.get(0));
+         personRelyMap.put("SUBMITTABLEID", rowSet.getString("FID"));
+         personRelyMap.put("CALITEM", calItem);
+         personRelyMap.put("SUBMITNUMBER", calSubmitItem);
+         personRelyMap.put("ISBASIC", Integer.valueOf(0));
+ 
+         if (relyMap.containsKey(personId))
+           relyList = (List)relyMap.get(personId);
+         else {
+           relyList = new ArrayList();
+         }
+         relyList.add(personRelyMap);
+         relyMap.put(personId, relyList);
+       }
+     } catch (Exception e) {
+       e.printStackTrace();
+     }
+     tempMap.put(key, salaryMap);
+     tempMap.put(relyKey, relyMap);
+   }
+ 
+   private void putSubmitDataToParam(Map paramMap, HashMap tempMap, String calItem, String relyKey)
+   {
+     String personId = (String)paramMap.get("T_HR_SCMPCALTABLE_FPERSONID");
+ 
+     List relyList = new ArrayList();
+ 
+     Map relyMap = (Map)tempMap.get(relyKey);
+     if ((null == relyMap) || (!(relyMap.containsKey(personId)))) {
+       return;
+     }
+ 
+     if (paramMap.containsKey("SUBMITRELY")) {
+       Map paramRelayMap = (Map)paramMap.get("SUBMITRELY");
+       if (paramRelayMap.containsKey(calItem)) {
+         relyList = (List)paramRelayMap.get(calItem);
+         relyList.addAll((Collection)relyMap.get(personId));
+       } else {
+         paramRelayMap.put(calItem, relyMap.get(personId));
+       }
+     } else {
+       Map paramRelayMap = new HashMap();
+       paramRelayMap.put(calItem, relyMap.get(personId));
+       paramMap.put("SUBMITRELY", paramRelayMap);
+     }
+   }
+ 
+   public String getAdminOrgIdFilterSql(String companyNum, boolean haveSubOrg)
+   {
+     Context ctx = Tools.getInstance().getCtx();
+     StringBuffer sqlBuffer = new StringBuffer();
+ 
+     String queryOrg = new StringBuilder().append("SELECT FLONGNUMBER,FID FROM T_ORG_ADMIN WHERE FNUMBER = '").append(companyNum).append("'").toString();
+     String companyLongNumber = ""; String adminOrgUnitId = "";
+     try
+     {
+       IRowSet executeQuery = DbUtil.executeQuery(ctx, queryOrg);
+       while (executeQuery.next()) {
+         companyLongNumber = executeQuery.getString("fLongNumber");
+         adminOrgUnitId = executeQuery.getString("fid");
+       }
+       if (StringUtils.isEmpty(companyLongNumber)) {
+         return null;
+       }
+       if (haveSubOrg)
+         sqlBuffer.append(new StringBuilder().append(" FADMINORGUNITID IN (SELECT FID FROM T_ORG_ADMIN WHERE FLONGNUMBER LIKE '").append(companyLongNumber).append("%')").toString());
+       else {
+         sqlBuffer.append(new StringBuilder().append(" FADMINORGUNITID IN ('").append(adminOrgUnitId).append("')").toString());
+       }
+     }
+     catch (BOSException e)
+     {
+       e.printStackTrace();
+     } catch (SQLException e) {
+       e.printStackTrace();
+     }
+     return sqlBuffer.toString();
+   }
+ 
+   public static List<String> getCalShemeTableName(Context ctx, String calSubmitSchemeNum, String calSubmitItemNum)
+   {
+     List list = new ArrayList();
+     String sql = new StringBuilder().append("Select n.FCalShemeTableName, m.fieldSn  from  T_HR_SCalSubmitScheme e  inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID = e.fid   inner join T_HR_SCalSubmitSchemeItem sm on sm.FCalSubmitSchemeID = e.fid   inner join T_HR_SCalSubmitItem m on m.fid = sm.FCalSubmitItemID  where e.FNumber = '").append(calSubmitSchemeNum).append("' and m.FNumber =  '").append(calSubmitItemNum).append("'  ").toString();
+     try
+     {
+       IRowSet rs = DbUtil.executeQuery(ctx, sql);
+       while (rs.next())
+       {
+         list.add(rs.getString("FCalShemeTableName"));
+         list.add(new StringBuilder().append("S").append(rs.getString("fieldSn")).toString());
+       }
+     } catch (Exception e) {
+       e.printStackTrace();
+     }
+     return list;
+   }
+ 
+   public ArrayList initSubmitSchemeTable(Context ctx, HashMap tempMap, String schemeNumber)
+   {
+     String key = "CALFUNCTIONINTEGRATESERVICE_SCHEMETABLE_EXT_"+schemeNumber;
+     ArrayList list = new ArrayList<String>();
+     Map schemeMap = new HashMap();
+     if (null == tempMap.get(key)) {
+       StringBuilder str = new StringBuilder();
+       str.append(" SELECT REL.FCALSHEMETABLENAME PROPERTYTABLE, REL.FBILLENTRYTABLENAME DATATABLE, SCHEME.FNUMBER ");
+       str.append(" FROM T_HR_SCALSHEMETABLERELATION REL ");
+       str.append(" INNER JOIN T_HR_SCALSUBMITSCHEME SCHEME ON REL.FSUBMITSCHEMEID = SCHEME.FID ");
+       str.append(" INNER JOIN T_HR_SCALSUBMITSCHEMEITEM SCHEMEITEM ON SCHEME.FID = SCHEMEITEM.FCALSUBMITSCHEMEID ");
+       str.append(" INNER JOIN T_HR_SCALSUBMITITEM ITEM ON ITEM.FID = SCHEMEITEM.FCALSUBMITITEMID ");
+       str.append(" where ITEM.fnumber ='"+schemeNumber+"' ");
+        logger.error("initSubmitSchemeTable====="+str.toString());
+      
+       try {
+         IRowSet rowSet = DbUtil.executeQuery(ctx, str.toString());
+         while (rowSet.next()) {
+           schemeMap.put(rowSet.getString("FNUMBER"), rowSet.getString("DATATABLE"));
+         	list.add(rowSet.getString("DATATABLE"));
+         }
+       }
+       catch (Exception e) {
+         e.printStackTrace();
+       }
+       tempMap.put(key, schemeMap);
+     } else {
+       schemeMap = (Map)tempMap.get(key);
+     }
+     return list;
+   }
+ 
+   public SubmitElementInfo initElementItem(Context ctx, HashMap tempMap, String elementItemNum)
+   {
+     String key = "INITELEMENTITEM_SERVICE_SUBMITITEM";
+ 
+     Map itemMap = new HashMap();
+     if (null == tempMap.get(key)) {
+       SubmitElementCollection itemColl = null;
+       try {
+         itemColl = SubmitElementFactory.getLocalInstance(ctx).getSubmitElementCollection("select id, number, name ");
+       } catch (BOSException e) {
+         e.printStackTrace();
+       }
+       for (int i = 0; i < itemColl.size(); ++i) {
+         SubmitElementInfo submitElementInfo = itemColl.get(i);
+         itemMap.put(submitElementInfo.getNumber(), submitElementInfo);
+       }
+       tempMap.put(key, itemMap);
+     } else {
+       itemMap = (Map)tempMap.get(key);
+     }
+     SubmitElementInfo submitElementInfo = (SubmitElementInfo)itemMap.get(elementItemNum);
+     if (null == submitElementInfo)
+       return null;
+     return ((SubmitElementInfo)itemMap.get(elementItemNum));
+   }
+ 
+   public CalSubmitItemInfo initSubmitItem(Context ctx, HashMap tempMap, String itemNumber)
+   {
+     String key = "CALFUNCTIONINTEGRATESERVICE_SUBMITITEM_EXT_"+itemNumber;
+     String basicItemKey = new StringBuilder().append("CALFUNCTIONINTEGRATESERVICE_SUBMITITEM_").append(itemNumber).toString();
+ 
+     Map itemMap = new HashMap();
+     if (null == tempMap.get(key)) {
+       CalSubmitItemCollection itemColl = null;
+       try {
+         itemColl = CalSubmitItemFactory.getLocalInstance(ctx).getCalSubmitItemCollection("select id, fieldSn, number, dateType, dataType,dataDot,filterField.entityName ");
+       } catch (BOSException e) {
+         e.printStackTrace();
+       }
+       for (int i = 0; i < itemColl.size(); ++i) {
+         CalSubmitItemInfo calSubmitItemInfo = itemColl.get(i);
+         itemMap.put(calSubmitItemInfo.getNumber(), calSubmitItemInfo);
+       }
+       tempMap.put(key, itemMap);
+     } else {
+       itemMap = (Map)tempMap.get(key);
+     }
+ 
+     CalSubmitItemInfo calSubmitItemInfo = (CalSubmitItemInfo)itemMap.get(itemNumber);
+     if (null == calSubmitItemInfo)
+       return null;
+     if ((calSubmitItemInfo.getDataType().equals(CalSubmitItemDataType.F7)) && (null == tempMap.get(basicItemKey))) {
+       Map basicItemMap = new HashMap();
+       String entityName = calSubmitItemInfo.getFilterField().getEntity();
+       MetaDataPK meataDataPk = MetaDataPK.create(entityName);
+       EntityObjectInfo entityInfo = MetaDataLoaderFactory.getRemoteMetaDataLoader().getEntity(meataDataPk);
+       String tableName = entityInfo.getTable().getName();
+       String sql = new StringBuilder().append("SELECT FID, FNUMBER FROM ").append(tableName).toString();
+       try {
+         IRowSet rowSet = DbUtil.executeQuery(ctx, sql);
+         while (rowSet.next()) {
+           basicItemMap.put(rowSet.getString("FNUMBER"), new StringBuilder().append(rowSet.getString("FID")).append("###").append(rowSet.getString("FNUMBER")).toString());
+         }
+ 
+         basicItemMap.put("TABLENAME", tableName);
+       } catch (Exception e) {
+         e.printStackTrace();
+       }
+       tempMap.put(basicItemKey, basicItemMap);
+     }
+ 
+     return ((CalSubmitItemInfo)itemMap.get(itemNumber));
+   }
+ 
+   public Set<String> initSchemeItem(Context ctx, HashMap tempMap, String schemeNumber)
+   {
+     String key = "CALFUNCTIONINTEGRATESERVICE_SCHEMEITEM";
+ 
+     Set itemSet = new HashSet();
+     Map<String, Set<String>> schemeItemMap = new HashMap<String, Set<String>>();
+     if (null == tempMap.get(key)) {
+       StringBuilder str = new StringBuilder();
+       str.append(" SELECT ITEM.FNUMBER, ITEM.FIELDSN ");
+       str.append(" FROM T_HR_SCALSUBMITSCHEME SCHEME ");
+       str.append(" INNER JOIN T_HR_SCALSUBMITSCHEMEITEM SCHEMEITEM ON SCHEME.FID = SCHEMEITEM.FCALSUBMITSCHEMEID ");
+       str.append(" INNER JOIN T_HR_SCALSUBMITITEM ITEM ON ITEM.FID = SCHEMEITEM.FCALSUBMITITEMID ");
+       try {
+         IRowSet rowSet = DbUtil.executeQuery(ctx, str.toString());
+         while (rowSet.next()) {
+           String number = rowSet.getString("FNUMBER");
+           if (schemeItemMap.containsKey(number)) {
+             ((Set)schemeItemMap.get(number)).add(rowSet.getString("FIELDSN"));
+           }
+           itemSet = new HashSet();
+           itemSet.add(rowSet.getString("FIELDSN"));
+           schemeItemMap.put(number, itemSet);
+         }
+       }
+       catch (Exception e) {
+         e.printStackTrace();
+       }
+     } else {
+       schemeItemMap = (Map)tempMap.get(key);
+     }
+     return schemeItemMap.containsKey(schemeNumber) ? schemeItemMap.get(schemeNumber) : new HashSet<String>();
+   }
+ 
+ }

+ 295 - 0
GDYSL/websrc/com/kingdee/shr/compensation/service/CustomerFunctionSalaryService.java

@@ -0,0 +1,295 @@
+package com.kingdee.shr.compensation.service;
+
+
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.compensation.CalSchemeInfo;
+import com.kingdee.shr.compensation.app.formula.data.Tools;
+import com.kingdee.shr.customer.gtiit.util.DateTimeUtils;
+
+/**
+ * 薪酬函数
+ * @author issuser
+ *
+ */
+public class CustomerFunctionSalaryService {
+
+	private static Logger logger =
+	        Logger.getLogger("com.kingdee.shr.compensation.service.CustomerFunctionSalaryService");
+	
+	/**
+	 * 获取员工工资包当月金额
+	 * @param personId
+	 * @param cmpItemId
+	 * @param months
+	 * @return
+	 * @throws BOSException 
+	 * @throws SQLException 
+	 */
+	public double getSalayBag(Map<String, Object> paramMap, HashMap<String, Object> tempMap, CalSchemeInfo calSchemeInfo ,String cmpItemId,String months, String mainTableRowFilter) throws BOSException, SQLException {
+		Context ctx = Tools.getInstance().getCtx();
+		String personId = (String)paramMap.get("T_HR_SCMPCALTABLE_FPERSONID");
+		String sql = "SELECT top 1 b.* FROM CT_SAL_SalaryBag a " + 
+				" left join CT_SAL_SalaryBagEntry b on a.fid = b.fbillId " + 
+				" where a.FBillState = 3 and CFPersonID = '" + personId + "' " + 
+				" and a.CFCmpItemID = (select fid from T_HR_SCmpItem where FNumber = '" + cmpItemId + "') and b.CFMonths = '" + months + "'";
+		System.out.println("工资包查询sql:" + sql);
+		IRowSet rowSet = DbUtil.executeQuery(ctx, sql);
+		if(rowSet.next()) {
+			if(rowSet.getObject("CFAmountPayable")==null || rowSet.getDouble("CFAmountPayable")==0) {
+				return rowSet.getDouble("CFMoneys");
+			}else {
+				return rowSet.getDouble("CFAmountPayable");
+			}
+		} 
+		return 0.0D;
+	}
+	
+	
+	/**
+	 * 获取工资追溯信息
+	 * @param personId
+	 * @param cmpItemId
+	 * @param months
+	 * @return
+	 * @throws BOSException 
+	 * @throws SQLException 
+	 */
+	public double getSalayTraceability(Map<String, Object> paramMap, HashMap<String, Object> tempMap, CalSchemeInfo calSchemeInfo ,String projectNumber,String date, String mainTableRowFilter) throws BOSException, SQLException {
+		Context ctx = Tools.getInstance().getCtx();
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		int year = 0;
+		int month = 0;
+		try {
+			Date parse = format.parse(date);
+			Calendar calendar = Calendar.getInstance();
+			calendar.setTime(parse);
+			year = calendar.get(Calendar.YEAR);
+			month = calendar.get(Calendar.MONTH)+1;
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		String personId = (String)paramMap.get("T_HR_SCMPCALTABLE_FPERSONID");
+		String sql = "SELECT sum(cfreissuemonthpay) reissuemonthpay,sum(cfreissueoverpay) reissueoverpay,sum(cfreissuerestoverpay) reissuerestoverpay,"
+				+ "sum(cfreissueholidaysoverpay) reissueholidaysoverpay,sum(cfreissueunleavededuction) reissueunleavededuction "
+				+ "FROM CT_CUS_PersonPayForm where year(cfformmonth)="+year+" and month(cfformmonth)="+month+" and cfpersonid='"+personId+"'";
+		System.out.println("工资追溯查询sql:" + sql);
+		IRowSet rowSet = DbUtil.executeQuery(ctx, sql);
+		if(rowSet.next()) {
+			if(projectNumber.equals("0")) {
+				return rowSet.getDouble("reissuemonthpay");
+			}else if(projectNumber.equals("1")) {
+				return rowSet.getDouble("reissueoverpay");
+			}else if(projectNumber.equals("2")) {
+				return rowSet.getDouble("reissuerestoverpay");
+			}else if(projectNumber.equals("3")) {
+				return rowSet.getDouble("reissueholidaysoverpay");
+			}else if(projectNumber.equals("4")) {
+				return rowSet.getDouble("reissueunleavededuction");
+			}
+		} 
+		return 0.0D;
+	}
+	
+	
+	/**
+	 * 获取工资提报信息
+	 * @param personId
+	 * @param cmpItemId
+	 * @param months
+	 * @return
+	 * @throws BOSException 
+	 * @throws SQLException
+	 * 取工资提报,对于AssignType来说, 0表示兼职,1表示主要任职,3表示 无
+	 * 参数takeType 0表示主职,1表示兼职
+ 	 */
+	public double getPutForward(Map<String, Object> paramMap, HashMap<String, Object> tempMap, CalSchemeInfo calSchemeInfo ,String projectNumber,String date, String takeType, String isHour, String mainTableRowFilter) throws BOSException, SQLException {
+		Context ctx = Tools.getInstance().getCtx();
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		String personId = (String)paramMap.get("T_HR_SCMPCALTABLE_FPERSONID");
+		int year = 0;
+		int month = 0;
+		try {
+			Date parse = format.parse(date);
+			Calendar calendar = Calendar.getInstance();
+			calendar.setTime(parse);
+			year = calendar.get(Calendar.YEAR);
+			month = calendar.get(Calendar.MONTH)+1;
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		
+		String assignType = "";
+		if(takeType.equals("0")) {
+			assignType = "1";
+		}else {
+			assignType = "0";
+		}
+		//查询全职、兼职总工时数
+		if(StringUtils.isNotBlank(isHour)) {
+			String hourSql = "SELECT sum(b.CFTOTALWORKHOURS) sumHour FROM T_HR_SBatchSubmitShemeBill a "
+					+ "left join T_HR_SchemeBillEntry b on a.fid=b.fbillid "
+					+ "left join T_HR_SCmpEmpORelation c on b.FCMPEMPORELATIONID=c.fid "
+					+ "left join T_HR_EmpPostExperienceHis d on d.fid=c.femppostexphisid "  
+					+ "where year(b.FEFFECTDATE)="+year+" and month(b.FEFFECTDATE)="+month+" "
+					+ "and d.FASSIGNTYPE='"+assignType+"' and a.FBILLSTATE = '3' and b.fpersonid='"+personId+"'";
+			logger.error("查询员工全职总工时SQL:"+hourSql);
+			IRowSet schemeRow = DbUtil.executeQuery(ctx, hourSql);
+			while(schemeRow.next()) {
+				return schemeRow.getDouble("sumHour");
+			}
+		}
+		
+		//全职
+		if(takeType.equals("0")) {
+			if(StringUtils.isBlank(projectNumber)) {
+				String amountSql = "SELECT sum(b.CFTOTALAMOUNT) sumAmount FROM T_HR_SBatchSubmitShemeBill a "
+						+ "left join T_HR_SchemeBillEntry b on a.fid=b.fbillid "
+						+ "left join T_HR_SCmpEmpORelation c on b.FCMPEMPORELATIONID=c.fid "
+						+ "left join T_HR_EmpPostExperienceHis d on d.fid=c.femppostexphisid "  
+						+ "where year(b.FEFFECTDATE)="+year+" and month(b.FEFFECTDATE)="+month+" "
+						+ "and d.FASSIGNTYPE='1' and a.FBILLSTATE = '3' and b.fpersonid='"+personId+"'";
+				logger.error("查询员工全职总金额SQL:"+amountSql);
+				IRowSet schemeRow = DbUtil.executeQuery(ctx, amountSql);
+				while(schemeRow.next()) {
+					return schemeRow.getDouble("sumAmount");
+				}
+			}
+			
+			/*String projectFieldSql = "SELECT fieldsn FROM T_HR_SCalSubmitItem where FNUMBER = '"+projectNumber+"'";
+			IRowSet fieldRow = DbUtil.executeQuery(ctx, projectFieldSql);
+			String fieldNo = "";
+			while(fieldRow.next()) {
+				fieldNo = "S"+fieldRow.getString("fieldsn");
+			}
+			if(StringUtils.isEmpty(fieldNo)) {
+				logger.error("根据提报项目编码未查到提报项目");
+				return 0.0D;
+			} 
+			
+			String tableSql = "SELECT c.FBILLENTRYTABLENAME FROM T_HR_SCalSubmitItem a "
+					+ "left join T_HR_SCalSubmitSchemeItem b on a.fid=b.fcalsubmititemid "
+					+ "left join T_HR_SCalShemeTableRelation c on b.FCALSUBMITSCHEMEID = c.fsubmitschemeid "
+					+ "where a.FNUMBER = '"+projectNumber+"'";
+			logger.error("查询提报项目对应表名SQL:"+tableSql);
+			IRowSet tableRow = DbUtil.executeQuery(ctx, tableSql);
+			String tableName = "";
+			while(tableRow.next()) {
+				tableName = tableRow.getString("FBILLENTRYTABLENAME");
+			}
+			
+			String schemeSql = "SELECT sum(k."+fieldNo+") sumHours FROM T_HR_SBatchSubmitShemeBill a "
+					+ "left join T_HR_SchemeBillEntry b on a.fid=b.fbillid "
+					+ "left join T_HR_SCmpEmpORelation c on b.FCMPEMPORELATIONID=c.fid "
+					+ "left join T_HR_EmpPostExperienceHis d on d.fid=c.femppostexphisid "
+					+ "left join T_HR_SCalSubmitScheme e on e.fid=a.fsubmitschemeid  "
+					+ "left join T_HR_SCalShemeTableRelation g on g.fsubmitschemeid=e.fid  "
+					+ "left join T_HR_SCalSubmitSchemeItem s on s.FCALSUBMITSCHEMEID = e.fid "
+					+ "left join T_HR_SCalSubmitItem h on h.fid=s.fcalsubmititemid "
+					+ "left join "+tableName+" k on k.fid = b.fid "  
+					+ "where year(b.FEFFECTDATE)="+year+" and month(b.FEFFECTDATE)="+month+" and d.FASSIGNTYPE='1' "
+					+ "and h.fnumber='"+projectNumber+"' and a.FBILLSTATE = '3' and b.fpersonid='"+personId+"'";
+			logger.error("查询项目对应工时SQL:"+schemeSql);
+			IRowSet schemeRow = DbUtil.executeQuery(ctx, schemeSql);
+			while(schemeRow.next()) {
+				return schemeRow.getDouble("sumHours");
+			}*/
+		}else {
+			String amountSql = "SELECT sum(b.CFTOTALAMOUNT) sumAmount FROM T_HR_SBatchSubmitShemeBill a "
+					+ "left join T_HR_SchemeBillEntry b on a.fid=b.fbillid "
+					+ "left join T_HR_SCmpEmpORelation c on b.FCMPEMPORELATIONID=c.fid "
+					+ "left join T_HR_EmpPostExperienceHis d on d.fid=c.femppostexphisid "  
+					+ "where year(b.FEFFECTDATE)="+year+" and month(b.FEFFECTDATE)="+month+" "
+					+ "and d.FASSIGNTYPE='0' and a.FBILLSTATE = '3' and b.fpersonid='"+personId+"'";
+			logger.error("查询员工兼职总金额SQL:"+amountSql);
+			IRowSet schemeRow = DbUtil.executeQuery(ctx, amountSql);
+			while(schemeRow.next()) {
+				return schemeRow.getDouble("sumAmount");
+			}
+		}
+		return 0.0D;
+	}
+	
+	// 0 兼职 1 全职
+	/**
+	 * 获取月份最新的离职补偿金
+	 * @param months
+	 * @return
+	 * @throws BOSException 
+	 * @throws SQLException 
+	 */
+	public double getSeparationAllowance(String months ) throws BOSException, SQLException {
+		Context ctx = Tools.getInstance().getCtx();
+		String sql = "select top 1 * from CT_COM_Compensationthreshold where CFEffectivedate <= '" + months + "' order by CFEffectivedate desc";
+		System.out.println("获取月份最新的离职补偿金sql:" + sql);
+		IRowSet rowSet = DbUtil.executeQuery(ctx, sql);
+		if(rowSet.next()) {
+			return rowSet.getDouble("FName_l2");
+		}
+		return 0.0;
+	}
+	
+	public double getMianPosHour(Map<String, Object> paramMap, HashMap<String, Object> tempMap, CalSchemeInfo calSchemeInfo ,String date, String mainTableRowFilter) throws BOSException, SQLException {
+		logger.error("获取主要任职时薪日期参数:"+date);
+		Context ctx = Tools.getInstance().getCtx();
+		String personId = (String)paramMap.get("T_HR_SCMPCALTABLE_FPERSONID");
+		String sql = "SELECT cfhourlywage FROM T_HR_EmpOrgRelation where fpersonid = '"+personId+"' and fassignType = '1' and fislatestinaday = '1' and feffdt <= '"+date+"' and fleffdt >= '"+date+"'";
+		logger.error("获取主要任职时薪SQL:"+sql);
+		IRowSet rowSet = DbUtil.executeQuery(ctx, sql);
+		int count = 0;
+		Double hour = 0.0D;
+		if(rowSet.next()) {
+			hour = rowSet.getDouble("cfhourlywage");
+			count++;
+		}
+		logger.error("时薪:"+hour+", 次数:"+count);
+		if(count>1) {
+			return 0.0D;
+		}
+		return hour;
+	}
+	
+	/**
+	 * 根据日期段获取人员离职日期
+	 * @param paramMap
+	 * @param tempMap
+	 * @param calSchemeInfo
+	 * @param date
+	 * @param mainTableRowFilter
+	 * @return
+	 * @throws BOSException
+	 * @throws SQLException
+	 */
+	public String getDepartDate(Map<String, Object> paramMap, HashMap<String, Object> tempMap, CalSchemeInfo calSchemeInfo ,String beginDate, String endDate, String mainTableRowFilter) throws BOSException, SQLException {
+		logger.error("获取离职日期参数:开始日期:"+beginDate+",结束日期:"+endDate);
+		Context ctx = Tools.getInstance().getCtx();
+		String personId = (String)paramMap.get("T_HR_SCMPCALTABLE_FPERSONID");
+		String departDate = "";
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		String sql = "SELECT top 1 b.FBIZDATE FROM T_HR_ResignBizBill a left join T_HR_ResignBizBillEntry b on a.FID = b.FBILLID where b.FBIZDATE >= '"+beginDate+"' and b.FBIZDATE <= '"+endDate+"' and a.FBILLSTATE = '3' and b.FPERSONID = '"+personId+"'";
+		logger.error("获取离职日期SQL:"+sql);
+		IRowSet rowSet = DbUtil.executeQuery(ctx, sql);
+		if(rowSet.next()) {
+			Date date = rowSet.getDate("FBIZDATE");
+			departDate = sdf.format(date);
+		}
+		if(StringUtils.isNotBlank(departDate)) {
+			logger.error("人员ID:"+personId+",离职日期:"+departDate);
+		}
+		return departDate;
+	}
+}

+ 1020 - 0
GDYSL/websrc/com/kingdee/shr/compensation/util/integrate/CmpIntegrateUtils.java

@@ -0,0 +1,1020 @@
+package com.kingdee.shr.compensation.util.integrate;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Maps;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.util.EASResource;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.hr.base.HRBillBaseInfo;
+import com.kingdee.eas.hr.base.HRBillStateEnum;
+import com.kingdee.eas.hr.base.app.util.HRWorkFlowCheckUtil;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.base.syssetting.json.JSONUtils;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillCollection;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillFactory;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillInfo;
+import com.kingdee.shr.compensation.integrate.dto.CalShemeSubmitItemDTO;
+import com.kingdee.shr.compensation.util.CmpStrUtil;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+public class CmpIntegrateUtils {
+	private static Logger logger = Logger.getLogger(CmpIntegrateUtils.class);
+
+	private static String FIELDS_STR = "fields";
+
+	private static String FORMULA_STR = "formula";
+
+	private static String TARGET_STR = "targetField";
+
+	private static String TARGET_NAME_STR = "name";
+
+	private static String TARGET_PRECISION_STR = "decimalPrecision";
+
+	public static void updateEntryBillState(Context ctx, String billId, HRBillStateEnum stateEnum, String billEntryTable) throws BOSException, EASBizException {
+		BatchSubmitShemeBillInfo info = BatchSubmitShemeBillFactory.getLocalInstance(ctx).getBatchSubmitShemeBillInfo("where id = '" + billId + "'");
+		String billEntryTableName = billEntryTable;
+		if (StringUtils.isEmpty(billEntryTableName)) {
+			Map<String, Object> map = getBillColumnListAndBillEntryTableName(ctx, info
+					.getSubmitScheme().getId().toString());
+			billEntryTableName = map.get("fBillEntryTableName").toString();
+		}
+		String sqlTemplate = "UPDATE %s SET FBillState = ? WHERE FBILLID = ?";
+		String sql = String.format(sqlTemplate, new Object[] { billEntryTableName });
+		DbUtil.execute(ctx, sql, new Object[] { Integer.valueOf(stateEnum.getValue()), info.getId().toString() });
+	}
+
+	public static String getUsableItemByHro(Context ctx, String hrOrgUnit, boolean isDisatribute) {
+		StringBuilder personCmpItemPerm = new StringBuilder();
+		personCmpItemPerm.append("select FBaseInfoId from T_HR_SCalSubmitItemRelHR  where T_HR_SCalSubmitItemRelHR.FHrOrgUseId ='");
+		personCmpItemPerm.append(hrOrgUnit).append("'");
+		if (isDisatribute)
+			personCmpItemPerm.append(" and FState=100 ");
+		return personCmpItemPerm.toString();
+	}
+
+	public static boolean checkSubmitSchemeIsUsingBill(Context ctx, String schemeId) {
+		boolean flag = false;
+		if (StringUtils.isEmpty(schemeId))
+			return flag;
+		String sql = "Select top 1 fid  from T_HR_SBatchSubmitShemeBill where fbillstate in (0,1,2)  and FSubmitSchemeID = ? ";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql, new Object[] { schemeId });
+			if (rs.size() > 0)
+				flag = true;
+		} catch (BOSException e) {
+			logger.error(e);
+		}
+		return flag;
+	}
+
+	public static boolean checkSubmitBillEntryIsExists(Context ctx, String billEntryTableName, String billId) {
+		boolean flag = false;
+		if (StringUtils.isEmpty(billId))
+			return flag;
+		String sql = "Select top 1 fid  from " + billEntryTableName + " where fbillId = ? ";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql, new Object[] { billId });
+			if (rs.size() > 0)
+				flag = true;
+		} catch (BOSException e) {
+			logger.error(e);
+		}
+		return flag;
+	}
+
+	public static boolean checkSubmitSchemeIsUsedBill(Context ctx, String schemeId) {
+		boolean flag = false;
+		if (StringUtils.isEmpty(schemeId))
+			return flag;
+		String sql = "Select top 1 fid  from T_HR_SBatchSubmitShemeBill where fbillstate in (1,2)  and FSubmitSchemeID = ? ";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql, new Object[] { schemeId });
+			if (rs.size() > 0)
+				flag = true;
+		} catch (BOSException e) {
+			logger.error(e);
+		}
+		return flag;
+	}
+
+	public static Map checkSubmitSchemesIsUsingBill(Context ctx, List<String> list) {
+		Map<String, Boolean> map = new HashMap<>();
+		String sql = "Select distinct FSubmitSchemeID from T_HR_SBatchSubmitShemeBill where fbillstate in (0,1,2)  and FSubmitSchemeID in( " + CmpStrUtil.convertListToString(list) + ") ";
+		Set<String> snSet = new HashSet<>();
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {
+				String submitSchemeID = rs.getString("FSubmitSchemeID");
+				snSet.add(submitSchemeID);
+			}
+			for (String submitSchemeID : list)
+				map.put(submitSchemeID, Boolean.valueOf(snSet.contains(submitSchemeID)));
+		} catch (Exception e) {
+			logger.error(e);
+		}
+		return map;
+	}
+
+	public static Map<String, List> assembleSubmitSchemeColModel(Context ctx, String schemeId, Integer dataSource, String costTypeId) throws BOSException {
+		Map<String, List> map = new HashMap<>();
+		List<String> colNames = new ArrayList<>();
+		List<Map<String, Object>> colModel = new ArrayList<>();
+		if (StringUtils.isEmpty(schemeId))
+			return map;
+		String language = ctx.getLocale().getLanguage();
+		Set<String> calItemSn = getCalItemSn(ctx, schemeId);
+		Map<String, List<Map<String, Object>>> initAutoCalFieldOption = initAutoCalFieldOption(ctx, schemeId);
+		String sql = "Select m.FNumber,e.FSubmitSchemeType,e.FSubmitTarget,e.FIsEnableSubmitElement,e.FEFFECTDATEDISPLAY , m.fieldSn,m.fdataType,m.fname_" + language + " MNAME,t.FIsRequired ,m.FDataDot,m.FDataLength,  M.FDATETYPE,M.FFILTERFIELD,B.FNAME_" + language + " BNAME, B.FUipk FMAINTAINUIPK,b.FISBASIC   from  T_HR_SCalSubmitScheme e  inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid  inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID  left join  T_HR_SCalSchemeItemForF7 b on m.FFilterField = b.fid  where e.fid = '" + schemeId + "' and t.FIsShow = 1 order by  t.FSortSn asc ";
+		try {
+			String submitTarget = "", dataType = "";
+			int dateType = 0;
+			int effectDateDisplay = 0;
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			String label45 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label45", ctx.getLocale());
+			String label46 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label46", ctx.getLocale());
+			String label47 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label47", ctx.getLocale());
+			String label48 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label48", ctx.getLocale());
+			String label49 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label49", ctx.getLocale());
+			String label50 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label50", ctx.getLocale());
+			String label51 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label51", ctx.getLocale());
+			String label52 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label52", ctx.getLocale());
+			String label53 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label53", ctx.getLocale());
+			String label54 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label54", ctx.getLocale());
+			String label55 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label55", ctx.getLocale());
+			boolean f7Flag = true, isEnableSubmitElement = false;
+			while (rs.next()) {
+				submitTarget = rs.getString("FSubmitTarget");
+				effectDateDisplay = rs.getInt("FEFFECTDATEDISPLAY");
+				isEnableSubmitElement = rs.getBoolean("FIsEnableSubmitElement");
+				dataType = rs.getString("fdataType");
+				if (f7Flag) {
+					f7Flag = false;
+					Map<String, Object> gridMainKeyIdMap = new HashMap<>();
+					Map<String, Object> adminOrgUnitGridMainKeyIdMap = new HashMap<>();
+					Map<String, Object> positionGridMainKeyIdMap = new HashMap<>();
+					Map<String, Object> cmpEmpORGridMainKeyIdMap = new HashMap<>();
+					Map<String, Object> gridIdMap = new HashMap<>();
+					assembleColModelId(gridIdMap);
+					colNames.add("id");
+					colModel.add(gridIdMap);
+					if ("02".equals(submitTarget)) {
+						assembleColModelF7(gridMainKeyIdMap, "orgUnit", label45, true);
+						gridMainKeyIdMap.put("editoptions", assembleColModelF7(label45, "com.kingdee.eas.basedata.org.app.AdminOrgUnit.F7", true));
+						gridMainKeyIdMap.put("sortable", Boolean.valueOf(true));
+						colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label0", ctx.getLocale()));
+						colModel.add(gridMainKeyIdMap);
+					} else {
+						Map<String, Object> map1 = new HashMap<>();
+						map1.put("name", "number");
+						map1.put("label", label46);
+						map1.put("frozen", Boolean.valueOf(false));
+						map1.put("width", Integer.valueOf(90));
+						map1.put("align", "left");
+						map1.put("key", Boolean.valueOf(true));
+						map1.put("hidden", Boolean.valueOf(false));
+						map1.put("editable", Boolean.valueOf(false));
+						map1.put("sorttype", "string");
+						map1.put("classes", "disabled");
+						map1.put("edittype", "shrtext");
+						map1.put("sortable", Boolean.valueOf(true));
+						colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label1", ctx.getLocale()));
+						colModel.add(map1);
+						String CmpEmpORelF7Uipk = "com.kingdee.shr.compensation.app.integrate.CmpEmpORelation.F7";
+						if (3 == dataSource.intValue())
+							CmpEmpORelF7Uipk = "com.kingdee.shr.compensation.app.integrate.stores.CmpEmpORelation.F7";
+						assembleColModelF7(gridMainKeyIdMap, "person", label47, true);
+						gridMainKeyIdMap.put("editoptions", assembleColModelF7(label47, CmpEmpORelF7Uipk, true));
+						gridIdMap.put("frozen", Boolean.valueOf(true));
+						map1.put("frozen", Boolean.valueOf(true));
+						gridMainKeyIdMap.put("frozen", Boolean.valueOf(true));
+						colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label2", ctx.getLocale()));
+						colModel.add(gridMainKeyIdMap);
+						assembleColModelF7NotEdit(adminOrgUnitGridMainKeyIdMap, "adminOrgUnit", label48);
+						adminOrgUnitGridMainKeyIdMap.put("sortable", Boolean.valueOf(true));
+						colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label3", ctx.getLocale()));
+						colModel.add(adminOrgUnitGridMainKeyIdMap);
+						assembleColModelF7NotEdit(positionGridMainKeyIdMap, "position", label49);
+						positionGridMainKeyIdMap.put("sortable", Boolean.valueOf(true));
+						colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label4", ctx.getLocale()));
+						colModel.add(positionGridMainKeyIdMap);
+						assembleColModelF7Hidden(cmpEmpORGridMainKeyIdMap, "cmpEmpORelation", label50);
+						colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label5", ctx.getLocale()));
+						colModel.add(cmpEmpORGridMainKeyIdMap);
+						Map<String, Object> gridPersonIdMap = new HashMap<>();
+						gridPersonIdMap.put("name", "tempId");
+						gridPersonIdMap.put("label", label51);
+						gridPersonIdMap.put("frozen", Boolean.valueOf(false));
+						gridPersonIdMap.put("width", Integer.valueOf(90));
+						gridPersonIdMap.put("align", "left");
+						gridPersonIdMap.put("key", Boolean.valueOf(true));
+						gridPersonIdMap.put("hidden", Boolean.valueOf(true));
+						gridPersonIdMap.put("editable", Boolean.valueOf(false));
+						gridPersonIdMap.put("sorttype", "string");
+						gridPersonIdMap.put("classes", "disabled");
+						gridPersonIdMap.put("edittype", "shrtext");
+						colNames.add("tempId");
+						colModel.add(gridPersonIdMap);
+					}
+					if (isEnableSubmitElement) {
+						Map<String, Object> gridSubmitElementMap = new HashMap<>();
+						assembleColModelF7(gridSubmitElementMap, "submitElement", label52, true);
+						gridSubmitElementMap.put("editoptions", assembleColModelF7(label52, "com.kingdee.shr.compensation.app.integrate.SubmitElement.SubmitBillEntry.F7", true));
+						colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label6", ctx.getLocale()));
+						colModel.add(gridSubmitElementMap);
+					}
+					Map<String, Object> gridCurrencyMap = new HashMap<>();
+					assembleColModelF7(gridCurrencyMap, "currency", label53, true);
+					gridCurrencyMap.put("editoptions", assembleColModelF7(label53, "com.kingdee.eas.basedata.assistant.app.Currency.CMP.F7", true));
+					colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label7", ctx.getLocale()));
+					colModel.add(gridCurrencyMap);
+					Map<String, Object> gridPersonNumberMap = new HashMap<>();
+					gridPersonNumberMap.put("name", "effectDay");
+					gridPersonNumberMap.put("label", label54);
+					gridPersonNumberMap.put("frozen", Boolean.valueOf(false));
+					gridPersonNumberMap.put("width", Integer.valueOf(100));
+					gridPersonNumberMap.put("align", "left");
+					gridPersonNumberMap.put("key", Boolean.valueOf(true));
+					gridPersonNumberMap.put("hidden", Boolean.valueOf(false));
+					gridPersonNumberMap.put("editable", Boolean.valueOf(true));
+					gridPersonNumberMap.put("sorttype", "date");
+					gridPersonNumberMap.put("sortable", Boolean.valueOf(false));
+					gridPersonNumberMap.put("formatter", "shrDateTimePicker");
+					gridPersonNumberMap.put("edittype", "shrDateTimePicker");
+					gridPersonNumberMap.put("classes", "required");
+					StringBuilder datapickerjsonBuilder = new StringBuilder();
+					datapickerjsonBuilder.append("{");
+					datapickerjsonBuilder.append("\"datepickerjson\":");
+					datapickerjsonBuilder.append("{");
+					datapickerjsonBuilder.append("\"id\":\"dp_autoSize\",");
+					datapickerjsonBuilder.append("\"name\":\"dp_autoSize\",");
+					datapickerjsonBuilder.append("\"minuteStep\":\"\",");
+					datapickerjsonBuilder.append("\"showTimeZoneForCtrl\":false,");
+					datapickerjsonBuilder.append("\"isAutoTimeZoneTrans\":false,");
+					datapickerjsonBuilder.append("\"isShowUTC\":false,");
+					datapickerjsonBuilder.append("\"isReadonlyUTC\":true,");
+					datapickerjsonBuilder.append("\"isRemoveSeconds\":true,");
+					if (20 == effectDateDisplay) {
+						datapickerjsonBuilder.append("\"isRemoveDay\":true,");
+					} else if (10 == effectDateDisplay) {
+						datapickerjsonBuilder.append("\"isRemoveDay\":false,");
+					} else {
+						datapickerjsonBuilder.append("\"isRemoveDay\":true,");
+					}
+					datapickerjsonBuilder.append("\"ctrlType\":\"Date\"");
+					datapickerjsonBuilder.append("},");
+					datapickerjsonBuilder.append("\"validateJson\":");
+					datapickerjsonBuilder.append("{");
+					datapickerjsonBuilder.append("\"errMsg\":\"\",");
+					datapickerjsonBuilder.append("\"rules\":\"required:true\",");
+					datapickerjsonBuilder.append("\"validatetrigger\":\"focus keyup datachange\"");
+					datapickerjsonBuilder.append("}");
+					datapickerjsonBuilder.append("}");
+					gridPersonNumberMap.put("editoptions", JSONObject.parseObject(datapickerjsonBuilder.toString()));
+					colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label8", ctx.getLocale()));
+					colModel.add(gridPersonNumberMap);
+				}
+				dataType = rs.getString("fdataType");
+				int isRequired = rs.getInt("FIsRequired");
+				int fDataDot = rs.getInt("FDataDot");
+				int fDataLength = rs.getInt("FDataLength");
+				String fieldSn = "S" + rs.getString("fieldSn");
+				if ("0".equals(dataType)) {
+					Map<String, Object> schemeMap = new HashMap<>();
+					schemeMap.put("name", fieldSn);
+					schemeMap.put("label", rs.getString("MNAME"));
+					schemeMap.put("frozen", Boolean.valueOf(false));
+					schemeMap.put("width", Integer.valueOf(90));
+					schemeMap.put("align", "left");
+					schemeMap.put("key", Boolean.valueOf(false));
+					schemeMap.put("editable", Boolean.valueOf(true));
+					schemeMap.put("sorttype", "bigdecimal");
+					schemeMap.put("sortable", Boolean.valueOf(false));
+					schemeMap.put("formatter", "numberfield");
+					schemeMap.put("edittype", "numberfield");
+					JSONObject jSONObject1 = JSONObject.parseObject("{ \"inputJson\": { \"id\": \"txt_money\", \"name\": \"money\", \"formatType\": \"number\" }, \"validateJson\": {}}");
+					if (isRequired == 1) {
+						schemeMap.put("classes", "required");
+						jSONObject1.put("validateJson", JSONObject.parseObject("{ \"errMsg\": \"\", \"rules\": \"required:true\", \"validatetrigger\": \"focus keyup datachange\" }"));
+					}
+					if (calItemSn.contains(fieldSn)) {
+						schemeMap.put("editable", Boolean.valueOf(false));
+						schemeMap.put("classes", "disabled");
+					}
+					JSONObject jSONObject2 = jSONObject1.getJSONObject("inputJson");
+					jSONObject2.put("decimalPrecision", Integer.valueOf(fDataDot));
+					jSONObject2.put("maxlength", Integer.valueOf(fDataLength));
+					if (initAutoCalFieldOption.containsKey(fieldSn)) {
+						jSONObject1.put("autoCal", Boolean.valueOf(true));
+						jSONObject1.put("cellFomular", initAutoCalFieldOption.get(fieldSn));
+					}
+					schemeMap.put("editoptions", jSONObject1);
+					colModel.add(schemeMap);
+					colNames.add(rs.getString("MNAME"));
+					continue;
+				}
+				if ("1".equals(dataType)) {
+					Map<String, Object> schemeMap = new HashMap<>();
+					schemeMap.put("name", fieldSn);
+					schemeMap.put("label", rs.getString("MNAME"));
+					schemeMap.put("frozen", Boolean.valueOf(false));
+					schemeMap.put("width", Integer.valueOf(90));
+					schemeMap.put("align", "left");
+					schemeMap.put("key", Boolean.valueOf(false));
+					schemeMap.put("editable", Boolean.valueOf(true));
+					schemeMap.put("sorttype", "string");
+					schemeMap.put("sortable", Boolean.valueOf(false));
+					JSONObject jSONObject1 = JSONObject.parseObject("{ \"inputJson\": {  } }");
+					if (isRequired == 1) {
+						schemeMap.put("classes", "required");
+						jSONObject1.put("validateJson", JSONObject.parseObject("{ \"errMsg\": \"\", \"rules\": \"required:true\", \"validatetrigger\": \"focus keyup datachange\" }"));
+					} else {
+						jSONObject1.put("validateJson", JSONObject.parseObject("{ \"errMsg\": \"\", \"rules\": \"required:false\", \"validatetrigger\": \"focus keyup datachange\" }"));
+					}
+					if (calItemSn.contains(fieldSn)) {
+						schemeMap.put("editable", Boolean.valueOf(false));
+						schemeMap.put("classes", "disabled");
+					}
+					JSONObject jSONObject2 = jSONObject1.getJSONObject("inputJson");
+					jSONObject2.put("decimalPrecision", Integer.valueOf(fDataDot));
+					jSONObject2.put("maxlength", Integer.valueOf(fDataLength));
+					schemeMap.put("editoptions", jSONObject1);
+					schemeMap.put("edittype", "shrtext");
+					colModel.add(schemeMap);
+					colNames.add(rs.getString("MNAME"));
+					continue;
+				}
+				if ("2".equals(dataType)) {
+					dateType = rs.getInt("FDATETYPE");
+					Map<String, Object> schemeMap = new HashMap<>();
+					schemeMap.put("name", fieldSn);
+					schemeMap.put("label", rs.getString("MNAME"));
+					schemeMap.put("frozen", Boolean.valueOf(false));
+					schemeMap.put("width", Integer.valueOf(100));
+					schemeMap.put("align", "left");
+					schemeMap.put("key", Boolean.valueOf(true));
+					schemeMap.put("hidden", Boolean.valueOf(false));
+					schemeMap.put("editable", Boolean.valueOf(true));
+					schemeMap.put("sorttype", "date");
+					schemeMap.put("sortable", Boolean.valueOf(false));
+					schemeMap.put("formatter", "shrDateTimePicker");
+					schemeMap.put("edittype", "shrDateTimePicker");
+					if (isRequired == 1)
+						schemeMap.put("classes", "required");
+					StringBuilder datapickerjsonBuffer = new StringBuilder();
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"datepickerjson\":");
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"id\":\"dp_autoSize\",");
+					datapickerjsonBuffer.append("\"name\":\"dp_autoSize\",");
+					datapickerjsonBuffer.append("\"minuteStep\":\"\",");
+					datapickerjsonBuffer.append("\"showTimeZoneForCtrl\":false,");
+					datapickerjsonBuffer.append("\"isAutoTimeZoneTrans\":false,");
+					datapickerjsonBuffer.append("\"isShowUTC\":false,");
+					datapickerjsonBuffer.append("\"isReadonlyUTC\":true,");
+					datapickerjsonBuffer.append("\"isRemoveSeconds\":true,");
+					if (20 == dateType) {
+						datapickerjsonBuffer.append("\"isRemoveDay\":true,");
+					} else if (10 == dateType) {
+						datapickerjsonBuffer.append("\"isRemoveDay\":false,");
+					} else {
+						datapickerjsonBuffer.append("\"isRemoveDay\":false,");
+					}
+					datapickerjsonBuffer.append("\"ctrlType\":\"Date\"");
+					datapickerjsonBuffer.append("},");
+					datapickerjsonBuffer.append("\"validateJson\":");
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"errMsg\":\"\",");
+					if (isRequired == 1) {
+						datapickerjsonBuffer.append("\"rules\":\"required:true\",");
+					} else {
+						datapickerjsonBuffer.append("\"rules\":\"required:false\",");
+					}
+					datapickerjsonBuffer.append("\"validatetrigger\":\"focus keyup datachange\"");
+					datapickerjsonBuffer.append("}");
+					datapickerjsonBuffer.append("}");
+					schemeMap.put("editoptions", JSONObject.parseObject(datapickerjsonBuffer.toString()));
+					colNames.add(rs.getString("MNAME"));
+					colModel.add(schemeMap);
+					continue;
+				}
+				if ("3".equals(dataType)) {
+					Map<String, Object> schemeMap = new HashMap<>();
+					assembleColModelF7(schemeMap, fieldSn, rs.getString("MNAME"), (isRequired == 1));
+					String filter = "";
+					if ("AwardName".equals(rs.getString("FNumber")) && StringUtils.isNotEmpty(costTypeId)) {
+						filter = (rs.getInt("FISBASIC") == 1) ? ("CostType.id = '" + costTypeId + "' and state = 1") : "";
+					} else {
+						filter = (rs.getInt("FISBASIC") == 1) ? "state = 1" : "";
+					}
+					Map<String, Object> map1 = assembleColModelF7(rs.getString("BNAME"), rs.getString("FMAINTAINUIPK"), (isRequired == 1), filter);
+					schemeMap.put("editoptions", map1);
+					colNames.add(rs.getString("MNAME"));
+					colModel.add(schemeMap);
+				}
+			}
+			Map<String, Object> gridDescriptionMap = new HashMap<>();
+			gridDescriptionMap.put("name", "description");
+			gridDescriptionMap.put("label", label55);
+			gridDescriptionMap.put("frozen", Boolean.valueOf(false));
+			gridDescriptionMap.put("width", Integer.valueOf(90));
+			gridDescriptionMap.put("align", "left");
+			gridDescriptionMap.put("key", Boolean.valueOf(false));
+			gridDescriptionMap.put("editable", Boolean.valueOf(true));
+			gridDescriptionMap.put("sortable", Boolean.valueOf(false));
+			gridDescriptionMap.put("formatter", "shrMultiLangBox");
+			gridDescriptionMap.put("edittype", "shrMultiLangBox");
+			JSONObject editoptions = JSONObject.parseObject("{ \"inputJson\": {  } }");
+			JSONObject inputJson = editoptions.getJSONObject("inputJson");
+			inputJson.put("maxlength", Integer.valueOf(255));
+			gridDescriptionMap.put("editoptions", editoptions);
+			colNames.add(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label9", ctx.getLocale()));
+			colModel.add(gridDescriptionMap);
+		} catch (Exception e) {
+			throw new BOSException(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label10", ctx.getLocale()));
+		}
+		map.put("colNames", colNames);
+		map.put("colModel", colModel);
+		return map;
+	}
+
+	public static Map<String, Object> assembleColModelId(Map<String, Object> gridIdMap) {
+		gridIdMap.put("name", "id");
+		gridIdMap.put("label", "id");
+		gridIdMap.put("frozen", Boolean.valueOf(false));
+		gridIdMap.put("width", Integer.valueOf(90));
+		gridIdMap.put("align", "left");
+		gridIdMap.put("key", Boolean.valueOf(true));
+		gridIdMap.put("hidden", Boolean.valueOf(true));
+		gridIdMap.put("editable", Boolean.valueOf(false));
+		gridIdMap.put("sorttype", "");
+		gridIdMap.put("sortable", Boolean.valueOf(false));
+		gridIdMap.put("classes", "disabled");
+		return gridIdMap;
+	}
+
+	public static Map<String, Object> assembleColModelF7(String name, String uipk, boolean isRequired) {
+		Map<String, Object> resultMap = new HashMap<>();
+		Map<String, Object> f7JsonMap = new HashMap<>();
+		Map<String, Object> validateJsonMap = new HashMap<>();
+		Map<String, Object> uipkMap = new HashMap<>();
+		uipkMap.put("title", name);
+		uipkMap.put("uipk", uipk);
+		uipkMap.put("query", "");
+		uipkMap.put("filter", "");
+		uipkMap.put("multiselect", Boolean.valueOf(false));
+		uipkMap.put("isTree", Boolean.valueOf(false));
+		uipkMap.put("treeUrl", "");
+		uipkMap.put("isContainLowerOrg", Boolean.valueOf(false));
+		uipkMap.put("isAdminOrg", Boolean.valueOf(false));
+		uipkMap.put("isEnableExpFilter", Boolean.valueOf(true));
+		f7JsonMap.put("subWidgetOptions", uipkMap);
+		f7JsonMap.put("subWidgetName", "shrPromptGrid");
+		f7JsonMap.put("searchFields", "");
+		f7JsonMap.put("isHROrg", Boolean.valueOf(false));
+		f7JsonMap.put("isAdminOrg", Boolean.valueOf(false));
+		f7JsonMap.put("searchLikePattern", "any");
+		resultMap.put("f7Json", f7JsonMap);
+		validateJsonMap.put("errMsg", "");
+		if (isRequired)
+			validateJsonMap.put("rules", "required:true");
+		validateJsonMap.put("validatetrigger", "focus keyup datachange");
+		resultMap.put("validateJson", validateJsonMap);
+		return resultMap;
+	}
+
+	public static Map<String, Object> assembleColModelF7(String name, String uipk, boolean isRequired, String filter) {
+		Map<String, Object> resultMap = new HashMap<>();
+		Map<String, Object> f7JsonMap = new HashMap<>();
+		Map<String, Object> validateJsonMap = new HashMap<>();
+		Map<String, Object> uipkMap = new HashMap<>();
+		uipkMap.put("title", name);
+		uipkMap.put("uipk", uipk);
+		uipkMap.put("query", "");
+		uipkMap.put("filter", filter);
+		uipkMap.put("multiselect", Boolean.valueOf(false));
+		uipkMap.put("isTree", Boolean.valueOf(false));
+		uipkMap.put("treeUrl", "");
+		uipkMap.put("isContainLowerOrg", Boolean.valueOf(false));
+		uipkMap.put("isAdminOrg", Boolean.valueOf(false));
+		f7JsonMap.put("subWidgetOptions", uipkMap);
+		f7JsonMap.put("subWidgetName", "shrPromptGrid");
+		f7JsonMap.put("searchFields", "");
+		f7JsonMap.put("isHROrg", Boolean.valueOf(false));
+		f7JsonMap.put("isAdminOrg", Boolean.valueOf(false));
+		f7JsonMap.put("searchLikePattern", "any");
+		resultMap.put("f7Json", f7JsonMap);
+		validateJsonMap.put("errMsg", "");
+		if (isRequired)
+			validateJsonMap.put("rules", "required:true");
+		validateJsonMap.put("validatetrigger", "focus keyup datachange");
+		resultMap.put("validateJson", validateJsonMap);
+		return resultMap;
+	}
+
+	public static Map<String, Object> assembleColModelF7(Map<String, Object> gridMainKeyIdMap, String name, String label, boolean isRequired) {
+		gridMainKeyIdMap.put("name", name);
+		gridMainKeyIdMap.put("label", label);
+		gridMainKeyIdMap.put("frozen", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("width", Integer.valueOf(120));
+		gridMainKeyIdMap.put("align", "left");
+		gridMainKeyIdMap.put("key", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("edittype", "promptBox");
+		gridMainKeyIdMap.put("editable", Boolean.valueOf(true));
+		gridMainKeyIdMap.put("sorttype", "objectvalue");
+		gridMainKeyIdMap.put("sortable", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("formatter", "promptBox");
+		if (isRequired)
+			gridMainKeyIdMap.put("classes", "required");
+		return gridMainKeyIdMap;
+	}
+
+	public static Map<String, Object> assembleColModelF7NotEdit(Map<String, Object> gridMainKeyIdMap, String name, String label) {
+		gridMainKeyIdMap.put("name", name);
+		gridMainKeyIdMap.put("label", label);
+		gridMainKeyIdMap.put("frozen", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("width", Integer.valueOf(120));
+		gridMainKeyIdMap.put("align", "left");
+		gridMainKeyIdMap.put("key", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("edittype", "promptBox");
+		gridMainKeyIdMap.put("editable", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("sorttype", "objectvalue");
+		gridMainKeyIdMap.put("sortable", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("formatter", "promptBox");
+		gridMainKeyIdMap.put("classes", "disabled");
+		return gridMainKeyIdMap;
+	}
+
+	public static Map<String, Object> assembleColModelF7Hidden(Map<String, Object> gridMainKeyIdMap, String name, String label) {
+		gridMainKeyIdMap.put("name", name);
+		gridMainKeyIdMap.put("label", label);
+		gridMainKeyIdMap.put("frozen", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("width", Integer.valueOf(120));
+		gridMainKeyIdMap.put("hidden", Boolean.valueOf(true));
+		gridMainKeyIdMap.put("align", "left");
+		gridMainKeyIdMap.put("key", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("edittype", "promptBox");
+		gridMainKeyIdMap.put("editable", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("sorttype", "objectvalue");
+		gridMainKeyIdMap.put("sortable", Boolean.valueOf(false));
+		gridMainKeyIdMap.put("formatter", "promptBox");
+		gridMainKeyIdMap.put("classes", "disabled");
+		return gridMainKeyIdMap;
+	}
+
+	public static Map<String, Object> getBillColumnListAndQuerySql(Context ctx, String submitSchemeId, String billID) throws BOSException {
+		Map<String, Object> map = new HashMap<>();
+		List<String> colNames = new ArrayList<>();
+		Map<String, Object> columnMap = new HashMap<>();
+		if (StringUtils.isEmpty(submitSchemeId))
+			return map;
+		if (null != billID && billID.contains(" "))
+			throw new BOSException("Illegal parameter: " + billID);
+		try {
+			String sqlBuilder = " SELECT   item.fieldSn FIELDSN,  b.FTable FTABLE FROM T_HR_SCalSubmitScheme scheme  inner join T_HR_SCalSubmitSchemeItem schemeItem on scheme.fid = schemeItem.FCalSubmitSchemeID  inner join T_HR_SCalSubmitItem item on item.fid = schemeItem.FCalSubmitItemID  inner join T_HR_SCalSchemeItemForF7 b on item.FFilterField = b.fid  where scheme.fid = ? and item.FDataType = '3' order by  FSortSn";
+			IRowSet rs = DbUtil.executeQuery(ctx, sqlBuilder, (Object[])new String[] { submitSchemeId });
+			Map<String, Map<String, String>> f7ItemTableMapper = Maps.newHashMap();
+			int tableNameCount = 1;
+			while (rs.next()) {
+				Map<String, String> tableNameMap = new HashMap<>();
+				tableNameMap.put("TABLENAME", rs.getString("FTABLE"));
+				tableNameMap.put("ALIANAME", rs.getString("FTABLE") + tableNameCount);
+				f7ItemTableMapper.put("S" + rs.getInt("FIELDSN"), tableNameMap);
+				tableNameCount++;
+			}
+			String language = ctx.getLocale().getLanguage();
+			String sql = "Select e.FSubmitSchemeType,e.FSubmitTarget,e.FIsEnableSubmitElement , m.fieldSn,m.FDataDot,m.fdataType,m.fname_" + language + " ,n.FBillEntryTableName from  T_HR_SCalSubmitScheme e  inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid  inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID  inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid   where e.fid = '" + submitSchemeId + "'  order by FSortSn ";
+			StringBuilder sd = new StringBuilder(" select t.fid id ,  t.FEffectDate effectDate ,t.FLEffectDate leffectDate , t.FCmpEmpORelationID cmpEmpORelation,");
+			colNames.add("id");
+			colNames.add("effectDate");
+			colNames.add("leffectDate");
+			String submitTarget = "", fBillEntryTableName = "";
+			rs = DbUtil.executeQuery(ctx, sql);
+			boolean f7Flag = true, personFlag = true, isEnableSubmitElement = false;
+			while (rs.next()) {
+				submitTarget = rs.getString("FSubmitTarget");
+				isEnableSubmitElement = rs.getBoolean("FIsEnableSubmitElement");
+				if (f7Flag) {
+					f7Flag = false;
+					fBillEntryTableName = rs.getString("FBillEntryTableName");
+					if ("02".equals(submitTarget)) {
+						personFlag = false;
+						colNames.add("orgId");
+						colNames.add("name");
+						colNames.add("number");
+						sd.append("n.fid orgId , n.fname_").append(language).append(" name , n.fnumber number ");
+					} else {
+						colNames.add("dealStatus");
+						colNames.add("personId");
+						colNames.add("name");
+						colNames.add("number");
+						colNames.add("admOrgId");
+						colNames.add("admOrgName");
+						colNames.add("positionId");
+						colNames.add("positionName");
+						colNames.add("cmpEmpORelation");
+						sd.append(" t.FDealStatus dealStatus, person.fid personId , person.fname_").append(language).append("  name, person.fnumber number, adminOrgUnit.fid admOrgId, adminOrgUnit.fname_").append(language).append(" admOrgName, position.fid positionId, position.fname_").append(language).append(" positionName  ");
+					}
+				}
+				String fieldName = "S" + rs.getString("fieldSn");
+				if (f7ItemTableMapper.containsKey(fieldName)) {
+					Map<String, String> map2 = f7ItemTableMapper.get(fieldName);
+					String ailaName = map2.get("ALIANAME");
+					sd.append(",").append(ailaName).append(".FID ").append(fieldName).append("id,").append(ailaName).append(".FNAME_").append(language).append(" ").append(fieldName).append(",").append(ailaName).append(".FNUMBER ").append(fieldName).append("number");
+				} else {
+					sd.append(",").append(fieldName);
+				}
+				colNames.add(fieldName);
+				if ("0".equals(rs.getString("fdataType")))
+					columnMap.put(fieldName, Integer.valueOf(rs.getInt("FDataDot")));
+			}
+			colNames.add("description");
+			if (isEnableSubmitElement) {
+				colNames.add("submitElement");
+				sd.append(", t.FSubmitElementID submitElement,submitElement.Fname_").append(language).append(" submitElementName ");
+			}
+			colNames.add("currency");
+			sd.append(",currency.fid currency,currency.fname_").append(language).append(" currencyName,t.fdescription_l1 description_l1,t.fdescription_l2 description_l2,t.fdescription_l3 description_l3");
+			
+			// start xiaoxin 添加提报单分录字段
+			sd.append(",se.CFSuperiorID superiorId,se.CFSuperiorName superiorName,se.CFHourlyWage hourlyWage,se.CFStartTime startTime,se.CFEndTime endTime,se.CFRestStartTime restStartTime,se.CFRemark remark");
+			sd.append(",se.CFRestEndTime restEndTime,se.CFExplain explain,se.CFTotalWorkHours totalWorkHours,se.CFTotalAmount totalAmount,se.CFBeginContractDate beginContractDate,se.CFEndContractDate endContractDate");
+			colNames.add("superiorId"); 
+			colNames.add("superiorName");
+			colNames.add("hourlyWage");
+			colNames.add("startTime");
+			colNames.add("endTime");
+			colNames.add("restStartTime");
+			colNames.add("restEndTime");
+			colNames.add("explain");
+			colNames.add("totalWorkHours");
+			colNames.add("totalAmount");
+			colNames.add("beginContractDate");
+			colNames.add("endContractDate");
+			colNames.add("remark");
+			// end xiaoxin
+			
+			sd.append(" from ").append(fBillEntryTableName).append(" ");
+			if (personFlag) {
+				sd.append(" t  inner join t_bd_person person on t.fpersonId = person.fid ");
+				sd.append(" LEFT join T_ORG_Admin adminOrgUnit on t.FAdminOrgUnitID = adminOrgUnit.fid ");
+				sd.append(" LEFT join T_ORG_Position position on t.FPositionID = position.fid ");
+			} else {
+				sd.append(" t  inner join T_ORG_Admin  n on t.FOrgUnitID = n.fid ");
+			}
+			sd.append(" LEFT join T_BD_Currency currency on t.fCurrencyID = currency.fid ");
+			
+			// start xiaoxin 添加提报单分录字段
+			sd.append(" LEFT join T_HR_SchemeBillEntry se on se.fid = t.fid ");
+			// end xiaoxin
+			
+			if (isEnableSubmitElement)
+				sd.append(" LEFT join T_HR_SSubmitElement submitElement on t.FSubmitElementID = submitElement.fid ");
+			Set<String> f7KeySet = f7ItemTableMapper.keySet();
+			for (String f7Key : f7KeySet) {
+				Map<String, String> map2 = f7ItemTableMapper.get(f7Key);
+				String tableName = map2.get("TABLENAME");
+				String aliaTbName = map2.get("ALIANAME");
+				sd.append(" LEFT JOIN ").append(tableName).append(" ").append(aliaTbName).append(" on t.").append(f7Key).append(" = ").append(aliaTbName).append(".FID ");
+			}
+			sd.append(" where t.fbillid = '").append(StringEscapeUtils.escapeSql(billID)).append("'");
+			map.put("querySql", sd.toString());
+			map.put("colNames", colNames);
+			map.put("columnMap", columnMap);
+		} catch (Exception e) { 
+			throw new BOSException(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label10", ctx.getLocale()));
+		}
+		return map;
+	}
+
+	public static Map<String, Object> getBillColumnListAndBillEntryTableName(Context ctx, String submitSchemeId) throws BOSException {
+		Map<String, Object> map = new HashMap<>();
+		List<String> colNames = new ArrayList<>();
+		List<String> colTypes = new ArrayList<>();
+		if (StringUtils.isEmpty(submitSchemeId))
+			return map;
+		String language = ctx.getLocale().getLanguage();
+		String sql = "Select e.FSubmitTarget , m.fieldSn,m.fdataType,m.fname_" + language + " ,n.FBillEntryTableName ,n.FCalShemeTableName ,t.FIsRequired from  T_HR_SCalSubmitScheme e  inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid  inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID  inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid   where e.fid = '" + submitSchemeId + "'  order by FSortSn ";
+		try {
+			String fBillEntryTableName = "";
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {
+				if (StringUtils.isEmpty(fBillEntryTableName))
+					fBillEntryTableName = rs.getString("FBillEntryTableName");
+				colNames.add("S" + rs.getString("fieldSn"));
+				colTypes.add(rs.getString("fdataType"));
+			}
+			map.put("fBillEntryTableName", fBillEntryTableName);
+			map.put("colNames", colNames);
+			map.put("colTypes", colTypes);
+		} catch (Exception e) {
+			throw new BOSException(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label10", ctx.getLocale()));
+		}
+		return map;
+	}
+
+	public static Map<String, Object> getBillColumnListAndBillEntryTableNameByDataType(Context ctx, String submitSchemeId, String dataType) throws BOSException {
+		Map<String, Object> map = new HashMap<>();
+		List<String> colNames = new ArrayList<>();
+		if (StringUtils.isEmpty(submitSchemeId))
+			return map;
+		String language = ctx.getLocale().getLanguage();
+		String sql = "Select e.FSubmitTarget , m.fieldSn,m.fdataType,m.fname_" + language + " ,n.FBillEntryTableName ,n.FCalShemeTableName ,t.FIsRequired from  T_HR_SCalSubmitScheme e  inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid  inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID  inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid   where e.fid = '" + submitSchemeId + "' and m.fdataType = '" + dataType + "'  order by FSortSn ";
+		try {
+			String fBillEntryTableName = "", fCalShemeTableName = "";
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {
+				if (StringUtils.isEmpty(fBillEntryTableName)) {
+					fBillEntryTableName = rs.getString("FBillEntryTableName");
+					fCalShemeTableName = rs.getString("FCalShemeTableName");
+				}
+				colNames.add("S" + rs.getString("fieldSn"));
+			}
+			map.put("fBillEntryTableName", fBillEntryTableName);
+			map.put("fCalShemeTableName", fCalShemeTableName);
+			map.put("colNames", colNames);
+		} catch (Exception e) {
+			throw new BOSException(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label10", ctx.getLocale()));
+		}
+		return map;
+	}
+
+	public static String getSchemeEntryTableName(Context ctx, String submitSchemeId) {
+		String fBillEntryTableName = "";
+		String sql = "Select n.FBillEntryTableName  from  T_HR_SCalSubmitScheme e  inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid   where e.fid = '" + submitSchemeId + "'  ";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next())
+				fBillEntryTableName = rs.getString("FBillEntryTableName");
+		} catch (Exception e) {
+			logger.info(e);
+		}
+		return fBillEntryTableName;
+	}
+
+	public static String getCalShemeTableName(Context ctx, String submitSchemeId) {
+		String calShemeTableName = "";
+		String sql = "Select n.FBillEntryTableName  from  T_HR_SCalSubmitScheme e  inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid   where e.fid = '" + submitSchemeId + "'  ";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next())
+				calShemeTableName = rs.getString("FBillEntryTableName");
+		} catch (Exception e) {
+			logger.info(e);
+		}
+		return calShemeTableName;
+	}
+
+	public static boolean deleteSubmitSchemeRelationDate(Context ctx, String schemeId) throws BOSException, SQLException {
+		boolean flag = false;
+		if (StringUtils.isEmpty(schemeId))
+			return flag;
+		String sql = "select FBillEntryTableName , FCalShemeTableName  from T_HR_SCalShemeTableRelation where FSubmitSchemeID = ?";
+		String calShemeTableName = "";
+		String billEntryTableName = "";
+		IRowSet list = DbUtil.executeQuery(ctx, sql, new Object[] { schemeId });
+		while (list.next()) {
+			billEntryTableName = list.getString("FBillEntryTableName");
+			calShemeTableName = list.getString("FCalShemeTableName");
+		}
+		if (!CmpStrUtil.isEmpty(calShemeTableName)) {
+			DbUtil.execute(ctx, "If exists (select * from KSQL_USERTABLES where KSQL_TABNAME ='" + calShemeTableName + "') drop table " + calShemeTableName + "");
+			DbUtil.execute(ctx, "If exists (select * from KSQL_USERTABLES where KSQL_TABNAME ='" + billEntryTableName + "') drop table " + billEntryTableName + "");
+		}
+		DbUtil.execute(ctx, "delete   from T_HR_SCalShemeTableRelation where FSubmitSchemeID = ? ", new Object[] { schemeId });
+		DbUtil.execute(ctx, "delete   from T_HR_SCalSubmitSchemeItem where FCalSubmitSchemeID = ?", new Object[] { schemeId });
+		DbUtil.execute(ctx, "delete   from T_HR_SBaseFormula where FBusinessRelationConfigID in(select fid from T_HR_SBusinessRelationConfig where FBusinessId = ?)", new Object[] { schemeId });
+		DbUtil.execute(ctx, "delete   from T_HR_SBusinessRelationConfig where FBusinessId = ?", new Object[] { schemeId });
+		DbUtil.execute(ctx, "delete   from T_HR_SSchemeDeduConfig where FCalSubmitSchemeID = ?", new Object[] { schemeId });
+		DbUtil.execute(ctx, "delete   from T_HR_SSubmitSchemeVRuleNodeRel where FSubmitSchemeVRuleID in(select fid from T_HR_SSubSchemeVerifiRule where FSubmitSchemeID = ? )", new Object[] { schemeId });
+		DbUtil.execute(ctx, "delete   from T_HR_SSubSchemeVerifiRule where FSubmitSchemeID = ?", new Object[] { schemeId });
+		DbUtil.execute(ctx, "delete   from T_HR_SCalSubmitPeriod where FSubmitSchemeId = ?", new Object[] { schemeId });
+		DbUtil.execute(ctx, "delete   from T_HR_SchemeBizKeyDefine where FSubmitSchemeId = ?", new Object[] { schemeId });
+		return flag;
+	}
+
+	public static boolean dropSubmitSchemeEntryTableCol(Context ctx, String schemeId, String itemId) throws BOSException, SQLException {
+		boolean flag = false;
+		if (StringUtils.isEmpty(schemeId))
+			return flag;
+		String sql = "select FBillEntryTableName , FCalShemeTableName  from T_HR_SCalShemeTableRelation where FSubmitSchemeID = '" + schemeId + "'";
+		String sqlItem = "select fieldSn from  T_HR_SCalSubmitItem m  inner join  T_HR_SCalSubmitSchemeItem t on m.fid = t.FCalSubmitItemID  where t.fid  = '" + itemId + "'";
+		String calShemeTableName = "", billEntryTableName = "", col = "";
+		IRowSet rs = DbUtil.executeQuery(ctx, sql);
+		while (rs.next()) {
+			billEntryTableName = rs.getString("FBillEntryTableName");
+			calShemeTableName = rs.getString("FCalShemeTableName");
+		}
+		rs = DbUtil.executeQuery(ctx, sqlItem);
+		while (rs.next())
+			col = "S" + rs.getString("fieldSn");
+		StringBuilder calShemeTable = new StringBuilder("If  exists (select * from KSQL_USERCOLUMNS where KSQL_COL_NAME ='" + col + "'  and KSQL_COL_TABNAME='" + calShemeTableName + "')");
+		calShemeTable.append("ALTER TABLE " + calShemeTableName + " drop column " + col + " ");
+		StringBuilder billEntryTable = new StringBuilder("If  exists (select * from KSQL_USERCOLUMNS where KSQL_COL_NAME ='" + col + "'  and KSQL_COL_TABNAME='" + billEntryTableName + "')");
+		billEntryTable.append("ALTER TABLE " + billEntryTableName + " drop column " + col + " ");
+		if (!CmpStrUtil.isEmpty(calShemeTableName)) {
+			DbUtil.execute(ctx, calShemeTable.toString());
+			DbUtil.execute(ctx, billEntryTable.toString());
+		}
+		return flag;
+	}
+
+	public static Map<String, Object> getRequiredColumns(Context ctx, String submitSchemeId, boolean needEnableData) throws BOSException {
+		Map<String, Object> map = new HashMap<>();
+		List<Map<String, Object>> colNames = new ArrayList<>();
+		if (StringUtils.isEmpty(submitSchemeId))
+			return map;
+		String language = ctx.getLocale().getLanguage();
+		String sql = "Select e.FSubmitTarget , m.fieldSn,m.fdataType,m.fname_" + language + " MNAME,n.FBillEntryTableName ,n.FCalShemeTableName ,t.FIsRequired,t.fstate state from  T_HR_SCalSubmitScheme e  inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid  inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID  inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid   where e.fid = '" + submitSchemeId + "'";
+		if (needEnableData)
+			sql = sql + "and t.fstate = 1 ";
+		sql = sql + " order by t.FSortSn asc ";
+		String submitTarget = null;
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {
+				Map<String, Object> gridIdMap = new HashMap<>();
+				gridIdMap.put("rename", rs.getString("MNAME"));
+				gridIdMap.put("name", "CMP_SMT002.S" + rs.getString("fieldSn"));
+				gridIdMap.put("label", rs.getString("MNAME"));
+				gridIdMap.put("type", "String");
+				submitTarget = rs.getString("FSubmitTarget");
+				colNames.add(gridIdMap);
+			}
+			map.put("colNames", colNames);
+			map.put("submitTarget", submitTarget);
+		} catch (Exception e) {
+			throw new BOSException(EASResource.getString("com.kingdee.shr.compensation.resource.SubmitShemeBillResource", "label10", ctx.getLocale()));
+		}
+		return map;
+	}
+
+	public static List<CalShemeSubmitItemDTO> getDynamicSubmitItemBySchemeId(Context ctx, String schemeId) {
+		List<CalShemeSubmitItemDTO> calShemeSubmitItemDTOS = new ArrayList<>();
+		StringBuilder sqlBuffer = new StringBuilder();
+		String language = ctx.getLocale().getLanguage();
+		sqlBuffer.append(" SELECT M.FNUMBER AS ITEMNUMBER,E.FID AS SCHEMEID, M.FID as ITEMID,  M.FIELDSN,M.FDATATYPE,M.FNAME_" + language + " AS ITEMNAME,T.FISREQUIRED ,M.FDATADOT,M.FDATALENGTH ");
+		sqlBuffer.append(" FROM  T_HR_SCALSUBMITSCHEME E  ");
+		sqlBuffer.append(" INNER JOIN  T_HR_SCALSUBMITSCHEMEITEM T ON T.FCALSUBMITSCHEMEID = E.FID  ");
+		sqlBuffer.append(" INNER JOIN T_HR_SCALSUBMITITEM M ON  M.FID = T.FCALSUBMITITEMID WHERE T.FISSHOW=1  AND T.FState= ").append(1).append(" AND E.FID = '");
+		sqlBuffer.append(schemeId);
+		sqlBuffer.append("' ORDER BY T.FSORTSN");
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sqlBuffer.toString());
+			CalShemeSubmitItemDTO calShemeSubmitItemDTO = null;
+			while (rs.next()) {
+				calShemeSubmitItemDTO = new CalShemeSubmitItemDTO();
+				calShemeSubmitItemDTO.setSubmitSchemeId(rs.getString("SCHEMEID"));
+				calShemeSubmitItemDTO.setItemId(rs.getString("ITEMID"));
+				calShemeSubmitItemDTO.setFieldSn(Integer.valueOf(rs.getInt("FIELDSN")));
+				calShemeSubmitItemDTO.setDataType(rs.getString("FDATATYPE"));
+				calShemeSubmitItemDTO.setSubmitItemName(rs.getString("ITEMNAME"));
+				calShemeSubmitItemDTO.setIsRequired(Integer.valueOf(rs.getInt("FISREQUIRED")));
+				calShemeSubmitItemDTO.setDataDot(Integer.valueOf(rs.getInt("FDATADOT")));
+				calShemeSubmitItemDTO.setDataLength(Integer.valueOf(rs.getInt("FDATALENGTH")));
+				calShemeSubmitItemDTO.setSubmitItemNumber(rs.getString("ITEMNUMBER"));
+				calShemeSubmitItemDTOS.add(calShemeSubmitItemDTO);
+			}
+		} catch (BOSException e) {
+			e.printStackTrace();
+			logger.error(e.getMessage(), (Throwable)e);
+		} catch (SQLException e) {
+			logger.error(e.getMessage(), e);
+			e.printStackTrace();
+		}
+		return calShemeSubmitItemDTOS;
+	}
+
+	public static Map<String, Integer> getCellLength(Context ctx, String schemeId) {
+		Map<String, Integer> map = new HashMap<>();
+		String sql = "Select m.fieldSn,m.FDataLength from  T_HR_SCalSubmitScheme e  inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid  inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID  where e.fid = '" + schemeId + "' and FDataType = '1' order by  FSortSn";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {
+				String fieldSn = String.valueOf(rs.getInt(1));
+				Integer dataLength = Integer.valueOf(rs.getInt(2));
+				map.put(fieldSn, dataLength);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return map;
+	}
+
+	public static Set<String> getCalItemSn(Context ctx, String schemeId) throws BOSException {
+		Set<String> calItemSn = new HashSet<>();
+		String formulaSql = "SELECT bf.FCalItem calItem FROM T_HR_SBaseFormula bf LEFT JOIN T_HR_SBusinessRelationConfig brc ON bf.FBUSINESSRELATIONCONFIGID = brc.FID WHERE brc.FBUSINESSID = '" + schemeId + "' AND bf.FISCAL = 1";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, formulaSql);
+			while (rs.next()) {
+				String sn = rs.getString("calItem");
+				if (null != sn || !"".equals(sn))
+					calItemSn.add(sn);
+			}
+		} catch (SQLException e) {
+			String label56 = EASResource.getString("com.kingdee.shr.compensation.resource.CmpXQLangResource", "label56", ctx.getLocale());
+			throw new BOSException(label56, e);
+		}
+		return calItemSn;
+	}
+
+	public static Map<String, List<Map<String, Object>>> initAutoCalFieldOption(Context ctx, String schemeId) {
+		StringBuilder sqlBuffer = new StringBuilder();
+		sqlBuffer.append(" SELECT FORMULA.FCALITEM, FORMULA.FSORTSN, FORMULA.FEXPRESS, FORMULA.FLISTITEM, ");
+		sqlBuffer.append(" ITEM.FDATADOT FDATADOT ");
+		sqlBuffer.append(" FROM T_HR_SBUSINESSRELATIONCONFIG CONFIG  ");
+		sqlBuffer.append(" INNER JOIN T_HR_SBASEFORMULA FORMULA ON FORMULA.FBUSINESSRELATIONCONFIGID = CONFIG.FID ");
+		sqlBuffer.append(" LEFT JOIN T_HR_SCalSubmitItem ITEM ON FORMULA.FCALITEM =  CONCAT('S',CONVERT(VARCHAR,ITEM.FIELDSN))  ");
+		sqlBuffer.append(" WHERE ");
+		sqlBuffer.append(" CONFIG.FBUSINESSID = '").append(schemeId).append("' ");
+		sqlBuffer.append(" AND FORMULA.FISCAL = 1 ");
+		sqlBuffer.append(" AND FORMULA.FEXPRESS IS NOT NULL ");
+		sqlBuffer.append(" AND FORMULA.FCALITEM IS NOT NULL ");
+		sqlBuffer.append(" AND (FORMULA.FLISTFUNC IS NULL OR FORMULA.FLISTFUNC LIKE '') ");
+		sqlBuffer.append(" AND (FORMULA.FLISTVAR IS NULL OR FORMULA.FLISTVAR LIKE '') ");
+		sqlBuffer.append(" AND ITEM.FDATATYPE = '").append("0").append("' ");
+		sqlBuffer.append(" ORDER BY FORMULA.FSORTSN ");
+		String tableName = getSchemeEntryTableName(ctx, schemeId);
+		HashMap<String, List<Map<String, Object>>> result = new HashMap<>();
+		HashMap<String, List<Map<String, Object>>> realResult = new HashMap<>();
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sqlBuffer.toString());
+			String calItem = "", express = "", listItems = "";
+			int targetDataDot = 2;
+			while (rs.next()) {
+				Map<String, Object> targetFieldMap = new HashMap<>();
+				calItem = rs.getString("FCALITEM");
+				targetDataDot = rs.getInt("FDATADOT");
+				targetFieldMap.put(TARGET_NAME_STR, calItem);
+				targetFieldMap.put(TARGET_PRECISION_STR, Integer.valueOf(targetDataDot));
+				express = rs.getString("FEXPRESS");
+				listItems = rs.getString("FLISTITEM");
+				if (express.contains("if"))
+					continue;
+				express = express.replace(tableName, "").replace("_", "");
+				express = express.substring(express.indexOf("=") + 1);
+				listItems = listItems.replace(tableName, "").replace("double", "").replace("~", "");
+				String[] listItemsArr = listItems.split(";");
+				if (listItemsArr.length == 1 && listItems.equals(calItem))
+					continue;
+				List<String> realListItems = new ArrayList<>(listItemsArr.length - 1);
+				for (String str : listItemsArr) {
+					if (!str.equals(calItem))
+						realListItems.add(str);
+				}
+				for (String str : realListItems) {
+					List<Map<String, Object>> perFieldFormulas;
+					if (result.containsKey(str)) {
+						perFieldFormulas = result.get(str);
+					} else {
+						perFieldFormulas = new ArrayList<>();
+					}
+					Map<String, Object> perFormula = new HashMap<>();
+					perFormula.put(FIELDS_STR, realListItems);
+					perFormula.put(FORMULA_STR, express);
+					perFormula.put(TARGET_STR, targetFieldMap);
+					perFieldFormulas.add(perFormula);
+					result.put(str, perFieldFormulas);
+				}
+			}
+			Set<String> keySet = result.keySet();
+			Iterator<String> iterator = keySet.iterator();
+			String listItem = "", tempItem = "";
+			String resultStr = JSONUtils.convertObjectToJson(ctx, result);
+			realResult.putAll(JSONUtils.convertJsonToObject(ctx, resultStr));
+			while (iterator.hasNext()) {
+				listItem = iterator.next();
+				List<Map<String, Object>> perFieldFormulas = result.get(listItem);
+				Iterator<Map<String, Object>> iterator2 = perFieldFormulas.iterator();
+				while (iterator2.hasNext()) {
+					tempItem = (String)((Map)((Map)iterator2.next()).get(TARGET_STR)).get(TARGET_NAME_STR);
+					if (result.containsKey(tempItem))
+						((List)realResult.get(listItem)).addAll(result.get(tempItem));
+				}
+			}
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+		}
+		return realResult;
+	}
+
+	public static void checkHRBillIsEdit(Context ctx, String billId) throws BOSException, EASBizException {
+		if (!StringUtils.isEmpty(billId)) {
+			BatchSubmitShemeBillCollection billInfoC = BatchSubmitShemeBillFactory.getLocalInstance(ctx).getBatchSubmitShemeBillCollection("select  id,billState where id = '" + billId + "'");
+			BatchSubmitShemeBillInfo billInfo = billInfoC.isEmpty() ? null : billInfoC.get(0);
+			HRBillStateEnum oldBillState = billInfoC.isEmpty() ? null : billInfoC.get(0).getBillState();
+			HRWorkFlowCheckUtil.checkHRBillIsEdit(ctx, (HRBillBaseInfo)billInfo, oldBillState);
+		}
+	}
+}

+ 1432 - 0
GDYSL/websrc/com/kingdee/shr/compensation/util/integrate/CmpIntegrateUtilsNew.java

@@ -0,0 +1,1432 @@
+package com.kingdee.shr.compensation.util.integrate;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.util.EASResource;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.hr.base.HRBillStateEnum;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.base.syssetting.app.filter.HRFilterUtils;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitSchemeBillDataSource;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillFactory;
+import com.kingdee.shr.compensation.app.integrate.BatchSubmitShemeBillInfo;
+import com.kingdee.shr.compensation.app.integrate.CalSubmitItemDataType;
+import com.kingdee.shr.compensation.app.integrate.DateTypeEnum;
+import com.kingdee.shr.compensation.integrate.dto.CalShemeSubmitItemDTO;
+import com.kingdee.shr.compensation.resource.ResourceConstant;
+import com.kingdee.shr.compensation.util.CmpDateUtil;
+import com.kingdee.shr.compensation.util.CmpStrUtil;
+
+public class CmpIntegrateUtilsNew {
+	
+	private static Logger logger = Logger.getLogger(CmpIntegrateUtilsNew.class);
+	
+	
+	
+	/**
+	 * 重载更新分录审批状态
+	 * 
+	 * @param ctx
+	 * @param billId
+	 * @param stateEnum
+	 * @throws BOSException
+	 * @throws EASBizException
+	 */
+	public static void updateEntryBillState(Context ctx, String billId, HRBillStateEnum stateEnum,
+			String billEntryTable) throws BOSException, EASBizException {
+		BatchSubmitShemeBillInfo info = BatchSubmitShemeBillFactory.getLocalInstance(ctx)
+				.getBatchSubmitShemeBillInfo("where id = '" + billId + "'");
+
+		String billEntryTableName = billEntryTable;
+		if (StringUtils.isEmpty(billEntryTableName)) {
+			Map<String, Object> map = CmpIntegrateUtilsNew.getBillColumnListAndBillEntryTableName(ctx,
+					info.getSubmitScheme().getId().toString());
+			billEntryTableName = map.get("fBillEntryTableName").toString(); // 方案对应的动态表名
+		}
+		// 更新分录状态
+		String sqlTemplate = "UPDATE %s SET FBillState = ? WHERE FBILLID = ?";
+		String sql = String.format(sqlTemplate, billEntryTableName);
+
+		DbUtil.execute(ctx, sql, new Object[] {stateEnum.getValue(), info.getId().toString()});
+	}
+	
+	
+	
+	/**
+	 * 指定业务组织下,当前用户可使用且数据权限分配的薪酬项目
+	 * @throws EASBizException 
+	 */
+	public static String getUsableItemByHro(Context ctx, String hrOrgUnit,boolean isDisatribute)  {
+		StringBuffer personCmpItemPerm = new StringBuffer();
+		personCmpItemPerm.append("select FBaseInfoId from T_HR_SCalSubmitItemRelHR  where T_HR_SCalSubmitItemRelHR.FHrOrgUseId ='");
+		personCmpItemPerm.append(hrOrgUnit).append("'");//可使用
+		if(isDisatribute){
+			personCmpItemPerm.append(" and FState=100 ");
+		}
+		return personCmpItemPerm.toString();
+	}
+	
+	
+	
+	/**
+	 * 判断提报方案是否存在 未提交 审批中 未审批 已审批
+	 * @param schemeId
+	 * @return
+	 */
+	public static boolean checkSubmitSchemeIsUsingBill(	Context ctx,String schemeId){
+		boolean flag = false ;
+		if (StringUtils.isEmpty(schemeId)) {
+			return flag ;
+		}
+		String sql  = "Select top 1 fid  from T_HR_SBatchSubmitShemeBill where fbillstate in (0,1,2)  and FSubmitSchemeID = ? " ;
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql, new Object[]{schemeId});
+			if (rs.size()>0) {
+				flag =  true;
+			}
+		} catch (BOSException e) {
+			logger.error(e);
+		}
+		return flag ;
+	}
+	
+	/**
+	 * 判断提报方案是否存在 未提交 审批中 未审批 已审批
+	 * @param schemeId
+	 * @return
+	 */
+	public static boolean checkSubmitBillEntryIsExists(	Context ctx,String  billEntryTableName ,String billId){
+		boolean flag = false ;
+		if (StringUtils.isEmpty(billId)) {
+			return flag ;
+		}
+		String sql  = "Select top 1 fid  from "+billEntryTableName+" where fbillId = ? " ;
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql, new Object[]{billId});
+			if (rs.size()>0) {
+				flag =  true;
+			}
+		} catch (BOSException e) {
+			logger.error(e);
+		}
+		return flag ;
+	}
+	
+	/**
+	 * 判断提报方案是否存在  审批中 未审批
+	 * @param schemeId
+	 * @return
+	 */
+	public static boolean checkSubmitSchemeIsUsedBill(Context ctx,String schemeId){
+		boolean flag = false ;
+		if (StringUtils.isEmpty(schemeId)) {
+			return flag ;
+		}
+		String sql  = "Select top 1 fid  from T_HR_SBatchSubmitShemeBill where fbillstate in (1,2)  and FSubmitSchemeID = ? " ;
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql, new Object[]{schemeId});
+			if (rs.size()>0) {
+				flag =  true;
+			}
+		} catch (BOSException e) {
+			logger.error(e);
+		}
+		return flag ;
+	}
+	
+	
+	/**
+	 * 判断提报方案是否存在 未提交 审批中 未审批
+	 * @param schemeId
+	 * @return
+	 */
+	@SuppressWarnings("rawtypes")
+	public static Map checkSubmitSchemesIsUsingBill(Context ctx,List<String> list){
+		Map<String ,Boolean > map = new HashMap<String ,Boolean>();
+		String sql  = "Select distinct FSubmitSchemeID from T_HR_SBatchSubmitShemeBill where fbillstate in (0,1,2) "
+				+ " and FSubmitSchemeID in( "+CmpStrUtil.convertListToString(list)+") " ;
+		Set<String> snSet = new HashSet<String>();
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {
+				String submitSchemeID = rs.getString("FSubmitSchemeID");
+				snSet.add(submitSchemeID);
+			}
+			for( String submitSchemeID: list){
+				map.put(submitSchemeID, snSet.contains(submitSchemeID));
+			}
+		} catch (Exception e) {
+			logger.error(e);
+		}
+		return map ;
+	}
+	
+	
+	/**
+	 * 
+	 * 根据方案id 获取方案提报单分录的提报项目列
+	 * @param schemeId
+	 * @return
+	 * @throws BOSException 
+	 * 
+	 */
+	
+	@SuppressWarnings("rawtypes")
+	public static Map<String,List> assembleSubmitSchemeColModel(Context ctx,String schemeId, Integer dataSource) throws BOSException{
+		Map<String,List> map = new HashMap<String,List>();
+		List<String> colNames = new ArrayList<String>();
+		List<Map<String, Object>> colModel = new ArrayList<Map<String, Object>>();
+		if (StringUtils.isEmpty(schemeId)) {
+			return map ;
+		}
+		
+		String language = ctx.getLocale().getLanguage();
+		
+		String  sql = "Select e.FSubmitTarget, e.FIsEnableSubmitElement,e.FEFFECTDATEDISPLAY , m.fieldSn,m.fdataType,m.fname_"+ language +" MNAME,t.FIsRequired ,m.FDataDot,m.FDataLength, "
+				+ " M.FDATETYPE,M.FFILTERFIELD,B.FENTITYNAME,B.FNAME_"+ language +" BNAME,B.FUSEUIPK, B.FMAINTAINUIPK  "
+				+ " from  T_HR_SCalSubmitScheme e "
+				+ " inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid "
+				+ " inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID "
+				+ " left join  T_BS_SHRBasicItem b on m.FFilterField = b.fid "
+				+ " where e.fid = '"+schemeId+"' order by  FSortSn";
+//		String  sql = "Select m.FNumber,e.FSubmitTarget,e.FIsEnableSubmitElement,e.FEFFECTDATEDISPLAY , m.fieldSn,m.fdataType,m.fname_"+ language +" MNAME,t.FIsRequired ,m.FDataDot,m.FDataLength, "
+//				+ " M.FDATETYPE,M.FFILTERFIELD,B.FNAME_"+ language +" BNAME, B.FUipk FMAINTAINUIPK,b.FISBASIC  "
+//				+ " from  T_HR_SCalSubmitScheme e "
+//				+ " inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid "
+//				+ " inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID "
+//				+ " left join  T_HR_SCalSchemeItemForF7 b on m.FFilterField = b.fid "
+////				+ " where e.fid = '"+schemeId+"' and m.FNumber != 'AwardName' and t.FIsShow = 1 order by  FSortSn";
+//				+ " where e.fid = '"+schemeId+"'  order by  t.FSortSn asc ";
+		try {
+			String  submitTarget = "" ,dataType = ""; //提报对象 01 person  02 org
+			int dateType = 0;// 日期类型
+			int effectDateDisplay = 0;
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			boolean  f7Flag = true,isEnableSubmitElement = false;
+			while (rs.next()) {
+				//=====组装提报对象
+			    submitTarget = rs.getString("FSubmitTarget");
+			    effectDateDisplay = rs.getInt("FEFFECTDATEDISPLAY");
+			    isEnableSubmitElement = rs.getBoolean("FIsEnableSubmitElement");
+			    dataType = rs.getString("fdataType");// 0 数值 1 字符串
+				//提报对象列
+				if (f7Flag) {
+					f7Flag = false;
+					Map<String, Object> gridMainKeyIdMap = new HashMap<String, Object>();
+					Map<String, Object> adminOrgUnitGridMainKeyIdMap = new HashMap<String, Object>();
+					Map<String, Object> positionGridMainKeyIdMap = new HashMap<String, Object>();
+					Map<String, Object> cmpEmpORGridMainKeyIdMap = new HashMap<String, Object>();
+					Map<String, Object> gridIdMap = new HashMap<String, Object>();
+					// 组装ID前端基础属性
+					assembleColModelId(gridIdMap);
+					colNames.add("id");
+					colModel.add(gridIdMap);
+					//==== 组装F7
+					if ("02".equals(submitTarget)) {
+						assembleColModelF7(gridMainKeyIdMap, "orgUnit", "提报组织", true);
+						gridMainKeyIdMap.put(ColModelAttributeConstants.editoptions, assembleColModelF7("提报组织", "com.kingdee.eas.basedata.org.app.AdminOrgUnit.F7", true));
+						gridMainKeyIdMap.put(ColModelAttributeConstants.sortable, true);
+						colNames.add("提报组织");  //colNames.add("提报组织");
+						colModel.add(gridMainKeyIdMap);
+					}else{
+						Map<String, Object> gridPersonNumberMap = new HashMap<String, Object>();
+						gridPersonNumberMap.put(ColModelAttributeConstants.name, "number");
+						gridPersonNumberMap.put(ColModelAttributeConstants.label, "员工编码");
+						gridPersonNumberMap.put(ColModelAttributeConstants.frozen, false);
+						gridPersonNumberMap.put(ColModelAttributeConstants.width, 90);
+						gridPersonNumberMap.put(ColModelAttributeConstants.align, "left");
+						gridPersonNumberMap.put(ColModelAttributeConstants.key, true);
+						gridPersonNumberMap.put(ColModelAttributeConstants.hidden, false);
+						gridPersonNumberMap.put(ColModelAttributeConstants.editable, false);				
+						gridPersonNumberMap.put(ColModelAttributeConstants.sorttype, "string");
+						gridPersonNumberMap.put(ColModelAttributeConstants.classes, "disabled");
+						gridPersonNumberMap.put(ColModelAttributeConstants.edittype, "shrtext");
+						gridPersonNumberMap.put(ColModelAttributeConstants.sortable, true);
+						
+						
+						colNames.add("员工编码"); // colNames.add("员工编码");
+						colModel.add(gridPersonNumberMap);
+						
+						String CmpEmpORelF7Uipk = "com.kingdee.shr.compensation.app.integrate.CmpEmpORelation.F7";
+						// 3表示来源为团队提报的
+						if (BatchSubmitSchemeBillDataSource.TEAM_SUBMIT_VALUE == dataSource) {
+							CmpEmpORelF7Uipk = "com.kingdee.shr.compensation.app.integrate.stores.CmpEmpORelation.F7";
+						} 
+						assembleColModelF7(gridMainKeyIdMap, "person", "员工姓名", true);
+						gridMainKeyIdMap.put(ColModelAttributeConstants.editoptions, assembleColModelF7("员工姓名", CmpEmpORelF7Uipk,true));
+						colNames.add("员工姓名"); // colNames.add("员工姓名");
+						colModel.add(gridMainKeyIdMap);
+						
+						//行政组织
+						assembleColModelF7NotEdit(adminOrgUnitGridMainKeyIdMap, "adminOrgUnit", "所属行政组织");
+						adminOrgUnitGridMainKeyIdMap.put(ColModelAttributeConstants.sortable, true);
+
+//						gridMainKeyIdMap.put(ColModelAttributeConstants.editoptions, assembleColModelF7("姓名", "shr.person.HRAndAdminOrg.F7"));
+						colNames.add("所属行政组织");  //colNames.add("所属行政组织");
+						colModel.add(adminOrgUnitGridMainKeyIdMap);
+						
+						//职位
+						assembleColModelF7NotEdit(positionGridMainKeyIdMap, "position", "职位");
+						positionGridMainKeyIdMap.put(ColModelAttributeConstants.sortable, true);
+
+						colNames.add("职位");  //colNames.add("职位");
+						colModel.add(positionGridMainKeyIdMap);
+						
+						//发薪任职id
+						assembleColModelF7Hidden(cmpEmpORGridMainKeyIdMap, "cmpEmpORelation", "发薪任职");
+						colNames.add("发薪任职"); // colNames.add("发薪任职");
+						colModel.add(cmpEmpORGridMainKeyIdMap);
+						
+						
+						//=====虚拟id 用于编辑保存
+						Map<String, Object> gridPersonIdMap = new HashMap<String, Object>();
+						gridPersonIdMap.put(ColModelAttributeConstants.name, "tempId");
+						gridPersonIdMap.put(ColModelAttributeConstants.label, "员工或者组织临时id");
+						gridPersonIdMap.put(ColModelAttributeConstants.frozen, false);
+						gridPersonIdMap.put(ColModelAttributeConstants.width, 90);
+						gridPersonIdMap.put(ColModelAttributeConstants.align, "left");
+						gridPersonIdMap.put(ColModelAttributeConstants.key, true);
+						gridPersonIdMap.put(ColModelAttributeConstants.hidden, true);
+						gridPersonIdMap.put(ColModelAttributeConstants.editable, false);				
+						gridPersonIdMap.put(ColModelAttributeConstants.sorttype, "string");
+						gridPersonIdMap.put(ColModelAttributeConstants.classes, "disabled");
+						gridPersonIdMap.put(ColModelAttributeConstants.edittype, "shrtext");
+						colNames.add("tempId");
+						colModel.add(gridPersonIdMap);
+					}
+					// 申报要素,如果提报方案上选了启用申报要素,则申报要素必填
+					if(isEnableSubmitElement){
+						Map<String, Object> gridSubmitElementMap = new HashMap<String, Object>();
+						assembleColModelF7(gridSubmitElementMap, "submitElement", "申报要素", true);
+						gridSubmitElementMap.put(ColModelAttributeConstants.editoptions, assembleColModelF7("申报要素", "com.kingdee.shr.compensation.app.integrate.SubmitElement.SubmitBillEntry.F7",true));
+						colNames.add("申报要素"); // colNames.add("申报要素");
+						colModel.add(gridSubmitElementMap);
+					}
+					
+					
+					// 币别
+					Map<String, Object> gridCurrencyMap = new HashMap<String, Object>();
+					assembleColModelF7(gridCurrencyMap, "currency", "币别", true);
+					gridCurrencyMap.put(ColModelAttributeConstants.editoptions, assembleColModelF7("币别", "com.kingdee.eas.basedata.assistant.app.Currency.CMP.F7",true));
+					colNames.add("币别");   // colNames.add("币别");
+					colModel.add(gridCurrencyMap);
+					
+					//日期控件
+					//8.6sp1日期控件
+					Map<String, Object> gridPersonNumberMap = new HashMap<String, Object>();
+					gridPersonNumberMap.put(ColModelAttributeConstants.name, "effectDay");
+					gridPersonNumberMap.put(ColModelAttributeConstants.label, "发生日期");
+					gridPersonNumberMap.put(ColModelAttributeConstants.frozen, false);
+					gridPersonNumberMap.put(ColModelAttributeConstants.width, 100);
+					gridPersonNumberMap.put(ColModelAttributeConstants.align, "left");
+					gridPersonNumberMap.put(ColModelAttributeConstants.key, true);
+					gridPersonNumberMap.put(ColModelAttributeConstants.hidden, false);
+					gridPersonNumberMap.put(ColModelAttributeConstants.editable, true);				
+					gridPersonNumberMap.put(ColModelAttributeConstants.sorttype, "date");
+					gridPersonNumberMap.put(ColModelAttributeConstants.sortable, false);
+//					gridPersonNumberMap.put(ColModelAttributeConstants.formatter, "datepicker");    8.5sp1
+//					gridPersonNumberMap.put(ColModelAttributeConstants.edittype, "shrdatepicker");
+					gridPersonNumberMap.put(ColModelAttributeConstants.formatter, "shrDateTimePicker");
+					gridPersonNumberMap.put(ColModelAttributeConstants.edittype, "shrDateTimePicker");
+					gridPersonNumberMap.put(ColModelAttributeConstants.classes, "required");
+					
+					StringBuffer datapickerjsonBuffer = new StringBuffer();
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"datepickerjson\":");
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"id\":\"dp_autoSize\",");
+					datapickerjsonBuffer.append("\"name\":\"dp_autoSize\",");
+					datapickerjsonBuffer.append("\"minuteStep\":\"\",");
+					datapickerjsonBuffer.append("\"showTimeZoneForCtrl\":false,");
+					datapickerjsonBuffer.append("\"isAutoTimeZoneTrans\":false,");
+					datapickerjsonBuffer.append("\"isShowUTC\":false,");
+					datapickerjsonBuffer.append("\"isReadonlyUTC\":true,");
+					datapickerjsonBuffer.append("\"isRemoveSeconds\":true,");
+					
+					if(DateTypeEnum.YYYYMM_VALUE == effectDateDisplay){
+						datapickerjsonBuffer.append("\"isRemoveDay\":true,");
+					}else if(DateTypeEnum.YYYYMMDD_VALUE == effectDateDisplay){
+						datapickerjsonBuffer.append("\"isRemoveDay\":false,");
+					}else{
+						datapickerjsonBuffer.append("\"isRemoveDay\":true,");
+					}
+					
+					datapickerjsonBuffer.append("\"ctrlType\":\"Date\"");
+					datapickerjsonBuffer.append("},");
+					datapickerjsonBuffer.append("\"validateJson\":");
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"errMsg\":\"\",");
+					datapickerjsonBuffer.append("\"rules\":\"required:true\",");
+					datapickerjsonBuffer.append("\"validatetrigger\":\"focus keyup datachange\"");
+					datapickerjsonBuffer.append("}");
+					datapickerjsonBuffer.append("}");
+					gridPersonNumberMap.put(ColModelAttributeConstants.editoptions, JSONObject.parseObject(datapickerjsonBuffer.toString()));
+					colNames.add("发生日期");  // colNames.add("发生日期");
+					colModel.add(gridPersonNumberMap);
+				}
+				
+				//=====组装提报项目
+			    dataType = rs.getString("fdataType");// 0 数值 1 字符串2日期类型3F7过滤
+			    int isRequired = rs.getInt("FIsRequired"); // 1 必填
+			    int fDataDot = rs.getInt("FDataDot"); // 1 精度
+			    int fDataLength = rs.getInt("FDataLength"); // 1 字符长度
+			    if ("0".equals(dataType)) {
+			    	// 0 数值
+			    	Map<String, Object> schemeMap = new HashMap<String, Object>();
+			    	schemeMap.put(ColModelAttributeConstants.name, "S"+rs.getString("fieldSn"));
+					schemeMap.put(ColModelAttributeConstants.label, rs.getString("MNAME"));
+					schemeMap.put(ColModelAttributeConstants.frozen, false);
+					schemeMap.put(ColModelAttributeConstants.width, 90);
+					schemeMap.put(ColModelAttributeConstants.align, "left");
+					schemeMap.put(ColModelAttributeConstants.key, false);
+					schemeMap.put(ColModelAttributeConstants.editable, true);				
+					schemeMap.put(ColModelAttributeConstants.sorttype, "bigdecimal");
+//					schemeMap.put(ColModelAttributeConstants.sortable, true);
+					//先不排序
+					schemeMap.put(ColModelAttributeConstants.sortable, false);
+					schemeMap.put(ColModelAttributeConstants.formatter, "numberfield");
+					schemeMap.put(ColModelAttributeConstants.edittype, "numberfield");
+					JSONObject editoptions = JSONObject.parseObject("{ \"inputJson\": { \"id\": \"txt_money\", \"name\": \"money\", \"<formatTy></formatTy>pe\": \"number\" }}");
+					
+					//添加必填校验
+					if(isRequired == 1) {
+						schemeMap.put(ColModelAttributeConstants.classes, "required");
+						editoptions.put("validateJson", JSONObject.parseObject("{ \"errMsg\": \"\", \"rules\": \"required:true\", \"validatetrigger\": \"focus keyup datachange\" }"));
+					}
+					
+					//添加精度
+					JSONObject inputJson = editoptions.getJSONObject("inputJson");
+					inputJson.put("decimalPrecision", fDataDot);
+					//添加长度
+					inputJson.put("maxlength", fDataLength);
+					
+					
+					schemeMap.put(ColModelAttributeConstants.editoptions,editoptions);
+					colModel.add(schemeMap);
+					colNames.add(rs.getString("MNAME"));
+				}else if(CalSubmitItemDataType.STRING_VALUE.equals(dataType)) {
+					
+					Map<String, Object> schemeMap = new HashMap<String, Object>();
+					schemeMap.put(ColModelAttributeConstants.name, "S"+rs.getString("fieldSn"));
+					schemeMap.put(ColModelAttributeConstants.label, rs.getString("MNAME"));
+					schemeMap.put(ColModelAttributeConstants.frozen, false);
+					schemeMap.put(ColModelAttributeConstants.width, 90);
+					schemeMap.put(ColModelAttributeConstants.align, "left");
+					schemeMap.put(ColModelAttributeConstants.key, false);
+					schemeMap.put(ColModelAttributeConstants.editable, true);				
+					schemeMap.put(ColModelAttributeConstants.sorttype, "string");
+//					schemeMap.put(ColModelAttributeConstants.sortable, true);
+					schemeMap.put(ColModelAttributeConstants.sortable, false);
+					JSONObject editoptions = JSONObject.parseObject("{ \"inputJson\": {  } }");
+					if(isRequired == 1) {
+						schemeMap.put(ColModelAttributeConstants.classes, "required");
+						editoptions.put("validateJson", JSONObject.parseObject("{ \"errMsg\": \"\", \"rules\": \"required:true\", \"validatetrigger\": \"focus keyup datachange\" }"));
+					}else{
+						editoptions.put("validateJson", JSONObject.parseObject("{ \"errMsg\": \"\", \"rules\": \"required:false\", \"validatetrigger\": \"focus keyup datachange\" }"));
+					}
+					
+					
+					//添加精度
+					JSONObject inputJson = editoptions.getJSONObject("inputJson");
+					inputJson.put("decimalPrecision", fDataDot);
+					//添加长度
+					inputJson.put("maxlength", fDataLength);
+					schemeMap.put(ColModelAttributeConstants.editoptions, editoptions);
+					schemeMap.put(ColModelAttributeConstants.edittype, "shrtext");				
+					colModel.add(schemeMap);
+					colNames.add(rs.getString("MNAME"));
+				}else if(CalSubmitItemDataType.DATE_VALUE.equals(dataType)){//日期类型
+					dateType = rs.getInt("FDATETYPE");
+					
+					Map<String, Object> schemeMap = new HashMap<String, Object>();
+					schemeMap.put(ColModelAttributeConstants.name, "S"+rs.getString("fieldSn"));
+					schemeMap.put(ColModelAttributeConstants.label, rs.getString("MNAME"));
+					schemeMap.put(ColModelAttributeConstants.frozen, false);
+					schemeMap.put(ColModelAttributeConstants.width, 100);
+					schemeMap.put(ColModelAttributeConstants.align, "left");
+					schemeMap.put(ColModelAttributeConstants.key, true);
+					schemeMap.put(ColModelAttributeConstants.hidden, false);
+					schemeMap.put(ColModelAttributeConstants.editable, true);				
+					schemeMap.put(ColModelAttributeConstants.sorttype, "date");
+					schemeMap.put(ColModelAttributeConstants.sortable, false);
+//					gridPersonNumberMap.put(ColModelAttributeConstants.formatter, "datepicker");    8.5sp1
+//					gridPersonNumberMap.put(ColModelAttributeConstants.edittype, "shrdatepicker");
+					schemeMap.put(ColModelAttributeConstants.formatter, "shrDateTimePicker");
+					schemeMap.put(ColModelAttributeConstants.edittype, "shrDateTimePicker");
+					if(isRequired == 1) {
+						schemeMap.put(ColModelAttributeConstants.classes, "required");
+					}
+					StringBuffer datapickerjsonBuffer = new StringBuffer();
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"datepickerjson\":");
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"id\":\"dp_autoSize\",");
+					datapickerjsonBuffer.append("\"name\":\"dp_autoSize\",");
+					datapickerjsonBuffer.append("\"minuteStep\":\"\",");
+					datapickerjsonBuffer.append("\"showTimeZoneForCtrl\":false,");
+					datapickerjsonBuffer.append("\"isAutoTimeZoneTrans\":false,");
+					datapickerjsonBuffer.append("\"isShowUTC\":false,");
+					datapickerjsonBuffer.append("\"isReadonlyUTC\":true,");
+					datapickerjsonBuffer.append("\"isRemoveSeconds\":true,");
+					if(DateTypeEnum.YYYYMM_VALUE == dateType){
+						datapickerjsonBuffer.append("\"isRemoveDay\":true,");
+					}else if(DateTypeEnum.YYYYMMDD_VALUE == dateType){
+						datapickerjsonBuffer.append("\"isRemoveDay\":false,");
+					}else{
+						datapickerjsonBuffer.append("\"isRemoveDay\":false,");
+					}
+					datapickerjsonBuffer.append("\"ctrlType\":\"Date\"");
+					datapickerjsonBuffer.append("},");
+					datapickerjsonBuffer.append("\"validateJson\":");
+					datapickerjsonBuffer.append("{");
+					datapickerjsonBuffer.append("\"errMsg\":\"\",");
+					if(isRequired == 1){
+						datapickerjsonBuffer.append("\"rules\":\"required:true\",");
+					}else{
+						datapickerjsonBuffer.append("\"rules\":\"required:false\",");
+					}
+					datapickerjsonBuffer.append("\"validatetrigger\":\"focus keyup datachange\"");
+					datapickerjsonBuffer.append("}");
+					datapickerjsonBuffer.append("}");
+					schemeMap.put(ColModelAttributeConstants.editoptions, JSONObject.parseObject(datapickerjsonBuffer.toString()));
+					colNames.add(rs.getString("MNAME"));
+					colModel.add(schemeMap);
+				}else if(CalSubmitItemDataType.F7_VALUE.equals(dataType)){
+					
+					Map<String, Object> schemeMap = new HashMap<String, Object>();
+					assembleColModelF7(schemeMap, "S"+rs.getString("fieldSn"), rs.getString("MNAME"), isRequired == 1);
+					Map<String, Object> editoptions = assembleColModelF7(rs.getString("BNAME"), rs.getString("FMAINTAINUIPK"), isRequired == 1,"");
+//					Map<String, Object> f7Json = (Map<String, Object>) editoptions.get("f7Json");   //F7的过滤使用可维护,由于可使用查询可能会很慢,如果需要调整为可使用,则调整uipk获取可使用的即可,并且调整displayFormat和submitFormat
+//					f7Json.put("displayFormat", "{BaseInfo.name}");
+//					f7Json.put("submitFormat", "{BaseInfo.id}");
+					schemeMap.put(ColModelAttributeConstants.editoptions, editoptions);
+					colNames.add(rs.getString("MNAME"));
+					colModel.add(schemeMap);
+				}
+			}
+			
+			// 描述
+			Map<String, Object> gridDescriptionMap = new HashMap<String, Object>();
+			gridDescriptionMap.put(ColModelAttributeConstants.name, "description");
+			gridDescriptionMap.put(ColModelAttributeConstants.label, "备注");
+			gridDescriptionMap.put(ColModelAttributeConstants.frozen, false);
+			gridDescriptionMap.put(ColModelAttributeConstants.width, 90);
+			gridDescriptionMap.put(ColModelAttributeConstants.align, "left");
+			gridDescriptionMap.put(ColModelAttributeConstants.key, false);
+			gridDescriptionMap.put(ColModelAttributeConstants.editable, true);				
+			gridDescriptionMap.put(ColModelAttributeConstants.sortable, false);
+			gridDescriptionMap.put(ColModelAttributeConstants.formatter, "shrMultiLangBox");
+			gridDescriptionMap.put(ColModelAttributeConstants.edittype, "shrMultiLangBox");
+			JSONObject editoptions = JSONObject.parseObject("{ \"inputJson\": {  } }");
+			
+			//添加精度
+			JSONObject inputJson = editoptions.getJSONObject("inputJson");
+			//添加长度
+			inputJson.put("maxlength", 255);
+			gridDescriptionMap.put(ColModelAttributeConstants.editoptions, editoptions);
+			colNames.add("备注"); // colNames.add("备注");
+			colModel.add(gridDescriptionMap);
+
+			
+		} catch (Exception e) {
+			throw new BOSException("获取提报方案的提报项目列出错!"); // "获取提报方案的提报项目列出错!"
+		}
+		map.put("colNames", colNames);
+		map.put("colModel", colModel);
+		return map ;
+	}
+	
+	
+	/**
+     *  组装ID前端基础属性
+     * @param gridIdMap
+     * @param name
+     * @param label
+     * @return
+     * @throws BOSException
+     */
+	public static Map<String, Object>  assembleColModelId(Map<String, Object> gridIdMap){
+    	gridIdMap.put(ColModelAttributeConstants.name, "id");
+		gridIdMap.put(ColModelAttributeConstants.label, "id");
+		gridIdMap.put(ColModelAttributeConstants.frozen, false);
+		gridIdMap.put(ColModelAttributeConstants.width, 90);
+		gridIdMap.put(ColModelAttributeConstants.align, "left");
+		gridIdMap.put(ColModelAttributeConstants.key, true);
+		gridIdMap.put(ColModelAttributeConstants.hidden, true);
+		gridIdMap.put(ColModelAttributeConstants.editable, false);				
+		gridIdMap.put(ColModelAttributeConstants.sorttype, "");
+		gridIdMap.put(ColModelAttributeConstants.sortable, false);
+		gridIdMap.put(ColModelAttributeConstants.classes, "disabled");
+	   return gridIdMap;
+	}
+	
+	
+   /**
+    * 组装F7前端editoptions属性
+    * @param name
+    * @param uipk
+    * @param isRequired
+    * @return
+    */
+	public static Map<String, Object>  assembleColModelF7(String name , String uipk, boolean isRequired){
+	
+			//=====组装F7
+	        Map<String, Object> resultMap = new HashMap<String, Object>();
+	        Map<String, Object> f7JsonMap = new HashMap<String, Object>();
+	        Map<String, Object> validateJsonMap = new HashMap<String, Object>();
+	        // ======subWidgetOptions属性
+			Map<String, Object> uipkMap = new HashMap<String, Object>();
+			uipkMap.put(ColModelAttributeConstants.title, name);
+			uipkMap.put(ColModelAttributeConstants.uipk, uipk);
+			uipkMap.put(ColModelAttributeConstants.query, "");
+			uipkMap.put(ColModelAttributeConstants.filter, "");
+			uipkMap.put(ColModelAttributeConstants.multiselect, false);
+			uipkMap.put(ColModelAttributeConstants.isTree, false);
+			uipkMap.put(ColModelAttributeConstants.treeUrl, "");				
+			uipkMap.put(ColModelAttributeConstants.isContainLowerOrg, false);
+			uipkMap.put(ColModelAttributeConstants.isAdminOrg, false);
+//			uipkMap.put(ColModelAttributeConstants.isEnableExpFilter, true); 
+			
+			f7JsonMap.put("subWidgetOptions", uipkMap);
+			// =====其他属性
+			f7JsonMap.put(ColModelAttributeConstants.subWidgetName, "shrPromptGrid");
+			f7JsonMap.put(ColModelAttributeConstants.searchFields, "");
+			f7JsonMap.put(ColModelAttributeConstants.isHROrg, false);
+			f7JsonMap.put(ColModelAttributeConstants.isAdminOrg, false);
+			f7JsonMap.put(ColModelAttributeConstants.searchLikePattern,  "any");
+			resultMap.put("f7Json", f7JsonMap);
+			//======validateJsonMap 
+			validateJsonMap.put(ColModelAttributeConstants.errMsg, "");
+			if(isRequired){
+				validateJsonMap.put(ColModelAttributeConstants.rules, "required:true");
+			}
+			validateJsonMap.put(ColModelAttributeConstants.validatetrigger, "focus keyup datachange");
+			resultMap.put("validateJson", validateJsonMap);
+	        return resultMap;
+	}
+	
+	/**
+	    * 组装F7前端editoptions属性
+	    * @param name
+	    * @param uipk
+	    * @param isRequired
+	    * @return
+	    */
+		public static Map<String, Object>  assembleColModelF7(String name , String uipk, boolean isRequired, String filter){
+		
+				//=====组装F7
+		        Map<String, Object> resultMap = new HashMap<String, Object>();
+		        Map<String, Object> f7JsonMap = new HashMap<String, Object>();
+		        Map<String, Object> validateJsonMap = new HashMap<String, Object>();
+		        // ======subWidgetOptions属性
+				Map<String, Object> uipkMap = new HashMap<String, Object>();
+				uipkMap.put(ColModelAttributeConstants.title, name);
+				uipkMap.put(ColModelAttributeConstants.uipk, uipk);
+				uipkMap.put(ColModelAttributeConstants.query, "");
+				uipkMap.put(ColModelAttributeConstants.filter, filter);
+				uipkMap.put(ColModelAttributeConstants.multiselect, false);
+				uipkMap.put(ColModelAttributeConstants.isTree, false);
+				uipkMap.put(ColModelAttributeConstants.treeUrl, "");				
+				uipkMap.put(ColModelAttributeConstants.isContainLowerOrg, false);
+				uipkMap.put(ColModelAttributeConstants.isAdminOrg, false);
+				f7JsonMap.put("subWidgetOptions", uipkMap);
+				// =====其他属性
+				f7JsonMap.put(ColModelAttributeConstants.subWidgetName, "shrPromptGrid");
+				f7JsonMap.put(ColModelAttributeConstants.searchFields, "");
+				f7JsonMap.put(ColModelAttributeConstants.isHROrg, false);
+				f7JsonMap.put(ColModelAttributeConstants.isAdminOrg, false);
+				f7JsonMap.put(ColModelAttributeConstants.searchLikePattern,  "any");
+				resultMap.put("f7Json", f7JsonMap);
+				//======validateJsonMap 
+				validateJsonMap.put(ColModelAttributeConstants.errMsg, "");
+				if(isRequired){
+					validateJsonMap.put(ColModelAttributeConstants.rules, "required:true");
+				}
+				validateJsonMap.put(ColModelAttributeConstants.validatetrigger, "focus keyup datachange");
+				resultMap.put("validateJson", validateJsonMap);
+		        return resultMap;
+		}
+	
+    /**
+     *  组装F7前端基础属性
+     * @param gridMainKeyIdMap
+     * @param name
+     * @param label
+     * @return
+     * @throws BOSException
+     */
+	public static Map<String, Object>  assembleColModelF7(Map<String, Object> gridMainKeyIdMap,String name ,String label, boolean isRequired){
+    	gridMainKeyIdMap.put(ColModelAttributeConstants.name, name);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.label, label);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.frozen, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.width, 120);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.align, "left");
+		gridMainKeyIdMap.put(ColModelAttributeConstants.key, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.edittype, "promptBox");
+		gridMainKeyIdMap.put(ColModelAttributeConstants.editable, true);				
+		gridMainKeyIdMap.put(ColModelAttributeConstants.sorttype, "objectvalue");
+//		gridMainKeyIdMap.put(ColModelAttributeConstants.sortable, true);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.sortable, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.formatter, "promptBox");
+		
+		if(isRequired){
+			gridMainKeyIdMap.put(ColModelAttributeConstants.classes, "required");
+		}
+	   return gridMainKeyIdMap;
+	}
+	
+	/**
+	 *  组装F7前端基础属性不可编辑
+	 * @param gridMainKeyIdMap
+	 * @param name
+	 * @param label
+	 * @return
+	 * @throws BOSException
+	 */
+	public static Map<String, Object>  assembleColModelF7NotEdit(Map<String, Object> gridMainKeyIdMap,String name ,String label){
+		gridMainKeyIdMap.put(ColModelAttributeConstants.name, name);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.label, label);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.frozen, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.width, 120);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.align, "left");
+		gridMainKeyIdMap.put(ColModelAttributeConstants.key, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.edittype, "promptBox");
+		gridMainKeyIdMap.put(ColModelAttributeConstants.editable, false);				
+		gridMainKeyIdMap.put(ColModelAttributeConstants.sorttype, "objectvalue");
+//		gridMainKeyIdMap.put(ColModelAttributeConstants.sortable, true);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.sortable, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.formatter, "promptBox");
+		gridMainKeyIdMap.put(ColModelAttributeConstants.classes, "disabled");
+		return gridMainKeyIdMap;
+	}
+	
+	/**
+	 *  组装F7前端基础属性隐藏
+	 * @param gridMainKeyIdMap
+	 * @param name
+	 * @param label
+	 * @return
+	 * @throws BOSException
+	 */
+	public static Map<String, Object>  assembleColModelF7Hidden(Map<String, Object> gridMainKeyIdMap,String name ,String label){
+		gridMainKeyIdMap.put(ColModelAttributeConstants.name, name);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.label, label);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.frozen, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.width, 120);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.hidden, true);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.align, "left");
+		gridMainKeyIdMap.put(ColModelAttributeConstants.key, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.edittype, "promptBox");
+		gridMainKeyIdMap.put(ColModelAttributeConstants.editable, false);				
+		gridMainKeyIdMap.put(ColModelAttributeConstants.sorttype, "objectvalue");
+//		gridMainKeyIdMap.put(ColModelAttributeConstants.sortable, true);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.sortable, false);
+		gridMainKeyIdMap.put(ColModelAttributeConstants.formatter, "promptBox");
+		gridMainKeyIdMap.put(ColModelAttributeConstants.classes, "disabled");
+		return gridMainKeyIdMap;
+	}
+	
+	
+	   public static Map<String, Object> getBillColumnListAndQuerySql(Context ctx, String submitSchemeId, String billID)
+			/*      */     throws BOSException
+			/*      */   {
+			/*  727 */     Map map = new HashMap();
+			/*  728 */     List colNames = new ArrayList();
+			/*  729 */     Map columnMap = new HashMap();
+			/*  730 */     if (StringUtils.isEmpty(submitSchemeId)) {
+			/*  731 */       return map;
+			/*      */     }
+			/*      */ 
+			/*  734 */     String language = ctx.getLocale().getLanguage();
+			/*      */ 
+			/*  736 */     String sql = new StringBuilder().append("Select e.FSubmitTarget,e.FIsEnableSubmitElement , m.fieldSn,m.FDataDot,m.fdataType,m.fname_").append(language).append(" ,n.FBillEntryTableName from  T_HR_SCalSubmitScheme e ").append(" inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid ").append(" inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID ").append(" inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid  ").append(" where e.fid = '").append(submitSchemeId).append("'  order by FSortSn ").toString();
+			/*      */ 
+			/*  742 */     StringBuilder sd = new StringBuilder(" select t.fid id ,  t.FEffectDate effectDay , t.FCmpEmpORelationID cmpEmpORelation,");
+			/*  743 */     colNames.add("id");
+			/*  744 */     colNames.add("effectDay");
+			/*      */     try {
+			/*  746 */       String submitTarget = ""; String fBillEntryTableName = "";
+			/*  747 */       IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			/*  748 */       boolean f7Flag = true; boolean personFlag = true; boolean isEnableSubmitElement = false;
+			/*  749 */       while (rs.next())
+			/*      */       {
+			/*  751 */         submitTarget = rs.getString("FSubmitTarget");
+			/*  752 */         isEnableSubmitElement = rs.getBoolean("FIsEnableSubmitElement");
+			/*      */ 
+			/*  754 */         if (f7Flag) {
+			/*  755 */           f7Flag = false;
+			/*      */ 
+			/*  757 */           fBillEntryTableName = rs.getString("FBillEntryTableName");
+			/*      */ 
+			/*  759 */           if ("02".equals(submitTarget)) {
+			/*  760 */             personFlag = false;
+			/*  761 */             colNames.add("orgId");
+			/*  762 */             colNames.add("name");
+			/*  763 */             colNames.add("number");
+			/*  764 */             sd.append("n.fid orgId , n.fname_").append(language).append(" name , n.fnumber number ");
+			/*      */           } else {
+			/*  766 */             colNames.add("personId");
+			/*  767 */             colNames.add("name");
+			/*  768 */             colNames.add("number");
+			/*  769 */             colNames.add("admOrgId");
+			/*  770 */             colNames.add("admOrgName");
+			/*      */ 
+			/*  772 */             colNames.add("positionId");
+			/*  773 */             colNames.add("positionName");
+			/*  774 */             colNames.add("cmpEmpORelation");
+			/*      */ 
+			/*  777 */             sd.append(" n.fid personId , n.fname_").append(language).append("  name, n.fnumber number, a.fid admOrgId, a.fname_").append(language).append(" admOrgName, p.fid positionId, p.fname_").append(language).append(" positionName  ");
+			/*      */           }
+			/*      */         }
+			/*  780 */         sd.append(new StringBuilder().append(",S").append(rs.getString("fieldSn")).toString());
+			/*      */ 
+			/*  782 */         colNames.add(new StringBuilder().append("S").append(rs.getString("fieldSn")).toString());
+			/*      */ 
+			/*  785 */         if ("0".equals(rs.getString("fdataType")));
+			/*  786 */         columnMap.put(new StringBuilder().append("S").append(rs.getString("fieldSn")).toString(), Integer.valueOf(rs.getInt("FDataDot")));
+			/*      */       }
+			/*      */ 
+			/*  789 */       colNames.add("description");
+			/*  790 */       if (isEnableSubmitElement) {
+			/*  791 */         colNames.add("submitElement");
+			/*  792 */         sd.append(", t.FSubmitElementID submitElement,subele.Fname_").append(language).append(" submitElementName ");
+			/*      */       }
+			/*  794 */       colNames.add("currency");
+			/*  795 */       sd.append(",c.fid currency,c.fname_").append(language).append(" currencyName,t.fdescription_l1 description_l1,t.fdescription_l2 description_l2,t.fdescription_l3 description_l3");
+			/*      */ 
+			/*  797 */       sd.append(new StringBuilder().append(" from   ").append(fBillEntryTableName).append(" ").toString());
+			/*  798 */       if (personFlag) {
+			/*  799 */         sd.append(" t  inner join t_bd_person n on t.fpersonId = n.fid ");
+			/*  800 */         sd.append(" LEFT join T_ORG_Admin a on t.FAdminOrgUnitID = a.fid ");
+			/*  801 */         sd.append(" LEFT join T_ORG_Position p on t.FPositionID = p.fid ");
+			/*      */       } else {
+			/*  803 */         sd.append(" t on b.fid = t.fbillid  inner join T_ORG_Admin  n on t.FOrgUnitID = n.fid ");
+			/*      */       }
+			/*  805 */       sd.append(" LEFT join T_BD_Currency c on t.fCurrencyID = c.fid ");
+			/*  806 */       if (isEnableSubmitElement) {
+			/*  807 */         sd.append(" LEFT join T_HR_SSubmitElement subele on t.FSubmitElementID = subele.fid ");
+			/*      */       }
+			/*      */ 
+			/*  810 */       sd.append(new StringBuilder().append(" where t.fbillid = '").append(billID).append("'").toString());
+			///*  811 */       sd.append(new StringBuilder().append(" and  b.FSubmitSchemeID = '").append(submitSchemeId).append("' ").toString());
+			/*      */ 
+			/*  813 */       map.put("querySql", sd.toString());
+			/*  814 */       map.put("colNames", colNames);
+			/*  815 */       map.put("columnMap", columnMap);
+			/*      */     }
+			/*      */     catch (Exception e) {
+			/*  818 */       throw new BOSException("获取提报方案的提报项目列出错!");
+			/*      */     }
+			/*  820 */     return map;
+			/*      */   }
+	
+	/**
+	 * 
+	 * 根据方案id 获取方案提报单分录的提报项目列及对应的分录表名
+	 * @param schemeId
+	 * @return List
+	 * @throws BOSException 
+	 */
+	public static Map<String, Object>  getBillColumnListAndBillEntryTableName(Context ctx,String submitSchemeId) throws BOSException{
+		
+		Map<String, Object> map = new HashMap<String, Object>();
+		List<String> colNames = new ArrayList<String>();
+		List<String> colTypes = new ArrayList<String>();
+		if (StringUtils.isEmpty(submitSchemeId)) {
+			return map ;
+		}
+		
+		String language = ctx.getLocale().getLanguage();
+		
+		String  sql = "Select e.FSubmitTarget , m.fieldSn,m.fdataType,m.fname_" + language + " ,n.FBillEntryTableName ,n.FCalShemeTableName ,t.FIsRequired from  T_HR_SCalSubmitScheme e "
+				+ " inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid "
+				+ " inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID "
+				+ " inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid  "
+				+ " where e.fid = '"+submitSchemeId+"'  order by FSortSn ";
+		try {
+			String fBillEntryTableName = ""; //提报对象 01 person  02 org
+			logger.error("CmpIntegrateUtilsNew.getBillColumnListAndBillEntryTableName.sql:"+sql);
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {			
+				//=====组装提报项目
+				if (StringUtils.isEmpty(fBillEntryTableName)) {
+					fBillEntryTableName = rs.getString("FBillEntryTableName");
+//					fCalShemeTableName = rs.getString("FCalShemeTableName");
+				}
+				colNames.add("S"+rs.getString("fieldSn"));
+				colTypes.add(rs.getString("fdataType"));
+			}	
+			map.put("fBillEntryTableName", fBillEntryTableName);
+//			map.put("fCalShemeTableName", fCalShemeTableName);
+			map.put("colNames", colNames);
+			map.put("colTypes", colTypes);
+			
+		} catch (Exception e) {
+			throw new BOSException("获取提报方案的提报项目列出错!"); //"获取提报方案的提报项目列出错!"
+		}
+		return map ;
+	}
+	
+	/**
+	 * 获取插入的列1
+	 * @param ctx
+	 * @param billEntryTable
+	 * @param colNames
+	 * @param billId
+	 * @return
+	 */
+	public static String getAssembleField1Sql(Context ctx, String billEntryTable,
+			List<String> colNames, String billId) {
+		StringBuilder insertCol = new StringBuilder(" insert into ");
+		String userId = HRFilterUtils.getCurrentUserId(ctx);
+		Date date = new Date();
+		insertCol.append(billEntryTable);
+		insertCol.append(" (FID ,fparentid ");
+		
+
+		/*StringBuilder insertval = new StringBuilder(new StringBuilder().append(
+				" values ( ?,'").append(billId).append("', '").append(userId)
+				.append("', ").append(CmpDateUtil.toKSqlDate(date)).toString());
+		insertval.append(", ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ");*/
+		for (String schemeItem : colNames) {
+			insertCol.append(new StringBuilder().append(",").append(schemeItem)
+					.toString());
+			//insertval.append(", ? ");
+		}
+		insertCol.append(" )");
+		//insertval.append(" ,?,?,?,?)");
+		//insertCol.append(insertval);
+
+		return insertCol.toString();
+	}
+	
+	
+	/**
+	 * 获取插入的列1
+	 * @param ctx
+	 * @param billEntryTable
+	 * @param colNames
+	 * @param billId
+	 * @return
+	 */
+	public static String getAssembleField2Sql(Context ctx, String billEntryTable,
+			List<String> colNames, String billId) {
+		StringBuilder insertCol = new StringBuilder(" insert into ");
+		String userId = HRFilterUtils.getCurrentUserId(ctx);
+		Date date = new Date();
+		insertCol.append(billEntryTable);
+		insertCol.append(" (FID ,fbillid ");
+		
+
+		/*StringBuilder insertval = new StringBuilder(new StringBuilder().append(
+				" values ( ?,'").append(billId).append("', '").append(userId)
+				.append("', ").append(CmpDateUtil.toKSqlDate(date)).toString());
+		insertval.append(", ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ");*/
+		for (String schemeItem : colNames) {
+			insertCol.append(new StringBuilder().append(",").append(schemeItem)
+					.toString());
+			//insertval.append(", ? ");
+		}
+		insertCol.append(" )");
+		//insertval.append(" ,?,?,?,?)");
+		//insertCol.append(insertval);
+
+		return insertCol.toString();
+	}
+	
+	
+
+	/**
+	 * 获取临时表的fid,billId所有动态字段
+	 * @param ctx
+	 * @param billEntryTable
+	 * @param colNames
+	 * @param billId
+	 * @return
+	 * @throws BOSException 
+	 */
+	public static List<Map<String,Object>> getAssembleListByCmp(Context ctx, String billEntryTable,
+			List<String> colNames, String billId) throws BOSException {
+		List<Map<String,Object>> sValuelist= new ArrayList<Map<String,Object>>();
+		StringBuilder sql = new StringBuilder(" SELECT ");
+		String userId = HRFilterUtils.getCurrentUserId(ctx);
+		
+		
+		sql.append(" FID ,fbillid ");
+		
+
+		/*StringBuilder insertval = new StringBuilder(new StringBuilder().append(
+				" values ( ?,'").append(billId).append("', '").append(userId)
+				.append("', ").append(CmpDateUtil.toKSqlDate(date)).toString());
+		insertval.append(", ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ");*/
+		for (String schemeItem : colNames) {
+			sql.append(new StringBuilder().append(",").append(schemeItem)
+					.toString());
+			//insertval.append(", ? ");
+		}
+		sql.append(" from ");
+		sql.append(billEntryTable);
+		sql.append(" where fbillid = '"+billId+"'");
+		logger.error("BatchSubmitSchemeBillControllerBeanExt.getAssembleListByCmp.sql:"+sql.toString());
+		//insertval.append(" ,?,?,?,?)");
+		//insertCol.append(insertval);
+		try{
+			IRowSet rs = DbUtil.executeQuery(ctx, sql.toString()); 
+			String fid = "";
+			String fbillid = "";
+			while (rs.next()) {		
+				Map<String,Object> sValueMap = new HashMap<String,Object>();
+				//=====组装提报项目
+				fid = rs.getString("FID");
+				fbillid = rs.getString("fbillid");
+				sValueMap.put("fid", fid);
+				sValueMap.put("fbillid", fbillid);
+				for (String schemeItem : colNames) {
+					sValueMap.put(""+schemeItem, rs.getObject(""+schemeItem));
+				}
+				sValuelist.add(sValueMap);
+						
+			}	
+			} catch (Exception e) {
+				throw new BOSException("获取提报方案的提报项目列出错!"); //"获取提报方案的提报项目列出错!"
+			}
+		
+		
+		return sValuelist;
+	}
+	
+	
+	/**
+	 * 更新提报分录的s字段
+	 * @param ctx
+	 * @param colNames
+	 * @param sValue
+	 * @throws BOSException 
+	 */
+	public static void updateSchemeBillEntryByCmpS(Context ctx,List<String> colNames,Map<String,Object> sValue) throws BOSException{
+		logger.error("into updateSchemeBillEntryByCmpS method.colNames.size:"+colNames.size());
+		StringBuilder sqlSb = new StringBuilder(" update T_HR_SchemeBillEntry set ");
+		Object cmpObje = null;
+		//是否免税字符串
+		String s81ValueId = "";
+		for (String schemeItem : colNames) {		
+			cmpObje = sValue.get(""+schemeItem);
+			if(cmpObje instanceof String){
+				sqlSb.append(" CF"+schemeItem).append("='").append(cmpObje).append("',");
+				
+				//是否免税特殊处理
+				if("S81".equals(schemeItem)){
+					if(cmpObje!=null){
+						s81ValueId = (String)cmpObje;
+					}
+				}
+				
+				
+			}else{
+				sqlSb.append(" CF"+schemeItem).append("=").append(cmpObje).append(",");
+			}
+		}
+		String sqlSbStr = sqlSb.toString();
+		if(sqlSbStr.endsWith(",")) {
+			sqlSbStr = sqlSbStr.substring(0, sqlSbStr.length() - 1);
+		}
+		Object fidObj = sValue.get("fid");
+		
+		if(fidObj == null){
+			logger.error("BatchSubmitSchemeBillControllerBeanExt.updateSchemeBillEntryByCmpS:fidObj为空");
+			return;
+		}
+		String fid= (String)fidObj;
+		sqlSbStr = sqlSbStr + " where fid = '"+fid+"'";
+		logger.error("BatchSubmitSchemeBillControllerBeanExt.updateSchemeBillEntryByCmpS:sqlSbStr:"+sqlSbStr);
+		DbUtil.execute(ctx,sqlSbStr);
+		
+		//更新分录的是否免税字符串		
+		updateSchemeBillEntryCFTaxExemptionStrByEntryFid(ctx,s81ValueId,fid);
+	}
+	
+	
+	/**
+	 * 更新分录的是否免税字符串
+	 * @param ctx
+	 * @param s81ValueId
+	 * @param fid
+	 * @throws BOSException 
+	 */
+	private static void updateSchemeBillEntryCFTaxExemptionStrByEntryFid(Context ctx,String s81ValueId , String fid) throws BOSException{
+		String sql = "update T_HR_SchemeBillEntry set cftaxexemptionstr = (select fname_l1 from CT_CUS_TaxExemption where fid ='"+s81ValueId+"' ) where fid ='"+fid+"'";
+		logger.error("BatchSubmitSchemeBillControllerBeanExt.updateSchemeBillEntryCFTaxExemptionStrByEntryFid:sql:"+sql);
+		
+		DbUtil.execute(ctx,sql);
+	}
+	
+	
+	
+	/**
+	 * 
+	 * 根据方案id,dataType获取方案提报单分录在提报项目列及对应的分录表名
+	 * @param schemeId
+	 * @return List
+	 * @throws BOSException 
+	 */
+	public static Map<String, Object>  getBillColumnListAndBillEntryTableNameByDataType(Context ctx,String submitSchemeId, String dataType) throws BOSException{
+		
+		Map<String, Object> map = new HashMap<String, Object>();
+		List<String> colNames = new ArrayList<String>();
+		if (StringUtils.isEmpty(submitSchemeId)) {
+			return map ;
+		}
+		
+		String language = ctx.getLocale().getLanguage();
+		
+		String  sql = "Select e.FSubmitTarget , m.fieldSn,m.fdataType,m.fname_"+language+" ,n.FBillEntryTableName ,n.FCalShemeTableName ,t.FIsRequired from  T_HR_SCalSubmitScheme e "
+				+ " inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid "
+				+ " inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID "
+				+ " inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid  "
+				+ " where e.fid = '"+submitSchemeId+"' and m.fdataType = '"+dataType+"'  order by FSortSn ";
+		try {
+			String fBillEntryTableName = "" ,fCalShemeTableName = ""; //提报对象 01 person  02 org
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {			
+				//=====组装提报项目
+				if (StringUtils.isEmpty(fBillEntryTableName)) {
+					fBillEntryTableName = rs.getString("FBillEntryTableName");
+					fCalShemeTableName = rs.getString("FCalShemeTableName");
+				}
+				colNames.add("S"+rs.getString("fieldSn"));
+			}	
+			map.put("fBillEntryTableName", fBillEntryTableName);
+			map.put("fCalShemeTableName", fCalShemeTableName);
+			map.put("colNames", colNames);
+			
+		} catch (Exception e) {
+			throw new BOSException("获取提报方案的提报项目列出错!"); //"获取提报方案的提报项目列出错!"
+		}
+		return map ;
+	}
+	
+	/**
+	 * 
+	 * 根据方案id 获取方案提报单分录的对应的分录表名
+	 * @param schemeId
+	 * @return List
+	 * @throws BOSException 
+	 */
+	public static String getSchemeEntryTableName(Context ctx,String submitSchemeId) {
+		String fBillEntryTableName = "" ; 
+		String  sql = "Select n.FBillEntryTableName  from  T_HR_SCalSubmitScheme e "
+				+ " inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid  "
+				+ " where e.fid = '"+submitSchemeId+"'  ";
+		try {
+			//提报对象 01 person  02 org
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {			
+				//=====组装提报项目
+				fBillEntryTableName = rs.getString("FBillEntryTableName");		
+			}	
+		} catch (Exception e) {
+			logger.info(e);
+		}
+		return fBillEntryTableName ;
+	}
+	
+	/**
+	 * 
+	 * 根据方案id 获取方案提报单分录的对应的分录表名
+	 * @param schemeId
+	 * @return List
+	 * @throws BOSException 
+	 */
+	public static String getCalShemeTableName(Context ctx,String submitSchemeId) {
+		String calShemeTableName = "" ; 
+		String  sql = "Select n.FBillEntryTableName  from  T_HR_SCalSubmitScheme e "
+				+ " inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid  "
+				+ " where e.fid = '"+submitSchemeId+"'  ";
+		try {
+			//提报对象 01 person  02 org
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {			
+				//=====组装提报项目
+				calShemeTableName = rs.getString("FBillEntryTableName");		
+			}	
+		} catch (Exception e) {
+			logger.info(e);
+		}
+		return calShemeTableName ;
+	}
+	
+	/**
+	 * 删除提报方案关联的动态表及数据
+	 * @param schemeId
+	 * @return
+	 * @throws BOSException 
+	 * @throws SQLException 
+	 */
+	public static boolean deleteSubmitSchemeRelationDate(Context ctx,String schemeId) throws BOSException, SQLException {
+		boolean flag = false ;
+		if (StringUtils.isEmpty(schemeId)) {
+			return flag ;
+		}
+		String sql = "select FBillEntryTableName , FCalShemeTableName  from T_HR_SCalShemeTableRelation where FSubmitSchemeID = '"+schemeId+"'";
+		String  calShemeTableName = "" ,billEntryTableName ="";
+		IRowSet list = DbUtil.executeQuery(ctx, sql);
+		while (list.next()) {
+			billEntryTableName = list.getString("FBillEntryTableName");
+			calShemeTableName = list.getString("FCalShemeTableName");
+		}
+		if (!CmpStrUtil.isEmpty(calShemeTableName)) {
+			DbUtil.execute(ctx, "If exists (select * from KSQL_USERTABLES where KSQL_TABNAME ='" + calShemeTableName + "') drop table " + calShemeTableName + "");
+			DbUtil.execute(ctx, "If exists (select * from KSQL_USERTABLES where KSQL_TABNAME ='" + billEntryTableName + "') drop table " + billEntryTableName + "");
+		}
+		DbUtil.execute(ctx, "delete   from T_HR_SCalShemeTableRelation where FSubmitSchemeID = '"+schemeId+"'");		
+		return flag ;
+	}
+	
+	/**
+	 * 删除提报方案关联的动态表列
+	 * @param schemeId
+	 * @return
+	 * @throws BOSException 
+	 * @throws SQLException 
+	 */
+	public static boolean dropSubmitSchemeEntryTableCol(Context ctx,String schemeId,String itemId) throws BOSException, SQLException {
+		boolean flag = false ;
+		if (StringUtils.isEmpty(schemeId)) {
+			return flag ;
+		}
+		String sql = "select FBillEntryTableName , FCalShemeTableName  from T_HR_SCalShemeTableRelation where FSubmitSchemeID = '"+schemeId+"'";
+		String sqlItem  = "select fieldSn from  T_HR_SCalSubmitItem m "
+				+ " inner join  T_HR_SCalSubmitSchemeItem t on m.fid = t.FCalSubmitItemID  where t.fid  = '"+itemId+"'" ;
+		String  calShemeTableName = "" ,billEntryTableName ="",col="";
+		IRowSet rs = DbUtil.executeQuery(ctx, sql);
+		while (rs.next()) {
+			billEntryTableName = rs.getString("FBillEntryTableName");
+			calShemeTableName = rs.getString("FCalShemeTableName");
+		}
+		rs = DbUtil.executeQuery(ctx, sqlItem);
+		while (rs.next()) {
+			col = "S"+rs.getString("fieldSn");
+		}
+		StringBuilder calShemeTable = new StringBuilder("If  exists (select * from KSQL_USERCOLUMNS where KSQL_COL_NAME ='"+col+"' "
+				+ " and KSQL_COL_TABNAME='"+calShemeTableName+"')");
+		calShemeTable.append("ALTER TABLE "+calShemeTableName+" drop column "+col+" ");
+	
+		StringBuilder billEntryTable = new StringBuilder("If  exists (select * from KSQL_USERCOLUMNS where KSQL_COL_NAME ='"+col+"' "
+				+ " and KSQL_COL_TABNAME='"+billEntryTableName+"')");
+		billEntryTable.append("ALTER TABLE "+billEntryTableName+" drop column "+col+" ");
+		if (!CmpStrUtil.isEmpty(calShemeTableName)) {
+			DbUtil.execute(ctx,calShemeTable.toString());
+			DbUtil.execute(ctx,billEntryTable.toString());
+		}		
+		return flag ;
+	}
+	
+	/**
+	 * 
+	 * 根据方案id 获取方案提报单分录的提报项目列及对应的分录表名
+	 * @param schemeId
+	 * @return List
+	 * @throws BOSException 
+	 */
+	public static Map<String ,Object>  getRequiredColumns(Context ctx,String submitSchemeId) throws BOSException{
+		Map<String ,Object>  map  = new HashMap<String ,Object>();
+		//Set集合保存提报项目信息导致提报项目无法排序,只能改成list
+		List<Map<String, Object>>  colNames = new ArrayList<Map<String, Object>>();
+		if (StringUtils.isEmpty(submitSchemeId)) {
+			return map ;
+		}
+		String language = ctx.getLocale().getLanguage();
+		String  sql = "Select e.FSubmitTarget , m.fieldSn,m.fdataType,m.fname_"+language+" MNAME,n.FBillEntryTableName ,n.FCalShemeTableName ,t.FIsRequired"
+				+ " from  T_HR_SCalSubmitScheme e "
+				+ " inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid "
+				+ " inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID "
+				+ " inner join T_HR_SCalShemeTableRelation n on n.FSubmitSchemeID =e.fid  "
+				+ " where e.fid = '"+submitSchemeId+"' order by fieldSn ";
+		String submitTarget =null;
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {		
+				Map<String, Object> gridIdMap = new HashMap<String, Object>();
+				gridIdMap.put("rename", rs.getString("MNAME"));
+				gridIdMap.put("name", "CMP_SMT002."+"S"+rs.getString("fieldSn"));
+				gridIdMap.put("label", rs.getString("MNAME"));
+				gridIdMap.put("type", "String");
+				submitTarget = rs.getString("FSubmitTarget");
+				//=====组装提报项目
+				colNames.add(gridIdMap);
+			}	
+			map.put("colNames", colNames);
+			map.put("submitTarget", submitTarget);
+		} catch (Exception e) {
+			throw new BOSException("获取提报方案的提报项目列出错!"); // "获取提报方案的提报项目列出错!"
+		}
+		return map ;
+	}
+
+    /**
+     * 获取指定提报方案的动态项目
+     * @param ctx
+     * @param schemeId
+     * @return
+     */
+    public static List<CalShemeSubmitItemDTO> getDynamicSubmitItemBySchemeId(Context ctx, String schemeId){
+        List<CalShemeSubmitItemDTO> calShemeSubmitItemDTOS=new ArrayList<CalShemeSubmitItemDTO>();
+        StringBuffer sqlBuffer=new StringBuffer();
+        String language = ctx.getLocale().getLanguage();
+        sqlBuffer.append(" SELECT E.FID AS SCHEMEID, M.FID as ITEMID,  M.FIELDSN,M.FDATATYPE,M.FNAME_"+language+" AS ITEMNAME,T.FISREQUIRED ,M.FDATADOT,M.FDATALENGTH ");
+        sqlBuffer.append(" FROM  T_HR_SCALSUBMITSCHEME E  ");
+        sqlBuffer.append(" INNER JOIN  T_HR_SCALSUBMITSCHEMEITEM T ON T.FCALSUBMITSCHEMEID = E.FID  ");
+        sqlBuffer.append(" INNER JOIN T_HR_SCALSUBMITITEM M ON  M.FID = T.FCALSUBMITITEMID WHERE E.FID = '");
+        sqlBuffer.append(schemeId);
+        sqlBuffer.append("' ORDER BY T.FSORTSN");
+        try {
+            IRowSet rs = DbUtil.executeQuery(ctx, sqlBuffer.toString());
+            CalShemeSubmitItemDTO calShemeSubmitItemDTO=null;
+            while (rs.next()){
+                calShemeSubmitItemDTO=new CalShemeSubmitItemDTO();
+                calShemeSubmitItemDTO.setSubmitSchemeId(rs.getString("SCHEMEID"));
+                calShemeSubmitItemDTO.setItemId(rs.getString("ITEMID"));
+                calShemeSubmitItemDTO.setFieldSn(rs.getInt("FIELDSN"));
+                calShemeSubmitItemDTO.setDataType(rs.getString("FDATATYPE"));
+                calShemeSubmitItemDTO.setSubmitItemName(rs.getString("ITEMNAME"));
+                calShemeSubmitItemDTO.setIsRequired(rs.getInt("FISREQUIRED"));
+                calShemeSubmitItemDTO.setDataDot(rs.getInt("FDATADOT"));
+                calShemeSubmitItemDTO.setDataLength(rs.getInt("FDATALENGTH"));
+                calShemeSubmitItemDTOS.add(calShemeSubmitItemDTO);
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(),e);
+        } catch (SQLException e) {
+            logger.error(e.getMessage(),e);
+            e.printStackTrace();
+        }
+        return calShemeSubmitItemDTOS;
+    }
+    
+    
+    
+    /**
+     * 获取指定提报方案的动态项目
+     * @param ctx
+     * @param schemeId
+     * @return
+     */
+    public static List<CalShemeSubmitItemDTO> getDynamicSubmitItemBySchemeIdNotCenter(Context ctx, String schemeId){
+        List<CalShemeSubmitItemDTO> calShemeSubmitItemDTOS=new ArrayList<CalShemeSubmitItemDTO>();
+        StringBuffer sqlBuffer=new StringBuffer();
+        String language = ctx.getLocale().getLanguage();
+        sqlBuffer.append(" SELECT E.FID AS SCHEMEID, M.FID as ITEMID,  M.FIELDSN,M.FDATATYPE,M.FNAME_"+language+" AS ITEMNAME,"
+        		+ "T.FISREQUIRED ,M.FDATADOT,M.FDATALENGTH ");
+        sqlBuffer.append(" FROM  T_HR_SCALSUBMITSCHEME E  ");
+        sqlBuffer.append(" INNER JOIN  T_HR_SCALSUBMITSCHEMEITEM T ON T.FCALSUBMITSCHEMEID = E.FID  ");
+        sqlBuffer.append(" INNER JOIN T_HR_SCALSUBMITITEM M ON  M.FID = T.FCALSUBMITITEMID WHERE E.FID = '");
+        sqlBuffer.append(schemeId);
+        sqlBuffer.append("'  and M.Fnumber not in('DormFee027','DormFee026')");
+        sqlBuffer.append("   AND T.FState=1 ORDER BY T.FSORTSN");
+       
+        try {
+            IRowSet rs = DbUtil.executeQuery(ctx, sqlBuffer.toString());
+            CalShemeSubmitItemDTO calShemeSubmitItemDTO=null;
+            while (rs.next()){
+                calShemeSubmitItemDTO=new CalShemeSubmitItemDTO();
+                calShemeSubmitItemDTO.setSubmitSchemeId(rs.getString("SCHEMEID"));
+                calShemeSubmitItemDTO.setItemId(rs.getString("ITEMID"));
+                calShemeSubmitItemDTO.setFieldSn(rs.getInt("FIELDSN"));
+                calShemeSubmitItemDTO.setDataType(rs.getString("FDATATYPE"));
+                calShemeSubmitItemDTO.setSubmitItemName(rs.getString("ITEMNAME"));
+                calShemeSubmitItemDTO.setIsRequired(rs.getInt("FISREQUIRED"));
+                calShemeSubmitItemDTO.setDataDot(rs.getInt("FDATADOT"));
+                calShemeSubmitItemDTO.setDataLength(rs.getInt("FDATALENGTH"));
+                calShemeSubmitItemDTOS.add(calShemeSubmitItemDTO);
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(),e);
+        } catch (SQLException e) {
+            logger.error(e.getMessage(),e);
+            e.printStackTrace();
+        }
+        return calShemeSubmitItemDTOS;
+    }
+    
+    
+    
+
+    
+    /**
+     * 获取指定提报方案的动态项目排除实缴
+     * @param ctx
+     * @param schemeId
+     * @return
+     */
+    public static List<CalShemeSubmitItemDTO>  getDynamicSubmitItemBySchemeIdExcludePaid (Context ctx, String schemeId){
+        List<CalShemeSubmitItemDTO> calShemeSubmitItemDTOS=new ArrayList<CalShemeSubmitItemDTO>();
+        StringBuffer sqlBuffer=new StringBuffer();
+        String language = ctx.getLocale().getLanguage();
+        sqlBuffer.append(" SELECT E.FID AS SCHEMEID, M.FID as ITEMID,  M.FIELDSN,M.FDATATYPE,M.FNAME_"+language+" AS ITEMNAME,T.FISREQUIRED ,M.FDATADOT,M.FDATALENGTH ");
+        sqlBuffer.append(" FROM  T_HR_SCALSUBMITSCHEME E  ");
+        sqlBuffer.append(" INNER JOIN  T_HR_SCALSUBMITSCHEMEITEM T ON T.FCALSUBMITSCHEMEID = E.FID  ");
+        sqlBuffer.append(" INNER JOIN T_HR_SCALSUBMITITEM M ON  M.FID = T.FCALSUBMITITEMID WHERE E.FID = '");
+        sqlBuffer.append(schemeId);
+        sqlBuffer.append("' and M.fnumber not in('DormFee026','DormFee027') ORDER BY T.FSORTSN");
+        try {
+            IRowSet rs = DbUtil.executeQuery(ctx, sqlBuffer.toString());
+            CalShemeSubmitItemDTO calShemeSubmitItemDTO=null;
+            while (rs.next()){
+                calShemeSubmitItemDTO=new CalShemeSubmitItemDTO();
+                calShemeSubmitItemDTO.setSubmitSchemeId(rs.getString("SCHEMEID"));
+                calShemeSubmitItemDTO.setItemId(rs.getString("ITEMID"));
+                calShemeSubmitItemDTO.setFieldSn(rs.getInt("FIELDSN"));
+                calShemeSubmitItemDTO.setDataType(rs.getString("FDATATYPE"));
+                calShemeSubmitItemDTO.setSubmitItemName(rs.getString("ITEMNAME"));
+                calShemeSubmitItemDTO.setIsRequired(rs.getInt("FISREQUIRED"));
+                calShemeSubmitItemDTO.setDataDot(rs.getInt("FDATADOT"));
+                calShemeSubmitItemDTO.setDataLength(rs.getInt("FDATALENGTH"));
+                calShemeSubmitItemDTOS.add(calShemeSubmitItemDTO);
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(),e);
+        } catch (SQLException e) {
+            logger.error(e.getMessage(),e);
+            e.printStackTrace();
+        }
+        return calShemeSubmitItemDTOS;
+    }
+    
+    
+    public static Map<String, Integer> getCellLength(Context ctx, String schemeId){
+    	Map<String, Integer> map = new HashMap<String, Integer>();
+		String  sql = "Select m.fieldSn,m.FDataLength"
+				+ " from  T_HR_SCalSubmitScheme e "
+				+ " inner join  T_HR_SCalSubmitSchemeItem t on t.FCalSubmitSchemeID = e.fid "
+				+ " inner join T_HR_SCalSubmitItem m on  m.fid = t.FCalSubmitItemID "
+				+ " where e.fid = '"+schemeId+"' and FDataType = '1' order by  FSortSn";
+		try {
+			IRowSet rs = DbUtil.executeQuery(ctx, sql);
+			while (rs.next()) {
+				String fieldSn = String.valueOf(rs.getInt(1));
+				Integer dataLength = rs.getInt(2);
+				map.put(fieldSn, dataLength);
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+    	return map;
+    }
+}

+ 45 - 0
GDYSL/websrc/com/kingdee/shr/preentry/app/PEPersonCredentialsTypeControllerBean.java

@@ -0,0 +1,45 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package com.kingdee.shr.preentry.app;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.dao.IObjectValue;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.hr.emp.app.util.SHREmpCheckCredentialsTypeUtil;
+import com.kingdee.shr.preentry.PEPersonCredentialsTypeInfo;
+import org.apache.log4j.Logger;
+
+public class PEPersonCredentialsTypeControllerBean extends AbstractPEPersonCredentialsTypeControllerBean {
+    private static Logger logger = Logger.getLogger("com.kingdee.shr.preentry.app.PEPersonCredentialsTypeControllerBean");
+
+    public PEPersonCredentialsTypeControllerBean() {
+    }
+
+    protected IObjectPK _addnew(Context ctx, IObjectValue model) throws BOSException, EASBizException {
+        PEPersonCredentialsTypeInfo info = (PEPersonCredentialsTypeInfo)model;
+        this.checkCredentialsTypeAndNo(ctx, info);
+        return super._addnew(ctx, info);
+    }
+
+    protected void _update(Context ctx, IObjectPK pk, IObjectValue model) throws BOSException, EASBizException {
+        PEPersonCredentialsTypeInfo info = (PEPersonCredentialsTypeInfo)model;
+        this.checkCredentialsTypeAndNo(ctx, info);
+        super._update(ctx, pk, model);
+    }
+
+    protected void _delete(Context ctx, IObjectPK pk) throws BOSException, EASBizException {
+        super._delete(ctx, pk);
+    }
+
+    public void checkCredentialsTypeAndNo(Context ctx, PEPersonCredentialsTypeInfo info) throws EASBizException, BOSException {
+        //SHREmpCheckCredentialsTypeUtil.checkCredentialsTypeUnique(ctx, info, info.getTalent());
+        String excludePreEntryBillId = info.getId() == null ? "" : info.getId().toString();
+        SHREmpCheckCredentialsTypeUtil.checkCredentiaslTypeForEmp(ctx, info, excludePreEntryBillId);
+        SHREmpCheckCredentialsTypeUtil.checkCredentialsTypeNoByOSF(ctx, info);
+    }
+}