浏览代码

同步人员到打卡机

qingwu 2 周之前
父节点
当前提交
df365b279a

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

@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+<facade xmlns="com.kingdee.bos.metadata">
+  <package>com.kingdee.eas.custom.synctask.task</package>
+  <name>SynPersonToPunchCardFacade</name>
+  <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].alias</alias>
+  <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].description</description>
+  <userDefined>true</userDefined>
+  <bosType>E86B4FB3</bosType>
+  <stereoType>false</stereoType>
+  <businessImplName>com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade</businessImplName>
+  <businessControllerName>com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacadeController</businessControllerName>
+  <accessLevel>public</accessLevel>
+  <subClassingMode>normal</subClassingMode>
+  <methods>
+    <method>
+      <name>updatePerson</name>
+      <isListenerMethod>false</isListenerMethod>
+      <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[updatePerson].alias</alias>
+      <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[updatePerson].description</description>
+      <innerID>6db1769f-0802-4879-b726-8023ea5a454c</innerID>
+      <accessLevel>public</accessLevel>
+      <subClassingMode>normal</subClassingMode>
+      <returnValueType />
+      <metadataRef />
+      <transactionAttribute>Supports</transactionAttribute>
+      <userDefined>true</userDefined>
+      <userDefinedLogic />
+      <parameters>
+        <parameter>
+          <name>personNumbers</name>
+          <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[updatePerson].parameters.parameter[personNumbers].alias</alias>
+          <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[updatePerson].parameters.parameter[personNumbers].description</description>
+          <direction>in</direction>
+          <dataType>String</dataType>
+          <metadataRef />
+          <userDefined>true</userDefined>
+        </parameter>
+      </parameters>
+      <exceptions>
+        <bizException>
+          <key name="package" value="com.kingdee.eas.common" />
+          <key name="name" value="EASBizException" />
+        </bizException>
+      </exceptions>
+      <configured>false</configured>
+    </method>
+    <method>
+      <name>dimissionPerson</name>
+      <isListenerMethod>false</isListenerMethod>
+      <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[dimissionPerson].alias</alias>
+      <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[dimissionPerson].description</description>
+      <innerID>316ebe86-8f48-43ff-a818-48a8d697df86</innerID>
+      <accessLevel>public</accessLevel>
+      <subClassingMode>normal</subClassingMode>
+      <returnValueType />
+      <metadataRef />
+      <transactionAttribute>Supports</transactionAttribute>
+      <userDefined>true</userDefined>
+      <userDefinedLogic />
+      <parameters>
+        <parameter>
+          <name>personNumbers</name>
+          <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[dimissionPerson].parameters.parameter[personNumbers].alias</alias>
+          <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[dimissionPerson].parameters.parameter[personNumbers].description</description>
+          <direction>in</direction>
+          <dataType>String</dataType>
+          <metadataRef />
+          <userDefined>true</userDefined>
+        </parameter>
+      </parameters>
+      <exceptions>
+        <bizException>
+          <key name="package" value="com.kingdee.eas.common" />
+          <key name="name" value="EASBizException" />
+        </bizException>
+      </exceptions>
+      <configured>false</configured>
+    </method>
+    <method>
+      <name>recoverPerson</name>
+      <isListenerMethod>false</isListenerMethod>
+      <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[recoverPerson].alias</alias>
+      <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[recoverPerson].description</description>
+      <innerID>f37075a8-3791-4dc8-abd3-bed376178d6b</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[recoverPerson].parameters.parameter[offSet].alias</alias>
+          <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[recoverPerson].parameters.parameter[offSet].description</description>
+          <direction>in</direction>
+          <dataType>Integer</dataType>
+          <metadataRef />
+          <userDefined>true</userDefined>
+        </parameter>
+      </parameters>
+      <exceptions>
+        <bizException>
+          <key name="package" value="com.kingdee.eas.common" />
+          <key name="name" value="EASBizException" />
+        </bizException>
+      </exceptions>
+      <configured>false</configured>
+    </method>
+    <method>
+      <name>initializePerson</name>
+      <isListenerMethod>false</isListenerMethod>
+      <alias>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[initializePerson].alias</alias>
+      <description>facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[initializePerson].description</description>
+      <innerID>88d05883-070c-4ac7-89ae-b25d4fde47b6</innerID>
+      <accessLevel>public</accessLevel>
+      <subClassingMode>normal</subClassingMode>
+      <returnValueType />
+      <metadataRef />
+      <transactionAttribute>Supports</transactionAttribute>
+      <userDefined>true</userDefined>
+      <userDefinedLogic />
+      <exceptions>
+        <bizException>
+          <key name="package" value="com.kingdee.eas.common" />
+          <key name="name" value="EASBizException" />
+        </bizException>
+      </exceptions>
+      <configured>false</configured>
+    </method>
+  </methods>
+  <resource>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="SHR同步人员至打卡机" />
+      <lang locale="zh_HK" value="SHR同步人員至打卡機" />
+      <lang locale="zh_TW" value="SHR同步人員至打卡機" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].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].extendedProperty.userDefined">
+      <lang locale="en_US" value="true" />
+      <lang locale="zh_CN" value="true" />
+      <lang locale="zh_TW" value="true" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade].methods.method[dimissionPerson].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[dimissionPerson].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[dimissionPerson].parameters.parameter[personNumbers].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[dimissionPerson].parameters.parameter[personNumbers].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[initializePerson].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[initializePerson].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[recoverPerson].alias">
+      <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[recoverPerson].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[recoverPerson].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[recoverPerson].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[updatePerson].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[updatePerson].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[updatePerson].parameters.parameter[personNumbers].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[updatePerson].parameters.parameter[personNumbers].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
+  </resource>
+</facade>

+ 27 - 0
metadata/com/kingdee/eas/custom/synctask/task/task.package

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="com.kingdee.bos.metadata">
+  <package>com.kingdee.eas.custom.synctask.task</package>
+  <name>task</name>
+  <alias>package[com.kingdee.eas.custom.synctask.task.task].alias</alias>
+  <description>package[com.kingdee.eas.custom.synctask.task.task].description</description>
+  <basicCode />
+  <resource>
+    <rs key="package[com.kingdee.eas.custom.synctask.task.task].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="package[com.kingdee.eas.custom.synctask.task.task].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="package[com.kingdee.eas.custom.synctask.task.task].extendedProperty.userDefined">
+      <lang locale="en_US" value="true" />
+      <lang locale="zh_CN" value="true" />
+      <lang locale="zh_TW" value="true" />
+    </rs>
+  </resource>
+</package>

+ 1 - 0
metadata/facade_pkmapping.properties

