2 Revize 7605a8bf9d ... 7b9f39f88f

Autor SHA1 Zpráva Datum
  Tzz 7b9f39f88f Merge branch 'master' of http://111.75.220.136:10030/Tzz/jxcl před 4 dny
  Tzz 1c35fa7b49 feat:hr薪资插件、采购申请单校验器 před 4 dny

+ 229 - 0
nckd-hr/src/main/java/nckd/hr/swc/form/CalPayRollPayListPlugin.java

@@ -0,0 +1,229 @@
+package nckd.hr.swc.form;
+
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityType;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.BillList;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import kd.bos.servicehelper.QueryServiceHelper;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Module           :薪酬福利云-薪酬核算-薪酬核算任务
+ * Description      :生成发放明细-薪酬费用表
+ *
+ * @author guozhiwei
+ * @date  2024/10/30 14:21
+ * 标识 nckd_hsas_calpayrollt_ext
+ */
+
+
+
+public class CalPayRollPayListPlugin extends AbstractListPlugin {
+
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        //获取列表选中数据
+        BillList billlistap = this.getView().getControl("billlistap");
+        ListSelectedRowCollection selectedRows = billlistap.getSelectedRows();
+        EntityType entityType = billlistap.getEntityType();
+        //获取选中行pkid
+        Object[] primaryKeyValues = selectedRows.getPrimaryKeyValues();
+        //获取完整数据
+        DynamicObject[] regBillObjs = BusinessDataServiceHelper.load(primaryKeyValues, entityType);
+        FormOperate formOperate = (FormOperate) args.getSource();
+        //  先测试 ,后续改回来
+        if (StringUtils.equals("createpay", formOperate.getOperateKey())) {
+            createPayDetail(regBillObjs);
+        }
+    }
+
+    private void createPayDetail(DynamicObject[] regBillObjs){
+
+        List<Long> billIdList = new ArrayList();
+        for (int i = 0; i < regBillObjs.length; i++) {
+            billIdList.add(regBillObjs[i].getLong("id"));
+        }
+        // 薪酬费用表
+        QFilter qFilter = new QFilter("nckd_hsas_calpayrollt.id", QCP.in, billIdList);
+        DynamicObject[] load = BusinessDataServiceHelper.load("nckd_salary_expenses", "id,org,nckd_currency,nckd_tasktype,billstatus,nckd_payrolldate,nckd_calcount,nckd_payrollscene,billno,nckd_hsas_calpayrollt,nckd_hsas_calpayrollt.number,entryentity,entryentity.nckd_person,entryentity.nckd_hsbs_salaryitem,entryentity.nckd_company,entryentity.nckd_department,entryentity.nckd_position,entryentity.nckd_projectname,entryentity.nckd_role,entryentity.nckd_amount", new QFilter[]{qFilter});
+        Map<Object, DynamicObject> map = null;
+        if(ObjectUtils.isNotEmpty(load)){
+            // map = key-核算任务编码 、 value-薪资费用表
+             map = Arrays.stream(load)
+                            .collect(Collectors.toMap(
+                                    detail -> detail.get("nckd_hsas_calpayrollt.number"),
+                                    detail -> detail,
+                                    (existing, replacement) -> existing
+                            ));
+        }
+        // 查询相关核算名单,核算名单再去关联核算列表
+        QFilter qFilter1 = new QFilter("caltask.id", QCP.in, billIdList);
+        DynamicObject[] hsasCalpeople = BusinessDataServiceHelper.load("hsas_calperson", "id,caltask.id,caltask.number,nckd_role,nckd_projectname,caltask,personhrv,empposorgrelhrv", new QFilter[]{qFilter1});
+        // map =  key-核算名单id 、 value-核算名单
+        Map<Object, DynamicObject> collect = Arrays.stream(hsasCalpeople)
+                .collect(Collectors.toMap(
+                        detail -> detail.get("id"),
+                        detail -> detail,
+                        (existing, replacement) -> existing
+                ));
+
+        // 核算列表数据
+        DynamicObject[] hsasCaltables = BusinessDataServiceHelper.load("hsas_caltable", "id,caltask.id,calpersonid,caltask.number,caltask,hsas_caltableentry.salaryitem,hsas_caltableentry.salaryitem.id,hsas_caltableentry.calamountvalue", new QFilter[]{qFilter1});
+        if(ObjectUtils.isNotEmpty(hsasCaltables)){
+            // 核算列表数据
+            List<DynamicObject> salaryLeasePayList = Arrays.asList(hsasCaltables);
+
+            //  map= key-核算任务编码 、 value-核算列表数组
+            Map<String, List<DynamicObject>> resultMap = salaryLeasePayList.stream()
+                    .collect(Collectors.groupingBy(obj -> obj.getString("caltask.number")));
+            StringBuilder errorMsg = new StringBuilder();
+
+            //遍历核算任务
+            for (DynamicObject regBillObj : regBillObjs) {
+                // 获取薪资核算任务是否是审批通过 :4
+                if(ObjectUtils.equals(regBillObj.get("taskstatus"), "4")){
+                    // 使用编码去查询 薪酬费用表
+                    String number = regBillObj.getString("number");
+                    // 核算列表
+                    List<DynamicObject> dynamicObjects = resultMap.get(number);
+                    if(ObjectUtils.isNotEmpty(dynamicObjects)){
+                        // 获取核算列表:hsbs_salaryitem数据
+                        DynamicObject salaryExpenses = null;
+                        if(ObjectUtils.isEmpty(map) || ObjectUtils.isEmpty(map.get(number))){
+                            // 不存在薪资费用表数据
+                            salaryExpenses = BusinessDataServiceHelper.newDynamicObject("nckd_salary_expenses");
+                            SaveServiceHelper.save(new DynamicObject[]{salaryExpenses});
+                        }else{
+                            //存在薪资费用表数据
+                            salaryExpenses = map.get(number);
+                            if(!validator(salaryExpenses)){
+                                // 单据已生成凭证
+                                errorMsg.append(salaryExpenses.getString("billno")+",");
+                                continue;
+                            }
+                            DynamicObjectCollection entryentity = salaryExpenses.getDynamicObjectCollection("entryentity");
+                            entryentity.clear();
+                        }
+                        salaryExpenses.set("nckd_hsas_calpayrollt",regBillObj);
+                        salaryExpenses.set("org",regBillObj.get("org"));
+                        salaryExpenses.set("nckd_payrolldate",regBillObj.get("payrolldate"));
+                        salaryExpenses.set("nckd_calcount",regBillObj.get("calcount"));
+                        salaryExpenses.set("nckd_payrollscene",regBillObj.get("payrollscene"));
+                        salaryExpenses.set("billno",number);
+                        salaryExpenses.set("nckd_tasktype",regBillObj.get("tasktype"));
+                        salaryExpenses.set("billstatus","C");
+                        salaryExpenses.set("nckd_currency",regBillObj.getDynamicObject("payrollgroupv").get("currency"));
+                        DynamicObjectCollection entryentity = salaryExpenses.getDynamicObjectCollection("entryentity");
+                        entryentity.clear();
+                        // 核算列表
+                        dynamicObjects.forEach(e -> {
+                            // 获取核算名单信息
+                            DynamicObject hsasCalperson = collect.get(e.get("calpersonid"));
+                            //  获取薪酬项目分录
+                            DynamicObjectCollection hsasCaltableentry = e.getDynamicObjectCollection("hsas_caltableentry");
+                            for (DynamicObject dynamicObject : hsasCaltableentry) {
+                                Object o = dynamicObject.get("salaryitem.iscostallot");
+                                BigDecimal calamountvalue = dynamicObject.getBigDecimal("calamountvalue");
+
+                                if(ObjectUtils.equals(o,true) && calamountvalue.compareTo(BigDecimal.ZERO)>0){
+                                    DynamicObject dynamicObject1 = entryentity.addNew();
+                                    //  薪酬列表数据构建分录数据
+                                    initEntry(hsasCalperson,dynamicObject,dynamicObject1);
+                                }
+                            }
+                        });
+                        SaveServiceHelper.save(new DynamicObject[]{salaryExpenses});
+                    }
+
+                }
+
+            }
+            if(ObjectUtils.isNotEmpty(errorMsg)){
+                errorMsg.append("单据已生成凭证。");
+                this.getView().showTipNotification(errorMsg.toString());
+            }
+        }
+    }
+
+    // 获取分录数据
+    private void initEntry(DynamicObject hsasCalperson,DynamicObject caltableentry,DynamicObject entryentity){
+        // 核算名单 hsasCalperson,薪资列表:薪酬项目分录 caltableentry,需要构建数据 entryentity
+
+        DynamicObject personhrv = hsasCalperson.getDynamicObject("personhrv");
+        DynamicObject empposorgrelhrv = hsasCalperson.getDynamicObject("empposorgrelhrv");
+
+        //公司
+        DynamicObject company = empposorgrelhrv.getDynamicObject("company");
+
+        // 岗位
+        DynamicObject position = empposorgrelhrv.getDynamicObject("position");
+
+        DynamicObject homsPosition = BusinessDataServiceHelper.loadSingle(position.getPkValue(), "homs_position");
+        // 部门
+        Object adminorg  = homsPosition.get("adminorg");
+
+        entryentity.set("nckd_person",personhrv);
+        entryentity.set("nckd_company",company);
+        entryentity.set("nckd_department",adminorg);
+        entryentity.set("nckd_position",position);
+        entryentity.set("nckd_projectname",hsasCalperson.get("nckd_projectname"));
+        entryentity.set("nckd_role",hsasCalperson.get("nckd_role"));
+        entryentity.set("nckd_amount",caltableentry.get("calamountvalue"));
+        entryentity.set("nckd_hsbs_salaryitem",caltableentry.get("salaryitem"));
+
+    }
+
+
+    private void deletePayDetail(DynamicObject[] regBillObjs){
+        List<Long> billIdList = new ArrayList();
+        for (int i = 0; i < regBillObjs.length; i++) {
+
+
+        }
+
+        // 删除 薪酬费用表
+//        DynamicObject[] bosPositions = BusinessDataServiceHelper.load("nckd_salary_expenses", "id,", new QFilter[]{new QFilter("nckd_hsas_calpayrollt.id", QCP.in, billIdList)});
+//        for (DynamicObject bosPosition : bosPositions) {
+//            DeleteServiceHelper.delete(bosPosition.getDataEntityType(), new Object[]{bosPosition.getPkValue()});
+//        }
+    }
+
+    // 校验单据是否生成凭证
+    private boolean validator(DynamicObject dataEntity){
+
+        List<QFilter> voucherfilterList = new ArrayList();
+        QFilter rentSettleFilter = new QFilter("sourcebillid", QCP.equals, dataEntity.get("id"));
+        voucherfilterList.add(rentSettleFilter);
+        QFilter billTypeFilter = new QFilter("billType", "=", "nckd_salary_expenses");
+        voucherfilterList.add(billTypeFilter);
+        boolean isGenVoucher = QueryServiceHelper.exists("ai_daptracker", voucherfilterList.toArray(new QFilter[0]));
+        if (isGenVoucher) {
+            return false;
+//            this.mes(dataEntity, ResManager.loadKDString("单据对应的摊销与计息记录已生成凭证,不能反计息。", "FaRentUnSettleValidator_2", "fi-fa-opplugin", new Object[0]));
+        }
+
+        return true;
+    }
+
+
+}

