Browse Source

同步人员信息到打卡机

qingwu 1 week ago
parent
commit
f313b52ddc

+ 69 - 0
metadata/com/kingdee/eas/custom/synctask/task/SynPersonToPunchCardFacade.facade

@@ -129,6 +129,41 @@
       </exceptions>
       <configured>false</configured>
     </method>
+    <method>
+      <name>synRecoverPerson</name>
+      <isListenerMethod>false</isListenerMethod>
+      <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].alias</alias>
+      <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].description</description>
+      <innerID>6911725c-868b-41ea-b761-fdbc52e5bb49</innerID>
+      <accessLevel>public</accessLevel>
+      <subClassingMode>normal</subClassingMode>
+      <returnValueType />
+      <metadataRef />
+      <transactionAttribute>Supports</transactionAttribute>
+      <userDefined>true</userDefined>
+      <userDefinedLogic />
+      <parameters>
+        <parameter>
+          <name>offSet</name>
+          <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].parameters.parameter[offSet].alias</alias>
+          <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].parameters.parameter[offSet].description</description>
+          <direction>in</direction>
+          <dataType>Integer</dataType>
+          <metadataRef />
+          <userDefined>true</userDefined>
+        </parameter>
+        <parameter>
+          <name>personNumber</name>
+          <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].parameters.parameter[personNumber].alias</alias>
+          <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].parameters.parameter[personNumber].description</description>
+          <direction>in</direction>
+          <dataType>String</dataType>
+          <metadataRef />
+          <userDefined>true</userDefined>
+        </parameter>
+      </parameters>
+      <configured>false</configured>
+    </method>
   </methods>
   <resource>
     <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].alias">
@@ -206,6 +241,40 @@
       <lang locale="zh_CN" value="" />
       <lang locale="zh_TW" value="null" />
     </rs>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="同步人员恢复" />
+      <lang locale="zh_HK" value="同步人員恢復" />
+      <lang locale="zh_TW" value="同步人員恢復" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="null" />
+      <lang locale="zh_HK" value="null" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].parameters.parameter[offSet].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="天数" />
+      <lang locale="zh_HK" value="天數" />
+      <lang locale="zh_TW" value="天數" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].parameters.parameter[offSet].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].parameters.parameter[personNumber].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="人员编码(多个用逗号隔开)" />
+      <lang locale="zh_HK" value="人員編碼(多個用逗號隔開)" />
+      <lang locale="zh_TW" value="人員編碼(多個用逗號隔開)" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[synRecoverPerson].parameters.parameter[personNumber].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
     <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[updatePerson].alias">
       <lang locale="en_US" value="null" />
       <lang locale="zh_CN" value="更新人员" />

+ 20 - 0
src/com/kingdee/eas/custom/synctask/task/AbstractSynPersonToPunchCardFacadeControllerBean.java

@@ -124,4 +124,24 @@ public abstract class AbstractSynPersonToPunchCardFacadeControllerBean extends A
         return;
     }
 
+    public void synRecoverPerson(Context ctx, int offSet, String personNumber) throws BOSException
+    {
+        try {
+            ServiceContext svcCtx = createServiceContext(new MetaDataPK("6911725c-868b-41ea-b761-fdbc52e5bb49"), new Object[]{ctx, new Integer(offSet), personNumber});
+            invokeServiceBefore(svcCtx);
+              if(!svcCtx.invokeBreak()) {
+            _synRecoverPerson(ctx, offSet, personNumber);
+            }
+            invokeServiceAfter(svcCtx);
+        } catch (BOSException ex) {
+            throw ex;
+        } finally {
+            super.cleanUpServiceState();
+        }
+    }
+    protected void _synRecoverPerson(Context ctx, int offSet, String personNumber) throws BOSException
+    {    	
+        return;
+    }
+
 }

+ 1 - 0
src/com/kingdee/eas/custom/synctask/task/ISynPersonToPunchCardFacade.java

@@ -19,4 +19,5 @@ public interface ISynPersonToPunchCardFacade extends IBizCtrl
     public void dimissionPerson(String personNumbers) throws BOSException, EASBizException;
     public void recoverPerson(int offSet) throws BOSException, EASBizException;
     public void initializePerson() throws BOSException, EASBizException;
