Explorar o código

<feat>:新增
1、出差申请单同步HR出差单

wanghaiwu hai 1 día
pai
achega
8881eae9ab

+ 389 - 0
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/plugin/operate/BusinessTravelOpPlugin.java

@@ -0,0 +1,389 @@
+package nckd.jimin.jyyy.fi.plugin.operate;
+
+
+import kd.bos.coderule.api.CodeRuleInfo;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
+import kd.bos.entity.operate.OperateOptionConst;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.MetadataServiceHelper;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
+import kd.bos.servicehelper.operation.DeleteServiceHelper;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.concurrent.TimeUnit;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Module           :工时假勤云-出差申请单操作插件
+ * Description      :出差申请单操作插件
+ *
+ * @author guozhiwei
+ * @date  2024-11-22 9:59
+ * nckd_er_tripreqbill_ext
+ *
+ *
+ */
+
+public class BusinessTravelOpPlugin extends AbstractOperationServicePlugIn {
+
+    private static Log logger = LogFactory.getLog(BusinessTravelOpPlugin.class);
+
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        // 提前加载表单里的字段
+        List<String> fieldKeys = e.getFieldKeys();
+        fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs args) {
+        super.beginOperationTransaction(args);
+
+    }
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs args) {
+        super.afterExecuteOperationTransaction(args);
+        String operationKey = args.getOperationKey();
+        DynamicObject[] regBillObjs = args.getDataEntities();
+        logger.info("开始执行操作:{},实体:{}",operationKey, regBillObjs);
+        switch (operationKey) {
+            case "audit":
+            case "triprevoke":
+            case "createotappaly":
+                // 审核, 数据同步写入到考勤-出差单据数据中 :开始、结束时间,默认出差申请中的全天申请
+//                OperationResult pushzhwl = OperationServiceHelper.executeOperate("createotappaly", "er_tripreqbill", regBillObjs, OperateOption.create());
+                for (DynamicObject regBillObj : regBillObjs) {
+                    regBillObj.set("nckd_createhr", 1);
+                }
+                SaveServiceHelper.save(regBillObjs);
+                this.createDynamicObject(regBillObjs,args.getOperationKey());
+                logger.info("生成为他人申请出差结果操作结束");
+                break;
+            case "invalidbtn":
+            case "tripchange":
+            case "unaudit":
+            case "deleteotappaly":
+                // 废弃
+//                OperationResult pushzhwl2 = OperationServiceHelper.executeOperate("deleteotappaly", "er_tripreqbill", regBillObjs, OperateOption.create());
+                for (DynamicObject regBillObj : regBillObjs) {
+                    regBillObj.set("nckd_createhr", 0);
+                }
+                SaveServiceHelper.save(regBillObjs);
+                this.deleteDynamicObject(regBillObjs,args.getOperationKey());
+                logger.info("删除为他人申请出差结果操作结束");
+                break;
+            default:
+                break;
+        }
+
+    }
+
+    private void changeDynamicObject(DynamicObject[] regBillObjs) {
+        ArrayList<Long> longs = new ArrayList<>();
+
+        for (DynamicObject regBillObj : regBillObjs) {
+            longs.add(regBillObj.getLong("id"));
+        }
+        QFilter qFilter = new QFilter("nckd_tripreqbillid", QCP.in, longs)
+                .and("billstatus", QCP.equals, "C");
+
+        DynamicObject[] load = BusinessDataServiceHelper.load("wtam_busitripbill", "id", qFilter.toArray());
+
+        // 执行废弃操作
+        for (DynamicObject dynamicObject : load) {
+            dynamicObject.set("billstatus", "E");
+        }
+        // 废弃
+        SaveServiceHelper.save(load);
+        // 调用作废操作
+//        DeleteServiceHelper.delete("wtam_busitripbill", new QFilter[]{qFilter});
+    }
+
+    private void deleteDynamicObject(DynamicObject[] regBillObjs,String key) {
+        ArrayList<Long> longs = new ArrayList<>();
+        ArrayList<String> billList = new ArrayList<>();
+        logger.info("开始执行删除为他人申请出差操作");
+        for (DynamicObject regBillObj : regBillObjs) {
+            longs.add(regBillObj.getLong("id"));
+            billList.add(regBillObj.getString("billno"));
+        }
+        DynamicObject travelLog = BusinessDataServiceHelper.newDynamicObject("nckd_travel_log");
+        travelLog.set("nckd_er_tripreqbill",key);
+        travelLog.set("name","出差申请单");
+        travelLog.set("number","er_tripreqbill");
+        travelLog.set("status","A");
+        travelLog.set("enable",1);
+        travelLog.set("nckd_billno",String.join(",", billList));
+        SaveServiceHelper.save(new DynamicObject[]{travelLog});
+
+        QFilter qFilter = new QFilter("nckd_tripreqbillid", QCP.in, longs);
+        // 调用作废操作
+        OperateOption auditOption = OperateOption.create();
+        auditOption.setVariableValue(OperateOptionConst.ISHASRIGHT, "true");//不验证权限
+        auditOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true)); // 不执行警告级别校验器
+        DeleteServiceHelper.delete("wtam_busitripbill", new QFilter[]{qFilter});
+
+    }
+
+    // 创建对他人申请单
+    public void createDynamicObject(DynamicObject[] regBillObjs,String key) {
+        ORM orm = ORM.create();
+        logger.info("开始执行创建为他人申请出差操作");
+        for (DynamicObject regBillObj : regBillObjs) {
+            // 获取行程信息
+            DynamicObjectCollection tripentry = regBillObj.getDynamicObjectCollection("tripentry");
+
+            for (DynamicObject dynamicObject : tripentry) {
+                // 日志信息
+                DynamicObject travelLog = BusinessDataServiceHelper.newDynamicObject("nckd_travel_log");
+                travelLog.set("nckd_er_tripreqbill",key);
+                travelLog.set("name","出差申请单");
+                travelLog.set("number","er_tripreqbill");
+                travelLog.set("status","A");
+                travelLog.set("enable",1);
+                travelLog.set("nckd_billno",regBillObj.getString("billno"));
+
+                List<String> nameList = new ArrayList<>();
+                List<String> numberList = new ArrayList<>();
+                // 获取出差人
+                DynamicObjectCollection travelers1 = dynamicObject.getDynamicObjectCollection("travelers");
+                for (DynamicObject object : travelers1) {
+                    DynamicObject user = object.getDynamicObject("fbasedataid");
+                    nameList.add(user.getString("name"));
+                    numberList.add(user.getString("number"));
+                }
+                travelLog.set("nckd_travels",String.join(",", nameList)); // 出差人
+                List<String> travelerno = new ArrayList<>();
+                // 获取工号,去查询考勤人员
+                QFilter qFilter2 = new QFilter("number", QCP.in, numberList);
+                QFilter qFilter1 = new QFilter("laborrelstatus.number", QCP.not_equals, "1080_S");// 排除离职
+                DynamicObject[] wtpAttendpeople = BusinessDataServiceHelper.load("wtp_attendperson", "id,name,number", new QFilter[]{qFilter1, qFilter2});
+                DynamicObject[] wtpAttfilebases = new DynamicObject[0];
+                if(wtpAttendpeople.length > 0){
+                    List<Long> idList = Arrays.stream(wtpAttendpeople)
+                            .map(order ->  order.getLong("id"))
+                            .collect(Collectors.toList());
+
+                    List<String> nameList2 = Arrays.stream(wtpAttendpeople)
+                            .map(order ->  order.getString("name"))
+                            .collect(Collectors.toList());
+
+                    travelerno = nameList.stream()
+                            .filter(name -> !nameList2.contains(name))
+                            .collect(Collectors.toList());
+
+
+                    // 查询考勤档案
+                    QFilter qFilter3 = new QFilter("attperson.id", QCP.in, idList);
+                    QFilter status = new QFilter("iscurrentversion", QCP.equals, "1")
+                            .and("status", QCP.equals, "C")
+                            .and("enable", QCP.equals, "1");
+
+                    wtpAttfilebases = BusinessDataServiceHelper.load("wtp_attfilebase", "id,name,number,attperson,org," +
+                            "affiliateadminorg,dependencytype,adminorg,textname,managingscope,agreedlocation,job," +
+                            "position,company,workplace,dependency,empgroup,hrperson,personnum,textname,usablestatus"
+                            , new QFilter[]{qFilter3, status});
+                    if(wtpAttfilebases.length > 0){
+                        Map<Long, DynamicObject> map2 =
+                                Arrays.stream(wtpAttfilebases)
+                                        .collect(Collectors.toMap(
+                                                detail -> detail.getLong("attperson.id"), // 获取 useorg.id 作为 key
+                                                detail -> detail, // 整个 DynamicObject 作为 value
+                                                (existing, replacement) -> existing // 保留前面的值
+                                        ));
+                        QFilter qFilter4 = new QFilter("attperson.id", QCP.in, idList);
+                        QFilter status2 = new QFilter("iscurrentversion", QCP.equals, "0")
+                                .and("status", QCP.equals, "C")
+                                .and("enable", QCP.equals, "1");
+                        DynamicObject[] load = BusinessDataServiceHelper.load("wtp_attfilebase", "id,name,number,attperson,org," +
+                                "affiliateadminorg,dependencytype,adminorg,textname,managingscope,agreedlocation,job," +
+                                "position,company,workplace,dependency,empgroup,hrperson,personnum,textname,usablestatus", new QFilter[]{qFilter4, status2}, "hisversion desc");
+                        Map<Long, DynamicObject> map3 =
+                                Arrays.stream(load)
+                                        .collect(Collectors.toMap(
+                                                detail -> detail.getLong("attperson.id"), // 获取 useorg.id 作为 key
+                                                detail -> detail, // 整个 DynamicObject 作为 value
+                                                (existing, replacement) -> existing // 保留前面的值
+                                        ));
+
+                        initDate(regBillObj,dynamicObject,wtpAttendpeople,map2,travelLog,travelerno,map3);
+                    }
+
+                }
+                if(wtpAttendpeople.length == 0 || wtpAttfilebases.length == 0){
+                    travelLog.set("nckd_travelsno",String.join(",", numberList));
+                    travelLog.set("nckd_returnparameter","未找到对应考勤人员及档案");
+                    SaveServiceHelper.save(new DynamicObject[]{travelLog});
+                }
+            }
+        }
+    }
+
+    private void initDate(DynamicObject dynamicObject, DynamicObject tripentry, DynamicObject[] travelers, Map<Long, DynamicObject> map, DynamicObject log, List<String> travelerno,Map<Long, DynamicObject> map3){
+        // 出差申请单id
+        long id = dynamicObject.getLong("id");
+        List<String> travelerList = new ArrayList<>();
+        List<String> travelerListNo = new ArrayList<>();
+        StringBuilder errstr = new StringBuilder();
+
+
+        DynamicObject bosUser = BusinessDataServiceHelper.loadSingle(RequestContext.get().getUserId(), "bos_user");
+//        DynamicObject bosUser = BusinessDataServiceHelper.loadSingle(2189228575587044352L, "bos_user");
+
+        Date startdate = tripentry.getDate("startdate");
+        Date enddate = tripentry.getDate("enddate");
+        // 计算合计申请时长
+        long diffInMillies = Math.abs(enddate.getTime() - startdate.getTime());
+        long diffInDays = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS) +1;
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        QFilter qFilter = new QFilter("number", QCP.equals, "1010_S");
+        DynamicObject object = BusinessDataServiceHelper.loadSingle("wtbd_traveltype", qFilter.toArray());
+        // 交通工具
+        QFilter qFilter2 = new QFilter("number", QCP.equals, "1040_S");
+        DynamicObject object2 = BusinessDataServiceHelper.loadSingle("wtbd_traveltool", qFilter2.toArray());
+
+        for (DynamicObject traveler : travelers) {
+            // 考情档案
+            DynamicObject wtpAttfilebase = map.get(traveler.getLong("id"));
+            if(ObjectUtils.isEmpty(wtpAttfilebase)){
+                travelerListNo.add(traveler.getString("name"));
+                errstr.append(traveler.getString("name")+",");
+                continue;
+            }
+            travelerList.add(traveler.getString("name"));
+            //  traveler  考勤人员信息
+            // 构建 为他人加班申请 ,直接为审核状态
+            DynamicObject wtamBusitripbill = BusinessDataServiceHelper.newDynamicObject("wtam_busitripbill");
+            wtamBusitripbill.set("billstatus","A");
+            CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(wtamBusitripbill.getDataEntityType().getName(), wtamBusitripbill, null);
+            String number = CodeRuleServiceHelper.getNumber(codeRule, wtamBusitripbill);
+            wtamBusitripbill.set("billno",number);
+
+            wtamBusitripbill.set("creator", bosUser);
+
+            wtamBusitripbill.set("nckd_tripreqbillid",id);
+            // 考勤人员
+            wtamBusitripbill.set("personid",traveler);
+            // 考勤管理组织
+            wtamBusitripbill.set("org",wtpAttfilebase.get("org"));
+            // 考勤档案
+            wtamBusitripbill.set("attfile",wtpAttfilebase);
+            DynamicObject wtpAttfilebase2 = map3.get(traveler.getLong("id"));
+            wtamBusitripbill.set("attfilebasef7",wtpAttfilebase2);
+            // 样式类型
+            wtamBusitripbill.set("billstyle","1");
+            // 申请类型
+            wtamBusitripbill.set("applytyperadio","1");
+            // 是否档案废弃
+            wtamBusitripbill.set("isattfilediscard",0);
+            // 是否存在工作流
+            wtamBusitripbill.set("isattfilediscard",0);
+            // 审批状态
+            wtamBusitripbill.set("auditstatus","A");
+
+            // 申请时长合计
+            wtamBusitripbill.set("sumtriptime",diffInDays);
+
+            // 出差结束日期
+            wtamBusitripbill.set("edate",enddate);
+
+            // 出差开始日期
+            wtamBusitripbill.set("sdate",startdate);
+
+            // 合计单位 A:天
+            wtamBusitripbill.set("sumunit","A");
+            // 是否变更单
+            wtamBusitripbill.set("ischange",0);
+            // 未出差(销差)
+            wtamBusitripbill.set("isnottrip",0);
+            // 是否最新单据
+            wtamBusitripbill.set("isnewbill",1);
+            // 出差日期
+            wtamBusitripbill.set("btdate",1);
+            // 原单id
+            wtamBusitripbill.set("originalid",0);
+
+
+            // 行程单据体
+            DynamicObjectCollection entryentity = wtamBusitripbill.getDynamicObjectCollection("entryentity");
+            DynamicObject dynamicObject1 = entryentity.addNew();
+
+            dynamicObject1.set("busitriptype",object); // 出差类型
+            dynamicObject1.set("startdatestr",sdf.format(tripentry.getDate("startdate"))); // 开始日期
+            dynamicObject1.set("startdate",tripentry.getDate("startdate")); // 开始日期
+            dynamicObject1.set("enddatestr",sdf.format(tripentry.getDate("enddate"))); // 结束日期
+            dynamicObject1.set("enddate",tripentry.getDate("enddate")); // 结束日期
+            dynamicObject1.set("traveltool",object2); // 交通工具 todo
+
+            dynamicObject1.set("from",tripentry.get("from")); // 出发地
+            dynamicObject1.set("to",tripentry.get("to")); // 目的地
+            dynamicObject1.set("triptimestr",diffInDays+"天"); // 申请时长
+            dynamicObject1.set("triptime",diffInDays); // 申请时长
+            dynamicObject1.set("efftctime",diffInDays); // 有效时长
+            dynamicObject1.set("unit","A"); // 单位
+            dynamicObject1.set("tripresontex",dynamicObject.get("description")); // 出差原因
+            dynamicObject1.set("strapplytime",new LocaleString(diffInDays+"天")); // 申请时长显示 多语言文本
+            dynamicObject1.set("owndate",startdate); // 班次归属日期
+            dynamicObject1.set("startmethod","3"); // 出差方式(开始) 默认全天
+            dynamicObject1.set("endmethod","3"); // 出差方式(结束) 默认全天
+            dynamicObject1.set("enclosuremode","A"); // 附件信息 下拉列表
+//            OperationResult submiteffect = OperationServiceHelper.executeOperate("submiteffect", "wtam_busitripbill", new DynamicObject[]{wtamBusitripbill}, OperateOption.create());
+//            if (!submiteffect.isSuccess()) {
+//                logger.error("生成对他人申请失败:{}" + submiteffect);
+//                throw new KDBizException("生成对他人申请失败:{}" + submiteffect.getMessage());
+//            }
+
+//            SaveServiceHelper.save(new DynamicObject[]{wtamBusitripbill});
+            OperateOption auditOption = OperateOption.create();
+            auditOption.setVariableValue(OperateOptionConst.ISHASRIGHT, "true");//不验证权限
+            auditOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true)); // 不执行警告级别校验器
+            OperationResult submiteffect;
+            try {
+                submiteffect = OperationServiceHelper.executeOperate("submiteffect", "wtam_busitripbill", new DynamicObject[]{wtamBusitripbill}, OperateOption.create());
+
+                if (!submiteffect.isSuccess()) {
+                    wtamBusitripbill.set("billstatus","A");
+                    SaveServiceHelper.save(new DynamicObject[]{wtamBusitripbill});
+                    logger.error("生成对他人申请失败:{}" + submiteffect);
+                }
+            } catch(Exception e){
+                String msg = e.getMessage();
+            } finally {
+                String msg = "";
+            }
+        }
+        if(errstr.length() > 0){
+            errstr.append("未找到对应考勤人员档案");
+        }
+        log.set("nckd_travelsalready",String.join(",", travelerList));
+        log.set("nckd_travelsno",String.join(",", travelerno)+String.join(",", travelerListNo));
+        String str = "";
+        if(travelerno.size() > 0){
+            str = String.join(",", travelerno)+ "未找到对应考勤人员。";
+        }
+        str = str + errstr.toString();
+        log.set("nckd_returnparameter",str);
+        SaveServiceHelper.save(new DynamicObject[]{log});
+
+    }
+}