@@ -4,4 +4,5 @@ CCFA1696=com.kingdee.eas.hr.perf.app.PerfEvaluObjectFacade
 BA818384=com.kingdee.eas.hr.perf.task.TargetsOrgTaskFacade
 BAE52A17=com.kingdee.eas.hr.project.app.WorkHoursFacade
 5DE95217=com.kingdee.eas.custom.dormitorysystem.task.DormitorysystemFacade
+E86B4FB3=com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacade
 

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

@@ -65,6 +65,9 @@ public class PersonControllerBeanEx extends PersonControllerBean {
             model = PersonFactory.getLocalInstance(ctx).getPersonInfo(new ObjectUuidPK(model.getId()));
         }
         ISynPersonToPunchCardFacade iSynPersonToPunchCardFacade = SynPersonToPunchCardFacadeFactory.getLocalInstance(ctx);
+        //ÈËÔ±¸üÐÂ
         iSynPersonToPunchCardFacade.updatePerson(model.getNumber());
+        //ÈËԱɾ³ý
+        iSynPersonToPunchCardFacade.dimissionPerson(model.getNumber());
     }
 }

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

@@ -0,0 +1,127 @@
+package com.kingdee.eas.custom.synctask.task;
+
+import javax.ejb.*;
+import java.rmi.RemoteException;
+import com.kingdee.bos.*;
+import com.kingdee.bos.util.BOSObjectType;
+import com.kingdee.bos.metadata.IMetaDataPK;
+import com.kingdee.bos.metadata.rule.RuleExecutor;
+import com.kingdee.bos.metadata.MetaDataPK;
+//import com.kingdee.bos.metadata.entity.EntityViewInfo;
+import com.kingdee.bos.framework.ejb.AbstractEntityControllerBean;
+import com.kingdee.bos.framework.ejb.AbstractBizControllerBean;
+//import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.dao.IObjectValue;
+import com.kingdee.bos.dao.IObjectCollection;
+import com.kingdee.bos.service.ServiceContext;
+import com.kingdee.bos.service.IServiceContext;
+import com.kingdee.eas.framework.Result;
+import com.kingdee.eas.framework.LineResult;
+import com.kingdee.eas.framework.exception.EASMultiException;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+
+import com.kingdee.eas.common.EASBizException;
+import java.lang.String;
+
+
+
+public abstract class AbstractSynPersonToPunchCardFacadeControllerBean extends AbstractBizControllerBean implements SynPersonToPunchCardFacadeController
+{
+    protected AbstractSynPersonToPunchCardFacadeControllerBean()
+    {
+    }
+
+    protected BOSObjectType getBOSType()
+    {
+        return new BOSObjectType("E86B4FB3");
+    }
+
+    public void updatePerson(Context ctx, String personNumbers) throws BOSException, EASBizException
+    {
+        try {
+            ServiceContext svcCtx = createServiceContext(new MetaDataPK("6db1769f-0802-4879-b726-8023ea5a454c"), new Object[]{ctx, personNumbers});
+            invokeServiceBefore(svcCtx);
+              if(!svcCtx.invokeBreak()) {
+            _updatePerson(ctx, personNumbers);
+            }
+            invokeServiceAfter(svcCtx);
+        } catch (BOSException ex) {
+            throw ex;
+        } catch (EASBizException ex0) {
+            throw ex0;
+        } finally {
+            super.cleanUpServiceState();
+        }
+    }
+    protected void _updatePerson(Context ctx, String personNumbers) throws BOSException, EASBizException
+    {    	
+        return;
+    }
+
+    public void dimissionPerson(Context ctx, String personNumbers) throws BOSException, EASBizException
+    {
+        try {
+            ServiceContext svcCtx = createServiceContext(new MetaDataPK("316ebe86-8f48-43ff-a818-48a8d697df86"), new Object[]{ctx, personNumbers});
+            invokeServiceBefore(svcCtx);
+              if(!svcCtx.invokeBreak()) {
+            _dimissionPerson(ctx, personNumbers);
+            }
+            invokeServiceAfter(svcCtx);
+        } catch (BOSException ex) {
+            throw ex;
+        } catch (EASBizException ex0) {
+            throw ex0;
+        } finally {
+            super.cleanUpServiceState();
+        }
+    }
+    protected void _dimissionPerson(Context ctx, String personNumbers) throws BOSException, EASBizException
+    {    	
+        return;
+    }
+
+    public void recoverPerson(Context ctx, int offSet) throws BOSException, EASBizException
+    {
+        try {
+            ServiceContext svcCtx = createServiceContext(new MetaDataPK("f37075a8-3791-4dc8-abd3-bed376178d6b"), new Object[]{ctx, new Integer(offSet)});
+            invokeServiceBefore(svcCtx);
+              if(!svcCtx.invokeBreak()) {
+            _recoverPerson(ctx, offSet);
+            }
+            invokeServiceAfter(svcCtx);
+        } catch (BOSException ex) {
+            throw ex;
+        } catch (EASBizException ex0) {
+            throw ex0;
+        } finally {
+            super.cleanUpServiceState();
+        }
+    }
+    protected void _recoverPerson(Context ctx, int offSet) throws BOSException, EASBizException
+    {    	
+        return;
+    }
+
+    public void initializePerson(Context ctx) throws BOSException, EASBizException
+    {
+        try {
+            ServiceContext svcCtx = createServiceContext(new MetaDataPK("88d05883-070c-4ac7-89ae-b25d4fde47b6"), new Object[]{ctx});
+            invokeServiceBefore(svcCtx);
+              if(!svcCtx.invokeBreak()) {
+            _initializePerson(ctx);
+            }
+            invokeServiceAfter(svcCtx);
+        } catch (BOSException ex) {
+            throw ex;
+        } catch (EASBizException ex0) {
+            throw ex0;
+        } finally {
+            super.cleanUpServiceState();
+        }
+    }
+    protected void _initializePerson(Context ctx) throws BOSException, EASBizException
+    {    	
+        return;
+    }
+
+}

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

@@ -0,0 +1,22 @@
+package com.kingdee.eas.custom.synctask.task;
+
+import com.kingdee.bos.BOSException;
+//import com.kingdee.bos.metadata.*;
+import com.kingdee.bos.framework.*;
+import com.kingdee.bos.util.*;
+import com.kingdee.bos.Context;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.util.*;
+import com.kingdee.eas.common.EASBizException;
+import java.lang.String;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.framework.*;
+
+public interface ISynPersonToPunchCardFacade extends IBizCtrl
+{
+    public void updatePerson(String personNumbers) throws BOSException, EASBizException;
+    public void dimissionPerson(String personNumbers) throws BOSException, EASBizException;
+    public void recoverPerson(int offSet) throws BOSException, EASBizException;
+    public void initializePerson() throws BOSException, EASBizException;
+}

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

