Ver código fonte

oa iot同步 出差单下载模板

“luojun” 6 meses atrás
pai
commit
1c4138c395

+ 88 - 0
websrc/com/kingdee/eas/custom/synctask/handler/AtsTripBillEditHandlerEx.java

@@ -0,0 +1,88 @@
+package com.kingdee.eas.custom.synctask.handler;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.eas.base.permission.UserInfo;
+import com.kingdee.eas.util.app.ContextUtil;
+import com.kingdee.shr.ats.web.handler.AtsTripBillEditHandler;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+import com.kingdee.shr.base.syssetting.web.dynamic.util.DynamicUtil;
+import com.kingdee.shr.base.syssetting.web.dynamic.util.MD5;
+import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
+import com.kingdee.shr.base.syssetting.web.util.UserUtil;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfStamper;
+import org.apache.log4j.Logger;
+import org.springframework.ui.ModelMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.*;
+import java.text.MessageFormat;
+import java.util.*;
+
+/**
+ * @author qingwu
+ * @date 2024/11/13
+ * @apiNote
+ * 员工自助我要出差
+ */
+public class AtsTripBillEditHandlerEx extends AtsTripBillEditHandler {
+    Logger logger = Logger.getLogger(AtsTripBillEditHandlerEx.class);
+
+
+    /**
+     * @param request
+     * @param response
+     * @param modelMap
+     * @throws BOSException
+     * @throws ShrWebBizException
+     */
+    public void evectionTemplateAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws ShrWebBizException {
+        logger.error("evectionTemplateAction---");
+        try {
+            Context ctx = SHRContext.getInstance().getContext();//上下文
+
+            HttpSession session = request.getSession();
+            String tempFilePath = UserUtil.getUserTempDirAbsolutePath(session); //存放
+            File tempFile = new File(tempFilePath);
+            if (!tempFile.exists()) {
+                tempFile.mkdirs();
+            }
+            String path = System.getProperty("EAS_HOME") + "/server//lib/addon/customer/template/evectionTemplate.xlsx";
+            FileInputStream fileInputStream = new FileInputStream(path);
+            String zipName =   "outA.xlsx";
+            String zipNameHash = MD5.md5Hash(zipName);
+            String realFileName = getEncryRealFileName(ctx,zipNameHash);
+            String fileStr = zipNameHash;
+            File outFile = new File(tempFilePath + "/"+realFileName);
+            FileOutputStream fileOutputStream = new FileOutputStream(outFile);
+            byte[] buffer = new byte[1024];
+            int length;
+            while ((length = fileInputStream.read(buffer)) > 0) {
+                fileOutputStream.write(buffer, 0, length);
+            }
+            Map<String, String> map = new HashMap<>();
+            Map<String, String> param = new HashMap<String, String>();
+            param.put("method", "tmp");
+            param.put("file", zipNameHash);
+            //param.put("filename", fileStr+".xlsx");
+            param.put("filename","出差行程表.xlsx");
+            //String link = DynamicUtil.assembleUrl("/shr/downloadfile.do", param).replaceAll("\\+", "%20");
+            String link = DynamicUtil.assembleUrl("/shr/downloadfile.do", param);
+            map.put("msgType", "1");
+            map.put("link", link);
+            this.writeSuccessData(map);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ShrWebBizException(e.getMessage());
+        }
+    }
+    public static String getEncryRealFileName(Context ctx, String realFileName) {
+        UserInfo currentUserInfo = ContextUtil.getCurrentUserInfo(ctx);
+        return MessageFormat.format("{0}_{1}", realFileName, MD5.md5Hash(currentUserInfo.getId().toString()));
+    }
+}

+ 2 - 2
websrc/com/kingdee/eas/custom/synctask/handler/EmployeeListHandlerEx.java