+ 257 - 0
nckd-hr/src/main/java/nckd/hr/swc/form/HsAsCalPersonDetailListPlugin.java

@@ -0,0 +1,257 @@
+package nckd.hr.swc.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityType;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.IFormView;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.BillList;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *
+ *  hr-核算名单列表插件
+ *  表单标识:nckd_hsas_calperson_ext 生成付款明细执行
+ *  author:guozhiwei
+ *  date:2024-11-6
+ *
+ */
+public class HsAsCalPersonDetailListPlugin extends AbstractListPlugin {
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate formOperate = (FormOperate) args.getSource();
+        String key = formOperate.getOperateKey();
+        if("createpay".equals(key)){ // 生成发放明细
+            //获取列表选中数据
+            BillList billlistap = this.getView().getControl("billlistap");
+            ListSelectedRowCollection selectedRows = billlistap.getSelectedRows();
+            EntityType entityType = billlistap.getEntityType();
+            //获取选中行pkid
+            Object[] primaryKeyValues = selectedRows.getPrimaryKeyValues();
+            //获取完整数据
+            DynamicObject[] regBillObjs = BusinessDataServiceHelper.load(primaryKeyValues, entityType);
+            // 获取薪资核算任务数据,caltask 核算任务(薪资核算任务(hsas_calpayrolltask))
+            List<Object> billIdList = Arrays.stream(regBillObjs)
+                    .map(obj -> obj.get("caltask.id"))
+                    .collect(Collectors.toList());
+            QFilter qFilter = new QFilter("id", QCP.in, billIdList);
+            DynamicObject[] hsasCaltasks = BusinessDataServiceHelper.load("hsas_calpayrolltask", "id,org,taskstatus,payrolldate,calcount,payrollscene,tasktype,payrollgroupv,number,name,", qFilter.toArray());
+            createPayDetail(hsasCaltasks);
+        }
+
+    }
+
+    /**
+     * 创建‘生成发放明细’
+     * @param regBillObjs 薪资核算任务对象集合
+     */
+    private void createPayDetail(DynamicObject[] regBillObjs){
+        // 薪资核算任务id集合
+        List<Long> billIdList = new ArrayList();
+        for (int i = 0; i < regBillObjs.length; i++) {
+            billIdList.add(regBillObjs[i].getLong("id"));
+        }
+
+        // 薪酬费用表 nckd_salary_expenses, 薪酬核算任务id nckd_hsas_calpayrollt.id
+        QFilter qFilter = new QFilter("nckd_hsas_calpayrollt.id", QCP.in, billIdList);
+        DynamicObject[] load = BusinessDataServiceHelper.load("nckd_salary_expenses", "id,org,nckd_tasktype,nckd_currency,billstatus,nckd_payrolldate,nckd_calcount,nckd_payrollscene,billno,nckd_hsas_calpayrollt,nckd_hsas_calpayrollt.number,entryentity,entryentity.nckd_person,entryentity.nckd_hsbs_salaryitem,entryentity.nckd_company,entryentity.nckd_department,entryentity.nckd_position,entryentity.nckd_projectname,entryentity.nckd_role,entryentity.nckd_amount", new QFilter[]{qFilter});
+        // key:薪酬核算任务编码,value:薪酬费用表对象
+        Map<Object, DynamicObject> map = null;
+        if(ObjectUtils.isNotEmpty(load)){
+            map = Arrays.stream(load)
+                    .collect(Collectors.toMap(
+                            detail -> detail.get("nckd_hsas_calpayrollt.number"),
+                            detail -> detail,
+                            (existing, replacement) -> existing
+                    ));
+        }
+        // 查询相关 核算名单 hsas_calperson,核算名单再去关联核算列表
+        QFilter qFilter1 = new QFilter("caltask.id", QCP.in, billIdList);
+        // adminorg 挂靠行政组织
+        DynamicObject[] hsasCalpeople = BusinessDataServiceHelper.load("hsas_calperson", "id,caltask.id,caltask.number,nckd_role,nckd_projectname,caltask,personhrv,empposorgrelhrv,adminorg", new QFilter[]{qFilter1});
+        // key=核算名单id,value=核算名单对象
+        Map<Object, DynamicObject> collect = Arrays.stream(hsasCalpeople)
+                .collect(Collectors.toMap(
+                        detail -> detail.get("id"),
+                        detail -> detail,
+                        (existing, replacement) -> existing
+                ));
+
+        // 核算列表数据
+        // 项目默认分摊:暂时无数据
+        QFilter qFilter2 = new QFilter("hsas_caltableentry.salaryitem.iscostallot", QCP.equals, true); // hsas_caltableentry 核算列表-单据体,salaryitem 薪酬项目,默认参与费用分摊(iscostallot)
+        // 核算列表 hsas_caltable,hsas_caltableentry.calamountvalue 核算金额数据,hsas_caltableentry.textvalue 文本项目数据
+        DynamicObject[] hsasCaltables = BusinessDataServiceHelper.load("hsas_caltable", "id,caltask.id,calpersonid,caltask.number,caltask,hsas_caltableentry.salaryitem,hsas_caltableentry.salaryitem.id,hsas_caltableentry.calamountvalue,hsas_caltableentry.textvalue", new QFilter[]{qFilter1,qFilter2});
+        if(ObjectUtils.isNotEmpty(hsasCaltables)){
+            // 将 DynamicObject 数组转换为 List
+            List<DynamicObject> salaryLeasePayList = Arrays.asList(hsasCaltables);
+
+            // key=核算任务编码,value=每个人的核算列表集合
+            Map<String, List<DynamicObject>> resultMap = salaryLeasePayList.stream()
+                    .collect(Collectors.groupingBy(obj -> obj.getString("caltask.number")));
+            StringBuilder errorMsg = new StringBuilder();
+
+            for (DynamicObject regBillObj : regBillObjs) {
+                // 获取薪资核算任务是否是审批通过 :4
+                if(ObjectUtils.equals(regBillObj.get("taskstatus"), "4")){
+                    // 使用编码去查询 薪酬费用表
+                    String number = regBillObj.getString("number"); // 薪资核算任务
+                    // 核算列表
+                    List<DynamicObject> dynamicObjects = resultMap.get(number);
+                    if(ObjectUtils.isNotEmpty(dynamicObjects)){
+                        // 获取核算列表:hsbs_salaryitem数据
+                        DynamicObject salaryExpenses = null; // 薪酬费用表
+                        if(ObjectUtils.isEmpty(map) || ObjectUtils.isEmpty(map.get(number))){ // map=key:薪酬核算任务编码,value:薪酬费用表对象
+                            // 不存在薪资费用表数据,薪酬费用表 nckd_salary_expenses 二开单据
+                            salaryExpenses = BusinessDataServiceHelper.newDynamicObject("nckd_salary_expenses");
+                            SaveServiceHelper.save(new DynamicObject[]{salaryExpenses});
+                        }else{
+                            // 存在薪资费用表数据
+                            salaryExpenses = map.get(number);
+
+                            if(!validator(salaryExpenses)){
+                                // 单据已生成凭证
+                                errorMsg.append(salaryExpenses.getString("billno")+",");
+                                continue;
+                            }
+                            DynamicObjectCollection entryentity = salaryExpenses.getDynamicObjectCollection("entryentity"); // 薪酬费用表-单据体
+                            entryentity.clear(); // 清空分录数据
+                        }
+                        //赋值及保存单据
+                        saveObj(regBillObj, salaryExpenses, number, dynamicObjects, collect);
+                    }
+                }
+            }
+            if(ObjectUtils.isNotEmpty(errorMsg)){
+                errorMsg.append("单据已生成凭证。");
+                this.getView().showTipNotification(errorMsg.toString());
+            }
+        }
+    }
+
+    private void saveObj(DynamicObject regBillObj, DynamicObject salaryExpenses, String number, List<DynamicObject> dynamicObjects, Map<Object, DynamicObject> collect) {
+        // 头表:薪酬核算任务
+        salaryExpenses.set("nckd_hsas_calpayrollt", regBillObj);
+        // 算发薪管理组织
+        salaryExpenses.set("org", regBillObj.get("org"));
+        // 薪资所属年月
+        salaryExpenses.set("nckd_payrolldate", regBillObj.get("payrolldate"));
+        // 核算次数
+        salaryExpenses.set("nckd_calcount", regBillObj.get("calcount"));
+        // 薪资核算场景
+        salaryExpenses.set("nckd_payrollscene", regBillObj.get("payrollscene"));
+        // 单据编号
+        salaryExpenses.set("billno", number);
+        // 核算类型
+        salaryExpenses.set("nckd_tasktype", regBillObj.get("tasktype"));
+        // 单据状态
+        salaryExpenses.set("billstatus","C");
+        DynamicObjectCollection entryentity = salaryExpenses.getDynamicObjectCollection("entryentity");
+        entryentity.clear();
+        // 核算列表 dynamicObjects
+        dynamicObjects.forEach(e -> {
+            // 获取核算名单信息; collect:key=核算名单id,value=核算名单对象; calpersonid 核算列表.核算人员ID
+            DynamicObject hsasCalperson = collect.get(e.get("calpersonid")); // 通过核算列表的核算人员ID查询出 核算名单对象!!!
+
+            //  获取薪酬项目分录;核算列表-分录 薪酬项目信息 hsas_caltableentry
+            DynamicObjectCollection hsasCaltableentry = e.getDynamicObjectCollection("hsas_caltableentry");
+            // 先查询人员类别
+            String persontype = "";
+            for (DynamicObject dynamicObject : hsasCaltableentry) {
+                String xcprojectname = dynamicObject.getString("salaryitem.name");
+                if ("人员类别".equals(xcprojectname)) {
+                    persontype = dynamicObject.getString("textvalue");
+                    break;
+                }
+            }
+
+            for (DynamicObject dynamicObject : hsasCaltableentry) {
+                // salaryitem 薪酬项目,iscostallot 默认参与费用分摊
+                Object o = dynamicObject.get("salaryitem.iscostallot");
+                // 核算金额数据
+                BigDecimal calamountvalue = dynamicObject.getBigDecimal("calamountvalue");
+                if(ObjectUtils.equals(o,true)&& (calamountvalue != null) && calamountvalue.compareTo(BigDecimal.ZERO)!=0){
+                    DynamicObject dynamicObject1 = entryentity.addNew();
+                    // 薪酬列表数据构建分录数据:核算名单对象,核算列表-分录 薪酬项目信息,薪酬费用表-单据体 新增一条记录,人员类别
+                    initEntry(hsasCalperson,dynamicObject,persontype,dynamicObject1);
+                }
+            }
+        });
+        // 薪酬费用表保存
+        SaveServiceHelper.save(new DynamicObject[]{salaryExpenses});
+    }
+
+    // 获取分录数据
+    private void initEntry(DynamicObject hsasCalperson,DynamicObject caltableentry,String persontype,DynamicObject entryentity){
+        // 核算名单对象 hsasCalperson, 薪资列表 核算列表-分录 薪酬项目信息 caltableentry,人员类别 persontype, 需要构建数据 entryentity
+        DynamicObject personhrv = hsasCalperson.getDynamicObject("personhrv"); // 自然人版本:薪资人员信息(hsas_personhr)
+        DynamicObject empposorgrelhrv = hsasCalperson.getDynamicObject("empposorgrelhrv"); // 任职经历版本,计薪人员任职经历(hsas_empposorgrelhr)
+        //公司
+        DynamicObject company = empposorgrelhrv.getDynamicObject("company");
+        // 岗位
+        DynamicObject position = empposorgrelhrv.getDynamicObject("position"); // 计薪人员任职经历.岗位 (HR岗位(hbpm_positionhr))
+
+        // 岗位信息维护 homs_position
+        DynamicObject homsPosition = BusinessDataServiceHelper.loadSingle(position.getPkValue(), "homs_position");
+        // 部门,行政组织 adminorg
+        Object adminorg  = homsPosition.get("adminorg");
+        // 分录,工号,薪资人员信息(hsas_personhr)
+        entryentity.set("nckd_person",personhrv);
+        // 公司,HR行政组织(haos_adminorghr)
+        entryentity.set("nckd_company",company);
+        // 部门,HR行政组织(haos_adminorghr)
+        entryentity.set("nckd_department",adminorg);
+        // 岗位,HR岗位(hbpm_positionhr)
+        entryentity.set("nckd_position",position);
+        // 项目名称,项目(bd_project),核算名单对象 hsasCalperson
+        entryentity.set("nckd_projectname",hsasCalperson.get("nckd_projectname"));
+        // 任职角色,多语言文本
+        entryentity.set("nckd_role",hsasCalperson.get("nckd_role"));
+        // 金额,
+        entryentity.set("nckd_amount",caltableentry.get("calamountvalue"));
+        // 薪酬项目
+        entryentity.set("nckd_hsbs_salaryitem",caltableentry.get("salaryitem"));
+
+    }
+
+    // 校验单据是否生成凭证
+    private boolean validator(DynamicObject dataEntity){
+
+        List<QFilter> voucherfilterList = new ArrayList();
+        QFilter rentSettleFilter = new QFilter("sourcebillid", QCP.equals, dataEntity.get("id"));
+        voucherfilterList.add(rentSettleFilter);
+        QFilter billTypeFilter = new QFilter("billType", QCP.equals, "nckd_salary_expenses");
+        voucherfilterList.add(billTypeFilter);
+        boolean isGenVoucher = QueryServiceHelper.exists("ai_daptracker", voucherfilterList.toArray(new QFilter[0]));
+        if (isGenVoucher) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        this.getView().setVisible(Boolean.TRUE, "cal");
+        IFormView view = this.getView();
+        String caption = view.getFormShowParameter().getCaption();
+        if ("薪资明细结果".equals(caption)) {
+            // 隐藏“薪资明细结果”页面的“生成发放明细”按钮
+            this.getView().setVisible(Boolean.FALSE, "createpay");
+        }
+    }
+
+}