@@ -0,0 +1,88 @@
+package com.kingdee.eas.custom.synctask.task;
+
+import com.kingdee.bos.framework.ejb.EJBRemoteException;
+import com.kingdee.bos.util.BOSObjectType;
+import java.rmi.RemoteException;
+import com.kingdee.bos.framework.AbstractBizCtrl;
+import com.kingdee.bos.orm.template.ORMObject;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.util.*;
+import com.kingdee.eas.common.EASBizException;
+import java.lang.String;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.framework.*;
+import com.kingdee.eas.custom.synctask.task.*;
+
+public class SynPersonToPunchCardFacade extends AbstractBizCtrl implements ISynPersonToPunchCardFacade
+{
+    public SynPersonToPunchCardFacade()
+    {
+        super();
+        registerInterface(ISynPersonToPunchCardFacade.class, this);
+    }
+    public SynPersonToPunchCardFacade(Context ctx)
+    {
+        super(ctx);
+        registerInterface(ISynPersonToPunchCardFacade.class, this);
+    }
+    public BOSObjectType getType()
+    {
+        return new BOSObjectType("E86B4FB3");
+    }
+    private SynPersonToPunchCardFacadeController getController() throws BOSException
+    {
+        return (SynPersonToPunchCardFacadeController)getBizController();
+    }
+    /**
+     *更新人员-User defined method
+     *@param personNumbers 人员编码(多个逗号隔开)
+     */
+    public void updatePerson(String personNumbers) throws BOSException, EASBizException
+    {
+        try {
+            getController().updatePerson(getContext(), personNumbers);
+        }
+        catch(RemoteException err) {
+            throw new EJBRemoteException(err);
+        }
+    }
+    /**
+     *离职人员-User defined method
+     *@param personNumbers 人员编码 (多个逗号隔开)
+     */
+    public void dimissionPerson(String personNumbers) throws BOSException, EASBizException
+    {
+        try {
+            getController().dimissionPerson(getContext(), personNumbers);
+        }
+        catch(RemoteException err) {
+            throw new EJBRemoteException(err);
+        }
+    }
+    /**
+     *recoverPerson-User defined method
+     *@param offSet 天数
+     */
+    public void recoverPerson(int offSet) throws BOSException, EASBizException
+    {
+        try {
+            getController().recoverPerson(getContext(), offSet);
+        }
+        catch(RemoteException err) {
+            throw new EJBRemoteException(err);
+        }
+    }
+    /**
+     *初始化人员-User defined method
+     */
+    public void initializePerson() throws BOSException, EASBizException
+    {
+        try {
+            getController().initializePerson(getContext());
+        }
+        catch(RemoteException err) {
+            throw new EJBRemoteException(err);
+        }
+    }
+}

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

@@ -0,0 +1,25 @@
+package com.kingdee.eas.custom.synctask.task;
+
+import com.kingdee.bos.BOSException;
+//import com.kingdee.bos.metadata.*;
+import com.kingdee.bos.framework.*;
+import com.kingdee.bos.util.*;
+import com.kingdee.bos.Context;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.util.*;
+import com.kingdee.eas.common.EASBizException;
+import java.lang.String;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.framework.*;
+
+import java.rmi.RemoteException;
+import com.kingdee.bos.framework.ejb.BizController;
+
+public interface SynPersonToPunchCardFacadeController extends BizController
+{
+    public void updatePerson(Context ctx, String personNumbers) throws BOSException, EASBizException, RemoteException;
+    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;
+}

+ 643 - 0
src/com/kingdee/eas/custom/synctask/task/SynPersonToPunchCardFacadeControllerBean.java