@@ -144,7 +144,7 @@ public class EmployeeListHandlerEx extends EmployeeListHandler {
 
     /**
      * 同步IOT人员
-     *
+     *   后续如需部署生产去掉Ex
      * @param request
      * @param response
      * @param modelMap
@@ -152,7 +152,7 @@ public class EmployeeListHandlerEx extends EmployeeListHandler {
      * @throws EASBizException
      * @throws SHRWebException
      */
-    public void syncPersonToIotAction(HttpServletRequest request,
+    public void syncPersonToIotExAction(HttpServletRequest request,
                                       HttpServletResponse response,
                                       ModelMap modelMap) throws BOSException, ShrWebBizException {
         String billId = request.getParameter("billId");

+ 2 - 106
websrc/com/kingdee/eas/custom/synctask/handler/OrgUnitListHandlerEx.java

@@ -117,9 +117,9 @@ public class OrgUnitListHandlerEx extends OrgUnitListHandler {
      * @param request
      * @param response
      * @param modelMap
-     * @return
+     * @return  后续如需部署生产去掉Ex
      */
-    public Map syncOrgUnitToIotAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException {
+    public Map syncOrgUnitToIotExAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException {
         try {
             String billds = request.getParameter("billIds");
             logger.error("_syncOrgUnitToOA---billds: " + billds);
@@ -172,111 +172,7 @@ public class OrgUnitListHandlerEx extends OrgUnitListHandler {
         return null;
     }
 
-    /**
-     * 同步IOT平台
-     *
-     * @param request
-     * @param response
-     * @param modelMap
-     * @return
-     */
-    public Map syncOrgUnitToIotActionEx(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, EASBizException {
-        ISyncLog iSyncLog = SyncLogFactory.getLocalInstance(ctx);
-        SyncLogInfo syncLogInfo = new SyncLogInfo();
-        syncLogInfo.setEntityName(SyncEntityNameEnum.adminOrg);
-        syncLogInfo.setDataDirection(DataDirectionEnum.outflow);
-        syncLogInfo.setDockingSystem(DockingSystemEnum.IOT);
-        String billds = request.getParameter("billIds");
-        try {
-            logger.error("_syncOrgUnitToOA---start");
-            logger.error("_syncOrgUnitToOA---billds: " + billds);
-            IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx);
-            //String actionType = action == null ? "" : action.getValue().toLowerCase();
-            //当参数billIds不为空值时,增量同步参数中的部门数据到OA
-            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();
-            }
-            SelectorItemCollection sic = new SelectorItemCollection();
-            sic.add("*");
-            sic.add("parent.number");
-            sic.add("parent.id");
-            sic.add("responPosition.name");
-            sic.add("responPosition.number");
-            sic.add("unitLayerType.number");
-            sic.add("unitLayerType.name");
-            EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
-            AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection(entityViewInfo);
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("dataSyncRule", 1);//1:组织ID存在时更新 2:组织ID存在时跳过不更新。默认值1
-            List dataList = new ArrayList();
 
-            for (int i = 0; i < adminOrgUnitCollection.size(); i++) {
-                Map adminMap = new HashMap();
-                AdminOrgUnitInfo adminOrgUnitInfo = adminOrgUnitCollection.get(i);
-                OrgUnitLayerTypeInfo unitLayerType = adminOrgUnitInfo.getUnitLayerType();//行政组织类型
-                String number = unitLayerType.getNumber();
-                String adminOrgType = String.valueOf(personStatusMap.getOrDefault(number, 8));
-                adminMap.put("id", adminOrgUnitInfo.getId().toString());//来源方组织ID
-                adminMap.put("code", adminOrgUnitInfo.getNumber());//组织编码
-                adminMap.put("name", adminOrgUnitInfo.getName());//组织名称
-                adminMap.put("type", adminOrgType);//组织类型
-                adminMap.put("description", "");//描述信息
-                adminMap.put("parentId", adminOrgUnitInfo.getParent().getId().toString());//来源方上级组织ID
-                dataList.add(adminMap);
-            }
-            jsonObject.put("data", dataList);//1:组织ID存在时更新 2:组织ID存在时跳过不更新。默认值1
-            //执行同步组织到Iot
-            Map<String, List<Map<String, String>>> result = syncOrg(jsonObject.toString(), syncLogInfo);
-            logger.error("result---" + result);
-            List<Map<String, String>> list = result.get("data");
-            int success = adminOrgUnitCollection.size();
-            int failure = 0;
-            BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader();
-            if (list.size() > 0) {
-                failure = list.size();
-                for (int i = 0; i < list.size(); i++) {
-                    BatchMessageTipsBody body = new BatchMessageTipsBody();
-                    Map<String, String> map = list.get(i);
-                    body.setId(map.get("id"));
-                    body.setMuitTipsState(Boolean.FALSE);
-                    body.setMuitTipsMessage(map.get("msg"));
-                    batchMessageTipsHeader.addResult(body);
-                }
-                success -= list.size();
-            }
-            logger.error("handleEnableWithTips----- >> ");
-            batchMessageTipsHeader.setBillId(billds);
-            batchMessageTipsHeader.setFailureCount(failure);
-            batchMessageTipsHeader.setSuccessCount(success);
-            logger.error("batchMessageTipsHeader  " + batchMessageTipsHeader.getSuccessCount());
-            request.setAttribute("res_method_data", batchMessageTipsHeader);
-            this.writeSuccessData(batchMessageTipsHeader);
-            logger.error("handleEnableWithTips----- end ");
-
-            return null;
-        } catch (Exception e) {
-            e.printStackTrace();
-            syncLogInfo.setSyncStatus(SyncStatusEnum.ERROR);
-            syncLogInfo.setSyncResult(e.getMessage());
-            iSyncLog.save(syncLogInfo);
-            throw new BOSException(e.getMessage());
-        }
-
-    }
 
 
     /**

+ 440 - 0
websrc/com/kingdee/eas/custom/synctask/handler/PunchCardRecordListHandlerEx.java

@@ -1,15 +1,41 @@
 package com.kingdee.eas.custom.synctask.handler;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.kingdee.bos.BOSException;
 import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.metadata.entity.EntityViewInfo;
+import com.kingdee.bos.metadata.entity.FilterInfo;
+import com.kingdee.bos.metadata.entity.FilterItemInfo;
+import com.kingdee.bos.metadata.entity.SelectorItemInfo;
+import com.kingdee.bos.metadata.query.util.CompareType;
+import com.kingdee.eas.base.permission.UserInfo;
+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.custom.sso.ExpiringMapCache;
 import com.kingdee.eas.custom.synctask.SyncTranForMJFacadeFactory;
+import com.kingdee.eas.custom.synctask.utils.HRTimeWebUtils;
+import com.kingdee.eas.framework.CoreBaseCollection;
+import com.kingdee.eas.hr.ats.*;
 import com.kingdee.shr.ats.web.handler.PunchCardRecordListHandler;
 import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+import com.kingdee.util.StringUtils;
+import okhttp3.*;
 import org.apache.log4j.Logger;
 import org.springframework.ui.ModelMap;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * @Description TODO
@@ -19,11 +45,425 @@ import javax.servlet.http.HttpServletResponse;
 public class PunchCardRecordListHandlerEx extends PunchCardRecordListHandler {
     Logger logger = Logger.getLogger(PunchCardRecordListHandlerEx.class);
     private Context ctx = SHRContext.getInstance().getContext();
+    private Properties propt = new Properties();
 
+    private static ExpiringMapCache<String, String> cache = new ExpiringMapCache();
+    private long durationInMillis = 84600000;
+
+    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);
     }
+
+    /**
+     * 获取门禁打卡记录
+     *
+     * @param request
+     * @param response
+     * @param modelMap
+     * @throws BOSException
+     */
+    public void syncPunchRecordFromMJAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException {
+        //SyncTranForMJFacadeFactory.getLocalInstance(ctx).syncAccessRecord(null, null);
+        //syncZKPunchCardData(request, response, modelMap);
+        _syncAccessRecord(ctx, null, null);
+    }
+
+    /**
+     * 同步门禁打卡记录
+     *
+     * @param ctx
+     * @param startDate
+     * @param endDate
+     * @throws BOSException
+     */
+    protected void _syncAccessRecord(Context ctx, String startDate, String endDate) throws ShrWebBizException {
+        logger.error("_syncAccessRecord------");
+        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("getTokenPath", propt.getProperty("getTokenPath"));//获取token接口地址
+
+
+        try {
+            JSONObject params = new JSONObject();
+            params.put("count", "100");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            //获取前三天数据
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.DAY_OF_YEAR, -3);
+            Date threeDaysAgoDate = calendar.getTime();
+            //Date parse = sdf.parse("2022-01-01");
+            params.put("rowTimeStamp", threeDaysAgoDate.getTime());
+            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();
+                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(result.get("data").toString());
+                    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);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ShrWebBizException(e.getMessage());
+        }
+    }
+
+    /**
+     * 保存门禁打卡记录
+     *
+     * @param ctx
+     * @param resultData
+     */
+    public void saveMJPunchCardData(Context ctx, JSONObject resultData, Set set) {
+        logger.error("saveMJPunchCardData----");
+        try {
+
+            int success = 0;
+            int error = 0;
+            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();
+            ++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);
+            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.attenceMachine);
+                // 打卡位置
+                cardInfo.setPunchCardPlace((String) resultData.get("checkLocation"));
+                // 有效
+                PunchCardStateEnum punchCardStateEnum;
+                if ((boolean) resultData.get("isActive")) {
+                    punchCardStateEnum = PunchCardStateEnum.normal;
+                } else {
+                    punchCardStateEnum = PunchCardStateEnum.cancelled;
+                }
+                cardInfo.setPunchCardState(punchCardStateEnum);
+                ////简称
+                //cardInfo.setSimpleName(exceptionType);
+                //描述
+                //cardInfo.setDescription(exceptionType);
+
+                EquNoSet.add("001");
+                if (!StringUtils.isEmpty(personNumber)) {
+                    if (!set.contains(personNumber)) {
+                        return;
+                    }
+                    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(resultData);
+            }
+            // 考勤档案
+            Map<String, AttendanceFileInfo> attendanceFileMap = AttendanceFileFactory.getLocalInstance(ctx).getPersonByAttendanceNum(setCardId);
+            logger.error("attendanceFileMap-----" + attendanceFileMap);
+            logger.error("setCardId-----" + setCardId);
+            //相同的数据
+            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.attenceMachine);
+                        // 考勤实体
+                        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);
+        } catch (
+                Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 重置token,每次调用接口后刷新token
+     */
+    private void resetToken() {
+        String token = cache.get("token");
+        if (org.apache.commons.lang3.StringUtils.isBlank(token)) {
+            getTokenByRemote();
+        } else {
+            cache.put("token", token, durationInMillis);//23.5小时
+        }
+    }
+
+    /**
+     * 获取请求头
+     *
+     * @param payload    body的json字符串
+     * @param isGetToken 是否获取token请求
+     * @return
+     */
+    private Map<String, String> getHeader(String payload, boolean isGetToken) {
+        Map<String, String> signParams = new HashMap<>();
+        signParams.put("version", propt.getProperty("version"));
+        signParams.put("transId", UUID.randomUUID().toString());
+        signParams.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
+        signParams.put("tenantCode", propt.getProperty("tenantCode"));//租户编号,平台提供
+        signParams.put("language", propt.getProperty("language"));//语言支持
+        if (!isGetToken) {
+            signParams.put("token", getToken());
+        }
+        signParams.put("payload", payload);//发起请求时 body 的 json 字符串
+        //密钥必须放在生成签名代码之前
+        signParams.put("tenantSecret", propt.getProperty("tenantSecret"));
+        signParams.put("sign", createSign(signParams));
+        return signParams;
+    }
+
+    /**
+     * 获取token
+     *
+     * @return
+     */
+    private String getToken() {
+        String token = cache.get("token");
+        if (org.apache.commons.lang3.StringUtils.isBlank(token)) {
+            token = getTokenByRemote();
+        }
+        return token;
+    }
+
+    /**
+     * 远程获取token
+     *
+     * @return
+     */
+    private String getTokenByRemote() {
+        try {
+            com.alibaba.fastjson.JSONObject params = new com.alibaba.fastjson.JSONObject();
+            params.put("account", propt.getProperty("account"));
+            String password = propt.getProperty("password");
+            params.put("password", EncryptUtils.sha256(password, false));
+            String payload = params.toJSONString();
+            String getTokenPath = propt.getProperty("getTokenPath");
+
+            Map<String, String> headers = getHeader(payload, true);
+            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(getTokenPath)
+                    .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();
+            ObjectMapper mapper = new ObjectMapper();
+            if (response.isSuccessful()) {
+                Map<String, Object> result = mapper.readValue(response.body().string(), Map.class);
+                if ("success".equals(result.get("msg"))) {
+                    String token = (String) result.get("data");
+                    cache.put("token", token, 84600000);//23.5小时
+                    return token;
+                } else {
+                    throw new RuntimeException("远程获取token报错: ");
+                }
+            } else {
+                throw new RuntimeException("远程获取token报错: ");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("远程获取token报错: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 生成签名
+     *
+     * @param signParams 参与签名的参数
+     * @return
+     */
+    private String createSign(Map<String, String> signParams) {
+        String tenantSecret = signParams.get("tenantSecret");
+        signParams.remove("tenantSecret");
+        String linkStr = createLinkStr(signParams, "&");
+        linkStr = linkStr + "&tenantSecret=" + tenantSecret;
+        return EncryptUtils.sha256(linkStr, true);
+    }
+
+    /**
+     * 创建链接字符串
+     *
+     * @param params  参数
+     * @param linkStr 连接字符
+     * @return
+     */
+    private static String createLinkStr(Map<String, String> params, String linkStr) {
+        List<String> keys = new ArrayList<String>(params.keySet());
+        Collections.sort(keys);
+        StringBuilder content = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+            if (i == keys.size() - 1) {
+                content.append(key).append("=").append(value);
+            } else {
+                content.append(key).append("=").append(value).append(linkStr);
+            }
+        }
+        return content.toString();
+    }
+
+    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;
+
+    }
     //
     //public void syncZKPunchCardData(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) {
     //    //String url = "jdbc:sqlserver://10.0.3.23:1433;databaseName=kaoqin";