+ 67 - 0
nckd-hr/src/main/java/nckd/hr/swc/form/HsAsCalPersonListPlugin.java

@@ -0,0 +1,67 @@
+package nckd.hr.swc.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ *  hr-核算名单列表插件
+ *  表单标识:nckd_hsas_calperson_ext
+ *  author:xiaoxiaopeng
+ *  date:2024-10-17
+ *
+ */
+public class HsAsCalPersonListPlugin extends AbstractListPlugin {
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+        String key = args.getOperateKey();
+        if ("createapprove".equals(key)) { // 生成审批单
+            boolean success = args.getOperationResult().isSuccess();
+            if (success) {
+                FormOperate source =  (FormOperate)args.getSource();
+                ListSelectedRowCollection selectedRows = source.getListSelectedData();
+                for (ListSelectedRow row : selectedRows) {
+                    //核算名单
+                    DynamicObject hsasCalperson = BusinessDataServiceHelper.loadSingle(row.getPrimaryKeyValue(), "hsas_calperson");
+                    //核算任务
+                    DynamicObject caltask = hsasCalperson.getDynamicObject("caltask");
+                    //薪资所属年月
+                    Date payrolldate = caltask.getDate("payrolldate");
+                    //核算次数
+                    BigDecimal calcount = caltask.getBigDecimal("calcount");
+                    //核算场景
+                    DynamicObject payrollscene = caltask.getDynamicObject("payrollscene");
+                    QFilter qFilter = new QFilter("calentryentity.calpersonid", QCP.equals, row.getPrimaryKeyValue());
+                    List<String> list = new ArrayList<>();
+                    list.add("E");
+                    list.add("F");
+                    qFilter.and("billstatus",QCP.not_in,list);
+                    //查核算审批单
+                    DynamicObject hsasApprovebill = BusinessDataServiceHelper.loadSingle("hsas_approvebill", "id,nckd_payrolldate,nckd_calcount,nckd_payrollscene,calentryentity,calentryentity.calpersonid",
+                            new QFilter[]{qFilter});
+                    if (hsasApprovebill != null) {
+                        hsasApprovebill.set("nckd_payrolldate",payrolldate);
+                        hsasApprovebill.set("nckd_calcount",calcount);
+                        hsasApprovebill.set("nckd_payrollscene",payrollscene);
+                        SaveServiceHelper.update(hsasApprovebill);
+                    }
+                }
+            }
+        }
+    }
+}