@@ -0,0 +1,643 @@
+package com.kingdee.eas.custom.synctask.task;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.metadata.data.SortType;
+import com.kingdee.bos.metadata.entity.*;
+import com.kingdee.bos.metadata.query.util.CompareType;
+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.hr.affair.IResignBizBillEntry;
+import com.kingdee.eas.hr.affair.ResignBizBillEntryCollection;
+import com.kingdee.eas.hr.affair.ResignBizBillEntryFactory;
+import com.kingdee.eas.hr.affair.ResignBizBillEntryInfo;
+import com.kingdee.eas.hr.ats.AtsUtil;
+import com.kingdee.eas.hr.base.*;
+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.scm.util.datetime.DateTimeUtil;
+import oadd.org.apache.commons.codec.digest.DigestUtils;
+import okhttp3.*;
+import org.apache.log4j.Logger;
+
+import javax.ejb.*;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.rmi.RemoteException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+import com.kingdee.bos.*;
+import com.kingdee.bos.util.BOSObjectType;
+import com.kingdee.bos.metadata.IMetaDataPK;
+import com.kingdee.bos.metadata.rule.RuleExecutor;
+import com.kingdee.bos.metadata.MetaDataPK;
+//import com.kingdee.bos.metadata.entity.EntityViewInfo;
+import com.kingdee.bos.framework.ejb.AbstractEntityControllerBean;
+import com.kingdee.bos.framework.ejb.AbstractBizControllerBean;
+//import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.dao.IObjectValue;
+import com.kingdee.bos.dao.IObjectCollection;
+import com.kingdee.bos.service.ServiceContext;
+import com.kingdee.bos.service.IServiceContext;
+
+
+public class SynPersonToPunchCardFacadeControllerBean extends AbstractSynPersonToPunchCardFacadeControllerBean {
+    private static Logger logger =
+            Logger.getLogger("com.kingdee.eas.custom.synctask.task.SynPersonToPunchCardFacadeControllerBean");
+    private volatile Properties propt;  // 使用 volatile 保证可见性
+    private final Object configLock = new Object();
+    private static final OkHttpClient client = new OkHttpClient.Builder()
+            .connectTimeout(30, TimeUnit.SECONDS)
+            .readTimeout(30, TimeUnit.SECONDS)
+            .build();
+
+    private void loadProperties() throws BOSException {
+        if (propt == null) {  // 第一次检查
+            synchronized (configLock) {
+                if (propt == null) {  // 第二次检查(双重检查锁)
+                    Properties temp = new Properties();
+                    String path = System.getProperty("EAS_HOME") + "/server/properties/abk/syncAtsConfig.properties";
+                    try (FileInputStream fis = new FileInputStream(path)) {  // try-with-resources 自动关闭流
+                        temp.load(fis);
+                        propt = temp;  // 原子性赋值
+                    } catch (IOException e) {
+                        String errorMsg = "加载配置文件失败: " + path + " | " + e.getMessage();
+                        logger.error(errorMsg, e);  // 使用日志记录代替 e.printStackTrace()
+                        throw new BOSException(errorMsg);
+                    }
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 人员离职
+     *
+     * @param ctx
+     * @throws BOSException
+     * @throws EASBizException
+     */
+    @Override
+    protected void _dimissionPerson(Context ctx, String personNumbers) throws BOSException, EASBizException {
+        logger.error("_dimissionPerson--");
+        loadProperties();
+        IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
+        //离职单
+        SelectorItemCollection sic = getSic();
+        FilterInfo filterInfo = new FilterInfo();
+        if (personNumbers.equals(null) || personNumbers.equals("")) {
+            throw new BOSException("同步人员编码不能为空!!");
+        }
+        filterInfo.getFilterItems().add(new FilterItemInfo("person.number", AtsUtil.toSet(personNumbers), CompareType.INCLUDE));
+        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(entityViewInfo);
+        if (personPositionCollection.size() <= 1) {
+            logger.error("personPositionCollection--" + personPositionCollection.size());
+            List<PersonPositionInfo> PersonPositionList = new ArrayList();
+            for (int i = 0; i < personPositionCollection.size(); i++) {
+                PersonPositionList.add(personPositionCollection.get(i));
+            }
+            logger.error("PersonPositionList--" + PersonPositionList.size());
+            JSONArray msgArray = new JSONArray();
+            Map messageMap = null;
+            if (PersonPositionList.size() > 180) {
+                List<PersonPositionCollection> objects = splitList(PersonPositionList, 180);
+                for (int i = 0; i < objects.size(); i++) {
+                    PersonPositionCollection coll = objects.get(i);
+                    personDelete(ctx, coll);
+                }
+            } else {
+                personDelete(ctx, personPositionCollection);
+                msgArray.add(messageMap);
+            }
+        }
+    }
+
+    /**
+     * 人员删除
+     *
+     * @param ctx
+     * @param personPositionCollection
+     * @throws BOSException
+     */
+    public void personDelete(Context ctx, PersonPositionCollection personPositionCollection) throws BOSException {
+        logger.error("personDelete--");
+        //离职单
+        IResignBizBillEntry iResignBizBillEntry = ResignBizBillEntryFactory.getLocalInstance(ctx);
+        for (int i = 0; i < personPositionCollection.size(); i++) {
+            PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
+            PersonInfo person = personPositionInfo.getPerson();
+            EmployeeTypeInfo employeeType = person.getEmployeeType();
+            //判断是否是离职人员
+            String number = employeeType.getNumber();
+            logger.error("person--" + person.getName() + "--employeeType--" + number);
+            if (number.equals("010") || number.equals("009") || number.equals("S09")) {
+                //人员离职
+                JSONObject result = synLeavePerson(iResignBizBillEntry, person);
+                logger.error("personDelete--" + result);
+            }
+        }
+    }
+
+    /**
+     * 人员恢复
+     *
+     * @param ctx
+     * @throws BOSException
+     * @throws EASBizException
+     */
+    @Override
+    protected void _recoverPerson(Context ctx, int offSet) throws BOSException, EASBizException {
+        logger.error("_recoverPerson--");
+        loadProperties();
+        String dayBefore = getDayBefore(new Date(), offSet);
+        logger.error("_recoverPerson--dayBefore--" + dayBefore);
+        //员工变动记录
+        IEmpPosOrgRelation iEmpPosOrgRelation = EmpPosOrgRelationFactory.getLocalInstance(ctx);
+        Set personSet = getPersonDateByDate(ctx, dayBefore);
+        logger.error("_recoverPerson--personSet--" + dayBefore);
+        //查询字段
+        SelectorItemCollection sic = new SelectorItemCollection();
+        sic.add("id");
+        sic.add("number");
+        sic.add("person.id");
+        sic.add("person.number");
+        sic.add("action.id");
+        sic.add("action.number");
+
+        //过滤条件
+        FilterInfo filterInfo = new FilterInfo();
+        FilterItemCollection filterItems = filterInfo.getFilterItems();
+        filterItems.add(new FilterItemInfo("person", personSet, CompareType.INCLUDE));
+
+        //排序条件
+        SorterItemCollection sorter = new SorterItemCollection();
+        SorterItemInfo sorterItem = new SorterItemInfo("createTime");
+        sorterItem.setSortType(SortType.DESCEND);
+        sorter.add(sorterItem);
+
+        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, sorter);
+        //查询变动记录是否存在在入职
+        JSONArray personNumber = new JSONArray();
+        EmpPosOrgRelationCollection empPosOrgRelationCollection = iEmpPosOrgRelation.getEmpPosOrgRelationCollection(entityViewInfo);
+        for (int i = 0; i < empPosOrgRelationCollection.size(); i++) {
+            EmpPosOrgRelationInfo empPosOrgRelationInfo = empPosOrgRelationCollection.get(i);
+            //变动操作编码
+            String actionNumebr = empPosOrgRelationInfo.getAction().getNumber();
+            //变动操作等于在入职 则执行人员恢复操作
+            if (actionNumebr.equals("SHR02")) {
+                personNumber.add(empPosOrgRelationInfo.getPerson().getNumber());
+            }
+        }
+        logger.error("personNumber--" + personNumber);
+        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);
+            // 调用接口
+            String urlPath = propt.getProperty("recoverUrlPath");
+            String result = sendPostRequest(urlPath, params, queryParams);
+            logger.error("result--" + result);
+        }
+
+
+    }
+
+    /***
+     * 获取时间内的人员ID
+     * @param ctx
+     * @param dayBefore
+     * @throws BOSException
+     */
+    private Set getPersonDateByDate(Context ctx, String dayBefore) throws BOSException {
+        //员工
+        IPerson iPerson = PersonFactory.getLocalInstance(ctx);
+        FilterInfo filterInfo = new FilterInfo();
+        FilterItemCollection filterItems = filterInfo.getFilterItems();
+        filterItems.add(new FilterItemInfo("hireDate", dayBefore, CompareType.GREATER_EQUALS));
+        filterItems.add(new FilterItemInfo("hireDate", new Date(), CompareType.LESS_EQUALS));
+        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, null, null);
+        logger.error("filterInfo--" + filterInfo.toSql());
+        //获取时间段的人员
+        PersonCollection personCollection = iPerson.getPersonCollection(entityViewInfo);
+        logger.error("personCollection--" + personCollection.size());
+        Set personSet = new HashSet();
+        for (int i = 0; i < personCollection.size(); i++) {
+            PersonInfo personInfo = personCollection.get(i);
+            personSet.add(personInfo.getId());
+        }
+        return personSet;
+    }
+
+
+    /**
+     * 往前推多少天
+     *
+     * @param specifiedDay
+     * @param x
+     * @return
+     */
+    public String getDayBefore(Date specifiedDay, int x) {
+        Calendar c = Calendar.getInstance();
+        Date date = specifiedDay;
+        c.setTime(date);
+        int day = c.get(Calendar.DATE);
+        c.set(Calendar.DATE, day - x);    //往前推几天
+        //c.set(Calendar.DATE, day + x);  往后推几天
+
+        String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
+        //System.out.println(dayBefore);
+        return dayBefore;
+    }
+
+    /**
+     * 同步人员
+     *
+     * @param ctx
+     * @param personNumbers
+     * @throws BOSException
+     * @throws EASBizException
+     */
+    @Override
+
+    protected void _updatePerson(Context ctx, String personNumbers) throws BOSException, EASBizException {
+        logger.error("_updatePerson--");
+        loadProperties();
+        IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
+        //离职单
+        SelectorItemCollection sic = getSic();
+        FilterInfo filterInfo = new FilterInfo();
+        if (personNumbers.equals(null) || personNumbers.equals("")) {
+            throw new BOSException("同步人员编码不能为空!!");
+        }
+        filterInfo.getFilterItems().add(new FilterItemInfo("person.number", AtsUtil.toSet(personNumbers), CompareType.INCLUDE));
+        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
+        PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(entityViewInfo);
+        logger.error("personPositionCollection--" + personPositionCollection.size());
+        List<PersonPositionInfo> PersonPositionList = new ArrayList();
+        for (int i = 0; i < personPositionCollection.size(); i++) {
+            PersonPositionList.add(personPositionCollection.get(i));
+        }
+        logger.error("PersonPositionList--" + PersonPositionList.size());
+        JSONArray msgArray = new JSONArray();
+        Map messageMap = null;
+        if (PersonPositionList.size() > 180) {
+            List<PersonPositionCollection> objects = splitList(PersonPositionList, 180);
+            for (int i = 0; i < objects.size(); i++) {
+                PersonPositionCollection coll = objects.get(i);
+                messageMap = updateSynPersonData(coll);
+                msgArray.add(messageMap);
+            }
+        } else {
+            messageMap = updateSynPersonData(personPositionCollection);
+            msgArray.add(messageMap);
+        }
+        //Map messageMap = synPersonData(personPositionCollection, iResignBizBillEntry);
+        logger.error("msgArray--" + msgArray);
+    }
+
+    /**
+     * 更新人员-逻辑
+     *
+     * @param personPositionCollection
+     * @return
+     * @throws BOSException
+     */
+    private Map updateSynPersonData(PersonPositionCollection personPositionCollection) throws BOSException {
+        logger.error("updateSynPersonData--");
+        Map messageMap = new HashMap();
+        //更新人员数据
+        JSONArray params = new JSONArray();
+        for (int i = 0; i < personPositionCollection.size(); i++) {
+            PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
+            PersonInfo person = personPositionInfo.getPerson();
+            EmployeeTypeInfo employeeType = person.getEmployeeType();
+            //判断是否是离职人员
+            String number = employeeType.getNumber();
+            logger.error("person--" + person.getName() + "--employeeType--" + number);
+            if (!number.equals("010") && !number.equals("009") && !number.equals("S09")) {
+                // 构建请求体(自动处理时间范围)
+                JSONObject param = new JSONObject();
+                param.put("name", person.getName()); //员工名称
+                param.put("pin", person.getNumber()); //员工编码
+                param.put("deptnumber", "1");  //部门编码
+                params.add(param);
+            }
+        }
+        logger.error("updateSynPersonData--params--" + params);
+        if (params.size() > 0) {
+            //更新人员
+            String response = synPerson(params);
+            // 处理响应
+            if (response != null) {
+                messageMap.put("updatePersonMsg", response);
+            }
+        }
+        return messageMap;
+    }
+
+    /**
+     * 人员初始化
+     *
+     * @param ctx
+     * @throws BOSException
+     * @throws EASBizException
+     */
+    @Override
+    protected void _initializePerson(Context ctx) throws BOSException {
+        logger.error("_initializePerson--");
+        loadProperties();
+        IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
+        //离职单
+        IResignBizBillEntry iResignBizBillEntry = ResignBizBillEntryFactory.getLocalInstance(ctx);
+        //获取查询参数
+        SelectorItemCollection sic = getSic();
+        EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(null, sic, null);
+        PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(entityViewInfo);
+        logger.error("personPositionCollection--" + personPositionCollection.size());
+        List<PersonPositionInfo> PersonPositionList = new ArrayList();
+        for (int i = 0; i < personPositionCollection.size(); i++) {
+            PersonPositionList.add(personPositionCollection.get(i));
+        }
+        logger.error("PersonPositionList--" + PersonPositionList.size());
+        JSONArray msgArray = new JSONArray();
+        Map messageMap = null;
+        if (PersonPositionList.size() > 180) {
+            List<PersonPositionCollection> objects = splitList(PersonPositionList, 180);
+            for (int i = 0; i < objects.size(); i++) {
+                PersonPositionCollection coll = objects.get(i);
+                messageMap = initializeSynPersonData(coll, iResignBizBillEntry);
+                msgArray.add(messageMap);
+            }
+        } else {
+            messageMap = initializeSynPersonData(personPositionCollection, iResignBizBillEntry);
+            msgArray.add(messageMap);
+        }
+        //Map messageMap = synPersonData(personPositionCollection, iResignBizBillEntry);
+        logger.error("msgArray--" + msgArray);
+    }
+
+    /**
+     * 初始化同步人员数据
+     *
+     * @param personPositionCollection
+     * @param iResignBizBillEntry
+     * @return
+     * @throws BOSException
+     */
+    private Map initializeSynPersonData(PersonPositionCollection personPositionCollection, IResignBizBillEntry iResignBizBillEntry) throws BOSException {
+        Map messageMap = new HashMap();
+        //更新人员数据
+        JSONArray params = new JSONArray();
+        //人员离职数据
+        JSONArray leavePersonMsg = new JSONArray();
+        List<PersonInfo> deletePersonList = new ArrayList();
+        for (int i = 0; i < personPositionCollection.size(); i++) {
+            PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
+            PersonInfo person = personPositionInfo.getPerson();
+            EmployeeTypeInfo employeeType = person.getEmployeeType();
+            //判断是否是离职人员
+            String number = employeeType.getNumber();
+            logger.error("person--" + person.getName() + "--employeeType--" + number);
+            if (number.equals("010") || number.equals("009") || number.equals("S09")) {
+                //离职人员
+                deletePersonList.add(person);
+            } else {
+                // 构建请求体(自动处理时间范围)
+                JSONObject param = new JSONObject();
+                param.put("name", person.getName()); //员工名称
+                param.put("pin", person.getNumber()); //员工编码
+                param.put("deptnumber", "1");  //部门编码
+                params.add(param);
+            }
+        }
+        messageMap.put("leavePersonMsg", leavePersonMsg.toString());
+        if (params.size() > 0) {
+            //更新人员
+            String response = synPerson(params);
+            // 处理响应
+            if (response != null) {
+                messageMap.put("updatePersonMsg", response);
+            }
+        }
+        //新增人员后再更新离职人员
+        for (int i = 0; i < deletePersonList.size(); i++) {
+            PersonInfo person = deletePersonList.get(i);
+            //人员离职
+            JSONObject result = synLeavePerson(iResignBizBillEntry, person);
+            if (result != null) {
+                leavePersonMsg.add(result);
+            }
+        }
+        return messageMap;
+    }
+
+
+    /**
+     * 查询参数
+     */
+    public SelectorItemCollection getSic() {
+        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");
+        return sic;
+    }
+
+    /**
+     * 分割数据
+     *
+     * @param coll
+     * @param len
+     * @return
+     */
+    public List<PersonPositionCollection> splitList(List coll, int len) {
+        List<PersonPositionCollection> result = new ArrayList();
+        int size = coll.size();
+        int count = (size + len - 1) / len;
+        for (int i = 0; i < count; i++) {
+            PersonPositionCollection personPositionCollection = new PersonPositionCollection();
+            List<PersonPositionInfo> subList = coll.subList(i * len, ((i + 1) * len > size) ? size : (len * (i + 1)));
+            for (int p = 0; p < subList.size(); p++) {
+                PersonPositionInfo personPositionInfo = subList.get(p);
+                personPositionCollection.add(personPositionInfo);
+            }
+            result.add(personPositionCollection);
+        }
+        return result;
+
+    }
+
+
+    /**
+     * 人员离职
+     *
+     * @param personInfo
+     */
+    public JSONObject synLeavePerson(IResignBizBillEntry iResignBizBillEntry, PersonInfo personInfo) throws BOSException {
+        logger.error("synLeavePerson-----");
+        ResignBizBillEntryCollection entryInfo = iResignBizBillEntry.getResignBizBillEntryCollection("where person.id = '" + personInfo.getId() + "'");
+        JSONObject param = new JSONObject();
+        if (entryInfo.size() > 0) {
+            ResignBizBillEntryInfo resignBizBillEntryInfo = entryInfo.get(0);
+            Date bizDate = resignBizBillEntryInfo.getBizDate();
+            param.put("pin", personInfo.getNumber()); //员工编码
+            param.put("leavedate", DateTimeUtil.getFmtDate(bizDate, "yyyy-MM-dd HH:mm")); //离职日期
+            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);
+        // 调用接口
+        String urlPath = propt.getProperty("leaveUrlPath");
+        String response = sendPostRequest(urlPath, param, queryParams);
+        // 处理响应
+        if (response != null) {
+            JSONObject result = JSONObject.parseObject(response);
+            if ("0".equals(result.getString("ret"))) {
+                logger.error(personInfo.getId() + "_" + personInfo.getName() + "result--" + result);
+            }
+            return result;
+        }
+        return null;
+    }
+
+    /**
+     * 更新人员
+     *
+     * @param params
+     * @return
+     */
+    private String synPerson(JSONArray params) {
+        // 生成 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);
+        // 调用接口
+        String urlPath = propt.getProperty("updateUrlPath");
+        return sendPostRequest(urlPath, params, queryParams);
+    }
+
+    /**
+     * 发送 POST 请求(JSON 格式)
+     *
+     * @param urlPath     接口地址(可含路径参数,如 `/api/v2/transaction/get`)
+     * @param params      JSON 请求体
+     * @param queryParams URL 查询参数(如 `timestamp` 和 `token`)
+     * @return 响应体字符串(失败返回 null)
+     */
+    public static String sendPostRequest(String urlPath, JSONArray params, 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, params.toJSONString());
+
+            // 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;
+    }
+
+    /**
+     * 发送 POST 请求(JSON 格式)
+     *
+     * @param urlPath     接口地址(可含路径参数,如 `/api/v2/transaction/get`)
+     * @param params      JSON 请求体
+     * @param queryParams URL 查询参数(如 `timestamp` 和 `token`)
+     * @return 响应体字符串(失败返回 null)
+     */
+    public static String sendPostRequest(String urlPath, JSONObject params, 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, params.toJSONString());
+
+            // 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;
+    }
+
+
+}

