Forráskód Böngészése

feat: 支持打卡插件,获取江铜铅锌、金德等公司打卡数据

ouyangtianpeng 4 órája
szülő
commit
47f4b46dd0

+ 61 - 42
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/task/SyncPunchCardTask.java

@@ -1,12 +1,17 @@
 package nckd.jxccl.wtc.task;
 
+import com.alibaba.fastjson.JSON;
 import com.hikvision.artemis.sdk.ArtemisHttpUtil;
 import com.hikvision.artemis.sdk.config.ArtemisConfig;
 import kd.bos.context.RequestContext;
+import kd.bos.entity.param.CustomParam;
 import kd.bos.exception.KDException;
 import kd.bos.schedule.executor.AbstractTask;
+import kd.bos.servicehelper.parameter.SystemParamServiceHelper;
 import kd.sdk.plugin.Plugin;
-import net.sf.json.JSONObject;
+import nckd.jxccl.wtc.utils.SyncPunchCardHelper;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -17,57 +22,71 @@ import java.util.Map;
  * 后台任务插件
  */
 public class SyncPunchCardTask extends AbstractTask implements Plugin {
-    static {
-        ArtemisConfig.host = "117.178.209.120:4433";// ����API����nginx������ip�˿�
-        ArtemisConfig.appKey = "20297808";// "��Կappkey������Key��20332604
-        ArtemisConfig.appSecret = "hGLlKSP6aZV0Ui32BVtb";// ��ԿappSecret������Secret��
-    }
     private static final String ARTEMIS_PATH = "/artemis";
     static final String getCamsApi = ARTEMIS_PATH + "/api/acs/v2/door/events";
     static Map<String, String> path = new HashMap<String, String>(2) {
         {
-            put("https://", getCamsApi);// �����ֳ���������ȷ����http����https
+            put("https://", getCamsApi);
         }
     };
 
+    public void initConfig() {
+        CustomParam customParam = new CustomParam();
+        customParam.getSearchKeySet().add("PUNCH_CARD_HOST");
+        customParam.getSearchKeySet().add("PUNCH_CARD_APP_KEY");
+        customParam.getSearchKeySet().add("PUNCH_CARD_APP_SECRET");
+        Map<String, String> cusTomMap = SystemParamServiceHelper.loadCustomParameterFromCache(customParam);
+        ArtemisConfig.host  = cusTomMap.get("PUNCH_CARD_HOST");
+        ArtemisConfig.appKey = cusTomMap.get("PUNCH_CARD_APP_KEY");
+        ArtemisConfig.appSecret = cusTomMap.get("PUNCH_CARD_APP_SECRET");
+    }
+
     @Override
     public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
-       // dosysbyeventstoPunchCard();
+        try {
+            initConfig();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            Calendar date = Calendar.getInstance();
+            System.out.println(sdf.format(date.getTime()));
+            String endTime = sdf.format(date.getTime()) + "T23:59:59+08:00";
+            Integer days = Integer.valueOf(map.get("days").toString());
+            date.set(Calendar.DATE, date.get(Calendar.DATE) - days);
+            System.out.println(sdf.format(date.getTime()));
+            String startTime = sdf.format(date.getTime()) + "T00:00:00+08:00";
+            getAllCards(startTime, endTime);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
     }
 
-//    public void dosysbyeventstoPunchCard()  {
-//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-//        Calendar date = Calendar.getInstance();
-//        System.out.println(sdf.format(date.getTime()));
-//        String endTime = sdf.format(date.getTime()) + "T23:59:59+08:00";
-//        date.set(Calendar.DATE, date.get(Calendar.DATE) - 7);
-//        System.out.println(sdf.format(date.getTime()));
-//        String startTime = sdf.format(date.getTime()) + "T00:00:00+08:00";
-//        System.out.println("---------------------��ʼʱ��  " + startTime);
-//        System.out.println("----------------------����ʱ��  " + endTime);
-//        int nowpageNo = 1;
-//        String firstjson = callGetCard(startTime, endTime, nowpageNo);
-//    }
-//
-//    public static String callGetCard(String startTime, String endTime, int pageNo) {
-//        System.out.println("��ȡ��"+pageNo+"ҳ�򿪼�¼------------");
-//        JSONObject jsonBody = new JSONObject();
-//        jsonBody.put("pageNo", pageNo);
-//        jsonBody.put("pageSize", 10);
-//        jsonBody.put("startTime", startTime);
-//        jsonBody.put("endTime", endTime);
-//        String body = jsonBody.toString();
-//        System.out.println("��ȡ��"+pageNo+"�������------------"+body);
-//        long time1=System.currentTimeMillis();
-//        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post����application/json���Ͳ���
-//        System.out.println("���������ʱ---"+(System.currentTimeMillis()-time1)+"ms");
-//        System.out.println("���ؽ��"+result);
-//        return result;
-//    }
-//
-//    public static void main(String[] args) {
-//        SyncPunchCardTask task = new SyncPunchCardTask();
-//        task.execute(null, null);
-//    }
+    public static void getAllCards(String startTime, String endTime) {
+        JSONObject firstPageJson = getOnePageCard(startTime, endTime, 1);
+        JSONArray firstPageListJson = firstPageJson.getJSONArray("list");
+        // 保存第一页
+        SyncPunchCardHelper.savePunchCardData(firstPageListJson);
+        Integer totalPage = firstPageJson.getInteger("totalPage");
+        if (totalPage <= 1) {
+            return;
+        }
+        // 从第二页开始保存
+        for(int i=2; i<=totalPage; i++) {
+            JSONObject pageJson = getOnePageCard(startTime, endTime, i);
+            JSONArray pageListJson = pageJson.getJSONArray("list");
+            SyncPunchCardHelper.savePunchCardData(pageListJson);
+        }
+    }
+
+    public static JSONObject getOnePageCard(String startTime, String endTime, int pageNo) {
+        JSONObject jsonBody = new JSONObject();
+        jsonBody.put("pageNo", pageNo);
+        jsonBody.put("pageSize", 1000);
+        jsonBody.put("startTime", startTime);
+        jsonBody.put("endTime", endTime);
+        jsonBody.put("userId", "admin");
+        String body = jsonBody.toString();
+        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);
+        JSONObject jsonData = JSON.parseObject(result).getJSONObject("data");
+        return jsonData;
+    }
 
 }

