qingwu 3 月之前
父節點
當前提交
0758de90ea

+ 3 - 3
metadata/com/kingdee/eas/custom/log/SyncLog.bizunit

@@ -96,9 +96,9 @@
       <lang locale="zh_TW" value="false" />
     </rs>
     <rs key="bizUnit[com.kingdee.eas.custom.log.SyncLog].extendedProperty.maxFieldIndex">
-      <lang locale="en_US" value="15" />
-      <lang locale="zh_CN" value="15" />
-      <lang locale="zh_TW" value="15" />
+      <lang locale="en_US" value="17" />
+      <lang locale="zh_CN" value="17" />
+      <lang locale="zh_TW" value="17" />
     </rs>
     <rs key="bizUnit[com.kingdee.eas.custom.log.SyncLog].extendedProperty.useTableEditUI">
       <lang locale="en_US" value="false" />

+ 1 - 1
metadata/com/kingdee/eas/custom/log/app/SyncLog.entity

@@ -289,7 +289,7 @@
       <isMultilingual>false</isMultilingual>
       <isNullable>false</isNullable>
       <formula />
-      <length>255</length>
+      <length>1000</length>
       <precision>0</precision>
       <decimalDigits>0</decimalDigits>
       <defaultValue>entityObject[com.kingdee.eas.custom.log.app.SyncLog].properties.ownProperty[syncResult].defaultValue</defaultValue>

+ 26 - 17
src/com/kingdee/eas/custom/synctask/SyncTranForIOTFacadeControllerBean.java

@@ -7,6 +7,9 @@ import com.kingdee.bos.Context;
 import com.kingdee.bos.metadata.entity.*;
 import com.kingdee.bos.metadata.query.util.CompareType;
 import com.kingdee.eas.basedata.org.*;
+import com.kingdee.eas.basedata.person.IPerson;
+import com.kingdee.eas.basedata.person.PersonCollection;
+import com.kingdee.eas.basedata.person.PersonFactory;
 import com.kingdee.eas.basedata.person.PersonInfo;
 import com.kingdee.eas.common.EASBizException;
 import com.kingdee.eas.custom.log.ISyncLog;
@@ -110,6 +113,7 @@ public class SyncTranForIOTFacadeControllerBean extends AbstractSyncTranForIOTFa
         syncLogInfo.setDockingSystem(DockingSystemEnum.IOT);
         //String billds = request.getParameter("billIds");
         try {
+
             logger.error("_syncOrgUnitToOA---start");
             logger.error("_syncOrgUnitToOA---billds: " + billds);
             IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx);
@@ -118,20 +122,11 @@ public class SyncTranForIOTFacadeControllerBean extends AbstractSyncTranForIOTFa
             FilterInfo filterInfo = new FilterInfo();
             FilterItemCollection filterItems = filterInfo.getFilterItems();
             filterItems.add(new FilterItemInfo("id", "00000000-0000-0000-0000-000000000000CCE7AED4", CompareType.NOTEQUALS));
-            //if (!StringUtils.isEmpty(billds)) {
-            Set<String> adminOrgIds = AtsUtil.toSet(billds);
-            logger.error("_syncOrgUnitToOA---adminOrgIds---" + adminOrgIds);
-            filterItems.add(new FilterItemInfo("id", adminOrgIds, CompareType.INCLUDE));
-            //} else {
-            //    AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection("select id ,name,number");
-            //    StringBuilder sb = new StringBuilder();
-            //    for (int i = 0; i < adminOrgUnitCollection.size(); i++) {
-            //        String adminOrgId = adminOrgUnitCollection.get(i).getId().toString();
-            //        sb.append(adminOrgId).append(",");
-            //    }
-            //    sb.deleteCharAt(sb.lastIndexOf(","));
-            //    billds = sb.toString();
-            //}
+            if (!StringUtils.isEmpty(billds)) {
+                Set<String> adminOrgIds = AtsUtil.toSet(billds);
+                logger.error("_syncOrgUnitToOA---adminOrgIds---" + adminOrgIds);
+                filterItems.add(new FilterItemInfo("id", adminOrgIds, CompareType.INCLUDE));
+            }
             SelectorItemCollection sic = new SelectorItemCollection();
             sic.add("*");
             sic.add("parent.number");