+ 30 - 0
src/com/kingdee/eas/custom/synctask/task/SynPersonToPunchCardFacadeFactory.java

@@ -0,0 +1,30 @@
+package com.kingdee.eas.custom.synctask.task;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.BOSObjectFactory;
+import com.kingdee.bos.util.BOSObjectType;
+import com.kingdee.bos.Context;
+
+public class SynPersonToPunchCardFacadeFactory
+{
+    private SynPersonToPunchCardFacadeFactory()
+    {
+    }
+    public static com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade getRemoteInstance() throws BOSException
+    {
+        return (com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade)BOSObjectFactory.createRemoteBOSObject(new BOSObjectType("E86B4FB3") ,com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade.class);
+    }
+    
+    public static com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade getRemoteInstanceWithObjectContext(Context objectCtx) throws BOSException
+    {
+        return (com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade)BOSObjectFactory.createRemoteBOSObjectWithObjectContext(new BOSObjectType("E86B4FB3") ,com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade.class, objectCtx);
+    }
+    public static com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade getLocalInstance(Context ctx) throws BOSException
+    {
+        return (com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade)BOSObjectFactory.createBOSObject(ctx, new BOSObjectType("E86B4FB3"));
+    }
+    public static com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade getLocalInstance(String sessionID) throws BOSException
+    {
+        return (com.kingdee.eas.custom.synctask.task.ISynPersonToPunchCardFacade)BOSObjectFactory.createBOSObject(sessionID, new BOSObjectType("E86B4FB3"));
+    }
+}