+    public void synRecoverPerson(int offSet, String personNumber) throws BOSException;
 }

+ 14 - 0
src/com/kingdee/eas/custom/synctask/task/SynPersonToPunchCardFacade.java

@@ -85,4 +85,18 @@ public class SynPersonToPunchCardFacade extends AbstractBizCtrl implements ISynP
             throw new EJBRemoteException(err);
         }
     }
+    /**
+     *同步人员恢复-User defined method
+     *@param offSet 天数
+     *@param personNumber 人员编码(多个用逗号隔开)
+     */
+    public void synRecoverPerson(int offSet, String personNumber) throws BOSException
+    {
+        try {
+            getController().synRecoverPerson(getContext(), offSet, personNumber);
+        }
+        catch(RemoteException err) {
+            throw new EJBRemoteException(err);
+        }
+    }
 }

+ 1 - 0
src/com/kingdee/eas/custom/synctask/task/SynPersonToPunchCardFacadeController.java

@@ -22,4 +22,5 @@ public interface SynPersonToPunchCardFacadeController extends BizController
     public void dimissionPerson(Context ctx, String personNumbers) throws BOSException, EASBizException, RemoteException;
     public void recoverPerson(Context ctx, int offSet) throws BOSException, EASBizException, RemoteException;
     public void initializePerson(Context ctx) throws BOSException, EASBizException, RemoteException;
+    public void synRecoverPerson(Context ctx, int offSet, String personNumber) throws BOSException, RemoteException;
 }

+ 186 - 25
src/com/kingdee/eas/custom/synctask/task/SynPersonToPunchCardFacadeControllerBean.java

@@ -21,6 +21,7 @@ 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.scm.util.datetime.DateTimeUtil;
+import com.kingdee.ws.ca.utils.StringUtils;
 import oadd.org.apache.commons.codec.digest.DigestUtils;
 import okhttp3.*;
 import org.apache.log4j.Logger;
