Forráskód Böngészése

1.同步OA绩效
2.入职协作/薪酬调整单生成定调薪信息字段调整
3.核算名单扩展相关
4.出纳代发处理打印插件

Tyx 4 napja
szülő
commit
bae39fde26

+ 25 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hspm/opplugin/infoclassify/performance/PerformanceSaveOp.java

@@ -0,0 +1,25 @@
+package nckd.jimin.jyyy.hr.hspm.opplugin.infoclassify.performance;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.sdk.hr.hspm.opplugin.InfoclassifySaveOp;
+import kd.sdk.plugin.Plugin;
+
+/**
+ * 动态表单插件
+ */
+public class PerformanceSaveOp extends InfoclassifySaveOp {
+
+    @Override
+    protected void saveOverride(BeginOperationTransactionArgs args, DynamicObject[] dataEntities) {
+        super.saveOverride(args, dataEntities);
+    }
+
+    @Override
+    protected void saveNew(BeginOperationTransactionArgs args, DynamicObject[] dataEntities) {
+        super.saveNew(args, dataEntities);
+    }
+
+
+}

+ 1 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hcdm/formplugin/web/AdjustJobBillEffectOp.java

@@ -202,7 +202,7 @@ public class AdjustJobBillEffectOp extends AbstractOperationServicePlugIn implem
         }
         relperson_data.put("salaystructure", relPerson.getLong("salaystructure.id"));
         relperson_data.put("stdscm", relPerson.getLong("stdscm.id"));
-        relperson_data.put("empgroup", 1090L);
+        relperson_data.put("empgroup", 1019L);
         info.put("relperson_data", relperson_data);
         list.add(info);
         returnMap.put("data", list);

+ 122 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hsas/calperson/CalPersonExtService.java