+ 0 - 3
nckd-pur/src/main/java/nckd/pur/scp/plugin/form/PurApplyBillPlugin.java

@@ -30,9 +30,6 @@ public class PurApplyBillPlugin extends AbstractBillPlugIn implements BeforeF7Se
             if (jjcg || xgm || "1".equals(value)) {
                 QFilter mtQf = new QFilter("masterid.nckd_centralized",QCP.equals,true);
                 evt.getCustomQFilters().add(mtQf);
-            }else{
-                QFilter mtQf = new QFilter("masterid.nckd_centralized",QCP.equals,false);
-                evt.getCustomQFilters().add(mtQf);
             }
         }
     }

+ 25 - 0
nckd-pur/src/main/java/nckd/pur/scp/plugin/operate/PurApplyOpPlugin.java

@@ -0,0 +1,25 @@
+package nckd.pur.scp.plugin.operate;
+
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.sdk.plugin.Plugin;
+import nckd.pur.scp.plugin.operate.validator.PurApplyValidator;
+
+/**
+ * 单据操作插件
+ */
+public class PurApplyOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new PurApplyValidator());
+    }
+}

+ 42 - 0
nckd-pur/src/main/java/nckd/pur/scp/plugin/operate/validator/PurApplyValidator.java

@@ -0,0 +1,42 @@
+package nckd.pur.scp.plugin.operate.validator;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.scm.bid.common.constant.OperationConstant;
+
+/**
+ * 动态表单插件
+ */
+public class PurApplyValidator extends AbstractValidator  {
+
+    @Override
+    public void validate() {
+        String operateKey = this.getOperateKey();
+        ExtendedDataEntity[] dataEntities = this.getDataEntities();
+        for (ExtendedDataEntity dataEntity : dataEntities) {
+            if (operateKey.equals(OperationConstant.SUBMIT)) {
+                //
+                boolean isJzcg = false;
+                boolean isFjzcg = false;
+                DynamicObject data = dataEntity.getDataEntity();
+                //校验分录中,是否包含集采、非集采两种类型物料
+                DynamicObjectCollection entries = data.getDynamicObjectCollection("billentry");
+                for(DynamicObject entry : entries){
+                    //采购物料
+                    DynamicObject material = entry.getDynamicObject("material");
+                    boolean isCenterGoods = material.getDynamicObject("masterid").getBoolean("nckd_centralized");
+                    if(isCenterGoods){
+                        isJzcg = true;
+                    }else{
+                        isFjzcg = true;
+                    }
+                }
+                if(isJzcg && isFjzcg){
+                    this.addErrorMessage(dataEntity,"分录中,不能同时包含集采和非集采两种类型物料。");
+                }
+            }
+        }
+    }
+}