@@ -151,7 +152,7 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
     }
 
     /**
-     * 人员恢复
+     * 人员恢复 再入职
      *
      * @param ctx
      * @throws BOSException
@@ -204,14 +205,7 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
         if (personNumber.size() > 0) {
             JSONObject params = new JSONObject();
             params.put("userpin", personNumber); //人员编号
-            // 生成 Token 和 URL 参数
-            long currentTime = Instant.now().getEpochSecond();
-            String secretKey = propt.getProperty("SECRET_KEY");
-            String token = DigestUtils.md5Hex(secretKey + currentTime);
-            // 构建查询参数
-            Map<String, String> queryParams = new HashMap<>();
-            queryParams.put("timestamp", String.valueOf(currentTime));
-            queryParams.put("token", token);
+            Map<String, String> queryParams = getToken();
             // 调用接口
             String urlPath = propt.getProperty("recoverUrlPath");
             String result = sendPostRequest(urlPath, params, queryParams);
@@ -221,8 +215,136 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
 
     }
 
-    /***
+    /**
+     * 人员恢复-反审批
+     *
+     * @param ctx
+     * @param offSet
+     * @param personNumber
+     * @throws BOSException
+     */
+    @Override
+    protected void _synRecoverPerson(
+            Context ctx,
+            int offSet,
+            String personNumber
+    ) throws BOSException {
+        super._synRecoverPerson(ctx, offSet, personNumber);
+        logger.error("_synRecoverPerson--");
+        loadProperties();
+        String dayBefore = getDayBefore(new Date(), offSet);
+        logger.error("_recoverPerson--dayBefore--" + dayBefore);
+        //员工
+        IPerson iPerson = PersonFactory.getLocalInstance(ctx);
+        FilterInfo filterInfo = new FilterInfo();
+        FilterItemCollection filterItems = filterInfo.getFilterItems();
+        if (!StringUtils.isEmpty(personNumber)) {
+            filterItems.add(new FilterItemInfo("number", AtsUtil.toSet(personNumber), CompareType.INCLUDE));
+        } else {
+            filterItems.add(new FilterItemInfo("hireDate", dayBefore, CompareType.GREATER_EQUALS));
+            filterItems.add(new FilterItemInfo("hireDate", new Date(), CompareType.LESS_EQUALS));
+        }
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add("number");
+        sic.add("name");
+        sic.add("id");
+        sic.add("hireDate");
+        sic.add("nCell");
+        sic.add("gender");
+        sic.add("email");
+        sic.add("employeeType.number");
+        sic.add("employeeType.id");
+        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        logger.error("filterInfo--" + filterInfo.toSql());
+        //获取时间段的人员
+        PersonCollection personCollection = iPerson.getPersonCollection(entityViewInfo);
+        logger.error("personCollection--" + personCollection.size());
+        JSONObject personNumberAll = getPersonNumberAll();
+        logger.error("personNumberAll--" + personNumberAll);
+        if (personNumberAll.size() > 0) {
+            //中控不存在的人员,
+            JSONArray notExistArray = new JSONArray();
+            if (personCollection.size() > 0) {
+                for (int i = 0; i < personCollection.size(); i++) {
+                    PersonInfo personInfo = personCollection.get(i);
+                    String name = personInfo.getName();
+                    String perNumber = personInfo.getNumber();
+                    String number = personInfo.getEmployeeType().getNumber();
+                    //对shr在职人员进行人员恢复
+                    if (!"010".equals(number) && !"009".equals(number) && !"S09".equals(number)) {
+                        //判断中控是否存在该人员
+                        if (!personNumberAll.containsKey(perNumber)) {
+                            notExistArray.add(perNumber);
+                        }
+                    }
+                }
+                if (notExistArray.size() > 0) {
+                    logger.error("notExistArray--" + notExistArray.size());
+                    //对查询到中控人员 进行人员恢复操作
+                    JSONObject params = new JSONObject();
+                    params.put("userpin", notExistArray); //人员编号
+                    Map<String, String> queryParams = getToken();
+                    // 调用接口
+                    String urlPath = propt.getProperty("recoverUrlPath");
+                    String result = sendPostRequest(urlPath, params, queryParams);
+                    logger.error("result--" + result);
+                    JSONObject jsonObject = JSONObject.parseObject(result);
+                    //判断是否存在总控不存在的人员
+                    if (jsonObject.containsKey("error_list")) {
+                        JSONArray errorList = jsonObject.getJSONArray("error_list");
+                        StringBuilder personNumbers = new StringBuilder();
+                        for (int i = 0; i < errorList.size(); i++) {
+                            Object number = errorList.get(i);
+                            personNumbers.append(number).append(",");
+                        }
+                        personNumbers.deleteCharAt(personNumbers.lastIndexOf(","));
+                        logger.error("personNumbers--" + personNumbers);
+                        try {
+                            //调用人员更新接口
+                            updatePerson(ctx, personNumbers.toString());
+                        } catch (EASBizException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取所有中控人员
+     *
+     * @return
+     */
+    public JSONObject getPersonNumberAll() {
+        JSONObject jsonObject = new JSONObject();
+        Map<String, String> queryParams = getToken();
+        // 调用接口
+        String urlPath = propt.getProperty("employeeUrlPath");
+        logger.error("getPersonNumberAll--urlPath---" + urlPath);
+        String response = sendPostRequest(urlPath, queryParams);
+        JSONObject result = JSONObject.parseObject(response);
+        logger.error("getPersonNumberAll--result---" + result);
+        Integer ret = result.getInteger("ret");
+        if (ret == 0) {
+            JSONObject data = result.getJSONObject("data");
+            String count = data.containsKey("count") ? data.getString("count") : "";
+            logger.error("getPersonNumberAll--count---" + count);
+            JSONArray items = data.getJSONArray("items");
+            for (int i = 0; i < items.size(); i++) {
+                JSONObject item = items.getJSONObject(i);
+                String pin = item.getString("pin");
+                String name = item.getString("name");
+                jsonObject.put(pin, name);
+            }
+            return jsonObject;
+        }
+        return new JSONObject();
+    }
+
+    /**
      * 获取时间内的人员ID
+     *
      * @param ctx
      * @param dayBefore
      * @throws BOSException
@@ -247,7 +369,6 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
         return personSet;
     }
 
-
     /**
      * 往前推多少天
      *
@@ -277,7 +398,6 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
      * @throws EASBizException
      */
     @Override
-
     protected void _updatePerson(Context ctx, String personNumbers) throws BOSException, EASBizException {
         logger.error("_updatePerson--");
         loadProperties();
@@ -294,7 +414,8 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
         logger.error("personPositionCollection--" + personPositionCollection.size());
         List<PersonPositionInfo> PersonPositionList = new ArrayList();
         for (int i = 0; i < personPositionCollection.size(); i++) {
-            PersonPositionList.add(personPositionCollection.get(i));
+            PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
+            PersonPositionList.add(personPositionInfo);
         }
         logger.error("PersonPositionList--" + PersonPositionList.size());
         JSONArray msgArray = new JSONArray();
@@ -450,7 +571,6 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
         return messageMap;
     }
 
-
     /**
      * 查询参数
      */
@@ -496,7 +616,6 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
 
     }
 
-
     /**
      * 人员离职
      *
@@ -514,13 +633,7 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
             param.put("leavetype", 0); //员工编码
         }
         // 生成 Token 和 URL 参数
-        long currentTime = Instant.now().getEpochSecond();
-        String secretKey = propt.getProperty("SECRET_KEY");
-        String token = DigestUtils.md5Hex(secretKey + currentTime);
-        // 构建查询参数
-        Map<String, String> queryParams = new HashMap<>();
-        queryParams.put("timestamp", String.valueOf(currentTime));
-        queryParams.put("token", token);
+        Map<String, String> queryParams = getToken();
         // 调用接口
         String urlPath = propt.getProperty("leaveUrlPath");
         String response = sendPostRequest(urlPath, param, queryParams);
@@ -542,6 +655,18 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
      * @return
      */
     private String synPerson(JSONArray params) {
+        Map<String, String> queryParams = getToken();
+        // 调用接口
+        String urlPath = propt.getProperty("updateUrlPath");
+        return sendPostRequest(urlPath, params, queryParams);
+    }
+
+    /**
+     * 获取Token
+     *
+     * @return
+     */
+    public Map getToken() {
         // 生成 Token 和 URL 参数
         long currentTime = Instant.now().getEpochSecond();
         String secretKey = propt.getProperty("SECRET_KEY");
@@ -550,9 +675,45 @@ public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonT
         Map<String, String> queryParams = new HashMap<>();
         queryParams.put("timestamp", String.valueOf(currentTime));
         queryParams.put("token", token);
-        // 调用接口
-        String urlPath = propt.getProperty("updateUrlPath");
-        return sendPostRequest(urlPath, params, queryParams);
+        return queryParams;
+    }
+
+    /**
+     * 发送 POST 请求(JSON 格式) 用于查询所有数据
+     *
+     * @param urlPath     接口地址(可含路径参数,如 `/api/v2/transaction/get`)
+     * @param queryParams URL 查询参数(如 `timestamp` 和 `token`)
+     * @return 响应体字符串(失败返回 null)
+     */
+    public static String sendPostRequest(String urlPath, Map<String, String> queryParams) {
+        try {
+            // 1. 构建完整 URL(含查询参数)
+            HttpUrl.Builder urlBuilder = HttpUrl.parse(urlPath).newBuilder();
+            if (queryParams != null) {
+                queryParams.forEach(urlBuilder::addQueryParameter);
+            }
+            String fullUrl = urlBuilder.build().toString();
+            // 2. 创建请求体
+            MediaType mediaType = MediaType.parse("application/json");
+            RequestBody body = RequestBody.create(mediaType, "");
+            // 3. 构建请求
+            Request request = new Request.Builder()
+                    .url(fullUrl)
+                    .post(body)
+                    .addHeader("Content-Type", "application/json")
+                    .build();
+            // 4. 发送请求并处理响应
+            try (Response response = client.newCall(request).execute()) {
+                if (response.isSuccessful() && response.body() != null) {
+                    return response.body().string();
+                } else {
+                    logger.error("请求失败,状态码: " + response.code());
+                }
+            }
+        } catch (IOException e) {
+            logger.error("请求异常: " + e.getMessage(), e);
+        }
+        return null;
     }
 
     /**