2 Commits 4e8fb3485e ... bcb73466fa

Tác giả SHA1 Thông báo Ngày
  turborao bcb73466fa Merge remote-tracking branch 'origin/master' 1 tuần trước cách đây
  turborao a2e63e2d57 feat(gzbb): 添加附件文件工具类和导入导出插件 1 tuần trước cách đây
21 tập tin đã thay đổi với 6964 bổ sung0 xóa
  1. 794 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/AttachFileUtils.java
  2. 33 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ExportentryPlugin.java
  3. 127 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ImportentryPlugin.java
  4. 726 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/PushSjcjDataUtils.java
  5. 114 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjcjCheckFormListPlugin.java
  6. 240 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjcjCheckFormPlugin.java
  7. 40 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjcjmbCheckForm.java
  8. 149 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjcjmbTask.java
  9. 40 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbBackWorkflowPlugin.java
  10. 310 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbCheckFormListPlugin.java
  11. 187 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbCheckFormPlugin.java
  12. 314 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbInitLdqkFormPlugin.java
  13. 369 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbInitRowDataFormPlugin.java
  14. 226 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbInitXxtjFormPlugin.java
  15. 1866 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbInitZgsrFormPlugin.java
  16. 373 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbRgcbtjVO.java
  17. 38 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbSubmitWorkflowPlugin.java
  18. 219 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/XcxmCheckFormPlugin.java
  19. 124 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ZgsrDetailsAmtVO.java
  20. 43 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ZgsrDetailsVO.java
  21. 632 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ZgsrVO.java

+ 794 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/AttachFileUtils.java

@@ -0,0 +1,794 @@
+
+package nckd.jxccl.hr.gzbb;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import kd.bos.cache.CacheFactory;
+import kd.bos.cache.TempFileCache;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.dataentity.utils.StringUtils;
+import kd.bos.db.tx.TX;
+import kd.bos.db.tx.TXHandle;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.fileservice.BatchDownloadRequest;
+import kd.bos.fileservice.FileItem;
+import kd.bos.fileservice.FileService;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.fileservice.extension.FileServiceExtFactory;
+import kd.bos.id.ID;
+import kd.bos.logging.BizLog;
+import kd.bos.org.utils.DynamicObjectUtils;
+import kd.bos.orm.query.QFilter;
+import kd.bos.orm.util.CollectionUtils;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.MetadataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.util.FileNameUtils;
+
+
+public class AttachFileUtils {
+    private static String BIDDOCUMENT_EDIT = "_biddocument_edit";
+    private static String COM_ATTACHMENTPANEL = "com_attachmentpanel";
+    private static String TECH_ATTACHMENTPANELAP = "tech_attachmentpanelap";
+    private static String ATTACHMENTPANEL = "attachmentpanel";
+
+    public AttachFileUtils() {
+    }
+
+    public static void copyBidDocumentFileToBill(String appId, Object sourceBillId, String sourceAttachKey, String destinationBillType, Object destinationBillId) {
+        if (StringUtils.equals("all", sourceAttachKey)) {
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, ATTACHMENTPANEL, destinationBillType, destinationBillId, ATTACHMENTPANEL);
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, TECH_ATTACHMENTPANELAP, destinationBillType, destinationBillId, ATTACHMENTPANEL);
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, COM_ATTACHMENTPANEL, destinationBillType, destinationBillId, ATTACHMENTPANEL);
+        } else if (StringUtils.equals(ATTACHMENTPANEL, sourceAttachKey)) {
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, ATTACHMENTPANEL, destinationBillType, destinationBillId, ATTACHMENTPANEL);
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, TECH_ATTACHMENTPANELAP, destinationBillType, destinationBillId, ATTACHMENTPANEL);
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, COM_ATTACHMENTPANEL, destinationBillType, destinationBillId, ATTACHMENTPANEL);
+        }
+
+    }
+
+    public static void copyBidDocumentFileToBillExpComAndTech(String appId, Object sourceBillId, String sourceAttachKey, String destinationBillType, Object destinationBillId) {
+        if (StringUtils.equals("all", sourceAttachKey)) {
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, ATTACHMENTPANEL, destinationBillType, destinationBillId, ATTACHMENTPANEL);
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, TECH_ATTACHMENTPANELAP, destinationBillType, destinationBillId, TECH_ATTACHMENTPANELAP);
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, COM_ATTACHMENTPANEL, destinationBillType, destinationBillId, COM_ATTACHMENTPANEL);
+        } else if (StringUtils.equals(ATTACHMENTPANEL, sourceAttachKey)) {
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, ATTACHMENTPANEL, destinationBillType, destinationBillId, ATTACHMENTPANEL);
+        } else if (StringUtils.equals(TECH_ATTACHMENTPANELAP, sourceAttachKey)) {
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, TECH_ATTACHMENTPANELAP, destinationBillType, destinationBillId, TECH_ATTACHMENTPANELAP);
+        } else if (StringUtils.equals(COM_ATTACHMENTPANEL, sourceAttachKey)) {
+            copyFileFromAToB(appId + BIDDOCUMENT_EDIT, sourceBillId, COM_ATTACHMENTPANEL, destinationBillType, destinationBillId, COM_ATTACHMENTPANEL);
+        }
+
+    }
+
+    public static void synFileFromAToB(String sourceBillType, Object sourceBillId, String sourceAttachKey, String destinationBillType, Object destinationBillId, String destinationAttachKey) {
+        List<Map<String, Object>> sourceFileList = AttachmentServiceHelper.getAttachments(sourceBillType, sourceBillId, sourceAttachKey);
+        List<Object> sourceFileIdList = new ArrayList(50);
+        Iterator var8 = sourceFileList.iterator();
+
+        while(var8.hasNext()) {
+            Map<String, Object> sourceAttach = (Map)var8.next();
+            sourceFileIdList.add(sourceAttach.get("uid"));
+        }
+
+        List<Map<String, Object>> destinationFileList = AttachmentServiceHelper.getAttachments(destinationBillType, destinationBillId, destinationAttachKey);
+        Iterator var12 = destinationFileList.iterator();
+
+        while(var12.hasNext()) {
+            Map<String, Object> destinationAttach = (Map)var12.next();
+            if (!sourceFileIdList.contains(destinationAttach.get("uid"))) {
+                AttachmentServiceHelper.remove(destinationBillType, destinationBillId, destinationAttach.get("uid"));
+            }
+        }
+
+        copyFileFromAToB(sourceBillType, sourceBillId, sourceAttachKey, destinationBillType, destinationBillId, destinationAttachKey);
+    }
+
+    public static void copyFileFromAToB(String sourceBillType, Object sourceBillId, String sourceAttachKey, String destinationBillType, Object destinationBillId, String destinationAttachKey) {
+        List<Map<String, Object>> sourceFileList = AttachmentServiceHelper.getAttachments(sourceBillType, sourceBillId, sourceAttachKey);
+        copyFileToBillByPk(destinationBillType, destinationBillId, destinationAttachKey, sourceFileList);
+    }
+
+    public static void removeAllFile(String billType, Object billId, String attachKey) {
+        List<Map<String, Object>> fileList = AttachmentServiceHelper.getAttachments(billType, billId, attachKey);
+        Iterator var4 = fileList.iterator();
+
+        while(var4.hasNext()) {
+            Map<String, Object> sourceAttach = (Map)var4.next();
+            AttachmentServiceHelper.remove(billType, billId, sourceAttach.get("uid"));
+        }
+
+    }
+
+    public static void copyFileToBillByPk(String formId, Object pkId, String attachKey, List<Map<String, Object>> attachments) {
+        if (pkId != null) {
+            pkId = "" + pkId;
+        }
+
+        List<DynamicObject> attachmentFileList = new ArrayList();
+        MainEntityType mainType = EntityMetadataCache.getDataEntityType("bos_attachment");
+        FileService fileService = FileServiceFactory.getAttachmentFileService();
+        Date date = new Date();
+        int i = 1;
+
+        for(Iterator var9 = attachments.iterator(); var9.hasNext(); ++i) {
+            Map<String, Object> attach = (Map)var9.next();
+            Long attPkId = (Long)((Long)attach.get("attPkId"));
+            String uid = String.valueOf(attach.get("uid"));
+            String fileName = String.valueOf(attach.get("name"));
+            Long fileSize = (Long)attach.get("size");
+            String fExtName = (String)attach.get("name");
+            String newUid = String.format("%s-%s-%s", "rc-upload", date.getTime(), i);
+            DynamicObject oldAttachment = BusinessDataServiceHelper.loadSingle(attPkId, "bos_attachment");
+            String fileRelativePath = oldAttachment.getString("FFileId");
+            InputStream in = fileService.getInputStream(fileRelativePath);
+            RequestContext requestContext = RequestContext.get();
+            String appId = "bid";
+            if (formId.startsWith("rebm")) {
+                appId = "rebm";
+            }
+
+            String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(), requestContext.getAccountId(), appId, formId, uid, fileName);
+            FileItem fileItem = new FileItem(fileName, pathParam, in);
+            String filePath = fileService.upload(fileItem);
+            if (!StringUtils.isEmpty(filePath)) {
+                DynamicObject newAttachment = new DynamicObject(mainType);
+                newAttachment.set("id", ID.genLongId());
+                newAttachment.set("FNUMBER", newUid);
+                newAttachment.set("FBillType", formId);
+                newAttachment.set("FInterID", pkId);
+                Timestamp lastModified = (Timestamp)attach.get("lastModified");
+                if (lastModified != null) {
+                    newAttachment.set("FModifyTime", new Date(lastModified.getTime()));
+                } else {
+                    newAttachment.set("FModifyTime", new Date());
+                }
+
+                DynamicObject creator = oldAttachment.getDynamicObject("FCREATEMEN");
+                if (creator != null) {
+                    newAttachment.set("FCREATEMEN", creator.getLong("id"));
+                }
+
+                newAttachment.set("fcreatetime", new Date((Long)attach.get("createdate")));
+                newAttachment.set("FaliasFileName", fileName);
+                newAttachment.set("FAttachmentName", fileName);
+                newAttachment.set("FExtName", fExtName != null ? fExtName.substring(fExtName.lastIndexOf(46) + 1) : "");
+                newAttachment.set("FATTACHMENTSIZE", fileSize);
+                newAttachment.set("fattachmentpanel", attachKey);
+                newAttachment.set("fdescription", attach.get("description"));
+                newAttachment.set("FFileId", filePath);
+                attachmentFileList.add(newAttachment);
+            }
+        }
+
+        if (!CollectionUtils.isEmpty(attachmentFileList)) {
+            DynamicObject[] attachmentFileArray = new DynamicObject[attachmentFileList.size()];
+            attachmentFileList.toArray(attachmentFileArray);
+            SaveServiceHelper.save(attachmentFileArray);
+        }
+
+    }
+
+    public static Map<String, List<String>> copyFileFromAToBReturnMap(String sourceBillType, Object sourceBillId, String sourceAttachKey, String destinationBillType, Object destinationBillId, String destinationAttachKey) {
+        List<Map<String, Object>> sourceFileList = AttachmentServiceHelper.getAttachments(sourceBillType, sourceBillId, sourceAttachKey);
+        return copyFileToBillByPkReturnMap(destinationBillType, destinationBillId, destinationAttachKey, sourceFileList);
+    }
+
+    public static Map<String, List<String>> copyFileToBillByPkReturnMap(String formId, Object pkId, String attachKey, List<Map<String, Object>> attachments) {
+        if (pkId != null) {
+            pkId = "" + pkId;
+        }
+
+        Map<String, List<String>> resultMap = new HashMap();
+        List<String> updateUidList = new ArrayList(attachments.size());
+        List<String> addUidList = new ArrayList(attachments.size());
+        List<DynamicObject> attachmentFileList = new ArrayList();
+        FileService fileService = FileServiceFactory.getAttachmentFileService();
+        MainEntityType mainType = EntityMetadataCache.getDataEntityType("bos_attachment");
+        Date date = new Date();
+        int i = 1;
+
+        for(Iterator var12 = attachments.iterator(); var12.hasNext(); ++i) {
+            Map<String, Object> attach = (Map)var12.next();
+            String uid = String.valueOf(attach.get("uid"));
+            String newUid = String.format("%s-%s-%s", "rc-upload", date.getTime(), i);
+            String fileName = String.valueOf(attach.get("name"));
+            Long attPkId = (Long)((Long)attach.get("attPkId"));
+            Long fileSize = (Long)attach.get("size");
+            String fExtName = (String)attach.get("name");
+            DynamicObject oldAttachment = BusinessDataServiceHelper.loadSingle(attPkId, "bos_attachment");
+            String fileRelativePath = oldAttachment.getString("FFileId");
+            InputStream in = fileService.getInputStream(fileRelativePath);
+            RequestContext requestContext = RequestContext.get();
+            String appId = "bid";
+            if (formId.startsWith("rebm")) {
+                appId = "rebm";
+            }
+
+            String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(), requestContext.getAccountId(), appId, formId, uid, fileName);
+            FileItem fileItem = new FileItem(fileName, pathParam, in);
+            String filePath = fileService.upload(fileItem);
+            if (!StringUtils.isEmpty(filePath)) {
+                DynamicObject newAttachment = new DynamicObject(mainType);
+                newAttachment.set("id", ID.genLongId());
+                newAttachment.set("FNUMBER", newUid);
+                newAttachment.set("FBillType", formId);
+                newAttachment.set("FInterID", pkId);
+                Timestamp lastModified = (Timestamp)attach.get("lastModified");
+                if (lastModified != null) {
+                    newAttachment.set("FModifyTime", new Date(lastModified.getTime()));
+                } else {
+                    newAttachment.set("FModifyTime", new Date());
+                }
+
+                DynamicObject creator = oldAttachment.getDynamicObject("FCREATEMEN");
+                if (creator != null) {
+                    newAttachment.set("fcreatemen", creator.getLong("id"));
+                }
+
+                newAttachment.set("fcreatetime", new Date((Long)attach.get("createdate")));
+                newAttachment.set("FaliasFileName", fileName);
+                newAttachment.set("FAttachmentName", fileName);
+                newAttachment.set("FExtName", fExtName != null ? fExtName.substring(fExtName.lastIndexOf(46) + 1) : "");
+                newAttachment.set("FATTACHMENTSIZE", fileSize);
+                newAttachment.set("fattachmentpanel", attachKey);
+                newAttachment.set("fdescription", attach.get("description"));
+                newAttachment.set("FFileId", filePath);
+                attachmentFileList.add(newAttachment);
+            }
+
+            attach.put("createdate", attach.get("createdate"));
+            attach.put("creator", attach.get("creator"));
+        }
+
+        if (!CollectionUtils.isEmpty(attachmentFileList)) {
+            DynamicObject[] attachmentFileArray = new DynamicObject[attachmentFileList.size()];
+            attachmentFileList.toArray(attachmentFileArray);
+            SaveServiceHelper.save(attachmentFileArray);
+        }
+
+        resultMap.put("updateUidList", updateUidList);
+        resultMap.put("addUidList", addUidList);
+        return resultMap;
+    }
+
+    public static void removeSpecificFile(String formId, Object pkId, List<String> uidList) {
+        Iterator var3 = uidList.iterator();
+
+        while(var3.hasNext()) {
+            String uid = (String)var3.next();
+            AttachmentServiceHelper.remove(formId, pkId, uid);
+        }
+
+    }
+
+    public static List<DynamicObject> copyToEntryAttachment(List<Map<String, Object>> attachments) {
+        List<DynamicObject> attachmentFileList = new ArrayList();
+        if (CollectionUtils.isEmpty(attachments)) {
+            return attachmentFileList;
+        } else {
+            try {
+                FileService fileService = FileServiceFactory.getAttachmentFileService();
+                Date now = new Date();
+                Iterator var4 = attachments.iterator();
+
+                while(var4.hasNext()) {
+                    Map<String, Object> attachment = (Map)var4.next();
+                    String fileName = String.valueOf(attachment.get("name"));
+                    String type = fileName != null ? fileName.substring(fileName.lastIndexOf(46) + 1) : "";
+                    DynamicObject oldAttachment = BusinessDataServiceHelper.loadSingle(attachment.get("attPkId"), "bos_attachment");
+                    String fileRelativePath = oldAttachment.getString("FFileId");
+                    InputStream in = fileService.getInputStream(fileRelativePath);
+                    RequestContext requestContext = RequestContext.get();
+                    String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(), requestContext.getAccountId(), ID.genLongId(), fileName);
+                    FileItem fileItem = new FileItem(fileName, pathParam, in);
+                    String filePath = fileService.upload(fileItem);
+                    if (!StringUtils.isEmpty(filePath)) {
+                        DynamicObject newAttachment = new DynamicObject(MetadataServiceHelper.getDataEntityType("bd_attachment"));
+                        Long id = ID.genLongId();
+                        newAttachment.set("name", fileName);
+                        newAttachment.set("size", attachment.get("size"));
+                        newAttachment.set("url", filePath);
+                        newAttachment.set("type", type);
+                        newAttachment.set("description", "");
+                        newAttachment.set("tempfile", "1");
+                        newAttachment.set("pageid", "");
+                        newAttachment.set("number", id.toString());
+                        newAttachment.set("status", "B");
+                        newAttachment.set("createtime", now.getTime());
+                        newAttachment.set("modifytime", now.getTime());
+                        newAttachment.set("creator", BusinessDataServiceHelper.loadSingle(Long.parseLong(RequestContext.get().getUserId()), "bos_user"));
+                        newAttachment.set("uid", id.toString());
+                        newAttachment.set("id", id);
+                        attachmentFileList.add(newAttachment);
+                    }
+                }
+
+                TXHandle h = TX.requiresNew();
+                Throwable var31 = null;
+
+                try {
+                    try {
+                        SaveServiceHelper.save((DynamicObject[])attachmentFileList.toArray(new DynamicObject[0]));
+                    } catch (Exception var26) {
+                        h.markRollback();
+                        BizLog.log(var26.getMessage());
+                    }
+                } catch (Throwable var27) {
+                    var31 = var27;
+                    throw var27;
+                } finally {
+                    if (h != null) {
+                        if (var31 != null) {
+                            try {
+                                h.close();
+                            } catch (Throwable var25) {
+                                var31.addSuppressed(var25);
+                            }
+                        } else {
+                            h.close();
+                        }
+                    }
+
+                }
+
+                return attachmentFileList;
+            } catch (Exception var29) {
+                BizLog.log(var29.getMessage());
+                return null;
+            }
+        }
+    }
+
+    public static DynamicObject copyBdAttachment(DynamicObject attachment) {
+        if (attachment == null) {
+            return null;
+        } else {
+            try {
+                MainEntityType mainType = EntityMetadataCache.getDataEntityType("bd_attachment");
+                FileService fileService = FileServiceFactory.getAttachmentFileService();
+                String fileName = attachment.getString("name");
+                String fileRelativePath = attachment.getString("url");
+                InputStream in = fileService.getInputStream(fileRelativePath);
+                RequestContext requestContext = RequestContext.get();
+                String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(), requestContext.getAccountId(), ID.genLongId(), fileName);
+                FileItem fileItem = new FileItem(fileName, pathParam, in);
+                String filePath = fileService.upload(fileItem);
+                if (!StringUtils.isEmpty(filePath)) {
+                    Long id = ID.genLongId();
+                    DynamicObject newAttachment = new DynamicObject(mainType);
+                    DynamicObjectUtils.copy(attachment, newAttachment);
+                    newAttachment.set("id", id);
+                    newAttachment.set("number", id.toString());
+                    newAttachment.set("uid", id.toString());
+                    newAttachment.set("url", filePath);
+                    SaveServiceHelper.save(new DynamicObject[]{newAttachment});
+                    return newAttachment;
+                } else {
+                    return null;
+                }
+            } catch (Exception var12) {
+                BizLog.log(var12.getMessage());
+                return null;
+            }
+        }
+    }
+
+    public static void entryToPanelAttachment(List<DynamicObject> attachments, String formId, Object pkId, String attachKey) {
+        MainEntityType mainType = EntityMetadataCache.getDataEntityType("bos_attachment");
+        FileService fileService = FileServiceFactory.getAttachmentFileService();
+        Date date = new Date();
+        int i = 1;
+        List<DynamicObject> attachmentFileList = new ArrayList();
+
+        for(Iterator var9 = attachments.iterator(); var9.hasNext(); ++i) {
+            DynamicObject attach = (DynamicObject)var9.next();
+            String fileName = String.valueOf(attach.get("name"));
+            String newUid = String.format("%s-%s-%s", "rc-upload", date.getTime(), i);
+            String fileRelativePath = attach.getString("url");
+            InputStream in = fileService.getInputStream(fileRelativePath);
+            RequestContext requestContext = RequestContext.get();
+            String pathParam = FileNameUtils.getAttachmentFileName(requestContext.getTenantId(), requestContext.getAccountId(), formId, formId.split("_")[0], newUid, fileName);
+            FileItem fileItem = new FileItem(fileName, pathParam, in);
+            String filePath = fileService.upload(fileItem);
+            if (!StringUtils.isEmpty(filePath)) {
+                DynamicObject newAttachment = new DynamicObject(mainType);
+                newAttachment.set("id", ID.genLongId());
+                newAttachment.set("FNUMBER", newUid);
+                newAttachment.set("FBillType", formId);
+                newAttachment.set("FInterID", pkId);
+                newAttachment.set("FModifyTime", attach.get("modifytime"));
+                DynamicObject creator = attach.getDynamicObject("creator");
+                if (creator != null) {
+                    newAttachment.set("FCREATEMEN", creator.getLong("id"));
+                }
+
+                newAttachment.set("fcreatetime", attach.get("createtime"));
+                newAttachment.set("FaliasFileName", fileName);
+                newAttachment.set("FAttachmentName", fileName);
+                newAttachment.set("FExtName", fileName != null ? fileName.substring(fileName.lastIndexOf(46) + 1) : "");
+                newAttachment.set("FATTACHMENTSIZE", attach.get("size"));
+                newAttachment.set("fattachmentpanel", attachKey);
+                newAttachment.set("fdescription", attach.get("description"));
+                newAttachment.set("FFileId", filePath);
+                attachmentFileList.add(newAttachment);
+            }
+        }
+
+        if (!CollectionUtils.isEmpty(attachmentFileList)) {
+            DynamicObject[] attachmentFileArray = new DynamicObject[attachmentFileList.size()];
+            attachmentFileList.toArray(attachmentFileArray);
+            SaveServiceHelper.save(attachmentFileArray);
+        }
+
+    }
+
+    public static String downloadByAttachmentIds(String fileName, ArrayList<Long> attachmentIds) {
+        QFilter qFilter = new QFilter("id", "in", attachmentIds);
+        DynamicObject[] attachments = BusinessDataServiceHelper.load("bd_attachment", "id,url", new QFilter[]{qFilter});
+        String[] filePaths = (String[])Arrays.stream(attachments).map((attachment) -> {
+            return FileServiceExtFactory.getAttachFileServiceExt().getRealPath(attachment.getString("url"));
+        }).toArray((x$0) -> {
+            return new String[x$0];
+        });
+        return downloadByAttachmentUrls(fileName, filePaths);
+    }
+
+    public static String downloadByAttachmentUrls(String fileName, String... attachmentUrls) {
+        if (attachmentUrls != null && attachmentUrls.length != 0) {
+            if (attachmentUrls.length > 0) {
+                fileName = fileName == null ? "attachments.zip" : (!fileName.toLowerCase(Locale.ENGLISH).endsWith(".zip") ? fileName + ".zip" : fileName);
+            } else if (fileName == null) {
+                String attachmentUrl = attachmentUrls[0];
+                if (attachmentUrl.lastIndexOf(47) != -1) {
+                    int i = attachmentUrl.lastIndexOf(47);
+                    fileName = attachmentUrl.substring(i + 1);
+                }
+            }
+
+            FileService fs = FileServiceFactory.getAttachmentFileService();
+            String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36";
+
+            try {
+                ByteArrayOutputStream out = new ByteArrayOutputStream();
+                Throwable var5 = null;
+
+                String attachmentUrl;
+                try {
+                    if (attachmentUrls.length > 0) {
+                        BatchDownloadRequest bdr = getBatchDownloadRequest(attachmentUrls);
+                        fs.batchDownload(bdr, out, userAgent);
+                    } else {
+                        attachmentUrl = attachmentUrls[0];
+                        fs.download(attachmentUrl, out, userAgent);
+                    }
+
+                    out.flush();
+                    attachmentUrl = download(fileName, out.toByteArray());
+                } catch (Throwable var16) {
+                    var5 = var16;
+                    throw var16;
+                } finally {
+                    if (out != null) {
+                        if (var5 != null) {
+                            try {
+                                out.close();
+                            } catch (Throwable var15) {
+                                var5.addSuppressed(var15);
+                            }
+                        } else {
+                            out.close();
+                        }
+                    }
+
+                }
+
+                return attachmentUrl;
+            } catch (Exception var18) {
+                return var18.getMessage();
+            }
+        } else {
+            return null;
+        }
+    }
+
+    private static BatchDownloadRequest getBatchDownloadRequest(String[] attachmentUrls) {
+        BatchDownloadRequest.Dir srcDir = new BatchDownloadRequest.Dir("attachments");
+        List<BatchDownloadRequest.File> srcFiles = new ArrayList(attachmentUrls.length);
+        String[] var3 = attachmentUrls;
+        int var4 = attachmentUrls.length;
+
+        for(int var5 = 0; var5 < var4; ++var5) {
+            String attachmentUrl = var3[var5];
+            if (attachmentUrl.lastIndexOf(47) != -1) {
+                int i = attachmentUrl.lastIndexOf(47);
+                String attachmentName = attachmentUrl.substring(i + 1);
+                srcFiles.add(new BatchDownloadRequest.File(attachmentName, attachmentUrl));
+            }
+        }
+
+        srcDir.setFiles((BatchDownloadRequest.File[])srcFiles.toArray(new BatchDownloadRequest.File[0]));
+        BatchDownloadRequest bdr = new BatchDownloadRequest("test-batch-download");
+        bdr.setDirs(new BatchDownloadRequest.Dir[]{srcDir});
+        return bdr;
+    }
+
+    public static String download(String fileName, byte[] bytes) {
+        InputStream in = new ByteArrayInputStream(bytes);
+        return download(fileName, (InputStream)in);
+    }
+
+    public static String download(String fileName, InputStream in) {
+        TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
+        return cache.saveAsUrl(fileName, in, 120);
+    }
+
+    public static String downAllFile(String fileName, Object formId, String formBillno, String appid, String evalType) {
+        fileName = fileName == null ? "attachments.zip" : (!fileName.toLowerCase(Locale.ENGLISH).endsWith(".zip") ? fileName + ".zip" : fileName);
+        FileService fs = FileServiceFactory.getAttachmentFileService();
+        String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36";
+
+        try {
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            Throwable var8 = null;
+
+            String var10;
+            try {
+                BatchDownloadRequest bdr = getBatchFile(formId, formBillno, appid, evalType);
+                fs.batchDownload(bdr, out, userAgent);
+                out.flush();
+                var10 = download(fileName, out.toByteArray());
+            } catch (Throwable var20) {
+                var8 = var20;
+                throw var20;
+            } finally {
+                if (out != null) {
+                    if (var8 != null) {
+                        try {
+                            out.close();
+                        } catch (Throwable var19) {
+                            var8.addSuppressed(var19);
+                        }
+                    } else {
+                        out.close();
+                    }
+                }
+
+            }
+
+            return var10;
+        } catch (Exception var22) {
+            return var22.getMessage();
+        }
+    }
+
+    private static BatchDownloadRequest getBatchFile(Object formId, String formBillno, String appid, String evalType) {
+        String secTionBillNo = "";
+        String secTionNameKey = "";
+        String isDarkTag = "";
+        String supplierDarkTag = "";
+        if (formBillno.contains("onlinebideval")) {
+            secTionBillNo = "bidsectionenroll";
+            secTionNameKey = "sectionname2";
+            isDarkTag = "isdark";
+            supplierDarkTag = "supplierdarkname_entry";
+        } else if (formBillno.contains("decision")) {
+            secTionBillNo = "bidsection";
+            secTionNameKey = "sectionname";
+        } else if (formBillno.contains("bidopen")) {
+            secTionBillNo = "bidsection";
+            secTionNameKey = "sectionname";
+            isDarkTag = "isdark";
+            supplierDarkTag = "darksuppliername";
+        }
+
+        List<BatchDownloadRequest.Dir> listDir = new ArrayList();
+        DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(formId, formBillno);
+        boolean isDark = false;
+        if (!formBillno.contains("decision")) {
+            isDark = dynamicObject.getBoolean(isDarkTag);
+        }
+
+        DynamicObject bidProject = dynamicObject.getDynamicObject("bidproject");
+        DynamicObjectCollection bidsectionenrollCol = dynamicObject.getDynamicObjectCollection(secTionBillNo);
+        Iterator var14 = bidsectionenrollCol.iterator();
+
+        while(var14.hasNext()) {
+            DynamicObject bidsectionenroll = (DynamicObject)var14.next();
+            String sectionName = bidsectionenroll.getString(secTionNameKey);
+            DynamicObjectCollection supplierentryCol = bidsectionenroll.getDynamicObjectCollection("supplierentry");
+            Iterator var18 = supplierentryCol.iterator();
+
+            while(var18.hasNext()) {
+                DynamicObject supplierentry = (DynamicObject)var18.next();
+                DynamicObject supplier = supplierentry.getDynamicObject("supplier");
+                String supplierName;
+                if (isDark) {
+                    supplierName = supplierentry.getString(supplierDarkTag);
+                } else {
+                    supplierName = supplier.getString("name");
+                }
+
+                String fileZipName = getFileZipName(bidProject.getPkValue(), sectionName, supplierName, formBillno, formId, appid);
+                BatchDownloadRequest.Dir srcDir = new BatchDownloadRequest.Dir(fileZipName);
+                ArrayList<Long> attachmentIds = new ArrayList();
+                getFileUrl(supplierentry, evalType, attachmentIds, formBillno, bidProject.getPkValue());
+                List<BatchDownloadRequest.File> srcFiles = new ArrayList(attachmentIds.size());
+                QFilter qFilter = new QFilter("id", "in", attachmentIds);
+                DynamicObject[] attachments = BusinessDataServiceHelper.load("bd_attachment", "id,url", new QFilter[]{qFilter});
+                String[] filePaths = (String[])Arrays.stream(attachments).map((attachment) -> {
+                    return FileServiceExtFactory.getAttachFileServiceExt().getRealPath(attachment.getString("url"));
+                }).toArray((x$0) -> {
+                    return new String[x$0];
+                });
+                String[] var28 = filePaths;
+                int var29 = filePaths.length;
+
+                for(int var30 = 0; var30 < var29; ++var30) {
+                    String attachmentUrl = var28[var30];
+                    if (attachmentUrl.lastIndexOf(47) != -1) {
+                        int i = attachmentUrl.lastIndexOf(47);
+                        String attachmentName = attachmentUrl.substring(i + 1);
+                        srcFiles.add(new BatchDownloadRequest.File(attachmentName, attachmentUrl));
+                    }
+                }
+
+                srcDir.setFiles((BatchDownloadRequest.File[])srcFiles.toArray(new BatchDownloadRequest.File[0]));
+                listDir.add(srcDir);
+            }
+        }
+
+        BatchDownloadRequest bdr = new BatchDownloadRequest("test-batch-download");
+        bdr.setDirs((BatchDownloadRequest.Dir[])listDir.toArray(new BatchDownloadRequest.Dir[0]));
+        return bdr;
+    }
+
+    public static String getFileZipName(Object bidprojectId, String sectionName, String supplierName, String formBillno, Object formId, String appid) {
+        return fileZipName(bidprojectId, sectionName, supplierName, formBillno, formId, appid);
+    }
+
+    public static void getFileUrl(DynamicObject supplierEntry, String evalType, ArrayList<Long> attachmentIds, String formBillno, Object bidprojectId) {
+        String tecName = "";
+        String comName = "";
+        if (formBillno.contains("onlinebideval")) {
+            tecName = "supplier_techattach";
+            comName = "supplier_comattach";
+        } else if (formBillno.contains("decision")) {
+            tecName = "techfile_new";
+            comName = "commfile_new";
+        } else if (formBillno.contains("bidopen")) {
+            tecName = "supplier_techattach";
+            comName = "supplier_comattach";
+        }
+
+        DynamicObjectCollection supplierTechattachCol;
+        if ("TECHNICAL".equals(evalType)) {
+            supplierTechattachCol = supplierEntry.getDynamicObjectCollection(tecName);
+            if (!supplierTechattachCol.isEmpty()) {
+                supplierTechattachCol.forEach((attachment) -> {
+                    DynamicObject fileFbasedataid = attachment.getDynamicObject("fbasedataid");
+                    if (fileFbasedataid != null) {
+                        Long o = (Long)fileFbasedataid.get("id");
+                        attachmentIds.add(o);
+                    }
+
+                });
+            }
+        } else if ("BUSSINESS".equals(evalType)) {
+            supplierTechattachCol = supplierEntry.getDynamicObjectCollection(comName);
+            if (!supplierTechattachCol.isEmpty()) {
+                supplierTechattachCol.forEach((attachment) -> {
+                    DynamicObject fileFbasedataid = attachment.getDynamicObject("fbasedataid");
+                    if (fileFbasedataid != null) {
+                        Long o = (Long)fileFbasedataid.get("id");
+                        attachmentIds.add(o);
+                    }
+
+                });
+            }
+        } else if ("MULTI".equals(evalType)) {
+            supplierTechattachCol = supplierEntry.getDynamicObjectCollection(tecName);
+            if (!supplierTechattachCol.isEmpty()) {
+                supplierTechattachCol.forEach((attachment) -> {
+                    DynamicObject fileFbasedataid = attachment.getDynamicObject("fbasedataid");
+                    if (fileFbasedataid != null) {
+                        Long o = (Long)fileFbasedataid.get("id");
+                        attachmentIds.add(o);
+                    }
+
+                });
+            }
+
+            DynamicObjectCollection supplierComattachCol = supplierEntry.getDynamicObjectCollection(comName);
+            if (!supplierComattachCol.isEmpty()) {
+                supplierComattachCol.forEach((attachment) -> {
+                    DynamicObject fileFbasedataid = attachment.getDynamicObject("fbasedataid");
+                    if (fileFbasedataid != null) {
+                        Long o = (Long)fileFbasedataid.get("id");
+                        attachmentIds.add(o);
+                    }
+
+                });
+            }
+        }
+
+        String entityName = "bid_project";
+        if (formBillno.contains("rebm")) {
+            entityName = "rebm_project";
+        }
+
+        if (formBillno.contains("bidopen")) {
+            DynamicObject bidProject = BusinessDataServiceHelper.loadSingle(bidprojectId, entityName);
+            String doctype = bidProject.getString("doctype");
+            if ("BUSSINESS".equals(doctype) || "TECHNICAL".equals(evalType) || "MULTI".equals(evalType)) {
+                DynamicObjectCollection tenAttach = supplierEntry.getDynamicObjectCollection("supplier_tenattach");
+                DynamicObjectCollection otherAttach = supplierEntry.getDynamicObjectCollection("supplier_otherattach");
+                if (!tenAttach.isEmpty()) {
+                    tenAttach.forEach((attachment) -> {
+                        DynamicObject fileFbasedataid = attachment.getDynamicObject("fbasedataid");
+                        if (fileFbasedataid != null) {
+                            Long o = (Long)fileFbasedataid.get("id");
+                            attachmentIds.add(o);
+                        }
+
+                    });
+                }
+
+                if (!otherAttach.isEmpty()) {
+                    otherAttach.forEach((attachment) -> {
+                        DynamicObject fileFbasedataid = attachment.getDynamicObject("fbasedataid");
+                        if (fileFbasedataid != null) {
+                            Long o = (Long)fileFbasedataid.get("id");
+                            attachmentIds.add(o);
+                        }
+
+                    });
+                }
+            }
+        }
+
+    }
+
+    public static String fileZipName(Object bidprojectId, String sectionName, String supplierName, String formBillno, Object formId, String appid) {
+        String projectName;
+        if ("bid".equals(appid)) {
+            projectName = "bid_project";
+        } else {
+            projectName = "rebm_project";
+        }
+
+        DynamicObject bidProject = BusinessDataServiceHelper.loadSingle(bidprojectId, projectName);
+        String billnoProject = bidProject.getString("billno");
+        if (sectionName.length() > 20) {
+            sectionName = sectionName.substring(0, 20);
+        }
+
+        String formName = formBillno;
+        String fileZipName = "";
+        fileZipName = billnoProject + sectionName + supplierName + formName;
+        fileZipName = String.format(ResManager.loadKDString("%s附件", "BidFileDownLoadNameUtil_0", "scm-bid-common", new Object[0]), fileZipName);
+        if (fileZipName.length() > 255) {
+            fileZipName = formName.substring(0, 255);
+        }
+
+        return fileZipName;
+    }
+
+}

+ 33 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ExportentryPlugin.java

@@ -0,0 +1,33 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.form.plugin.BeforeExportEntryEvent;
+import kd.bos.form.plugin.IExportEntryPlugin;
+
+import java.util.List;
+
+
+/**
+ * @author duanyuqi
+ * @date 2025-12-03
+ * @desc
+ * 央国企人事云》国资报表ext》单据》数据填报
+ * 干预导出数据
+ * nckd_sjtbrw
+ */
+public class ExportentryPlugin implements kd.bos.form.plugin.IExportEntryPlugin {
+
+    @Override
+    public void beforeExportEntry(BeforeExportEntryEvent bee) {
+        List<Object> rowData = bee.getRowData();
+        for (int i = 0; i < rowData.size(); i++) {
+            if (rowData.get(i) != null && rowData.get(i) instanceof String) {
+                String txt = String.valueOf(rowData.get(i));
+                if (txt.contains("person.")) {
+                    rowData.set(i, txt.replace("person.", ""));
+                }
+            }
+        }
+        IExportEntryPlugin.super.beforeExportEntry(bee);
+    }
+}

+ 127 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ImportentryPlugin.java

@@ -0,0 +1,127 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.datamodel.BasedataItem;
+import kd.bos.entity.datamodel.events.QueryImportBasedataEventArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.form.plugin.BeforeExportEntryEvent;
+import kd.bos.form.plugin.IExportEntryPlugin;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * @author duanyuqi
+ * @date 2025-12-03
+ * @desc
+ * 央国企人事云》国资报表ext》单据》数据填报
+ * 干预导出数据
+ * nckd_sjtbrw
+ */
+public class ImportentryPlugin extends AbstractFormPlugin {
+
+
+    @Override
+    public void queryImportBasedata(QueryImportBasedataEventArgs e) {
+        Map<BasedataItem, List<Object>> searchResult = e.getSearchResult();
+        for (Map.Entry<BasedataItem, List<Object>> entry : searchResult.entrySet()) {
+            BasedataItem basedataItem = entry.getKey();
+            String fieldKey = basedataItem.getFieldKey();
+            List<Object> basedata = entry.getValue();
+            if (basedata.isEmpty()) { // 查不到基础资料数据
+                if ("nckd_fyhdata".equals(fieldKey)) { // 企业负责人履职待遇、业务支出和社会保险统计表  人员
+                    basedata.add(getUserDepempId(basedataItem));
+                } else if ("nckd_dxmdata".equals(fieldKey)) {// 各级单位职工收入情况统计表  人员
+                    basedata.add(getUserDepempId(basedataItem));
+                }
+            } else {
+                // 查到多个基础资料数据
+                if (basedata.size() > 1) {
+                    // 业务场景,应根据需求剔除不合法的基础资料数据(最终保留一个)
+                    List<Object> basedata_new = new ArrayList<Object>();
+                    if ("nckd_fzzdata".equals(fieldKey)) { // 企业负责人履职待遇、业务支出和社会保险统计表  单位名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_gzzdata".equals(fieldKey)) { // 各级单位劳动情况统计表  单位名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_dzqydwdata".equals(fieldKey)) { // 各级单位职工收入情况统计表  子企业单位名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_dbmbadata".equals(fieldKey)) { // 各级单位职工收入情况统计表  部门
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_dgw".equals(fieldKey)) { // 各级单位职工收入情况统计表  岗位
+                        basedata_new.add(getPositionhrId(basedataItem, basedata));
+                    } else if ("nckd_czzdata".equals(fieldKey)) { // 各级单位人工成本统计表  子企业单位名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_bssjtdata".equals(fieldKey)) { // 各级单位参股企业信息统计表  所属集团注册名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_bcgqydata".equals(fieldKey)) { // 各级单位参股企业信息统计表  参股企业单位名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_bsssjqydata".equals(fieldKey)) { // 各级单位参股企业信息统计表  所属上级企业名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_ajtzcdata".equals(fieldKey)) { // 各级单位信息统计表  所属集团注册名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_azqydwdata".equals(fieldKey)) { // 各级单位信息统计表  子企业单位名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else if ("nckd_asjqydata".equals(fieldKey)) { // 各级单位信息统计表  所属上级企业名称
+                        basedata_new.add(getOrgHrId(basedataItem, basedata));
+                    } else {
+                        basedata_new.add(basedata.get(0));
+                    }
+                    entry.setValue(basedata_new);
+                }
+            }
+        }
+    }
+
+    public Object getUserDepempId(BasedataItem basedataItem) {
+        Object userDepempId = 0L;
+        String searchValue = basedataItem.getSearchValue();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("person.number", "=", searchValue));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObject dynamicObject = QueryServiceHelper.queryOne("hrpi_depemp", "id,person.id", filtersQuery);
+        if (dynamicObject != null) {
+            userDepempId = dynamicObject.getLong("id");
+        }
+        return userDepempId;
+    }
+
+    public Object getOrgHrId(BasedataItem basedataItem, List<Object> basedata) {
+        Object orgHrId = 0L;
+        Object[] basedataArray = basedata.toArray();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("id", "in", basedataArray));
+        qfilter.add(new QFilter("iscurrentversion", "=", "1"));
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObject dynamicObject = QueryServiceHelper.queryOne("haos_adminorghr", "id,number,name", filtersQuery);
+        if (dynamicObject != null) {
+            orgHrId = dynamicObject.getLong("id");
+        } else {
+            orgHrId = basedata.get(0);
+        }
+        return orgHrId;
+    }
+
+    public Object getPositionhrId(BasedataItem basedataItem, List<Object> basedata) {
+        Object positionhrId = 0L;
+        Object[] basedataArray = basedata.toArray();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("id", "in", basedataArray));
+        qfilter.add(new QFilter("iscurrentversion", "=", "1"));
+        qfilter.add(new QFilter("datastatus", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObject dynamicObject = QueryServiceHelper.queryOne("hbpm_positionhr", "id,number,name", filtersQuery);
+        if (dynamicObject != null) {
+            positionhrId = dynamicObject.getLong("id");
+        } else {
+            positionhrId = basedata.get(0);
+        }
+        return positionhrId;
+    }
+
+}

+ 726 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/PushSjcjDataUtils.java

@@ -0,0 +1,726 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.CloneUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.StringUtils;
+import kd.bos.login.utils.DateUtils;
+import kd.bos.message.api.MessageChannels;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.workflow.MessageCenterServiceHelper;
+import kd.bos.web.actions.utils.FilePathUtil;
+import kd.bos.workflow.engine.msg.info.MessageInfo;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URLDecoder;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**数据采集单据工具类*/
+public class PushSjcjDataUtils {
+
+    /**推送消息*/
+    public static void savePushBillMsg (DynamicObject dynamicObject, List<Long> receivers) {
+        Date nckd_ssny = dynamicObject.getDate("nckd_ssny");// 所属年月
+        String ssnyStr = DateUtils.formatDate(nckd_ssny, "yyyy年MM月");
+        Date nckd_tbjzsj = dynamicObject.getDate("nckd_tbjzsj");// 填报截止时间
+        String nckd_tbjzsjStr = DateUtils.formatDate(nckd_tbjzsj, "yyyy年MM月dd日");
+        String billname = dynamicObject.getString("nckd_billname");// 任务名称
+        String title = billname+"填报通知";
+        String content = "请尽快完成"+ssnyStr+"的数据填报任务,截止时间为:"+nckd_tbjzsjStr;
+        String senderName = RequestContext.get().getUserName();
+        MessageInfo message = new MessageInfo();
+        message.setType(MessageInfo.TYPE_MESSAGE);//推送消息的类型
+        StringBuilder notifyType = new StringBuilder();
+        notifyType.append(MessageChannels.MC);
+        notifyType.append(MessageChannels.YUNZHIJIA);
+        message.setNotifyType(notifyType.toString());
+        message.setTitle(title);
+        message.setUserIds(receivers);//接收用户
+        message.setSenderName(senderName);
+        message.setContent(content);//详情消息描述
+        MessageCenterServiceHelper.sendMessage(message);//推送消息
+    }
+
+    /**推送消息*/
+    public static void savePushDelBillMsg (DynamicObject dynamicObject, List<Long> receivers) {
+        Date nckd_ssny = dynamicObject.getDate("nckd_ssny");// 所属年月
+        String ssnyStr = DateUtils.formatDate(nckd_ssny, "yyyy年MM月");
+        //Date nckd_tbjzsj = dynamicObject.getDate("nckd_tbjzsj");// 填报截止时间
+        String billname = dynamicObject.getString("nckd_billname");// 任务名称
+        String title = billname+"作废通知";
+        String content = ssnyStr+"的数据填报任务已作废";
+        String senderName = RequestContext.get().getUserName();
+        MessageInfo message = new MessageInfo();
+        message.setType(MessageInfo.TYPE_MESSAGE);//推送消息的类型
+        StringBuilder notifyType = new StringBuilder();
+        notifyType.append(MessageChannels.MC);
+        notifyType.append(MessageChannels.YUNZHIJIA);
+        message.setNotifyType(notifyType.toString());
+        message.setTitle(title);
+        message.setUserIds(receivers);//接收用户
+        message.setSenderName(senderName);
+        message.setContent(content);//详情消息描述
+        MessageCenterServiceHelper.sendMessage(message);//推送消息
+    }
+
+    /**推送消息*/
+    public static void savePushCuiBanMsg (DynamicObject dynamicObject, List<Long> receivers) {
+        Date nckd_ssny = dynamicObject.getDate("nckd_tbsjny");// 所属年月
+        String ssnyStr = DateUtils.formatDate(nckd_ssny, "yyyy年MM月");
+        Date nckd_tbjzsj = dynamicObject.getDate("nckd_tbjzrq");// 填报截止时间
+        String nckd_tbjzsjStr = DateUtils.formatDate(nckd_tbjzsj, "yyyy年MM月dd日");
+        String billname = dynamicObject.getString("nckd_rwmc");// 任务名称
+        String title = billname+"催办通知";
+        String content = "请尽快完成"+ssnyStr+"的数据填报任务,截止时间为:"+nckd_tbjzsjStr;
+        String senderName = RequestContext.get().getUserName();
+        MessageInfo message = new MessageInfo();
+        message.setType(MessageInfo.TYPE_MESSAGE);//推送消息的类型
+        StringBuilder notifyType = new StringBuilder();
+        notifyType.append(MessageChannels.MC);
+        notifyType.append(MessageChannels.YUNZHIJIA);
+        message.setNotifyType(notifyType.toString());
+        message.setTitle(title);
+        message.setUserIds(receivers);//接收用户
+        message.setSenderName(senderName);
+        message.setContent(content);//详情消息描述
+        MessageCenterServiceHelper.sendMessage(message);//推送消息
+    }
+
+    /**生成填报任务单据*/
+    public static void savePushBillData(DynamicObject sjcjObject, DynamicObject sjcjObjectEntry) {
+        String billno = sjcjObject.getString("billno");// 数据采集编号
+        Long billid = sjcjObject.getLong("id");// 源单id
+        Date nckd_ssny = sjcjObject.getDate("nckd_ssny");// 所属年月
+        String billname = sjcjObject.getString("nckd_billname");// 任务名称
+        Date nckd_tbkssj = sjcjObject.getDate("nckd_tbkssj");// 填报开始时间
+        Date nckd_tbjzrq = sjcjObject.getDate("nckd_tbjzsj");// 填报截止时间
+        String nckd_sfjtxf = sjcjObject.getString("nckd_sfjtxf");// 是否初始下发
+        String nckd_remark = sjcjObject.getString("nckd_remark");// 描述
+
+        String nckd_dxbbmc = sjcjObjectEntry.getString("nckd_dxbbmc");// 填报报名称
+        DynamicObjectCollection nckd_tztbry = sjcjObjectEntry.getDynamicObjectCollection("nckd_tztbry");// 通知人员
+        DynamicObject nckd_tbxzzz = sjcjObjectEntry.getDynamicObject("nckd_tbxzzz");// 填报组织
+        DynamicObject sjtbTaskObject = BusinessDataServiceHelper.newDynamicObject("nckd_sjtbrw");
+        String sjtbBillNo = CodeRuleServiceHelper.getNumber("nckd_sjtbrw", sjtbTaskObject, null);
+        sjtbTaskObject.set("billno", sjtbBillNo);// 单据编号
+        sjtbTaskObject.set("billstatus", "A");// 暂存
+        sjtbTaskObject.set("nckd_rwmc", billname);
+        sjtbTaskObject.set("org", nckd_tbxzzz.getLong("id"));// 填报组织
+        sjtbTaskObject.set("nckd_bblx", "1");// 报表类型
+        sjtbTaskObject.set("nckd_tbsjny", nckd_ssny);// 数据填报年月
+
+        DynamicObjectCollection userColl = sjtbTaskObject.getDynamicObjectCollection("nckd_zrr");
+        for (DynamicObject user : nckd_tztbry) {
+            DynamicObject userObject = user.getDynamicObject("fbasedataId");
+            DynamicObject newUser = new DynamicObject(userColl.getDynamicObjectType());
+            newUser.set("fbasedataId", userObject);
+            userColl.add(newUser);
+        }
+        sjtbTaskObject.set("nckd_zrr", userColl);// 责任人
+
+        String nckd_ydcbm = billno + "!";// 源单长编码
+        if ("0".equals(nckd_sfjtxf)) {// 非集团下发
+            String nckd_ydcbm_sjcj = sjcjObject.getString("nckd_ydcbm");// 源单长编码
+            nckd_ydcbm = nckd_ydcbm_sjcj + billno + "!";
+        }
+        sjtbTaskObject.set("nckd_ydcbm", nckd_ydcbm);// 源单长编码
+        sjtbTaskObject.set("nckd_ydbh", billno);// 源单编号
+        sjtbTaskObject.set("nckd_ydpk", billid);// 源单ID
+        sjtbTaskObject.set("nckd_ydst", "nckd_sjcjrw");// 源单实体
+        sjtbTaskObject.set("nckd_sfyxscxjrw", "1");// 是否生成的填报任务0否1是
+        sjtbTaskObject.set("nckd_rwzt", "1");// 任务状态,待上报
+        sjtbTaskObject.set("nckd_asb", nckd_remark);// 描述
+        if (nckd_tbkssj != null) {
+            sjtbTaskObject.set("nckd_tbkssj", nckd_tbkssj);// 填报开始时间
+        }
+        sjtbTaskObject.set("nckd_tbjzrq", nckd_tbjzrq);// 填报截止日期
+        if (nckd_dxbbmc.contains(",1,")) {
+            sjtbTaskObject.set("nckd_zsba", "1");// 展示表a
+        } else {
+            sjtbTaskObject.set("nckd_zsba", "0");// 展示表a
+        }
+        if (nckd_dxbbmc.contains(",2,")) {
+            sjtbTaskObject.set("nckd_zsbb", "1");// 展示表b
+        } else {
+            sjtbTaskObject.set("nckd_zsbb", "0");// 展示表b
+        }
+        if (nckd_dxbbmc.contains(",3,")) {
+            sjtbTaskObject.set("nckd_zsbc", "1");// 展示表c
+        } else {
+            sjtbTaskObject.set("nckd_zsbc", "0");// 展示表c
+        }
+        if (nckd_dxbbmc.contains(",4,")) {
+            sjtbTaskObject.set("nckd_zsbd", "1");// 展示表d
+        } else {
+            sjtbTaskObject.set("nckd_zsbd", "0");// 展示表d
+        }
+        if (nckd_dxbbmc.contains(",5,")) {
+            sjtbTaskObject.set("nckd_zsbe", "1");// 展示表e
+        } else {
+            sjtbTaskObject.set("nckd_zsbe", "0");// 展示表e
+        }
+        if (nckd_dxbbmc.contains(",6,")) {
+            sjtbTaskObject.set("nckd_zsbf", "1");// 展示表f
+        } else {
+            sjtbTaskObject.set("nckd_zsbf", "0");// 展示表f
+        }
+        if (nckd_dxbbmc.contains(",7,")) {
+            sjtbTaskObject.set("nckd_zsbca", "1");// 展示表ca 财务表
+        } else {
+            sjtbTaskObject.set("nckd_zsbca", "0");// 展示表ca 财务表
+        }
+        if (nckd_dxbbmc.contains(",8,")) {
+            sjtbTaskObject.set("nckd_zsbcb", "1");// 展示表cb 人事表
+        } else {
+            sjtbTaskObject.set("nckd_zsbcb", "0");// 展示表cb 人事表
+        }
+        Object[] result = SaveServiceHelper.save(new DynamicObject[]{sjtbTaskObject});
+        DynamicObject dynamicObject = (DynamicObject) result[0];
+        Long sjtbTaskId = dynamicObject.getLong("id");
+
+        //通过AttachmentServiceHelper.getAttachments(formId, pkId, attachKey)获取源单据附件面板附件数据
+        List<Map<String, Object>> attachmentData = AttachmentServiceHelper.getAttachments("nckd_sjcjrw", billid, "attachmentpanel");
+        if (attachmentData.size() > 0) {
+            //调用AttachmentServiceHelper.upload(formId, pkId, attachKey,  attachments)将附件数据上传到目标附件面板
+            //AttachmentServiceHelper.upload("nckd_sjtbrw", sjtbTaskId, "nckd_atbsmfjmb", attachmentData);
+            AttachFileUtils.copyFileFromAToB("nckd_sjcjrw", billid, "attachmentpanel", "nckd_sjtbrw", sjtbTaskId, "nckd_atbsmfjmb");
+        }
+    }
+
+    /**获取文件服务器相对路径*/
+    public static String getPathfromDownloadUrl(String url) throws IOException {
+        String path = StringUtils.substringAfter(url, "path=");
+        path = URLDecoder.decode(path, "UTF-8");
+        return FilePathUtil.dealPath(path, "attach");
+    }
+
+    /**根据数据采集任务编号作废填报任务单据*/
+    public static void deleteSjtbBillData(DynamicObject sjcjrwObject) {
+        String billno = sjcjrwObject.getString("billno");
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("nckd_ydcbm", "like", billno+"!%"));
+        QFilter[] filters = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection xjtbrwObjects = QueryServiceHelper.query("nckd_sjtbrw", "id,billno", filters);
+        if (xjtbrwObjects.size() > 0) {
+            DynamicObject [] saveDynamicObjects = new DynamicObject[xjtbrwObjects.size()];
+            List<Long> receiverList = new ArrayList<Long>();
+            for (int i = 0; i < xjtbrwObjects.size(); i++) {
+                DynamicObject sjtbrw = xjtbrwObjects.get(i);
+                Long id = sjtbrw.getLong("id");
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(id, "nckd_sjtbrw");
+                dynamicObject.set("nckd_rwzt", "3");// 任务状态,作废
+                saveDynamicObjects[i] = dynamicObject;
+                DynamicObjectCollection nckd_zrr = dynamicObject.getDynamicObjectCollection("nckd_zrr");// 责任人
+                List<Long> receivers = nckd_zrr.stream().map(zrrObject -> zrrObject.getLong("fbasedataid.id")).collect(Collectors.toList());
+                receiverList.addAll(receivers);
+            }
+            SaveServiceHelper.save(saveDynamicObjects);
+            PushSjcjDataUtils.savePushDelBillMsg(sjcjrwObject, receiverList);
+        }
+    }
+
+    /**根据数据采集任务编号作废数据采集任务单据*/
+    public static void deleteSjcjBillData(DynamicObject sjcjrwObject) {
+        String billno = sjcjrwObject.getString("billno");
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("nckd_ydcbm", "like", billno+"!%"));
+        QFilter[] filters = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection xjtbrwObjects = QueryServiceHelper.query("nckd_sjcjrw", "id,billno", filters);
+        if (xjtbrwObjects.size() > 0) {
+            DynamicObject [] saveDynamicObjects = new DynamicObject[xjtbrwObjects.size()];
+            List<Long> receiverList = new ArrayList<Long>();
+            for (int i = 0; i < xjtbrwObjects.size(); i++) {
+                DynamicObject sjtbrw = xjtbrwObjects.get(i);
+                Long id = sjtbrw.getLong("id");
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(id, "nckd_sjcjrw");
+                dynamicObject.set("billstatus", "A");// 暂存
+                dynamicObject.set("nckd_sjzt", "1");// 已作废
+                saveDynamicObjects[i] = dynamicObject;
+                // 获取任务配置分录
+                DynamicObjectCollection dynamicObjectCollection = dynamicObject.getDynamicObjectCollection("nckd_sjcjrw_entry");
+                for (DynamicObject dynamicObjectEntry: dynamicObjectCollection) {
+                    DynamicObjectCollection nckd_tztbry = dynamicObjectEntry.getDynamicObjectCollection("nckd_tztbry");// 通知人员
+                    List<Long> receivers = nckd_tztbry.stream().map(tztbryObject -> tztbryObject.getLong("fbasedataid.id")).collect(Collectors.toList());
+                    receiverList.addAll(receivers);
+                }
+            }
+            SaveServiceHelper.save(saveDynamicObjects);
+            PushSjcjDataUtils.savePushDelBillMsg(sjcjrwObject, receiverList);
+        }
+    }
+
+    /**合并数据填报任务单据*/
+    public static boolean saveMergeSjtbBill (List<DynamicObject> dynamicObjectList) {
+        // 需要获取到任务名称等信息
+        DynamicObject firstObject = dynamicObjectList.get(0);
+        String nckd_bblx = firstObject.getString("nckd_bblx");// 1填报表2汇总表
+        String firstNckdYdpk = firstObject.getString("nckd_ydpk");// 源单ID
+        String firstNckdYdst = firstObject.getString("nckd_ydst");// 源单实体
+        String firstSourceBillName = "";
+        Long firstSourceOrgId = 0L;
+        Date firstNckdSsny = null;
+        Date firstSourceNckdTbkssj = null;
+        Date firstSourceNckdTbjzsj = null;
+        String firstSourceNckdMs = "";
+        DynamicObject sourceDynamicObject = null;
+        if ("nckd_sjtbrw".equals(firstNckdYdst)) {
+            if ("1".equals(nckd_bblx)) {// 填报表
+                sourceDynamicObject = BusinessDataServiceHelper.loadSingle(Long.valueOf(firstNckdYdpk), "nckd_sjtbrw");
+                firstSourceOrgId = sourceDynamicObject.getLong("org.id");// 填报组织
+                firstSourceBillName = sourceDynamicObject.getString("nckd_rwmc");// 任务名称
+                firstNckdSsny = sourceDynamicObject.getDate("nckd_tbsjny");// 所属年月
+                firstSourceNckdTbkssj = sourceDynamicObject.getDate("nckd_tbkssj");// 填报开始时间
+                firstSourceNckdTbjzsj = sourceDynamicObject.getDate("nckd_tbjzrq");// 填报截止时间
+                firstSourceNckdMs = sourceDynamicObject.getString("nckd_asb");// 描述
+            } else {// 汇总表
+                sourceDynamicObject = dynamicObjectList.get(0);
+                firstSourceOrgId = sourceDynamicObject.getLong("org.id");// 填报组织
+                firstSourceBillName = sourceDynamicObject.getString("nckd_rwmc");// 任务名称
+                firstNckdSsny = sourceDynamicObject.getDate("nckd_tbsjny");// 所属年月
+                firstSourceNckdTbkssj = sourceDynamicObject.getDate("nckd_tbkssj");// 填报开始时间
+                firstSourceNckdTbjzsj = sourceDynamicObject.getDate("nckd_tbjzrq");// 填报截止时间
+                firstSourceNckdMs = sourceDynamicObject.getString("nckd_asb");// 描述
+            }
+        } else {
+            sourceDynamicObject = BusinessDataServiceHelper.loadSingle(Long.valueOf(firstNckdYdpk), "nckd_sjcjrw");
+            firstSourceOrgId = sourceDynamicObject.getLong("org.id");// 人事管理组织
+            firstSourceBillName = sourceDynamicObject.getString("nckd_billname");// 单据名称
+            firstSourceNckdTbkssj = sourceDynamicObject.getDate("nckd_tbkssj");// 填报开始时间
+            firstSourceNckdTbjzsj = sourceDynamicObject.getDate("nckd_tbjzsj");// 填报截止时间
+            firstSourceNckdMs = sourceDynamicObject.getString("nckd_remark");// 描述
+            firstNckdSsny = sourceDynamicObject.getDate("nckd_ssny");// 所属年月
+        }
+
+        // 新建汇总单据
+        DynamicObject sjhzTaskObject = BusinessDataServiceHelper.newDynamicObject("nckd_sjtbrw");
+        String sjhzBillNo = CodeRuleServiceHelper.getNumber("nckd_sjtbrw", sjhzTaskObject, null);
+        sjhzTaskObject.set("billno", sjhzBillNo);// 单据编号
+        sjhzTaskObject.set("billstatus", "A");// 暂存
+        sjhzTaskObject.set("nckd_rwmc", firstSourceBillName);
+        sjhzTaskObject.set("org", firstSourceOrgId);// 填报组织
+        sjhzTaskObject.set("nckd_bblx", "2");// 报表类型
+        sjhzTaskObject.set("nckd_tbsjny", firstNckdSsny);// 数据填报年月
+        DynamicObjectCollection userColl = sjhzTaskObject.getDynamicObjectCollection("nckd_zrr");
+
+        DynamicObjectCollection firstSourceNckdZrr = new DynamicObjectCollection();
+        if ("nckd_sjtbrw".equals(firstNckdYdst)) {
+            firstSourceNckdZrr = sourceDynamicObject.getDynamicObjectCollection("nckd_zrr");// 责任人
+        } else {
+            DynamicObject userObject = sourceDynamicObject.getDynamicObject("creator");
+            //DynamicObject userObject = BusinessDataServiceHelper.loadSingle(userPkId, "bos_user");
+            DynamicObject newUser = new DynamicObject(userColl.getDynamicObjectType());
+            newUser.set("fbasedataId", userObject);
+            firstSourceNckdZrr.add(newUser);
+        }
+        for (DynamicObject user : firstSourceNckdZrr) {
+            DynamicObject userObject = user.getDynamicObject("fbasedataId");
+            DynamicObject newUser = new DynamicObject(userColl.getDynamicObjectType());
+            newUser.set("fbasedataId", userObject);
+            userColl.add(newUser);
+        }
+        sjhzTaskObject.set("nckd_zrr", userColl);// 责任人
+
+        String nckd_ydcbm = sjhzBillNo + "!";// 源单长编码
+        sjhzTaskObject.set("nckd_ydcbm", nckd_ydcbm);// 源单长编码
+        sjhzTaskObject.set("nckd_ydbh", "");// 源单编号
+        sjhzTaskObject.set("nckd_ydpk", "");// 源单ID
+        sjhzTaskObject.set("nckd_ydst", "nckd_sjtbrw");// 源单实体
+        sjhzTaskObject.set("nckd_sfyxscxjrw", "0");// 是否生成的填报任务0否1是
+        sjhzTaskObject.set("nckd_rwzt", "1");// 任务状态,待上报
+        if (firstSourceNckdTbkssj != null) {
+            sjhzTaskObject.set("nckd_tbkssj", firstSourceNckdTbkssj);// 填报开始时间
+        }
+        sjhzTaskObject.set("nckd_tbjzrq", firstSourceNckdTbjzsj);// 填报截止日期
+        sjhzTaskObject.set("nckd_asb", firstSourceNckdMs);// 描述
+        //sjhzTaskObject.set("nckd_zsba", "1");// 展示表a
+        sjhzTaskObject = saveMergeSjtbBillEntry(sjhzTaskObject, dynamicObjectList);
+        DynamicObject [] saveDynamicObjects = new DynamicObject[1];
+        saveDynamicObjects[0] = sjhzTaskObject;
+        Object[] resultObject = SaveServiceHelper.save(saveDynamicObjects);
+        // 正常汇总完成后,合并单位人工成本表财务表A与人事表B的数据
+        saveMergeRgcbtjb(resultObject[0]);
+        return true;
+    }
+
+    /**合并数据填报分录*/
+    public static DynamicObject saveMergeSjtbBillEntry(DynamicObject sjhzTaskObject, List<DynamicObject> dynamicObjectList) {
+        DynamicObject [] saveSourceDynamicObjects = new DynamicObject[dynamicObjectList.size()];
+        List<String>  sourceBillNoList = new ArrayList<String>();
+        for (int i = 0;i < dynamicObjectList.size(); i++) {
+            DynamicObject dynamicObject = dynamicObjectList.get(i);
+            dynamicObject.set("nckd_rwzt", "5");
+            saveSourceDynamicObjects[i] = dynamicObject;
+            sourceBillNoList.add(dynamicObject.getString("billno"));
+            // 各级单位信息统计表
+            DynamicObjectCollection nckdGjdwtjbentry = dynamicObject.getDynamicObjectCollection("nckd_gjdwtjbentry");
+            if (nckdGjdwtjbentry.size() > 0) {
+                sjhzTaskObject.set("nckd_zsba", "1");// 展示表a
+                sjhzTaskObject = saveMergeEntry(sjhzTaskObject, nckdGjdwtjbentry, "nckd_gjdwtjbentry");
+            }
+            // 各级单位参股企业信息统计表
+            DynamicObjectCollection nckdGjdwcgqyxxtjb = dynamicObject.getDynamicObjectCollection("nckd_dwcgxxentry");
+            if (nckdGjdwcgqyxxtjb.size() > 0) {
+                sjhzTaskObject.set("nckd_zsbb", "1");// 展示表b
+                sjhzTaskObject = saveMergeEntry(sjhzTaskObject, nckdGjdwcgqyxxtjb, "nckd_dwcgxxentry");
+            }
+            // 各级单位人工成本统计表
+            DynamicObjectCollection nckdDwrgcbentry = dynamicObject.getDynamicObjectCollection("nckd_dwrgcbentry");
+            if (nckdDwrgcbentry.size() > 0) {
+                sjhzTaskObject.set("nckd_zsbc", "1");// 展示表c
+                sjhzTaskObject = saveMergeEntry(sjhzTaskObject, nckdDwrgcbentry, "nckd_dwrgcbentry");
+            }
+            // 各级单位职工收入情况统计表
+            DynamicObjectCollection nckdDwzgsrentry = dynamicObject.getDynamicObjectCollection("nckd_dwzgsrentry");
+            if (nckdDwzgsrentry.size() > 0) {
+                sjhzTaskObject.set("nckd_zsbd", "1");// 展示表d
+                sjhzTaskObject = saveMergeEntry(sjhzTaskObject, nckdDwzgsrentry, "nckd_dwzgsrentry");
+            }
+
+            // 各级单位劳动情况统计表
+            DynamicObjectCollection nckdDwldqkentry = dynamicObject.getDynamicObjectCollection("nckd_dwldqkentry");
+            if (nckdDwldqkentry.size() > 0) {
+                sjhzTaskObject.set("nckd_zsbe", "1");// 展示表e
+                sjhzTaskObject = saveMergeEntry(sjhzTaskObject, nckdDwldqkentry, "nckd_dwldqkentry");
+            }
+
+            // 企业负责人履职待遇、业务支出和社会保险统计表
+            DynamicObjectCollection nckdDwdybxentry = dynamicObject.getDynamicObjectCollection("nckd_dwdybxentry");
+            if (nckdDwdybxentry.size() > 0) {
+                sjhzTaskObject.set("nckd_zsbf", "1");// 展示表f
+                sjhzTaskObject = saveMergeEntry(sjhzTaskObject, nckdDwdybxentry, "nckd_dwdybxentry");
+            }
+
+            // 各级单位人工成本统计表-财务
+            DynamicObjectCollection nckdDwrgcbentrycw = dynamicObject.getDynamicObjectCollection("nckd_dwrgcbentrycw");
+            if (nckdDwrgcbentrycw.size() > 0) {
+                sjhzTaskObject.set("nckd_zsbca", "1");// 展示表ca
+                sjhzTaskObject = saveMergeEntry(sjhzTaskObject, nckdDwrgcbentrycw, "nckd_dwrgcbentrycw");
+            }
+
+            // 各级单位人工成本统计表-人事
+            DynamicObjectCollection nckdDwrgcbentryrs = dynamicObject.getDynamicObjectCollection("nckd_dwrgcbentryrs");
+            if (nckdDwrgcbentryrs.size() > 0) {
+                sjhzTaskObject.set("nckd_zsbcb", "1");// 展示表cb
+                sjhzTaskObject = saveMergeEntry(sjhzTaskObject, nckdDwrgcbentryrs, "nckd_dwrgcbentryrs");
+            }
+        }
+        // 更改源单任务状态
+        SaveServiceHelper.save(saveSourceDynamicObjects);
+        //获取单据体对象并绑定源单单据编号
+        DynamicObjectCollection dynamicObjects = (DynamicObjectCollection) sjhzTaskObject.get("nckd_glsjtbrw");
+        for (String billNo : sourceBillNoList) {
+            //创建一条单据体数据
+            DynamicObject dynamicObjectEntry = dynamicObjects.addNew();
+            dynamicObjectEntry.set("nckd_hzbh", billNo);
+        }
+        return sjhzTaskObject;
+    }
+
+    /**分录表合并*/
+    public static DynamicObject saveMergeEntry(DynamicObject sjhzTaskObject, DynamicObjectCollection nckdGjdwtjbentry, String entryName) {
+        CloneUtils cloneUtils = new CloneUtils(false, true);
+        DynamicObjectCollection sjtbEntryCollection = (DynamicObjectCollection) sjhzTaskObject.get(entryName);
+        for (DynamicObject dynamicObject : nckdGjdwtjbentry) {
+            DynamicObject sjtbEntry = (DynamicObject) cloneUtils.clone(dynamicObject);
+            sjtbEntryCollection.add(sjtbEntry);
+        }
+        return sjhzTaskObject;
+    }
+
+    /**删除汇总表,将所有绑定的单据的任务状态改为已上报*/
+    public static boolean deleteSjcjHzBill(Object pkValue) {
+        List<QFilter> qfilterQuery = new ArrayList<QFilter>();
+        qfilterQuery.add(new QFilter("id", "=", pkValue));
+        QFilter[] filtersQuery = (QFilter[]) qfilterQuery.toArray(new QFilter[qfilterQuery.size()]);
+        DynamicObjectCollection sourceObjects =  QueryServiceHelper.query("nckd_sjtbrw", "id,nckd_glsjtbrw.nckd_hzbh", filtersQuery);
+        String[] billNos = new String[sourceObjects.size()];
+        for (int i = 0; i < sourceObjects.size(); i++) {
+            billNos[i] = sourceObjects.get(i).getString("nckd_glsjtbrw.nckd_hzbh");
+        }
+
+        List<QFilter> qfilterSave = new ArrayList<QFilter>();
+        qfilterSave.add(new QFilter("billno", "in", billNos));
+        QFilter[] filtersSave = (QFilter[]) qfilterSave.toArray(new QFilter[qfilterSave.size()]);
+        DynamicObject[] dynamicObject = BusinessDataServiceHelper.load("nckd_sjtbrw", "id,billno,billstatus,nckd_rwzt", filtersSave);
+        for (int i = 0; i < dynamicObject.length; i++) {
+            dynamicObject[i].set("nckd_rwzt", "2");
+        }
+        SaveServiceHelper.save(dynamicObject);
+        return true;
+    }
+
+    /**合并人工成本统计表-1*/
+    public static void saveMergeRgcbtjb(Object objectData) {
+        boolean isUpdate = false;
+        DynamicObject dynamicObject = (DynamicObject) objectData;
+        Map<Long, SjtbRgcbtjVO> rgcbtjMap = new LinkedHashMap<Long, SjtbRgcbtjVO>();
+        // 各级单位人工成本统计表
+        DynamicObjectCollection nckdDwrgcbentry = dynamicObject.getDynamicObjectCollection("nckd_dwrgcbentry");
+        if (nckdDwrgcbentry.size() > 0) {
+            for (DynamicObject dynamicObjectEntry : nckdDwrgcbentry) {
+                Long nckd_czzdata = dynamicObjectEntry.getLong("nckd_czzdata.id");
+                SjtbRgcbtjVO sjtbRgcbtjVO = new SjtbRgcbtjVO();
+                sjtbRgcbtjVO.setDataId(dynamicObjectEntry.getLong("id"));
+                sjtbRgcbtjVO.setNckd_ctjny(dynamicObjectEntry.getDate("nckd_ctjny"));
+                sjtbRgcbtjVO.setNckd_czqyxxdm(dynamicObjectEntry.getString("nckd_czqyxxdm"));
+                sjtbRgcbtjVO.setNckd_czzdata(nckd_czzdata);
+                sjtbRgcbtjVO.setNckd_clrzeys(dynamicObjectEntry.getBigDecimal("nckd_clrzeys"));
+                sjtbRgcbtjVO.setNckd_crgcbys(dynamicObjectEntry.getBigDecimal("nckd_crgcbys"));
+                sjtbRgcbtjVO.setNckd_cgzzeys(dynamicObjectEntry.getBigDecimal("nckd_cgzzeys"));
+                sjtbRgcbtjVO.setNckd_cyysr(dynamicObjectEntry.getBigDecimal("nckd_cyysr"));
+                sjtbRgcbtjVO.setNckd_clrze(dynamicObjectEntry.getBigDecimal("nckd_clrze"));
+                sjtbRgcbtjVO.setNckd_cldsczz(dynamicObjectEntry.getBigDecimal("nckd_cldsczz"));
+                sjtbRgcbtjVO.setNckd_cyyzcb(dynamicObjectEntry.getBigDecimal("nckd_cyyzcb"));
+                sjtbRgcbtjVO.setNckd_crgcb(dynamicObjectEntry.getBigDecimal("nckd_crgcb"));
+                sjtbRgcbtjVO.setNckd_cgzze(dynamicObjectEntry.getBigDecimal("nckd_cgzze"));
+                sjtbRgcbtjVO.setNckd_cshbx(dynamicObjectEntry.getBigDecimal("nckd_cshbx"));
+                sjtbRgcbtjVO.setNckd_czfgjj(dynamicObjectEntry.getBigDecimal("nckd_czfgjj"));
+                sjtbRgcbtjVO.setNckd_czfbt(dynamicObjectEntry.getBigDecimal("nckd_czfbt"));
+                sjtbRgcbtjVO.setNckd_cqynj(dynamicObjectEntry.getBigDecimal("nckd_cqynj"));
+                sjtbRgcbtjVO.setNckd_cbcyl(dynamicObjectEntry.getBigDecimal("nckd_cbcyl"));
+                sjtbRgcbtjVO.setNckd_cflfy(dynamicObjectEntry.getBigDecimal("nckd_cflfy"));
+                sjtbRgcbtjVO.setNckd_cldbhf(dynamicObjectEntry.getBigDecimal("nckd_cldbhf"));
+                sjtbRgcbtjVO.setNckd_cgfzc(dynamicObjectEntry.getBigDecimal("nckd_cgfzc"));
+                sjtbRgcbtjVO.setNckd_cqtrgcb(dynamicObjectEntry.getBigDecimal("nckd_cqtrgcb"));
+                sjtbRgcbtjVO.setNckd_clwpqf(dynamicObjectEntry.getBigDecimal("nckd_clwpqf"));
+                sjtbRgcbtjVO.setNckd_cpjzgs(dynamicObjectEntry.getBigDecimal("nckd_cpjzgs"));
+                sjtbRgcbtjVO.setNckd_cpjzgzgrs(dynamicObjectEntry.getBigDecimal("nckd_cpjzgzgrs"));
+                sjtbRgcbtjVO.setNckd_cpjcyrs(dynamicObjectEntry.getBigDecimal("nckd_cpjcyrs"));
+                sjtbRgcbtjVO.setNckd_cpjlwgrs(dynamicObjectEntry.getBigDecimal("nckd_cpjlwgrs"));
+                sjtbRgcbtjVO.setNckd_cpjlwpqrs(dynamicObjectEntry.getBigDecimal("nckd_cpjlwpqrs"));
+                sjtbRgcbtjVO.setNckd_crgcblrl(dynamicObjectEntry.getBigDecimal("nckd_crgcblrl"));
+                sjtbRgcbtjVO.setNckd_crsfyl(dynamicObjectEntry.getBigDecimal("nckd_crsfyl"));
+                sjtbRgcbtjVO.setNckd_cqyldscl(dynamicObjectEntry.getBigDecimal("nckd_cqyldscl"));
+                sjtbRgcbtjVO.setNckd_cgyzbzzl(dynamicObjectEntry.getBigDecimal("nckd_cgyzbzzl"));
+                sjtbRgcbtjVO.setType(0);
+                rgcbtjMap.put(nckd_czzdata, sjtbRgcbtjVO);
+            }
+        }
+        // 各级单位人工成本统计表-财务
+        DynamicObjectCollection nckdDwrgcbentrycw = dynamicObject.getDynamicObjectCollection("nckd_dwrgcbentrycw");
+        if (nckdDwrgcbentrycw.size() > 0) {
+            for (DynamicObject dynamicObjectEntry : nckdDwrgcbentrycw) {
+                Long nckd_czzdata = dynamicObjectEntry.getLong("nckd_cazzdata.id");
+                SjtbRgcbtjVO sjtbRgcbtjVO = new SjtbRgcbtjVO();
+                if (rgcbtjMap.get(nckd_czzdata) != null) {
+                    sjtbRgcbtjVO = rgcbtjMap.get(nckd_czzdata);
+                } else {
+                    sjtbRgcbtjVO.setDataId(0L);
+                }
+                sjtbRgcbtjVO.setCwRow(dynamicObjectEntry.getInt("seq"));
+                sjtbRgcbtjVO.setNckd_ctjny(dynamicObjectEntry.getDate("nckd_catjny"));
+                sjtbRgcbtjVO.setNckd_czqyxxdm(dynamicObjectEntry.getString("nckd_cazqyxxdm"));
+                sjtbRgcbtjVO.setNckd_czzdata(nckd_czzdata);
+                sjtbRgcbtjVO.setNckd_clrzeys(dynamicObjectEntry.getBigDecimal("nckd_calrzeys"));
+                sjtbRgcbtjVO.setNckd_crgcbys(dynamicObjectEntry.getBigDecimal("nckd_cargcbys"));
+                sjtbRgcbtjVO.setNckd_cgzzeys(dynamicObjectEntry.getBigDecimal("nckd_cagzzeys"));
+                sjtbRgcbtjVO.setNckd_cyysr(dynamicObjectEntry.getBigDecimal("nckd_cayysr"));
+                sjtbRgcbtjVO.setNckd_clrze(dynamicObjectEntry.getBigDecimal("nckd_calrze"));
+                sjtbRgcbtjVO.setNckd_cldsczz(dynamicObjectEntry.getBigDecimal("nckd_caldsczz"));
+                sjtbRgcbtjVO.setNckd_cyyzcb(dynamicObjectEntry.getBigDecimal("nckd_cayyzcb"));
+                sjtbRgcbtjVO.setNckd_crgcb(dynamicObjectEntry.getBigDecimal("nckd_cargcb"));
+                sjtbRgcbtjVO.setNckd_cgzze(dynamicObjectEntry.getBigDecimal("nckd_cagzze"));
+                sjtbRgcbtjVO.setNckd_cshbx(dynamicObjectEntry.getBigDecimal("nckd_cashbx"));
+                sjtbRgcbtjVO.setNckd_czfgjj(dynamicObjectEntry.getBigDecimal("nckd_cazfgjj"));
+                sjtbRgcbtjVO.setNckd_czfbt(dynamicObjectEntry.getBigDecimal("nckd_cazfbt"));
+                sjtbRgcbtjVO.setNckd_cqynj(dynamicObjectEntry.getBigDecimal("nckd_caqynj"));
+                sjtbRgcbtjVO.setNckd_cbcyl(dynamicObjectEntry.getBigDecimal("nckd_cabcyl"));
+                sjtbRgcbtjVO.setNckd_cflfy(dynamicObjectEntry.getBigDecimal("nckd_caflfy"));
+                sjtbRgcbtjVO.setNckd_cldbhf(dynamicObjectEntry.getBigDecimal("nckd_caldbhf"));
+
+                sjtbRgcbtjVO.setNckd_cghjf(dynamicObjectEntry.getBigDecimal("nckd_caghjf"));
+                sjtbRgcbtjVO.setNckd_cjypxjf(dynamicObjectEntry.getBigDecimal("nckd_cajypxjf"));
+                sjtbRgcbtjVO.setNckd_cjsjcj(dynamicObjectEntry.getBigDecimal("nckd_cajsjcj"));
+                sjtbRgcbtjVO.setNckd_cctfl(dynamicObjectEntry.getBigDecimal("nckd_cactfl"));
+                sjtbRgcbtjVO.setNckd_cfhbfl(dynamicObjectEntry.getBigDecimal("nckd_cafhbfl"));
+
+                sjtbRgcbtjVO.setNckd_cgfzc(dynamicObjectEntry.getBigDecimal("nckd_cagfzc"));
+                sjtbRgcbtjVO.setNckd_cqtrgcb(dynamicObjectEntry.getBigDecimal("nckd_caqtrgcb"));
+                sjtbRgcbtjVO.setType(1);
+                rgcbtjMap.put(nckd_czzdata, sjtbRgcbtjVO);
+            }
+        }
+        // 各级单位人工成本统计表-人事
+        DynamicObjectCollection nckdDwrgcbentryrs = dynamicObject.getDynamicObjectCollection("nckd_dwrgcbentryrs");
+        if (nckdDwrgcbentryrs.size() > 0) {
+            for (DynamicObject dynamicObjectEntry : nckdDwrgcbentryrs) {
+                Long nckd_czzdata = dynamicObjectEntry.getLong("nckd_cbzzdata.id");
+                SjtbRgcbtjVO sjtbRgcbtjVO = new SjtbRgcbtjVO();
+                if (rgcbtjMap.get(nckd_czzdata) != null) {
+                    sjtbRgcbtjVO = rgcbtjMap.get(nckd_czzdata);
+                } else {
+                    sjtbRgcbtjVO.setDataId(0L);
+                }
+                sjtbRgcbtjVO.setRsRow(dynamicObjectEntry.getInt("seq"));
+                sjtbRgcbtjVO.setNckd_ctjny(dynamicObjectEntry.getDate("nckd_cbtjny"));
+                sjtbRgcbtjVO.setNckd_czqyxxdm(dynamicObjectEntry.getString("nckd_cbzqyxxdm"));
+                sjtbRgcbtjVO.setNckd_czzdata(nckd_czzdata);
+                sjtbRgcbtjVO.setNckd_cqtrgcb(dynamicObjectEntry.getBigDecimal("nckd_cbqtrgcb"));
+                sjtbRgcbtjVO.setNckd_clwpqf(dynamicObjectEntry.getBigDecimal("nckd_cblwpqf"));
+                sjtbRgcbtjVO.setNckd_cpjzgs(dynamicObjectEntry.getBigDecimal("nckd_cbpjzgs"));
+                sjtbRgcbtjVO.setNckd_cpjzgzgrs(dynamicObjectEntry.getBigDecimal("nckd_cbpjzgzgrs"));
+                sjtbRgcbtjVO.setNckd_cpjcyrs(dynamicObjectEntry.getBigDecimal("nckd_cbpjcyrs"));
+                sjtbRgcbtjVO.setNckd_cpjlwgrs(dynamicObjectEntry.getBigDecimal("nckd_cbpjlwgrs"));
+                sjtbRgcbtjVO.setNckd_cpjlwpqrs(dynamicObjectEntry.getBigDecimal("nckd_cbpjlwpqrs"));
+                sjtbRgcbtjVO.setType(1);
+                rgcbtjMap.put(nckd_czzdata, sjtbRgcbtjVO);
+            }
+        }
+        // 开始合并数据-处理旧数据
+        BigDecimal bfb = new BigDecimal("100");
+        Set<Long> oldEntrySet = new HashSet<Long>();
+        if (nckdDwrgcbentry.size() > 0) {
+            for (DynamicObject dynamicObjectEntry : nckdDwrgcbentry) {
+                Long nckd_czzdata = dynamicObjectEntry.getLong("nckd_czzdata.id");
+                if (rgcbtjMap.get(nckd_czzdata) != null) {
+                    oldEntrySet.add(nckd_czzdata);
+                    SjtbRgcbtjVO sjtbRgcbtjVO = rgcbtjMap.get(nckd_czzdata);
+                    if (sjtbRgcbtjVO.getType().intValue() == 0) {// 没有找到合并的来源记录
+                        continue;
+                    }
+                    BigDecimal cargcb = sjtbRgcbtjVO.getNckd_crgcb();// 人工成本
+                    BigDecimal calrze = sjtbRgcbtjVO.getNckd_clrze();// 利润总额
+                    BigDecimal cayysr = sjtbRgcbtjVO.getNckd_cyysr();// 营业总收入
+                    BigDecimal cldsczz = sjtbRgcbtjVO.getNckd_cldsczz();// 劳动生成总值
+                    BigDecimal cpjcyrs = sjtbRgcbtjVO.getNckd_cpjcyrs();// 平均从业人数
+                    if (calrze.compareTo(BigDecimal.ZERO) != 0) {
+                        //人工成本利润率=人工成本/利润总额
+                        BigDecimal crgcblrl = cargcb.divide(calrze, 9, BigDecimal.ROUND_HALF_UP).multiply(bfb);
+                        sjtbRgcbtjVO.setNckd_crgcblrl(crgcblrl);
+                    }
+                    if (cayysr.compareTo(BigDecimal.ZERO) != 0) {
+                        //人事费用率=人工成本/营业总收入
+                        BigDecimal crsfyl = cargcb.divide(cayysr, 9, BigDecimal.ROUND_HALF_UP).multiply(bfb);
+                        sjtbRgcbtjVO.setNckd_crsfyl(crsfyl);
+                    }
+                    if (cpjcyrs.compareTo(BigDecimal.ZERO) != 0) {
+                        //全员劳动生产率=劳动生产总值/平均从业人数
+                        BigDecimal cqyldscl = cldsczz.divide(cpjcyrs, 9, BigDecimal.ROUND_HALF_UP).multiply(bfb);
+                        sjtbRgcbtjVO.setNckd_cqyldscl(cqyldscl);
+                    }
+                    //dynamicObjectEntry.set("nckd_ctjny", sjtbRgcbtjVO.getNckd_ctjny());
+                    //dynamicObjectEntry.set("nckd_czqyxxdm", sjtbRgcbtjVO.getNckd_czqyxxdm());
+                    //dynamicObjectEntry.set("nckd_czzdata", sjtbRgcbtjVO.getNckd_czzdata());
+                    dynamicObjectEntry.set("nckd_crgcbys", sjtbRgcbtjVO.getNckd_crgcbys());
+                    dynamicObjectEntry.set("nckd_cgzzeys", sjtbRgcbtjVO.getNckd_cgzzeys());
+                    dynamicObjectEntry.set("nckd_cyysr", sjtbRgcbtjVO.getNckd_cyysr());
+                    dynamicObjectEntry.set("nckd_clrzeys", sjtbRgcbtjVO.getNckd_clrzeys());
+                    dynamicObjectEntry.set("nckd_clrze", sjtbRgcbtjVO.getNckd_clrze());
+                    dynamicObjectEntry.set("nckd_cldsczz", sjtbRgcbtjVO.getNckd_cldsczz());
+                    dynamicObjectEntry.set("nckd_cyyzcb", sjtbRgcbtjVO.getNckd_cyyzcb());
+                    dynamicObjectEntry.set("nckd_crgcb", sjtbRgcbtjVO.getNckd_crgcb());
+                    dynamicObjectEntry.set("nckd_cgzze", sjtbRgcbtjVO.getNckd_cgzze());
+                    dynamicObjectEntry.set("nckd_cshbx", sjtbRgcbtjVO.getNckd_cshbx());
+                    dynamicObjectEntry.set("nckd_czfgjj", sjtbRgcbtjVO.getNckd_czfgjj());
+                    dynamicObjectEntry.set("nckd_czfbt", sjtbRgcbtjVO.getNckd_czfbt());
+                    dynamicObjectEntry.set("nckd_cqynj", sjtbRgcbtjVO.getNckd_cqynj());
+                    dynamicObjectEntry.set("nckd_cbcyl", sjtbRgcbtjVO.getNckd_cbcyl());
+                    dynamicObjectEntry.set("nckd_cflfy", sjtbRgcbtjVO.getNckd_cflfy());
+                    dynamicObjectEntry.set("nckd_cldbhf", sjtbRgcbtjVO.getNckd_cldbhf());
+                    dynamicObjectEntry.set("nckd_cghjf", sjtbRgcbtjVO.getNckd_cghjf());
+                    dynamicObjectEntry.set("nckd_cjypxjf", sjtbRgcbtjVO.getNckd_cjypxjf());
+                    dynamicObjectEntry.set("nckd_cjsjcj", sjtbRgcbtjVO.getNckd_cjsjcj());
+                    dynamicObjectEntry.set("nckd_cctfl", sjtbRgcbtjVO.getNckd_cctfl());
+                    dynamicObjectEntry.set("nckd_cfhbfl", sjtbRgcbtjVO.getNckd_cfhbfl());
+                    dynamicObjectEntry.set("nckd_cgfzc", sjtbRgcbtjVO.getNckd_cgfzc());
+                    dynamicObjectEntry.set("nckd_cqtrgcb", sjtbRgcbtjVO.getNckd_cqtrgcb());
+                    dynamicObjectEntry.set("nckd_clwpqf", sjtbRgcbtjVO.getNckd_clwpqf());
+                    dynamicObjectEntry.set("nckd_cpjzgs", sjtbRgcbtjVO.getNckd_cpjzgs());
+                    dynamicObjectEntry.set("nckd_cpjzgzgrs", sjtbRgcbtjVO.getNckd_cpjzgzgrs());
+                    dynamicObjectEntry.set("nckd_cpjcyrs", sjtbRgcbtjVO.getNckd_cpjcyrs());
+                    dynamicObjectEntry.set("nckd_cpjlwgrs", sjtbRgcbtjVO.getNckd_cpjlwgrs());
+                    dynamicObjectEntry.set("nckd_cpjlwpqrs", sjtbRgcbtjVO.getNckd_cpjlwpqrs());
+                    dynamicObjectEntry.set("nckd_crgcblrl", sjtbRgcbtjVO.getNckd_crgcblrl());
+                    dynamicObjectEntry.set("nckd_crsfyl", sjtbRgcbtjVO.getNckd_crsfyl());
+                    dynamicObjectEntry.set("nckd_cqyldscl", sjtbRgcbtjVO.getNckd_cqyldscl());
+                    dynamicObjectEntry.set("nckd_cgyzbzzl", sjtbRgcbtjVO.getNckd_cgyzbzzl());
+                    dynamicObjectEntry.set("nckd_lycwh", sjtbRgcbtjVO.getCwRow());
+                    dynamicObjectEntry.set("nckd_lyrsh", sjtbRgcbtjVO.getRsRow());
+                    isUpdate = true;
+                }
+            }
+        }
+        // 开始合并数据-处理新增数据
+        Set<Long> keySet = rgcbtjMap.keySet();
+        for (Long key : keySet) {
+            if (oldEntrySet.contains(key)) {
+                continue;
+            }
+            DynamicObject dynamicObjectEntry = nckdDwrgcbentry.addNew();
+            SjtbRgcbtjVO sjtbRgcbtjVO = rgcbtjMap.get(key);
+            BigDecimal cargcb = sjtbRgcbtjVO.getNckd_crgcb();// 人工成本
+            BigDecimal calrze = sjtbRgcbtjVO.getNckd_clrze();// 利润总额
+            BigDecimal cayysr = sjtbRgcbtjVO.getNckd_cyysr();// 营业总收入
+            BigDecimal cldsczz = sjtbRgcbtjVO.getNckd_cldsczz();// 劳动生成总值
+            BigDecimal cpjcyrs = sjtbRgcbtjVO.getNckd_cpjcyrs();// 平均从业人数
+            if (calrze.compareTo(BigDecimal.ZERO) != 0) {
+                //人工成本利润率=人工成本/利润总额
+                BigDecimal crgcblrl = cargcb.divide(calrze, 9, BigDecimal.ROUND_HALF_UP).multiply(bfb);
+                sjtbRgcbtjVO.setNckd_crgcblrl(crgcblrl);
+            }
+            if (cayysr.compareTo(BigDecimal.ZERO) != 0) {
+                //人事费用率=人工成本/营业总收入
+                BigDecimal crsfyl = cargcb.divide(cayysr, 9, BigDecimal.ROUND_HALF_UP).multiply(bfb);
+                sjtbRgcbtjVO.setNckd_crsfyl(crsfyl);
+            }
+            if (cpjcyrs.compareTo(BigDecimal.ZERO) != 0) {
+                //全员劳动生产率=劳动生产总值/平均从业人数
+                BigDecimal cqyldscl = cldsczz.divide(cpjcyrs, 9, BigDecimal.ROUND_HALF_UP).multiply(bfb);
+                sjtbRgcbtjVO.setNckd_cqyldscl(cqyldscl);
+            }
+            dynamicObjectEntry.set("nckd_ctjny", sjtbRgcbtjVO.getNckd_ctjny());
+            dynamicObjectEntry.set("nckd_czqyxxdm", sjtbRgcbtjVO.getNckd_czqyxxdm());
+            dynamicObjectEntry.set("nckd_czzdata", sjtbRgcbtjVO.getNckd_czzdata());
+            dynamicObjectEntry.set("nckd_crgcbys", sjtbRgcbtjVO.getNckd_crgcbys());
+            dynamicObjectEntry.set("nckd_cgzzeys", sjtbRgcbtjVO.getNckd_cgzzeys());
+            dynamicObjectEntry.set("nckd_cyysr", sjtbRgcbtjVO.getNckd_cyysr());
+            dynamicObjectEntry.set("nckd_clrzeys", sjtbRgcbtjVO.getNckd_clrzeys());
+            dynamicObjectEntry.set("nckd_clrze", sjtbRgcbtjVO.getNckd_clrze());
+            dynamicObjectEntry.set("nckd_cldsczz", sjtbRgcbtjVO.getNckd_cldsczz());
+            dynamicObjectEntry.set("nckd_cyyzcb", sjtbRgcbtjVO.getNckd_cyyzcb());
+            dynamicObjectEntry.set("nckd_crgcb", sjtbRgcbtjVO.getNckd_crgcb());
+            dynamicObjectEntry.set("nckd_cgzze", sjtbRgcbtjVO.getNckd_cgzze());
+            dynamicObjectEntry.set("nckd_cshbx", sjtbRgcbtjVO.getNckd_cshbx());
+            dynamicObjectEntry.set("nckd_czfgjj", sjtbRgcbtjVO.getNckd_czfgjj());
+            dynamicObjectEntry.set("nckd_czfbt", sjtbRgcbtjVO.getNckd_czfbt());
+            dynamicObjectEntry.set("nckd_cqynj", sjtbRgcbtjVO.getNckd_cqynj());
+            dynamicObjectEntry.set("nckd_cbcyl", sjtbRgcbtjVO.getNckd_cbcyl());
+            dynamicObjectEntry.set("nckd_cflfy", sjtbRgcbtjVO.getNckd_cflfy());
+            dynamicObjectEntry.set("nckd_cldbhf", sjtbRgcbtjVO.getNckd_cldbhf());
+            dynamicObjectEntry.set("nckd_cghjf", sjtbRgcbtjVO.getNckd_cghjf());
+            dynamicObjectEntry.set("nckd_cjypxjf", sjtbRgcbtjVO.getNckd_cjypxjf());
+            dynamicObjectEntry.set("nckd_cjsjcj", sjtbRgcbtjVO.getNckd_cjsjcj());
+            dynamicObjectEntry.set("nckd_cctfl", sjtbRgcbtjVO.getNckd_cctfl());
+            dynamicObjectEntry.set("nckd_cfhbfl", sjtbRgcbtjVO.getNckd_cfhbfl());
+            dynamicObjectEntry.set("nckd_cgfzc", sjtbRgcbtjVO.getNckd_cgfzc());
+            dynamicObjectEntry.set("nckd_cqtrgcb", sjtbRgcbtjVO.getNckd_cqtrgcb());
+            dynamicObjectEntry.set("nckd_clwpqf", sjtbRgcbtjVO.getNckd_clwpqf());
+            dynamicObjectEntry.set("nckd_cpjzgs", sjtbRgcbtjVO.getNckd_cpjzgs());
+            dynamicObjectEntry.set("nckd_cpjzgzgrs", sjtbRgcbtjVO.getNckd_cpjzgzgrs());
+            dynamicObjectEntry.set("nckd_cpjcyrs", sjtbRgcbtjVO.getNckd_cpjcyrs());
+            dynamicObjectEntry.set("nckd_cpjlwgrs", sjtbRgcbtjVO.getNckd_cpjlwgrs());
+            dynamicObjectEntry.set("nckd_cpjlwpqrs", sjtbRgcbtjVO.getNckd_cpjlwpqrs());
+            dynamicObjectEntry.set("nckd_crgcblrl", sjtbRgcbtjVO.getNckd_crgcblrl());
+            dynamicObjectEntry.set("nckd_crsfyl", sjtbRgcbtjVO.getNckd_crsfyl());
+            dynamicObjectEntry.set("nckd_cqyldscl", sjtbRgcbtjVO.getNckd_cqyldscl());
+            dynamicObjectEntry.set("nckd_cgyzbzzl", sjtbRgcbtjVO.getNckd_cgyzbzzl());
+            dynamicObjectEntry.set("nckd_lycwh", sjtbRgcbtjVO.getCwRow());
+            dynamicObjectEntry.set("nckd_lyrsh", sjtbRgcbtjVO.getRsRow());
+            isUpdate = true;
+        }
+        if (isUpdate) {
+            dynamicObject.set("nckd_zsbc", "1");// 展示表c
+            DynamicObject [] saveDynamicObjects = new DynamicObject[1];
+            saveDynamicObjects[0] = dynamicObject;
+            SaveServiceHelper.save(saveDynamicObjects);
+        }
+    }
+}

+ 114 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjcjCheckFormListPlugin.java

@@ -0,0 +1,114 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.ConfirmTypes;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.login.utils.DateUtils;
+import kd.bos.message.api.MessageChannels;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
+import kd.bos.servicehelper.operation.DeleteServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.workflow.MessageCenterServiceHelper;
+import kd.bos.workflow.engine.msg.info.MessageInfo;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据采集
+ * 列表插件
+ * nckd_sjcjrw
+ * duanyuqi
+ */
+public class SjcjCheckFormListPlugin extends AbstractListPlugin {
+    private static final Log logger = LogFactory.getLog(SjcjCheckFormListPlugin.class);
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        FormOperate formOperate = (FormOperate)args.getSource();
+        ListSelectedRowCollection listRows = args.getListSelectedData(); // 获取列表选中行数据
+        int saveResult = 0;
+        String detail = "";
+        if (listRows.size() > 0) {
+            if ("nckd_fblbbtn".equals(formOperate.getOperateKey())) {// 发布
+                for (int i = 0; i < listRows.size(); i++) {
+                    ListSelectedRow listSelectedRow = listRows.get(i);
+                    Object pkValue = listSelectedRow.getPrimaryKeyValue();
+                    // 获取数据填报任务
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjcjrw");
+                    String nckd_sjzt = dynamicObject.getString("nckd_sjzt");// 数据状态
+                    if ("1".equals(nckd_sjzt)) { // 暂存
+                        savePushToNextBill(dynamicObject);
+                        dynamicObject.set("billstatus", "C");// 已审核
+                        dynamicObject.set("nckd_sjzt", "2");// 已下发
+                        SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+                        saveResult ++;
+                    } else {
+                        detail = detail +"单据"+dynamicObject.getString("billno")+" 数据状态不是暂存 \r\n";
+                    }
+                }
+                if (listRows.size() == saveResult) {
+                    this.getView().showSuccessNotification("发布成功");
+                } else {
+                    this.getView().showConfirm(saveResult + "条数据处理成功," + (listRows.size() - saveResult) + "条数据处理失败", detail, MessageBoxOptions.OK, ConfirmTypes.Save,null,new HashMap<>(),null);
+                }
+                this.getView().invokeOperation("refresh");
+            } else if ("nckd_zflbbtn".equals(formOperate.getOperateKey())) {// 作废
+                for (int i = 0; i < listRows.size(); i++) {
+                    ListSelectedRow listSelectedRow = listRows.get(i);
+                    Object pkValue = listSelectedRow.getPrimaryKeyValue();
+                    // 获取数据填报任务
+                    DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjcjrw");
+                    String nckd_sjzt = dynamicObject.getString("nckd_sjzt");// 数据状态
+                    if ("2".equals(nckd_sjzt)) { // 已下发
+                        // 作废数据填报单据
+                        PushSjcjDataUtils.deleteSjtbBillData(dynamicObject);
+                        // 作废数据采集单据
+                        PushSjcjDataUtils.deleteSjcjBillData(dynamicObject);
+                        dynamicObject.set("nckd_sjzt", "3");// 已作废
+                        SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+                        saveResult ++;
+                    } else {
+                        detail = detail +"单据"+dynamicObject.getString("billno")+" 数据状态不是已下发 \r\n";
+                    }
+                }
+                if (listRows.size() == saveResult) {
+                    this.getView().showSuccessNotification("作废成功");
+                } else {
+                    this.getView().showConfirm(saveResult + "条数据处理成功," + (listRows.size() - saveResult) + "条数据处理失败", detail, MessageBoxOptions.OK, ConfirmTypes.Save,null,new HashMap<>(),null);
+                }
+                this.getView().invokeOperation("refresh");
+            }
+        }
+        super.beforeDoOperation(args);
+    }
+
+
+    /**下推生成数据填报任务*/
+    public void savePushToNextBill(DynamicObject dynamicObject) {
+        // 获取任务配置分录
+        DynamicObjectCollection dynamicObjectCollection = dynamicObject.getDynamicObjectCollection("nckd_sjcjrw_entry");
+        for (DynamicObject dynamicObjectEntry: dynamicObjectCollection) {
+            String nckd_sfscrw = dynamicObjectEntry.getString("nckd_sfscrw");// 是否生成下级单位填报任务1是0否
+            DynamicObjectCollection nckd_tztbry = dynamicObjectEntry.getDynamicObjectCollection("nckd_tztbry");// 通知人员
+            List<Long> receivers = nckd_tztbry.stream().map(tztbryObject -> tztbryObject.getLong("fbasedataid.id")).collect(Collectors.toList());
+            if ("1".equals(nckd_sfscrw)) { // 需要生成任务
+                PushSjcjDataUtils.savePushBillData(dynamicObject, dynamicObjectEntry);
+            }
+            PushSjcjDataUtils.savePushBillMsg(dynamicObject, receivers);
+        }
+    }
+
+}

+ 240 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjcjCheckFormPlugin.java

@@ -0,0 +1,240 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.dataentity.utils.StringUtils;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.ConfirmTypes;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.login.utils.DateUtils;
+import kd.bos.message.api.MessageChannels;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.workflow.MessageCenterServiceHelper;
+import kd.bos.web.actions.utils.FilePathUtil;
+import kd.bos.workflow.engine.msg.info.MessageInfo;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据采集
+ * 表单插件
+ * nckd_sjcjrw
+ * duanyuqi
+ */
+public class SjcjCheckFormPlugin extends AbstractFormPlugin implements BeforeF7SelectListener {
+    private static final Log logger = LogFactory.getLog(SjcjCheckFormPlugin.class);
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+    }
+
+    @Override
+    public void afterCopyData(EventObject e) {
+        this.getModel().setValue("nckd_sjzt", "1");// 暂存
+        super.afterCopyData(e);
+    }
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        // 获取父页面的数据模型
+        IDataModel parentModel = this.getView().getParentView().getModel();
+        // 获取父页面传递过来的数据参数
+        Map<String,Object> customParams = this.getView().getFormShowParameter().getCustomParams();
+        // 判断是否是从数据填报任务列表过来的
+        if (customParams.get("sjtbrwEntry") != null) {
+            String sjtbrwEntry = customParams.get("sjtbrwEntry").toString();
+            if ("nckd_sjtbrw".equals(sjtbrwEntry)) {// 从数据填报任务列表过来的数据
+                Object sjtbrwId = customParams.get("sjtbrwId");
+                this.initDataModelBySjtbrw(sjtbrwId);
+            }
+        }
+        super.afterCreateNewData(e);
+    }
+
+    /**从数据填报任务列表过来的数据需要初始化字段信息*/
+    public void initDataModelBySjtbrw(Object sjtbrwId) {
+        // 获取到数据填报任务单据
+        DynamicObject sjtbObject = BusinessDataServiceHelper.loadSingle(sjtbrwId, "nckd_sjtbrw");
+        String nckd_rwmc = sjtbObject.getString("nckd_rwmc");// 任务名称
+        Date nckd_tbsjny = sjtbObject.getDate("nckd_tbsjny");// 所属年月
+        String nckd_ydcbm = sjtbObject.getString("nckd_ydcbm");// 源单长编码
+        String nckd_ydbh = sjtbObject.getString("billno");// 源单编号
+        String nckd_ydst = "nckd_sjtbrw";// 源单实体
+        Date nckd_tbjzrq = sjtbObject.getDate("nckd_tbjzrq");// 填报截止时间
+        String nckd_ydcbm_new = nckd_ydcbm + nckd_ydbh + "!";
+
+        this.getModel().setValue("nckd_billname", nckd_rwmc);// 单据名称
+        this.getModel().setValue("nckd_ssny", nckd_tbsjny);// 所属年月
+        this.getModel().setValue("nckd_tbjzsj", nckd_tbjzrq);// 填报截止时间
+        this.getModel().setValue("nckd_sfjtxf", "0");// 是否集团下发
+        this.getModel().setValue("nckd_ydbm", nckd_ydbh);// 源单编码
+        this.getModel().setValue("nckd_ydpk", sjtbrwId);// 源单ID
+        this.getModel().setValue("nckd_ydcbm", nckd_ydcbm_new);// 源单长编码
+        this.getModel().setValue("nckd_ydst", nckd_ydst);
+        this.getModel().setValue("nckd_sjzt", "1");// 数据状态
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+    }
+
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
+
+    }
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        FormOperate formOperate = (FormOperate) args.getSource();
+        if ("save".equals(formOperate.getOperateKey())) { // 保存按钮
+            Map<String, String> resultMap = this.checkDataEntity();
+            String isSuccess = resultMap.get("isSuccess");
+            if ("error".equals(isSuccess)) {
+                this.getView().showConfirm("保存失败", resultMap.get("message"), MessageBoxOptions.OK, ConfirmTypes.Save,null,new HashMap<>(),null);
+                args.setCancel(true);
+                return;
+            }
+        }
+        super.beforeDoOperation(args);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        OperationResult operationResult = args.getOperationResult();
+        // 够获取页面配置的校验规则的执行结果
+        if (operationResult != null && !operationResult.isSuccess()) {
+            return;
+        }
+        FormOperate formOperate = (FormOperate) args.getSource();
+        if ("nckd_fbbtn".equals(formOperate.getOperateKey())) { // 发布按钮
+            Map<String, String> resultMap = this.checkDataEntity();
+            String isSuccess = resultMap.get("isSuccess");
+            if ("error".equals(isSuccess)) {
+                this.getView().showConfirm("保存失败", resultMap.get("message"), MessageBoxOptions.OK, ConfirmTypes.Save,null,new HashMap<>(),null);
+                return;
+            } else {
+                this.getView().invokeOperation("save");
+                this.getModel().setValue("billstatus", "C");// 已审核
+                this.getModel().setValue("nckd_sjzt", "2");// 已下发
+                Object[] result = SaveServiceHelper.save(new DynamicObject[]{this.getModel().getDataEntity()});
+                DynamicObject dynamicObject = (DynamicObject) result[0];
+                this.savePushToNextBill(dynamicObject);
+                this.getView().showSuccessNotification("发布成功.");
+                this.getView().updateView();
+            }
+        } else if ("nckd_zfbtn".equals(formOperate.getOperateKey())) { // 作废按钮
+            Long pkValue = (Long) this.getModel().getDataEntity().getPkValue();
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjcjrw");
+            // 作废数据填报单据
+            PushSjcjDataUtils.deleteSjtbBillData(dynamicObject);
+            // 作废数据采集单据
+            PushSjcjDataUtils.deleteSjcjBillData(dynamicObject);
+            //this.getModel().setValue("billstatus", "A");// 暂存
+            dynamicObject.set("nckd_sjzt", "3");// 作废
+            SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+            this.getView().showSuccessNotification("作废成功!");
+            this.getView().updateView();
+        }
+        super.afterDoOperation(args);
+    }
+
+    /**检查任务配置单据体内容*/
+    public Map<String, String> checkDataEntity() {
+        Map<String, String> resultMap = new LinkedHashMap();
+        resultMap.put("isSuccess", "success");
+        resultMap.put("msg", "");
+        DynamicObjectCollection nckdSjcjrwEntry =  this.getModel().getEntryEntity("nckd_sjcjrw_entry");
+        Long[] orgIds = new Long[nckdSjcjrwEntry.size()];
+        for (int i = 0; i < nckdSjcjrwEntry.size(); i++) {
+            DynamicObject dynamicObject = nckdSjcjrwEntry.get(i);
+            orgIds[i] = dynamicObject.getLong("nckd_tbxzzz.id");
+        }
+        if (orgIds.length > 0) {
+            String msg = "";
+            boolean isError = false;
+            List<QFilter> qfilterHr = new ArrayList<QFilter>();
+            qfilterHr.add(new QFilter("iscurrentversion", "=", "1"));// 是否当前版本
+            qfilterHr.add(new QFilter("datastatus", "=", "1"));// 数据版本状态
+            qfilterHr.add(new QFilter("id", "in", orgIds));
+            QFilter[] filtersQueryHr = (QFilter[]) qfilterHr.toArray(new QFilter[qfilterHr.size()]);
+            String selectHrFields = "id,number,name,nckd_sscj.id";
+            DynamicObjectCollection hrObjectCollection = QueryServiceHelper.query("haos_adminorghr", selectHrFields, filtersQueryHr, "sortcode asc");
+            for (DynamicObject dynamicObject : hrObjectCollection) {
+                Object nckdSscjId = dynamicObject.get("nckd_sscj.id");
+                if (nckdSscjId == null || "0".equals(String.valueOf(nckdSscjId))) {
+                    msg = msg +"组织"+dynamicObject.getString("name")+" 未设置所属层级 \r\n";
+                    isError = true;
+                }
+            }
+            if (isError) {
+                resultMap.put("isSuccess", "error");
+                resultMap.put("message", msg);
+            }
+        }
+        return resultMap;
+    }
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        if ("nckd_ssny".equals(fieldKey)) {
+            // 获取所在月份的最后一天填入截止日期
+            Date nckd_ssny = (Date) this.getModel().getValue("nckd_ssny");
+            // 1. 将 Date 转换为 LocalDate
+            LocalDate localDate = nckd_ssny.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            // 2. 计算次月最后一天
+            YearMonth nextMonth = YearMonth.from(localDate).plusMonths(1);
+            LocalDate lastDay = nextMonth.atEndOfMonth();
+            // 3. 将 LocalDate 转换回 Date
+            Date resultDate = Date.from(lastDay.atStartOfDay(ZoneId.systemDefault()).toInstant());
+            this.getModel().setValue("nckd_tbjzsj", resultDate);
+        }
+        super.propertyChanged(e);
+    }
+
+    /**下推生成数据填报任务*/
+    public void savePushToNextBill(DynamicObject dynamicObject) {
+        // 获取分录
+        DynamicObjectCollection dynamicObjectCollection = dynamicObject.getDynamicObjectCollection("nckd_sjcjrw_entry");
+        for (DynamicObject dynamicObjectEntry: dynamicObjectCollection) {
+            String nckd_sfscrw = dynamicObjectEntry.getString("nckd_sfscrw");// 是否生成下级单位填报任务1是0否
+            DynamicObjectCollection nckd_tztbry = dynamicObjectEntry.getDynamicObjectCollection("nckd_tztbry");// 通知人员
+            List<Long> receivers = nckd_tztbry.stream().map(tztbryObject -> tztbryObject.getLong("fbasedataid.id")).collect(Collectors.toList());
+            if ("1".equals(nckd_sfscrw)) { // 需要生成任务
+                PushSjcjDataUtils.savePushBillData(dynamicObject, dynamicObjectEntry);
+            }
+            PushSjcjDataUtils.savePushBillMsg(dynamicObject, receivers);
+        }
+
+    }
+
+
+
+}

+ 40 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjcjmbCheckForm.java

@@ -0,0 +1,40 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.ZoneId;
+import java.util.Date;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据采集模板
+ * 表单插件
+ * nckd_sjcjmb
+ * duanyuqi
+ */
+public class SjcjmbCheckForm extends AbstractFormPlugin {
+    private static final Log logger = LogFactory.getLog(SjcjmbCheckForm.class);
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        if ("nckd_ssny".equals(fieldKey)) {
+            // 获取所在月份的最后一天填入截止日期
+            Date nckd_ssny = (Date) this.getModel().getValue("nckd_ssny");
+            // 1. 将 Date 转换为 LocalDate
+            LocalDate localDate = nckd_ssny.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            // 2. 计算次月最后一天
+            YearMonth nextMonth = YearMonth.from(localDate).plusMonths(1);
+            LocalDate lastDay = nextMonth.atEndOfMonth();
+            // 3. 将 LocalDate 转换回 Date
+            Date resultDate = Date.from(lastDay.atStartOfDay(ZoneId.systemDefault()).toInstant());
+            this.getModel().setValue("nckd_tbjzsj", resultDate);
+        }
+        super.propertyChanged(e);
+    }
+
+}

+ 149 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjcjmbTask.java

@@ -0,0 +1,149 @@
+package nckd.jxccl.hr.gzbb;
+
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.exception.KDException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.login.utils.DateUtils;
+import kd.bos.orm.query.QFilter;
+import kd.bos.schedule.executor.AbstractTask;
+import kd.bos.servicehelper.*;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 调度作业执行程序
+ * 定时拉取数据模板下发采集任务
+ * allSjcjmbTask01
+ * duanyuqi
+ * */
+public class SjcjmbTask extends AbstractTask {
+
+    private static final Log logger = LogFactory.getLog(SjcjmbTask.class);
+
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        logger.info("拉取数据采集模板进行下发");
+        pushSjcjTask(map);
+        logger.info("拉取数据采集模板进行下发结束");
+    }
+
+    public void pushSjcjTask(Map<String, Object> map) {
+        // 查询所有模板
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("billstatus", "=", "C"));
+        if (map.get("org") != null) {
+            String orgObject = map.get("org").toString();
+            JSONObject orgJson = JSONObject.parseObject(orgObject);
+            if (orgJson.get("id") != null) {
+                qfilter.add(new QFilter("org.id", "=", orgJson.get("id")));
+            }
+        }
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection sjcjmbObjectCollection = QueryServiceHelper.query("nckd_sjcjmb", "id,billno,nckd_billname", filtersQuery);
+        for (DynamicObject sjcjmbObject : sjcjmbObjectCollection) {
+            Long mbId = sjcjmbObject.getLong("id");
+            pushSjcjTaskSave(mbId);
+        }
+    }
+
+    /**复制模板并保存采集任务,然后下发*/
+    public void pushSjcjTaskSave(Long mbId) {
+        DynamicObject sjcjmbObject = BusinessDataServiceHelper.loadSingle(mbId, "nckd_sjcjmb");
+        Date nowDate = new Date();// 所属年月
+        String yearMonth = DateUtils.formatDate(nowDate, "yyyy-MM");
+        String billname = sjcjmbObject.getString("nckd_billname");// 任务名称
+
+        // 处理填报开始时间
+        String newBeginDateStr = "";
+        Date newBeginDate = null;
+        if (sjcjmbObject.getDate("nckd_tbkssj") != null) {
+            String beginDayStr = DateUtils.formatDate(sjcjmbObject.getDate("nckd_tbkssj"), "dd");
+            newBeginDateStr = yearMonth + "-" + beginDayStr;
+            newBeginDate = DateUtils.parseDate(newBeginDateStr);
+        }
+
+        // 处理填报截止时间
+        // 1. 将 Date 转换为 LocalDate
+        LocalDate localDate = nowDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        // 2. 计算次月最后一天
+        YearMonth nextMonth = YearMonth.from(localDate).plusMonths(1);
+        LocalDate lastDay = nextMonth.atEndOfMonth();
+        // 3. 将 LocalDate 转换回 Date
+        Date resultDate = Date.from(lastDay.atStartOfDay(ZoneId.systemDefault()).toInstant());
+
+        String nckd_remark = sjcjmbObject.getString("nckd_remark");// 描述
+
+        DynamicObject sjcjrwObject = BusinessDataServiceHelper.newDynamicObject("nckd_sjcjrw");
+        // 获取编号
+        String sjcjrwBillNo = CodeRuleServiceHelper.getNumber("nckd_sjcjrw", sjcjrwObject, null);
+        sjcjrwObject.set("billno", sjcjrwBillNo);// 单据编号
+        sjcjrwObject.set("billstatus", "C");// 暂存
+        sjcjrwObject.set("org", sjcjmbObject.get("org.id"));// 人事管理组织
+        sjcjrwObject.set("nckd_billname", billname);//单据名称
+        sjcjrwObject.set("nckd_ssny", nowDate);// 所属年月
+        sjcjrwObject.set("nckd_tbkssj", newBeginDate);// 填报开始时间
+        sjcjrwObject.set("nckd_tbjzsj", resultDate);// 填报截止时间
+        sjcjrwObject.set("nckd_remark", nckd_remark);// 描述
+        sjcjrwObject.set("nckd_sjzt", "2");// 数据状态
+        sjcjrwObject.set("nckd_sfjtxf", "1");// 是否初始下发
+
+        DynamicObjectCollection sjcjDynamicObjects = (DynamicObjectCollection) sjcjrwObject.get("nckd_sjcjrw_entry");
+
+        //获取单据体对象
+        DynamicObjectCollection sjcjmbDynamicObjects = (DynamicObjectCollection) sjcjmbObject.get("nckd_sjcjrw_entry");
+        for (DynamicObject sjcjmbDynamicObject : sjcjmbDynamicObjects) {
+            //创建一条单据体数据
+            DynamicObject dynamicObjectNew = sjcjDynamicObjects.addNew();
+            dynamicObjectNew.set("nckd_tbxzzz", sjcjmbDynamicObject.get("nckd_tbxzzz.id"));
+            dynamicObjectNew.set("nckd_dxbbmc", sjcjmbDynamicObject.get("nckd_dxbbmc"));
+
+            // 处理通知填报人员
+            DynamicObjectCollection nckd_tztbry = sjcjmbDynamicObject.getDynamicObjectCollection("nckd_tztbry");// 通知人员
+            DynamicObjectCollection userColl = dynamicObjectNew.getDynamicObjectCollection("nckd_tztbry");
+            for (DynamicObject user : nckd_tztbry) {
+                DynamicObject userObject = user.getDynamicObject("fbasedataId");
+                DynamicObject newUser = new DynamicObject(userColl.getDynamicObjectType());
+                newUser.set("fbasedataId", userObject);
+                userColl.add(newUser);
+            }
+            dynamicObjectNew.set("nckd_tztbry", userColl);// 通知人员
+            dynamicObjectNew.set("nckd_sfscrw", sjcjmbDynamicObject.get("nckd_sfscrw"));// 是否生成下级单位填报任务
+        }
+
+        Object[] result = SaveServiceHelper.save(new DynamicObject[]{sjcjrwObject});
+        DynamicObject dynamicObject = (DynamicObject) result[0];
+        Long sjcjTaskId = dynamicObject.getLong("id");
+
+        // 获取附件面板的附件数据
+        List<Map<String, Object>> attachmentDatas = AttachmentServiceHelper.getAttachments("nckd_sjcjmb", mbId, "attachmentpanel");
+        if (attachmentDatas.size() > 0) {
+            AttachFileUtils.copyFileFromAToB("nckd_sjcjmb", mbId, "attachmentpanel", "nckd_sjcjrw", sjcjTaskId, "attachmentpanel");
+        }
+
+        // 获取任务配置分录下发采集任务
+        DynamicObject nowTaskObject = BusinessDataServiceHelper.loadSingle(sjcjTaskId, "nckd_sjcjrw");
+        DynamicObjectCollection dynamicObjectCollection = nowTaskObject.getDynamicObjectCollection("nckd_sjcjrw_entry");
+        for (DynamicObject dynamicObjectEntry: dynamicObjectCollection) {
+            String nckd_sfscrw = dynamicObjectEntry.getString("nckd_sfscrw");// 是否生成下级单位填报任务1是0否
+            DynamicObjectCollection nckd_tztbry = dynamicObjectEntry.getDynamicObjectCollection("nckd_tztbry");// 通知人员
+            List<Long> receivers = nckd_tztbry.stream().map(tztbryObject -> tztbryObject.getLong("fbasedataid.id")).collect(Collectors.toList());
+            if ("1".equals(nckd_sfscrw)) { // 需要生成任务
+                PushSjcjDataUtils.savePushBillData(nowTaskObject, dynamicObjectEntry);
+            }
+            PushSjcjDataUtils.savePushBillMsg(nowTaskObject, receivers);
+        }
+    }
+
+
+
+}

+ 40 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbBackWorkflowPlugin.java

@@ -0,0 +1,40 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.workflow.api.AgentExecution;
+import kd.bos.workflow.api.constants.WFTaskResultEnum;
+import kd.bos.workflow.engine.extitf.IWorkflowPlugin;
+import kd.sdk.plugin.Plugin;
+
+/**
+ * nckd_sjtbrw_gzbb
+ * 数据填报单据审批流程
+ * 流程提交时变更任务状态
+ * 第一个审批节点》进入节点执行时》正常进入时
+ * duanyuqi
+ * */
+public class SjtbBackWorkflowPlugin implements Plugin, IWorkflowPlugin {
+
+    @Override
+    public void notify(AgentExecution execution) {
+        String businessKey = execution.getBusinessKey();
+        String entityNumber = execution.getEntityNumber();
+        if ("nckd_sjtbrw".equals(entityNumber)) {
+            Long pkValue = Long.parseLong(businessKey);
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+            String nckd_rwzt = dynamicObject.getString("nckd_rwzt");
+            if (!"3".equals(nckd_rwzt)) {// 没有作废
+                dynamicObject.set("nckd_rwzt", "4");// 已打回
+                SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+            }
+        }
+        IWorkflowPlugin.super.notify(execution);
+    }
+
+    @Override
+    public void notifyByWithdraw(AgentExecution execution) {
+        IWorkflowPlugin.super.notifyByWithdraw(execution);
+    }
+}

+ 310 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbCheckFormListPlugin.java

@@ -0,0 +1,310 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.StringUtils;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.datamodel.events.PackageDataEvent;
+import kd.bos.form.*;
+import kd.bos.form.events.BeforeCreateListDataProviderArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.operatecol.OperationColItem;
+import kd.bos.list.column.ListOperationColumnDesc;
+import kd.bos.list.events.BillClosedCallBackEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.login.utils.DateUtils;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据填报
+ * 数据填报列表插件
+ * nckd_sjtbrw
+ * duanyuqi
+ * */
+public class SjtbCheckFormListPlugin extends AbstractListPlugin {
+    private static final Log logger = LogFactory.getLog(SjtbCheckFormListPlugin.class);
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        FormOperate operate = (FormOperate)args.getSource();
+        if ("nckd_xfrw".equals(operate.getOperateKey())) {// 下发任务
+            ListSelectedRowCollection listRows = args.getListSelectedData();
+            if (listRows.size() != 1) {
+                this.getView().showErrorNotification("请选择一行数据进行操作");
+                args.setCancel(true);
+                return;
+            } else {
+                ListSelectedRow listSelectedRow = listRows.get(0);
+                Object pkValue = listSelectedRow.getPrimaryKeyValue();
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+                String billstatus = dynamicObject.getString("billstatus");// 单据状态
+                String nckd_rwzt = dynamicObject.getString("nckd_rwzt");// 任务状态
+                // 单据暂存中且任务状态为待上报或已打回
+                if ("A".equals(billstatus) && ("1".equals(nckd_rwzt) || "4".equals(nckd_rwzt))) {
+                    Map<String, Object> customParamMap = new HashMap<>();
+                    customParamMap.put("sjtbrwId", pkValue);// 数据填报任务id
+                    customParamMap.put("sjtbrwEntry", "nckd_sjtbrw");// 数据填报任务实体
+                    //创建弹出单据页面对象,并赋值
+                    BillShowParameter billShowParameter = new BillShowParameter();
+                    //设置弹出子单据页面的标识
+                    billShowParameter.setFormId("nckd_sjcjrw");
+                    //设置弹出子单据页面的标题
+                    billShowParameter.setCaption("数据采集任务");
+                    //设置弹出子单据页面的打开方式
+                    billShowParameter.getOpenStyle().setShowType(ShowType.MainNewTabPage);
+                    //设置子页面关闭回调对象,回调本插件,标识为常量KEY_LEAVE_DAYS对应的值
+                    billShowParameter.setCloseCallBack(new CloseCallBack(this, "KEY_NCKD_XFRW_BTN"));
+                    // 给子单据传值
+                    billShowParameter.setCustomParams(customParamMap);
+                    //弹窗子页面和父页面绑定
+                    this.getView().showForm(billShowParameter);
+                } else {
+                    this.getView().showErrorNotification("请选择暂存中的数据进行下发");
+                    args.setCancel(true);
+                    this.getView().invokeOperation("refresh");
+                    return;
+                }
+            }
+        } else if ("nckd_hzbtn".equals(operate.getOperateKey())) { // 汇总
+            ListSelectedRowCollection listRows = args.getListSelectedData();
+            List<DynamicObject> copyList = new ArrayList<DynamicObject>();
+            Date firstDate = null;
+            int flag = 0;
+            for (int i = 0; i < listRows.size(); i++) {
+                Object pkValue = listRows.get(i).getPrimaryKeyValue();
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+                String billstatus = dynamicObject.getString("billstatus");// 单据状态
+                String nckd_rwzt = dynamicObject.getString("nckd_rwzt");// 任务状态
+                Date nckd_tbsjny = dynamicObject.getDate("nckd_tbsjny");// 数据填报年月
+                if (firstDate == null) {
+                    firstDate = nckd_tbsjny;
+                } else {
+                    String firstDateStr = DateUtils.formatDate(firstDate, "yyyy-MM");
+                    String nckd_tbsjnyStr = DateUtils.formatDate(nckd_tbsjny, "yyyy-MM");
+                    if (!firstDateStr.equals(nckd_tbsjnyStr)) {
+                        flag = 1;
+                        break;
+                    }
+                }
+                if (!"C".equals(billstatus) || !"2".equals(nckd_rwzt)) { // 非已审核或非已上报
+                    flag = 2;
+                    break;
+                }
+                copyList.add(dynamicObject);
+            }
+            if (flag != 0) {
+                if (flag == 1) {
+                    this.getView().showErrorNotification("请选择同一年月的数据进行操作");
+                    return;
+                } else {
+                    this.getView().showErrorNotification("请选择已审核且已上报的数据进行操作");
+                    return;
+                }
+            } else {
+               boolean saveResult = PushSjcjDataUtils.saveMergeSjtbBill(copyList);
+               if (saveResult) {
+                   this.getView().showSuccessNotification("汇总成功");
+                   this.getView().invokeOperation("refresh");
+               } else {
+                   this.getView().showErrorNotification("汇总失败");
+               }
+            }
+        } else if ("nckd_lbdhbtn".equals(operate.getOperateKey())) { // 打回
+            //上报操作前让用户选择是否继续上报操作,在用户点击确认框上的按钮后,系统会调用confirmCallBack方法
+            ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("querendahuiOp", this);
+            //设置页面确认框,参数为:标题,选项框类型,回调监听
+            this.getView().showConfirm("请确认是否打回?", MessageBoxOptions.YesNo, confirmCallBackListener);
+        } else if ("nckd_lbdhokbtn".equals(operate.getOperateKey())) { // 确认打回
+            int saveResult = 0;
+            String detail = "";
+            ListSelectedRowCollection listRows = args.getListSelectedData();
+            for (int i = 0; i < listRows.size(); i++) {
+                Object pkValue = listRows.get(i).getPrimaryKeyValue();
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+                String billstatus = dynamicObject.getString("billstatus");// 单据状态
+                String nckd_rwzt = dynamicObject.getString("nckd_rwzt");// 任务状态
+                if ("C".equals(billstatus) && "2".equals(nckd_rwzt)) { // 已审核且已上报
+                    dynamicObject.set("billstatus", "A");// 暂存
+                    dynamicObject.set("nckd_rwzt", "1");//待上报
+                    SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+                    saveResult ++;
+                } else {
+                    detail = detail +"单据"+dynamicObject.getString("billno")+" 单据状态不是已审核或任务状态不是已上报 \r\n";
+                }
+            }
+            if (listRows.size() == saveResult) {
+                this.getView().showSuccessNotification("打回成功");
+            } else {
+                this.getView().showConfirm(saveResult + "条数据处理成功," + (listRows.size() - saveResult) + "条数据处理失败", detail, MessageBoxOptions.OK, ConfirmTypes.Save,null,new HashMap<>(),null);
+            }
+            this.getView().invokeOperation("refresh");
+        } else if ("nckd_lbsbbtn".equals(operate.getOperateKey())) { // 上报
+            //上报操作前让用户选择是否继续上报操作,在用户点击确认框上的按钮后,系统会调用confirmCallBack方法
+            ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("querenshangbaoOpt", this);
+            //设置页面确认框,参数为:标题,选项框类型,回调监听
+            this.getView().showConfirm("请确认是否上报?", MessageBoxOptions.YesNo, confirmCallBackListener);
+        } else if ("nckd_lbsbokbtn".equals(operate.getOperateKey())) { // 确认上报
+            int saveResult = 0;
+            String detail = "";
+            ListSelectedRowCollection listRows = args.getListSelectedData();
+            for (int i = 0; i < listRows.size(); i++) {
+                Object pkValue = listRows.get(i).getPrimaryKeyValue();
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+                String billstatus = dynamicObject.getString("billstatus");// 单据状态
+                String nckd_rwzt = dynamicObject.getString("nckd_rwzt");// 任务状态
+                if ("C".equals(billstatus) && "1".equals(nckd_rwzt)) { // 已审核且待上报
+                    dynamicObject.set("nckd_rwzt", "2");
+                    SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+                    saveResult ++;
+                } else {
+                    detail = detail +"单据"+dynamicObject.getString("billno")+" 单据状态不是已审核或任务状态不是待上报 \r\n";
+                }
+            }
+            if (listRows.size() == saveResult) {
+                this.getView().showSuccessNotification("上报成功");
+            } else {
+                this.getView().showConfirm(saveResult + "条数据处理成功," + (listRows.size() - saveResult) + "条数据处理失败", detail, MessageBoxOptions.OK, ConfirmTypes.Save,null,new HashMap<>(),null);
+            }
+            this.getView().invokeOperation("refresh");
+        } else if ("nckd_cbtn".equals(operate.getOperateKey())) { // 催办
+            //上报操作前让用户选择是否继续上报操作,在用户点击确认框上的按钮后,系统会调用confirmCallBack方法
+            ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("querencuibanOp", this);
+            //设置页面确认框,参数为:标题,选项框类型,回调监听
+            this.getView().showConfirm("请确认是否催办?", MessageBoxOptions.YesNo, confirmCallBackListener);
+        } else if ("nckd_cboktn".equals(operate.getOperateKey())) { // 确认催办
+            ListSelectedRowCollection listRows = args.getListSelectedData();
+            if (listRows.size() != 1) {
+                this.getView().showErrorNotification("请选择一行数据进行操作");
+                args.setCancel(true);
+                return;
+            } else {
+                ListSelectedRow listSelectedRow = listRows.get(0);
+                Object pkValue = listSelectedRow.getPrimaryKeyValue();
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+                String nckd_rwzt = dynamicObject.getString("nckd_rwzt");// 任务状态
+                if ("1".equals(nckd_rwzt)) {// 待上报
+                    DynamicObjectCollection nckd_tztbry = dynamicObject.getDynamicObjectCollection("nckd_zrr");// 通知人员
+                    if (nckd_tztbry.size() > 0) {
+                        List<Long> receivers = nckd_tztbry.stream().map(tztbryObject -> tztbryObject.getLong("fbasedataid.id")).collect(Collectors.toList());
+                        PushSjcjDataUtils.savePushCuiBanMsg(dynamicObject, receivers);
+                    }
+                }
+                this.getView().showSuccessNotification("催办成功");
+            }
+        }
+        super.beforeDoOperation(args);
+    }
+
+    @Override
+    public void beforeCreateListDataProvider(BeforeCreateListDataProviderArgs args) {
+        super.beforeCreateListDataProvider(args);
+    }
+
+    @Override
+    public void packageData(PackageDataEvent e) {
+        super.packageData(e);
+        // 判断是操作列
+        if (e.getSource() instanceof ListOperationColumnDesc) {
+            DynamicObject rowData = e.getRowData();
+            String columnKey = ((ListOperationColumnDesc) e.getSource()).getKey();
+            // 获取操作列的所有操作项
+            List<OperationColItem> operationColItems = (List<OperationColItem>) e.getFormatValue();
+            if (StringUtils.equals("nckd_sjtbczl", columnKey)) {
+                String billstatus = rowData.getString("billstatus");// 单据状态
+                String nckd_rwzt = rowData.getString("nckd_rwzt");// 任务状态
+                String nckd_bblx = rowData.getString("nckd_bblx");// 报表类型
+                DynamicObjectCollection tztbryObjects = rowData.getDynamicObjectCollection("nckd_zrr");// 通知人员
+                // 根据单据状态,设置操作列的按钮灰显
+                for (OperationColItem item : operationColItems) {
+                    if ("modify".equals(item.getOperationKey())) {// 填报按钮
+                        // 单据暂存中且任务状态为待上报或已打回且是填报表
+                        if ("A".equals(billstatus) && ("1".equals(nckd_rwzt) || "4".equals(nckd_rwzt)) && "1".equals(nckd_bblx)) {
+                            item.setVisible(true);
+                            //设置锁定解锁
+                            //item.setLocked(false);
+                        } else {
+                           item.setVisible(false);
+                        }
+                    } else if ("nckd_xfrw".equals(item.getOperationKey())) {// 下发任务按钮
+                        // 单据暂存中且任务状态为待上报或已打回且是填报表
+                        if ("A".equals(billstatus) && ("1".equals(nckd_rwzt) || "4".equals(nckd_rwzt)) && "1".equals(nckd_bblx)) {
+                            item.setVisible(true);
+                        } else {
+                            item.setVisible(false);
+                        }
+                    } else if ("nckd_cbtn".equals(item.getOperationKey())) {// 催办按钮
+                        if ("1".equals(nckd_rwzt) && tztbryObjects.size() > 0) {
+                            item.setVisible(true);
+                        } else {
+                            item.setVisible(false);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 子界面关闭时,触发父界面的closedCallBack事件;
+     * 父界面的插件,可以在此事件,接收子界面返回的数据。
+     * 特别说明:
+     * 需要在显示子界面时,调用FormShowParameter参数的setCloseCallBack方法,设置回调属性,才会在子界面关闭时触发此事件:
+     */
+    @Override
+    public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
+        super.closedCallBack(closedCallBackEvent);
+        //返回数据不为空并且标识为常量KEY_LEAVE_DAYS对应的值,代表是我们所监控的子页面关闭事件
+        if (StringUtils.equals("KEY_NCKD_XFRW_BTN", closedCallBackEvent.getActionId())) {
+            this.getView().invokeOperation("refresh");
+        }
+    }
+
+    @Override
+    public void billClosedCallBack(BillClosedCallBackEvent e) {
+        Object pkId = e.getPkId();
+        if (pkId != null) {
+            String closePkId = pkId.toString();
+            if (!"0".equals(closePkId)) {
+                boolean isDel = QueryServiceHelper.exists("nckd_sjtbrw", pkId);
+                if (!isDel) {
+                    this.getView().showSuccessNotification("删除成功");
+                }
+                this.getView().invokeOperation("refresh");
+            }
+        }
+        super.billClosedCallBack(e);
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        // TODO Auto-generated method stub
+        super.confirmCallBack(messageBoxClosedEvent);
+        //判断回调参数id
+        if ("querendahuiOp".equals(messageBoxClosedEvent.getCallBackId())) {
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                this.getView().invokeOperation("nckd_lbdhokbtn");
+            }
+        } else if ("querenshangbaoOpt".equals(messageBoxClosedEvent.getCallBackId())) {
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                this.getView().invokeOperation("nckd_lbsbokbtn");
+            }
+        } else if ("querencuibanOp".equals(messageBoxClosedEvent.getCallBackId())) {
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                this.getView().invokeOperation("nckd_cboktn");
+            }
+        }
+    }
+}

+ 187 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbCheckFormPlugin.java

@@ -0,0 +1,187 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.datamodel.events.AfterDeleteEntryEventArgs;
+import kd.bos.entity.datamodel.events.BeforeDeleteRowEventArgs;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.ConfirmCallBackListener;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.DeleteServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.util.*;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据填报
+ * 数据填报表单插件
+ * nckd_sjtbrw
+ * duanyuqi
+ * */
+public class SjtbCheckFormPlugin extends AbstractFormPlugin {
+    private static final Log logger = LogFactory.getLog(SjtbCheckFormPlugin.class);
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        OperationResult operationResult = args.getOperationResult();
+        // 够获取页面配置的校验规则的执行结果
+        if (operationResult != null && !operationResult.isSuccess()) {
+            return;
+        }
+        FormOperate formOperate = (FormOperate) args.getSource();
+        if ("nckd_zjspbtn".equals(formOperate.getOperateKey())) { // 直接审批
+            this.getModel().setValue("billstatus", "C");// 已审核
+            this.getModel().setValue("nckd_rwzt", "1");// 待上报
+            Object[] result = SaveServiceHelper.save(new DynamicObject[]{this.getModel().getDataEntity()});
+            DynamicObject dynamicObject = (DynamicObject) result[0];
+            SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+            this.getView().showSuccessNotification("审核成功");
+            this.getView().invokeOperation("refresh");
+        } else if ("nckd_fshbtn".equals(formOperate.getOperateKey())) { // 反审核
+            Long pkValue = (Long) this.getModel().getDataEntity().getPkValue();
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+            dynamicObject.set("billstatus", "A");// 暂存
+            dynamicObject.set("nckd_rwzt", "1");// 待上报
+            SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+            this.getView().showSuccessNotification("反审核成功");
+            this.getView().invokeOperation("refresh");
+        } else if ("nckd_sbbtn".equals(formOperate.getOperateKey())) { // 上报
+            //上报操作前让用户选择是否继续上报操作,在用户点击确认框上的按钮后,系统会调用confirmCallBack方法
+            ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("querenshangbaoOp", this);
+            //设置页面确认框,参数为:标题,选项框类型,回调监听
+            this.getView().showConfirm("请确认是否上报吗?", MessageBoxOptions.YesNo, confirmCallBackListener);
+        } else if ("nckd_scbtn".equals(formOperate.getOperateKey())) { // 删除
+            //上报操作前让用户选择是否继续上报操作,在用户点击确认框上的按钮后,系统会调用confirmCallBack方法
+            ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("querenShanChuOp", this);
+            //设置页面确认框,参数为:标题,选项框类型,回调监听
+            this.getView().showConfirm("请确认是否删除吗?", MessageBoxOptions.YesNo, confirmCallBackListener);
+        }
+        super.afterDoOperation(args);
+    }
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        // TODO Auto-generated method stub
+        super.confirmCallBack(messageBoxClosedEvent);
+        //判断回调参数id
+        if("querenshangbaoOp".equals(messageBoxClosedEvent.getCallBackId())){
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                Long pkValue = (Long) this.getModel().getDataEntity().getPkValue();
+                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+                dynamicObject.set("nckd_rwzt", "2");// 已上报
+                SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+                this.getView().showSuccessNotification("上报成功");
+                this.getView().invokeOperation("refresh");
+            }
+        } else if("querenShanChuOp".equals(messageBoxClosedEvent.getCallBackId())){
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                Long pkValue = (Long) this.getModel().getDataEntity().getPkValue();
+                boolean isDelete = PushSjcjDataUtils.deleteSjcjHzBill(pkValue);
+                if (isDelete) {
+                    //this.getView().showSuccessNotification("删除成功");
+                    List<QFilter> qfilterQuery = new ArrayList<QFilter>();
+                    qfilterQuery.add(new QFilter("id", "=", pkValue));
+                    QFilter[] filtersQuery = (QFilter[]) qfilterQuery.toArray(new QFilter[qfilterQuery.size()]);
+                    DeleteServiceHelper.delete("nckd_sjtbrw", filtersQuery);
+                    this.getView().close();
+                }
+            }
+        }
+    }
+
+    @Override
+    public void afterDeleteEntry(AfterDeleteEntryEventArgs e) {
+        super.afterDeleteEntry(e);
+    }
+
+    @Override
+    public void beforeDeleteRow(BeforeDeleteRowEventArgs e) {
+        String name = e.getEntryProp().getName();
+        if ("nckd_dwrgcbentry".equals(name)) {
+            // 各单位人工成本统计表删除行逻辑
+            EntryGrid entry = this.getControl("nckd_dwrgcbentry");
+            DynamicObjectCollection entryColl = this.getModel().getEntryEntity("nckd_dwrgcbentry");
+            int[] rows = entry.getSelectRows();
+            Long zero = 0L;
+            Set<Long> nckdCzzdataSet = new HashSet<Long>();
+            Map<Long, Integer> nckdCzzdataCwMap = new HashMap<Long, Integer>();
+            Map<Long, Integer> nckdCzzdataRsMap = new HashMap<Long, Integer>();
+            for (int i = 0; i < rows.length; i++) {
+                DynamicObject dynamicObject = entryColl.get(rows[i]);
+                Long czzdataId = dynamicObject.getLong("nckd_czzdata.id");
+                if (!zero.equals(czzdataId)) {
+                    nckdCzzdataCwMap.put(czzdataId, dynamicObject.getInt("nckd_lycwh"));
+                    nckdCzzdataRsMap.put(czzdataId, dynamicObject.getInt("nckd_lyrsh"));
+                    nckdCzzdataSet.add(czzdataId);
+                }
+            }
+            if (nckdCzzdataSet.size() > 0) {
+                // 各单位人工成本统计表财务
+                List<DynamicObject> rmCwList = new ArrayList<DynamicObject>();
+                DynamicObjectCollection entryCollCw = this.getModel().getEntryEntity("nckd_dwrgcbentrycw");
+                for (int i = 0; i < entryCollCw.size(); i++) {
+                    DynamicObject dynamicObject = entryCollCw.get(i);
+                    Long czzdataId = dynamicObject.getLong("nckd_cazzdata.id");
+                    Integer seq = dynamicObject.getInt("seq");
+                    if (nckdCzzdataCwMap.get(czzdataId) != null) {
+                        Integer lycwh = nckdCzzdataCwMap.get(czzdataId);
+                        if (seq.intValue() == lycwh.intValue()) {
+                            rmCwList.add(dynamicObject);
+                        }
+                    }
+                }
+                if (rmCwList.size() > 0) {
+                    for (DynamicObject rmRow:rmCwList) {
+                        entryCollCw.remove(rmRow);
+                    }
+                    this.getView().updateView("nckd_dwrgcbentrycw");
+                }
+
+                // 各单位人工成本统计表人事
+                List<DynamicObject> rmRsList = new ArrayList<DynamicObject>();
+                DynamicObjectCollection entryCollRs = this.getModel().getEntryEntity("nckd_dwrgcbentryrs");
+                for (int i = 0; i < entryCollRs.size(); i++) {
+                    DynamicObject dynamicObject = entryCollRs.get(i);
+                    Long czzdataId = dynamicObject.getLong("nckd_cbzzdata.id");
+                    Integer seq = dynamicObject.getInt("seq");
+                    if (nckdCzzdataRsMap.get(czzdataId) != null) {
+                        Integer lyrsh = nckdCzzdataRsMap.get(czzdataId);
+                        if (seq.intValue() == lyrsh.intValue()) {
+                            rmRsList.add(dynamicObject);
+                        }
+                    }
+                }
+                if (rmRsList.size() > 0) {
+                    for (DynamicObject rmRow:rmRsList) {
+                        entryCollRs.remove(rmRow);
+                    }
+                    this.getView().updateView("nckd_dwrgcbentryrs");
+                }
+            }
+        }
+        super.beforeDeleteRow(e);
+    }
+}

+ 314 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbInitLdqkFormPlugin.java

@@ -0,0 +1,314 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.db.DB;
+import kd.bos.db.DBRoute;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.login.utils.DateUtils;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据填报
+ * 数据填报初始化各级单位劳动情况统计表
+ * nckd_sjtbrw
+ * duanyuqi
+ * */
+public class SjtbInitLdqkFormPlugin extends AbstractFormPlugin {
+
+    private static final Log logger = LogFactory.getLog(SjtbInitLdqkFormPlugin.class);
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs ags) {
+        FormOperate formOperate = (FormOperate) ags.getSource();
+        if ("nckd_getldqktj".equals(formOperate.getOperateKey())) { // 拉取各级单位劳动情况统计表数据
+            //this.getView().showLoading(new LocaleString("正在加载"));
+
+            // 查询数据填报配置
+            List<QFilter> qfilterLzdpz = new ArrayList<QFilter>();
+            qfilterLzdpz.add(new QFilter("number", "=", "SJTBRWSET"));
+            QFilter[] filtersQueryLzdpz = (QFilter[]) qfilterLzdpz.toArray(new QFilter[qfilterLzdpz.size()]);
+            DynamicObject lzdpzDynamicObject = BusinessDataServiceHelper.loadSingle("nckd_sjtbrwpz", "id,number,nckd_bdlzfz,nckd_qtlzfz,nckd_jhgsbm,nckd_fdgsbm", filtersQueryLzdpz);
+            String nckd_bdlzfz = lzdpzDynamicObject.getString("nckd_bdlzfz");// 被动离职分组
+            String nckd_qtlzfz = lzdpzDynamicObject.getString("nckd_qtlzfz");// 其他离职分组
+            String nckd_jhgsbm = lzdpzDynamicObject.getString("nckd_jhgsbm");// 江西晶昊盐化有限公司编码
+            String nckd_fdgsbm = lzdpzDynamicObject.getString("nckd_fdgsbm");// 江西富达盐化有限公司编码
+
+            // 获取数据填报年月
+            Date nckd_tbsjny = this.getModel().getDataEntity().getDate("nckd_tbsjny");
+            String nckd_tbsjxm = DateUtils.formatDate(nckd_tbsjny, "yyyy-MM-dd");
+            LocalDate date = LocalDate.parse(nckd_tbsjxm, DateTimeFormatter.ISO_LOCAL_DATE);
+            LocalDate nckdTbsjxmLastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+            LocalDate nckdTbsjxmFirstDay = date.with(TemporalAdjusters.firstDayOfMonth());
+
+            // 获取填报组织
+            Object tbzzId = this.getModel().getDataEntity().get("org.id");// 填报组织id
+            // 查询所有下级组织
+            List<QFilter> qfilterHr = new ArrayList<QFilter>();
+            qfilterHr.add(new QFilter("iscurrentversion", "=", "1"));// 是否当前版本
+            qfilterHr.add(new QFilter("datastatus", "=", "1"));// 数据版本状态
+            qfilterHr.add(new QFilter("nckd_sssjgsdata.id", "=", tbzzId).or(new QFilter("id", "=", tbzzId)));// 所属公司为填报组织
+            QFilter[] filtersQueryHr = (QFilter[]) qfilterHr.toArray(new QFilter[qfilterHr.size()]);
+            String selectHrFields = "id,number,structnumber,structlongnumber,name,nckd_qyszhy.id,nckd_gjdq.id,nckd_xzqh.id,nckd_sscj.id," +
+                    "nckd_qygm.id,nckd_sslx.id,nckd_sfnrhbbb,nckd_sfsykjxqy" +
+                    ",nckd_kjxqylx.id,nckd_qyfl.id,nckd_zcqjl,nckd_jbsszcqjl,nckd_zqypxm,simplename";
+            DynamicObjectCollection hrObjectCollection = QueryServiceHelper.query("haos_adminorghr", selectHrFields, filtersQueryHr, "sortcode asc");
+            if (hrObjectCollection.size() > 0) {
+                List<String> orgIds = new ArrayList<String>();
+                for (int i = 0; i < hrObjectCollection.size(); i++) {
+                    DynamicObject dynamicObject = hrObjectCollection.get(i);
+                    orgIds.add(String.valueOf(dynamicObject.getLong("id")));
+                }
+                // 格式化组织id
+                String orgIdStr = String.join(",", orgIds);
+                // 获取所有的月份
+                List<LocalDate> nckd_tbsjxmMonthList = this.getLastDaysOfPreviousMonths(nckd_tbsjxm);
+                // 取在职平均数
+                int zgUserCount = 0;// 在岗职工
+                int lwUserCount = 0;// 劳务工
+                int nmgUserCount = 0;// 农民工
+                int lwpqUserCount = 0;// 劳务派遣
+                int txfpUserCount = 0;// 退休返聘
+                int qtUserCount = 0;// 其他
+                for (LocalDate nckd_tbsjxmMonth : nckd_tbsjxmMonthList) {
+                    Map<String, Integer> orgUserMap = this.findZaiZhiHuaMingCe(nckd_tbsjxmMonth, orgIdStr, nckd_jhgsbm, nckd_fdgsbm);
+                    zgUserCount += orgUserMap.get("zgUserCount");
+                    lwUserCount += orgUserMap.get("lwUserCount");
+                    nmgUserCount += orgUserMap.get("nmgUserCount");
+                    lwpqUserCount += orgUserMap.get("lwpqUserCount");
+                    txfpUserCount += orgUserMap.get("txfpUserCount");
+                    qtUserCount += orgUserMap.get("qtUserCount");
+                }
+
+                BigDecimal monthDecimal = new BigDecimal(nckd_tbsjxmMonthList.size());
+                BigDecimal zgUserCountDeciaml = new BigDecimal(zgUserCount).divide(monthDecimal, 8, BigDecimal.ROUND_HALF_UP);
+                BigDecimal lwUserCountDeciaml = new BigDecimal(lwUserCount).divide(monthDecimal, 8, BigDecimal.ROUND_HALF_UP);
+                BigDecimal nmgUserCountDeciaml = new BigDecimal(nmgUserCount).divide(monthDecimal, 8, BigDecimal.ROUND_HALF_UP);
+                BigDecimal lwpqUserCountDeciaml = new BigDecimal(lwpqUserCount).divide(monthDecimal, 8, BigDecimal.ROUND_HALF_UP);
+                BigDecimal txfpUserCountDeciaml = new BigDecimal(txfpUserCount).divide(monthDecimal, 8, BigDecimal.ROUND_HALF_UP);
+                BigDecimal qtUserCountDeciaml = new BigDecimal(qtUserCount).divide(monthDecimal, 8, BigDecimal.ROUND_HALF_UP);
+
+                BigDecimal atcyUserCountDeciaml = lwUserCountDeciaml.add(nmgUserCountDeciaml).add(lwpqUserCountDeciaml).add(txfpUserCountDeciaml).add(qtUserCountDeciaml);
+                BigDecimal cyryUserCountDeciaml = new BigDecimal(zgUserCount).add(atcyUserCountDeciaml);
+
+                IDataModel dataModel = this.getModel();
+                int createNewRow = 1;
+                int newRow = this.getModel().getEntryEntity("nckd_dwldqkentry").size();
+                dataModel.batchCreateNewEntryRow("nckd_dwldqkentry", createNewRow);
+                dataModel.setValue("nckd_gtjny", nckd_tbsjny, newRow);// 统计年月
+                dataModel.setValue("nckd_gzzdata", tbzzId, newRow);// 单位名称
+                dataModel.setValue("nckd_gcyryxs", cyryUserCountDeciaml, newRow);// 从业人员
+                dataModel.setValue("nckd_gzgzgxs", zgUserCountDeciaml, newRow);// 在岗职工
+                dataModel.setValue("nckd_gqtcyryxs", atcyUserCountDeciaml, newRow);// 其他从业人员
+                dataModel.setValue("nckd_glwgxs", lwUserCountDeciaml, newRow);// 劳务工
+                dataModel.setValue("nckd_gnmgxs", nmgUserCountDeciaml, newRow);// 农民工
+                dataModel.setValue("nckd_glwpqxs", lwpqUserCountDeciaml, newRow);// 劳务派遣人员
+                dataModel.setValue("nckd_gtxfpryxs", txfpUserCountDeciaml, newRow);// 退休返聘人员
+                dataModel.setValue("nckd_gqtxs", qtUserCountDeciaml, newRow);// 其他
+                // 取离职总数
+                int txlzUserCount = 0;
+                int jchtlzUserCount = 0;
+                int khbhglzUserCount = 0;
+                int swlzUserCount = 0;
+                int qtlzUserCount = 0;
+                for (LocalDate nckd_tbsjxmMonth : nckd_tbsjxmMonthList) {
+                    Map<String, Integer> orgUserMap = this.findLiZhiHuaMingCe(nckd_tbsjxmMonth, nckd_tbsjxmMonth, orgIdStr, nckd_bdlzfz, nckd_qtlzfz);
+                    txlzUserCount += orgUserMap.get("txlzUserCount");
+                    jchtlzUserCount += orgUserMap.get("jchtlzUserCount");
+                    khbhglzUserCount += orgUserMap.get("khbhglzUserCount");
+                    swlzUserCount += orgUserMap.get("swlzUserCount");
+                    qtlzUserCount += orgUserMap.get("qtlzUserCount");
+                }
+                int jsrs = txlzUserCount + jchtlzUserCount + khbhglzUserCount + swlzUserCount + qtlzUserCount;
+                dataModel.setValue("nckd_gjsrs", jsrs, newRow);// 减少人数
+                dataModel.setValue("nckd_gtx", txlzUserCount, newRow);// 退休
+                dataModel.setValue("nckd_gjcht", jchtlzUserCount, newRow);// 解除合同
+                dataModel.setValue("nckd_gkhbhg", khbhglzUserCount, newRow);// 考核不合格解除合同
+                dataModel.setValue("nckd_gsw", swlzUserCount, newRow);// 死亡
+                dataModel.setValue("nckd_gqtry", qtlzUserCount, newRow);// 其他
+            };
+            //this.getView().showLoading(new LocaleString("正在加载"), 1);
+        }
+        super.afterDoOperation(ags);
+    }
+
+    public static boolean isNullEmpty(Object obj) {
+        return obj == null || (obj instanceof String && ((String) obj).isEmpty());
+    }
+
+    public Map<String,  Integer> findZaiZhiHuaMingCe(LocalDate nckdTbsjxmLastDay, String orgIdStr, String nckd_jhgsbm, String nckd_fdgsbm) {
+        // 花名册查询在职人员
+        String ksql_zz = " SELECT Q.femployeeid as qfemployeeid,Q.fname as qfname,E.FPERSONID as efpersonid,E.FEMPNUMBER as efempnumber, " +
+                " A.FNAME as afname,A.FNUMBER as afnumber,M.FNAME as mfname,M.FNUMBER as mfnumber,P.FNUMBER AS pfnumber,P.FNAME as pfname " +
+                " FROM t_hrpi_ermanfile Q" +
+                " LEFT OUTER JOIN t_haos_adminorg P ON Q.forgid = P.fid " +
+                " LEFT OUTER JOIN t_hrpi_employee E ON Q.femployeeid = E.fboid " +
+                " AND E.fiscurrentversion = '0' AND E.fdatastatus IN ('0', '1', '2') AND" +
+                " (E.fbsed <= {TS '"+nckdTbsjxmLastDay+"'}) AND (E.fbsled >= {TS '"+nckdTbsjxmLastDay+"'}) " +
+                " LEFT OUTER JOIN t_hrpi_empposorgrel F ON Q.fempposrelid = F.FId " +
+                " AND F.fiscurrentversion = '1' AND F.fdatastatus = '1' AND (F.fstartdate <= {TS '"+nckdTbsjxmLastDay+"'}) " +
+                " AND (F.fenddate >= {TS '"+nckdTbsjxmLastDay+"'}) " +
+                " LEFT OUTER JOIN t_hbss_laborrelstatus A ON E.flaborrelstatus = A.FId " +
+                " left OUTER join t_hbss_labrelstatusprd K on a.flabrelstatusprdid = K.fid " +
+                " LEFT OUTER JOIN t_hbss_laborreltype M ON E.flaborreltypeid = M.FID " +
+                " WHERE 1 = 1 " +
+                " AND Q.fiscurrentversion = '1' AND Q.fdatastatus = '1'  " +
+                " AND (Q.fpersonid != 0) AND (Q.femployeeid != 0) AND (Q.fdepempid != 0) AND Q.finitstatus = '2'" +
+                " AND A.flabrelstatusprdid = 1010 AND (Q.fstartdate <= {TS '"+nckdTbsjxmLastDay+"'}) AND (Q.fenddate >= {TS '"+nckdTbsjxmLastDay+"'}) " +
+                " AND F.fisprimary = '1' AND (Q.FId IS NOT NULL) AND Q.forgid IN ("+orgIdStr+") AND F.fpostypeid = '1010'" +
+                " ORDER BY Q.fstartdate DESC  ";
+        logger.info("花名册查询在职人员:"+ksql_zz);
+        DataSet dataSet_zz = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), ksql_zz);
+        Iterator<Row> iterator_zz = dataSet_zz.iterator();
+        int zgUserCount = 0;// 在岗职工
+        int lwUserCount = 0;// 劳务工
+        int nmgUserCount = 0;// 农民工
+        int lwpqUserCount = 0;// 劳务派遣
+        int txfpUserCount = 0;// 退休返聘
+        int qtUserCount = 0;// 其他
+        while (iterator_zz.hasNext()) {
+            Row row = iterator_zz.next();
+            String pfnumber = row.getString("pfnumber");// 所属公司编码
+            String mfnumber = row.getString("mfnumber");// 用工关系类型
+            if ("1010_S".equals(mfnumber)) {// 劳动合同
+                zgUserCount ++;
+            } else if ("1030_S".equals(mfnumber)) {// 劳务派遣
+                if (pfnumber.equals(nckd_jhgsbm) || pfnumber.equals(nckd_fdgsbm)) {// 晶昊盐化有限公司编码 或 富达有限公司编码
+                    zgUserCount ++;
+                } else {
+                    lwUserCount ++;
+                }
+            } else if ("1040_S".equals(mfnumber)) {// 劳务协议(离岗退养返聘)
+                lwpqUserCount ++;
+            } else if ("1070_S".equals(mfnumber)) {// 劳务协议(退休返聘)
+                txfpUserCount ++;
+            } else {// 其他
+                qtUserCount ++;
+            }
+        }
+        Map<String,  Integer> result = new HashMap<String,  Integer>();
+        result.put("zgUserCount", zgUserCount);
+        result.put("lwUserCount", lwUserCount);
+        result.put("nmgUserCount", nmgUserCount);
+        result.put("lwpqUserCount", lwpqUserCount);
+        result.put("txfpUserCount", txfpUserCount);
+        result.put("qtUserCount", qtUserCount);
+        logger.info("花名册查询在职人员结果:"+result);
+        return result;
+    }
+
+    /**
+     * 获取当年小于指定日期的所有月份最后一天的年月日
+     * @param nckd_tbsjny 指定的日期字符串
+     * @return 包含所有符合条件的年月日的列表
+     */
+    public List<LocalDate> getLastDaysOfPreviousMonths(String nckd_tbsjny) {
+        // 解析输入日期
+        LocalDate targetDate = LocalDate.parse(nckd_tbsjny);
+        int targetYear = targetDate.getYear();
+        int targetMonth = targetDate.getMonthValue();
+        List<LocalDate> result = new ArrayList<>();
+        // 遍历当年小于目标月份的所有月份
+        for (int month = 1; month <= targetMonth; month++) {
+            // 获取当前月份的最后一天
+            YearMonth yearMonth = YearMonth.of(targetYear, month);
+            LocalDate lastDay = yearMonth.atEndOfMonth();
+            // 格式化输出
+            result.add(lastDay);
+        }
+        return result;
+    }
+
+    public Map<String,  Integer> findLiZhiHuaMingCe(LocalDate nckdTbsjxmLastDay,LocalDate nckdTbsjxmFirstDay, String orgIdStr,String nckd_bdlzfz, String nckd_qtlzfz) {
+        int txlzUserCount = 0;
+        int jchtlzUserCount = 0;
+        int khbhglzUserCount = 0;
+        int swlzUserCount = 0;
+        int qtlzUserCount = 0;
+
+        // 花名册查询离职人员
+        String ksql_lz = " SELECT P.FPERSONID AS pfpersonid FROM t_hrpi_ermanfile P LEFT OUTER JOIN t_hrpi_employee F " +
+                " ON P.femployeeid = F.fboid AND F.fiscurrentversion = '0' " +
+                " AND F.fdatastatus IN ('0', '1', '2') AND F.fiscurrentversion = '0' AND F.fdatastatus IN ('0', '1', '2')" +
+                " AND (F.fbsed <= {TS '"+nckdTbsjxmLastDay+"'}) AND (F.fbsled >= {TS '"+nckdTbsjxmFirstDay+"'}) " +
+                " LEFT OUTER JOIN t_hbss_laborrelstatus A ON F.flaborrelstatus = A.FId " +
+                " LEFT OUTER JOIN t_hrpi_erfiletype B ON P.ffiletypeid = B.FId WHERE 1 = 1 AND P.fiscurrentversion = '1' AND P.fdatastatus = '1' " +
+                " AND (P.fpersonid != 0) AND (P.femployeeid != 0) AND (P.fdepempid != 0) AND P.finitstatus = '2' AND A.flabrelstatusprdid = 1020" +
+                " AND B.ferfiletypeassignid = 1030 AND (F.fenddate >= {TS '"+nckdTbsjxmFirstDay+"'}) AND (F.fenddate <= {TS '"+nckdTbsjxmLastDay+"'}) " +
+                " AND (P.FId IS NOT NULL) AND (P.FId IS NOT NULL) AND P.forgid IN ("+orgIdStr+") " +
+                " ORDER BY P.fstartdate DESC ";
+        logger.info("花名册查询离职人员:"+ ksql_lz);
+        DataSet dataSet_lz = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), ksql_lz);
+        Iterator<Row> iterator_lz = dataSet_lz.iterator();
+        List<String> personIds = new ArrayList<String>();
+        while (iterator_lz.hasNext()) {
+            Row row = iterator_lz.next();
+            Long personId = row.getLong("pfpersonid");
+            personIds.add(String.valueOf(personId));
+        }
+        if (personIds.size() > 0) {
+            // 查询离职申请单
+            String personIdsStr = String.join(",", personIds);
+            String ksql_lzd = " SELECT A.FID as aid,C.FNAME as cfname,C.FNUMBER as cfnumber,C.FGROUPID AS cfgroupid FROM t_htm_quitapplybill A " +
+                    " LEFT OUTER JOIN t_htm_quitapplybill_a B ON A.FID = B.FID" +
+                    " LEFT OUTER JOIN t_htm_quittype C ON B.FQUITTYPEID = C.FID" +
+                    " WHERE " +
+                    " (B.FCONTRACTENDDATE >= {TS '" + nckdTbsjxmFirstDay + "'}) AND (B.FCONTRACTENDDATE <= {TS '" + nckdTbsjxmLastDay + "'}) " +
+                    " AND A.FPERSONID IN (" + personIdsStr + ") ";
+            logger.info("查询离职申请单:" + ksql_lzd);
+            DataSet dataSet_lzd = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), ksql_lzd);
+            Iterator<Row> iterator_lzd = dataSet_lzd.iterator();
+            while (iterator_lzd.hasNext()) {
+                Row row = iterator_lzd.next();
+                String cfnumber = row.getString("cfnumber");
+                String cfgroupid = row.getString("cfgroupid");
+                if (nckd_bdlzfz.equals(cfgroupid)) {// 被动离职分组
+                    jchtlzUserCount++;
+                    if ("1090_S".equals(cfnumber)) { // 考核不合格离职
+                        khbhglzUserCount++;
+                    }
+                } else if (nckd_qtlzfz.equals(cfgroupid)) {// 其他离职分组
+                    swlzUserCount++;
+                } else { // 主动离职分组
+                    if ("1050_S".equals(cfnumber)) { // 退休离职
+                        txlzUserCount++;
+                    } else { // 其他离职
+                        qtlzUserCount++;
+                    }
+                }
+            }
+        }
+        Map<String,  Integer> result = new HashMap<>();
+        result.put("txlzUserCount", txlzUserCount);
+        result.put("jchtlzUserCount", jchtlzUserCount);
+        result.put("khbhglzUserCount", khbhglzUserCount);
+        result.put("swlzUserCount", swlzUserCount);
+        result.put("qtlzUserCount", qtlzUserCount);
+        logger.info("花名册查询离职人员结果:" + result);
+        return result;
+    }
+
+}

+ 369 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbInitRowDataFormPlugin.java

@@ -0,0 +1,369 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DB;
+import kd.bos.db.DBRoute;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.control.Control;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.OrgEdit;
+import kd.bos.form.field.events.AfterF7SelectEvent;
+import kd.bos.form.field.events.AfterF7SelectListener;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.list.ListShowParameter;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import org.apache.commons.lang.StringUtils;
+
+import java.util.*;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据填报
+ * 数据填报所有单据体通用插件
+ * nckd_sjtbrw
+ * duanyuqi
+ * */
+public class SjtbInitRowDataFormPlugin extends AbstractFormPlugin implements AfterF7SelectListener, BeforeF7SelectListener {
+    private static final Log logger = LogFactory.getLog(SjtbInitRowDataFormPlugin.class);
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs adoea) {
+        FormOperate formOperate = (FormOperate) adoea.getSource();
+        if ("gjdwtjbentry".equals(formOperate.getOperateKey())) { // 各级单位信息统计表添加
+            int row = this.getModel().getEntryCurrentRowIndex("nckd_gjdwtjbentry");
+            this.getModel().setValue("nckd_ajtzcdata", 0, row);
+            this.getModel().setValue("nckd_azqydwdata", 0, row);
+            this.getModel().setValue("nckd_asjqydata", 0, row);
+        } else if ("cgxxtjbtj".equals(formOperate.getOperateKey())) {// 单位参股信息统计表添加
+            int row = this.getModel().getEntryCurrentRowIndex("nckd_dwcgxxentry");
+            this.getModel().setValue("nckd_bssjtdata", 0, row);
+            this.getModel().setValue("nckd_bcgqydata", 0, row);
+            this.getModel().setValue("nckd_bsssjqydata", 0, row);
+        } else if ("dwrgcbtjbtj".equals(formOperate.getOperateKey())) {// 人工成本信息统计表添加
+            int row = this.getModel().getEntryCurrentRowIndex("nckd_dwrgcbentry");
+            Object orgId = this.getModel().getDataEntity().get("org.id");
+            DynamicObject orgObject = BusinessDataServiceHelper.loadSingle(orgId, "bos_org");
+            String uniformsocialcreditcode = orgObject.getString("uniformsocialcreditcode");// 统一社会信用代码;
+            this.getModel().setValue("nckd_czzdata", orgId, row);
+            this.getModel().setValue("nckd_czqyxxdm", uniformsocialcreditcode, row);
+        } else if ("dwrgcbtjbtjcw".equals(formOperate.getOperateKey())) {// 人工成本信息统计表添加-财务
+            int row = this.getModel().getEntryCurrentRowIndex("nckd_dwrgcbentrycw");
+            Object orgId = this.getModel().getDataEntity().get("org.id");
+            DynamicObject orgObject = BusinessDataServiceHelper.loadSingle(orgId, "bos_org");
+            String uniformsocialcreditcode = orgObject.getString("uniformsocialcreditcode");// 统一社会信用代码;
+            this.getModel().setValue("nckd_cazzdata", orgId, row);
+            this.getModel().setValue("nckd_cazqyxxdm", uniformsocialcreditcode, row);
+        } else if ("dwrgcbtjbtjrs".equals(formOperate.getOperateKey())) {// 人工成本信息统计表添加-人事
+            int row = this.getModel().getEntryCurrentRowIndex("nckd_dwrgcbentryrs");
+            Object orgId = this.getModel().getDataEntity().get("org.id");
+            DynamicObject orgObject = BusinessDataServiceHelper.loadSingle(orgId, "bos_org");
+            String uniformsocialcreditcode = orgObject.getString("uniformsocialcreditcode");// 统一社会信用代码;
+            this.getModel().setValue("nckd_cbzzdata", orgId, row);
+            this.getModel().setValue("nckd_cbzqyxxdm", uniformsocialcreditcode, row);
+        } else if ("zgsrqktjbtj".equals(formOperate.getOperateKey())) {// 职工收入信息统计表添加
+            int row = this.getModel().getEntryCurrentRowIndex("nckd_dwzgsrentry");
+            this.getModel().setValue("nckd_dzqydwdata", 0, row);
+            this.getModel().setValue("nckd_dxmdata", 0, row);
+        } else if ("ldqktjbtj".equals(formOperate.getOperateKey())) {// 劳动情况信息统计表添加
+            int row = this.getModel().getEntryCurrentRowIndex("nckd_dwldqkentry");
+            this.getModel().setValue("nckd_gzzdata", 0, row);
+        } else if ("dybxtjbtj".equals(formOperate.getOperateKey())) {// 履职待遇信息统计表添加
+            int row = this.getModel().getEntryCurrentRowIndex("nckd_dwdybxentry");
+            this.getModel().setValue("nckd_fzzdata", 0, row);
+            //this.getModel().setValue("nckd_fyhdata", 0, row);
+        }
+        super.afterDoOperation(adoea);
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        //单位信息表
+        BasedataEdit ajtzcdata = this.getView().getControl("nckd_ajtzcdata");//所属集团注册名称
+        BasedataEdit azqydwdata = this.getView().getControl("nckd_azqydwdata");//子企业单位名称
+        BasedataEdit asjqydata = this.getView().getControl("nckd_asjqydata");//所属上级企业名称
+        //参股信息表
+        BasedataEdit bssjtdata = this.getView().getControl("nckd_bssjtdata");//所属集团注册名称
+        BasedataEdit bcgqydata = this.getView().getControl("nckd_bcgqydata");//参股企业单位名称
+        BasedataEdit bsssjqydata = this.getView().getControl("nckd_bsssjqydata");//所属上级企业名称
+        //人工成本表
+        BasedataEdit czzdata = this.getView().getControl("nckd_czzdata");//子企业单位名称
+        //职工收入情况表
+        BasedataEdit dzqydwdata = this.getView().getControl("nckd_dzqydwdata");//子企业单位名称
+        BasedataEdit dxmdata = this.getView().getControl("nckd_dxmdata");//姓名
+        //劳动情况表
+        BasedataEdit gzzdata = this.getView().getControl("nckd_gzzdata");//单位名称
+        //履职待遇表
+        BasedataEdit fzzdata = this.getView().getControl("nckd_fzzdata");//单位名称
+        BasedataEdit fyhdata = this.getView().getControl("nckd_fyhdata");//姓名
+
+        ajtzcdata.addAfterF7SelectListener(this);
+        azqydwdata.addAfterF7SelectListener(this);
+        asjqydata.addAfterF7SelectListener(this);
+        bssjtdata.addAfterF7SelectListener(this);
+        bcgqydata.addAfterF7SelectListener(this);
+        bsssjqydata.addAfterF7SelectListener(this);
+        czzdata.addAfterF7SelectListener(this);
+        dzqydwdata.addAfterF7SelectListener(this);
+        dxmdata.addAfterF7SelectListener(this);
+        dxmdata.addBeforeF7SelectListener(this);
+        gzzdata.addAfterF7SelectListener(this);
+        fzzdata.addAfterF7SelectListener(this);
+        fyhdata.addAfterF7SelectListener(this);
+        fyhdata.addBeforeF7SelectListener(this);
+        super.registerListener(e);
+    }
+
+
+    @Override
+    public void afterF7Select(AfterF7SelectEvent afterF7SelectEvent) {
+        Control ctrl = (Control)afterF7SelectEvent.getSource();
+        String fieldKey = ctrl.getKey();
+        ListSelectedRowCollection list = afterF7SelectEvent.getListSelectedRowCollection();
+        if ("nckd_fyhdata".equals(fieldKey)) {// 企业负责人履职待遇、业务支出和社会保险统计表字段
+            // 姓名
+            setValueDwdybxentry("nckd_dwdybxentry", fieldKey,  list);
+        } else if ("nckd_czzdata".equals(fieldKey)) {// 各级单位人工成本统计表字段
+            // 子企业单位名称
+            setValueDwrgcbentry("nckd_dwrgcbentry", fieldKey,  list);
+        } else if ("nckd_bcgqydata".equals(fieldKey)) {// 各级单位参股企业信息统计表字段
+            // 参股企业单位名称
+            setValueDwcgxxentry("nckd_bcgqydata", fieldKey,  list);
+        }
+    }
+
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
+        String ftName = beforeF7SelectEvent.getProperty().getName();
+        if ("nckd_dxmdata".equals(ftName)) { // 各级单位职工收入情况统计表选择用户
+            Object orgId = this.getModel().getDataEntity().get("org.id");// 填报组织Id
+            ListShowParameter listShowParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
+            listShowParameter.getListFilterParameter().setFilter(new QFilter("adminorg.company.id", "=", orgId));
+            // 获取指定用户集合
+            Object[] userIds = findHeSuanMingDanUserPersonId();
+            listShowParameter.getListFilterParameter().setFilter(new QFilter("person.id", "in", userIds));
+        } else if ("nckd_fyhdata".equals(ftName)) { // 企业负责人履职待遇、业务支出和社会保险统计表选择用户
+            Object orgId = this.getModel().getDataEntity().get("org.id");// 填报组织Id
+            ListShowParameter listShowParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
+            listShowParameter.getListFilterParameter().setFilter(new QFilter("adminorg.company.id", "=", orgId));
+        }
+    }
+
+    /**各级单位参股企业信息统计表*/
+    public void setValueDwcgxxentry(String entryKey, String fieldKey, ListSelectedRowCollection list) {
+        int index = this.getModel().getEntryCurrentRowIndex(entryKey);
+        for (ListSelectedRow row : list) {
+            Object selectedId = row.getPrimaryKeyValue();
+            if ("nckd_bcgqydata".equals(fieldKey)) {// 参股企业单位名称
+                DynamicObject orgDynamicObjectHr = getOrgObjectHr(selectedId);
+                DynamicObject orgDynamicObjectYwdy = getOrgObjectYwdy(selectedId);
+                // 获取集团本部的信息
+                List<QFilter> qfilterBenbu = new ArrayList<QFilter>();
+                qfilterBenbu.add(new QFilter("number", "=", "101"));
+                QFilter[] filtersQueryBenbu = (QFilter[]) qfilterBenbu.toArray(new QFilter[qfilterBenbu.size()]);
+                DynamicObject orgHrDynamicObjectBenbu = BusinessDataServiceHelper.loadSingle("haos_adminorghr", "id,name,structnumber,structlongnumber,simplename,parent.id", filtersQueryBenbu);
+                DynamicObject orgDynamicObjectBenbu = BusinessDataServiceHelper.loadSingle("bos_org", "id,number,name,uniformsocialcreditcode,ffirmname,ftaxregnum", filtersQueryBenbu);
+                String uniformsocialcreditcodeBenbu = orgDynamicObjectBenbu.getString("uniformsocialcreditcode");// 集团本部统一社会信用代码
+                Long topParentOrgId = orgHrDynamicObjectBenbu.getLong("parent.id");// 根组织 id
+                if (selectedId.equals(topParentOrgId)) {
+                    return;
+                }
+
+                this.getModel().setValue("nckd_bssjtxxdm", uniformsocialcreditcodeBenbu, index);// 所属集团统一社会信用代码
+                this.getModel().setValue("nckd_bssjtdata", topParentOrgId, index);// 所属集团名称
+                this.getModel().setValue("nckd_bcgqyxxdm", orgDynamicObjectYwdy.getString("uniformsocialcreditcode"), index);//参股企业统一社会信用代码
+                this.getModel().setValue("nckd_bqyjc", orgDynamicObjectHr.getString("simplename"), index);//企业简称
+
+                Long parentId = orgDynamicObjectHr.getLong("nckd_sssjgsdata.id");
+                if (parentId.equals(topParentOrgId)) {
+                    this.getModel().setValue("nckd_sssjxxdm", uniformsocialcreditcodeBenbu, index);//参股企业统一社会信用代码
+                } else {
+                    if (!parentId.equals(0L)) {
+                        DynamicObject parentOrgDynamicObject = getOrgObjectYwdy(parentId);
+                        this.getModel().setValue("nckd_sssjxxdm", parentOrgDynamicObject.get("uniformsocialcreditcode"), index);//参股企业统一社会信用代码
+                    }
+                }
+                this.getModel().setValue("nckd_bsssjqydata", parentId, index);//所属上级企业名称
+                this.getModel().setValue("nckd_bcgqyszhy", orgDynamicObjectHr.get("nckd_qyszhy.id"), index);//参股企业所在行业
+                this.getModel().setValue("nckd_bcgqygj", orgDynamicObjectHr.get("nckd_gjdq.id"), index);//参股企业所在国家和地区
+                this.getModel().setValue("nckd_bcgqyds", orgDynamicObjectHr.get("nckd_xzqh.id"), index);//参股企业所在地市
+                index ++;
+            }
+        }
+    }
+
+    /**各级单位人工成本统计表*/
+    public void setValueDwrgcbentry(String entryKey, String fieldKey, ListSelectedRowCollection list) {
+        int index = this.getModel().getEntryCurrentRowIndex(entryKey);
+        if ("nckd_czzdata".equals(fieldKey)) {
+            Object[] orgIds = new Long[list.size()];
+            for (int i = 0; i < list.size(); i++) {
+                orgIds[i] = list.get(i).getPrimaryKeyValue();
+            }
+            if (orgIds.length > 0) {
+                List<QFilter> qfilter = new ArrayList<QFilter>();
+                qfilter.add(new QFilter("id", "in", orgIds));
+                QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+                DynamicObjectCollection objectCollection = QueryServiceHelper.query("bos_org", "id,number,name,uniformsocialcreditcode,ffirmname,ftaxregnum", filtersQuery);
+                for (DynamicObject object : objectCollection) {
+                    String uniformsocialcreditcode = object.getString("uniformsocialcreditcode");// 统一社会信用代码;
+                    this.getModel().setValue("nckd_czqyxxdm", uniformsocialcreditcode, index);
+                    index ++;
+                }
+            }
+        }
+    }
+
+    /**企业负责人履职待遇、业务支出和社会保险统计表*/
+    public void setValueDwdybxentry(String entryKey, String fieldKey, ListSelectedRowCollection list) {
+        int index = this.getModel().getEntryCurrentRowIndex(entryKey);
+        if ("nckd_fyhdata".equals(fieldKey)) {// 用户名称
+            List<Long> userIds = new ArrayList<Long>();
+            List<String> idDatas = new ArrayList<String>();
+            for (int i = 0; i < list.size(); i++) {
+                Long id = (Long) list.get(i).getPrimaryKeyValue();
+                userIds.add(id);
+                idDatas.add("'"+id+"'");
+            }
+            if (userIds.size() > 0) {
+                String idData = StringUtils.join(idDatas, ",");
+                Map<Long, Object> map = new HashMap<Long, Object>();
+                String ksql_ry = " select c.fid as selectid,c.fadminorgid as xzzz,a.forgid as rszz,a.fpersonid as ryid," +
+                        " a.fname rymc,b.fnumber as zjhm,d.fcompanyid as gsid " +
+                        " from t_hrpi_ermanfile a " +
+                        " left join t_hrpi_percre b on a.fpersonid = b.fpersonid" +
+                        " left join t_hrpi_depemp c on a.fpersonid = c.fpersonid" +
+                        " left join t_haos_adminorg d on d.fid = c.fadminorgid  " +
+                        " where b.fiscurrentversion = 1 and b.fdatastatus = 1 and b.fismajor = 1" +
+                        " and a.fiscurrentversion = 1 and a.fdatastatus = 1 and a.fbusinessstatus = 1 " +
+                        " and c.fid in ("+idData+")  ";
+                logger.info("sql_ry:"+ksql_ry);
+                DataSet dataSet_ry = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), ksql_ry);
+                Iterator<Row> iterator_ry = dataSet_ry.iterator();
+                while (iterator_ry.hasNext()) {
+                    Row row_ry = iterator_ry.next();
+                    Long selectid = row_ry.getLong("selectid");
+                    map.put(selectid, row_ry.getString("zjhm") + "#" + row_ry.getLong("gsid"));
+                }
+
+                for (Long userId : userIds) {
+                    if (map.get(userId) != null) {
+                        String[] dataStr = map.get(userId).toString().split("#");
+                        String idCard = dataStr[0];
+                        Object gsid = dataStr[1];
+
+                        this.getModel().setValue("nckd_fsfzhm", idCard, index);// 证件号码
+                        this.getModel().setValue("nckd_fzzdata", gsid, index);// 单位名称
+                    }
+                    index ++;
+                }
+            }
+
+        }
+    }
+
+    public DynamicObject getOrgObjectYwdy(Object orgId) {
+        DynamicObject orgDynamicObject = BusinessDataServiceHelper.loadSingle(orgId, "bos_org", "id,number,name,uniformsocialcreditcode," +
+                "ffirmname,ftaxregnum");
+        return orgDynamicObject;
+    }
+
+    public DynamicObject getOrgObjectHr(Object orgId) {
+        DynamicObject orgDynamicObject = BusinessDataServiceHelper.loadSingle(orgId, "haos_adminorghr", "id,name,simplename,nckd_qyszhy.id," +
+                "nckd_gjdq.id,nckd_xzqh.id,nckd_sscj.id,nckd_qygm.id,nckd_sslx.id,nckd_sfnrhbbb,nckd_sfsykjxqy,nckd_kjxqylx.id,nckd_qyfl.id,nckd_zcqjl," +
+                "nckd_jbsszcqjl,nckd_zqypxm,nckd_sssjgsdata.id");
+        return orgDynamicObject;
+    }
+
+    public DynamicObject getUserObject(Object userId) {
+        DynamicObject orgDynamicObject = BusinessDataServiceHelper.loadSingle(userId, "bos_user", "id,name,number");
+        return orgDynamicObject;
+
+    }
+
+    public Object[] findHeSuanMingDanUserPersonId() {
+        Object[] resultIds = new  Object[1];
+        resultIds[0] = 0;
+        // 填报数据年月
+        Date nckd_tbsjny = this.getModel().getDataEntity().getDate("nckd_tbsjny");
+        // 填报组织id
+        Object tbzzId = this.getModel().getDataEntity().get("org.id");
+        // 核算任务id
+        List<Long> hsTaskId = findHeSuanRenWuIds(tbzzId, nckd_tbsjny);
+        if (hsTaskId.size() > 0) {
+            String ksql_rysj = " select a.fid as mingdanid,c.fpersonid as renyuanid,c.femployeeid as qiyerenyuanid " +
+                    " from t_hsas_calperson a " +
+                    " left join t_hsas_calperson_s a1 on a.fid = a1.fid " +
+                    " left join t_hsas_calpayrolltask b on a.fcaltaskid = b.fid " +
+                    " left join t_hsas_empposorgrelhr c on a.fempposorgrelhrvid = c.fid" +
+                    " where b.fid in ("+hsTaskId+") and a1.fcalstatus in (4,10)  ";
+            logger.info("查询人员数据:{}", ksql_rysj);
+            DataSet dataSet_rysj = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), ksql_rysj);
+            List<Long> personIdList = new ArrayList();
+            Iterator<Row> iterator_rysj = dataSet_rysj.iterator();
+            while (iterator_rysj.hasNext()) {
+                Row row = iterator_rysj.next();
+                personIdList.add(row.getLong("renyuanid"));
+            }
+            if (personIdList.size() > 0) {
+                resultIds = new Object[personIdList.size()];
+                for (int i = 0;i < personIdList.size();i++) {
+                    resultIds[i] = personIdList.get(i);
+                }
+            }
+        }
+        return resultIds;
+    }
+
+    public List<Long> findHeSuanRenWuIds(Object tbzzId, Date nckd_tbsjny) {
+        List<Long> hsrwIds = new ArrayList<Long>();
+        // 查询所有下级组织
+        List<QFilter> qfilterHr = new ArrayList<QFilter>();
+        qfilterHr.add(new QFilter("iscurrentversion", "=", "1"));// 是否当前版本
+        qfilterHr.add(new QFilter("datastatus", "=", "1"));// 数据版本状态
+        qfilterHr.add(new QFilter("nckd_sssjgsdata.id", "=", tbzzId).or(new QFilter("id", "=", tbzzId)));// 所属公司为填报组织
+        QFilter[] filtersQueryHr = (QFilter[]) qfilterHr.toArray(new QFilter[qfilterHr.size()]);
+        String selectHrFields = "id,number,structnumber,structlongnumber,name,nckd_qyszhy.id,nckd_gjdq.id,nckd_xzqh.id,nckd_sscj.id,nckd_qygm.id,nckd_sslx.id,nckd_sfnrhbbb,nckd_sfsykjxqy" +
+                ",nckd_kjxqylx.id,nckd_qyfl.id,nckd_zcqjl,nckd_jbsszcqjl,nckd_zqypxm,simplename";
+        DynamicObjectCollection hrObjectCollection = QueryServiceHelper.query("haos_adminorghr", selectHrFields, filtersQueryHr, "sortcode asc");
+        if (hrObjectCollection.size() > 0) {
+            Long[] hrOrgIds = new Long[hrObjectCollection.size()];
+            for (int i = 0; i < hrObjectCollection.size(); i++) {
+                DynamicObject dynamicObject = hrObjectCollection.get(i);
+                hrOrgIds[i] = dynamicObject.getLong("id");
+            }
+            List<QFilter> qfilterHs = new ArrayList<QFilter>();
+            qfilterHs.add(new QFilter("enable", "=", "1"));// 使用状态
+            qfilterHs.add(new QFilter("taskstatus", "=", "4").or(new QFilter("taskstatus", "=", "7")));// 任务状态-审批通过-已审核
+            qfilterHs.add(new QFilter("org.id", "in", hrOrgIds));// 核算组织id
+            qfilterHs.add(new QFilter("payrolldate", "=", nckd_tbsjny));// 薪资所属年月
+            qfilterHs.add(new QFilter("payrollscene.nckd_notgzbb", "=", "0"));// 核算场景
+            QFilter[] filtersQueryHs = (QFilter[]) qfilterHs.toArray(new QFilter[qfilterHs.size()]);
+            String selectHsFields = "id,name,number";
+            DynamicObjectCollection hsObjectCollection = QueryServiceHelper.query("hsas_calpayrolltask", selectHsFields, filtersQueryHs);
+            if (hsObjectCollection.size() > 0) {
+                for (int i = 0; i < hsObjectCollection.size(); i++) {
+                    DynamicObject dynamicObject = hsObjectCollection.get(i);
+                    hsrwIds.add(dynamicObject.getLong("id"));
+                }
+            }
+        }
+        return hsrwIds;
+    }
+
+}

+ 226 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbInitXxtjFormPlugin.java

@@ -0,0 +1,226 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+
+import java.util.*;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据填报
+ * 数据填报初始化各级单位信息统计表
+ * nckd_sjtbrw
+ * duanyuqi
+ * */
+public class SjtbInitXxtjFormPlugin extends AbstractFormPlugin {
+    private static final Log logger = LogFactory.getLog(SjtbInitXxtjFormPlugin.class);
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs ags) {
+        FormOperate formOperate = (FormOperate) ags.getSource();
+        if ("nckd_getxxtji".equals(formOperate.getOperateKey())) { // 拉取各级单位信息统计表数据
+            //this.getView().showLoading(new LocaleString("正在加载"));
+            // 获取集团本部的信息
+            List<QFilter> qfilterBenbu = new ArrayList<QFilter>();
+            qfilterBenbu.add(new QFilter("number", "=", "101"));
+            QFilter[] filtersQueryBenbu = (QFilter[]) qfilterBenbu.toArray(new QFilter[qfilterBenbu.size()]);
+            DynamicObject orgHrDynamicObjectBenbu = BusinessDataServiceHelper.loadSingle("haos_adminorghr", "id,name,structnumber,structlongnumber,simplename,parent.id", filtersQueryBenbu);
+            DynamicObject orgDynamicObjectBenbu = BusinessDataServiceHelper.loadSingle("bos_org", "id,number,name,uniformsocialcreditcode,ffirmname,ftaxregnum", filtersQueryBenbu);
+            String uniformsocialcreditcodeBenbu = orgDynamicObjectBenbu.getString("uniformsocialcreditcode");// 集团本部统一社会信用代码
+            Long topParentOrgId = orgHrDynamicObjectBenbu.getLong("parent.id");// 根组织 id
+            Long orgIdBenbu = orgDynamicObjectBenbu.getLong("id");// 集团本部Id
+            Long tbzzId = this.getModel().getDataEntity().getLong("org.id");// 填报组织id
+            Date tbSjny = this.getModel().getDataEntity().getDate("nckd_tbsjny");// 填报数据年月
+            DynamicObject orgHrDynamicObjectTbzz = BusinessDataServiceHelper.loadSingle(tbzzId, "haos_adminorghr", "id,name,structnumber,structlongnumber,simplename,nckd_sscj.id,nckd_sscj.nckd_sjcj.id,parent.id,nckd_sssjgsdata.id");
+            DynamicObject orgDynamicObjectTbzz = BusinessDataServiceHelper.loadSingle(tbzzId, "bos_org", "id,number,name,uniformsocialcreditcode,ffirmname,ftaxregnum");
+            String tbUniformsocialcreditcode = orgDynamicObjectTbzz.getString("uniformsocialcreditcode");// 填报组织统一社会信用代码;
+            // 获取填报组织所属上级公司的信息
+            Long tbParentOrgId = 0L;
+            String tbParentUniformsocialcreditcode = "";
+            if (tbzzId.equals(orgIdBenbu) || tbzzId.equals(topParentOrgId)) {// 填报组织是集团本部 或 是根组织
+                tbParentOrgId = topParentOrgId;// 根组织 id
+                tbParentUniformsocialcreditcode = uniformsocialcreditcodeBenbu;// 集团本部统一社会信用代码
+            } else  {
+                tbParentOrgId = orgHrDynamicObjectTbzz.getLong("nckd_sssjgsdata.id");// 所属上级公司id
+                if (tbParentOrgId.equals(0L)) {
+                    tbParentOrgId = tbzzId;
+                }
+                if (tbParentOrgId.equals(topParentOrgId)) {// 上级组织是根组织
+                    tbParentUniformsocialcreditcode = uniformsocialcreditcodeBenbu;
+                } else {
+                    DynamicObject tbParentOrgDynamicObject = BusinessDataServiceHelper.loadSingle(tbParentOrgId, "bos_org", "id,number,name,uniformsocialcreditcode,ffirmname,ftaxregnum");
+                    tbParentUniformsocialcreditcode = tbParentOrgDynamicObject.getString("uniformsocialcreditcode");// 上级公司统一社会信用代码;
+                }
+            }
+
+            // 查询所有下级组织
+            List<QFilter> qfilterHr = new ArrayList<QFilter>();
+            qfilterHr.add(new QFilter("iscurrentversion", "=", "1"));// 是否当前版本
+            qfilterHr.add(new QFilter("datastatus", "=", "1"));// 数据版本状态
+            qfilterHr.add(new QFilter("nckd_sssjgsdata.id", "=", tbzzId).or(new QFilter("id", "=", tbzzId)));// 所属公司为填报组织
+            QFilter[] filtersQueryHr = (QFilter[]) qfilterHr.toArray(new QFilter[qfilterHr.size()]);
+            String selectHrFields = "id,number,structnumber,structlongnumber,name,nckd_qyszhy.id,nckd_gjdq.id,nckd_xzqh.id,nckd_sscj.id,nckd_qygm.id,nckd_sslx.id,nckd_sfnrhbbb,nckd_sfsykjxqy" +
+                    ",nckd_kjxqylx.id,nckd_qyfl.id,nckd_zcqjl,nckd_jbsszcqjl,nckd_zqypxm,simplename";
+            DynamicObjectCollection hrObjectCollection = QueryServiceHelper.query("haos_adminorghr", selectHrFields, filtersQueryHr, "sortcode asc");
+
+            if (hrObjectCollection.size() > 0) {
+                // 将所有的HR行政组织放到map中
+                Map<Object, DynamicObject> hrObjMap = new LinkedHashMap<Object, DynamicObject>();
+                Long[] orgIds = new Long[hrObjectCollection.size()];
+                for (int i = 0; i < hrObjectCollection.size(); i++) {
+                    DynamicObject dynamicObject = hrObjectCollection.get(i);
+                    orgIds[i] = dynamicObject.getLong("id");
+                    hrObjMap.put(dynamicObject.get("id"), dynamicObject);
+                }
+                // 获取所有的业务单元
+                List<QFilter> qfilterYwdy = new ArrayList<QFilter>();
+                qfilterYwdy.add(new QFilter("id", "in", orgIds));
+                QFilter[] filtersYwdy = (QFilter[]) qfilterYwdy.toArray(new QFilter[qfilterYwdy.size()]);
+                String selectYwdyFields = "id,number,name,uniformsocialcreditcode,ffirmname,ftaxregnum";
+                DynamicObjectCollection ywdyObjectCollection = QueryServiceHelper.query("bos_org", selectYwdyFields, filtersYwdy);
+                // 将所有的业务单元放到map中
+                Map<Object, DynamicObject> ywdyObjMap = new LinkedHashMap<Object, DynamicObject>();
+                for (int i = 0; i < ywdyObjectCollection.size(); i++) {
+                    DynamicObject dynamicObject = ywdyObjectCollection.get(i);
+                    ywdyObjMap.put(dynamicObject.get("id"), dynamicObject);
+                }
+                IDataModel dataModel = this.getModel();
+                int createNewRow = hrObjectCollection.size();
+                int newRow = this.getModel().getEntryEntity("nckd_gjdwtjbentry").size();
+                dataModel.batchCreateNewEntryRow("nckd_gjdwtjbentry", createNewRow);
+
+                // 遍历HR行政组织
+                Set<Object> hrObjKeys = hrObjMap.keySet();
+                for (Object hrObjKey : hrObjKeys) {
+                    DynamicObject ywdyObject = ywdyObjMap.get(hrObjKey);
+                    DynamicObject hrObject = hrObjMap.get(hrObjKey);
+                    Object pkId = hrObject.get("id");// 单位名称
+                    dataModel.setValue("nckd_atjny", tbSjny, newRow);// 统计年月
+                    dataModel.setValue("nckd_axydm", uniformsocialcreditcodeBenbu, newRow);// 所属集团统一社会信用代码
+                    dataModel.setValue("nckd_ajtzcdata", topParentOrgId, newRow);// 所属集团注册名称
+
+                    Object uniformsocialcreditcode = ywdyObject.get("uniformsocialcreditcode");// 统一社会信用代码
+                    if (!isNullEmpty(uniformsocialcreditcode)) {
+                        dataModel.setValue("nckd_azjqxydm", uniformsocialcreditcode, newRow);
+                    }
+                    dataModel.setValue("nckd_azqydwdata", pkId, newRow);// 子企业单位名称
+                    Object simplename = hrObject.get("simplename");// 企业简称
+                    if (!isNullEmpty(simplename)) {
+                        dataModel.setValue("nckd_aqyjc", simplename, newRow);
+                    }
+
+                    if (tbzzId.equals(pkId)) { // 填报组织
+                        dataModel.setValue("nckd_asjqyxydm", tbParentUniformsocialcreditcode, newRow);// 所属上级企业统一社会信用代码
+                        dataModel.setValue("nckd_asjqydata", tbParentOrgId, newRow);// 所属上级企业名称
+                    } else {
+                        if (topParentOrgId.equals(pkId)) {
+                            dataModel.setValue("nckd_asjqyxydm", uniformsocialcreditcodeBenbu, newRow);// 所属上级企业统一社会信用代码
+                        } else {
+                            dataModel.setValue("nckd_asjqyxydm", tbUniformsocialcreditcode, newRow);// 所属上级企业统一社会信用代码
+                        }
+                        dataModel.setValue("nckd_asjqydata", tbzzId, newRow);// 所属上级企业名称
+                    }
+
+                    Object nckd_qyszhy = hrObject.get("nckd_qyszhy.id");// 企业所在行业
+                    if (!isNullEmpty(nckd_qyszhy)) {
+                        dataModel.setValue("nckd_azqyszhy", nckd_qyszhy, newRow);
+                    }
+                    Object nckd_gjdq = hrObject.get("nckd_gjdq.id");// 企业所在国家和地区
+                    if (!isNullEmpty(nckd_gjdq)) {
+                        dataModel.setValue("nckd_azqygj", nckd_gjdq, newRow);
+                    }
+                    Object nckd_xzqh = hrObject.get("nckd_xzqh.id");// 企业所在地市
+                    if (!isNullEmpty(nckd_xzqh)) {
+                        dataModel.setValue("nckd_azqyszdq", nckd_xzqh, newRow);
+                    }
+                    Object nckd_sscj = hrObject.get("nckd_sscj.id");// 企业所属层级
+                    if (!isNullEmpty(nckd_sscj)) {
+                        dataModel.setValue("nckd_azqysscj", nckd_sscj, newRow);
+                    }
+                    Object nckd_qygm = hrObject.get("nckd_qygm.id");// 企业规模
+                    if (!isNullEmpty(nckd_qygm)) {
+                        dataModel.setValue("nckd_azqygm", nckd_qygm, newRow);
+                    }
+                    Object nckd_sslx = hrObject.get("nckd_sslx.id");// 上市类型
+                    if (!isNullEmpty(nckd_sslx)) {
+                        dataModel.setValue("nckd_asslx", nckd_sslx, newRow);
+                    }
+                    Object nckd_sfnrhbbb = hrObject.get("nckd_sfnrhbbb");// 是否纳入合并报表
+                    if (!isNullEmpty(nckd_sfnrhbbb)) {
+                        dataModel.setValue("nckd_asfnrhbbb", nckd_sfnrhbbb, newRow);
+                    }
+                    Object nckd_sfsykjxqy = hrObject.get("nckd_sfsykjxqy");// 是否属于科技型企业
+                    if (!isNullEmpty(nckd_sfsykjxqy)) {
+                        dataModel.setValue("nckd_asfsykjxqy", nckd_sfsykjxqy, newRow);
+                    }
+                    Object nckd_kjxqylx = hrObject.get("nckd_kjxqylx.id");// 科技型企业类型
+                    if (!isNullEmpty(nckd_kjxqylx)) {
+                        dataModel.setValue("nckd_akjxqylx", nckd_kjxqylx, newRow);
+                    }
+                    Object nckd_qyfl = hrObject.get("nckd_qyfl.id");// 企业分类
+                    if (!isNullEmpty(nckd_qyfl)) {
+                        dataModel.setValue("nckd_aqyfl", nckd_qyfl, newRow);
+                    }
+                    Object nckd_zcqjl = hrObject.get("nckd_zcqjl");// 是否实施中长期激励
+                    if (!isNullEmpty(nckd_zcqjl)) {
+                        dataModel.setValue("nckd_azcqjl", nckd_zcqjl, newRow);
+                    }
+                    Object nckd_jbsszcqjl = hrObject.get("nckd_jbsszcqjl");// 是否具备实施中长期激励
+                    if (!isNullEmpty(nckd_jbsszcqjl)) {
+                        dataModel.setValue("nckd_ajbsszcqjl", nckd_jbsszcqjl, newRow);
+                    }
+                    Object nckd_zqypxm = hrObject.get("nckd_zqypxm");// 企业排序码
+                    if (!isNullEmpty(nckd_zqypxm)) {
+                        dataModel.setValue("nckd_azqypxm", nckd_zqypxm, newRow);
+                    }
+                    newRow ++;
+                }
+            }
+            //this.getView().showLoading(new LocaleString("正在加载"), 1);
+        }
+        super.afterDoOperation(ags);
+    }
+
+    public static boolean isNullEmpty(Object obj) {
+        return obj == null || (obj instanceof String && ((String) obj).isEmpty());
+    }
+
+    /**获取填报组织的上级*/
+    public DynamicObject findParentOrg(DynamicObject orgHrDynamicObject, Object checkSscj, Object topParentOrgId) {
+        Object orgId = orgHrDynamicObject.get("id");
+        if (orgId.equals(topParentOrgId)) { // 根组织直接返回
+            return orgHrDynamicObject;
+        }
+        Object tbPatentId = orgHrDynamicObject.get("parent.id");
+        DynamicObject parentDynamicObject = BusinessDataServiceHelper.loadSingle(tbPatentId, "haos_adminorghr", "id,name,structnumber,structlongnumber,simplename,nckd_sscj.id,parent.id");
+        Object parentId = parentDynamicObject.get("id");
+        if (parentId.equals(topParentOrgId)) { // 根组织直接返回
+            return parentDynamicObject;
+        }
+        Object parentSscj = parentDynamicObject.get("nckd_sscj.id");
+        if (isNullEmpty(parentSscj)) {
+            return findParentOrg(parentDynamicObject, checkSscj, topParentOrgId);
+        } else {
+            if (parentSscj.equals(checkSscj)) {
+                return parentDynamicObject;
+            } else {
+                return findParentOrg(parentDynamicObject, checkSscj, topParentOrgId);
+            }
+        }
+    }
+
+}

+ 1866 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbInitZgsrFormPlugin.java

@@ -0,0 +1,1866 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DB;
+import kd.bos.db.DBRoute;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.login.utils.DateUtils;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import org.apache.commons.lang.StringUtils;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+
+/**
+ * 央国企人事云》国资报表ext》单据》数据填报
+ * 数据填报初始化各级单位职工收入情况统计表
+ * nckd_sjtbrw
+ * duanyuqi
+ * */
+public class SjtbInitZgsrFormPlugin extends AbstractFormPlugin {
+
+    private static final Log logger = LogFactory.getLog(SjtbInitZgsrFormPlugin.class);
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs ags) {
+        FormOperate formOperate = (FormOperate) ags.getSource();
+        if ("nckd_getzgsr".equals(formOperate.getOperateKey())) { // 拉取各级单位职工收入统计表数据
+            // 入职方式
+            Map<String, DynamicObject> rzfsMap = findRzfsMap();
+            // 证件类型
+            Map<String, DynamicObject> zjlxMap = findZjlxMap();
+            //国籍地区
+            Map<String, DynamicObject> gjdqMap = findGjdqMap();
+            // 岗位性质
+            Map<String, DynamicObject> gwxzMap = findGwxzMap();
+            // 岗位层级
+            Map<String, DynamicObject> gwcjMap = findGwcjMap();
+            // 最高学历
+            Map<String, DynamicObject> zgxlMap = findZgxlMap();
+            // 政治面貌
+            Map<String, DynamicObject> zzmmMap = findZzmmMap();
+            // 技术职称
+            Map<String, DynamicObject> jszcMap = findJszcMap();
+            // 职业技能等级
+            Map<String, DynamicObject> zyjndjMap = findZyjndjMap();
+            // 是否在岗
+            Map<String, DynamicObject> sfzgMap = findSfzgMap();
+            // 是否实行任期制和契约化管理或新型经营责任制集合
+            Map<String, DynamicObject> xxjyzzMap = findRqqyxxjyMap();
+            // 是否竞聘上岗或因考核调整
+            Map<String, DynamicObject> jpsgkhtzMap = findJpsgkhtzMap();
+            // 薪酬项目计算
+            DynamicObject xcxmjspz = findXcxmjspz();
+            // 获取数据填报配置
+            DynamicObject sjtbzfpsz = findSjtbpz();
+            // 获取所有的薪酬项目
+            List<String> xcxmList = findAllXcProject();
+
+            // 填报数据年月
+            Date nckd_tbsjny = this.getModel().getDataEntity().getDate("nckd_tbsjny");
+            // 当前日期
+            Date nowDate = new Date();
+            // 填报组织id
+            Object tbzzId = this.getModel().getDataEntity().get("org.id");
+            // 核算任务id
+            List<Long> hsTaskId = findHeSuanRenWuIds(tbzzId, nckd_tbsjny);
+
+            if (hsTaskId.size() > 0) {
+                // 获取薪酬项目明细
+                Map<Long, Map<String, Object>> xcxmMap =  findUserXcProject(hsTaskId);
+                String hsTaskIds = StringUtils.join(hsTaskId, ",");
+                // 查询人员数据
+                String ksql_rysj = " select a.fid as mingdanid,a.fempnumber as gonghao,c.fpersonid as renyuanid,c.femployeeid as qiyerenyuanid," +
+                        " a.fname as xingming,c.fstartdate as ruzhiriqi,s.fstartdate as ruzhiriqis,c.fisprimary as zhurenzhi," +
+                        " e.fnumber as ruzhifangshibm,e.fname as ruzhifangshimc,c.fenddate as lizhiriqi,s.fenddate as lizhiriqis," +
+                        " g.fnumber as xingbiebm,g.fname as xingbiemc,i.fnumber as zhengjianhm,j.fname as zhegnjianleixmc," +
+                        " j.fnumber as zhengjianleixbm,f.fage as nianling,h.fnumber as guojibm,h.fname as guojimc," +
+                        " a.forgid as gongsiid,k1.fnumber as gongsibm,k1.fname as gongsimc," +
+                        " c.fadminorgid as bumenid,k2.fname as bumenmc,k2.fstructlongnumber as bumencbm," +
+                        " l.fid as gangweiid,l.fnumber as gangweibm," +
+                        " l.fname as gangweimc,l.fk_nckd_dgwcj as gangweicjid,m.fnumber as gangweilbbm,m.fname as gangweilbmc," +
+                        " n.fnumber as zhijibm,n.fname as zhijimc,p.fnumber as xuelibm,p.fname as xuelimc,o.fmajor as zhuanye," +
+                        " q.fname as zhengzhimianmaomc,q.fnumber as zhengzhimianmaobm,t.fnumber as yonggonggxbm,t.fname as yonggonggxmc," +
+                        " t1.fnumber as yonggongjdbm,t1.fname as yonggongjdmc,d.fk_nckd_dgjjkjrclx as guojiajircid,d.fk_nckd_dsffbqyry as feibenqyry," +
+                        " u1.fid as jinengid,u1.fk_nckd_zhichengname as jinengmc,u1.fk_nckd_zhichenglevel as jinengdj,u1.fprolevelid as jinengjbid," +
+                        " u2.fid as zhiyeid,u2.fk_nckd_zhichengname as zhiyeidmc,u2.fk_nckd_zhichenglevel as zhiyeidj,u2.fprolevelid as zhiyejbid," +
+                        " u3.fid as zhichengid,u3.fk_nckd_zhichengname as zhichengmc,u3.fk_nckd_zhichenglevel as zhichengdj,u3.fprolevelid as zhichengjbid," +
+                        " i1.fstartdate as ruzhiriqifirst " +
+                        " from t_hsas_calperson a" +
+                        " left join t_hsas_calperson_s a1 on a.fid = a1.fid " +
+                        " left join t_hsas_calpayrolltask b on a.fcaltaskid = b.fid" +
+                        " left join t_hsas_empposorgrelhr c on a.fempposorgrelhrvid = c.fid" +
+                        " left join t_hrpi_perregion d on c.fpersonid = d.fpersonid and d.fiscurrentversion = 1 and d.fdatastatus = 1" +
+                        " left join t_hbss_recrutyp e on d.fk_nckd_zhaopinlaiyuannew = e.fid" +
+                        " left join t_hrpi_pernontsprop f on a.fpernontspropvid = f.fid" +
+                        " left join t_hbss_sex g on f.fgenderid = g.fid" +
+                        " left join t_hbss_nationality h on f.fnationalityid = h.fid" +
+                        " left join t_hrpi_percre i on i.fpersonid = c.fpersonid and i.fismajor = 1 and i.fiscurrentversion = 1 and i.fdatastatus = 1" +
+                        " left join t_hrpi_empentrel i1 on i1.fpersonid = c.fpersonid and i1.fiscurrentversion = 1 and i1.fdatastatus = 1 and i1.fislatestrecord = 1 " +
+                        " left join t_hbss_credentialstype j on i.fcredentialstypeid = j.fid" +
+                        " left join t_haos_adminorg k1 on k1.fid = a.forgid" +
+                        " left join t_haos_adminorg k2 on k2.fid = c.fadminorgid" +
+                        " left join t_hbpm_position l on l.fid = c.fpositionid" +
+                        " left join t_hbpm_positiontype m on m.fid = l.ftypeid" +
+                        " left join tk_nckd_hbss_zhiji n on n.fid = c.fk_nckd_zhijijx" +
+                        " left join t_hsas_pereduexp o on o.fpersonid = c.fpersonid and o.fiscurrentversion = 1 and o.fdatastatus = 1 and o.fishighestdegree = 1" +
+                        " left join t_hbss_diploma p on o.feducationid = p.fid" +
+                        " left join t_hbss_politicalstatus q on q.fid = d.fpoliticalstatusid" +
+                        " left join t_hsas_empentrel s on s.fid = a.fempentrelvid" +
+                        " left join t_hbss_laborrelstatus t on t.fid = s.flaborrelstatusid" +
+                        " left join t_hbss_labrelstatusprd t1 on s.flaborreltypeid  = t1.fid " +
+                        " left join t_hrpi_perprotitle u1 on c.fpersonid  = u1.fpersonid and u1.fiscurrentversion = 1 and u1.fdatastatus = 1 and u1.fk_nckd_iszuigao = 1 and u1.fk_nckd_type = 'jineng' " +
+                        " left join t_hrpi_perprotitle u2 on c.fpersonid  = u2.fpersonid and u2.fiscurrentversion = 1 and u2.fdatastatus = 1 and u2.fk_nckd_iszuigao = 1 and u2.fk_nckd_type = 'zhiye' " +
+                        " left join t_hrpi_perprotitle u3 on c.fpersonid  = u3.fpersonid and u3.fiscurrentversion = 1 and u3.fdatastatus = 1 and u3.fk_nckd_iszuigao = 1 and u3.fk_nckd_type = 'zhicheng'" +
+                        "  " +
+                        " where b.fid in ("+hsTaskIds+") and a1.fcalstatus in (4,10) " +
+                        //" and a.fempnumber in ('001630') " +
+                        "  ";
+                logger.info("查询人员数据SQL:{}", ksql_rysj);
+                DataSet dataSet_rysj = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), ksql_rysj);
+                Iterator<Row> iterator_rysj = dataSet_rysj.iterator();
+                List<ZgsrVO> zgsrVOList = new ArrayList();
+                List<Long> gongsiidList = new ArrayList();
+                Set<Long> personIdUserSet = new HashSet();
+                while (iterator_rysj.hasNext()) {
+                    Row row = iterator_rysj.next();
+                    ZgsrVO zgsrVO = new ZgsrVO();
+                    zgsrVO.setMingdanid(row.getLong("mingdanid"));
+                    zgsrVO.setGonghao(row.getString("gonghao"));
+                    zgsrVO.setRenyuanid(row.getLong("renyuanid"));
+                    zgsrVO.setQiyerenyuanid(row.getLong("qiyerenyuanid"));
+                    zgsrVO.setXingming(row.getString("xingming"));
+                    zgsrVO.setRuzhiriqi(row.getDate("ruzhiriqi"));
+                    zgsrVO.setRuzhiriqis(row.getDate("ruzhiriqis"));
+                    zgsrVO.setRuzhiriqifirst(row.getDate("ruzhiriqifirst"));
+                    zgsrVO.setRuzhifangshibm(row.getString("ruzhifangshibm"));
+                    zgsrVO.setRuzhifangshimc(row.getString("ruzhifangshimc"));
+                    zgsrVO.setLizhiriqi(row.getDate("lizhiriqi"));
+                    zgsrVO.setLizhiriqis(row.getDate("lizhiriqis"));
+                    zgsrVO.setXingbiebm(row.getString("xingbiebm"));
+                    zgsrVO.setXingbiemc(row.getString("xingbiemc"));
+                    zgsrVO.setZhengjianhm(row.getString("zhengjianhm"));
+                    zgsrVO.setZhegnjianleixmc(row.getString("zhegnjianleixmc"));
+                    zgsrVO.setZhengjianleixbm(row.getString("zhengjianleixbm"));
+                    zgsrVO.setNianling(row.getString("nianling"));
+                    zgsrVO.setGuojibm(row.getString("guojibm"));
+                    zgsrVO.setGuojimc(row.getString("guojimc"));
+                    zgsrVO.setBumenid(row.getLong("bumenid"));
+                    zgsrVO.setBumenmc(row.getString("bumenmc"));
+                    zgsrVO.setGongsiid(row.getLong("gongsiid"));
+                    zgsrVO.setGongsimc(row.getString("gongsimc"));
+                    zgsrVO.setGangweiid(row.getLong("gangweiid"));
+                    zgsrVO.setGangweimc(row.getString("gangweimc"));
+                    zgsrVO.setGangweibm(row.getString("gangweibm"));
+                    zgsrVO.setGangweilbbm(row.getString("gangweilbbm"));
+                    zgsrVO.setGangweicjid(row.getLong("gangweicjid"));
+                    zgsrVO.setZhijibm(row.getString("zhijibm"));
+                    zgsrVO.setZhijimc(row.getString("zhijimc"));
+                    zgsrVO.setXuelibm(row.getString("xuelibm"));
+                    zgsrVO.setXuelimc(row.getString("xuelimc"));
+                    zgsrVO.setZhuanye(row.getString("zhuanye"));
+                    zgsrVO.setZhengzhimianmaomc(row.getString("zhengzhimianmaomc"));
+                    zgsrVO.setZhengzhimianmaobm(row.getString("zhengzhimianmaobm"));
+                    zgsrVO.setYonggonggxbm(row.getString("yonggonggxbm"));
+                    zgsrVO.setYonggonggxmc(row.getString("yonggonggxmc"));
+                    zgsrVO.setYonggongjdbm(row.getString("yonggongjdbm"));
+                    zgsrVO.setYonggongjdmc(row.getString("yonggongjdmc"));
+                    zgsrVO.setFeibenqyry(row.getString("feibenqyry"));
+                    zgsrVO.setGuojiajircid(row.getLong("guojiajircid"));
+                    zgsrVO.setGongsibm(row.getString("gongsibm"));
+                    zgsrVO.setBumencbm(row.getString("bumencbm"));
+
+                    zgsrVO.setJinengid(row.getLong("jinengid"));
+                    zgsrVO.setJinengmc(row.getString("jinengmc"));
+                    zgsrVO.setJinengdj(row.getString("jinengdj"));
+                    zgsrVO.setJinengjbid(row.getLong("jinengjbid"));
+
+                    zgsrVO.setZhiyeid(row.getLong("zhiyeid"));
+                    zgsrVO.setZhiyeidmc(row.getString("zhiyeidmc"));
+                    zgsrVO.setZhiyeidj(row.getString("zhiyeidj"));
+                    zgsrVO.setZhiyejbid(row.getLong("zhiyejbid"));
+
+                    zgsrVO.setZhichengid(row.getLong("zhichengid"));
+                    zgsrVO.setZhichengmc(row.getString("zhichengmc"));
+                    zgsrVO.setZhichengdj(row.getString("zhichengdj"));
+                    zgsrVO.setZhichengjbid(row.getLong("zhichengjbid"));
+                    zgsrVO.setZhurenzhi(row.getString("zhurenzhi"));
+
+                    gongsiidList.add(zgsrVO.getGongsiid());
+                    zgsrVOList.add(zgsrVO);
+                    personIdUserSet.add(zgsrVO.getRenyuanid());
+                }
+                if (zgsrVOList.size() > 0) {
+                    // 获取人员薪酬数据
+                    Map<Long, ZgsrDetailsAmtVO> userJbxcData = getUserJbxcData(xcxmMap, zgsrVOList, xcxmjspz, xcxmList);
+                    // 获取组织人数据
+                    Map<Long, Long> hrpiDepempMap = findHrpiDepempMap(zgsrVOList);
+                    // 获取人员证书
+                    Map<Long, List<DynamicObject>> uerZhenShuMap = findUserZhenShuMap(zgsrVOList);
+                    // 获取人员任职经历变化数据
+                    Map<Long, List<DynamicObject>> userRenZhiJingLiBianHuaMap = findUserRenZhiJingLiBianHuaMap(zgsrVOList, nckd_tbsjny);
+                    // 获取人员任职经历数据
+                    Map<Long, List<DynamicObject>> userRenZhiJingLiMap = findUserRenZhiJingLiMap(zgsrVOList, nckd_tbsjny);
+                    // 获取人员项目经历数据
+                    Map<Long, List<DynamicObject>> userXiangMuJingLiMap = findUserXiangMuJingLiMap(zgsrVOList);
+                    // 获取人员职称级别信息
+                    Map<Long, DynamicObject> userZhiChenMap = findUserZhiChenMap(zgsrVOList);
+
+                    // 根据公司id获取业务单元数据
+                    Long[] gongsidStr = (Long[]) gongsiidList.toArray(new Long[gongsiidList.size()]);
+                    List<QFilter> qfilterYwdy = new ArrayList<QFilter>();
+                    qfilterYwdy.add(new QFilter("id", "in", gongsidStr));
+                    QFilter[] filtersYwdy = (QFilter[]) qfilterYwdy.toArray(new QFilter[qfilterYwdy.size()]);
+                    String selectYwdyFields = "id,number,name,uniformsocialcreditcode,ffirmname,ftaxregnum";
+                    DynamicObjectCollection ywdyObjectCollection = QueryServiceHelper.query("bos_org", selectYwdyFields, filtersYwdy);
+                    // 将所有的业务单元放到map中
+                    Map<Object, DynamicObject> ywdyObjMap = new LinkedHashMap<Object, DynamicObject>();
+                    for (int i = 0; i < ywdyObjectCollection.size(); i++) {
+                        DynamicObject dynamicObject = ywdyObjectCollection.get(i);
+                        ywdyObjMap.put(dynamicObject.get("id"), dynamicObject);
+                    }
+                    // 处理单据体
+                    IDataModel dataModel = this.getModel();
+                    int createNewRow = personIdUserSet.size();
+                    int newRow = this.getModel().getEntryEntity("nckd_dwzgsrentry").size();
+                    dataModel.batchCreateNewEntryRow("nckd_dwzgsrentry", createNewRow);
+                    Set<Long> personIdSet = new HashSet<Long>();
+                    for (ZgsrVO zgsrVO: zgsrVOList) {
+                        // 过滤掉重复的薪酬记录,薪酬获取已合并
+                        if(personIdSet.contains(zgsrVO.getRenyuanid())) {
+                            continue;
+                        } else {
+                            personIdSet.add(zgsrVO.getRenyuanid());
+                        }
+                        Object gongsiid = zgsrVO.getGongsiid();
+                        DynamicObject ywdyObject = ywdyObjMap.get(gongsiid);
+                        Object uniformsocialcreditcode = ywdyObject.get("uniformsocialcreditcode");// 统一社会信用代码
+                        dataModel.setValue("nckd_dtjny", nckd_tbsjny, newRow);// 统计年月
+                        if (!isNullEmpty(uniformsocialcreditcode)) {
+                            dataModel.setValue("nckd_dzqyxxdm", uniformsocialcreditcode, newRow);// 子企业统一社会信用代码
+                        }
+                        dataModel.setValue("nckd_dzqydwdata", gongsiid, newRow);// 子企业单位名称
+                        if (hrpiDepempMap.get(zgsrVO.getRenyuanid()) != null) {
+                            dataModel.setValue("nckd_dxmdata", hrpiDepempMap.get(zgsrVO.getRenyuanid()), newRow);// 姓名--更新未工号
+                        }
+                        //dataModel.setValue("nckd_dxmdatasn", zgsrVO.getGonghao(), newRow);// 工号--更新未姓名
+                        dataModel.setValue("nckd_dxmdatasn", zgsrVO.getXingming(), newRow);
+                        boolean isMoreRzjlbh = isMoreRzjlbhDifferent(nckd_tbsjny, zgsrVO, userRenZhiJingLiMap);// 是否有主任职经历变化
+                        if (isMoreRzjlbh) {
+                            dataModel.setValue("nckd_drzrq", zgsrVO.getRuzhiriqi(), newRow);// 入职日期
+                        } else {
+                            dataModel.setValue("nckd_drzrq", zgsrVO.getRuzhiriqifirst(), newRow);// 入职日期
+                        }
+                        boolean isMoreRzjlbhCompany = isMoreRzjlbhDifferentCompany(nckd_tbsjny, zgsrVO, userRenZhiJingLiMap);// 是否有多公司主任职经历
+                        // 2024年1月前入职选择空白项
+                        Integer rzriqYear = 999999;
+                        if (zgsrVO.getRuzhiriqi() != null) {
+                            rzriqYear = Integer.valueOf(DateUtils.formatDate(zgsrVO.getRuzhiriqi(), "yyyyMM"));
+                        }
+                        if (rzriqYear.intValue() < 202401) {
+                            DynamicObject rzfsObj = rzfsMap.get("50");
+                            dataModel.setValue("nckd_drzfs", rzfsObj.get("id"), newRow);// 入职方式
+                        } else {
+                            if (isMoreRzjlbhCompany) {
+                                DynamicObject rzfsObj = rzfsMap.get("40");//集团内部调动
+                                dataModel.setValue("nckd_drzfs", rzfsObj.get("id"), newRow);
+                            } else {
+                                String ruzhifangshibm = zgsrVO.getRuzhifangshibm();
+                                if ("1010_S".equals(ruzhifangshibm) || "1020_S".equals(ruzhifangshibm)) {// 校园招聘或社会招聘
+                                    DynamicObject rzfsObj = rzfsMap.get("10");// 公开招聘
+                                    dataModel.setValue("nckd_drzfs", rzfsObj.get("id"), newRow);
+                                } else if ("1050_S".equals(ruzhifangshibm) || "1060_S".equals(ruzhifangshibm)) {// 组织安置或退役大学生士兵
+                                    DynamicObject rzfsObj = rzfsMap.get("20");// 政策性安置
+                                    dataModel.setValue("nckd_drzfs", rzfsObj.get("id"), newRow);
+                                } else if ("1040_S".equals(ruzhifangshibm)) {// 组织任命
+                                    DynamicObject rzfsObj = rzfsMap.get("30");//组织委派
+                                    dataModel.setValue("nckd_drzfs", rzfsObj.get("id"), newRow);
+                                } else if ("1030_S".equals(ruzhifangshibm)) {// 内部招聘
+                                    DynamicObject rzfsObj = rzfsMap.get("40");//集团内部调动
+                                    dataModel.setValue("nckd_drzfs", rzfsObj.get("id"), newRow);
+                                } else {
+                                    DynamicObject rzfsObj = rzfsMap.get("50");
+                                    dataModel.setValue("nckd_drzfs", rzfsObj.get("id"), newRow);// 其他
+                                }
+                            }
+                        }
+
+                        // 离职日期
+                        Date lizhiRiQiDate = null;
+                        if (isMoreRzjlbhCompany) { // 跨公司调动了
+                            if ("1".equals(zgsrVO.getZhurenzhi())) {
+                                lizhiRiQiDate = getLiZhiRiQi(nckd_tbsjny, zgsrVO.getLizhiriqi());
+                            } else {
+                                lizhiRiQiDate = getLiZhiRiQi(nckd_tbsjny, zgsrVO.getLizhiriqis());
+                            }
+                        } else {
+                            lizhiRiQiDate = getLiZhiRiQi(nckd_tbsjny, zgsrVO.getLizhiriqis());
+                        }
+                        if (lizhiRiQiDate != null) {
+                            dataModel.setValue("nckd_dlzsj", lizhiRiQiDate, newRow);// 离职时间
+                        }
+
+
+                        if ("1020_S".equals(zgsrVO.getXingbiebm())) {
+                            dataModel.setValue("nckd_dxb", "0", newRow);// 性别女
+                        } else if ("1010_S".equals(zgsrVO.getXingbiebm())){
+                            dataModel.setValue("nckd_dxb", "1", newRow);// 性别男
+                        }
+                        if ("1010_S".equals(zgsrVO.getZhengjianleixbm())) {// 中国居民身份证
+                            DynamicObject zjlxObj = zjlxMap.get("1");// 身份证
+                            dataModel.setValue("nckd_dzjlx", zjlxObj.get("id"), newRow);
+                        } else if ("1030_S".equals(zgsrVO.getZhengjianleixbm()) || "1060_S".equals(zgsrVO.getZhengjianleixbm())) {// 港澳居民居住证
+                            DynamicObject zjlxObj = zjlxMap.get("2");// 2-港澳居民来往内地通行证(回乡证)
+                            dataModel.setValue("nckd_dzjlx", zjlxObj.get("id"), newRow);
+                        } else if ("1040_S".equals(zgsrVO.getZhengjianleixbm()) || "1070_S".equals(zgsrVO.getZhengjianleixbm())) {// 台湾居民居住证
+                            DynamicObject zjlxObj = zjlxMap.get("3");// 3-台湾居民来往大陆通行证(台胞证)
+                            dataModel.setValue("nckd_dzjlx", zjlxObj.get("id"), newRow);
+                        } else if ("1020_S".equals(zgsrVO.getZhengjianleixbm())) {// 护照
+                            DynamicObject zjlxObj = zjlxMap.get("4");// 4-护照
+                            dataModel.setValue("nckd_dzjlx", zjlxObj.get("id"), newRow);
+                        } else  {
+                            DynamicObject zjlxObj = zjlxMap.get("5");// 其他
+                            dataModel.setValue("nckd_dzjlx", zjlxObj.get("id"), newRow);
+                        }
+                        dataModel.setValue("nckd_dzjhm", zgsrVO.getZhengjianhm(), newRow);// 证件号码
+                        dataModel.setValue("nckd_dnl", Integer.valueOf(zgsrVO.getNianling()), newRow);// 年龄
+                        if (!isNullEmpty(zgsrVO.getGuojimc())) {
+                            Long guojiaId = getGongJiaId(gjdqMap, zgsrVO.getGuojimc());
+                            dataModel.setValue("nckd_dgjdq", guojiaId, newRow);// 国家地区
+                        }
+                        dataModel.setValue("nckd_dbmbadata", zgsrVO.getBumenid(), newRow);// 部门
+                        dataModel.setValue("nckd_dgw", zgsrVO.getGangweiid(), newRow);// 岗位
+                        // 处理岗位性质逻辑
+                        boolean isJiNengRc = false;// 技能人才
+                        String gangWeiXingZhiNumber = "";// 岗位性质编号
+                        if ("1010_S".equals(zgsrVO.getZhijibm()) || "1020_S".equals(zgsrVO.getZhijibm()) || "1030_S".equals(zgsrVO.getZhijibm())
+                                || "1040_S".equals(zgsrVO.getZhijibm()) || "1050_S".equals(zgsrVO.getZhijibm())) { //高管/中层正职/中层副职/主管/部长助理/主任助理
+                            DynamicObject gwxzObj = gwxzMap.get("10");// 管理岗
+                            dataModel.setValue("nckd_dgwxz", gwxzObj.get("id"), newRow);//岗位性质
+                            gangWeiXingZhiNumber = "10";
+                        } else if ("1060_S".equals(zgsrVO.getZhijibm()) || "1070_S".equals(zgsrVO.getZhijibm())) { //主任工程师/副主任工程师
+                            DynamicObject gwxzObj = gwxzMap.get("20");// 技术岗
+                            dataModel.setValue("nckd_dgwxz", gwxzObj.get("id"), newRow);//岗位性质
+                            gangWeiXingZhiNumber = "20";
+                        } else {
+                            String gangweimc = zgsrVO.getGangweimc();//岗位名称
+                            String gangweilbbm = zgsrVO.getGangweilbbm();//岗位类别编码
+                            if (gangweimc.contains("技术员") && !"GWFL_07".equals(gangweilbbm)) {
+                                DynamicObject gwxzObj = gwxzMap.get("20");// 技术岗
+                                dataModel.setValue("nckd_dgwxz", gwxzObj.get("id"), newRow);//岗位性质
+                                gangWeiXingZhiNumber = "20";
+                            } else {
+                                if (uerZhenShuMap.get(zgsrVO.getRenyuanid()) != null) { // 有证书
+                                    DynamicObject gwxzObj = gwxzMap.get("30");// 一线技能岗
+                                    dataModel.setValue("nckd_dgwxz", gwxzObj.get("id"), newRow);//岗位性质
+                                    gangWeiXingZhiNumber = "30";
+                                    isJiNengRc = true;
+                                } else {
+                                    DynamicObject gwxzObj = gwxzMap.get("40");// 一线其他岗
+                                    dataModel.setValue("nckd_dgwxz", gwxzObj.get("id"), newRow);//岗位性质
+                                    gangWeiXingZhiNumber = "40";
+                                }
+                            }
+                        }
+
+                        // 处理岗位层级、职称、职业技能等级、执业资格逻辑
+                        getGangWeiXingZhiId(dataModel, gwcjMap, gangWeiXingZhiNumber, zgsrVO, newRow, userZhiChenMap);
+
+                        Long zgxlId = getZuigaoxueliId(zgxlMap, zgsrVO.getXuelibm());
+                        dataModel.setValue("nckd_dzgxl", zgxlId, newRow);//最高学历
+                        dataModel.setValue("nckd_dzy", zgsrVO.getZhuanye(), newRow);//专业
+                        Long zzmmId = getZzmmId(zzmmMap, zgsrVO.getZhengzhimianmaomc());
+                        dataModel.setValue("nckd_dzzmm", zzmmId, newRow);// 政治面貌
+                        // 处理是否在岗业务逻辑
+                        String yonggonggxbm = zgsrVO.getYonggonggxbm();
+                        String yonggongjdbm = zgsrVO.getYonggongjdbm();
+                        if ("1180_S".equals(yonggonggxbm) || "1200_S".equals(yonggonggxbm)
+                                || "1190_S".equals(yonggonggxbm) || "1020_S".equals(yonggongjdbm)) {// 长期休假/三年离岗创业/离岗退养/用工关系终止
+                            DynamicObject sfzgObj = sfzgMap.get("30");// 其他离岗
+                            dataModel.setValue("nckd_dsfzg", sfzgObj.get("id"), newRow);//是否在岗
+                        } else {
+                            DynamicObject sfzgObj = sfzgMap.get("10");// 是
+                            dataModel.setValue("nckd_dsfzg", sfzgObj.get("id"), newRow);//是否在岗
+                        }
+                        if ("1".equals(zgsrVO.getFeibenqyry())) {
+                            dataModel.setValue("nckd_dsffbqyry", zgsrVO.getFeibenqyry(), newRow);//是否非本企业人员
+                        } else {
+                            dataModel.setValue("nckd_dsffbqyry", 0, newRow);//是否非本企业人员
+                        }
+
+                        if ("101".equals(zgsrVO.getGongsibm())) {// 江西省盐业集团股份有限公司总部
+                            dataModel.setValue("nckd_dsfyjqyzbry", "1", newRow);//是否一级企业总部人员
+                        } else {
+                            dataModel.setValue("nckd_dsfyjqyzbry", "0", newRow);//是否一级企业总部人员
+                        }
+                        if ("1010_S".equals(zgsrVO.getZhijibm())) {// 职级等于高管
+                            dataModel.setValue("nckd_dsfgg", "1", newRow);//是否高管
+                        } else {
+                            dataModel.setValue("nckd_dsfgg", "0", newRow);//是否高管
+                        }
+                        if (zgsrVO.getGangweimc().contains("专职外部董事")) {
+                            dataModel.setValue("nckd_dsfwzzwbds", "1", newRow);//是否专职外部董事
+                        } else {
+                            dataModel.setValue("nckd_dsfwzzwbds", "0", newRow);//是否专职外部董事
+                        }
+                        dataModel.setValue("nckd_dsfzyjlr", "0", newRow);//是否职业经理人
+                        dataModel.setValue("nckd_dsfkjrc", "0", newRow);//是否为科技人才
+                        if (isJiNengRc) {
+                            dataModel.setValue("nckd_dsfjnrc", "1", newRow);//是否为技能人才
+                        } else {
+                            dataModel.setValue("nckd_dsfjnrc", "0", newRow);//是否为技能人才
+                        }
+                        dataModel.setValue("nckd_dgjjkjrclx", zgsrVO.getGuojiajircid(), newRow);//国家级科技人才类型
+                        // 处理是否从事研发工作逻辑
+                        if (isHaveYanFaWork(zgsrVO.getBumencbm(), sjtbzfpsz, userXiangMuJingLiMap, xcxmMap,
+                                zgsrVO.getMingdanid(), zgsrVO.getRenyuanid(), nckd_tbsjny)) {
+                            dataModel.setValue("nckd_dsffzjcsyfggz", 1, newRow);//是否直接从事研发工作
+                        } else {
+                            dataModel.setValue("nckd_dsffzjcsyfggz", 0, newRow);//是否直接从事研发工作
+                        }
+                        if ("1010_S".equals(zgsrVO.getRuzhifangshibm())) {// 招聘来源校园招聘
+                            dataModel.setValue("nckd_dsfyjbys", 1, newRow);//是否应届毕业生就业
+                        } else {
+                            dataModel.setValue("nckd_dsfyjbys", 0, newRow);//是否应届毕业生就业
+                        }
+                        if ("1010_S".equals(zgsrVO.getZhijibm())) {// 职级等于高管
+                            DynamicObject xxjyzzObj = xxjyzzMap.get("10");// 实行任期制和契约化管理
+                            dataModel.setValue("nckd_dsfrqqy", xxjyzzObj.get("id"), newRow);//是否实行任期制和契约化管理或新型经营责任制
+                        } else if ("1020_S".equals(zgsrVO.getZhijibm()) || "1030_S".equals(zgsrVO.getZhijibm())
+                                || "1060_S".equals(zgsrVO.getZhijibm()) || "1070_S".equals(zgsrVO.getZhijibm())) { //中层正职+副职+主任工程师+副主任工程师
+                            DynamicObject xxjyzzObj = xxjyzzMap.get("20");// 新型经营责任制
+                            dataModel.setValue("nckd_dsfrqqy", xxjyzzObj.get("id"), newRow);//是否实行任期制和契约化管理或新型经营责任制
+                        } else if ("1050_S".equals(zgsrVO.getZhijibm())) {// 主任助理
+                            if (isJkGs(zgsrVO.getGongsibm(), sjtbzfpsz)) {// 晶昊公司的人
+                                DynamicObject xxjyzzObj = xxjyzzMap.get("20");// 新型经营责任制
+                                dataModel.setValue("nckd_dsfrqqy", xxjyzzObj.get("id"), newRow);//是否实行任期制和契约化管理或新型经营责任制
+                            }
+                        }
+                        if ("1180_S".equals(yonggonggxbm) || "1200_S".equals(yonggonggxbm)
+                                || "1010_S".equals(yonggonggxbm)|| "1190_S".equals(yonggonggxbm)) {// 长期休假/三年离岗创业/试用期人员/离岗退养
+                            dataModel.setValue("nckd_dsfjxkh", 0, newRow);//是否实行绩效考核
+                        } else {
+                            dataModel.setValue("nckd_dsfjxkh", 1, newRow);//是否实行绩效考核
+                        }
+
+                        boolean isGangWeiTiaoZheng = false;
+                        if (isRzjlbh(zgsrVO.getRenyuanid(), userRenZhiJingLiBianHuaMap)) {// 判断填报月份是否有任职经历记录
+                            dataModel.setValue("nckd_dsfygwtz", 1, newRow);//是否有岗位调整
+                            isGangWeiTiaoZheng = true;
+                        } else {
+                            dataModel.setValue("nckd_dsfygwtz", 0, newRow);//是否有岗位调整
+                        }
+
+                        if (isGangWeiTiaoZheng) {
+                            if ("1010_S".equals(zgsrVO.getRuzhifangshibm()) || "1020_S".equals(zgsrVO.getRuzhifangshibm())) {// 校园招聘或社会招聘
+                                DynamicObject jpsgkhtzObj = jpsgkhtzMap.get("10");// 竞聘上岗
+                                dataModel.setValue("nckd_dsfjpsg", jpsgkhtzObj.get("id"), newRow);//是否竞聘上岗或因考核调整
+                            } else {
+                                DynamicObject jpsgkhtzObj = jpsgkhtzMap.get("30");// 无
+                                dataModel.setValue("nckd_dsfjpsg", jpsgkhtzObj.get("id"), newRow);//是否竞聘上岗或因考核调整
+                            }
+                        } else {
+                            DynamicObject jpsgkhtzObj = jpsgkhtzMap.get("30");// 无
+                            dataModel.setValue("nckd_dsfjpsg", jpsgkhtzObj.get("id"), newRow);//是否竞聘上岗或因考核调整
+                        }
+
+                        // 处理薪酬项目字段
+                        //getUserJbxc( dataModel , xcxmMap,  zgsrVO.getMingdanid(),  xcxmjspz, xcxmList,  newRow);
+                        if (userJbxcData.get(zgsrVO.getRenyuanid()) != null) {
+                            ZgsrDetailsAmtVO zgsrDetailsAmtVO = userJbxcData.get(zgsrVO.getRenyuanid());
+                            dataModel.setValue("nckd_djbxc", zgsrDetailsAmtVO.getNckd_djbxc(), newRow);// 基本薪酬
+                            dataModel.setValue("nckd_ddnyfjx", zgsrDetailsAmtVO.getNckd_ddnyfjx(), newRow);// 当年应发绩效
+                            dataModel.setValue("nckd_dyjdnjx", zgsrDetailsAmtVO.getNckd_dyjdnjx(), newRow);// 预发当年绩效
+                            dataModel.setValue("nckd_dbfsnjx", zgsrDetailsAmtVO.getNckd_dbfsnjx(), newRow);// 补发上年绩效
+                            dataModel.setValue("nckd_dydyzfjx", zgsrDetailsAmtVO.getNckd_dydyzfjx(), newRow);// 应递延支付绩效
+                            dataModel.setValue("nckd_dffsyrjxjl", zgsrDetailsAmtVO.getNckd_dffsyrjxjl(), newRow);// 发放上一任期的任期激励
+                            dataModel.setValue("nckd_dytbnrqjl", zgsrDetailsAmtVO.getNckd_dytbnrqjl(), newRow);// 预提本年度任期激励
+                            dataModel.setValue("nckd_djbt", zgsrDetailsAmtVO.getNckd_djbt(), newRow);// 津补贴
+                            dataModel.setValue("nckd_dqtycxzxjl", zgsrDetailsAmtVO.getNckd_dqtycxzxjl(), newRow);// 其他一次性专项奖励
+                        }
+                        newRow ++;
+                    }
+                }
+            }
+
+
+        }
+        super.afterDoOperation(ags);
+    }
+
+    public List<Long> findHeSuanRenWuIds(Object tbzzId, Date nckd_tbsjny) {
+        List<Long> hsrwIds = new ArrayList<Long>();
+        // 查询所有下级组织
+        List<QFilter> qfilterHr = new ArrayList<QFilter>();
+        qfilterHr.add(new QFilter("iscurrentversion", "=", "1"));// 是否当前版本
+        qfilterHr.add(new QFilter("datastatus", "=", "1"));// 数据版本状态
+        qfilterHr.add(new QFilter("nckd_sssjgsdata.id", "=", tbzzId).or(new QFilter("id", "=", tbzzId)));// 所属公司为填报组织
+        QFilter[] filtersQueryHr = (QFilter[]) qfilterHr.toArray(new QFilter[qfilterHr.size()]);
+        String selectHrFields = "id,number,structnumber,structlongnumber,name,nckd_qyszhy.id,nckd_gjdq.id,nckd_xzqh.id,nckd_sscj.id,nckd_qygm.id,nckd_sslx.id,nckd_sfnrhbbb,nckd_sfsykjxqy" +
+                ",nckd_kjxqylx.id,nckd_qyfl.id,nckd_zcqjl,nckd_jbsszcqjl,nckd_zqypxm,simplename";
+        DynamicObjectCollection hrObjectCollection = QueryServiceHelper.query("haos_adminorghr", selectHrFields, filtersQueryHr, "sortcode asc");
+        if (hrObjectCollection.size() > 0) {
+            Long[] hrOrgIds = new Long[hrObjectCollection.size()];
+            for (int i = 0; i < hrObjectCollection.size(); i++) {
+                DynamicObject dynamicObject = hrObjectCollection.get(i);
+                hrOrgIds[i] = dynamicObject.getLong("id");
+            }
+            List<QFilter> qfilterHs = new ArrayList<QFilter>();
+            qfilterHs.add(new QFilter("enable", "=", "1"));// 使用状态
+            qfilterHs.add(new QFilter("taskstatus", "=", "4").or(new QFilter("taskstatus", "=", "7")));// 任务状态-审批通过-已审核
+            qfilterHs.add(new QFilter("org.id", "in", hrOrgIds));// 核算组织id
+            qfilterHs.add(new QFilter("payrolldate", "=", nckd_tbsjny));// 薪资所属年月
+            qfilterHs.add(new QFilter("payrollscene.nckd_notgzbb", "=", "0"));// 核算场景
+            QFilter[] filtersQueryHs = (QFilter[]) qfilterHs.toArray(new QFilter[qfilterHs.size()]);
+            String selectHsFields = "id,name,number";
+            DynamicObjectCollection hsObjectCollection = QueryServiceHelper.query("hsas_calpayrolltask", selectHsFields, filtersQueryHs);
+            if (hsObjectCollection.size() > 0) {
+                for (int i = 0; i < hsObjectCollection.size(); i++) {
+                    DynamicObject dynamicObject = hsObjectCollection.get(i);
+                    hsrwIds.add(dynamicObject.getLong("id"));
+                }
+            }
+        }
+        return hsrwIds;
+    }
+
+    /**空判断*/
+    public static boolean isNullEmpty(Object obj) {
+        return obj == null || (obj instanceof String && ((String) obj).isEmpty());
+    }
+
+    /**转换国籍*/
+    public Long getGongJiaId(Map<String, DynamicObject> gjdqMap, String gongJiaName) {
+        Long id = 0L;
+        if (isNullEmpty(gongJiaName)) {
+            return id;
+        }
+        Set<String> gjdqKeys = gjdqMap.keySet();
+        for (String key : gjdqKeys) {
+            if (key.contains(gongJiaName)) {
+                DynamicObject gjdqObj = gjdqMap.get(key);
+                id = gjdqObj.getLong("id");
+            }
+        }
+        return id;
+    }
+
+    /**转换岗位层级以及填充技术职称、职业技能等级、执业资格*/
+    public void getGangWeiXingZhiId(IDataModel dataModel, Map<String, DynamicObject> gwcjMap, String gangWeiXingZhiNumber,
+                                    ZgsrVO zgsrVO, int rowIndex, Map<Long, DynamicObject> userZhiChenMap) {
+        /**①用工关系状态为长期病假、三年创业、离岗退养归入到其他;
+         ②岗位信息上增加岗位层级字段;如果有岗位层级则先取,没有的话则进行转换;
+         企业正副职、部门正副职、内设机构正副职等通过岗位信息上的字段;
+         ③一般管理岗:岗位性质中管理岗的其他人员;
+         ④正高级、高级、中级等专业技术人员:先取职称证书的最高等级,再取仅信息证书的最高等级;岗位性质为技术岗但是没有证书的进未鉴定职称技术人才;(证书信息中的职称级别增加属性字段,对照关系)
+         ⑤岗位性质为一线技能岗、一线员工岗的其他人员归入未鉴定技能等级人员*/
+        Long zeroId = 0L;
+        boolean isSetGwcj = false;
+        boolean isSetJszc = false;
+        boolean isSetZyjndj = false;
+
+        //长期休假 离岗退养 三年离岗创业
+        if ("1180_S".equals(zgsrVO.getYonggonggxbm()) || "1190_S".equals(zgsrVO.getYonggonggxbm()) || "1200_S".equals(zgsrVO.getYonggonggxbm())) {
+            DynamicObject gwcjObj = gwcjMap.get("91");// 其他
+            dataModel.setValue("nckd_dgwcj", gwcjObj.getLong("id"), rowIndex);
+            isSetGwcj = true;
+        }
+        if (!zeroId.equals(zgsrVO.getGangweicjid()) && !isSetGwcj) {
+            dataModel.setValue("nckd_dgwcj", zgsrVO.getGangweicjid(), rowIndex);
+            isSetGwcj = true;
+        }
+        if ("10".equals(gangWeiXingZhiNumber) && !isSetGwcj) {
+            DynamicObject gwcjObj = gwcjMap.get("16");//一般管理人员
+            dataModel.setValue("nckd_dgwcj", gwcjObj.getLong("id"), rowIndex);
+            isSetGwcj = true;
+        }
+
+        // 先判断职称最高等级
+        if (!zeroId.equals(zgsrVO.getZhichengid()) && !zeroId.equals(zgsrVO.getZhichengjbid())) {
+            if (userZhiChenMap.get(zgsrVO.getZhichengjbid()) != null) {
+                DynamicObject zhichengjbObj = userZhiChenMap.get(zgsrVO.getZhichengjbid());
+                // 岗位层级
+                if (!zeroId.equals(zhichengjbObj.getLong("nckd_dgwcj.id")) && !isSetGwcj) {
+                    dataModel.setValue("nckd_dgwcj", zhichengjbObj.getLong("nckd_dgwcj.id"), rowIndex);
+                    isSetGwcj = true;
+                }
+                // 技术职称
+                if (!zeroId.equals(zhichengjbObj.getLong("nckd_djszc.id")) && !isSetJszc) {
+                    dataModel.setValue("nckd_djszc", zhichengjbObj.getLong("nckd_djszc.id"), rowIndex);
+                    isSetJszc = true;
+                }
+                // 职业技能等级
+                /*if (!zeroId.equals(zhichengjbObj.getLong("nckd_dzyjndj.id")) && !isSetZyjndj) {
+                    dataModel.setValue("nckd_dzyjndj", zhichengjbObj.getLong("nckd_dzyjndj.id"), rowIndex);
+                    isSetZyjndj = true;
+                }*/
+            }
+        }
+        // 再判断技能最高等级
+        if (!zeroId.equals(zgsrVO.getJinengid()) && !zeroId.equals(zgsrVO.getJinengjbid())) {
+            if (userZhiChenMap.get(zgsrVO.getJinengjbid()) != null) {
+                DynamicObject jinengjbObj = userZhiChenMap.get(zgsrVO.getJinengjbid());
+                // 岗位层级
+                if (!zeroId.equals(jinengjbObj.getLong("nckd_dgwcj.id")) && !isSetGwcj) {
+                    dataModel.setValue("nckd_dgwcj", jinengjbObj.getLong("nckd_dgwcj.id"), rowIndex);
+                    isSetGwcj = true;
+                }
+                // 技术职称
+               /* if (!zeroId.equals(jinengjbObj.getLong("nckd_djszc.id")) && !isSetJszc) {
+                    dataModel.setValue("nckd_djszc", jinengjbObj.getLong("nckd_djszc.id"), rowIndex);
+                    isSetJszc = true;
+                }*/
+                // 职业技能等级
+                if (!zeroId.equals(jinengjbObj.getLong("nckd_dzyjndj.id")) && !isSetZyjndj) {
+                    dataModel.setValue("nckd_dzyjndj", jinengjbObj.getLong("nckd_dzyjndj.id"), rowIndex);
+                    isSetZyjndj = true;
+                }
+            }
+
+        }
+        // 再判断执业资格最高等级
+        if (!zeroId.equals(zgsrVO.getZhiyeid()) && !zeroId.equals(zgsrVO.getZhiyejbid())) {
+            if (userZhiChenMap.get(zgsrVO.getZhiyejbid()) != null) {
+                DynamicObject zhiyejbObj = userZhiChenMap.get(zgsrVO.getZhiyejbid());
+                if (!zeroId.equals(zhiyejbObj.getLong("nckd_dgwcj.id")) && !isSetGwcj) {
+                    dataModel.setValue("nckd_dgwcj", zhiyejbObj.getLong("nckd_dgwcj.id"), rowIndex);
+                    isSetGwcj = true;
+                }
+                // 技术职称
+                /*if (!zeroId.equals(zhiyejbObj.getLong("nckd_djszc.id")) && !isSetJszc) {
+                    dataModel.setValue("nckd_djszc", zhiyejbObj.getLong("nckd_djszc.id"), rowIndex);
+                    isSetJszc = true;
+                }*/
+                // 职业技能等级
+                /*if (!zeroId.equals(zhiyejbObj.getLong("nckd_dzyjndj.id")) && !isSetZyjndj) {
+                    dataModel.setValue("nckd_dzyjndj", zhiyejbObj.getLong("nckd_dzyjndj.id"), rowIndex);
+                    isSetZyjndj = true;
+                }*/
+            }
+        }
+
+        // 执业资格
+        if (isNullEmpty(zgsrVO.getZhiyeidmc())) {
+            dataModel.setValue("nckd_dzyzg", "无", rowIndex);
+        } else {
+            dataModel.setValue("nckd_dzyzg", zgsrVO.getZhiyeidmc(), rowIndex);
+        }
+
+        if ("20".equals(gangWeiXingZhiNumber) && !isSetGwcj) {
+            DynamicObject gwcjObj = gwcjMap.get("24");//未评定职称技术人员
+            dataModel.setValue("nckd_dgwcj", gwcjObj.getLong("id"), rowIndex);
+            isSetGwcj = true;
+        }
+        if (("30".equals(gangWeiXingZhiNumber) || "40".equals(gangWeiXingZhiNumber)) && !isSetGwcj) {
+            DynamicObject gwcjObj = gwcjMap.get("37");//未鉴定技能等级人员
+            dataModel.setValue("nckd_dgwcj", gwcjObj.getLong("id"), rowIndex);
+            isSetGwcj = true;
+        }
+    }
+
+
+    /**转换最高学历*/
+    public Long getZuigaoxueliId(Map<String, DynamicObject> zgxlMap, String xueliNumber) {
+        Long id = 0L;
+        if (isNullEmpty(xueliNumber)) {
+            return id;
+        }
+        if ("1010_S".equals(xueliNumber)) {//博士研究生
+            DynamicObject zgxlObj = zgxlMap.get("10");
+            id = zgxlObj.getLong("id");
+        } else if ("1020_S".equals(xueliNumber)) {//硕士研究生
+            DynamicObject zgxlObj = zgxlMap.get("20");
+            id = zgxlObj.getLong("id");
+        } else if ("1030_S".equals(xueliNumber)) {//本科
+            DynamicObject zgxlObj = zgxlMap.get("30");
+            id = zgxlObj.getLong("id");
+        } else if ("1040_S".equals(xueliNumber)) {//大专
+            DynamicObject zgxlObj = zgxlMap.get("40");
+            id = zgxlObj.getLong("id");
+        } else if ("1050_S".equals(xueliNumber)) {//高中
+            DynamicObject zgxlObj = zgxlMap.get("60");
+            id = zgxlObj.getLong("id");
+        } else if ("1055_S".equals(xueliNumber)) {//职高
+            DynamicObject zgxlObj = zgxlMap.get("50");
+            id = zgxlObj.getLong("id");
+        } else if ("1060_S".equals(xueliNumber)) {//中专
+            DynamicObject zgxlObj = zgxlMap.get("50");
+            id = zgxlObj.getLong("id");
+        } else if ("1061_S".equals(xueliNumber)) {//技校
+            DynamicObject zgxlObj = zgxlMap.get("50");
+            id = zgxlObj.getLong("id");
+        } else if ("1070_S".equals(xueliNumber)) {//初中
+            DynamicObject zgxlObj = zgxlMap.get("70");
+            id = zgxlObj.getLong("id");
+        } else if ("1080_S".equals(xueliNumber)) {//小学
+            DynamicObject zgxlObj = zgxlMap.get("80");
+            id = zgxlObj.getLong("id");
+        } else if ("1090_S".equals(xueliNumber)) {//其它
+
+        }
+        return id;
+    }
+
+    /**转换政治面貌*/
+    public Long getZzmmId(Map<String, DynamicObject> zzmmMap, String zzmmName) {
+        Long id = 0L;
+        if (isNullEmpty(zzmmName)) {
+            return id;
+        }
+        Set<String> zzmmKeys = zzmmMap.keySet();
+        for (String key : zzmmKeys) {
+            if (key.contains(zzmmName)) {
+                DynamicObject zzmmObj = zzmmMap.get(key);
+                id = zzmmObj.getLong("id");
+            }
+        }
+        return id;
+    }
+
+    /**判断用户是否有证书*/
+    public boolean isHaveZhengShu(Object personId) {
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("person.id", "=", personId));
+        qfilter.add(new QFilter("iscurrentversion", "=", 1));
+        qfilter.add(new QFilter("datastatus", "=", 1));
+        QFilter[] filters = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        return QueryServiceHelper.exists("hsas_perprotitlehr", filters);
+    }
+
+
+
+    /**判断用户是否直接从事研发工作,部门编码,填报配置,项目经历,薪酬项目,核算名单id*/
+    public boolean isHaveYanFaWork(String bumencbm, DynamicObject sjtbpzObject, Map<Long, List<DynamicObject>> userXiangMuJingLiMap,
+                                   Map<Long, Map<String, Object>> xcxmMap, Long mingdanId, Long personId, Date nckd_tbsjny) {
+        // 集团创新中心101.14组织的人员都是研发人员
+        if (sjtbpzObject.get("nckd_jtcxzxdata.structlongnumber") != null) {
+            String jtcxzxdata = sjtbpzObject.getString("nckd_jtcxzxdata.structlongnumber");
+            if (bumencbm.contains(jtcxzxdata)) {
+                return true;
+            }
+        }
+        // 晶昊公司的人如果核算出的薪酬项目含JT216则是研发人员
+        if (sjtbpzObject.get("nckd_jkypsybdata.structlongnumber") != null) {
+            String jkypsybdata = sjtbpzObject.getString("nckd_jkypsybdata.structlongnumber");
+            if (bumencbm.contains(jkypsybdata)) {
+                if (xcxmMap.get(mingdanId) != null) {
+                    Map<String, Object> xcxmDataMap = xcxmMap.get(mingdanId);
+                    String yfryxcxmbmData = sjtbpzObject.getString("nckd_yfryxcxmbm");
+                    if (!isNullEmpty(yfryxcxmbmData)) {
+                        String[] yfryxcxmbmStr = yfryxcxmbmData.split(",");
+                        for (String yfryxcxmbm : yfryxcxmbmStr) {
+                            if (xcxmDataMap.get(yfryxcxmbm+"_txt") != null) {
+                                String checkTxt = xcxmDataMap.get(yfryxcxmbm+"_txt").toString();
+                                if ("研发".equals(checkTxt)) {
+                                    return true;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        // 不是集团总部的人也不是晶昊公司的人,判断是否存在项目经历还未结束的记录
+        if (sjtbpzObject.get("nckd_jyzb.structlongnumber") != null && sjtbpzObject.get("nckd_jkypsybdata.structlongnumber") != null) {
+            String jtzbStructlongnumber = sjtbpzObject.getString("nckd_jyzb.structlongnumber");
+            String jhgsStructlongnumber = sjtbpzObject.getString("nckd_jkypsybdata.structlongnumber");
+            if (!bumencbm.contains(jtzbStructlongnumber) && !bumencbm.contains(jhgsStructlongnumber)) {
+                if (userXiangMuJingLiMap.get(personId) != null) {
+                    String nckd_tbsjxm = DateUtils.formatDate(nckd_tbsjny, "yyyy-MM-dd");
+                    LocalDate date = LocalDate.parse(nckd_tbsjxm, DateTimeFormatter.ISO_LOCAL_DATE);
+                    LocalDate nckdTbsjxmLastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+                    List<DynamicObject> xiangMuObjets = userXiangMuJingLiMap.get(personId);
+                    for (DynamicObject xiangMuObject : xiangMuObjets) {
+                        Date projectEndDate = xiangMuObject.getDate("enddate");
+                        if (projectEndDate != null) {
+                            LocalDate projectEndLocalDate = projectEndDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+                            if (!projectEndLocalDate.isBefore(nckdTbsjxmLastDay)) {
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    /**判断是否是晶昊公司的人*/
+    public boolean isJkGs(String gongsibm, DynamicObject sjtbpzObject) {
+        String nckd_jhgsbm = sjtbpzObject.getString("nckd_jhgsbm");
+        if (gongsibm.equals(nckd_jhgsbm)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**判断当月是否有任职经历变化*/
+    public boolean isRzjlbh(Long personid, Map<Long, List<DynamicObject>> userRenZhiJingLiBianHuaMap) {
+        if (userRenZhiJingLiBianHuaMap.get(personid) != null) {
+            List<DynamicObject> list = userRenZhiJingLiBianHuaMap.get(personid);
+            if (list.size() > 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**判断是否有多个任职经历*/
+    public boolean isMoreRzjlbh(Long personid, Date nckd_tbsjny) {
+        String nckd_tbsjxm = DateUtils.formatDate(nckd_tbsjny, "yyyy-MM-dd");
+        LocalDate date = LocalDate.parse(nckd_tbsjxm, DateTimeFormatter.ISO_LOCAL_DATE);
+        LocalDate nckdTbsjxmLastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+        //LocalDate nckdTbsjxmFirstDay = date.with(TemporalAdjusters.firstDayOfMonth());
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("person.id", "=", personid));
+        qfilter.add(new QFilter("iscurrentversion", "=", "1"));//当前版本
+        //qfilter.add(new QFilter("startdate", ">=", nckdTbsjxmFirstDay));
+        qfilter.add(new QFilter("startdate", "<=", nckdTbsjxmLastDay));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection dynamicObjectCollection = QueryServiceHelper.query("hrpi_empposorgrel", "id", filtersQuery);
+        if (dynamicObjectCollection.size() > 1) {
+            return true;
+        }
+        return false;
+    }
+
+    /**判断发薪任务中的业务组织不等于当月的主任职单位*/
+    public boolean isMoreRzjlbhDifferent(Date nckd_tbsjny, ZgsrVO zgsrVO, Map<Long, List<DynamicObject>> userRenZhiJingLiMap) {
+        String nckd_tbsjxm = DateUtils.formatDate(nckd_tbsjny, "yyyy-MM-dd");
+        LocalDate date = LocalDate.parse(nckd_tbsjxm, DateTimeFormatter.ISO_LOCAL_DATE);
+        LocalDate nckdTbsjxmLastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+        LocalDate nckdTbsjxmFirstDay = date.with(TemporalAdjusters.firstDayOfMonth());
+        boolean result = false;
+        Long personid = zgsrVO.getRenyuanid();
+        if (userRenZhiJingLiMap.get(personid) != null) {
+            Long xcCompanyId = zgsrVO.getGongsiid();
+            List<DynamicObject> dynamicObjectList = userRenZhiJingLiMap.get(personid);
+            if (dynamicObjectList.size() == 1) {
+                return false;
+            }
+            for (DynamicObject dynamicObject : dynamicObjectList) {
+                /**Date enddate = dynamicObject.getDate("enddate");
+                // 如果enddate小于nckdTbsjxmFirstDay就跳过
+                if (enddate != null) {
+                    LocalDate endLocalDate = enddate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+                    if (endLocalDate.isBefore(nckdTbsjxmFirstDay)) {
+                        continue; // 跳过此次循环
+                    }
+                }*/
+                Long companyId2 = dynamicObject.getLong("company.id");
+                if (!companyId2.equals(xcCompanyId)) {
+                   result = true;
+                   break;
+                }
+            }
+       }
+       return result;
+    }
+
+    /**获取用户当月任职经历的结束日期*/
+    public Date getLiZhiRiQi(Date nckd_tbsjny, Date lizhiDate) {
+        String nckd_tbsjxm = DateUtils.formatDate(nckd_tbsjny, "yyyy-MM-dd");
+        LocalDate date = LocalDate.parse(nckd_tbsjxm, DateTimeFormatter.ISO_LOCAL_DATE);
+        LocalDate nckdTbsjxmLastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+        Date lizhiRiqiDate = null;
+        if (lizhiDate != null) {
+            LocalDate endLocalDate = lizhiDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            if (endLocalDate.isAfter(nckdTbsjxmLastDay)) {
+                return null;
+            }
+            lizhiRiqiDate = lizhiDate;
+        }
+        return lizhiRiqiDate;
+    }
+
+    /**判断用户主任职经历是否跨公司*/
+    public boolean isMoreRzjlbhDifferentCompany(Date nckd_tbsjny, ZgsrVO zgsrVO, Map<Long, List<DynamicObject>> userRenZhiJingLiMap) {
+        boolean result = false;
+        Long personid = zgsrVO.getRenyuanid();
+        if (userRenZhiJingLiMap.get(personid) != null) {
+            Long xcCompanyId = zgsrVO.getGongsiid();
+            List<DynamicObject> dynamicObjectList = userRenZhiJingLiMap.get(personid);
+            if (dynamicObjectList.size() == 1) {
+                return false;
+            }
+            for (DynamicObject dynamicObject : dynamicObjectList) {
+                Long companyId2 = dynamicObject.getLong("company.id");
+                if (!companyId2.equals(xcCompanyId)) {
+                    result = true;
+                    break;
+                }
+            }
+        }
+        return result;
+    }
+
+    /**处理用户薪酬项目字段*/
+    public void getUserJbxc(IDataModel dataModel ,Map<Long, Map<String, Object>> zgsrMap, Long fcalpersonid, DynamicObject xcxmjspz, List<String> xcxmList, int rowIndex) {
+        logger.info("处理薪酬用户ID:" + fcalpersonid);
+        ScriptEngineManager manager = new ScriptEngineManager();
+        ScriptEngine engine = manager.getEngineByName("JavaScript");
+        String nckd_xcxm = xcxmjspz.getString("nckd_xcxm");// 基本薪酬
+        if (!isNullEmpty(nckd_xcxm)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_xcxm = nckd_xcxm.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_xcxm = nckd_xcxm.replace(xcxm, "0");
+                }
+                nckd_xcxm = nckd_xcxm.replace("--", "-");
+                nckd_xcxm = nckd_xcxm.replace("++", "+");
+                logger.info("处理薪酬用户nckd_xcxm:" + nckd_xcxm);
+                try {
+                    Object resultData = engine.eval(nckd_xcxm);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_djbxc", result, rowIndex);// 基本薪酬
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+        String nckd_dnyfjx = xcxmjspz.getString("nckd_dnyfjx");// 当年应发绩效
+        if (!isNullEmpty(nckd_dnyfjx)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_dnyfjx = nckd_dnyfjx.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_dnyfjx = nckd_dnyfjx.replace(xcxm, "0");
+                }
+                nckd_dnyfjx = nckd_dnyfjx.replace("--", "-");
+                nckd_dnyfjx = nckd_dnyfjx.replace("++", "+");
+                logger.info("处理薪酬用户nckd_dnyfjx:" + nckd_dnyfjx);
+                try {
+                    Object resultData = engine.eval(nckd_dnyfjx);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_ddnyfjx", result, rowIndex);// 当年应发绩效
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+        String nckd_yfdnjx = xcxmjspz.getString("nckd_yfdnjx");// 预发当年绩效
+        if (!isNullEmpty(nckd_yfdnjx)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_yfdnjx = nckd_yfdnjx.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_yfdnjx = nckd_yfdnjx.replace(xcxm, "0");
+                }
+                nckd_yfdnjx = nckd_yfdnjx.replace("--", "-");
+                nckd_yfdnjx = nckd_yfdnjx.replace("++", "+");
+                logger.info("处理薪酬用户nckd_yfdnjx:" + nckd_yfdnjx);
+                try {
+                    Object resultData = engine.eval(nckd_yfdnjx);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_dyjdnjx", result, rowIndex);// 预发当年绩效
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+        String nckd_bfdnjx = xcxmjspz.getString("nckd_bfdnjx");// 补发上年绩效
+        if (!isNullEmpty(nckd_bfdnjx)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_bfdnjx = nckd_bfdnjx.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_bfdnjx = nckd_bfdnjx.replace(xcxm, "0");
+                }
+                nckd_bfdnjx = nckd_bfdnjx.replace("--", "-");
+                nckd_bfdnjx = nckd_bfdnjx.replace("++", "+");
+                logger.info("处理薪酬用户nckd_bfdnjx:" + nckd_bfdnjx);
+                try {
+                    Object resultData = engine.eval(nckd_bfdnjx);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_dbfsnjx", result, rowIndex);// 补发上年绩效
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+        String nckd_ydyzfjx = xcxmjspz.getString("nckd_ydyzfjx");// 应递延支付绩效
+        if (!isNullEmpty(nckd_ydyzfjx)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_ydyzfjx = nckd_ydyzfjx.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_ydyzfjx = nckd_ydyzfjx.replace(xcxm, "0");
+                }
+                nckd_ydyzfjx = nckd_ydyzfjx.replace("--", "-");
+                nckd_ydyzfjx = nckd_ydyzfjx.replace("++", "+");
+                logger.info("处理薪酬用户nckd_ydyzfjx:" + nckd_ydyzfjx);
+                try {
+                    Object resultData = engine.eval(nckd_ydyzfjx);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_dydyzfjx", result, rowIndex);// 应递延支付绩效
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+        String nckd_syrrqjl = xcxmjspz.getString("nckd_syrrqjl");// 发放上一任期的任期激励
+        if (!isNullEmpty(nckd_syrrqjl)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_syrrqjl = nckd_syrrqjl.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_syrrqjl = nckd_syrrqjl.replace(xcxm, "0");
+                }
+                nckd_syrrqjl = nckd_syrrqjl.replace("--", "-");
+                nckd_syrrqjl = nckd_syrrqjl.replace("++", "+");
+                logger.info("处理薪酬用户nckd_syrrqjl:" + nckd_syrrqjl);
+                try {
+                    Object resultData = engine.eval(nckd_syrrqjl);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_dffsyrjxjl", result, rowIndex);// 发放上一任期的任期激励
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+        String nckd_bndrqjl = xcxmjspz.getString("nckd_bndrqjl");// 预提本年度任期激励
+        if (!isNullEmpty(nckd_bndrqjl)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_bndrqjl = nckd_bndrqjl.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_bndrqjl = nckd_bndrqjl.replace(xcxm, "0");
+                }
+                nckd_bndrqjl = nckd_bndrqjl.replace("--", "-");
+                nckd_bndrqjl = nckd_bndrqjl.replace("++", "+");
+                logger.info("处理薪酬用户nckd_bndrqjl:" + nckd_bndrqjl);
+                try {
+                    Object resultData = engine.eval(nckd_bndrqjl);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_dytbnrqjl", result, rowIndex);// 预提本年度任期激励
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+        String nckd_jbt = xcxmjspz.getString("nckd_jbt");// 津补贴
+        if (!isNullEmpty(nckd_jbt)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_jbt = nckd_jbt.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_jbt = nckd_jbt.replace(xcxm, "0");
+                }
+                nckd_jbt = nckd_jbt.replace("--", "-");
+                nckd_jbt = nckd_jbt.replace("++", "+");
+                logger.info("处理薪酬用户nckd_jbt:" + nckd_jbt);
+                try {
+                    Object resultData = engine.eval(nckd_jbt);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_djbt", result, rowIndex);// 津补贴
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+        String nckd_qtycxjl = xcxmjspz.getString("nckd_qtycxjl");// 其他一次性专项奖励
+        if (!isNullEmpty(nckd_qtycxjl)) {
+            if (zgsrMap.get(fcalpersonid) != null) {
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                for (String key : keys) {
+                    nckd_qtycxjl = nckd_qtycxjl.replace(key, String.valueOf(personMap.get(key)));
+                }
+                // 将公式中的变量替换成对应的值
+                for (String xcxm : xcxmList) {
+                    nckd_qtycxjl = nckd_qtycxjl.replace(xcxm, "0");
+                }
+                nckd_qtycxjl = nckd_qtycxjl.replace("--", "-");
+                nckd_qtycxjl = nckd_qtycxjl.replace("++", "+");
+                logger.info("处理薪酬用户nckd_qtycxjl:" + nckd_qtycxjl);
+                try {
+                    Object resultData = engine.eval(nckd_qtycxjl);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    dataModel.setValue("nckd_dqtycxzxjl", result, rowIndex);// 其他一次性专项奖励
+                } catch (ScriptException e) {
+                    logger.info("计算配置错误");
+                    e.printStackTrace();
+                }
+            }
+        }
+
+
+    }
+
+
+    /**处理用户薪酬项目字段,将用户薪酬记录合并*/
+    public Map<Long, ZgsrDetailsAmtVO> getUserJbxcData(Map<Long, Map<String, Object>> zgsrMap, List<ZgsrVO> zgsrVOList, DynamicObject xcxmjspz, List<String> xcxmList) {
+        Map<Long, ZgsrDetailsAmtVO> zgsrDetailsDataMap = new HashMap<Long, ZgsrDetailsAmtVO>();
+        ScriptEngineManager manager = new ScriptEngineManager();
+        ScriptEngine engine = manager.getEngineByName("JavaScript");
+        String nckd_xcxm_data = xcxmjspz.getString("nckd_xcxm");// 基本薪酬
+        String nckd_dnyfjx_data = xcxmjspz.getString("nckd_dnyfjx");// 当年应发绩效
+        String nckd_yfdnjx_data = xcxmjspz.getString("nckd_yfdnjx");// 预发当年绩效
+        String nckd_bfdnjx_data = xcxmjspz.getString("nckd_bfdnjx");// 补发上年绩效
+        String nckd_ydyzfjx_data = xcxmjspz.getString("nckd_ydyzfjx");// 应递延支付绩效
+        String nckd_syrrqjl_data = xcxmjspz.getString("nckd_syrrqjl");// 发放上一任期的任期激励
+        String nckd_bndrqjl_data = xcxmjspz.getString("nckd_bndrqjl");// 预提本年度任期激励
+        String nckd_jbt_data = xcxmjspz.getString("nckd_jbt");// 津补贴
+        String nckd_qtycxjl_data = xcxmjspz.getString("nckd_qtycxjl");// 其他一次性专项奖励
+        try {
+            String nckd_xcxm_check = "";// 基本薪酬
+            String nckd_dnyfjx_check = "";// 当年应发绩效
+            String nckd_yfdnjx_check = "";// 预发当年绩效
+            String nckd_bfdnjx_check = "";// 补发上年绩效
+            String nckd_ydyzfjx_check = "";// 应递延支付绩效
+            String nckd_syrrqjl_check = "";// 发放上一任期的任期激励
+            String nckd_bndrqjl_check = "";// 预提本年度任期激励
+            String nckd_jbt_check = "";// 津补贴
+            String nckd_qtycxjl_check = "";// 其他一次性专项奖励
+            // 防止名单重复处理
+            Set<Long> mingDanIdSet = new HashSet<Long>();
+            for (ZgsrVO zgsrVO : zgsrVOList) {
+                nckd_xcxm_check = nckd_xcxm_data;// 基本薪酬
+                nckd_dnyfjx_check = nckd_dnyfjx_data;// 当年应发绩效
+                nckd_yfdnjx_check = nckd_yfdnjx_data;// 预发当年绩效
+                nckd_bfdnjx_check = nckd_bfdnjx_data;// 补发上年绩效
+                nckd_ydyzfjx_check = nckd_ydyzfjx_data;// 应递延支付绩效
+                nckd_syrrqjl_check = nckd_syrrqjl_data;// 发放上一任期的任期激励
+                nckd_bndrqjl_check = nckd_bndrqjl_data;// 预提本年度任期激励
+                nckd_jbt_check = nckd_jbt_data;// 津补贴
+                nckd_qtycxjl_check = nckd_qtycxjl_data;// 其他一次性专项奖励
+                Long fcalpersonid = zgsrVO.getMingdanid();
+                if (mingDanIdSet.contains(fcalpersonid)) {
+                    continue;
+                } else {
+                    mingDanIdSet.add(fcalpersonid);
+                }
+                logger.info("处理薪酬用户名单ID:" + fcalpersonid);
+                if (zgsrMap.get(fcalpersonid) == null) {
+                    logger.info("处理薪酬用户名单ID:" + fcalpersonid + "没有找到薪酬记录");
+                    continue;
+                }
+                Long personid = zgsrVO.getRenyuanid();
+                Map<String, Object> personMap = zgsrMap.get(fcalpersonid);
+                Set<String> keys = personMap.keySet();
+                if (!isNullEmpty(nckd_xcxm_check)) {
+                    for (String key : keys) {
+                        nckd_xcxm_check = nckd_xcxm_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_xcxm_check = nckd_xcxm_check.replace(xcxm, "0");
+                    }
+                    nckd_xcxm_check = nckd_xcxm_check.replace("--", "-");
+                    nckd_xcxm_check = nckd_xcxm_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_xcxm:" + nckd_xcxm_check);
+                    Object resultData = engine.eval(nckd_xcxm_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_djbxc(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_djbxc());
+                        zsrDetailsAmtVO.setNckd_djbxc(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+                if (!isNullEmpty(nckd_dnyfjx_check)) {
+                    for (String key : keys) {
+                        nckd_dnyfjx_check = nckd_dnyfjx_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_dnyfjx_check = nckd_dnyfjx_check.replace(xcxm, "0");
+                    }
+                    nckd_dnyfjx_check = nckd_dnyfjx_check.replace("--", "-");
+                    nckd_dnyfjx_check = nckd_dnyfjx_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_dnyfjx:" + nckd_dnyfjx_check);
+                    Object resultData = engine.eval(nckd_dnyfjx_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_ddnyfjx(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_ddnyfjx());
+                        zsrDetailsAmtVO.setNckd_ddnyfjx(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+                if (!isNullEmpty(nckd_yfdnjx_check)) {
+                    for (String key : keys) {
+                        nckd_yfdnjx_check = nckd_yfdnjx_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_yfdnjx_check = nckd_yfdnjx_check.replace(xcxm, "0");
+                    }
+                    nckd_yfdnjx_check = nckd_yfdnjx_check.replace("--", "-");
+                    nckd_yfdnjx_check = nckd_yfdnjx_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_yfdnjx:" + nckd_yfdnjx_check);
+                    Object resultData = engine.eval(nckd_yfdnjx_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_dyjdnjx(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_dyjdnjx());
+                        zsrDetailsAmtVO.setNckd_dyjdnjx(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+                if (!isNullEmpty(nckd_bfdnjx_check)) {
+                    for (String key : keys) {
+                        nckd_bfdnjx_check = nckd_bfdnjx_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_bfdnjx_check = nckd_bfdnjx_check.replace(xcxm, "0");
+                    }
+                    nckd_bfdnjx_check = nckd_bfdnjx_check.replace("--", "-");
+                    nckd_bfdnjx_check = nckd_bfdnjx_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_bfdnjx:" + nckd_bfdnjx_check);
+                    Object resultData = engine.eval(nckd_bfdnjx_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_dbfsnjx(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_dbfsnjx());
+                        zsrDetailsAmtVO.setNckd_dbfsnjx(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+                if (!isNullEmpty(nckd_ydyzfjx_check)) {
+                    for (String key : keys) {
+                        nckd_ydyzfjx_check = nckd_ydyzfjx_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_ydyzfjx_check = nckd_ydyzfjx_check.replace(xcxm, "0");
+                    }
+                    nckd_ydyzfjx_check = nckd_ydyzfjx_check.replace("--", "-");
+                    nckd_ydyzfjx_check = nckd_ydyzfjx_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_ydyzfjx:" + nckd_ydyzfjx_check);
+                    Object resultData = engine.eval(nckd_ydyzfjx_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_dydyzfjx(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_dydyzfjx());
+                        zsrDetailsAmtVO.setNckd_dydyzfjx(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+                if (!isNullEmpty(nckd_syrrqjl_check)) {
+                    for (String key : keys) {
+                        nckd_syrrqjl_check = nckd_syrrqjl_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_syrrqjl_check = nckd_syrrqjl_check.replace(xcxm, "0");
+                    }
+                    nckd_syrrqjl_check = nckd_syrrqjl_check.replace("--", "-");
+                    nckd_syrrqjl_check = nckd_syrrqjl_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_syrrqjl:" + nckd_syrrqjl_check);
+                    Object resultData = engine.eval(nckd_syrrqjl_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_dffsyrjxjl(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_dffsyrjxjl());
+                        zsrDetailsAmtVO.setNckd_dffsyrjxjl(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+                if (!isNullEmpty(nckd_bndrqjl_check)) {
+                    for (String key : keys) {
+                        nckd_bndrqjl_check = nckd_bndrqjl_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_bndrqjl_check = nckd_bndrqjl_check.replace(xcxm, "0");
+                    }
+                    nckd_bndrqjl_check = nckd_bndrqjl_check.replace("--", "-");
+                    nckd_bndrqjl_check = nckd_bndrqjl_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_bndrqjl:" + nckd_bndrqjl_check);
+                    Object resultData = engine.eval(nckd_bndrqjl_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_dytbnrqjl(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_dytbnrqjl());
+                        zsrDetailsAmtVO.setNckd_dytbnrqjl(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+                if (!isNullEmpty(nckd_jbt_check)) {
+                    for (String key : keys) {
+                        nckd_jbt_check = nckd_jbt_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_jbt_check = nckd_jbt_check.replace(xcxm, "0");
+                    }
+                    nckd_jbt_check = nckd_jbt_check.replace("--", "-");
+                    nckd_jbt_check = nckd_jbt_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_jbt:" + nckd_jbt_check);
+                    Object resultData = engine.eval(nckd_jbt_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_djbt(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_djbt());
+                        zsrDetailsAmtVO.setNckd_djbt(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+                if (!isNullEmpty(nckd_qtycxjl_check)) {
+                    for (String key : keys) {
+                        nckd_qtycxjl_check = nckd_qtycxjl_check.replace(key, String.valueOf(personMap.get(key)));
+                    }
+                    // 将公式中的变量替换成对应的值
+                    for (String xcxm : xcxmList) {
+                        nckd_qtycxjl_check = nckd_qtycxjl_check.replace(xcxm, "0");
+                    }
+                    nckd_qtycxjl_check = nckd_qtycxjl_check.replace("--", "-");
+                    nckd_qtycxjl_check = nckd_qtycxjl_check.replace("++", "+");
+                    logger.info("处理薪酬用户nckd_qtycxjl:" + nckd_qtycxjl_check);
+                    Object resultData = engine.eval(nckd_qtycxjl_check);
+                    BigDecimal result = new BigDecimal(resultData.toString());
+                    if (zgsrDetailsDataMap.get(personid) != null) {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = zgsrDetailsDataMap.get(personid);
+                        zsrDetailsAmtVO.setNckd_dqtycxzxjl(result);
+                    } else {
+                        ZgsrDetailsAmtVO zsrDetailsAmtVO = new ZgsrDetailsAmtVO();
+                        result = result.add(zsrDetailsAmtVO.getNckd_dqtycxzxjl());
+                        zsrDetailsAmtVO.setNckd_dqtycxzxjl(result);
+                        zgsrDetailsDataMap.put(personid, zsrDetailsAmtVO);
+                    }
+                }
+            }
+        } catch (ScriptException e) {
+            logger.info("计算配置错误");
+            e.printStackTrace();
+        }
+        return zgsrDetailsDataMap;
+    }
+
+    /**获取入职方式集合*/
+    public Map<String, DynamicObject> findRzfsMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_rzfs", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("number"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取证件类型集合*/
+    public Map<String, DynamicObject> findZjlxMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_zjlx", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("number"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取国籍地区集合*/
+    public Map<String, DynamicObject> findGjdqMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_gjdq", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("name"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取岗位性质集合*/
+    public Map<String, DynamicObject> findGwxzMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_gwxz", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("number"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取岗位层级集合*/
+    public Map<String, DynamicObject> findGwcjMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_gwcj", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("number"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取最高学历集合*/
+    public Map<String, DynamicObject> findZgxlMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_zgxl", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("number"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取政治面貌集合*/
+    public Map<String, DynamicObject> findZzmmMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_zzmm", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("name"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取技术职称*/
+    public Map<String, DynamicObject> findJszcMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_jszc", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("name"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取职业技能等级*/
+    public Map<String, DynamicObject> findZyjndjMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_zyjndj", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("name"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取是否在岗集合*/
+    public Map<String, DynamicObject> findSfzgMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_sfzg", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("number"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取是否实行任期制和契约化管理或新型经营责任制集合*/
+    public Map<String, DynamicObject> findRqqyxxjyMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_rqqyxxjy", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("number"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取是否竞聘上岗或因考核调整集合*/
+    public Map<String, DynamicObject> findJpsgkhtzMap() {
+        Map<String, DynamicObject> resultMap = new LinkedHashMap();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", "1"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_jpsgkhtz", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultMap.put(dynamicObject.getString("number"), dynamicObject);
+        }
+        return resultMap;
+    }
+
+    /**获取薪酬项目计算*/
+    public DynamicObject findXcxmjspz() {
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("number", "=", "xcxmjs"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_jbxcjs", "id,number,name,nckd_xcxm,nckd_dnyfjx" +
+                ",nckd_yfdnjx,nckd_bfdnjx,nckd_ydyzfjx,nckd_syrrqjl,nckd_bndrqjl,nckd_jbt,nckd_qtycxjl", filtersQuery);
+        if (objectCollection.size() > 0) {
+            return objectCollection.get(0);
+        }
+        return null;
+    }
+
+    /**获取数据填报配置*/
+    public DynamicObject findSjtbpz() {
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("number", "=", "SJTBRWSET"));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        // id,编码,名称,江西晶昊盐化有限公司编码,江西富达盐化有限公司编码,集团总部创新中心,晶昊公司,江西省盐业集团股份有限公司总部,晶昊公司研发人员薪酬项目编码
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("nckd_sjtbrwpz", "id,number,name,nckd_jhgsbm,nckd_fdgsbm," +
+                "nckd_jtcxzxdata.id,nckd_jtcxzxdata.number,nckd_jtcxzxdata.structnumber,nckd_jtcxzxdata.structlongnumber," +
+                "nckd_jkypsybdata.id,nckd_jkypsybdata.number,nckd_jkypsybdata.structnumber,nckd_jkypsybdata.structlongnumber," +
+                "nckd_jyzb.id,nckd_jyzb.number,nckd_jyzb.structnumber,nckd_jyzb.structlongnumber," +
+                "nckd_yfryxcxmbm", filtersQuery);
+        if (objectCollection.size() > 0) {
+            return objectCollection.get(0);
+        }
+        return null;
+    }
+
+    /**根据核算任务Id获取用户薪酬明细*/
+    public Map<Long, Map<String, Object>> findUserXcProject(List<Long> hsTaskId) {
+        String hsTaskIds = StringUtils.join(hsTaskId, ",");
+        Map<Long, Map<String, Object>> resultDataMap = new LinkedHashMap();
+        String ksql_xcxm = " select b.fcaltaskid as fcaltaskid,b.fcalpersonid as fcalpersonid,c.fname as username," +
+                " d.fname as xmname,d.fnumber as xmnumber,a.fcalamountvalue as calamountvalue,a.ftextvalue as textvalue " +
+                "from t_hsas_caltableentry a" +
+                " left join t_hsas_caltable b on a.fid = b.fid " +
+                " left join t_hsas_calperson c on c.fid = b.fcalpersonid" +
+                " left join t_hsbs_salaryitem d on d.fid = a.fsalaryitemid" +
+                " where b.fcaltaskid in ("+hsTaskIds+") " +
+                //" and (c.fname = '杨冬莲' or c.fname='徐艳平') " +
+                "";
+        logger.info("ksql_xcxm:"+ksql_xcxm);
+        DataSet dataSet_xcxm = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), ksql_xcxm);
+        Iterator<Row> iterator_scxm = dataSet_xcxm.iterator();
+        List<ZgsrDetailsVO> zgsrDetailsList = new ArrayList();
+        while (iterator_scxm.hasNext()) {
+            Row row = iterator_scxm.next();
+            Long fcalpersonid = row.getLong("fcalpersonid");
+            String xmnumber = row.getString("xmnumber");
+            BigDecimal calamountvalue = row.getBigDecimal("calamountvalue");
+            String textvalue = row.getString("textvalue");
+
+            ZgsrDetailsVO zgsrDetailsVO = new ZgsrDetailsVO();
+            zgsrDetailsVO.setFcalpersonid(fcalpersonid);
+            zgsrDetailsVO.setXmnumber(xmnumber);
+            zgsrDetailsVO.setCalamountvalue(calamountvalue);
+            zgsrDetailsVO.setTextvalue(textvalue);
+            zgsrDetailsList.add(zgsrDetailsVO);
+        }
+        // 将薪酬项目明细分组
+        Map<Long, List<ZgsrDetailsVO>> resultMap = new LinkedHashMap();
+        for (ZgsrDetailsVO cp: zgsrDetailsList) {
+            if (resultMap.get(cp.getFcalpersonid()) == null) {
+                List<ZgsrDetailsVO> list = new ArrayList();
+                list.add(cp);
+                resultMap.put(cp.getFcalpersonid(), list);
+            } else {
+                List<ZgsrDetailsVO> list = resultMap.get(cp.getFcalpersonid());
+                list.add(cp);
+                resultMap.put(cp.getFcalpersonid(), list);
+            }
+        }
+        // 将薪酬项目转换为Map
+        Set<Long> keySet = resultMap.keySet();
+        for (Long key: keySet) {
+            List<ZgsrDetailsVO> list = resultMap.get(key);
+            Map<String, Object> map = new LinkedHashMap();
+            for (ZgsrDetailsVO cp:list) {
+                map.put(cp.getXmnumber(), cp.getCalamountvalue());
+                map.put(cp.getXmnumber()+"_txt", cp.getTextvalue());
+            }
+            resultDataMap.put(key, map);
+        }
+        return resultDataMap;
+    }
+
+    /**获取所有的薪酬项目*/
+    public List<String> findAllXcProject() {
+        List<String> resultList = new ArrayList();
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", 1));//使用状态
+        qfilter.add(new QFilter("status", "=", "C"));//数据状态
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection objectCollection = QueryServiceHelper.query("hsbs_salaryitem", "id,number,name", filtersQuery);
+        for (DynamicObject dynamicObject : objectCollection) {
+            resultList.add(dynamicObject.getString("number"));
+        }
+        return resultList;
+    }
+
+
+    /**获取职称级别*/
+    public DynamicObject getZhiChenJiBie(Long id) {
+        return BusinessDataServiceHelper.loadSingle(id, "hbss_protitlelevel");
+    }
+
+    /**获取人员与组织人id关系,组织人有多个取第一个*/
+    public Map<Long, Long> findHrpiDepempMap(List<ZgsrVO> zgsrVOList) {
+        Map<Long, Long> resultMap = new LinkedHashMap();
+        Object[] ryIds = new Long[zgsrVOList.size()];
+        for (int i = 0; i < zgsrVOList.size(); i++) {
+            ZgsrVO zgsrVO = zgsrVOList.get(i);
+            ryIds[i] = zgsrVO.getRenyuanid();
+        }
+        if (ryIds.length > 0) {
+            List<QFilter> qfilter = new ArrayList<QFilter>();
+            qfilter.add(new QFilter("person.id", "in", ryIds));
+            qfilter.add(new QFilter("iscurrentversion", "=", 1));
+            qfilter.add(new QFilter("datastatus", "=", 1));
+            QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+            DynamicObjectCollection objectCollection = QueryServiceHelper.query("hrpi_depemp", "id,datastatus,iscurrentversion,person.id", filtersQuery);
+            for (DynamicObject object : objectCollection) {
+                Long depempid = object.getLong("id");
+                Long personid = object.getLong("person.id");
+                if (resultMap.get(personid) == null) {
+                    resultMap.put(personid, depempid);
+                }
+            }
+        }
+        return resultMap;
+    }
+
+    /**获取人员证书数据*/
+    public Map<Long, List<DynamicObject>> findUserZhenShuMap(List<ZgsrVO> zgsrVOList) {
+        Map<Long, List<DynamicObject>> resultMap = new LinkedHashMap();
+        Object[] ryIds = new Long[zgsrVOList.size()];
+        for (int i = 0; i < zgsrVOList.size(); i++) {
+            ZgsrVO zgsrVO = zgsrVOList.get(i);
+            ryIds[i] = zgsrVO.getRenyuanid();
+        }
+        if (ryIds.length > 0) {
+            List<QFilter> qfilter = new ArrayList<QFilter>();
+            qfilter.add(new QFilter("person.id", "in", ryIds));
+            qfilter.add(new QFilter("iscurrentversion", "=", 1));
+            qfilter.add(new QFilter("datastatus", "=", 1));
+            QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+            DynamicObjectCollection objectCollection = QueryServiceHelper.query("hsas_perprotitlehr", "id,datastatus,iscurrentversion,person.id", filtersQuery);
+            for (DynamicObject object : objectCollection) {
+                Long personid = object.getLong("person.id");
+                if (resultMap.get(personid) == null) {
+                    List<DynamicObject> list = new ArrayList();
+                    list.add(object);
+                    resultMap.put(personid, list);
+                } else {
+                    resultMap.get(personid).add(object);
+                }
+            }
+        }
+        return resultMap;
+    }
+
+    /**获取人员任职经历变化数据*/
+    public Map<Long, List<DynamicObject>> findUserRenZhiJingLiBianHuaMap(List<ZgsrVO> zgsrVOList, Date nckd_tbsjny) {
+        Map<Long, List<DynamicObject>> resultMap = new LinkedHashMap();
+        String nckd_tbsjxm = DateUtils.formatDate(nckd_tbsjny, "yyyy-MM-dd");
+        LocalDate date = LocalDate.parse(nckd_tbsjxm, DateTimeFormatter.ISO_LOCAL_DATE);
+        LocalDate nckdTbsjxmLastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+        LocalDate nckdTbsjxmFirstDay = date.with(TemporalAdjusters.firstDayOfMonth());
+        Object[] ryIds = new Long[zgsrVOList.size()];
+        for (int i = 0; i < zgsrVOList.size(); i++) {
+            ZgsrVO zgsrVO = zgsrVOList.get(i);
+            ryIds[i] = zgsrVO.getRenyuanid();
+        }
+        if (ryIds.length > 0) {
+            List<QFilter> qfilter = new ArrayList<QFilter>();
+            qfilter.add(new QFilter("person.id", "in", ryIds));
+            qfilter.add(new QFilter("startdate", ">=", nckdTbsjxmFirstDay));
+            qfilter.add(new QFilter("startdate", "<=", nckdTbsjxmLastDay));
+            qfilter.add(new QFilter("iscurrentversion", "=", "1"));//当前版本
+            QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+            DynamicObjectCollection objectCollection = QueryServiceHelper.query("hrpi_empposorgrel", "id,startdate,iscurrentversion,person.id", filtersQuery);
+            for (DynamicObject object : objectCollection) {
+                Long personid = object.getLong("person.id");
+                if (resultMap.get(personid) == null) {
+                    List<DynamicObject> list = new ArrayList();
+                    list.add(object);
+                    resultMap.put(personid, list);
+                } else {
+                    resultMap.get(personid).add(object);
+                }
+            }
+        }
+        return resultMap;
+    }
+
+    /**获取人员当月的主任职经历数据*/
+    public Map<Long, List<DynamicObject>> findUserRenZhiJingLiMap(List<ZgsrVO> zgsrVOList, Date nckd_tbsjny) {
+        Map<Long, List<DynamicObject>> resultMap = new LinkedHashMap();
+        String nckd_tbsjxm = DateUtils.formatDate(nckd_tbsjny, "yyyy-MM-dd");
+        LocalDate date = LocalDate.parse(nckd_tbsjxm, DateTimeFormatter.ISO_LOCAL_DATE);
+        LocalDate nckdTbsjxmLastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+        LocalDate nckdTbsjxmFirstDay = date.with(TemporalAdjusters.firstDayOfMonth());
+        Object[] ryIds = new Long[zgsrVOList.size()];
+        for (int i = 0; i < zgsrVOList.size(); i++) {
+            ZgsrVO zgsrVO = zgsrVOList.get(i);
+            ryIds[i] = zgsrVO.getRenyuanid();
+        }
+        if (ryIds.length > 0) {
+            List<QFilter> qfilter = new ArrayList<QFilter>();
+            qfilter.add(new QFilter("person.id", "in", ryIds));
+            qfilter.add(new QFilter("isprimary", "=", "1"));//主任职
+            //qfilter.add(new QFilter("startdate", "<=", nckdTbsjxmLastDay));//
+            //qfilter.add(new QFilter("enddate", ">=", nckdTbsjxmFirstDay));//任职结束日期大于当月
+            qfilter.add(new QFilter("iscurrentversion", "=", "1"));//当前版本
+            QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+            DynamicObjectCollection objectCollection = QueryServiceHelper.query("hrpi_empposorgrel", "id,startdate,iscurrentversion,person.id,company.id,company.name,enddate", filtersQuery);
+            for (DynamicObject object : objectCollection) {
+                Long personid = object.getLong("person.id");
+                if (resultMap.get(personid) == null) {
+                    List<DynamicObject> list = new ArrayList();
+                    list.add(object);
+                    resultMap.put(personid, list);
+                } else {
+                    resultMap.get(personid).add(object);
+                }
+            }
+        }
+        return resultMap;
+    }
+
+
+    /**获取人员项目经历数据*/
+    public Map<Long, List<DynamicObject>> findUserXiangMuJingLiMap(List<ZgsrVO> zgsrVOList) {
+        Map<Long, List<DynamicObject>> resultMap = new LinkedHashMap();
+        Object[] ryIds = new Long[zgsrVOList.size()];
+        for (int i = 0; i < zgsrVOList.size(); i++) {
+            ZgsrVO zgsrVO = zgsrVOList.get(i);
+            ryIds[i] = zgsrVO.getRenyuanid();
+        }
+        if (ryIds.length > 0) {
+            List<QFilter> qfilter = new ArrayList<QFilter>();
+            qfilter.add(new QFilter("person.id", "in", ryIds));
+            qfilter.add(new QFilter("datastatus", "=", "1"));// 数据版本状态
+            qfilter.add(new QFilter("iscurrentversion", "=", "1"));//当前版本
+            QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+            DynamicObjectCollection objectCollection = QueryServiceHelper.query("hspm_empproexp", "id,startdate,enddate,person.id", filtersQuery);
+            for (DynamicObject object : objectCollection) {
+                Long personid = object.getLong("person.id");
+                if (resultMap.get(personid) == null) {
+                    List<DynamicObject> list = new ArrayList();
+                    list.add(object);
+                    resultMap.put(personid, list);
+                } else {
+                    resultMap.get(personid).add(object);
+                }
+            }
+        }
+        return resultMap;
+    }
+
+
+    /**获取人员职称信息/技能信息/执业资格信息*/
+    public Map<Long, DynamicObject> findUserZhiChenMap(List<ZgsrVO> zgsrVOList) {
+        Set<Long> ids = new HashSet<Long>();
+        Map<Long, DynamicObject> resultMap = new LinkedHashMap();
+        for (int i = 0; i < zgsrVOList.size(); i++) {
+            ZgsrVO zgsrVO = zgsrVOList.get(i);
+            ids.add(zgsrVO.getZhichengjbid());
+            ids.add(zgsrVO.getJinengjbid());
+            ids.add(zgsrVO.getZhiyejbid());
+        }
+        if (ids.size() > 0) {
+            Object[] idsArray = ids.toArray(new Object[0]);
+            List<QFilter> qfilter = new ArrayList<QFilter>();
+            qfilter.add(new QFilter("id", "in", idsArray));
+            QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+            DynamicObjectCollection objectCollection = QueryServiceHelper.query("hbss_protitlelevel", "id,nckd_dgwcj.id,nckd_djszc.id,nckd_dzyjndj.id", filtersQuery);
+            for (DynamicObject object : objectCollection) {
+                Long id = object.getLong("id");
+                if (resultMap.get(id) == null) {
+                    resultMap.put(id, object);
+                }
+            }
+        }
+        return resultMap;
+
+    }
+
+}

+ 373 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbRgcbtjVO.java

@@ -0,0 +1,373 @@
+package nckd.jxccl.hr.gzbb;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author duanyuqi
+ * @date 2025-12-22
+ * @desc 人工成本统计表合并数据
+ */
+public class SjtbRgcbtjVO {
+    private Long dataId;
+    private Date nckd_ctjny;
+    private String nckd_czqyxxdm;
+    private Long nckd_czzdata;
+    private BigDecimal nckd_clrzeys;
+    private BigDecimal nckd_crgcbys;
+    private BigDecimal nckd_cgzzeys;
+    private BigDecimal nckd_cyysr;
+    private BigDecimal nckd_clrze;
+    private BigDecimal nckd_cldsczz;
+    private BigDecimal nckd_cyyzcb;
+    private BigDecimal nckd_crgcb;
+    private BigDecimal nckd_cgzze;
+    private BigDecimal nckd_cshbx;
+    private BigDecimal nckd_czfgjj;
+    private BigDecimal nckd_czfbt;
+    private BigDecimal nckd_cqynj;
+    private BigDecimal nckd_cbcyl;
+    private BigDecimal nckd_cflfy;
+    private BigDecimal nckd_cldbhf;
+    private BigDecimal nckd_cghjf;
+    private BigDecimal nckd_cjypxjf;
+    private BigDecimal nckd_cjsjcj;
+    private BigDecimal nckd_cctfl;
+    private BigDecimal nckd_cfhbfl;
+    private BigDecimal nckd_cgfzc;
+    private BigDecimal nckd_cqtrgcb;
+    private BigDecimal nckd_clwpqf;
+    private BigDecimal nckd_cpjzgs;
+    private BigDecimal nckd_cpjzgzgrs;
+    private BigDecimal nckd_cpjcyrs;
+    private BigDecimal nckd_cpjlwgrs;
+    private BigDecimal nckd_cpjlwpqrs;
+    private BigDecimal nckd_crgcblrl;
+    private BigDecimal nckd_crsfyl;
+    private BigDecimal nckd_cqyldscl;
+    private BigDecimal nckd_cgyzbzzl;
+
+    private Integer type;
+    private Integer rsRow;
+    private Integer cwRow;
+
+    public Date getNckd_ctjny() {
+        return nckd_ctjny;
+    }
+
+    public void setNckd_ctjny(Date nckd_ctjny) {
+        this.nckd_ctjny = nckd_ctjny;
+    }
+
+    public String getNckd_czqyxxdm() {
+        return nckd_czqyxxdm;
+    }
+
+    public void setNckd_czqyxxdm(String nckd_czqyxxdm) {
+        this.nckd_czqyxxdm = nckd_czqyxxdm;
+    }
+
+    public Long getNckd_czzdata() {
+        return nckd_czzdata;
+    }
+
+    public void setNckd_czzdata(Long nckd_czzdata) {
+        this.nckd_czzdata = nckd_czzdata;
+    }
+
+    public BigDecimal getNckd_clrzeys() {
+        return nckd_clrzeys;
+    }
+
+    public void setNckd_clrzeys(BigDecimal nckd_clrzeys) {
+        this.nckd_clrzeys = nckd_clrzeys;
+    }
+
+    public BigDecimal getNckd_crgcbys() {
+        return nckd_crgcbys;
+    }
+
+    public void setNckd_crgcbys(BigDecimal nckd_crgcbys) {
+        this.nckd_crgcbys = nckd_crgcbys;
+    }
+
+    public BigDecimal getNckd_cgzzeys() {
+        return nckd_cgzzeys;
+    }
+
+    public void setNckd_cgzzeys(BigDecimal nckd_cgzzeys) {
+        this.nckd_cgzzeys = nckd_cgzzeys;
+    }
+
+    public BigDecimal getNckd_cyysr() {
+        return nckd_cyysr;
+    }
+
+    public void setNckd_cyysr(BigDecimal nckd_cyysr) {
+        this.nckd_cyysr = nckd_cyysr;
+    }
+
+    public BigDecimal getNckd_clrze() {
+        return nckd_clrze;
+    }
+
+    public void setNckd_clrze(BigDecimal nckd_clrze) {
+        this.nckd_clrze = nckd_clrze;
+    }
+
+    public BigDecimal getNckd_cldsczz() {
+        return nckd_cldsczz;
+    }
+
+    public void setNckd_cldsczz(BigDecimal nckd_cldsczz) {
+        this.nckd_cldsczz = nckd_cldsczz;
+    }
+
+    public BigDecimal getNckd_cyyzcb() {
+        return nckd_cyyzcb;
+    }
+
+    public void setNckd_cyyzcb(BigDecimal nckd_cyyzcb) {
+        this.nckd_cyyzcb = nckd_cyyzcb;
+    }
+
+    public BigDecimal getNckd_crgcb() {
+        return nckd_crgcb;
+    }
+
+    public void setNckd_crgcb(BigDecimal nckd_crgcb) {
+        this.nckd_crgcb = nckd_crgcb;
+    }
+
+    public BigDecimal getNckd_cgzze() {
+        return nckd_cgzze;
+    }
+
+    public void setNckd_cgzze(BigDecimal nckd_cgzze) {
+        this.nckd_cgzze = nckd_cgzze;
+    }
+
+    public BigDecimal getNckd_cshbx() {
+        return nckd_cshbx;
+    }
+
+    public void setNckd_cshbx(BigDecimal nckd_cshbx) {
+        this.nckd_cshbx = nckd_cshbx;
+    }
+
+    public BigDecimal getNckd_czfgjj() {
+        return nckd_czfgjj;
+    }
+
+    public void setNckd_czfgjj(BigDecimal nckd_czfgjj) {
+        this.nckd_czfgjj = nckd_czfgjj;
+    }
+
+    public BigDecimal getNckd_czfbt() {
+        return nckd_czfbt;
+    }
+
+    public void setNckd_czfbt(BigDecimal nckd_czfbt) {
+        this.nckd_czfbt = nckd_czfbt;
+    }
+
+    public BigDecimal getNckd_cqynj() {
+        return nckd_cqynj;
+    }
+
+    public void setNckd_cqynj(BigDecimal nckd_cqynj) {
+        this.nckd_cqynj = nckd_cqynj;
+    }
+
+    public BigDecimal getNckd_cbcyl() {
+        return nckd_cbcyl;
+    }
+
+    public void setNckd_cbcyl(BigDecimal nckd_cbcyl) {
+        this.nckd_cbcyl = nckd_cbcyl;
+    }
+
+    public BigDecimal getNckd_cflfy() {
+        return nckd_cflfy;
+    }
+
+    public void setNckd_cflfy(BigDecimal nckd_cflfy) {
+        this.nckd_cflfy = nckd_cflfy;
+    }
+
+    public BigDecimal getNckd_cldbhf() {
+        return nckd_cldbhf;
+    }
+
+    public void setNckd_cldbhf(BigDecimal nckd_cldbhf) {
+        this.nckd_cldbhf = nckd_cldbhf;
+    }
+
+    public BigDecimal getNckd_cghjf() {
+        return nckd_cghjf;
+    }
+
+    public void setNckd_cghjf(BigDecimal nckd_cghjf) {
+        this.nckd_cghjf = nckd_cghjf;
+    }
+
+    public BigDecimal getNckd_cjypxjf() {
+        return nckd_cjypxjf;
+    }
+
+    public void setNckd_cjypxjf(BigDecimal nckd_cjypxjf) {
+        this.nckd_cjypxjf = nckd_cjypxjf;
+    }
+
+    public BigDecimal getNckd_cjsjcj() {
+        return nckd_cjsjcj;
+    }
+
+    public void setNckd_cjsjcj(BigDecimal nckd_cjsjcj) {
+        this.nckd_cjsjcj = nckd_cjsjcj;
+    }
+
+    public BigDecimal getNckd_cctfl() {
+        return nckd_cctfl;
+    }
+
+    public void setNckd_cctfl(BigDecimal nckd_cctfl) {
+        this.nckd_cctfl = nckd_cctfl;
+    }
+
+    public BigDecimal getNckd_cfhbfl() {
+        return nckd_cfhbfl;
+    }
+
+    public void setNckd_cfhbfl(BigDecimal nckd_cfhbfl) {
+        this.nckd_cfhbfl = nckd_cfhbfl;
+    }
+
+    public BigDecimal getNckd_cgfzc() {
+        return nckd_cgfzc;
+    }
+
+    public void setNckd_cgfzc(BigDecimal nckd_cgfzc) {
+        this.nckd_cgfzc = nckd_cgfzc;
+    }
+
+    public BigDecimal getNckd_cqtrgcb() {
+        return nckd_cqtrgcb;
+    }
+
+    public void setNckd_cqtrgcb(BigDecimal nckd_cqtrgcb) {
+        this.nckd_cqtrgcb = nckd_cqtrgcb;
+    }
+
+    public BigDecimal getNckd_clwpqf() {
+        return nckd_clwpqf;
+    }
+
+    public void setNckd_clwpqf(BigDecimal nckd_clwpqf) {
+        this.nckd_clwpqf = nckd_clwpqf;
+    }
+
+    public BigDecimal getNckd_cpjzgs() {
+        return nckd_cpjzgs;
+    }
+
+    public void setNckd_cpjzgs(BigDecimal nckd_cpjzgs) {
+        this.nckd_cpjzgs = nckd_cpjzgs;
+    }
+
+    public BigDecimal getNckd_cpjzgzgrs() {
+        return nckd_cpjzgzgrs;
+    }
+
+    public void setNckd_cpjzgzgrs(BigDecimal nckd_cpjzgzgrs) {
+        this.nckd_cpjzgzgrs = nckd_cpjzgzgrs;
+    }
+
+    public BigDecimal getNckd_cpjcyrs() {
+        return nckd_cpjcyrs;
+    }
+
+    public void setNckd_cpjcyrs(BigDecimal nckd_cpjcyrs) {
+        this.nckd_cpjcyrs = nckd_cpjcyrs;
+    }
+
+    public BigDecimal getNckd_cpjlwgrs() {
+        return nckd_cpjlwgrs;
+    }
+
+    public void setNckd_cpjlwgrs(BigDecimal nckd_cpjlwgrs) {
+        this.nckd_cpjlwgrs = nckd_cpjlwgrs;
+    }
+
+    public BigDecimal getNckd_cpjlwpqrs() {
+        return nckd_cpjlwpqrs;
+    }
+
+    public void setNckd_cpjlwpqrs(BigDecimal nckd_cpjlwpqrs) {
+        this.nckd_cpjlwpqrs = nckd_cpjlwpqrs;
+    }
+
+    public BigDecimal getNckd_crgcblrl() {
+        return nckd_crgcblrl;
+    }
+
+    public void setNckd_crgcblrl(BigDecimal nckd_crgcblrl) {
+        this.nckd_crgcblrl = nckd_crgcblrl;
+    }
+
+    public BigDecimal getNckd_crsfyl() {
+        return nckd_crsfyl;
+    }
+
+    public void setNckd_crsfyl(BigDecimal nckd_crsfyl) {
+        this.nckd_crsfyl = nckd_crsfyl;
+    }
+
+    public BigDecimal getNckd_cqyldscl() {
+        return nckd_cqyldscl;
+    }
+
+    public void setNckd_cqyldscl(BigDecimal nckd_cqyldscl) {
+        this.nckd_cqyldscl = nckd_cqyldscl;
+    }
+
+    public BigDecimal getNckd_cgyzbzzl() {
+        return nckd_cgyzbzzl;
+    }
+
+    public void setNckd_cgyzbzzl(BigDecimal nckd_cgyzbzzl) {
+        this.nckd_cgyzbzzl = nckd_cgyzbzzl;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Long getDataId() {
+        return dataId;
+    }
+
+    public void setDataId(Long dataId) {
+        this.dataId = dataId;
+    }
+
+    public Integer getRsRow() {
+        return rsRow;
+    }
+
+    public void setRsRow(Integer rsRow) {
+        this.rsRow = rsRow;
+    }
+
+    public Integer getCwRow() {
+        return cwRow;
+    }
+
+    public void setCwRow(Integer cwRow) {
+        this.cwRow = cwRow;
+    }
+}

+ 38 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/SjtbSubmitWorkflowPlugin.java

@@ -0,0 +1,38 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.workflow.api.AgentExecution;
+import kd.bos.workflow.engine.extitf.IWorkflowPlugin;
+import kd.sdk.plugin.Plugin;
+
+/**
+ * nckd_sjtbrw_gzbb
+ * 流程被驳回时变更任务状态
+ * 数据填报任务提交》进入节点时执行时》驳回进入时
+ * duanyuqi
+ * */
+public class SjtbSubmitWorkflowPlugin implements Plugin, IWorkflowPlugin {
+
+    @Override
+    public void notify(AgentExecution execution) {
+        String businessKey = execution.getBusinessKey();
+        String entityNumber = execution.getEntityNumber();
+        if ("nckd_sjtbrw".equals(entityNumber)) {
+            Long pkValue = Long.parseLong(businessKey);
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkValue, "nckd_sjtbrw");
+            String nckd_rwzt = dynamicObject.getString("nckd_rwzt");
+            if (!"3".equals(nckd_rwzt)) {// 没有作废
+                dynamicObject.set("nckd_rwzt", "1");// 待上报
+                SaveServiceHelper.save(new DynamicObject[]{dynamicObject});
+            }
+        }
+        IWorkflowPlugin.super.notify(execution);
+    }
+
+    @Override
+    public void notifyByWithdraw(AgentExecution execution) {
+        IWorkflowPlugin.super.notifyByWithdraw(execution);
+    }
+}

+ 219 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/XcxmCheckFormPlugin.java

@@ -0,0 +1,219 @@
+package nckd.jxccl.hr.gzbb;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+
+import javax.script.ScriptException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+/**
+ * 央国企人事云》国资报表ext》基础资料》薪酬项目计算配置
+ * 检查项目是否合法
+ * nckd_jbxcjs
+ * duanyuqi
+ * */
+public class XcxmCheckFormPlugin extends AbstractFormPlugin {
+    private static final Pattern FORMULA_PATTERN = Pattern.compile("^[\\u4e00-\\u9fa5\\w]+([-+*/][\\u4e00-\\u9fa5\\w]+)*$");
+
+    public static boolean isValidFormula(String formula) {
+        if (formula == null || formula.trim().isEmpty()) {
+            return false;
+        }
+        return FORMULA_PATTERN.matcher(formula).matches();
+    }
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        FormOperate formOperate = (FormOperate) args.getSource();
+        if ("save".equals(formOperate.getOperateKey()) || "submit".equals(formOperate.getOperateKey())) {
+            // 保存或提交时校验薪酬项目编码是否正确
+            Set<String> allXcNumber = findAllNumber();
+            String nckd_xcxm = this.getModel().getDataEntity().getString("nckd_xcxm");// 薪酬项目编码
+            if (!isNullEmpty(nckd_xcxm)) {
+                if (!isValidFormula(nckd_xcxm)) {
+                    this.getView().showErrorNotification("请检查基本薪酬的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_xcxm.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("基本薪酬薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+            String nckd_dnyfjx = this.getModel().getDataEntity().getString("nckd_dnyfjx");// 当年应发绩效
+            if (!isNullEmpty(nckd_dnyfjx)) {
+                if (!isValidFormula(nckd_dnyfjx)) {
+                    this.getView().showErrorNotification("请检查当年应发绩效的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_dnyfjx.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("当年应发绩效薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+            String nckd_yfdnjx = this.getModel().getDataEntity().getString("nckd_yfdnjx");// 预发当年绩效
+            if (!isNullEmpty(nckd_yfdnjx)) {
+                if (!isValidFormula(nckd_yfdnjx)) {
+                    this.getView().showErrorNotification("请检查预发当年绩效的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_yfdnjx.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("预发当年绩效薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+            String nckd_bfdnjx = this.getModel().getDataEntity().getString("nckd_bfdnjx");// 补发上年绩效
+            if (!isNullEmpty(nckd_bfdnjx)) {
+                if (!isValidFormula(nckd_bfdnjx)) {
+                    this.getView().showErrorNotification("请检查补发上年绩效的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_bfdnjx.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("补发上年绩效薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+            String nckd_ydyzfjx = this.getModel().getDataEntity().getString("nckd_ydyzfjx");// 应递延支付绩效
+            if (!isNullEmpty(nckd_ydyzfjx)) {
+                if (!isValidFormula(nckd_ydyzfjx)) {
+                    this.getView().showErrorNotification("请检查递延支付绩效的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_ydyzfjx.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("应递延支付绩效薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+            String nckd_syrrqjl = this.getModel().getDataEntity().getString("nckd_syrrqjl");// 发放上一任期的任期激励
+            if (!isNullEmpty(nckd_syrrqjl)) {
+                if (!isValidFormula(nckd_syrrqjl)) {
+                    this.getView().showErrorNotification("请检查发放上一任期的任期激励的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_syrrqjl.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("发放上一任期的任期激励薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+            String nckd_bndrqjl = this.getModel().getDataEntity().getString("nckd_bndrqjl");// 预提本年度任期激励
+            if (!isNullEmpty(nckd_bndrqjl)) {
+                if (!isValidFormula(nckd_bndrqjl)) {
+                    this.getView().showErrorNotification("请检查预提本年度任期激励的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_bndrqjl.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("预提本年度任期激励薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+            String nckd_jbt = this.getModel().getDataEntity().getString("nckd_jbt");// 津补贴
+            if (!isNullEmpty(nckd_jbt)) {
+                if (!isValidFormula(nckd_jbt)) {
+                    this.getView().showErrorNotification("请检查津补贴的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_jbt.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("津补贴薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+            String nckd_qtycxjl = this.getModel().getDataEntity().getString("nckd_qtycxjl");// 其他一次性专项奖励
+            if (!isNullEmpty(nckd_qtycxjl)) {
+                if (!isValidFormula(nckd_qtycxjl)) {
+                    this.getView().showErrorNotification("请检查其他一次性专项奖励的公式");
+                    args.setCancel(true);
+                    return;
+                }
+                String checkXcBm = nckd_qtycxjl.replace("-", ",").replace("+", ",").replace("*", ",").replace("/", ",");
+                String[] xcBmStr = checkXcBm.split(",");
+                for (String xcBm : xcBmStr) {
+                    if(!allXcNumber.contains(xcBm)) {
+                        this.getView().showErrorNotification("其他一次性专项奖励薪酬项目编码:"+xcBm+"不存在,请检查");
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+        }
+        super.beforeDoOperation(args);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+    }
+
+    /**空判断*/
+    public static boolean isNullEmpty(Object obj) {
+        return obj == null || (obj instanceof String && ((String) obj).isEmpty());
+    }
+
+    /**获取所有薪酬项目编码*/
+    public Set<String> findAllNumber() {
+        List<QFilter> qfilter = new ArrayList<QFilter>();
+        qfilter.add(new QFilter("enable", "=", 1));
+        QFilter[] filtersQuery = (QFilter[]) qfilter.toArray(new QFilter[qfilter.size()]);
+        DynamicObjectCollection list =  QueryServiceHelper.query("hsbs_salaryitem", "id,name,number",  filtersQuery);
+        Set<String> numberSet = list.stream().map(item -> item.getString("number")).collect(java.util.stream.Collectors.toSet());
+        return numberSet;
+    }
+
+}

+ 124 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ZgsrDetailsAmtVO.java

@@ -0,0 +1,124 @@
+package nckd.jxccl.hr.gzbb;
+
+import java.math.BigDecimal;
+
+public class ZgsrDetailsAmtVO {
+    private Long personId;
+    private BigDecimal nckd_djbxc;
+    private BigDecimal nckd_ddnyfjx;
+    private BigDecimal nckd_dyjdnjx;
+    private BigDecimal nckd_dbfsnjx;
+    private BigDecimal nckd_dydyzfjx;
+    private BigDecimal nckd_dffsyrjxjl;
+    private BigDecimal nckd_dytbnrqjl;
+    private BigDecimal nckd_djbt;
+    private BigDecimal nckd_dqtycxzxjl;
+
+    public BigDecimal getNckd_djbxc() {
+        if (nckd_djbxc ==  null) {
+            nckd_djbxc = BigDecimal.ZERO;
+        }
+        return nckd_djbxc;
+    }
+
+    public void setNckd_djbxc(BigDecimal nckd_djbxc) {
+        this.nckd_djbxc = nckd_djbxc;
+    }
+
+    public BigDecimal getNckd_ddnyfjx() {
+        if (nckd_ddnyfjx ==  null) {
+            nckd_ddnyfjx = BigDecimal.ZERO;
+        }
+        return nckd_ddnyfjx;
+    }
+
+    public void setNckd_ddnyfjx(BigDecimal nckd_ddnyfjx) {
+        this.nckd_ddnyfjx = nckd_ddnyfjx;
+    }
+
+    public BigDecimal getNckd_dyjdnjx() {
+        if (nckd_dyjdnjx ==  null) {
+            nckd_dyjdnjx = BigDecimal.ZERO;
+        }
+        return nckd_dyjdnjx;
+    }
+
+    public void setNckd_dyjdnjx(BigDecimal nckd_dyjdnjx) {
+        this.nckd_dyjdnjx = nckd_dyjdnjx;
+    }
+
+    public BigDecimal getNckd_dbfsnjx() {
+        if (nckd_dbfsnjx ==  null) {
+            nckd_dbfsnjx = BigDecimal.ZERO;
+        }
+        return nckd_dbfsnjx;
+    }
+
+    public void setNckd_dbfsnjx(BigDecimal nckd_dbfsnjx) {
+        this.nckd_dbfsnjx = nckd_dbfsnjx;
+    }
+
+    public BigDecimal getNckd_dydyzfjx() {
+        if (nckd_dydyzfjx ==  null) {
+            nckd_dydyzfjx = BigDecimal.ZERO;
+        }
+        return nckd_dydyzfjx;
+    }
+
+    public void setNckd_dydyzfjx(BigDecimal nckd_dydyzfjx) {
+        this.nckd_dydyzfjx = nckd_dydyzfjx;
+    }
+
+    public BigDecimal getNckd_dffsyrjxjl() {
+        if (nckd_dffsyrjxjl ==  null) {
+            nckd_dffsyrjxjl = BigDecimal.ZERO;
+        }
+        return nckd_dffsyrjxjl;
+    }
+
+    public void setNckd_dffsyrjxjl(BigDecimal nckd_dffsyrjxjl) {
+        this.nckd_dffsyrjxjl = nckd_dffsyrjxjl;
+    }
+
+    public BigDecimal getNckd_dytbnrqjl() {
+        if (nckd_dytbnrqjl ==  null) {
+            nckd_dytbnrqjl = BigDecimal.ZERO;
+        }
+        return nckd_dytbnrqjl;
+    }
+
+    public void setNckd_dytbnrqjl(BigDecimal nckd_dytbnrqjl) {
+        this.nckd_dytbnrqjl = nckd_dytbnrqjl;
+    }
+
+    public BigDecimal getNckd_djbt() {
+        if (nckd_djbt ==  null) {
+            nckd_djbt = BigDecimal.ZERO;
+        }
+        return nckd_djbt;
+    }
+
+    public void setNckd_djbt(BigDecimal nckd_djbt) {
+        this.nckd_djbt = nckd_djbt;
+    }
+
+    public BigDecimal getNckd_dqtycxzxjl() {
+        if (nckd_dqtycxzxjl ==  null) {
+            nckd_dqtycxzxjl = BigDecimal.ZERO;
+        }
+        return nckd_dqtycxzxjl;
+    }
+
+    public void setNckd_dqtycxzxjl(BigDecimal nckd_dqtycxzxjl) {
+        this.nckd_dqtycxzxjl = nckd_dqtycxzxjl;
+    }
+
+    public Long getPersonId() {
+        return personId;
+    }
+
+    public void setPersonId(Long personId) {
+        this.personId = personId;
+    }
+}
+

+ 43 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ZgsrDetailsVO.java

@@ -0,0 +1,43 @@
+package nckd.jxccl.hr.gzbb;
+
+import java.math.BigDecimal;
+
+public class ZgsrDetailsVO {
+    private Long fcalpersonid;
+    private String xmnumber;
+    private BigDecimal calamountvalue;
+
+    private String textvalue;
+
+    public Long getFcalpersonid() {
+        return fcalpersonid;
+    }
+
+    public void setFcalpersonid(Long fcalpersonid) {
+        this.fcalpersonid = fcalpersonid;
+    }
+
+    public String getXmnumber() {
+        return xmnumber;
+    }
+
+    public void setXmnumber(String xmnumber) {
+        this.xmnumber = xmnumber;
+    }
+
+    public BigDecimal getCalamountvalue() {
+        return calamountvalue;
+    }
+
+    public void setCalamountvalue(BigDecimal calamountvalue) {
+        this.calamountvalue = calamountvalue;
+    }
+
+    public String getTextvalue() {
+        return textvalue;
+    }
+
+    public void setTextvalue(String textvalue) {
+        this.textvalue = textvalue;
+    }
+}

+ 632 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/gzbb/ZgsrVO.java

@@ -0,0 +1,632 @@
+package nckd.jxccl.hr.gzbb;
+
+import java.util.Date;
+
+
+public class ZgsrVO {
+    private Long mingdanid;
+    private String gonghao;
+    private Long renyuanid;
+    private Long qiyerenyuanid;
+    public Long zuzhirenid;
+    public String xingming;
+    private String zhurenzhi;
+    private Date ruzhiriqi;
+    private Date ruzhiriqifirst;
+    private Date ruzhiriqis;
+    private String ruzhifangshibm;
+    private String ruzhifangshimc;
+    private Date lizhiriqi;
+    private Date lizhiriqis;
+    private String xingbiebm;
+    private String xingbiemc;
+    private String zhengjianleixbm;
+    private String zhengjianhm;
+    private String zhegnjianleixmc;
+    private String nianling;
+    private String guojibm;
+    private String guojimc;
+    private Long bumenid;
+    private String bumenmc;
+    private String bumencbm;
+    private Long gongsiid;
+    private String gongsibm;
+    private String gongsimc;
+    private Long gangweiid;
+    private String gangweimc;
+    private String gangweibm;
+    private String gangweilbbm;
+    private String gangweilbmc;
+    private Long gangweicjid;
+    private String zhijibm;
+    private String zhijimc;
+    private String xuelibm;
+    private String xuelimc;
+    private String zhuanye;
+    private String zhengzhimianmaomc;
+    private String zhengzhimianmaobm;
+    private String yonggonggxbm;
+    private String yonggonggxmc;
+    private String yonggongjdbm;
+    private String yonggongjdmc;
+    private String feibenqyry;
+    private Long guojiajircid;
+
+    private Long jinengid;
+    private String jinengmc;
+    private String jinengdj;
+    private Long jinengjbid;
+    private Long zhiyeid;
+    private String zhiyeidmc;
+    private String zhiyeidj;
+    private Long zhiyejbid;
+    private Long zhichengid;
+    private String zhichengmc;
+    private String zhichengdj;
+    private Long zhichengjbid;
+
+    public Long getMingdanid() {
+        return mingdanid;
+    }
+
+    public void setMingdanid(Long mingdanid) {
+        this.mingdanid = mingdanid;
+    }
+
+    public Long getRenyuanid() {
+        return renyuanid;
+    }
+
+    public void setRenyuanid(Long renyuanid) {
+        this.renyuanid = renyuanid;
+    }
+
+    public Long getQiyerenyuanid() {
+        return qiyerenyuanid;
+    }
+
+    public void setQiyerenyuanid(Long qiyerenyuanid) {
+        this.qiyerenyuanid = qiyerenyuanid;
+    }
+
+    public String getXingming() {
+        if (xingming == null) {
+            xingming = "";
+        }
+        return xingming;
+    }
+
+    public void setXingming(String xingming) {
+        this.xingming = xingming;
+    }
+
+    public Date getRuzhiriqi() {
+        return ruzhiriqi;
+    }
+
+    public void setRuzhiriqi(Date ruzhiriqi) {
+        this.ruzhiriqi = ruzhiriqi;
+    }
+
+    public String getRuzhifangshibm() {
+        if (ruzhifangshibm == null) {
+            ruzhifangshibm = "";
+        }
+        return ruzhifangshibm;
+    }
+
+    public void setRuzhifangshibm(String ruzhifangshibm) {
+        this.ruzhifangshibm = ruzhifangshibm;
+    }
+
+    public String getRuzhifangshimc() {
+        if (ruzhifangshimc == null) {
+            ruzhifangshimc = "";
+        }
+        return ruzhifangshimc;
+    }
+
+    public void setRuzhifangshimc(String ruzhifangshimc) {
+        this.ruzhifangshimc = ruzhifangshimc;
+    }
+
+    public Date getLizhiriqi() {
+        return lizhiriqi;
+    }
+
+    public void setLizhiriqi(Date lizhiriqi) {
+        this.lizhiriqi = lizhiriqi;
+    }
+
+    public String getXingbiebm() {
+        if (xingbiebm == null) {
+            xingbiebm = "";
+        }
+        return xingbiebm;
+    }
+
+    public void setXingbiebm(String xingbiebm) {
+        this.xingbiebm = xingbiebm;
+    }
+
+    public String getXingbiemc() {
+        if (xingbiemc == null) {
+            xingbiemc = "";
+        }
+        return xingbiemc;
+    }
+
+    public void setXingbiemc(String xingbiemc) {
+        this.xingbiemc = xingbiemc;
+    }
+
+    public String getZhengjianleixbm() {
+        if (zhengjianleixbm == null) {
+            zhengjianleixbm = "";
+        }
+        return zhengjianleixbm;
+    }
+
+    public void setZhengjianleixbm(String zhengjianleixbm) {
+        this.zhengjianleixbm = zhengjianleixbm;
+    }
+
+    public String getZhengjianhm() {
+        if (zhengjianhm == null) {
+            zhengjianhm = "";
+        }
+        return zhengjianhm;
+    }
+
+    public void setZhengjianhm(String zhengjianhm) {
+        this.zhengjianhm = zhengjianhm;
+    }
+
+    public String getZhegnjianleixmc() {
+        if (zhegnjianleixmc == null) {
+            zhegnjianleixmc = "";
+        }
+        return zhegnjianleixmc;
+    }
+
+    public void setZhegnjianleixmc(String zhegnjianleixmc) {
+        this.zhegnjianleixmc = zhegnjianleixmc;
+    }
+
+    public String getNianling() {
+        if (nianling == null) {
+            nianling = "";
+        }
+        return nianling;
+    }
+
+    public void setNianling(String nianling) {
+        this.nianling = nianling;
+    }
+
+    public String getGuojibm() {
+        if (guojibm == null) {
+            guojibm = "";
+        }
+        return guojibm;
+    }
+
+    public void setGuojibm(String guojibm) {
+        this.guojibm = guojibm;
+    }
+
+    public String getGuojimc() {
+        if (guojimc == null) {
+            guojimc = "";
+        }
+        return guojimc;
+    }
+
+    public void setGuojimc(String guojimc) {
+        this.guojimc = guojimc;
+    }
+
+    public Long getBumenid() {
+        return bumenid;
+    }
+
+    public void setBumenid(Long bumenid) {
+        this.bumenid = bumenid;
+    }
+
+    public String getBumenmc() {
+        if (bumenmc == null) {
+            bumenmc = "";
+        }
+        return bumenmc;
+    }
+
+    public void setBumenmc(String bumenmc) {
+        this.bumenmc = bumenmc;
+    }
+
+    public Long getGongsiid() {
+        return gongsiid;
+    }
+
+    public void setGongsiid(Long gongsiid) {
+        this.gongsiid = gongsiid;
+    }
+
+    public String getGongsimc() {
+        if (gongsimc == null) {
+            gongsimc = "";
+        }
+        return gongsimc;
+    }
+
+    public void setGongsimc(String gongsimc) {
+        this.gongsimc = gongsimc;
+    }
+
+    public Long getGangweiid() {
+        return gangweiid;
+    }
+
+    public void setGangweiid(Long gangweiid) {
+        this.gangweiid = gangweiid;
+    }
+
+    public String getGangweimc() {
+        if (gangweimc == null) {
+            gangweimc = "";
+        }
+        return gangweimc;
+    }
+
+    public void setGangweimc(String gangweimc) {
+        this.gangweimc = gangweimc;
+    }
+
+    public String getGangweibm() {
+        if (gangweibm == null) {
+            gangweibm = "";
+        }
+        return gangweibm;
+    }
+
+    public void setGangweibm(String gangweibm) {
+        this.gangweibm = gangweibm;
+    }
+
+    public String getGangweilbbm() {
+        if (gangweilbbm == null) {
+            gangweilbbm = "";
+        }
+        return gangweilbbm;
+    }
+
+    public void setGangweilbbm(String gangweilbbm) {
+        this.gangweilbbm = gangweilbbm;
+    }
+
+    public String getGangweilbmc() {
+        if (gangweilbmc == null) {
+            gangweilbmc = "";
+        }
+        return gangweilbmc;
+    }
+
+    public void setGangweilbmc(String gangweilbmc) {
+        this.gangweilbmc = gangweilbmc;
+    }
+
+    public String getZhijibm() {
+        if (zhijibm == null) {
+            zhijibm = "";
+        }
+        return zhijibm;
+    }
+
+    public void setZhijibm(String zhijibm) {
+        this.zhijibm = zhijibm;
+    }
+
+    public String getZhijimc() {
+        if (zhijimc == null) {
+            zhijimc = "";
+        }
+        return zhijimc;
+    }
+
+    public void setZhijimc(String zhijimc) {
+        this.zhijimc = zhijimc;
+    }
+
+    public String getXuelibm() {
+        if (xuelibm == null) {
+            xuelibm = "";
+        }
+        return xuelibm;
+    }
+
+    public void setXuelibm(String xuelibm) {
+        this.xuelibm = xuelibm;
+    }
+
+    public String getXuelimc() {
+        if (xuelimc == null) {
+            xuelimc = "";
+        }
+        return xuelimc;
+    }
+
+    public void setXuelimc(String xuelimc) {
+        this.xuelimc = xuelimc;
+    }
+
+    public String getZhuanye() {
+        if (zhuanye == null) {
+            zhuanye = "";
+        }
+        return zhuanye;
+    }
+
+    public void setZhuanye(String zhuanye) {
+        this.zhuanye = zhuanye;
+    }
+
+    public String getZhengzhimianmaomc() {
+        if (zhengzhimianmaomc == null) {
+            zhengzhimianmaomc = "";
+        }
+        return zhengzhimianmaomc;
+    }
+
+    public void setZhengzhimianmaomc(String zhengzhimianmaomc) {
+        this.zhengzhimianmaomc = zhengzhimianmaomc;
+    }
+
+    public String getZhengzhimianmaobm() {
+        if (zhengzhimianmaobm == null) {
+            zhengzhimianmaobm = "";
+        }
+        return zhengzhimianmaobm;
+    }
+
+    public void setZhengzhimianmaobm(String zhengzhimianmaobm) {
+        this.zhengzhimianmaobm = zhengzhimianmaobm;
+    }
+
+    public Long getGangweicjid() {
+        return gangweicjid;
+    }
+
+    public void setGangweicjid(Long gangweicjid) {
+        this.gangweicjid = gangweicjid;
+    }
+
+    public String getYonggonggxbm() {
+        if (yonggonggxbm == null) {
+            yonggonggxbm = "";
+        }
+        return yonggonggxbm;
+    }
+
+    public void setYonggonggxbm(String yonggonggxbm) {
+        this.yonggonggxbm = yonggonggxbm;
+    }
+
+    public String getYonggonggxmc() {
+        if (yonggonggxmc == null) {
+            yonggonggxmc = "";
+        }
+        return yonggonggxmc;
+    }
+
+    public void setYonggonggxmc(String yonggonggxmc) {
+        this.yonggonggxmc = yonggonggxmc;
+    }
+
+    public String getYonggongjdbm() {
+        if (yonggongjdbm == null) {
+            yonggongjdbm = "";
+        }
+        return yonggongjdbm;
+    }
+
+    public void setYonggongjdbm(String yonggongjdbm) {
+        this.yonggongjdbm = yonggongjdbm;
+    }
+
+    public String getYonggongjdmc() {
+        if (yonggongjdmc == null) {
+            yonggongjdmc = "";
+        }
+        return yonggongjdmc;
+    }
+
+    public void setYonggongjdmc(String yonggongjdmc) {
+        this.yonggongjdmc = yonggongjdmc;
+    }
+
+    public String getFeibenqyry() {
+        if (feibenqyry == null) {
+            feibenqyry = "";
+        }
+        return feibenqyry;
+    }
+
+    public void setFeibenqyry(String feibenqyry) {
+        this.feibenqyry = feibenqyry;
+    }
+
+    public Long getGuojiajircid() {
+        return guojiajircid;
+    }
+
+    public void setGuojiajircid(Long guojiajircid) {
+        this.guojiajircid = guojiajircid;
+    }
+
+    public String getGongsibm() {
+        if (gongsibm == null) {
+            gongsibm = "";
+        }
+        return gongsibm;
+    }
+
+    public void setGongsibm(String gongsibm) {
+        this.gongsibm = gongsibm;
+    }
+
+    public String getBumencbm() {
+        if (bumencbm == null) {
+            bumencbm = "";
+        }
+        return bumencbm;
+    }
+
+    public void setBumencbm(String bumencbm) {
+        this.bumencbm = bumencbm;
+    }
+
+    public Long getJinengid() {
+        return jinengid;
+    }
+
+    public void setJinengid(Long jinengid) {
+        this.jinengid = jinengid;
+    }
+
+    public String getJinengmc() {
+        return jinengmc;
+    }
+
+    public void setJinengmc(String jinengmc) {
+        this.jinengmc = jinengmc;
+    }
+
+    public String getJinengdj() {
+        return jinengdj;
+    }
+
+    public void setJinengdj(String jinengdj) {
+        this.jinengdj = jinengdj;
+    }
+
+    public Long getZhiyeid() {
+        return zhiyeid;
+    }
+
+    public void setZhiyeid(Long zhiyeid) {
+        this.zhiyeid = zhiyeid;
+    }
+
+    public String getZhiyeidmc() {
+        return zhiyeidmc;
+    }
+
+    public void setZhiyeidmc(String zhiyeidmc) {
+        this.zhiyeidmc = zhiyeidmc;
+    }
+
+    public String getZhiyeidj() {
+        return zhiyeidj;
+    }
+
+    public void setZhiyeidj(String zhiyeidj) {
+        this.zhiyeidj = zhiyeidj;
+    }
+
+    public Long getZhichengid() {
+        return zhichengid;
+    }
+
+    public void setZhichengid(Long zhichengid) {
+        this.zhichengid = zhichengid;
+    }
+
+    public String getZhichengmc() {
+        return zhichengmc;
+    }
+
+    public void setZhichengmc(String zhichengmc) {
+        this.zhichengmc = zhichengmc;
+    }
+
+    public String getZhichengdj() {
+        return zhichengdj;
+    }
+
+    public void setZhichengdj(String zhichengdj) {
+        this.zhichengdj = zhichengdj;
+    }
+
+    public Long getJinengjbid() {
+        return jinengjbid;
+    }
+
+    public void setJinengjbid(Long jinengjbid) {
+        this.jinengjbid = jinengjbid;
+    }
+
+    public Long getZhiyejbid() {
+        return zhiyejbid;
+    }
+
+    public void setZhiyejbid(Long zhiyejbid) {
+        this.zhiyejbid = zhiyejbid;
+    }
+
+    public Long getZhichengjbid() {
+        return zhichengjbid;
+    }
+
+    public void setZhichengjbid(Long zhichengjbid) {
+        this.zhichengjbid = zhichengjbid;
+    }
+
+    public Long getZuzhirenid() {
+        return zuzhirenid;
+    }
+
+    public void setZuzhirenid(Long zuzhirenid) {
+        this.zuzhirenid = zuzhirenid;
+    }
+
+    public Date getRuzhiriqifirst() {
+        return ruzhiriqifirst;
+    }
+
+    public void setRuzhiriqifirst(Date ruzhiriqifirst) {
+        this.ruzhiriqifirst = ruzhiriqifirst;
+    }
+
+    public String getGonghao() {
+        return gonghao;
+    }
+
+    public void setGonghao(String gonghao) {
+        this.gonghao = gonghao;
+    }
+
+    public Date getRuzhiriqis() {
+        return ruzhiriqis;
+    }
+
+    public void setRuzhiriqis(Date ruzhiriqis) {
+        this.ruzhiriqis = ruzhiriqis;
+    }
+
+    public Date getLizhiriqis() {
+        return lizhiriqis;
+    }
+
+    public void setLizhiriqis(Date lizhiriqis) {
+        this.lizhiriqis = lizhiriqis;
+    }
+
+    public String getZhurenzhi() {
+        return zhurenzhi;
+    }
+
+    public void setZhurenzhi(String zhurenzhi) {
+        this.zhurenzhi = zhurenzhi;
+    }
+}