|
@@ -0,0 +1,380 @@
|
|
|
+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.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.*;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ * 出差申请单:操作插件,处理用车申请同步至HR的代他人出差申请
|
|
|
+ * 表单标识:外办单(用车申请单nckd_er_dailyvehicleb_ext)
|
|
|
+ * @author wanghaiwu_kd
|
|
|
+ * @date 2025/05/10
|
|
|
+ */
|
|
|
+
|
|
|
+public class DailyVehicleBillCusOpPlugin extends AbstractOperationServicePlugIn {
|
|
|
+ private static final Log logger = LogFactory.getLog(DailyVehicleBillCusOpPlugin.class);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ 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":
|
|
|
+
|
|
|
+
|
|
|
+ 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":
|
|
|
+
|
|
|
+
|
|
|
+ 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);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ DynamicObject travelLog = BusinessDataServiceHelper.newDynamicObject("nckd_travel_log");
|
|
|
+ travelLog.set("nckd_er_tripreqbill", key);
|
|
|
+ travelLog.set("name", "外办单");
|
|
|
+ travelLog.set("number", "er_dailyvehiclebill");
|
|
|
+ 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<>();
|
|
|
+
|
|
|
+
|
|
|
+ DynamicObject applier = regBillObj.getDynamicObject("applier");
|
|
|
+ if(applier != null){
|
|
|
+ nameList.add(applier.getString("name"));
|
|
|
+ numberList.add(applier.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"),
|
|
|
+ detail -> detail,
|
|
|
+ (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"),
|
|
|
+ detail -> detail,
|
|
|
+ (existing, replacement) -> existing
|
|
|
+ ));
|
|
|
+
|
|
|
+ initDate(regBillObj, 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[] travelers, Map<Long, DynamicObject> map
|
|
|
+ , DynamicObject log, List<String> travelerno,Map<Long, DynamicObject> map3){
|
|
|
+
|
|
|
+ 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");
|
|
|
+
|
|
|
+
|
|
|
+ Date startdate = dynamicObject.getDate("startdate");
|
|
|
+ Date enddate = dynamicObject.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"));
|
|
|
+
|
|
|
+
|
|
|
+ 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);
|
|
|
+
|
|
|
+
|
|
|
+ wtamBusitripbill.set("sumunit","A");
|
|
|
+
|
|
|
+ wtamBusitripbill.set("ischange",0);
|
|
|
+
|
|
|
+ wtamBusitripbill.set("isnottrip",0);
|
|
|
+
|
|
|
+ wtamBusitripbill.set("isnewbill",1);
|
|
|
+
|
|
|
+ wtamBusitripbill.set("btdate",1);
|
|
|
+
|
|
|
+ wtamBusitripbill.set("originalid",0);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ DynamicObjectCollection entryentity = wtamBusitripbill.getDynamicObjectCollection("entryentity");
|
|
|
+ DynamicObject dynamicObject1 = entryentity.addNew();
|
|
|
+
|
|
|
+ dynamicObject1.set("busitriptype",object);
|
|
|
+ dynamicObject1.set("startdatestr",sdf.format(dynamicObject.getDate("startdate")));
|
|
|
+ dynamicObject1.set("startdate",dynamicObject.getDate("startdate"));
|
|
|
+ dynamicObject1.set("enddatestr",sdf.format(dynamicObject.getDate("enddate")));
|
|
|
+ dynamicObject1.set("enddate",dynamicObject.getDate("enddate"));
|
|
|
+ dynamicObject1.set("traveltool",object2);
|
|
|
+
|
|
|
+ dynamicObject1.set("from", dynamicObject.get("vehiclecity"));
|
|
|
+ dynamicObject1.set("to", dynamicObject.get("vehiclecity"));
|
|
|
+ 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");
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ 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});
|
|
|
+
|
|
|
+ }
|
|
|
+}
|