|
|
@@ -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");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|