+ 162 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/utils/SyncPunchCardHelper.java

@@ -0,0 +1,162 @@
+package nckd.jxccl.wtc.utils;
+
+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.utils.ObjectUtils;
+import kd.bos.exception.ErrorCode;
+import kd.bos.exception.KDBizException;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.wtc.wtis.business.punchcarddata.PunchCardDataHelper;
+import kd.wtc.wtis.business.punchcarddata.PunchCardDataService;
+import kd.wtc.wtis.webapi.punchcard.PunchCardSyncSupport;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SyncPunchCardHelper {
+
+    private static HRBaseServiceHelper PUNCH_CARD_HELPER = new HRBaseServiceHelper("wtis_punchcarddata");
+
+    /**
+     * 保存打卡数据
+     * @param resultArr
+     */
+    public static void savePunchCardData(JSONArray resultArr) {
+        //批次编码
+        String batchNumber = String.valueOf(System.currentTimeMillis());
+        JSONArray actualArr = resultArr.stream().filter(obj -> !ObjectUtils.isEmpty(obj))
+                .collect(Collectors.toCollection(JSONArray::new));
+        //如果过滤后size == 0直接返回
+        if(actualArr.size() == 0) {
+            return;
+        }
+        List<DynamicObject> saveList = resultArr.stream().map((data) -> {
+            return dealPunchCardData((JSONObject) data, batchNumber);
+        }).collect(Collectors.toList());
+        //过滤下为空的
+        List<DynamicObject> actualSaveList = saveList.stream().filter(dyo -> !ObjectUtils.isEmpty(dyo)).collect(Collectors.toList());
+        if(actualSaveList.size() == 0) {
+            return;
+        }
+        PUNCH_CARD_HELPER.save((DynamicObject[])actualSaveList.toArray(new DynamicObject[0]));
+        try {
+            PunchCardSyncSupport.execute(() -> {
+                syncCardRecord(actualArr,batchNumber);
+            });
+        } catch (Exception e) {
+        }
+
+    }
+
+    /**
+     * 处理打卡数据
+     * @param data 海康威视接口返回的打卡数据明细
+     * @param batchNumber 批次编码
+     */
+    public static DynamicObject dealPunchCardData(JSONObject data, String batchNumber) {
+        DynamicObject dyo = PUNCH_CARD_HELPER.generateEmptyDynamicObject();
+        dyo.set("batchnumber", batchNumber);
+
+        String card = data.getString("cardNo");
+        String id = data.getString("eventId");
+        if (StringUtils.isEmpty(card)) {
+            return null;
+        }
+        //如果存在记录直接返回
+        if(checkCardIsExists(card, id)) {
+            return null;
+        }
+        dyo.set("number", card);
+        dyo.set("card", card);
+        //实际打卡时间
+        Long unix = data.getLong("eventTime");
+        dyo.set("punchcarddate", unixToDate(unix));
+        dyo.set("punchcardtime", unixToTimeStamp(unix));
+        //打卡地点
+        dyo.set("place", data.getString("devName"));
+        //进出卡
+        Integer checkType = data.getInteger("inAndOutType");
+        if(1 == checkType) {
+            dyo.set("accesstag", "on");
+        }
+        else if(0 == checkType) {
+            dyo.set("accesstag", "off");
+        }
+        //时区
+        dyo.set("timezone", 320881823238577152L);
+        //打卡来源
+        dyo.set("signsourcename", "海康威视");
+        //打卡设备 设备编码
+        dyo.set("equipment", "海康威视");
+        dyo.set("equipnumber", "1020_S");
+        // dataId
+        dyo.set("dataid", id);
+
+        //默认值
+        dyo.set("times", 0);
+        dyo.set("status", 0);
+
+        return dyo;
+    }
+
+    /**
+     * 同步打卡记录
+     * @JSONArray resultArr
+     * @param batchNumber
+     */
+    private static void syncCardRecord(JSONArray resultArr, String batchNumber) {
+        try {
+            long l1 = System.currentTimeMillis();
+            DynamicObject[] date = PunchCardDataHelper.getDataByBatchNumber(batchNumber);
+            PunchCardDataService.dealWithData(date);
+            long l2 = System.currentTimeMillis();
+        } catch (Exception e) {
+            throw new KDBizException(e, new ErrorCode("", e.getMessage()), new Object[0]);
+        } catch (Throwable e1) {
+            throw new KDBizException(e1, new ErrorCode("", e1.getMessage()), new Object[0]);
+        }
+    }
+
+
+    /**
+     * 根据考勤卡号和海康威视返回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
+     * @return
+     */
+    public static Date unixToDate (Long unix) {
+        Date date = new Date(unix);
+        return date;
+    }
+
+
+    /**
+     * 时间戳转HH:mm:ss
+     * @param unix
+     * @return
+     */
+    public static String unixToTimeStamp (Long unix) {
+        Date date = new Date(unix);
+        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
+        return sdf.format(date);
+    }
+}