@@ -0,0 +1,122 @@
+package nckd.jimin.jyyy.hr.swc.hsas.calperson;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.sdk.swc.hsas.business.extpoint.calperson.IAddCalPersonExtService;
+import kd.sdk.swc.hsas.common.events.calperson.AddJudeUpdateFieldsEvent;
+import kd.sdk.swc.hsas.common.events.calperson.AfterAddCalpersonEvent;
+import kd.sdk.swc.hsas.common.events.calperson.AfterQueryDataForRuleEvent;
+import nckd.jimin.jyyy.hr.swc.hsas.util.CalPersonUtil;
+import nckd.jimin.jyyy.hr.task.util.SyncOAHelper;
+
+import java.sql.Time;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 2025-07-24
+ * Tyx
+ * 核算名单扩展类
+ * 业务扩展接口类:kd.sdk.swc.hsas.business.extpoint.calperson.IAddCalPersonExtService
+ * 增加更新人员判断的字段   kd.sdk.swc.hsas.business.extpoint.calperson.IAddCalPersonExtService#addJudeUpdateFields
+ * 核算名单添加人员二开埋点 kd.sdk.swc.hsas.business.extpoint.calperson.IAddCalPersonExtService#afterPackagePerson
+ * 核算名单规则解析二开取值 kd.sdk.swc.hsas.business.extpoint.calperson.IAddCalPersonExtService#afterQueryDataForRule
+ */
+public class CalPersonExtService implements IAddCalPersonExtService {
+
+    private static final Log log = LogFactory.getLog(CalPersonExtService.class);
+    @Override
+    public void afterPackagePerson(AfterAddCalpersonEvent event) {
+        DynamicObjectCollection calPersons = event.getCalPersons();
+        //提取所有薪酬档案ID和PersonId
+        List<Long> salaryFileIds = calPersons.stream().map(o -> o.getLong("salaryfile")).collect(Collectors.toList());
+        List<Long> personIds = calPersons.stream().map(o -> o.getLong("salaryfilev.person.id")).collect(Collectors.toList());
+        //核算期间开始日期-结束日期
+        Date endDate = event.getEndDate();
+        //批量获取银行卡信息
+        Map<Long, DynamicObject> paySettingMap = CalPersonUtil.getBankInfoByFileID(salaryFileIds);
+        //批量获取核算期间上月实签单位
+        Map<Long, Long> aContractMap = CalPersonUtil.getAContractInfoByPersonID(personIds, endDate);
+        //批量获取核算期间所属月份实签单位
+        Map<Long, Long> bContractMap = CalPersonUtil.getAContractInfoByPersonID(personIds, endDate);
+        for(DynamicObject calPerson : calPersons) {
+            Long salaryFileId = calPerson.getLong("salaryfile");
+            DynamicObject paySettingDyn = paySettingMap.get(salaryFileId);
+            if(!ObjectUtils.isEmpty(paySettingDyn)){
+                calPerson.set("nckd_perbankcard", paySettingDyn.getLong("entryentity.perbankcard.id"));
+            }
+            Long personId = calPerson.getLong("salaryfilev.person.id");
+            Long aContractId = aContractMap.get(personId);
+            if(aContractId != null) {
+                calPerson.set("nckd_asigncompany", aContractId);
+            }
+            Long bContractId = bContractMap.get(personId);
+            if(bContractId != null) {
+                calPerson.set("nckd_bsigncompany", bContractId);
+            }
+        }
+    }
+
+    /**
+     * 添加二开字段,供核算名单规则过滤使用
+     * @param event
+     */
+    @Override
+    public void afterQueryDataForRule(AfterQueryDataForRuleEvent event) {
+        IAddCalPersonExtService.super.afterQueryDataForRule(event);
+        Map<String, Set<String>> entityFiledMap = event.getEntityFiledMap();
+        Set<String> perBankCardFields = entityFiledMap.get("hrpi_perbankcard");
+        Set<String> contractFields = entityFiledMap.get("hlcm_contract");
+        List<Map<String, Object>> datas = event.getDatas();
+        if(datas.size() == 0)
+            return;
+        //先批量获取银行卡信息
+        List<Long> personIds = datas.stream().map(map -> Long.valueOf(map.get("person.id").toString())).collect(Collectors.toList());
+        Map<Long, DynamicObject> paySettingMap = CalPersonUtil.getBankInfoByPersonID(personIds);
+        Date date = (Date) datas.get(0).get("caltask.enddate");
+        //批量获取核算期间上月实签单位
+        Map<Long, Long> aContractMap = CalPersonUtil.getAContractInfoByPersonID(personIds, date);
+        //批量获取核算期间所属月份实签单位
+        Map<Long, Long> bContractMap = CalPersonUtil.getAContractInfoByPersonID(personIds, date);
+
+        for(Map<String,Object> data : datas) {
+            Long personId = Long.valueOf(data.get("person.id").toString());
+            DynamicObject paySettingDyn = paySettingMap.get(personId);
+            if(ObjectUtils.isEmpty(paySettingDyn))
+                continue;
+            //银行卡信息塞值
+            if(perBankCardFields != null) {
+                for (String field : perBankCardFields) {
+                    Object fieldValue = paySettingDyn.get("entryentity.perbankcard." + field);
+                    data.put("hrpi_perbankcard" + "." + field, fieldValue);
+                }
+            }
+            //合同信息塞值
+            if(contractFields != null) {
+                for (String field : contractFields) {
+                    Long aContractId = aContractMap.get(personId);
+                    if (aContractId != null) {
+                        data.put("hlcm_contract" + "." + field, aContractId);
+                    }
+                    Long bContractId = bContractMap.get(personId);
+                    if (bContractId != null) {
+                        data.put("hlcm_contract" + "." + field, bContractId);
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void addJudeUpdateFields(AddJudeUpdateFieldsEvent event) {
+        event.getFields().add("nckd_perbankcard.id");
+        event.getFields().add("nckd_asigncompany.id");
+        event.getFields().add("nckd_bsigncompany.id");
+    }
+}

+ 1 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hsas/formplugin/web/helper/AdjSalFileHelper.java

@@ -223,7 +223,7 @@ public class AdjSalFileHelper {
         relperson_data.put("adminorg", salaryAdjFile.getLong("adminorg.id"));
         relperson_data.put("assoadminorg", salaryAdjFile.getLong("adminorg.id"));
         //薪酬管理人员组
-        relperson_data.put("empgroup", 1090L);
+        relperson_data.put("empgroup", 1019L);
         map.put("relperson_data", relperson_data);
     }
 

+ 131 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hsas/util/CalPersonUtil.java

@@ -0,0 +1,131 @@
+package nckd.jimin.jyyy.hr.swc.hsas.util;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class CalPersonUtil {
+
+    private static final Log log = LogFactory.getLog(CalPersonUtil.class);
+    public static String SALARYFILE_ENTITY = "hsas_salaryfile";
+    public static String PAYSETTING_ENTITY = "hsas_paysetting";
+    public static String PERBANKCARD_ENTITY = "hrpi_perbankcard";
+    public static String CONTRACT_ENTITY = "hlcm_contract";
+
+    /**
+     * 根据薪酬档案ID获取银行信息
+     * @param salaryFileIds 薪酬档案ID
+     * @return
+     */
+    public static Map<Long, DynamicObject> getBankInfoByFileID(List<Long> salaryFileIds) {
+        QFilter filter = new QFilter("salaryfile.id", QCP.in, salaryFileIds);
+        String selectFields = "salaryfile.id,entryentity.perbankcard.id," +
+                "entryentity.perbankcard.bankcardnum,entryentity.perbankcard.bankdeposit,entryentity.perbankcard.username";
+        DynamicObjectCollection paySettingCols = QueryServiceHelper.query(PAYSETTING_ENTITY, selectFields, new QFilter[]{filter});
+        //提取成Map,k = 薪酬档案ID,v = DynamicObject
+        Map paySettingMap = paySettingCols.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("salaryfile.id");
+        }, (dyx) -> {
+            return dyx;
+        }, (key1, key2) -> {
+            return key2;
+        }));
+        return paySettingMap;
+    }
+
+    /**
+     * 根据人员获取薪酬档案银行卡信息
+     * @param personIds
+     * @return
+     */
+    public static Map<Long, DynamicObject> getBankInfoByPersonID(List<Long> personIds) {
+        QFilter filter = new QFilter("salaryfile.person.id", QCP.in, personIds);
+        filter.and("iscurrentversion", QCP.equals, "1");
+        filter.and("datastatus", QCP.equals, "1");
+        String selectFields = "salaryfile.person.id,entryentity.perbankcard.id," +
+                "entryentity.perbankcard.bankcardnum,entryentity.perbankcard.bankdeposit,entryentity.perbankcard.username";
+        DynamicObjectCollection paySettingCols = QueryServiceHelper.query(PAYSETTING_ENTITY, selectFields, new QFilter[]{filter});
+        //提取成Map,k = 薪酬档案ID,v = DynamicObject
+        Map paySettingMap = paySettingCols.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("salaryfile.person.id");
+        }, (dyx) -> {
+            return dyx;
+        }, (key1, key2) -> {
+            return key2;
+        }));
+        return paySettingMap;
+    }
+
+    /**
+     * 根据Person获取核算期间上月合同档案的实签单位
+     * @param personIds
+     * @param date
+     * @return Map, k = 人员ID, v = 实签单位ID
+     */
+    public static Map<Long, Long> getAContractInfoByPersonID (List<Long> personIds, Date date) {
+        Date lastDate = getLastMonthDay(date);
+        QFilter filter = new QFilter("person.id", QCP.in, personIds);
+        filter.and("startdate", QCP.less_equals, lastDate);
+        filter.and("enddate", QCP.large_equals, lastDate);
+        String selectFields = "person.id,actualsigncompany.id";
+        DynamicObjectCollection contractCols = QueryServiceHelper.query(CONTRACT_ENTITY, selectFields, new QFilter[]{filter});
+        //按照person.id提取
+        Map contractMap = contractCols.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("person.id");
+        }, (dyx) -> {
+            return dyx.getLong("actualsigncompany.id");
+        }, (key1, key2) -> {
+            return key2;
+        }));
+        return contractMap;
+    }
+
+    /**
+     * 根据Person获取核算期间合同档案的实签单位
+     * @param personIds
+     * @param date
+     * @return Map, k = 人员ID, v = 实签单位ID
+     */
+    public static Map<Long, Long> getBContractInfoByPersonID (List<Long> personIds, Date date) {
+        QFilter filter = new QFilter("person.id", QCP.in, personIds);
+        filter.and("startdate", QCP.less_equals, date);
+        filter.and("enddate", QCP.large_equals, date);
+        String selectFields = "person.id,actualsigncompany.id";
+        DynamicObjectCollection contractCols = QueryServiceHelper.query(CONTRACT_ENTITY, selectFields, new QFilter[]{filter});
+        //按照person.id提取
+        Map contractMap = contractCols.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("person.id");
+        }, (dyx) -> {
+            return dyx.getLong("actualsigncompany.id");
+        }, (key1, key2) -> {
+            return key2;
+        }));
+        return contractMap;
+    }
+
+    /**
+     * 根据入参获取上个月最后一天
+     * @param date
+     * @return
+     */
+    public static Date getLastMonthDay (Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        calendar.add(Calendar.DAY_OF_MONTH, -1);
+        return calendar.getTime();
+    }
+
+}