+ 31 - 41
websrc/com/kingdee/eas/custom/dormitorysystem/application/handler/RoomChangeApplicationEditHandler.java

@@ -7,7 +7,7 @@ import com.kingdee.bos.dao.AbstractObjectCollection;
 import com.kingdee.bos.metadata.entity.*;
 import com.kingdee.bos.metadata.query.util.CompareType;
 import com.kingdee.bos.util.BOSUuid;
-import com.kingdee.eas.base.permission.UserInfo;
+import com.kingdee.eas.basedata.org.HROrgUnitInfo;
 import com.kingdee.eas.basedata.person.Genders;
 import com.kingdee.eas.basedata.person.PersonInfo;
 import com.kingdee.eas.common.EASBizException;
@@ -28,20 +28,13 @@ import com.kingdee.eas.framework.ICoreBillBase;
 import com.kingdee.eas.hr.ats.AtsUtil;
 import com.kingdee.eas.hr.base.HRBillBaseEntryInfo;
 import com.kingdee.eas.hr.base.HRBillBaseInfo;
-import com.kingdee.eas.hr.emp.IPersonPosition;
-import com.kingdee.eas.hr.emp.PersonPositionFactory;
-import com.kingdee.eas.hr.emp.PersonPositionInfo;
-import com.kingdee.eas.util.app.ContextUtil;
 import com.kingdee.shr.base.syssetting.BasicItemStateEnum;
