Przeglądaj źródła

1.钉钉同步打卡数据功能调整,排除有效卡及重复卡

Tyx 6 dni temu
rodzic
commit
42159128e4

+ 49 - 48
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/staff/plugin/form/PrepareAdjustApplicationFormPlugin.java

@@ -339,62 +339,63 @@ public class PrepareAdjustApplicationFormPlugin extends AbstractBillPlugIn imple
             String dateStr = sdf.format(date);
 
             // 拼接 SQL 查询
-            StringBuilder sql = new StringBuilder("SELECT a.fid AS id, a.fboid AS boid, A.fparentid as parentorg, "
-                    + "t.flevel as level1, t.fstructlongnumber as structlongnumber, ST.fcount as count,ST.fcontainsubcount as containsubcount, "
+            StringBuilder sql = new StringBuilder("SELECT a.fid AS id, a.fboid AS boid, A.fparentid as parentorg, \n"
+                    + "t.flevel as level1, t.fstructlongnumber as structlongnumber, ST.fcount as count,ST.fcontainsubcount as containsubcount, \n"
 //                    + "(select top 1 N.fstaffcount  from t_haos_adminorg M where a.fparentid = M.fboid ) as "
 //                    + " (select top 1 CASE WHEN N.fstaffcount IS NULL THEN 999999 ELSE N.fstaffcount END AS fstaffcount  "
 //                    + "from t_haos_adminorg M left join t_haos_dutyorgdetail N on N.fdutyorgid = M.fid "
 //                    + "where M.fenable ='1'  and M.fboid  =a.fboid and N.fenable = '1' and N.fleffdt >='" + dateStr + "' "
 //                    + "AND M.fbsed <= '" + dateStr + "' AND M.fbsled >= '" + dateStr + "'  "
 //                    + "order by M.fhisversion desc) as staffcount "
-                    + "CASE "
-                    + "    WHEN (SELECT TOP 1 CASE WHEN N.fstaffcount IS NULL THEN 999999 ELSE N.fstaffcount END "
-                    + "          FROM t_haos_adminorg M "
-                    + "          LEFT JOIN t_haos_dutyorgdetail N ON N.fdutyorgid = M.fid "
-                    + "          WHERE M.fenable = '1' "
-                    + "          AND M.fboid = a.fboid "
-                    + "          AND N.fenable = '1' "
-                    + "          AND N.fid = ?  "
-                    + "          AND N.fleffdt >= '" + dateStr + "' "
-                    + "          AND M.fbsed <= '" + dateStr + "' "
-                    + "          AND M.fbsled >= '" + dateStr + "' "
-                    + "          ORDER BY M.fhisversion DESC) IS NULL "
-                    + "    THEN 999999 "
-                    + "    ELSE (SELECT TOP 1 CASE WHEN N.fstaffcount IS NULL THEN 999999 ELSE N.fstaffcount END "
-                    + "          FROM t_haos_adminorg M "
-                    + "          LEFT JOIN t_haos_dutyorgdetail N ON N.fdutyorgid = M.fid "
-                    + "          WHERE M.fenable = '1' "
-                    + "          AND M.fboid = a.fboid "
-                    + "          AND N.fenable = '1' "
-                    + "          AND N.fid = ?  "
-                    + "          AND N.fleffdt >= '" + dateStr + "' "
-                    + "          AND M.fbsed <= '" + dateStr + "' "
-                    + "          AND M.fbsled >= '" + dateStr + "' "
-                    + "          ORDER BY M.fhisversion DESC) "
-                    + "END AS staffcount "
-
-                    + "FROM T_HAOS_ADMINORG A "
-                    + "LEFT JOIN T_HAOS_STAFFORGEMPCOUNT ST on A.fboid = ST.fuseorgboid "
-                    + "LEFT JOIN T_HAOS_ADMINSTRUCT T ON A.fboid = T.fadminorgid "
-                    + "AND T.fiscurrentversion = '0' AND T.fdatastatus = '1' AND T.fstructprojectid = 1010 "
-                    + "AND T.finitstatus = '2' AND T.fbsed <= '" + dateStr + "' "
-                    + "AND T.fbsled >= '" + dateStr + "' AND T.fenable = '1' "
-                    + "LEFT JOIN T_HAOS_ORGSORTCODE S ON S.FADMINORGID = A.fboid "
-                    + "AND S.fiscurrentversion = '0' AND S.fdatastatus = '1' AND S.finitstatus = '2' "
-                    + "AND S.fbsed <= '" + dateStr + "' AND S.fbsled >= '" + dateStr + "' "
-                    + "AND S.fenable = '1' "
-                    + "LEFT JOIN T_HAOS_DUTYORGDETAIL M ON M.fdutyorgid = A.fboid "
-                    + "WHERE A.fiscurrentversion = '0' AND A.fdatastatus = '1' AND A.finitstatus = '2' "
-                    + "AND A.fbsed <= '" + dateStr + "' AND A.fbsled >= '" + dateStr + "' "
-                    + "AND A.fenable = '1' "
-                    + "AND ( T.fstructlongnumber LIKE ( select top 1 concat(F.fstructlongnumber,'%')  from  T_HAOS_ADMINSTRUCT F where  F.fadminorgid = ? "
-                    + "AND F.fiscurrentversion = '0' AND F.fdatastatus = '1' AND F.fstructprojectid = 1010 "
-                    + "AND F.finitstatus = '2' AND F.fbsed <= '" + dateStr + "' "
-                    + "AND F.fbsled >= '" + dateStr + "' AND F.fenable = '1' "
-                    +") " +") "
+                    + "CASE \n"
+                    + "    WHEN (SELECT TOP 1 CASE WHEN N.fstaffcount IS NULL THEN 999999 ELSE N.fstaffcount END \n "
+                    + "          FROM t_haos_adminorg M \n"
+                    + "          LEFT JOIN t_haos_dutyorgdetail N ON N.fdutyorgid = M.fid \n"
+                    + "          WHERE M.fenable = '1' \n"
+                    + "          AND M.fboid = a.fboid \n"
+                    + "          AND N.fenable = '1' \n"
+                    + "          AND N.fid = ?  \n"
+                    + "          AND N.fleffdt >= '" + dateStr + "' \n"
+                    + "          AND M.fbsed <= '" + dateStr + "' \n"
+                    + "          AND M.fbsled >= '" + dateStr + "' \n"
+                    + "          ORDER BY M.fhisversion DESC) IS NULL \n"
+                    + "    THEN 999999 \n"
+                    + "    ELSE (SELECT TOP 1 CASE WHEN N.fstaffcount IS NULL THEN 999999 ELSE N.fstaffcount END \n"
+                    + "          FROM t_haos_adminorg M \n"
+                    + "          LEFT JOIN t_haos_dutyorgdetail N ON N.fdutyorgid = M.fid \n"
+                    + "          WHERE M.fenable = '1' \n"
+                    + "          AND M.fboid = a.fboid \n"
+                    + "          AND N.fenable = '1' \n"
+                    + "          AND N.fid = ?  \n"
+                    + "          AND N.fleffdt >= '" + dateStr + "' \n"
+                    + "          AND M.fbsed <= '" + dateStr + "' \n"
+                    + "          AND M.fbsled >= '" + dateStr + "' \n"
+                    + "          ORDER BY M.fhisversion DESC) \n"
+                    + "END AS staffcount \n"
+
+                    + "FROM T_HAOS_ADMINORG A \n"
+                    + "LEFT JOIN T_HAOS_STAFFORGEMPCOUNT ST on A.fboid = ST.fuseorgboid \n"
+                    + "LEFT JOIN T_HAOS_ADMINSTRUCT T ON A.fboid = T.fadminorgid \n"
+                    + "AND T.fiscurrentversion = '0' AND T.fdatastatus = '1' AND T.fstructprojectid = 1010 \n"
+                    + "AND T.finitstatus = '2' AND T.fbsed <= '" + dateStr + "' \n"
+                    + "AND T.fbsled >= '" + dateStr + "' AND T.fenable = '1' \n"
+                    + "LEFT JOIN T_HAOS_ORGSORTCODE S ON S.FADMINORGID = A.fboid \n"
+                    + "AND S.fiscurrentversion = '0' AND S.fdatastatus = '1' AND S.finitstatus = '2' \n"
+                    + "AND S.fbsed <= '" + dateStr + "' AND S.fbsled >= '" + dateStr + "' \n"
+                    + "AND S.fenable = '1' \n"
+                    + "LEFT JOIN T_HAOS_DUTYORGDETAIL M ON M.fdutyorgid = A.fboid \n"
+                    + "WHERE A.fiscurrentversion = '0' AND A.fdatastatus = '1' AND A.finitstatus = '2' \n"
+                    + "AND A.fbsed <= '" + dateStr + "' AND A.fbsled >= '" + dateStr + "' \n"
+                    + "AND A.fenable = '1' \n"
+                    + "AND ( T.fstructlongnumber LIKE ( select top 1 concat(F.fstructlongnumber,'%')  from  T_HAOS_ADMINSTRUCT F where  F.fadminorgid = ? \n"
+                    + "AND A.fboid in (select fuseorgboid from t_haos_useorgdetail where fid = ? \n)"
+                    + "AND F.fiscurrentversion = '0' AND F.fdatastatus = '1' AND F.fstructprojectid = 1010 \n"
+                    + "AND F.finitstatus = '2' AND F.fbsed <= '" + dateStr + "' \n"
+                    + "AND F.fbsled >= '" + dateStr + "' AND F.fenable = '1' \n"
+                    +") " +") \n"
                     + "ORDER BY S.fsortcode");
 //            Object[] param = new Object[]{(Long) orgid,haosStaff.getPkValue()};
-            Object[] param = new Object[]{pkValue,pkValue,(Long) orgid};
+            Object[] param = new Object[]{pkValue,pkValue,(Long) orgid, pkValue};
             DataSet dataSet = HRDBUtil.queryDataSet("haos_adminOrgHisSearch", new DBRoute("hr"), sql.toString(), param);
 //            DataSet dataSet = DB.queryDataSet("leaseContractPushCard", DBRoute.of("hr"), sql);
 

+ 45 - 4
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/wtc/wtis/util/SyncPunchCardHelper.java

@@ -2,8 +2,10 @@ package nckd.jimin.jyyy.hr.wtc.wtis.util;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.kingdee.util.StringUtils;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
 import kd.bos.exception.ErrorCode;
 import kd.bos.exception.KDBizException;
 import kd.bos.logging.Log;
@@ -23,6 +25,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 public class SyncPunchCardHelper {
 
@@ -37,15 +40,35 @@ public class SyncPunchCardHelper {
     public static void savePunchCardData(JSONArray resultArr, Map openMap) {
         //批次编码
         String batchNumber = String.valueOf(System.currentTimeMillis());
-        List<DynamicObject> saveList = resultArr.stream().map((data) -> {
+        //2025-06-09 如果invalidRecordType有值则为无效卡
+        logger.info("钉钉返回信息过滤前条数:{}", resultArr.size());
+        JSONArray actualArr = resultArr.stream().filter(obj -> StringUtils.isEmpty(((JSONObject) obj).getString("invalidRecordType")))
+                .collect(Collectors.toCollection(JSONArray::new));
+        logger.info("钉钉返回信息过滤后条数:{}", actualArr.size());
+        //如果过滤后size == 0直接返回
+        if(actualArr.size() == 0) {
+            String msg = "钉钉返回条数:" + resultArr.size() + "条,有效卡:" + actualArr.size() + "条";
+            DingTalkSyncUtil.createLog(DingTalkSyncUtil.v_success, msg, resultArr.toJSONString(), DingTalkSyncUtil.SyncPunch);
+            return;
+        }
+        List<DynamicObject> saveList = actualArr.stream().map((data) -> {
             return dealPunchCardData((JSONObject) data, openMap, batchNumber);
         }).collect(Collectors.toList());
-        PUNCH_CARD_HELPER.save((DynamicObject[])saveList.toArray(new DynamicObject[0]));
+        logger.info("钉钉待保存过滤重复前条数:{}", saveList.size());
+        //过滤下为空的
+        List<DynamicObject> actualSaveList = saveList.stream().filter(dyo -> !ObjectUtils.isEmpty(dyo)).collect(Collectors.toList());
+        logger.info("钉钉待保存过滤重复后条数:{}", actualSaveList.size());
+        if(actualSaveList.size() == 0) {
+            String msg = "钉钉返回条数:" + resultArr.size() + "条," + "有效卡:" + actualArr.size() + "条,重复:" + (saveList.size()-actualSaveList.size()) + "条";
+            DingTalkSyncUtil.createLog(DingTalkSyncUtil.v_success, msg, resultArr.toJSONString(), DingTalkSyncUtil.SyncPunch);
+            return;
+        }
+        PUNCH_CARD_HELPER.save((DynamicObject[])actualSaveList.toArray(new DynamicObject[0]));
 
         try {
             long l1 = System.currentTimeMillis();
             PunchCardSyncSupport.execute(() -> {
-                syncCardRecord(resultArr,batchNumber);
+                syncCardRecord(actualArr,batchNumber);
             });
             long l2 = System.currentTimeMillis();
             logger.info("SyncPunchCardHelper_sync_cardData_{}", l2 - l1);
@@ -66,6 +89,11 @@ public class SyncPunchCardHelper {
         DynamicObject dyo = PUNCH_CARD_HELPER.generateEmptyDynamicObject();
         dyo.set("batchnumber", batchNumber);
         String card = openMap.get(data.getString("userId")).toString();
+        String id = data.getString("id");
+        //如果存在记录直接返回
+        if(checkCardIsExists(card, id)) {
+            return null;
+        }
         dyo.set("number", card);
         dyo.set("card", card);
         //实际打卡时间
@@ -90,7 +118,7 @@ public class SyncPunchCardHelper {
         dyo.set("equipment", "钉钉同步");
         dyo.set("equipnumber", "1020_S");
         // dataId
-        dyo.set("dataid", data.getString("id"));
+        dyo.set("dataid", id);
 
         //默认值
         dyo.set("times", 0);
@@ -124,6 +152,19 @@ public class SyncPunchCardHelper {
     }
 
 
+    /**
+     * 根据考勤卡号和钉钉返回ID判断是否存在记录
+     * @param card
+     * @param id
+     */
+    public static boolean checkCardIsExists(String card, String id) {
+        QFilter filter = new QFilter("card", QCP.equals, card);
+        filter.and("dataid", QCP.equals, id);
+        return QueryServiceHelper.exists("wtis_punchcarddata", new QFilter[]{filter});
+    }
+
+
+
     /**
      * 时间戳转yyyy-MM-dd
      * @param unix