+ 97 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/print/AgentPayBillPrintPlugin.java

@@ -0,0 +1,97 @@
+package nckd.jimin.jyyy.hr.swc.print;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.print.core.data.DataRowSet;
+import kd.bos.print.core.data.field.TextField;
+import kd.bos.print.core.plugin.AbstractPrintPlugin;
+import kd.bos.print.core.plugin.event.BeforeLoadDataEvent;
+import kd.bos.print.core.plugin.event.CustomDataLoadEvent;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
+import kd.bos.workflow.component.approvalrecord.IApprovalRecordGroup;
+import kd.bos.workflow.component.approvalrecord.IApprovalRecordItem;
+import kd.sdk.plugin.Plugin;
+import nckd.jimin.jyyy.hr.task.util.SyncOAUtil;
+
+import java.util.List;
+
+/**
+ * 出纳代发单打印插件 Tyx 2025-07-23
+ * 获取关联的薪资审批单的审批记录
+ */
+public class AgentPayBillPrintPlugin extends AbstractPrintPlugin implements Plugin {
+
+    private static final Log log = LogFactory.getLog(AgentPayBillPrintPlugin.class);
+    private static String SWCAGENTBILL_ENTITY = "hsas_agencypaybill";
+    private static String PAYDETAIL_ENTITY = "hsas_paydetail";
+    private static String APPROVEBILL_ENTITY = "hsas_approvebill";
+
+    @Override
+    public void beforeLoadData(BeforeLoadDataEvent evt) {
+        super.beforeLoadData(evt);
+    }
+
+    @Override
+    public void loadCustomData(CustomDataLoadEvent evt) {
+        super.loadCustomData(evt);
+        String queryName = evt.getDataSource().getDsName();
+        if("nckd_approvebill".equals(queryName)) {
+            //获取出纳代发单ID
+            Object pkId = evt.getDataSource().getPkId();
+            String entityId = evt.getDataSource().getFormId();
+            DynamicObject agentPayBillDyn = BusinessDataServiceHelper.loadSingle(pkId, entityId);
+            //取第一条分录的源单ID/源单分录ID
+            DynamicObjectCollection entryCols = agentPayBillDyn.getDynamicObjectCollection("entry");
+            if(entryCols.size() > 0) {
+                DynamicObject entry = entryCols.get(0);
+                long sourceAgentBillId = entry.getLong("sourcebillid");
+                long sourceAgentEntryId = entry.getLong("sourceentryid");
+                //查询薪资代发单分录-发放明细ID
+                QFilter filter = new QFilter("id", QCP.equals, sourceAgentBillId);
+                filter.and("entryentity.id", QCP.equals, sourceAgentEntryId);
+                DynamicObject sourceAgentBill = QueryServiceHelper.queryOne(SWCAGENTBILL_ENTITY, "entryentity.paydetail", new QFilter[]{filter});
+                if(!ObjectUtils.isEmpty(sourceAgentBill)) {
+                    //再获取发放明细-薪酬核算大表ID
+                    DynamicObject payDetailDyn = BusinessDataServiceHelper.loadSingle(sourceAgentBill.getLong("entryentity.paydetail"), PAYDETAIL_ENTITY);
+                    if(!ObjectUtils.isEmpty(payDetailDyn)) {
+                        long calTableId = payDetailDyn.getLong("caltableid");
+                        //再获取薪资审批单ID
+                        QFilter filter1 = new QFilter("calentryentity.caltableid",QCP.equals,calTableId);
+                        DynamicObject approveBillDyn = QueryServiceHelper.queryOne(APPROVEBILL_ENTITY, "id", new QFilter[]{filter1});
+                        if(!ObjectUtils.isEmpty(approveBillDyn)) {
+                            //获取薪资审批单的审批记录
+                            List<IApprovalRecordGroup> appRecord = WorkflowServiceHelper.getAllApprovalRecord(String.valueOf(approveBillDyn.getLong("id")));
+                            evt.getCustomDataRows().clear();
+                            for(IApprovalRecordGroup record : appRecord) {
+                                List<IApprovalRecordItem> childs = record.getChildren();
+                                for (IApprovalRecordItem child : childs) {
+                                    DataRowSet dataRowSet = new DataRowSet();
+                                    String a = child.getActivityName();
+                                    String b = child.getAssignee();
+                                    String c = child.getTime();
+                                    String d = child.getMessage();
+                                    String e = child.getResult();
+                                    dataRowSet.put("a", new TextField(a));
+                                    dataRowSet.put("b", new TextField(b));
+                                    dataRowSet.put("c", new TextField(c));
+                                    dataRowSet.put("d", new TextField(d));
+                                    dataRowSet.put("e", new TextField(e));
+                                    evt.getCustomDataRows().add(dataRowSet);
+                                }
+
+                            }
+                            log.info("1");
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 25 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/task/SyncPerformanceOATask.java

@@ -0,0 +1,25 @@
+package nckd.jimin.jyyy.hr.task;
+
+import kd.bos.context.RequestContext;
+import kd.bos.exception.KDException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.schedule.executor.AbstractTask;
+import kd.sdk.plugin.Plugin;
+import nckd.jimin.jyyy.hr.task.util.SyncOAHelper;
+
+import java.util.Map;
+
+/**
+ * 获取OA绩效数据
+ * 保存至人员档案-绩效信息附表
+ * 2025-07-21
+ */
+public class SyncPerformanceOATask extends AbstractTask implements Plugin {
+    private static final Log log = LogFactory.getLog(SyncPerformanceOATask.class);
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        log.info("-------- 开始同步OA绩效数据 --------");
+        SyncOAHelper.syncPerformanceData();
+    }
+}

+ 271 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/task/util/SyncOAHelper.java

@@ -0,0 +1,271 @@
+package nckd.jimin.jyyy.hr.task.util;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.exception.KDBizException;
+import kd.bos.ext.fi.plugin.ArApConvert.util.EmptyUtils;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.sdk.util.KHttpClientUtils;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.util.StringUtils;
+import kd.hr.hbp.business.application.impl.newhismodel.HisModelController;
+import kd.hr.hbp.business.domain.model.newhismodel.HisResponse;
+import kd.hr.hbp.business.domain.model.newhismodel.HisVersionParamBo;
+import kd.hr.hbp.business.domain.model.newhismodel.VersionChangeRespData;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.common.constants.newhismodel.EnumHisOperateType;
+import nckd.base.helper.CommonHelperUtils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.*;
+
+public class SyncOAHelper {
+    private static final Log log = LogFactory.getLog(SyncOAHelper.class);
+    private static final String PERSON_ENTITY = "hrpi_person";
+    public static final String PERFORMANCE_ENTITY = "nckd_hrpi_performan";
+
+    public static Map<String, String> syncPerformanceData() {
+        Map<String, String> result = new HashMap<>();
+        Map<String, String> mapentity = CommonHelperUtils.getCommonParams("OA-Test");
+        String code = getCode(mapentity);
+        String accessToken = getToken(mapentity, code);
+        JSONArray totalJSONArray = getData(mapentity, accessToken);
+        dealPerformanceData(totalJSONArray);
+        return result;
+    }
+
+    public static String getCode(Map<String, String> mapentity) {
+        String code = null;
+        try {
+            if(mapentity == null){
+                throw new KDBizException("相关客户化参数未配置");
+            }
+            String param_corpid = mapentity.get("corpid");
+            String param_response = mapentity.get("response_type");
+            String param_state = mapentity.get("state");
+            String param_app_key = mapentity.get("app_key");
+            String param_app_secret = mapentity.get("app_secret");
+            String param_code_url = mapentity.get("getcode");
+            String param_token_url = mapentity.get("gettoken");
+
+            if( StringUtils.isEmpty(param_corpid) || StringUtils.isEmpty(param_app_secret)
+                    || StringUtils.isEmpty(param_code_url) || StringUtils.isEmpty(param_token_url)
+                    ||  StringUtils.isEmpty(param_app_key)){
+                throw new KDBizException("相关客户化参数未配置");
+            }
+
+            Map<String, String> header = new HashMap<>();
+            header.put("Content-Type", "application/json");
+
+            //获取token
+            StringBuilder authorizeUrl = new StringBuilder();
+            authorizeUrl.append(param_code_url);
+            authorizeUrl.append("?corpid=");
+            authorizeUrl.append(param_corpid);
+            authorizeUrl.append("&response_type=");
+            authorizeUrl.append(param_response);
+            authorizeUrl.append("&state=");
+            authorizeUrl.append(param_state);
+
+            String bodyJSONString = getBody();
+
+            log.info("请求泛微 接口:" + authorizeUrl);
+            String response = KHttpClientUtils.postjson(authorizeUrl.toString().toString(),header,bodyJSONString);
+            JSONObject codeJson = JSONObject.parseObject(response);
+            code = codeJson.getString("code");
+            log.info("请求泛微 authorizeUrl Return:" + code );
+        } catch (IOException e) {
+            throw new KDBizException("请求泛微authorizeUrl接口失败:" + e.getMessage());
+        }
+        return code;
+    }
+
+    public static String getToken(Map<String, String> mapentity, String code) {
+        String token = null;
+        try {
+            String param_app_key = mapentity.get("app_key");
+            String param_grant_type = mapentity.get("grant_type");
+            String param_app_secret = mapentity.get("app_secret");
+            String param_token_url = mapentity.get("gettoken");
+
+            StringBuilder tokenUrl = new StringBuilder();
+            tokenUrl.append(param_token_url);
+            tokenUrl.append("?app_key=");
+            tokenUrl.append(param_app_key);
+            tokenUrl.append("&app_secret=");
+            tokenUrl.append(param_app_secret);
+            tokenUrl.append("&grant_type=");
+            tokenUrl.append(param_grant_type);
+            tokenUrl.append("&code=");
+            tokenUrl.append(code);
+
+            Map<String, String> header = new HashMap<>();
+            header.put("Content-Type", "application/json");
+            String bodyJSONString = getBody();
+            log.info("请求泛微 接口:" + tokenUrl);
+            String reToken = KHttpClientUtils.postjson(tokenUrl.toString(), header, bodyJSONString);
+            log.info("请求泛微 TokenUrl Return:" + reToken);
+            JSONObject tokenJson = JSONObject.parseObject(reToken);
+            token = tokenJson.getString("accessToken");
+        } catch (IOException e) {
+            throw new KDBizException("请求泛微authorizeUrl接口失败:" + e.getMessage());
+        }
+        return token;
+    }
+
+    public static JSONArray getData (Map<String, String> mapentity, String token) {
+        try {
+            String post_getperformance_url = mapentity.get("getperformance");
+            String param_secretkey = mapentity.get("secret_key");
+            String param_operator = mapentity.get("operator");
+            Map<String, String> header = new HashMap<>();
+            header.put("Content-Type", "application/json");
+
+            StringBuilder performanceUrl = new StringBuilder();
+            performanceUrl.append(post_getperformance_url);
+            performanceUrl.append("?access_token=");
+            performanceUrl.append(token);
+            performanceUrl.append("&secret_key=");
+            performanceUrl.append(param_secretkey);
+
+            JSONArray totalDataArr = new JSONArray();
+            boolean status = true;
+            int pageNo = 1;
+            int pageSize = 200;
+            while(status) {
+                String response = getPerformanceData(performanceUrl, param_operator, header, pageNo, pageSize);
+                JSONObject responseData = JSONObject.parseObject(response);
+                JSONObject dataJson = responseData.getJSONObject("datajson");
+                JSONArray datas = dataJson.getJSONArray("datas");
+                if(datas.size() < pageSize) {
+                    status = false;
+                }
+                totalDataArr.addAll(datas);
+                pageNo++;
+            }
+            return totalDataArr;
+
+        } catch (Exception e) {
+            throw new KDBizException("请求OA接口失败:" + e.getMessage());
+        }
+    }
+
+    public static String getPerformanceData (StringBuilder performanceUrl, String operator, Map<String, String> header, int pageNo, int pageSize) throws IOException {
+        String param = getPerformanceBody(operator, pageNo, pageSize);
+        log.info("请求OA 接口:" + performanceUrl.toString());
+        log.info("请求OA data:" + param);
+        String response = KHttpClientUtils.postjson(performanceUrl.toString(), header, param);
+        log.info("请求OA Performance Return:" + response);
+        return response;
+    }
+
+    private static void dealPerformanceData(JSONArray datas) {
+        List<DynamicObject> dynList = new ArrayList<>();
+        for(int i = 0; i < datas.size(); i++) {
+            HRBaseServiceHelper helper = HRBaseServiceHelper.create(PERFORMANCE_ENTITY);
+            DynamicObject dyn = helper.generateEmptyDynamicObject();
+            JSONObject data = datas.getJSONObject(i);
+            JSONObject mainTable = data.getJSONObject("mainTable");
+            //判断是否存在过
+            //主键    id
+            String oaId = mainTable.getString("id");
+            if(SyncOAUtil.checkIsExist(oaId))
+                continue;
+            String khpf = mainTable.getString("khpf");
+            if("已自评".equals(khpf))
+                continue;
+            //如果
+            //员工工号 yggh
+            String personNumber = mainTable.getString("yggh");
+            HRBaseServiceHelper personHelper = new HRBaseServiceHelper(PERSON_ENTITY);
+            DynamicObject[] personDyn = personHelper.query(new QFilter[]{SyncOAUtil.getPersonFilter(personNumber)});
+            if(personDyn.length == 0){
+                log.info("未找到对应的员工:{}", personNumber);
+                continue;
+            }
+            //考核方式 pgzq 月度/季度;考核年月 zq X月/第X季度
+            String typeStr = mainTable.getString("pgzq");
+            String type = "";
+            if(typeStr.equals("月度")) {
+                type = "2";
+            }else if (typeStr.equals("季度")) {
+                type = "1";
+            }
+            String year = mainTable.getString("nf");
+            String value = mainTable.getString("zq");
+            Date bizDate = SyncOAUtil.handleDate(year, type, value);
+            //考核分数 khpf
+            BigDecimal score = new BigDecimal(khpf);
+            //备注    ?
+            dyn.set("person", personDyn[0]);
+            dyn.set("nckd_bizdate", bizDate);
+            dyn.set("nckd_examinetype", type);
+            dyn.set("nckd_score", score);
+            dyn.set("nckd_oaid", oaId);
+            dynList.add(dyn);
+        }
+        DynamicObject[] dynCols = dynList.stream().toArray(DynamicObject[]::new);
+
+        HisVersionParamBo hisVersionParamBo = new HisVersionParamBo();
+        hisVersionParamBo.setOperateType(EnumHisOperateType.NO_TIME_SAVE_VERSION.getType());
+        hisVersionParamBo.setEntityNumber(PERFORMANCE_ENTITY);
+        hisVersionParamBo.setHisDyns(dynCols);
+        HisModelController hisModelController = HisModelController.getInstance();
+        HisResponse<VersionChangeRespData> hisResponse = hisModelController.noLineTimeHisVersionChange(hisVersionParamBo);
+
+        log.info("1");
+    }
+
+    public static String getPerformanceBody(String operator, int pageNo, int pageSize)
+    {
+        // 构建 requestHead 对象
+        JSONObject requestHead = new JSONObject();
+        requestHead.put("mainBodyId", "JY");
+
+        // 构建 pageInfo 对象
+        JSONObject pageInfo = new JSONObject();
+        pageInfo.put("pageNo", pageNo);
+        pageInfo.put("pageSize", pageSize);
+
+        // 构建 header 对象
+        JSONObject header = new JSONObject();
+        header.put("operator", operator);
+
+        // 构建 datajson 对象
+        JSONObject datajsonParent = new JSONObject();
+        JSONObject datajson = new JSONObject();
+        datajson.put("mainTable", new JSONObject()); // mainTable 是一个空对象
+        datajson.put("pageInfo", pageInfo);
+        datajson.put("header", header);
+        datajsonParent.put("datajson", datajson);
+
+        // 构建 requestData 数组
+        JSONArray requestData = new JSONArray();
+        requestData.add(datajsonParent);
+
+        // 构建最终的根 JSON 对象
+        JSONObject rootJson = new JSONObject();
+        rootJson.put("requestHead", requestHead);
+        rootJson.put("requestData", requestData);
+
+        return rootJson.toString();
+    }
+
+    public static String getBody(){
+        JSONObject requestHead = new JSONObject();
+        requestHead.put("mainBodyId", "JY");
+
+        JSONObject rootJson = new JSONObject();
+        rootJson.put("requestHead", requestHead);
+        return rootJson.toString();
+    }
+
+
+
+}

+ 84 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/task/util/SyncOAUtil.java

@@ -0,0 +1,84 @@
+package nckd.jimin.jyyy.hr.task.util;
+
+import kd.bos.exception.KDBizException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hrmp.hrpi.business.infrastructure.utils.QFilterUtil;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import static nckd.jimin.jyyy.hr.task.util.SyncOAHelper.PERFORMANCE_ENTITY;
+
+public class SyncOAUtil {
+
+    private static final Log log = LogFactory.getLog(SyncOAUtil.class);
+    private static Map monthMap = new HashMap();
+    private static Map seasonMap = new HashMap();
+    static {
+        monthMap.put("1月","-01-01");
+        monthMap.put("2月","-02-01");
+        monthMap.put("3月","-03-01");
+        monthMap.put("4月","-04-01");
+        monthMap.put("5月","-05-01");
+        monthMap.put("6月","-06-01");
+        monthMap.put("7月","-07-01");
+        monthMap.put("8月","-08-01");
+        monthMap.put("9月","-09-01");
+        monthMap.put("10月","-10-01");
+        monthMap.put("11月","-11-01");
+        monthMap.put("12月","-12-01");
+        seasonMap.put("第一季度","-03-01");
+        seasonMap.put("第二季度","-06-01");
+        seasonMap.put("第三季度","-09-01");
+        seasonMap.put("第四季度","-12-01");
+    }
+
+    public static QFilter getPersonFilter(String personNumber) {
+        QFilter filter = QFilterUtil.getCurrentQf();
+        filter.and("number", QCP.equals, personNumber);
+        return filter;
+    }
+
+    /**
+     * 处理日期,OA返回参数:
+     * 季度情况下:返回值为第一季度,第二季度,转换成所属季度的最后一个月的第一天
+     * 月度情况下:返回值为1月,2月,转换成月份第一天
+     * @param year
+     * @param type
+     * @param value
+     * @return
+     */
+    public static Date handleDate(String year, String type, String value) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            //月度
+            if (type.equals("2")) {
+                String dateStr = year + monthMap.get(value);
+                return sdf.parse(dateStr);
+            }
+            //季度
+            else if (type.equals("1")) {
+                String dateStr = year + seasonMap.get(value);
+                return sdf.parse(dateStr);
+            }
+        } catch (ParseException e) {
+            log.info("转换日期出错-year : {}, type : {}, value : {}", year, type, value);
+            throw new KDBizException("转换日期出错:" + e.getMessage());
+        }
+        return new Date();
+    }
+
+    public static boolean checkIsExist (String oaId) {
+        HRBaseServiceHelper helper = HRBaseServiceHelper.create(PERFORMANCE_ENTITY);
+        QFilter filter = new QFilter("nckd_oaid", QCP.equals, oaId);
+        return helper.isExists(filter);
+    }
+
+}

+ 60 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/test/PicTestPlugin.java

@@ -0,0 +1,60 @@
+package nckd.jimin.jyyy.hr.test;
+
+import com.alibaba.fastjson.JSONArray;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.sdk.plugin.Plugin;
+import kd.sdk.swc.hcdm.common.stdtab.ContrastPropResult;
+import kd.sdk.swc.hcdm.common.stdtab.StdMatchParamWithDepEmp;
+import kd.sdk.swc.hcdm.service.spi.SalaryStdQueryService;
+import nckd.jimin.jyyy.hr.wtc.wtis.util.SyncPunchCardHelper;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 单据操作插件
+ */
+public class PicTestPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+        DynamicObject[] bills = e.getDataEntities();
+        List paramList = new ArrayList<>();
+        StdMatchParamWithDepEmp param = new StdMatchParamWithDepEmp();
+        param.setStdScmId(2193652343088628736L);
+        param.setSalayStructureId(2193582497986514944L);
+        param.setStandardItemId(2193580151457975296L);
+        param.setUnionId("123");
+        List<Long> list = new ArrayList<Long>();
+        list.add(2188564502843231232L);
+        Map map = new HashMap();
+        map.put(1050L,list);
+        param.setPersonPropValue(map);
+        paramList.add(param);
+        List a = SalaryStdQueryService.get().batchMatchStdTableWithDepEmp(paramList);
+
+        System.out.println(a);
+
+//        for (DynamicObject bill : bills) {
+//            String fileName = bill.getString("nckd_filename");
+//            String path = FileServiceFactory.getAttachmentFileService().getFileServiceExt().getRealPath(fileName);
+//            System.out.println("--" + path);
+//            DynamicObjectCollection cols = bill.getDynamicObjectCollection("123");
+//            cols.getDeleteRows();
+//
+//            DynamicObject[] needUpdateBills = new DynamicObject[0];
+//            OperationResult a = OperationServiceHelper.executeOperate("submit", "cas_recbill", needUpdateBills, OperateOption.create());
+//        }
+    }
+}