-import com.kingdee.shr.base.syssetting.IMSFServiceFacade;
-import com.kingdee.shr.base.syssetting.MSFServiceFacadeFactory;
 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.util.DateTimeUtils;
 import com.kingdee.util.StringUtils;
 import org.apache.log4j.Logger;
-import org.springframework.ui.ModelMap;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -54,40 +47,37 @@ import java.util.*;
  * @apiNote ABK_换宿申请单
  */
 public class RoomChangeApplicationEditHandler extends HRBillBaseEditHandler {
-    private Logger logger = Logger.getLogger(this.getClass());
+    private Logger logger = Logger.getLogger(RoomChangeApplicationEditHandler.class);
     private Context ctx = SHRContext.getInstance().getContext();
 
     @Override
     protected void beforeSubmit(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model) throws SHRWebException {
+        logger.error("beforeSubmit--");
         HRBillBaseInfo hrBillBaseInfo = (HRBillBaseInfo) model;
-        String billIds = hrBillBaseInfo.getId().toString();
-        Map result = null;
-        Map<String, String> params = new HashMap<String, String>();
-        params.put("billIds", billIds);
-        try {
-            //校验房间是否可入住
-            //IMSFServiceFacade imsfServiceFacade = MSFServiceFacadeFactory.getLocalInstance(ctx);
-            //result = (Map) imsfServiceFacade.processService("validateRoomAvailableByBillIdsService", params);
-            result = validateRoomAvailableByBillIds(billIds);
-        } catch (Exception e) {
-            logger.error(e);
-            throw new ShrWebBizException("调用接口validateRoomAvailableByBillIdsService报错: " + e.getMessage());
-        }
-        Integer code = (Integer) result.get("code");
-        if (500 == code) {
-            List<String> errorMsgList = (List<String>) result.get("errorMsg");
-            StringBuilder errorMsgBuilder = new StringBuilder();
-            for (String errorMsg : errorMsgList) {
-                errorMsgBuilder.append(errorMsg).append("\n");
-            }
-            throw new ShrWebBizException(errorMsgBuilder.toString());
-        }
-        //设置单据状态为未审批
-        model.setInt("billState", 1);
+        //String billIds = hrBillBaseInfo.getId().toString();
+        //Map result = null;
+        //try {
+        //    //result = validateRoomAvailableByBillIds(billIds);
+        //} catch (Exception e) {
+        //    logger.error(e);
+        //    throw new ShrWebBizException("调用方法validateRoomAvailableByBillIds报错: " + e.getMessage());
+        //}
+        //Integer code = (Integer) result.get("code");
+        //if (500 == code) {
+        //    List<String> errorMsgList = (List<String>) result.get("errorMsg");
+        //    StringBuilder errorMsgBuilder = new StringBuilder();
+        //    for (String errorMsg : errorMsgList) {
+        //        errorMsgBuilder.append(errorMsg).append("\n");
+        //    }
+        //    throw new ShrWebBizException(errorMsgBuilder.toString());
+        //}
+        ////设置单据状态为未审批
+        //model.setInt("billState", 1);
         super.beforeSubmit(request, response, model);
     }
 
     public Map validateRoomAvailableByBillIds(String billIds) throws BOSException {
+        logger.error("validateRoomAvailableByBillIds--");
         if (StringUtils.isEmpty(billIds)) {
             logger.error("单据id不能为空!");
             throw new BOSException("单据id不能为空!");
@@ -111,12 +101,14 @@ public class RoomChangeApplicationEditHandler extends HRBillBaseEditHandler {
         filterItems.add(new FilterItemInfo("id", AtsUtil.toSet(billIds), CompareType.INCLUDE));
         EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
         CoreBillBaseCollection hrBillBaseCollection = iCoreBillBase.getCoreBillBaseCollection(viewInfo);
+        logger.error("hrBillBaseCollection--" + hrBillBaseCollection.size());
         for (int i = 0; i < hrBillBaseCollection.size(); i++) {
             HRBillBaseInfo hrBillBaseInfo = (HRBillBaseInfo) hrBillBaseCollection.get(i);
             //String billId = hrBillBaseInfo.getId().toString();
             String baseInfoNumber = hrBillBaseInfo.getNumber();
             String bosType = hrBillBaseInfo.getId().getType().toString();
             AbstractObjectCollection entrys = (AbstractObjectCollection) hrBillBaseInfo.get("entrys");
+            logger.error("entrys--" + entrys.size());
             for (int j = 0; j < entrys.size(); j++) {
                 try {
                     HRBillBaseEntryInfo entryInfo = (HRBillBaseEntryInfo) entrys.getObject(j);
@@ -124,14 +116,10 @@ public class RoomChangeApplicationEditHandler extends HRBillBaseEditHandler {
                     //B371AC0A 换宿单分录
                     if ("B371AC0A".equals(bosType)) {
                         //换宿单
-                        //调整日期
-                        checkInDate = entryInfo.getDate("adjustmentDate");
-                    } else {
-                        //入住日期
                         checkInDate = entryInfo.getDate("checkInDate");
                     }
                     if (checkInDate == null) {
-                        throw new BOSException("入住日期不能为空!");
+                        throw new BOSException("换宿日期不能为空!");
                     }
                     //退宿日期
                     Date checkoutDate = entryInfo.getDate("checkoutDate");
@@ -162,11 +150,11 @@ public class RoomChangeApplicationEditHandler extends HRBillBaseEditHandler {
                     validateDormitoryInfo(ctx, personInfo, dormitory);
                     //可住人数
                     int occupancyCapacity = dormitory.getOccupancyCapacity();
-                    //2.根据入住日期和退宿日期算出入住信息房间已住人数
+                    //2.根据换宿日期和退宿日期算出入住信息房间已住人数
                     dormCheckInCount += getCheckInInfoByOccupants(ctx, checkInDate, checkoutDate, roomId, personType);
-                    //3.根据入住日期和退宿日期算出入住申请单状态为申请中的已住人数
+                    //3.根据换宿日期和退宿日期算出入住申请单状态为申请中的已住人数
                     dormCheckInCount += getCheckInInfoByCheckInApplication(ctx, checkInDate, checkoutDate, roomId, personType);
-                    //4.根据入住日期和退宿日期算出换宿申请单状态为申请中的已住人数
+                    //4.根据换宿日期和退宿日期算出换宿申请单状态为申请中的已住人数
                     dormCheckInCount += getRoomChangeInfoByRoomChangeApplication(ctx, checkInDate, checkoutDate, roomId, personType);
                     //5.根据当前参数缓存算出已住人数
                     if (roomListMap.containsKey(roomId)) {
@@ -183,6 +171,8 @@ public class RoomChangeApplicationEditHandler extends HRBillBaseEditHandler {
                             }
                         }
                     }
+                    logger.error("occupancyCapacity--" + occupancyCapacity);
+                    logger.error("dormCheckInCount--" + dormCheckInCount);
                     //6.算出房间剩余可住人数: 可住人数 - 已住人数
                     if (occupancyCapacity - dormCheckInCount < 0) {
                         String dormitoryName = dormitory.getName();

+ 47 - 42
websrc/com/kingdee/eas/custom/dormitorysystem/application/handler/RoomChangeApplicationListHandler.java

@@ -1,16 +1,30 @@
 package com.kingdee.eas.custom.dormitorysystem.application.handler;
 
+import com.kingdee.bos.BOSException;
 import com.kingdee.bos.Context;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
 import com.kingdee.bos.util.BOSUuid;
 import com.kingdee.eas.basedata.org.HROrgUnitInfo;
+import com.kingdee.eas.basedata.person.PersonInfo;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.custom.dormitorysystem.application.RoomChangeApplicationEntryCollection;
+import com.kingdee.eas.custom.dormitorysystem.application.RoomChangeApplicationEntryInfo;
+import com.kingdee.eas.custom.dormitorysystem.application.RoomChangeApplicationFactory;
+import com.kingdee.eas.custom.dormitorysystem.application.RoomChangeApplicationInfo;
+import com.kingdee.eas.custom.dormitorysystem.dormitory.DormitoryInfo;
+import com.kingdee.eas.custom.dormitorysystem.waterelectricity.*;
 import com.kingdee.eas.framework.CoreBaseInfo;
 import com.kingdee.eas.hr.base.HRBillBaseInfo;
+import com.kingdee.eas.scm.util.datetime.DateTimeUtil;
 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 org.apache.log4j.Logger;
+import org.springframework.ui.ModelMap;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
 
 /**
  * @author qingwu
@@ -29,47 +43,38 @@ public class RoomChangeApplicationListHandler extends DormitoryApplicationListHa
         hrBillBaseInfo.setHrOrgUnit(hrOrgUnitInfo);
         super.beforeSubmit(request, response, model);
     }
-//@Override
-    //public String deleteAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
-    //    String billId = this.getBillId(request);
-    //    FilterInfo fIlterInfo = new FilterInfo();
-    //    FilterItemCollection filterItems = fIlterInfo.getFilterItems();
-    //    filterItems.add(new FilterItemInfo("id", AtsUtil.toSet(billId), CompareType.INCLUDE));
-    //    filterItems.add(new FilterItemInfo("billState", "0", CompareType.NOTEQUALS));
-    //    EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(fIlterInfo, null, null);
-    //
-    //    CoreBaseCollection collection = new CoreBaseCollection();
-    //
-    //    IRoomChangeApplication iRoomChangeApplication = RoomChangeApplicationFactory.getLocalInstance(ctx);
-    //    RoomChangeApplicationCollection roomChangeApplicationCollection = iRoomChangeApplication.getRoomChangeApplicationCollection(entityViewInfo);
-    //    return super.deleteAction(request, response, modelMap);
-    //}
-
-    //public void againstApproveAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException, BOSException, EASBizException {
-    //    Map<String, Object> res = new HashMap();
-    //    Set<String> successIds = new HashSet();
-    //    res.put("successIds", successIds);
-    //    String billIds = this.getBillId(request);
-    //    FilterInfo fIlterInfo = new FilterInfo();
-    //    FilterItemCollection filterItems = fIlterInfo.getFilterItems();
-    //    filterItems.add(new FilterItemInfo("id", AtsUtil.toSet(billIds), CompareType.INCLUDE));
-    //    EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(fIlterInfo, null, null);
-    //
-    //    CoreBaseCollection collection = new CoreBaseCollection();
-    //
-    //    IRoomChangeApplication iRoomChangeApplication = RoomChangeApplicationFactory.getLocalInstance(ctx);
-    //    RoomChangeApplicationCollection roomChangeApplicationCollection = iRoomChangeApplication.getRoomChangeApplicationCollection(entityViewInfo);
-    //    for (int i = 0; i < roomChangeApplicationCollection.size(); i++) {
-    //        RoomChangeApplicationInfo roomChangeApplicationInfo = roomChangeApplicationCollection.get(i);
-    //        successIds.add(roomChangeApplicationInfo.getId().toString());
-    //        roomChangeApplicationInfo.setBillState(HRBillStateEnum.SAVED);
-    //        collection.add(roomChangeApplicationInfo);
-    //    }
-    //    SelectorItemCollection sic = new SelectorItemCollection();
-    //    sic.add("billState");
-    //    iRoomChangeApplication.save(collection);
-    //    res.put("msg", MLUtile.getRes(AtsOverTimeBillResEnum.againstApproveSuccess, this.ctx));
-    //    JSONUtils.writeJson(response, res);
-    //}
 
+    @Override
+    public void againstApproveAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException, BOSException {
+        logger.error("againstApproveAction---");
+        String billId = this.getBillId(request);
+        try {
+            RoomChangeApplicationInfo roomChangeApplicationInfo = RoomChangeApplicationFactory.getLocalInstance(ctx)
+                    .getRoomChangeApplicationInfo("select *, entrys.* ,entrys.person.* ,entrys.adjustRoom.* where id = '" + billId + "'");
+            RoomChangeApplicationEntryCollection entrys = roomChangeApplicationInfo.getEntrys();
+            RoomChangeApplicationEntryInfo entryInfo = entrys.get(0);
+            //换宿日期
+            Date checkInDate = entryInfo.getCheckInDate();
+            //调整房间
+            DormitoryInfo adjustRoom = entryInfo.getAdjustRoom();
+            //人员
+            PersonInfo person = entryInfo.getPerson();
+            //年月
+            String yearMonth = DateTimeUtil.getFmtDate(checkInDate, "yyyy-MM");
+            logger.error("yearMonth---" + yearMonth);
+            //水电明细
+            IWaterElectricity iWaterElectricity = WaterElectricityFactory.getLocalInstance(ctx);
+            String sql = "where person.id= '" + person.getId() + "' and yearMonth = '" + yearMonth + "' and dormitory.id = '" + adjustRoom.getId() + "'";
+            logger.error("sql---" + sql);
+            boolean exists = iWaterElectricity.exists(sql);
+            logger.error("exists---" + exists);
+            if (exists) {
+                throw new ShrWebBizException(person.getName() + "已经在" + yearMonth + ",产生水电明细不能进行反审批!!");
+            }
+        } catch (EASBizException e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+        super.againstApproveAction(request, response, modelMap);
+    }
 }