“luojun” 6 mesi fa
parent
commit
67214526f3

+ 11 - 11
src/com/kingdee/eas/basedata/org/app/PersonControllerBeanEx.java

@@ -89,17 +89,17 @@ public class PersonControllerBeanEx extends PersonControllerBean {
                 sb.append("OA同步错误信息:").append(oaMap.get("msg").toString());
             }
         }
-        PersonInfo personInfo = PersonFactory.getLocalInstance(ctx).getPersonCollection("select employeeType.number where id = '" + id + "'").get(0);
-        String employeeTypeNumber = personInfo.getEmployeeType().getNumber();
-        if (!employeeTypeNumber.equals("009")) {
-            //同步人员到IOT
-            Map<String, String> iotMap = SyncTranForIOTFacadeFactory.getLocalInstance(ctx).syncPersonToIot(id);
-            logger.error("PersonControllerBeanEx------------iotMap--------" + iotMap);
-            logger.error("PersonControllerBeanEx------------number--------" + number);
-            if (iotMap.containsKey(number)) {
-                sb.append("Iot同步错误信息:").append(iotMap.get(number));
-            }
-        }
+        //PersonInfo personInfo = PersonFactory.getLocalInstance(ctx).getPersonCollection("select employeeType.number where id = '" + id + "'").get(0);
+        //String employeeTypeNumber = personInfo.getEmployeeType().getNumber();
+        //if (!employeeTypeNumber.equals("009")) {
+        //    //同步人员到IOT
+        //    Map<String, String> iotMap = SyncTranForIOTFacadeFactory.getLocalInstance(ctx).syncPersonToIot(id);
+        //    logger.error("PersonControllerBeanEx------------iotMap--------" + iotMap);
+        //    logger.error("PersonControllerBeanEx------------number--------" + number);
+        //    if (iotMap.containsKey(number)) {
+        //        sb.append("Iot同步错误信息:").append(iotMap.get(number));
+        //    }
+        //}
 
         if (sb.length() > 0) {
             throw new BOSException(sb.toString());

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

@@ -17,13 +17,13 @@ import com.kingdee.eas.custom.log.app.DataDirectionEnum;
 import com.kingdee.eas.custom.log.app.DockingSystemEnum;
 import com.kingdee.eas.custom.log.app.SyncEntityNameEnum;
 import com.kingdee.eas.custom.log.app.SyncStatusEnum;
-import com.kingdee.eas.custom.sso.ExpiringMapCache;
 import com.kingdee.eas.hr.ats.AtsUtil;
 import com.kingdee.eas.hr.base.EmployeeTypeInfo;
 import com.kingdee.eas.hr.emp.IPersonPosition;
 import com.kingdee.eas.hr.emp.PersonPositionCollection;
 import com.kingdee.eas.hr.emp.PersonPositionFactory;
 import com.kingdee.eas.hr.emp.PersonPositionInfo;
+import com.kingdee.eas.utils.ExpiringMapCache;
 import okhttp3.*;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Logger;

+ 1 - 1
src/com/kingdee/eas/utils/ExpiringMapCache.java

@@ -1,4 +1,4 @@
-package com.kingdee.eas.custom.sso;
+package com.kingdee.eas.utils;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;

+ 0 - 190
src/com/kingdee/eas/utils/MJ.java

@@ -1,190 +0,0 @@
-package com.kingdee.eas.utils;
-
-import com.alibaba.fastjson.JSONObject;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import okhttp3.*;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.IOException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-/**
- * @Description TODO
- * @Date 2024/11/8 11:33
- * @Created by Heyuan
- */
-public class MJ {
-    private static ExpiringMapCache<String, String> cache = new ExpiringMapCache();
-    private static Properties properties = new Properties();
-    private long durationInMillis = 84600000;
-
-    static {
-        properties.put("version", "1.0");
-        properties.put("tenantCode", "200775");//租户编号,平台提供
-        properties.put("language", "zh-CN");//语言
-        properties.put("tenantSecret", "dGJbXDdjK0UtekhZWGJpW1JWMk00SFMhZlogcEV3NG0=");//密钥
-        properties.put("account", "200775-sHR");//接口账号
-        properties.put("password", "m3F)xLakHjd4ya=dFs@9");//接口账号密码
-        properties.put("getTokenPath", "http://10.0.3.81:9000/openapi/xt/v2/UserLogin");//获取token接口地址
-    }
-
-    public static void main(String[] args) throws IOException, ParseException {
-        JSONObject params = new JSONObject();
-        params.put("count", "100");
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-        Date parse = sdf.parse("2022-01-01");
-        params.put("rowTimeStamp", parse.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("http://10.0.3.81:9000/openapi/mj/v2/DoorAccessRecordPullData")
-                .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();
-        System.out.println(response.isSuccessful());
-        System.out.println(response.body().string());
-        System.out.println(System.currentTimeMillis() / 1000);
-    }
-
-    /**
-     * 重置token,每次调用接口后刷新token
-     */
-    private void resetToken() {
-        String token = cache.get("token");
-        if (StringUtils.isBlank(token)) {
-            getTokenByRemote();
-        } else {
-            cache.put("token", token, durationInMillis);//23.5小时
-        }
-    }
-
-    /**
-     * 获取请求头
-     *
-     * @param payload    body的json字符串
-     * @param isGetToken 是否获取token请求
-     * @return
-     */
-    private static Map<String, String> getHeader(String payload, boolean isGetToken) {
-        Map<String, String> signParams = new HashMap<>();
-        signParams.put("version", (String) properties.getOrDefault("version", "1.0"));
-        signParams.put("transId", UUID.randomUUID().toString());
-        signParams.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
-        signParams.put("tenantCode", (String) properties.getOrDefault("tenantCode", "200775"));//租户编号,平台提供
-        signParams.put("language", (String) properties.getOrDefault("language", "zh-CN"));//语言支持
-        if (!isGetToken) {
-            signParams.put("token", getToken());
-        }
-        signParams.put("payload", payload);//发起请求时 body 的 json 字符串
-        //密钥必须放在生成签名代码之前
-        signParams.put("tenantSecret", (String) properties.getOrDefault("tenantSecret", "dGJbXDdjK0UtekhZWGJpW1JWMk00SFMhZlogcEV3NG0="));
-        signParams.put("sign", createSign(signParams));
-        return signParams;
-    }
-
-    /**
-     * 获取token
-     *
-     * @return
-     */
-    private static String getToken() {
-        String token = cache.get("token");
-        if (StringUtils.isBlank(token)) {
-            token = getTokenByRemote();
-        }
-        return token;
-    }
-
-    /**
-     * 远程获取token
-     *
-     * @return
-     */
-    private static String getTokenByRemote() {
-        try {
-            JSONObject params = new JSONObject();
-            params.put("account", (String) properties.getOrDefault("account", "200775-sHR"));
-            String password = (String) properties.getOrDefault("password", "m3F)xLakHjd4ya=dFs@9");
-            params.put("password", EncryptUtils.sha256(password, false));
-            String payload = params.toJSONString();
-            String getTokenPath = (String) properties.getOrDefault("getTokenPath", "http://10.0.3.81:9000/openapi/xt/v2/UserLogin");
-
-            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 static 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();
-    }
-}

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

@@ -1,35 +1,19 @@
 package com.kingdee.eas.custom.synctask.handler;
 
-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.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.cp.taskmng.util.StringUtil;
-import com.kingdee.eas.custom.log.ISyncLog;
-import com.kingdee.eas.custom.log.SyncLogFactory;
-import com.kingdee.eas.custom.log.SyncLogInfo;
-import com.kingdee.eas.custom.log.app.DataDirectionEnum;
-import com.kingdee.eas.custom.log.app.DockingSystemEnum;
-import com.kingdee.eas.custom.log.app.SyncEntityNameEnum;
-import com.kingdee.eas.custom.log.app.SyncStatusEnum;
-import com.kingdee.eas.custom.synctask.SyncTranForIOTFacade;
 import com.kingdee.eas.custom.synctask.SyncTranForIOTFacadeFactory;
 import com.kingdee.eas.custom.synctask.SyncTranForOAFacadeFactory;
-import com.kingdee.eas.custom.synctask.util.ExpiringMapCache;
 import com.kingdee.eas.hr.ats.AtsUtil;
-import com.kingdee.eas.hr.base.EmployeeTypeInfo;
-import com.kingdee.eas.hr.emp.IPersonPosition;
-import com.kingdee.eas.hr.emp.PersonPositionCollection;
-import com.kingdee.eas.hr.emp.PersonPositionFactory;
-import com.kingdee.eas.hr.emp.PersonPositionInfo;
 import com.kingdee.eas.hr.emp.web.handler.EmployeeListHandler;
 import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsBody;
 import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsHeader;
@@ -38,15 +22,11 @@ import com.kingdee.shr.base.syssetting.exception.SHRWebException;
 import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
 import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
 import com.kingdee.util.StringUtils;
-import okhttp3.*;
 import org.apache.log4j.Logger;
 import org.springframework.ui.ModelMap;
-import org.springframework.util.DigestUtils;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.FileInputStream;
-import java.io.IOException;
 import java.util.*;
 
 
@@ -56,22 +36,9 @@ import java.util.*;
  * @apiNote 员工信息维护扩展
  */
 public class EmployeeListHandlerEx extends EmployeeListHandler {
-    public static Logger logger = Logger.getLogger(EmployeeListHandlerEx.class);
-    private Context ctx = SHRContext.getInstance().getContext();
-    private static Map<String, String> personStatusMap = new HashMap<String, String>();
-    private Properties propt = new Properties();
-    private static ExpiringMapCache<String, String> cache = new ExpiringMapCache();
-
-    public EmployeeListHandlerEx() throws BOSException {
-        String syncOAConfigPath = System.getProperty("EAS_HOME") + "/server/properties/scy/syncIOTConfig.properties";
-        try {
-            propt.load(new FileInputStream(syncOAConfigPath));
-        } catch (IOException e) {
-            e.printStackTrace();
-            String errorMsg = "获取配置文件报错,请检查配置:" + syncOAConfigPath + "   " + e.getMessage();
-            throw new BOSException(errorMsg);
-        }
-    }
+    public  Logger logger = Logger.getLogger(EmployeeListHandlerEx.class);
+    public Context ctx = SHRContext.getInstance().getContext();
+    public static Map<String, String> personStatusMap = new HashMap<String, String>();
 
     static {
         personStatusMap.put("001", "1");//试用员工
@@ -229,212 +196,6 @@ public class EmployeeListHandlerEx extends EmployeeListHandler {
         }
     }
 
-    public Map<String, String> syncPersonToIot(String billIds) throws BOSException, EASBizException, SHRWebException {
-        ISyncLog iSyncLog = SyncLogFactory.getLocalInstance(ctx);
-        SyncLogInfo syncLogInfo = new SyncLogInfo();
-        syncLogInfo.setEntityName(SyncEntityNameEnum.person);
-        syncLogInfo.setDataDirection(DataDirectionEnum.outflow);
-        syncLogInfo.setDockingSystem(DockingSystemEnum.IOT);
-        IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
-        FilterInfo filterInfo = new FilterInfo();
-        FilterItemCollection filterItems = filterInfo.getFilterItems();
-        Set personIds = AtsUtil.toSet(billIds);
-        logger.error("syncPersonToIot---personIds---" + personIds);
-        filterItems.add(new FilterItemInfo("person", personIds, CompareType.INCLUDE));
-        SelectorItemCollection sic = new SelectorItemCollection();
-        sic.add("*");
-        sic.add("person.number");
-        sic.add("person.name");
-        sic.add("person.id");
-        sic.add("person.hireDate");
-        sic.add("person.nCell");
-        sic.add("person.gender");
-        sic.add("person.email");
-        sic.add("person.employeeType.number");
-        sic.add("personDep.name");
-        sic.add("personDep.number");
-        sic.add("personDep.id");
-        sic.add("personDep.parent.id");
-        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
-        PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(entityViewInfo);
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("dataSyncRule", 1);//1:组织ID存在时更新 2:组织ID存在时跳过不更新。默认值1
-        List dataList = new ArrayList();
-        for (int i = 0; i < personPositionCollection.size(); i++) {
-            Map personMap = new HashMap();
-            PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
-            PersonInfo person = personPositionInfo.getPerson();
-            //personMap.put("id", person.getId().toString());//来源方用户ID
-            personMap.put("id", person.getNumber());//来源方用户ID
-            personMap.put("name", person.getName());//用户姓名
-            personMap.put("phone", person.getNCell());//手机号
-            personMap.put("gender", person.getGender() == null ? null : person.getGender().getValue());//性别
-            personMap.put("email", person.getEmail());//邮箱
-            EmployeeTypeInfo employeeType = person.getEmployeeType();
-            String number = employeeType.getNumber();
-            String personStatus = personStatusMap.get(number);
-            personMap.put("status", personStatus);//状态
-            AdminOrgUnitInfo personDep = personPositionInfo.getPersonDep();
-            List orgIds = new ArrayList();
-            orgIds.add(personDep.getParent().getId().toString());
-            personMap.put("orgIds", orgIds);//来源方组织ID列表
-            dataList.add(personMap);
-            //员工编码
-            Map paramsMap = new HashMap();
-            paramsMap.put("employeeNo", person.getNumber());
-            personMap.put("params", paramsMap);
-        }
-        jsonObject.put("data", dataList);//1:组织ID存在时更新 2:组织ID存在时跳过不更新。默认值1
-        //执行同步人员到Iot
-        return syncPerson(jsonObject.toString(), syncLogInfo);
-
-    }
-
-    /**
-     * 请求方法
-     *
-     * @param data
-     */
-    public Map<String, String> syncPerson(String data, SyncLogInfo syncLogInfo) throws BOSException, EASBizException {
-        Response response = null;
-        Map<String, String> result = new HashMap<>();
-        try {
-            String syncOrgUnitApiUrl = this.propt.getProperty("syncUserApiUrl");
-            //String syncOrgUnitApiUrl = "http://10.0.3.87/api/open/enterpriseright/org-manage/v1/external/org/batch";
-            if (org.apache.commons.lang3.StringUtils.isBlank(syncOrgUnitApiUrl)) {
-                throw new BOSException("syncOrgUnitApiUrl不能为空!");
-            }
-            logger.error("syncOrg---data-----" + data);
-            OkHttpClient client = new OkHttpClient();
-            MediaType mediaType = MediaType.parse("application/json");
-            RequestBody body = RequestBody.create(mediaType, data);
-            Request request = new Request.Builder()
-                    .url(syncOrgUnitApiUrl)
-                    .post(body)
-                    //.addHeader("Authorization", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ2UzVMT29mYiIsInNlcnZlciI6dHJ1ZSwidXNlcl9uYW1lIjoic0hSIiwicHJvamVjdE1hcCI6IntcIlNDWVwiOlwiMTMwMDgwNTYwNDAwNDA0NDgwMFwifSIsInNjb3BlIjpbInNlcnZlciJdLCJuYW1lIjoic0hSIiwicHJvamVjdCI6IiIsImV4cCI6MTczMDkxMzQwOSwidGVuYW50IjoidGFpb3QiLCJjbGllbnRfaWQiOiJzeXMifQ.hS1LVZ56rHPvVZmRdipay3XNAmmtFBZKt-wPc7UK2rg ")
-                    .addHeader("Authorization", getToken())
-                    .addHeader("Accept", "*/*")
-                    .addHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0")
-                    .addHeader("Connection", "keep-alive")
-                    .addHeader("Content-Type", "application/json")
-                    .build();
-            response = client.newCall(request).execute();
-            String string = response.body().string();
-            logger.error("string-----" + string);
-            if (response.isSuccessful()) {
-                ObjectMapper objectMapper = new ObjectMapper();
-                Map<String, List<Map<String, String>>> resultMap = objectMapper.readValue(string, Map.class);
-                List<Map<String, String>> list = resultMap.get("data");
-                for (int i = 0; i < list.size(); i++) {
-                    Map<String, String> map = list.get(i);
-                    result.put(map.get("id"), map.get("msg"));
-                }
-                //todo
-                //return (String) result.get("token");
-                syncLogInfo.setSyncStatus(SyncStatusEnum.SUCCESS);
-                //syncLogInfo.setSyncCount(total);
-                //syncLogInfo.setSuccessNum(success);
-                //syncLogInfo.setFailNum(fail);
-                SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo);
-            } else {
-                syncLogInfo.setSyncStatus(SyncStatusEnum.ERROR);
-                //syncLogInfo.setSyncCount(total);
-                //syncLogInfo.setSuccessNum(success);
-                //syncLogInfo.setFailNum(fail);
-                SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo);
-            }
-        } catch (IOException | BOSException e) {
-            e.printStackTrace();
-            throw new RuntimeException("同步IOT平台人员失败: " + e.getMessage());
-        }
-        return result;
-    }
-
-    /**
-     * 获取token
-     * 本地缓存token,有效时长6.5小时
-     *
-     * @return
-     */
-    public String getToken() {
-        String token = cache.get("token");
-        if (org.apache.commons.lang3.StringUtils.isBlank(token)) {
-            token = getTokenByRemote();
-        }
-        return token;
-    }
-
-    /**
-     * 远程获取Token
-     *
-     * @return
-     */
-    private String getTokenByRemote() {
-        Response response = null;
-        Map result = null;
-        try {
-            long now = System.currentTimeMillis();
-            Map<String, String> params = new HashMap<>();
-            String getTokenApiUrl = this.propt.getProperty("getTokenApiUrl");
-            if (org.apache.commons.lang3.StringUtils.isBlank(getTokenApiUrl)) {
-                throw new BOSException("获取token接口地址不能为空!");
-            }
-            String appid = this.propt.getProperty("appid");
-            if (org.apache.commons.lang3.StringUtils.isBlank(appid)) {
-                throw new BOSException("appid不能为空!");
-            }
-            String secret = this.propt.getProperty("secret");
-            if (org.apache.commons.lang3.StringUtils.isBlank(secret)) {
-                throw new BOSException("secret不能为空!");
-            }
-            params.put("appid", appid);
-            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(getTokenApiUrl, params);
-            logger.error("getTokenByRemote -> requestUrl " + requestUrl);
-            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);
-            logger.error("getTokenByRemote -> result " + result);
-        } catch (IOException | BOSException e) {
-            e.printStackTrace();
-            throw new RuntimeException("远程获取IOT平台token失败: " + e.getMessage());
-        }
-        if (response.isSuccessful()) {
-            String token = (String) result.get("token");
-            //缓存token
-            cache.put("token", token, 27000000);//6.5小时
-            return token;
-        } else {
-            throw new RuntimeException((String) result.get("msg"));
-        }
-    }
-
-    /**
-     * 拼接地址参数
-     */
-    private 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 (!org.apache.commons.lang3.StringUtils.isEmpty(url)) {
-            return url.contains("?") ? (url + "&" + paramStr) : (url + "?" + paramStr);
-        }
-        return paramStr.toString();
-    }
 
 
     /**

+ 0 - 161
websrc/com/kingdee/eas/custom/synctask/handler/OrgUnitListHandlerEx.java

@@ -1,27 +1,15 @@
 package com.kingdee.eas.custom.synctask.handler;
 
-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.metadata.entity.*;
 import com.kingdee.bos.metadata.query.util.CompareType;
 import com.kingdee.eas.basedata.org.*;
-import com.kingdee.eas.basedata.person.PersonCollection;
-import com.kingdee.eas.basedata.person.PersonInfo;
 import com.kingdee.eas.common.EASBizException;
 import com.kingdee.eas.cp.taskmng.util.StringUtil;
-import com.kingdee.eas.custom.log.ISyncLog;
-import com.kingdee.eas.custom.log.SyncLogFactory;
-import com.kingdee.eas.custom.log.SyncLogInfo;
-import com.kingdee.eas.custom.log.app.DataDirectionEnum;
-import com.kingdee.eas.custom.log.app.DockingSystemEnum;
-import com.kingdee.eas.custom.log.app.SyncEntityNameEnum;
-import com.kingdee.eas.custom.log.app.SyncStatusEnum;
 import com.kingdee.eas.custom.synctask.ISyncTranForIOTFacade;
 import com.kingdee.eas.custom.synctask.SyncTranForIOTFacadeFactory;
 import com.kingdee.eas.custom.synctask.SyncTranForOAFacadeFactory;
-import com.kingdee.eas.custom.synctask.util.ExpiringMapCache;
 import com.kingdee.eas.hr.ats.AtsUtil;
 import com.kingdee.eas.hr.org.web.handler.OrgUnitListHandler;
 import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsBody;
@@ -30,8 +18,6 @@ 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.json.JSONUtils;
-import okhttp3.*;
-import org.springframework.util.DigestUtils;
 import org.apache.log4j.Logger;
 import org.springframework.ui.ModelMap;
 
@@ -52,8 +38,6 @@ public class OrgUnitListHandlerEx extends OrgUnitListHandler {
     Logger logger = Logger.getLogger(OrgUnitListHandlerEx.class);
     private Context ctx = SHRContext.getInstance().getContext();
     private Properties propt = new Properties();
-    //缓存
-    private static ExpiringMapCache<String, String> cache = new ExpiringMapCache();
     private static Map<String, Integer> personStatusMap = new HashMap<String, Integer>();
 
     static {
@@ -175,151 +159,6 @@ public class OrgUnitListHandlerEx extends OrgUnitListHandler {
 
 
 
-    /**
-     * 获取token
-     * 本地缓存token,有效时长6.5小时
-     *
-     * @return
-     */
-    public String getToken() {
-        String token = cache.get("token");
-        if (StringUtils.isBlank(token)) {
-            token = getTokenByRemote();
-        }
-        return token;
-    }
-
-    /**
-     * 请求方法
-     *
-     * @param data
-     */
-    public Map syncOrg(String data, SyncLogInfo syncLogInfo) throws BOSException, EASBizException {
-        Response response = null;
-        Map result = null;
-        try {
-            String syncOrgUnitApiUrl = this.propt.getProperty("syncOrgUnitApiUrl");
-            //String syncOrgUnitApiUrl = "http://10.0.3.87/api/open/enterpriseright/org-manage/v1/external/org/batch";
-            if (StringUtils.isBlank(syncOrgUnitApiUrl)) {
-                throw new BOSException("syncOrgUnitApiUrl不能为空!");
-            }
-            logger.error("syncOrg---data-----" + data);
-            OkHttpClient client = new OkHttpClient();
-            MediaType mediaType = MediaType.parse("application/json");
-            RequestBody body = RequestBody.create(mediaType, data);
-            Request request = new Request.Builder()
-                    .url(syncOrgUnitApiUrl)
-                    .post(body)
-                    //.addHeader("Authorization", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ2UzVMT29mYiIsInNlcnZlciI6dHJ1ZSwidXNlcl9uYW1lIjoic0hSIiwicHJvamVjdE1hcCI6IntcIlNDWVwiOlwiMTMwMDgwNTYwNDAwNDA0NDgwMFwifSIsInNjb3BlIjpbInNlcnZlciJdLCJuYW1lIjoic0hSIiwicHJvamVjdCI6IiIsImV4cCI6MTczMDkxMzQwOSwidGVuYW50IjoidGFpb3QiLCJjbGllbnRfaWQiOiJzeXMifQ.hS1LVZ56rHPvVZmRdipay3XNAmmtFBZKt-wPc7UK2rg ")
-                    .addHeader("Authorization", getToken())
-                    .addHeader("Accept", "*/*")
-                    .addHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0")
-                    .addHeader("Connection", "keep-alive")
-                    .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 | BOSException e) {
-            e.printStackTrace();
-            throw new RuntimeException("同步IOT平台组织失败: " + e.getMessage());
-        }
-        logger.error("result-----" + result);
-        logger.error("response.isSuccessful()-----" + response.isSuccessful());
-        if (response.isSuccessful()) {
-            //todo
-            //return (String) result.get("token");
-            syncLogInfo.setSyncStatus(SyncStatusEnum.SUCCESS);
-            //syncLogInfo.setSyncCount(total);
-            //syncLogInfo.setSuccessNum(success);
-            //syncLogInfo.setFailNum(fail);
-            syncLogInfo.setSyncResult((String) result.get("msg"));
-            SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo);
-        } else {
-            syncLogInfo.setSyncStatus(SyncStatusEnum.ERROR);
-            //syncLogInfo.setSyncCount(total);
-            //syncLogInfo.setSuccessNum(success);
-            //syncLogInfo.setFailNum(fail);
-            syncLogInfo.setSyncResult((String) result.get("msg"));
-            SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo);
-        }
-        return result;
-    }
-
-
-    /**
-     * 远程获取Token
-     *
-     * @return
-     */
-    private String getTokenByRemote() {
-        Response response = null;
-        Map result = null;
-        try {
-            long now = System.currentTimeMillis();
-            Map<String, String> params = new HashMap<>();
-            String getTokenApiUrl = this.propt.getProperty("getTokenApiUrl");
-            if (StringUtils.isBlank(getTokenApiUrl)) {
-                throw new BOSException("获取token接口地址不能为空!");
-            }
-            String appid = this.propt.getProperty("appid");
-            if (StringUtils.isBlank(appid)) {
-                throw new BOSException("appid不能为空!");
-            }
-            String secret = this.propt.getProperty("secret");
-            if (StringUtils.isBlank(secret)) {
-                throw new BOSException("secret不能为空!");
-            }
-            params.put("appid", appid);
-            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(getTokenApiUrl, params);
-            logger.error("getTokenByRemote -> requestUrl " + requestUrl);
-            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);
-            logger.error("getTokenByRemote -> result " + result);
-        } catch (IOException | BOSException e) {
-            e.printStackTrace();
-            throw new RuntimeException("远程获取IOT平台token失败: " + e.getMessage());
-        }
-        if (response.isSuccessful()) {
-            String token = (String) result.get("token");
-            //缓存token
-            cache.put("token", token, 27000000);//6.5小时
-            return token;
-        } else {
-            throw new RuntimeException((String) result.get("msg"));
-        }
-    }
-
-    /**
-     * 拼接地址参数
-     */
-    private 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();
-    }
-
     /**
      * 同步OA部门
      *

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

@@ -16,11 +16,11 @@ 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.eas.utils.ExpiringMapCache;
 import com.kingdee.shr.ats.web.handler.PunchCardRecordListHandler;
 import com.kingdee.shr.base.syssetting.context.SHRContext;
 import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
@@ -46,9 +46,9 @@ 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;
+    //
+    //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";
@@ -88,438 +88,96 @@ public class PunchCardRecordListHandlerEx extends PunchCardRecordListHandler {
         //_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");
-            //获取前三天数据
-            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);
-            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")) {
-                    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;
-                    }
-                    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;
-
-    }
+    ///**
+    // * 同步门禁打卡记录
+    // *
+    // * @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接口地址
+    //
     //
-    //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();
+    //        JSONObject params = new JSONObject();
+    //        params.put("count", "100");
+    //        //获取前三天数据
     //        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);
+    //        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;
-    //        // 执行查询语句
-    //        //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;
@@ -531,68 +189,77 @@ public class PunchCardRecordListHandlerEx extends PunchCardRecordListHandler {
     //        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);
+    //        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")) {
+    //                punchCardStateEnum = PunchCardStateEnum.normal;
+    //            } else {
+    //                punchCardStateEnum = PunchCardStateEnum.cancelled;
+    //            }
+    //            cardInfo.setPunchCardState(punchCardStateEnum);
+    //            ////简称
+    //            //cardInfo.setSimpleName(exceptionType);
+    //            //描述
+    //            cardInfo.setDescription("门禁打卡机");
     //
-    //        // 处理查询结果
-    //        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);
+    //            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 {
+    //            if (minDateTime != null && maxDateTime != null) {
+    //                if (punchCardTime.getTime() < minDateTime.getTime()) {
     //                    minDateTime = punchCardTime;
+    //                } else if (punchCardTime.getTime() > maxDateTime.getTime()) {
     //                    maxDateTime = punchCardTime;
     //                }
-    //
     //            } else {
-    //                formatErrorRecords.add(resultSet);
+    //                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());
@@ -616,7 +283,7 @@ public class PunchCardRecordListHandlerEx extends PunchCardRecordListHandler {
     //                    // 打卡位置 ,考勤机 的地址
     //                    cardInfo.setPunchCardPlace(cardInfo.getPunchCardPlace());
     //                    //打卡来源
-    //                    cardInfo.setPunchCardSource(PunchCardSourceEnum.mobileRegistration);
+    //                    cardInfo.setPunchCardSource(PunchCardSourceEnum.attenceMachine);
     //                    // 考勤实体
     //                    AttendanceFileInfo attendanceFileInfo = (AttendanceFileInfo) attendanceFileMap.get(cardInfo.getAttendanceNum());
     //                    // 姓名
@@ -646,15 +313,142 @@ public class PunchCardRecordListHandlerEx extends PunchCardRecordListHandler {
     //        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();
+    //    }
+    //}
     //
-    //    } catch (Exception e) {
+    ///**
+    // * 重置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 {
@@ -673,5 +467,211 @@ public class PunchCardRecordListHandlerEx extends PunchCardRecordListHandler {
     //    return existColl;
     //
     //}
+    ////
+    ////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;
+    ////
+    ////}
 
 }