@@ -190,11 +185,25 @@ public class SyncTranForIOTFacadeControllerBean extends AbstractSyncTranForIOTFa
         syncLogInfo.setDockingSystem(DockingSystemEnum.IOT);
         IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
         try {
+            //IPerson iPerson = PersonFactory.getLocalInstance(ctx);
             FilterInfo filterInfo = new FilterInfo();
             FilterItemCollection filterItems = filterInfo.getFilterItems();
-            Set personIds = AtsUtil.toSet(billds);
-            logger.error("syncPersonToIot---personIds---" + personIds);
-            filterItems.add(new FilterItemInfo("person", personIds, CompareType.INCLUDE));
+            Set personIds = new HashSet();
+            //Èç¹ûΪ¿Õ²éѯËùÓÐÊý¾Ý
+            if (!StringUtils.isEmpty(billds)) {
+                //PersonCollection personCollection = iPerson.getPersonCollection("select id,number");
+                //StringBuilder sb = new StringBuilder();
+                //for (int i = 0; i < personCollection.size(); i++) {
+                //    PersonInfo personInfo = personCollection.get(i);
+                //    String personId = personInfo.getId().toString();
+                //    sb.append(personId).append(",");
+                //}
+                //sb.deleteCharAt(sb.lastIndexOf(","));
+                //billds = sb.toString();
+                personIds = AtsUtil.toSet(billds);
+                logger.error("syncPersonToIot---personIds---" + personIds);
+                filterItems.add(new FilterItemInfo("person", personIds, CompareType.INCLUDE));
+            }
             SelectorItemCollection sic = new SelectorItemCollection();
             sic.add("*");
             sic.add("person.number");

+ 187 - 119
src/com/kingdee/eas/custom/synctask/SyncTranForMJFacadeControllerBean.java

@@ -32,11 +32,18 @@ import com.kingdee.eas.utils.ExpiringMapCache;
 import com.kingdee.util.StringUtils;
 import okhttp3.*;
 import org.apache.log4j.Logger;
+
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.sql.*;
 import java.sql.Connection;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.Date;
 
@@ -45,6 +52,7 @@ public class SyncTranForMJFacadeControllerBean extends AbstractSyncTranForMJFaca
     private Properties propt = new Properties();
     private static ExpiringMapCache<String, String> cache = new ExpiringMapCache();
     private long durationInMillis = 84600000;
+    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
     public SyncTranForMJFacadeControllerBean() throws BOSException {
         String syncOAConfigPath = System.getProperty("EAS_HOME") + "/server/properties/scy/syncMJConfig.properties";
@@ -69,70 +77,53 @@ public class SyncTranForMJFacadeControllerBean extends AbstractSyncTranForMJFaca
     @Override
     protected void _syncAccessRecord(Context ctx, String startDate, String endDate) throws BOSException {
         logger.error("_syncAccessRecord------");
+        JSONArray jsonArray = new JSONArray();
         Properties properties = new Properties();
         properties.put("version", propt.getProperty("version"));
         properties.put("tenantCode", propt.getProperty("tenantCode"));//租户编号,平台提供
         properties.put("language", propt.getProperty("language"));//语言
         properties.put("tenantSecret", propt.getProperty("tenantSecret"));//密钥
         properties.put("account", propt.getProperty("account"));//接口账号
-        properties.put("password", propt.getProperty("password"));//接口账号密码
+        properties.put("password", propt.getProperty("passwordMj"));//接口账号密码
         properties.put("getTokenPath", propt.getProperty("getTokenPath"));//获取token接口地址
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-
+        int pageIndex = 1;
         try {
-            JSONObject params = new JSONObject();
-            params.put("count", "100");
-            //获取前三天数据
-            Calendar calendar = Calendar.getInstance();
-            calendar.add(Calendar.DAY_OF_YEAR, -3);
-            Date threeDaysAgoDate = calendar.getTime();
-            if(StringUtils.isEmpty(startDate)){
-                //Date parse = sdf.parse("2022-01-01");
-                params.put("rowTimeStamp", threeDaysAgoDate.getTime());
-            }else{
-                Date parse = sdf.parse(startDate);
-                params.put("rowTimeStamp", parse.getTime());
-            }
-            String payload = params.toJSONString();
-            Map<String, String> headers = getHeader(payload, false);
+            while (true) {
+                // 获取前三天的时间
+                JSONObject params = buildRequestParams(pageIndex, startDate, endDate);
+                String payload = params.toJSONString();
+                Map<String, String> headers = getHeader(payload, false);
+
+                OkHttpClient client = new OkHttpClient.Builder().build();
+                MediaType mediaType = MediaType.parse("application/json");
+                RequestBody body = RequestBody.create(mediaType, payload);
+                Request.Builder requestBuilder = new Request.Builder()
+                        .url(propt.getProperty("getMJPath"))
+                        .method("POST", body)
+                        .addHeader("Content-Type", "application/json");
+                // 批量添加请求头
+                for (Map.Entry<String, String> header : headers.entrySet()) {
+                    requestBuilder.header(header.getKey(), header.getValue());
+                }
+                Response response = client.newCall(requestBuilder.build()).execute();
+                logger.error("response----" + response.isSuccessful());
+                if (response.isSuccessful()) {
+                    //重置token,每次调用接口后刷新token
+                    resetToken();
+                    String resultBody = response.body().string();
+                    logger.error("resultBody----" + resultBody);
+                    JSONObject result = JSONObject.parseObject(resultBody);
+                    logger.error("respMap----" + result);
+
+                    if (result.get("code").equals("0") || Integer.parseInt(result.get("code").toString()) == 0) {
+                        JSONArray data = result.getJSONArray("data");
+                        int pageCount = result.getInteger("pageCount");
+                        jsonArray.add(data);
+                        if (pageIndex >= pageCount) {
+                            break;
+                        }
+                        pageIndex++;
 
-            OkHttpClient client = new OkHttpClient.Builder().build();
-            MediaType mediaType = MediaType.parse("application/json");
-            RequestBody body = RequestBody.create(mediaType, payload);
-            Request.Builder requestBuilder = new Request.Builder()
-                    .url(propt.getProperty("getMJPath"))
-                    .method("POST", body)
-                    .addHeader("Content-Type", "application/json");
-            // 批量添加请求头
-            for (Map.Entry<String, String> header : headers.entrySet()) {
-                requestBuilder.header(header.getKey(), header.getValue());
-            }
-            Response response = client.newCall(requestBuilder.build()).execute();
-            logger.error("response----" + response.isSuccessful());
-            if (response.isSuccessful()) {
-                //重置token,每次调用接口后刷新token
-                resetToken();
-                ObjectMapper mapper = new ObjectMapper();
-                String resultBody = response.body().string();
-                logger.error("resultBody----" + resultBody);
-                JSONObject result = JSONObject.parseObject(resultBody);
-                logger.error("respMap----" + result);
-                if (result.get("code").equals("0") || Integer.parseInt(result.get("code").toString()) == 0) {
-                    String data = result.get("data").toString();
-                    JSONArray jsonArray = JSONArray.parseArray(data);
-                    logger.error("jsonArray---" + jsonArray.toString());
-                    logger.error("jsonArray---" + jsonArray.size());
-                    IPerson iPerson = PersonFactory.getLocalInstance(ctx);
-                    PersonCollection personCollection = iPerson.getPersonCollection("select number ");
-                    Set set = new HashSet();
-                    for (int i = 0; i < personCollection.size(); i++) {
-                        PersonInfo personInfo = personCollection.get(i);
-                        set.add(personInfo.getNumber().toString());
-                    }
-                    for (int i = 0; i < jsonArray.size(); i++) {
-                        JSONObject resultData = jsonArray.getJSONObject(i);
-                        //保存门禁打卡记录
-                        saveMJPunchCardData(ctx, resultData, set);
                     }
                 }
             }
@@ -140,18 +131,81 @@ public class SyncTranForMJFacadeControllerBean extends AbstractSyncTranForMJFaca
             e.printStackTrace();
             throw new BOSException(e.getMessage());
         }
+
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONArray resultData = jsonArray.getJSONArray(i);
+
+            //保存门禁打卡记录
+            saveMJPunchCardData(ctx, resultData);
+        }
+    }
+
+    /**
+     * 日期格式装换
+     *
+     * @param date
+     */
+    private String dateFormatConversion(String date) {
+        // 定义输入日期时间字符串的格式
+        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        // 解析输入的字符串为 LocalDateTime 对象
+        LocalDateTime localDateTime = LocalDateTime.parse(date, inputFormatter);
+        // 将 LocalDateTime 对象转换为 OffsetDateTime 对象,并指定时区偏移为 +08:00
+        OffsetDateTime offsetDateTime = localDateTime.atOffset(ZoneOffset.of("+08:00"));
+        // 定义输出的日期时间格式,即 ISO 8601 格式
+        DateTimeFormatter outputFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+        // 将 OffsetDateTime 对象格式化为目标字符串
+        String outputDateStr = offsetDateTime.format(outputFormatter);
+        return outputDateStr;
+    }
+
+    /**
+     * 获取前三天的时间
+     *
+     * @param startDate
+     * @return
+     * @throws ParseException
+     */
+    private JSONObject buildRequestParams(int pageIndex, String startDate, String endDate) {
+        JSONObject params = new JSONObject();
+        params.put("pageIndex", pageIndex);
+        params.put("pageSize", propt.getProperty("pageSize"));
+        params.put("eventResult", 1);
+        String array = propt.getProperty("array");
+        String array2 = propt.getProperty("array2");
+        Set<String> set = AtsUtil.toSet(array + array2);
+        params.put("pointCodes", set);//门点编号
+        // 获取当前时间,并设置为 UTC+8 时区
+        ZonedDateTime now = ZonedDateTime.now(ZoneOffset.ofHours(8));
+        // 获取前两天的日期时间
+        ZonedDateTime twoDaysAgo = now.minusDays(2);
+        ZonedDateTime plusDays = now.plusDays(1);
+        // 定义目标格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
+        // 格式化时间 当前时间前两天
+        String formattedTime = twoDaysAgo.format(formatter);
+        String plusDaysTime = plusDays.format(formatter);
+        // 输出结果
+        if (!StringUtils.isEmpty(startDate) && !StringUtils.isEmpty(endDate)) {
+            params.put("minEventTime", dateFormatConversion(startDate));
+            params.put("maxEventTime", dateFormatConversion(endDate));
+        } else {
+            params.put("minEventTime", formattedTime);
+            params.put("maxEventTime", plusDaysTime);
+        }
+        return params;
     }
 
+
     /**
      * 保存门禁打卡记录
      *
      * @param ctx
-     * @param resultData
+     * @param jsonArray
      */
-    public void saveMJPunchCardData(Context ctx, JSONObject resultData, Set set) {
+    public void saveMJPunchCardData(Context ctx, JSONArray jsonArray) {
         logger.error("saveMJPunchCardData----");
         try {
-
             int success = 0;
             int error = 0;
             Set<String> setCardId = new HashSet();
@@ -166,71 +220,83 @@ public class SyncTranForMJFacadeControllerBean extends AbstractSyncTranForMJFaca
             //存储考勤日期为空的数据
             JSONArray notExistRecords = new JSONArray();
             JSONArray seccussArray = new JSONArray();
-            ++success;
-            String personNumber = resultData.getString("empCode");//员工编码
-            String punchCardDate = resultData.getString("checkTime"); //打卡时间
-            String RecDate = punchCardDate.substring(0, 10);// 考勤日期
-            String RecTime = punchCardDate.substring(11, 19);// 考勤时间
-            //String locationDetail = resultSet.getString("name"); //打卡地点
-            //String EquNo = resultSet.getString("EquNo"); //考勤机编码
-            //String exceptionType = resultSet.getString("EquNo"); // 打卡/异常类型
-            //Date punchDate = HRTimeWebUtils.stringToShortDate(RecDate, true);
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
-            SimpleDateFormat sdfymd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            Date date = sdf.parse(punchCardDate);
-            String format = sdfymd.format(date);
-            Date punchDate = com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.stringToShortDate(RecDate, true);
-            Timestamp punchCardTime = com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.stringToTimestamp(format ,true);
-            // 处理数据
-            if (punchCardDate != null && punchCardTime != null) {
-                PunchCardRecordInfo cardInfo = new PunchCardRecordInfo();
-                //考勤机编码
-                cardInfo.setEquipmentNum("001");
-                //考勤编码
-                cardInfo.setAttendanceNum(personNumber);
-                //打卡日期
-                cardInfo.setPunchCardDate(punchDate);
-                //打卡时间
-                cardInfo.setPunchCardTime(punchCardTime);
-                // 打卡来源
-                cardInfo.setPunchCardSource(PunchCardSourceEnum.attenceMachine);
-                // 打卡位置
-                cardInfo.setPunchCardPlace((String) resultData.get("checkLocation"));
-                // 有效
-                PunchCardStateEnum punchCardStateEnum;
-                if ((boolean) resultData.get("isActive")) {
+            //获取员工编码
+            IPerson iPerson = PersonFactory.getLocalInstance(ctx);
+            PersonCollection personCollection = iPerson.getPersonCollection("select number ");
+            Set set = new HashSet();
+            for (int i = 0; i < personCollection.size(); i++) {
+                PersonInfo personInfo = personCollection.get(i);
+                set.add(personInfo.getNumber().toString());
+            }
+            for (int j = 0; j < jsonArray.size(); j++) {
+                JSONObject resultData = jsonArray.getJSONObject(j);
+                ++success;
+                String personNumber = resultData.getString("empCode");//员工编码
+                String punchCardDate = resultData.getString("eventTime"); //打卡时间
+                //String punchCardDate = resultData.getString("checkTime"); //打卡时间
+                String RecDate = punchCardDate.substring(0, 10);// 考勤日期
+                String RecTime = punchCardDate.substring(11, 19);// 考勤时间
+                //String locationDetail = resultSet.getString("name"); //打卡地点
+                //String EquNo = resultSet.getString("EquNo"); //考勤机编码
+                //String exceptionType = resultSet.getString("EquNo"); // 打卡/异常类型
+                //Date punchDate = HRTimeWebUtils.stringToShortDate(RecDate, true);
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
+                SimpleDateFormat sdfymd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                Date date = sdf.parse(punchCardDate);
+                String format = sdfymd.format(date);
+                Date punchDate = com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.stringToShortDate(RecDate, true);
+                Timestamp punchCardTime = com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.stringToTimestamp(format, true);
+                // 处理数据
+                if (punchCardDate != null && punchCardTime != null) {
+                    PunchCardRecordInfo cardInfo = new PunchCardRecordInfo();
+                    //考勤机编码
+                    cardInfo.setEquipmentNum("001");
+                    //考勤编码
+                    cardInfo.setAttendanceNum(personNumber);
+                    //打卡日期
+                    cardInfo.setPunchCardDate(punchDate);
+                    //打卡时间
+                    cardInfo.setPunchCardTime(punchCardTime);
+                    // 打卡来源
+                    cardInfo.setPunchCardSource(PunchCardSourceEnum.attenceMachine);
+                    // 打卡位置
+                    cardInfo.setPunchCardPlace((String) resultData.get("pointName"));
+                    // 有效
+                    PunchCardStateEnum punchCardStateEnum;
+                    //if ((boolean) resultData.get("isActive")) {
+                    //    punchCardStateEnum = PunchCardStateEnum.normal;
+                    //} else {
+                    //    punchCardStateEnum = PunchCardStateEnum.cancelled;
+                    //}
                     punchCardStateEnum = PunchCardStateEnum.normal;
-                } else {
-                    punchCardStateEnum = PunchCardStateEnum.cancelled;
-                }
-                cardInfo.setPunchCardState(punchCardStateEnum);
-                ////简称
-                //cardInfo.setSimpleName(exceptionType);
-                //描述
-                cardInfo.setDescription("门禁打卡机");
-
-                EquNoSet.add("001");
-                if (!StringUtils.isEmpty(personNumber)) {
-                    if (!set.contains(personNumber)) {
-                        return;
+                    cardInfo.setPunchCardState(punchCardStateEnum);
+                    ////简称
+                    //cardInfo.setSimpleName(exceptionType);
+                    //描述
+                    cardInfo.setDescription("门禁打卡机");
+                    EquNoSet.add("001");
+                    if (!StringUtils.isEmpty(personNumber)) {
+                        if (!set.contains(personNumber)) {
+                            continue;
+                        }
+                        setCardId.add(personNumber);
+                        cardColl.add(cardInfo);
                     }
-                    setCardId.add(personNumber);
-                    cardColl.add(cardInfo);
-                }
 
-                if (minDateTime != null && maxDateTime != null) {
-                    if (punchCardTime.getTime() < minDateTime.getTime()) {
+                    if (minDateTime != null && maxDateTime != null) {
+                        if (punchCardTime.getTime() < minDateTime.getTime()) {
+                            minDateTime = punchCardTime;
+                        } else if (punchCardTime.getTime() > maxDateTime.getTime()) {
+                            maxDateTime = punchCardTime;
+                        }
+                    } else {
                         minDateTime = punchCardTime;
-                    } else if (punchCardTime.getTime() > maxDateTime.getTime()) {
                         maxDateTime = punchCardTime;
                     }
+
                 } else {
-                    minDateTime = punchCardTime;
-                    maxDateTime = punchCardTime;
+                    formatErrorRecords.add(resultData);
                 }
-
-            } else {
-                formatErrorRecords.add(resultData);
             }
             // 考勤档案
             Map<String, AttendanceFileInfo> attendanceFileMap = AttendanceFileFactory.getLocalInstance(ctx).getPersonByAttendanceNum(setCardId);
@@ -287,13 +353,15 @@ public class SyncTranForMJFacadeControllerBean extends AbstractSyncTranForMJFaca
             logger.error("notExistRecords-----" + notExistRecords.size());
             logger.error("seccussArray--Size-----" + seccussArray.size());
             logger.error("seccussArray-----" + seccussArray);
+            if(cardCollFinally.size()>=0){
             IObjectPK[] iObjectPKS = PunchCardRecordFactory.getLocalInstance(ctx).saveBatchData(cardCollFinally);
-            logger.error("iObjectPKS----" + iObjectPKS.length);
-        } catch (
-                Exception e) {
+                logger.error("iObjectPKS----" + iObjectPKS.length);
+            }
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
+
     /**
      * 重置token,每次调用接口后刷新token
      */
@@ -352,7 +420,7 @@ public class SyncTranForMJFacadeControllerBean extends AbstractSyncTranForMJFaca
         try {
             com.alibaba.fastjson.JSONObject params = new com.alibaba.fastjson.JSONObject();
             params.put("account", propt.getProperty("account"));
-            String password = propt.getProperty("password");
+            String password = propt.getProperty("passwordMj");
             params.put("password", EncryptUtils.sha256(password, false));
             String payload = params.toJSONString();
             String getTokenPath = propt.getProperty("getTokenPath");

+ 75 - 6
src/com/kingdee/eas/custom/synctask/SyncTranForOAFacadeControllerBean.java

@@ -521,6 +521,9 @@ public class SyncTranForOAFacadeControllerBean extends AbstractSyncTranForOAFaca
             sic.add("primaryPosition.id");
             sic.add("primaryPosition.name");
             sic.add("primaryPosition.number");
+            //获取职位上面的上级职位的人员
+            sic.add("primaryPosition.parent.number");
+            sic.add("primaryPosition.parent.name");
             EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
             PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(entityViewInfo);
             //参加工作日期
@@ -535,6 +538,8 @@ public class SyncTranForOAFacadeControllerBean extends AbstractSyncTranForOAFaca
                 personOtherInfoMap.put(personOtherInfoInfo.getPerson().getId().toString()
                         , personOtherInfoInfo.getJobStartDate());
             }
+
+            //调用同步oa操作
             Set setPersonIds = new HashSet();
             for (int i = 0; i < personPositionCollection.size(); i++) {
                 //职业信息
@@ -622,7 +627,7 @@ public class SyncTranForOAFacadeControllerBean extends AbstractSyncTranForOAFaca
      * @return
      */
     public PersonEntity packagingPerson(Context ctx, PersonPositionInfo personPositionInfo, Map<String, Date> personOtherInfoMap, ActionTypeEnum action) throws
-            BOSException, EASBizException {
+            BOSException, EASBizException, SQLException, IOException {
         SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd");
         //人员
         PersonInfo personInfo = personPositionInfo.getPerson();
@@ -641,11 +646,22 @@ public class SyncTranForOAFacadeControllerBean extends AbstractSyncTranForOAFaca
         //岗位
         PositionInfo primaryPosition = personPositionInfo.getPrimaryPosition();
         person.setJobtitle(primaryPosition.getNumber());
-        //直接上级 @todo
-        IObjectValue immediateSu = (IObjectValue) personInfo.get("immediateSu");
-        if (immediateSu != null) {
-            person.setManagerid((String) immediateSu.get("number"));
+        //直接上级
+        //获取所以职位对应的人员
+        String getParentPersonSql = getParentPersonSql(personInfo.getNumber());
+        IRowSet iRowSet = DbUtil.executeQuery(ctx, getParentPersonSql);
+        String personNumber = "";
+        while (iRowSet.next()) {
+            String positionNumber = iRowSet.getString("positionNumber");
+            personNumber = iRowSet.getString("personNumber");
         }
+        if (!StringUtils.isEmpty(personNumber)) {
+            person.setManagerid(personNumber);
+        }
+        //IObjectValue immediateSu = (IObjectValue) personInfo.get("immediateSu");
+        //if (immediateSu != null) {
+        //    person.setManagerid((String) immediateSu.get("number"));
+        //}
         //助理 @todo
         //person.setAssistantid("");
         //状态
@@ -682,7 +698,7 @@ public class SyncTranForOAFacadeControllerBean extends AbstractSyncTranForOAFaca
         //登录名称
         person.setLoginid(personInfo.getNumber());
         //明文密码,会转密文  默认:Scy$1234
-        if (action == ActionTypeEnum.ADD) {
+        if (action == ActionTypeEnum.ADD || !isPersonExistOA(personInfo.getNumber())) {
             person.setPassword("Scy$1234");
         }
         //安全级别
@@ -866,4 +882,57 @@ public class SyncTranForOAFacadeControllerBean extends AbstractSyncTranForOAFaca
         }
         return 0;
     }
+
+    /**
+     * 获取所有人员直接上级
+     * <p>
+     * select position.fnumber as positionNumber , personParent.fnumber from T_ORG_PositionMember positioonMenber
+     * left join T_ORG_Position position on position.fid = positioonMenber.FPositionID
+     * left join T_ORG_Position positionParent on position.fid = positionParent.FPARENTID
+     * left join T_HR_EmpOrgRelation empOrgRelation on empOrgRelation.FPOSITIONID  = positionParent.fid
+     * left join t_Bd_person person on person.fid = empOrgRelation.FPERSONID and empOrgRelation.FIsSystem='1'
+     * left join  t_Bd_person personParent on  personParent.fid = positioonMenber.FPERSONID
+     * where  person.fname_l2 = '王玲娇'
+     */
+    public String getParentPersonSql(String personNumber) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("select").append("\n");
+        sb.append(" position.fnumber as positionNumber , personParent.fnumber as personNumber,position.fname_l2,personParent.fname_l2").append("\n");
+        sb.append("from T_ORG_PositionMember positioonMenber").append("\n");
+        sb.append("left join T_ORG_Position position on position.fid = positioonMenber.FPositionID").append("\n");
+        sb.append("left join T_ORG_Position positionParent on position.fid = positionParent.FPARENTID ").append("\n");
+        sb.append("left join T_HR_EmpOrgRelation empOrgRelation on empOrgRelation.FPOSITIONID  = positionParent.fid and FAssignType = 1").append("\n");
+        sb.append("left join t_Bd_person person on person.fid = empOrgRelation.FPERSONID and empOrgRelation.FIsSystem='1'").append("\n");
+        sb.append("left join  t_Bd_person personParent on  personParent.fid = positioonMenber.FPERSONID ").append("\n");
+        sb.append("where  person.fnumber = '" + personNumber + "'").append("\n");
+        return sb.toString();
+    }
+
+    /**
+     * 判断oa是否存在该人员
+     */
+    public boolean isPersonExistOA(String personNumber) throws BOSException, IOException {
+        OkHttpClient client = new OkHttpClient();
+        String params = String.format("token = %s &params = {\"workcode\":\"%s\"}", getToken(), personNumber);
+        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
+        RequestBody body = RequestBody.create(mediaType, params);
+        Request request = new Request.Builder()
+                .url("http://oa.shichuangyi.cn:8080/api/hrm/resful/getHrmUserInfoWithPage")
+                .post(body)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("Accept", "*/*")
+                .addHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0")
+                .addHeader("Connection", "keep-alive")
+                .build();
+        Response response = client.newCall(request).execute();
+        String respBody = response.body().string();
+        JSONObject respMap = JSONObject.parseObject(respBody);
+        JSONObject data = respMap.getJSONObject("data");
+        Integer totalSize = data.getInteger("totalSize");
+        if (totalSize > 0) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 }

+ 123 - 0
src/com/kingdee/eas/custom/synctask/utils/IOTApiUtil.java

@@ -0,0 +1,123 @@
+package com.kingdee.eas.custom.synctask.utils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.kingdee.eas.utils.ExpiringMapCache;
+import okhttp3.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.DigestUtils;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description IOT平台接口工具类
+ * @Date 2024/11/4 19:49
+ * @Created by Heyuan
+ */
+public class IOTApiUtil {
+    private static ExpiringMapCache<String, String> cache = new ExpiringMapCache();
+
+    /**
+     * 获取token
+     * 本地缓存token,有效时长6.5小时
+     *
+     * @return
+     */
+    public static String getToken() {
+        String token = cache.get("token");
+        if (StringUtils.isBlank(token)) {
+            token = getTokenByRemote();
+            cache.put("token", token, 27000000);//6.5小时
+        }
+        return token;
+    }
+
+
+    public void syncOrg() {
+        Response response = null;
+        Map result = null;
+        try {
+            String url = "http://10.0.3.87/api/open/enterpriseright/org-manage/v1/external/org/batch";
+            OkHttpClient client = new OkHttpClient();
+            MediaType mediaType = MediaType.parse("application/json");
+            RequestBody body = RequestBody.create(mediaType, "{\r\n  \"data\": [\r\n    {\r\n      \"id\": \"2\",\r\n      \"name\": \"深圳总公司\",\r\n      \"code\": \"szzgs\",\r\n      \"type\": 2,\r\n      \"description\": \"\",\r\n      \"params\": {\r\n        \"status\": \"1\"\r\n      }\r\n    }\r\n  ],\r\n  \"dataSyncRule\": 1\r\n}");
+            Request request = new Request.Builder()
+                    .url(url)
+                    .post(body)
+                    .addHeader("Authorization", getToken())
+                    .addHeader("Content-Type", "application/json")
+                    .build();
+            response = client.newCall(request).execute();
+            String string = response.body().string();
+            ObjectMapper objectMapper = new ObjectMapper();
+            result = objectMapper.readValue(string, Map.class);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("同步IOT平台组织失败: " + e.getMessage());
+        }
+        if (response.isSuccessful()) {
+            //return (String) result.get("token");
+        } else {
+            throw new RuntimeException((String) result.get("msg"));
+        }
+    }
+
+
+    /**
+     * 远程获取Token
+     *
+     * @return
+     */
+    private static String getTokenByRemote() {
+        Response response = null;
+        Map result = null;
+        try {
+            long now = System.currentTimeMillis();
+            Map<String, String> params = new HashMap<>();
+            String secret = "c0fd314792e6bd6f329f86b8a46a7dd1d335136a";
+            String url = "http://10.0.3.87/api/justauth/generate/v1/visitor/token";
+            params.put("appid", "vS5LOofb");
+            params.put("sign_method", "md5");
+            params.put("timestamp", now + secret);
+            //生成签名
+            String sign = DigestUtils.md5DigestAsHex((appendUrl(null, params)).getBytes());
+            params.put("timestamp", String.valueOf(now));
+            params.put("sign", sign);
+            String requestUrl = appendUrl(url, params);
+            OkHttpClient client = new OkHttpClient().newBuilder()
+                    .build();
+            Request request = new Request.Builder()
+                    .url(requestUrl)
+                    .get()
+                    .build();
+            response = client.newCall(request).execute();
+            String string = response.body().string();
+            ObjectMapper objectMapper = new ObjectMapper();
+            result = objectMapper.readValue(string, Map.class);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("远程获取IOT平台token失败: " + e.getMessage());
+        }
+        if (response.isSuccessful()) {
+            return (String) result.get("token");
+        } else {
+            throw new RuntimeException((String) result.get("msg"));
+        }
+    }
+
+    /**
+     * 拼接地址参数
+     */
+    private static String appendUrl(String url, Map<String, String> data) {
+        StringBuilder paramStr = new StringBuilder();
+        for (String key : data.keySet()) {
+            paramStr.append(key).append("=").append(data.get(key)).append("&");
+        }
+        paramStr.deleteCharAt(paramStr.lastIndexOf("&"));
+        if (!StringUtils.isEmpty(url)) {
+            return url.contains("?") ? (url + "&" + paramStr) : (url + "?" + paramStr);
+        }
+        return paramStr.toString();
+    }
+}

+ 3 - 232
websrc/com/kingdee/eas/custom/synctask/handler/PunchCardRecordListHandlerEx.java

@@ -23,31 +23,6 @@ import java.util.*;
  */
 public class PunchCardRecordListHandlerEx extends PunchCardRecordListHandler {
     private Context ctx = SHRContext.getInstance().getContext();
-    private Properties propt = new Properties();
-
-    public PunchCardRecordListHandlerEx() throws BOSException {
-        String syncOAConfigPath = System.getProperty("EAS_HOME") + "/server/properties/scy/syncMJConfig.properties";
-        try {
-            propt.load(new FileInputStream(syncOAConfigPath));
-        } catch (IOException e) {
-            e.printStackTrace();
-            String errorMsg = "获取配置文件报错,请检查配置:" + syncOAConfigPath + "   " + e.getMessage();
-            throw new BOSException(errorMsg);
-        }
-    }
-
-    /**
-     * 获取数据库打卡记录
-     *
-     * @param request
-     * @param response
-     * @param modelMap
-     * @throws BOSException
-     */
-    public void syncZKPunchCardDataAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException {
-        SyncTranForMJFacadeFactory.getLocalInstance(ctx).syncPunchRecordFromMJ(null, null);
-        //syncZKPunchCardData(request, response, modelMap);
-    }
 
     /**
      * 获取门禁打卡记录
@@ -58,216 +33,12 @@ public class PunchCardRecordListHandlerEx extends PunchCardRecordListHandler {
      * @throws BOSException
      */
     public void syncPunchRecordFromMJAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException {
-        SyncTranForMJFacadeFactory.getLocalInstance(ctx).syncAccessRecord("", "");
+        String startDate = request.getParameter("startDate");
+        String endDate = request.getParameter("endDate");
+        SyncTranForMJFacadeFactory.getLocalInstance(ctx).syncAccessRecord(startDate + " 00:00:00", endDate + " 23:59:59");
         //syncZKPunchCardData(request, response, modelMap);
         //_syncAccessRecord(ctx, null, null);
     }
 
 
-    //public void syncZKPunchCardData(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) {
-    //    //String url = "jdbc:sqlserver://10.0.3.23:1433;databaseName=kaoqin";
-    //    String url = "jdbc:sqlserver://10.0.3.23:1433;databaseName=kaoqin;encrypt=true;trustServerCertificate=true;";
-    //    String username = "zhongkong";
-    //    String password = "6554+oijhh@";
-    //    try {
-    //        // 加载SQL Server JDBC驱动程序
-    //        //Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
-    //        // 建立连接
-    //        Connection connection = DriverManager.getConnection(url, username, password);
-    //        // 创建Statement对象
-    //        Statement statement = connection.createStatement();
-    //        //获取当前时间以及一个月前的时间
-    //        // 获取当前日期
-    //        Date now = new Date();
-    //        Calendar calendar = Calendar.getInstance();
-    //        calendar.setTime(now);
-    //        // 将月份减1(这里只是简单的月份减1,没有考虑日期边界等复杂情况)
-    //        calendar.add(Calendar.MONTH, -1);
-    //        Date one_month_ago = calendar.getTime();
-    //        // 获取当前日期
-    //        Date currentDate = new Date();
-    //        // 使用Calendar类来操作日期
-    //        Calendar calendarNewDate = Calendar.getInstance();
-    //        calendarNewDate.setTime(currentDate);
-    //        // 在当前日期基础上加1天
-    //        calendarNewDate.add(Calendar.DAY_OF_MONTH, 1);
-    //        Date newDate = calendarNewDate.getTime();
-    //        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-    //        String oneMOnthDate = sdf.format(one_month_ago);
-    //        String nowDate = sdf.format(newDate);
-    //        logger.error("PunchCardRecordEx----oneMOnthDate--" + oneMOnthDate);
-    //        logger.error("PunchCardRecordEx----nowDate--" + nowDate);
-    //        int success = 0;
-    //        int error = 0;
-    //        // 执行查询语句
-    //        //String query = "select \n" +
-    //        //        "userinfo.SSN as personNumber ,\n" +
-    //        //        "checkin.CHECKTIME as checkTime\n" +
-    //        //        "from  checkinout as checkin\n" +
-    //        //        "left join USERINFO as userinfo on userinfo.USERID = checkin.USERID\n" +
-    //        //        "where checkin.CHECKTIME >='" + oneMOnthDate + "' and checkin.CHECKTIME <='" + nowDate + "'\n";
-    //        String query = "\n" +
-    //                " \n" +
-    //                "select \n" +
-    //                "userinfo.SSN as personNumber ,\n" +
-    //                "checkin.CHECKTIME as checkTime\n" +
-    //                "from  checkinout as checkin\n" +
-    //                "left join USERINFO as userinfo on userinfo.USERID = checkin.USERID\n" +
-    //                "where checkin.CHECKTIME >='2024-10-30' and checkin.CHECKTIME <='2024-10-31'\n" +
-    //                " ";
-    //        ResultSet resultSet = statement.executeQuery(query);
-    //        Set<String> setCardId = new HashSet();
-    //        Set<String> EquNoSet = new HashSet();
-    //        Timestamp minDateTime = null;
-    //        Timestamp maxDateTime = null;
-    //        CoreBaseCollection cardCollFinally = new CoreBaseCollection();
-    //        CoreBaseCollection cardColl = new CoreBaseCollection();
-    //        JSONArray formatErrorRecords = new JSONArray();
-    //        //存储相同的数据
-    //        JSONArray duplicateRecords = new JSONArray();
-    //        //存储考勤日期为空的数据
-    //        JSONArray notExistRecords = new JSONArray();
-    //
-    //        JSONArray seccussArray = new JSONArray();
-    //
-    //        // 处理查询结果
-    //        while (resultSet.next()) {
-    //            ++success;
-    //            String personNumber = resultSet.getString("personNumber");//员工编码
-    //            String punchCardDate = resultSet.getString("checkTime"); //打卡时间
-    //            String RecDate = punchCardDate.substring(0, 10);// 考勤日期
-    //            String RecTime = punchCardDate.substring(11, 19);// 考勤时间
-    //            //String locationDetail = resultSet.getString("name"); //打卡地点
-    //            //String EquNo = resultSet.getString("EquNo"); //考勤机编码
-    //            //String exceptionType = resultSet.getString("EquNo"); // 打卡/异常类型
-    //            //Date punchDate = HRTimeWebUtils.stringToShortDate(RecDate, true);
-    //            Date punchDate = com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.stringToShortDate(RecDate, true);
-    //            Timestamp punchCardTime = com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.stringToTimestamp(punchCardDate, true);
-    //            // 处理数据
-    //            if (punchCardDate != null && punchCardTime != null) {
-    //                PunchCardRecordInfo cardInfo = new PunchCardRecordInfo();
-    //                //考勤机编码
-    //                cardInfo.setEquipmentNum("001");
-    //                //考勤编码
-    //                cardInfo.setAttendanceNum(personNumber);
-    //                //打卡日期
-    //                cardInfo.setPunchCardDate(punchDate);
-    //                //打卡时间
-    //                cardInfo.setPunchCardTime(punchCardTime);
-    //                // 打卡来源
-    //                cardInfo.setPunchCardSource(PunchCardSourceEnum.mobileRegistration);
-    //                // 打卡位置
-    //                cardInfo.setPunchCardPlace("考勤机打卡");
-    //                // 有效
-    //                cardInfo.setPunchCardState(PunchCardStateEnum.normal);
-    //                ////简称
-    //                //cardInfo.setSimpleName(exceptionType);
-    //                //描述
-    //                //cardInfo.setDescription(exceptionType);
-    //
-    //                EquNoSet.add("001");
-    //                if (!StringUtils.isEmpty(personNumber)) {
-    //                    setCardId.add(personNumber);
-    //                    cardColl.add(cardInfo);
-    //                }
-    //
-    //                if (minDateTime != null && maxDateTime != null) {
-    //                    if (punchCardTime.getTime() < minDateTime.getTime()) {
-    //                        minDateTime = punchCardTime;
-    //                    } else if (punchCardTime.getTime() > maxDateTime.getTime()) {
-    //                        maxDateTime = punchCardTime;
-    //                    }
-    //                } else {
-    //                    minDateTime = punchCardTime;
-    //                    maxDateTime = punchCardTime;
-    //                }
-    //
-    //            } else {
-    //                formatErrorRecords.add(resultSet);
-    //            }
-    //        }
-    //        // 考勤档案
-    //        Map<String, AttendanceFileInfo> attendanceFileMap = AttendanceFileFactory.getLocalInstance(ctx).getPersonByAttendanceNum(setCardId);
-    //        logger.error("attendanceFileMap-----" + attendanceFileMap);
-    //        //相同的数据
-    //        PunchCardRecordCollection existColl = this.getExistedPunchCardRecordCollection(ctx, minDateTime, maxDateTime, setCardId);
-    //        logger.error("existColl-----" + existColl.size());
-    //        for (int i = 0; i < cardColl.size(); ++i) {
-    //            Map map = new HashMap();
-    //            // 原始打卡记录实体
-    //            PunchCardRecordInfo cardInfo = (PunchCardRecordInfo) cardColl.get(i);
-    //            JSONObject jsObject = new JSONObject();
-    //            jsObject.put("deviceid", cardInfo.getEquipmentNum()); // deviceid --EquNo
-    //            jsObject.put("userid", cardInfo.getAttendanceNum()); // userid --CardId
-    //            jsObject.put("RecDate", com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.dateShortToString(cardInfo.getPunchCardDate())); //checkin_time --RecDate
-    //            jsObject.put("RecTime", com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.timestampToString(cardInfo.getPunchCardTime()).substring(11)); //checkin_time --RecDate
-    //            map.put("userid", cardInfo.getAttendanceNum());
-    //            map.put("RecDate", com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils.dateShortToString(cardInfo.getPunchCardDate()));
-    //            map.put("RecTime", HRTimeWebUtils.timestampToString(cardInfo.getPunchCardTime()).substring(11));
-    //            //员工是否有考勤档案
-    //            if (attendanceFileMap.containsKey(cardInfo.getAttendanceNum())) {
-    //                if (existColl.contains(cardInfo)) {
-    //                    duplicateRecords.add(jsObject);
-    //                } else {
-    //                    // 打卡位置 ,考勤机 的地址
-    //                    cardInfo.setPunchCardPlace(cardInfo.getPunchCardPlace());
-    //                    //打卡来源
-    //                    cardInfo.setPunchCardSource(PunchCardSourceEnum.mobileRegistration);
-    //                    // 考勤实体
-    //                    AttendanceFileInfo attendanceFileInfo = (AttendanceFileInfo) attendanceFileMap.get(cardInfo.getAttendanceNum());
-    //                    // 姓名
-    //                    cardInfo.setProposer(attendanceFileInfo.getProposer());
-    //                    // HR 组织
-    //                    cardInfo.setHrOrgUnit(attendanceFileInfo.getHrOrgUnit());
-    //                    //行政组织
-    //                    cardInfo.setAdminOrgUnit(attendanceFileInfo.getAdminOrgUnit());
-    //                    cardInfo.setCreator((UserInfo) ctx.get("UserInfo"));
-    //                    cardInfo.setLastUpdateUser((UserInfo) ctx.get("UserInfo"));
-    //                    cardInfo.setCreateTime(new Timestamp((new Date()).getTime()));
-    //                    cardInfo.setLastUpdateTime(new Timestamp((new Date()).getTime()));
-    //                    cardCollFinally.add(cardInfo);
-    //                }
-    //                seccussArray.add(map);
-    //            } else {
-    //                ++error;
-    //                notExistRecords.add(jsObject);
-    //            }
-    //        }
-    //        logger.error("cardCollFinally-----" + cardCollFinally.size());
-    //        logger.error("success-----" + success);
-    //        logger.error("error-----" + error);
-    //        logger.error("notExistRecords--list---" + notExistRecords);
-    //        logger.error("notExistRecords-----" + notExistRecords.size());
-    //        logger.error("seccussArray--Size-----" + seccussArray.size());
-    //        logger.error("seccussArray-----" + seccussArray);
-    //        IObjectPK[] iObjectPKS = PunchCardRecordFactory.getLocalInstance(ctx).saveBatchData(cardCollFinally);
-    //        logger.error("iObjectPKS----" + iObjectPKS.length);
-    //        JSONUtils.SUCCESS(iObjectPKS);
-    //        // 关闭连接
-    //        resultSet.close();
-    //        statement.close();
-    //        connection.close();
-    //
-    //    } catch (Exception e) {
-    //        e.printStackTrace();
-    //    }
-    //}
-    //
-    //private PunchCardRecordCollection getExistedPunchCardRecordCollection(Context ctx, Timestamp minDateTime, Timestamp maxDateTime, Set<String> setCardId) throws BOSException {
-    //    EntityViewInfo evi = new EntityViewInfo();
-    //    FilterInfo fi = new FilterInfo();
-    //    evi.setFilter(fi);
-    //    evi.getSelector().add(new SelectorItemInfo("punchCardDate"));
-    //    evi.getSelector().add(new SelectorItemInfo("punchCardTime"));
-    //    evi.getSelector().add(new SelectorItemInfo("punchCardSource"));
-    //    evi.getSelector().add(new SelectorItemInfo("equipmentNum"));
-    //    evi.getSelector().add(new SelectorItemInfo("attendanceNum"));
-    //    fi.getFilterItems().add(new FilterItemInfo("attendanceNum", setCardId, CompareType.INCLUDE));
-    //    fi.getFilterItems().add(new FilterItemInfo("punchCardTime", maxDateTime, CompareType.LESS_EQUALS));
-    //    fi.getFilterItems().add(new FilterItemInfo("punchCardTime", minDateTime, CompareType.GREATER_EQUALS));
-    //    PunchCardRecordCollection existColl = PunchCardRecordFactory.getLocalInstance(ctx).getPunchCardRecordCollection(evi);
-    //    return existColl;
-    //
-    //}
-
 }