commit 9eda320ed5b5d5adb0aabc2a8d40014286168d3a Author: 黄正国 <438926402@qq.com> Date: Fri Apr 12 11:38:46 2024 +0800 项目初始化创建 diff --git a/lib/commons-lang3-3.8.1.jar b/lib/commons-lang3-3.8.1.jar new file mode 100644 index 0000000..2c65ce6 Binary files /dev/null and b/lib/commons-lang3-3.8.1.jar differ diff --git a/lib/dingtalk-1.5.24.jar b/lib/dingtalk-1.5.24.jar new file mode 100644 index 0000000..2b7f82f Binary files /dev/null and b/lib/dingtalk-1.5.24.jar differ diff --git a/lib/gson-2.8.9.jar b/lib/gson-2.8.9.jar new file mode 100644 index 0000000..3351867 Binary files /dev/null and b/lib/gson-2.8.9.jar differ diff --git a/lib/hamcrest-core-1.3.jar b/lib/hamcrest-core-1.3.jar new file mode 100644 index 0000000..9d5fe16 Binary files /dev/null and b/lib/hamcrest-core-1.3.jar differ diff --git a/lib/httpcore-4.4.10.jar b/lib/httpcore-4.4.10.jar new file mode 100644 index 0000000..dc510f8 Binary files /dev/null and b/lib/httpcore-4.4.10.jar differ diff --git a/lib/junit-4.13.1.jar b/lib/junit-4.13.1.jar new file mode 100644 index 0000000..b376ffc Binary files /dev/null and b/lib/junit-4.13.1.jar differ diff --git a/lib/lippi-oapi-encrpt.jar b/lib/lippi-oapi-encrpt.jar new file mode 100644 index 0000000..f112223 Binary files /dev/null and b/lib/lippi-oapi-encrpt.jar differ diff --git a/lib/lombok-1.18.10.jar b/lib/lombok-1.18.10.jar new file mode 100644 index 0000000..57ca614 Binary files /dev/null and b/lib/lombok-1.18.10.jar differ diff --git a/lib/servlet-api-2.5.jar b/lib/servlet-api-2.5.jar new file mode 100644 index 0000000..fb52493 Binary files /dev/null and b/lib/servlet-api-2.5.jar differ diff --git a/lib/taobao-sdk-java-auto_1479188381469-20221230-source.jar b/lib/taobao-sdk-java-auto_1479188381469-20221230-source.jar new file mode 100644 index 0000000..7197b12 Binary files /dev/null and b/lib/taobao-sdk-java-auto_1479188381469-20221230-source.jar differ diff --git a/lib/taobao-sdk-java-auto_1479188381469-20221230.jar b/lib/taobao-sdk-java-auto_1479188381469-20221230.jar new file mode 100644 index 0000000..1e30e66 Binary files /dev/null and b/lib/taobao-sdk-java-auto_1479188381469-20221230.jar differ diff --git a/lib/taotao-cloud-starter-dingtalk-2023.2.01.jar b/lib/taotao-cloud-starter-dingtalk-2023.2.01.jar new file mode 100644 index 0000000..b6cd39f Binary files /dev/null and b/lib/taotao-cloud-starter-dingtalk-2023.2.01.jar differ diff --git a/seeyon/WEB-INF/cfgHome/chushihua/pluginCfg.xml b/seeyon/WEB-INF/cfgHome/chushihua/pluginCfg.xml new file mode 100644 index 0000000..d17d194 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/chushihua/pluginCfg.xml @@ -0,0 +1,6 @@ + + + chushihua + 历史数据同步 + 20231208 + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/chushihua/spring/spring-quartz.xml b/seeyon/WEB-INF/cfgHome/chushihua/spring/spring-quartz.xml new file mode 100644 index 0000000..0a615e2 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/chushihua/spring/spring-quartz.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/chushihua/spring/spring.xml b/seeyon/WEB-INF/cfgHome/chushihua/spring/spring.xml new file mode 100644 index 0000000..071b955 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/chushihua/spring/spring.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/daohuaxiang/jyncfile.properties b/seeyon/WEB-INF/cfgHome/daohuaxiang/jyncfile.properties new file mode 100644 index 0000000..2907821 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/daohuaxiang/jyncfile.properties @@ -0,0 +1,28 @@ +profile=prod +prod.dowUrl=https://oa.dhx.com.cn/seeyon/rest/attachment/file +prod.profile=prod +prod.jyncFile=https://oa.dhx.com.cn/seeyon/dhxfile +prod.address=https://crm.dhx9.com +prod.newAddress=http://10.0.6.15:88 +prod.loginid=yc +prod.pwd=yc123456 +prod.tongyongApi=/api/workflow/paService/doCreateRequest +prod.appid=oa +prod.workflowId=8521 +prod.newWorkflowId=2026 +prod.spk=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAymEn8vp0E8pg6op/WXJ4A67jHAYeUBtut8vJgk09t4Bw3kheWnHUjVHDBEZ8iC/iX9YyBzL76WZR+lpDqdFh2iKYk+yctHKc4dt9r0vw6HYMUWDrYmctdKJtdOGpWxz4apBr7Rc/2A3FDxwsiXzPqpG/GY+/1IHp7E3jEX0nxzuJn/YUm/SoSgfMB4NCHF9n3rrIsp4jJ5SOSwLr68nlwT3djF2f8vQcqRxmT0J7X2xKehlpeiubszQj5TeFcA+onkOBKkoKc+83G8Gg8J1IWZLsd50cjawrmg8lxl+UBEsPZHEh0AhWDHKLRG+9jyZJ94hoWaQRSgwEIdGyShNMnwIDAQAB +prod.newSpk=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvcOew5NM41jK7CFBnirP4Zz0QIexYEweS+4LTuQOVY+BqHu2EMxlPYRsjtvzZj7Pm9SsiNiEIeGXZ3mkAMbNNqu7G7kGb10pJzpBBTE80cRCY0bHoD3PhD8cBiKjpsRXJ+1mPdwD4fGEr0IcG6bKhBM3xsCmc4JiEvsv/+nPm9G7NQgoPGEKHkZk0IgyaBF5m6F2NKah92klxuz+vWCQoVsCpCjHN1sijQioWc6lRLgP7d6IZFEbOrLL7HdlOc8yKOAOZhURd78CqiVYBc1vP0pyC1/UW0Lq0f2MFpg/7Z18VwAf1vFUb+oiIdjFYMr5dgS+i784FaMUDzKUvndDWwIDAQAB +prod.paybillFileUrl= +prod.generalbillUrl= +prod.transformUrl= +prod.xcfzCancelUrl= +prod.sbfzCancelUrl= +prod.restname=beian +prod.restpassword=f1c4e761-d60b-47ff-a5ff-5953f2b9c9e0 +prod.oaTokenUrl=https://oa.dhx.com.cn/seeyon/rest/token +prod.loginName=test11 +prod.secret=b44da0ec-6ba5-4d6e-b3d7-e0571b3bcdd6 +prod.newSecret=6553bad7-51f0-4d56-af44-3d64a8ce9814 +prod.sql=select id,departmentid,lastname from hrmresource@ecology where lastname = ? +#prod.sql=select id,departmentid,lastname from hrmresource@ecology_new where lastname = ? +prod.dataSql=select id, FORM_RECORDID, FORM_APPID , FORMID from col_summary cs where TEMPLETE_ID = ? and CAN_AUTOSTOPFLOW = 0 and STATE = 3 diff --git a/seeyon/WEB-INF/cfgHome/daohuaxiang/pluginCfg.xml b/seeyon/WEB-INF/cfgHome/daohuaxiang/pluginCfg.xml new file mode 100644 index 0000000..6c4be54 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/daohuaxiang/pluginCfg.xml @@ -0,0 +1,6 @@ + + + daohuaxiang + 稻花香 + 20231206 + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring-node.xml b/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring-node.xml new file mode 100644 index 0000000..51b1faa --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring-node.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring-service.xml b/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring-service.xml new file mode 100644 index 0000000..db61c20 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring-service.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring.xml b/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring.xml new file mode 100644 index 0000000..ab5a793 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/daohuaxiang/spring/spring.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/qrCodeForm/pluginCfg.xml b/seeyon/WEB-INF/cfgHome/qrCodeForm/pluginCfg.xml new file mode 100644 index 0000000..c12ee18 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/qrCodeForm/pluginCfg.xml @@ -0,0 +1,6 @@ + + + qrCodeForm + 二维码扫码填单 + 20220422 + diff --git a/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-controller.xml b/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-controller.xml new file mode 100644 index 0000000..93d89e1 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-controller.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-manager.xml b/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-manager.xml new file mode 100644 index 0000000..7d6233b --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-manager.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-plugin.xml b/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-plugin.xml new file mode 100644 index 0000000..de1e69f --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/qrCodeForm/spring/spring-qrCodeForm-plugin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/seeyon/WEB-INF/cfgHome/src_dingding/dingding.properties b/seeyon/WEB-INF/cfgHome/src_dingding/dingding.properties new file mode 100644 index 0000000..dc38ac7 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_dingding/dingding.properties @@ -0,0 +1,11 @@ +profile=prod +prod.jdbc_driver=oracle.jdbc.driver.OracleDriver +prod.jdbc_url=jdbc:oracle:thin:@10.0.1.12:1521:DHXOA +prod.jdbc_user=DHXOA +prod.jdbc_password=DHXOA-A8 + +#profile=prod +test.jdbc_driver=oracle.jdbc.driver.OracleDriver +test.jdbc_url=jdbc:oracle:thin:@10.0.3.32:1521:DHXOATEST +test.jdbc_user=DHXOA +test.jdbc_password=DHXOA_A8 diff --git a/seeyon/WEB-INF/cfgHome/src_dingding/pluginCfg.xml b/seeyon/WEB-INF/cfgHome/src_dingding/pluginCfg.xml new file mode 100644 index 0000000..b821e30 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_dingding/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_dingding + 测试定时任务 + 20231129 + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-ctrl.xml b/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-ctrl.xml new file mode 100644 index 0000000..d6649f9 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-ctrl.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-dao.xml b/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-dao.xml new file mode 100644 index 0000000..3d750ad --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-dao.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-service.xml b/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-service.xml new file mode 100644 index 0000000..972af23 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-service.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-task.xml b/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-task.xml new file mode 100644 index 0000000..ca6db89 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_dingding/spring/spring-task.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/src_qyba/pluginCfg.xml b/seeyon/WEB-INF/cfgHome/src_qyba/pluginCfg.xml new file mode 100644 index 0000000..2d33e76 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_qyba/pluginCfg.xml @@ -0,0 +1,6 @@ + + + src_qyba + 区域备案 + 20240304 + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring-node.xml b/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring-node.xml new file mode 100644 index 0000000..f99a218 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring-node.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring-service.xml b/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring-service.xml new file mode 100644 index 0000000..3d8c7b8 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring-service.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring.xml b/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring.xml new file mode 100644 index 0000000..e991fb0 --- /dev/null +++ b/seeyon/WEB-INF/cfgHome/src_qyba/spring/spring.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/classes/META-INF/daohuaxiangceshi.kotlin_module b/seeyon/WEB-INF/classes/META-INF/daohuaxiangceshi.kotlin_module new file mode 100644 index 0000000..8fb6019 Binary files /dev/null and b/seeyon/WEB-INF/classes/META-INF/daohuaxiangceshi.kotlin_module differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/HsDataPluginApi.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/HsDataPluginApi.class new file mode 100644 index 0000000..300eabf Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/HsDataPluginApi.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/constants/HsDataSyncConstants.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/constants/HsDataSyncConstants.class new file mode 100644 index 0000000..56cacbb Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/constants/HsDataSyncConstants.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/quartz/HsDataSyncQuartz.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/quartz/HsDataSyncQuartz.class new file mode 100644 index 0000000..7eca403 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/quartz/HsDataSyncQuartz.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/vo/HsDataVo.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/vo/HsDataVo.class new file mode 100644 index 0000000..9b8c7ed Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/chushihua/vo/HsDataVo.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/TongYongPlugin.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/TongYongPlugin.class new file mode 100644 index 0000000..750926d Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/TongYongPlugin.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/constants/DaohuaxiangConstants.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/constants/DaohuaxiangConstants.class new file mode 100644 index 0000000..469d0b6 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/constants/DaohuaxiangConstants.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/node/NewTongYongNode.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/node/NewTongYongNode.class new file mode 100644 index 0000000..f2e41fb Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/node/NewTongYongNode.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/node/TongYongNode.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/node/TongYongNode.class new file mode 100644 index 0000000..0412d6d Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/node/TongYongNode.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/service/NewTongYongService.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/service/NewTongYongService.class new file mode 100644 index 0000000..d083d31 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/service/NewTongYongService.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/service/TongYongService.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/service/TongYongService.class new file mode 100644 index 0000000..e5c7008 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/service/TongYongService.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/A8FolderKit.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/A8FolderKit.class new file mode 100644 index 0000000..33bda62 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/A8FolderKit.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/BaseUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/BaseUtil.class new file mode 100644 index 0000000..cfeaea1 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/BaseUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/DBConnection.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/DBConnection.class new file mode 100644 index 0000000..ad31421 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/DBConnection.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiNewUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiNewUtil.class new file mode 100644 index 0000000..82209a2 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiNewUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiUtil.class new file mode 100644 index 0000000..abb2c67 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/InterfaceListUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/InterfaceListUtil.class new file mode 100644 index 0000000..b96f473 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/InterfaceListUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/JdbcUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/JdbcUtil.class new file mode 100644 index 0000000..ec8e983 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/JdbcUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/PropKit.class b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/PropKit.class new file mode 100644 index 0000000..5ebb6c1 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/daohuaxiangSys/jkts/util/PropKit.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.class new file mode 100644 index 0000000..8be656f Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.class new file mode 100644 index 0000000..0d74b4c Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/Constants.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/Constants.class new file mode 100644 index 0000000..fca1a74 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/Constants.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.class new file mode 100644 index 0000000..36430e5 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.class new file mode 100644 index 0000000..f3de212 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.class new file mode 100644 index 0000000..4111013 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.class new file mode 100644 index 0000000..9b3ca25 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.class new file mode 100644 index 0000000..5c230e2 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.class new file mode 100644 index 0000000..4e799b7 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.class new file mode 100644 index 0000000..9c3b385 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/util/LoginUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/util/LoginUtil.class new file mode 100644 index 0000000..3502956 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/qrCodeForm/util/LoginUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/ctrl/StartTaskController.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/ctrl/StartTaskController.class new file mode 100644 index 0000000..94814e6 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/ctrl/StartTaskController.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/dao/DingdingDaoImpl.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/dao/DingdingDaoImpl.class new file mode 100644 index 0000000..26ac914 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/dao/DingdingDaoImpl.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/dao/IDingdingDao.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/dao/IDingdingDao.class new file mode 100644 index 0000000..15749b3 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/dao/IDingdingDao.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/kit/A8FolderKit.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/kit/A8FolderKit.class new file mode 100644 index 0000000..f317809 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/kit/A8FolderKit.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/kit/PropKit.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/kit/PropKit.class new file mode 100644 index 0000000..ebb3493 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/kit/PropKit.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/service/DingdingService.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/service/DingdingService.class new file mode 100644 index 0000000..d508af7 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/service/DingdingService.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/task/DingdingTask.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/task/DingdingTask.class new file mode 100644 index 0000000..f955288 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/task/DingdingTask.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/BaseUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/BaseUtil.class new file mode 100644 index 0000000..8e55113 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/BaseUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/DingtalkUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/DingtalkUtil.class new file mode 100644 index 0000000..9287da2 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/DingtalkUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/FormExportUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/FormExportUtil.class new file mode 100644 index 0000000..70bf17b Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/FormExportUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/JdbcUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/JdbcUtil.class new file mode 100644 index 0000000..d5c76c3 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/JdbcUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/TimeUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/TimeUtil.class new file mode 100644 index 0000000..d264889 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/util/TimeUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/vo/CheckOnWorkAttendanceVo.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/vo/CheckOnWorkAttendanceVo.class new file mode 100644 index 0000000..ddc56b0 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_dingding/vo/CheckOnWorkAttendanceVo.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/FVCommonNode.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/FVCommonNode.class new file mode 100644 index 0000000..76a16d1 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/FVCommonNode.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/QYBAPluginApi.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/QYBAPluginApi.class new file mode 100644 index 0000000..14ad92d Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/QYBAPluginApi.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/constants/FVConstants.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/constants/FVConstants.class new file mode 100644 index 0000000..85d234c Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/constants/FVConstants.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/node/FVNewZhengceNode.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/node/FVNewZhengceNode.class new file mode 100644 index 0000000..4f76296 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/node/FVNewZhengceNode.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/node/FVOldZhengceNode.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/node/FVOldZhengceNode.class new file mode 100644 index 0000000..e033cf1 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/node/FVOldZhengceNode.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/service/FVService.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/service/FVService.class new file mode 100644 index 0000000..304d696 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/service/FVService.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/util/FVHttpUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/util/FVHttpUtil.class new file mode 100644 index 0000000..c9330c0 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/util/FVHttpUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/util/FanWeiUtil.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/util/FanWeiUtil.class new file mode 100644 index 0000000..dbeb3a7 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/util/FanWeiUtil.class differ diff --git a/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/vo/FVResponse.class b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/vo/FVResponse.class new file mode 100644 index 0000000..c71def4 Binary files /dev/null and b/seeyon/WEB-INF/classes/com/seeyon/apps/src_qyba/vo/FVResponse.class differ diff --git a/seeyon/WEB-INF/classes/needless_check_login.xml b/seeyon/WEB-INF/classes/needless_check_login.xml new file mode 100644 index 0000000..97114bc --- /dev/null +++ b/seeyon/WEB-INF/classes/needless_check_login.xml @@ -0,0 +1,322 @@ + + + + /qrCodeForm.do + + index + newMain + + + + /sc.do + + qr + + + + /elearning.do + + error + m3Redirect + message + pcRedirect + + + + /phoneLogin/phoneLogin.do + + getMessageCode + validateMessageCode + + + + /wechat/miniprogram.do + + a8home + bind + bindMemberPhone + login + unbind + + + + /portal/spaceController.do + + showThemSpace + + + + /identification.do + + getSessionId + + + + /fileUpload.do + + showRTE + + + + /fileDownload.do + + showRTE + + + + /form/formUpgrade.do + + toUpgrade + upgrade + viewUpgrade + + + + formtalkFormMapperController.do + + importFormtalkData + + + + /thirdpartyController.do + + access + index + logoutNotify + show + mailAuth + + + + /main.do + + changeLocale + hangup + headerjs + index + login + login4Ucpc + login4Ucpc3 + login4Vjoin + logout + logout4Session + logout4Vjoin + logout4ZX + main + login4QrCode + qrCodeHelp + updateLoginSeed + + + + /trustdo/A8/XRD.do + + getLoginAccount + getLoginAcctoken + webLogin + + + + /share.do + + index + + + + /genericController.do + + index + + + + /edoc/edocUpgradeControllor.do + + upgrade + download + + + + /uploadService.do + + processUploadService + + + + /autoinstall.do + + ieSetDown + regInstallDown + regInstallDown64 + downloadAssistant + + + + /personalBind.do + + getBindTypeByLoginName + isCanUse + retrievePassword + sendVerificationCodeToBindEmail + sendVerificationCodeToBindNum + validateVerificationCode + + + + + + + + + + + /commonimage.do + + showImage + + + + /individualManager.do + + resetPassword + + + + /wechat/dingding.do + + binding + index + main + newIndex + newMain + viewh5Message + + + + /uc/rest.do + + commonPierce + downloadImage + getBgTimeStamp + getLoginsecurityMsg + sendsms + smsrequired + testIp + isQrLogin + getDigitalCodeInfo + + + + portalManager + + sendSMSLoginCode + smsLoginEnabled + + + + loginUserManager + + getLockTime + + + + qrCodeLoginManager + + isLogin + + + + meetingAjaxManager + + meetingPanelData + meetingPanelDisplay + + + + /m3/loginController.do + + transLogin + transLogout + getProfile + + + + /m3/mClientBindController.do + + bindApply + + + + m3ProductManager + + productInfo + productStatus + + + + /m3/homeSkinController.do + + downloadImage + getSkinImageUrl + + + + /m3/transModeController.do + + getTransModeForMobile + + + + /media/media.do + + mediaShow + + + + /ocipEdoc.do + + index + + + + /colView.do + + index + + + + /caAccountManagerController.do + + findKeyNumByLoginName + + + + /fddCallbackController.do + + asynch + synch + + + + /seeyonReport/seeyonReportController.do + + redirectSeeyonReport + + + + /imc.do + + index + logout + + + + + /cloudbuild.do + + download + getDownloadPageInfo + getLatestVersionInfo + getDownloadQrUrl + + + \ No newline at end of file diff --git a/seeyon/WEB-INF/classes/needless_check_login_recheck.xml b/seeyon/WEB-INF/classes/needless_check_login_recheck.xml new file mode 100644 index 0000000..0e84aeb --- /dev/null +++ b/seeyon/WEB-INF/classes/needless_check_login_recheck.xml @@ -0,0 +1,426 @@ + + + + + + /qrCodeForm.do + com.seeyon.apps.qrCodeForm.controller.QrCodeFormController + + index + newMain + + + + + /sc.do + com.seeyon.cap4.form.modules.smartCode.controller.SmartCodeController + + qr + + + + /media/media.do + com.seeyon.ctp.common.media.controller.MediaController + + mediaShow + + + + /phoneLogin/phoneLogin.do + com.seeyon.ctp.login.controller.PhoneLoginController + + getMessageCode + validateMessageCode + + + + portalManager + com.seeyon.ctp.portal.manager.PortalManagerImpl + + sendSMSLoginCode + smsLoginEnabled + + + + /fileDownload.do + com.seeyon.ctp.common.fileupload.FileUploadController + + showRTE + + + + loginUserManager + com.seeyon.ctp.login.LoginUserManagerImpl + + getLockTime + + + + /main.do + com.seeyon.ctp.login.controller.MainController + + changeLocale + hangup + headerjs + index + login + login4Ucpc + login4Ucpc3 + login4Vjoin + logout + logout4Session + logout4Vjoin + logout4ZX + main + login4QrCode + qrCodeHelp + updateLoginSeed + + + + /trustdo/A8/XRD.do + com.seeyon.apps.trustdo.controller.XRDController + + getLoginAccount + getLoginAcctoken + webLogin + + + + /share.do + com.seeyon.v3x.system.share.controller.ShareController + + index + + + + /edoc/edocUpgradeControllor.do + com.seeyon.v3x.edoc.controller.EdocUpgradeControllor + + upgrade + download + + + + /m3/mClientBindController.do + com.seeyon.apps.m3.bind.controller.M3ClientBindController + + bindApply + + + + /uploadService.do + com.seeyon.ctp.services.FileUploadService + + processUploadService + + + + /uc/rest.do + com.seeyon.apps.zx.controller.ZxRestController + + commonPierce + downloadImage + getBgTimeStamp + getLoginsecurityMsg + sendsms + smsrequired + testIp + isQrLogin + getDigitalCodeInfo + + + + /m3/homeSkinController.do + com.seeyon.apps.m3.skin.controller.M3HomeSkinController + + downloadImage + getSkinImageUrl + + + + /colView.do + com.seeyon.apps.ocip.exchange.collaboration.controller.CollViewController + + index + + + + /autoinstall.do + com.seeyon.apps.autoinstall.controller.AutoInstallController + + ieSetDown + regInstallDown + regInstallDown64 + downloadAssistant + + + + + + + + + + + + /caAccountManagerController.do + com.seeyon.v3x.ca.caaccount.controller.CAAccountManagerController + + findKeyNumByLoginName + + + + /elearning.do + com.seeyon.apps.elearning.controller.ElearningController + + error + m3Redirect + message + pcRedirect + + + + /wechat/miniprogram.do + com.seeyon.apps.weixin.controller.MiniProgramController + + a8home + bind + bindMemberPhone + login + unbind + + + + /portal/spaceController.do + com.seeyon.ctp.portal.space.controller.SpaceController + + showThemSpace + + + + /identification.do + com.seeyon.v3x.identification.controller.IdentificationController + + getSessionId + + + + /fddCallbackController.do + com.seeyon.apps.econtract.fdd.controller.FddCallbackController + + asynch + synch + + + + m3ProductManager + com.seeyon.apps.m3.product.manager.impl.M3ProductManagerImpl + + productInfo + productStatus + + + + /ocipEdoc.do + com.seeyon.apps.ocip.exchange.edoc.OCIPEdocController + + index + + + + /m3/loginController.do + + transLogin + transLogout + getProfile + + + + /fileUpload.do + com.seeyon.ctp.common.fileupload.FileUploadController + + showRTE + processUpload + + + + qrCodeLoginManager + com.seeyon.ctp.login.manager.QrCodeLoginManagerImpl + + isLogin + + + + /form/formUpgrade.do + com.seeyon.ctp.form.service.FormUpgradeController + + toUpgrade + upgrade + viewUpgrade + + + + /seeyonReport/seeyonReportController.do + com.seeyon.apps.seeyonreport.controller.SeeyonReportController + + redirectSeeyonReport + + + + formtalkFormMapperController.do + com.seeyon.apps.formtalk.controller.FormtalkImportController + + importFormtalkData + + + + /thirdpartyController.do + com.seeyon.ctp.portal.sso.thirdpartyintegration.controller.ThirdpartyController + + access + index + logoutNotify + show + mailAuth + + + + /m3/transModeController.do + com.seeyon.apps.m3.transmissionmode.controller.M3TransModeController + + getTransModeForMobile + + + + /genericController.do + com.seeyon.v3x.common.controller.GenericController + + index + + + + /personalBind.do + com.seeyon.v3x.personalaffair.controller.PersonalBindController + + getBindTypeByLoginName + isCanUse + retrievePassword + sendVerificationCodeToBindEmail + sendVerificationCodeToBindNum + validateVerificationCode + + + + /commonimage.do + com.seeyon.apps.common.image.controller.ImageController + + showImage + + + + /individualManager.do + com.seeyon.v3x.personalaffair.controller.IndividualManagerController + + resetPassword + + + + meetingAjaxManager + com.seeyon.apps.meeting.manager.MeetingAjaxManagerImpl + + meetingPanelData + meetingPanelDisplay + + + + /wechat/dingding.do + com.seeyon.apps.weixin.controller.DingDingController + + binding + index + main + newIndex + newMain + viewh5Message + + + + /imc.do + com.seeyon.apps.imc.controller.ImcLoginController + + index + logout + + + + /wechat/feishu.do + com.seeyon.apps.weixin.controller.FeishuController + + newMain + viewh5Message + + + + + + + + + + + + + + + /wechat/pcapp.do + com.seeyon.apps.weixin.controller.PcAppController + + transferPageFromWxCoreServer + gotoPcApp + checkCodeTurnToRightPage + transfer + transferMsg + + + + /wechat/feishu/approvalData.do + com.seeyon.apps.zhifei.feishu.approval.controller.ApprovalDataController + + index + + + + /zhifei/feishu.do + com.seeyon.apps.zhifei.controller.FeishuController + + newMain + viewh5Message + + + + /zhifei/pcapp.do + com.seeyon.apps.zhifei.controller.ZhifeiPcAppController + + transferPageFromWxCoreServer + gotoPcApp + + + + /zhifei/feishu/approvalData.do + com.seeyon.apps.zhifei.feishu.approval.controller.ApprovalDataController + + index + + + + /cloudbuild.do + com.seeyon.apps.cloudbuild.controller.CloudBuildController + + download + getDownloadPageInfo + getLatestVersionInfo + getDownloadQrUrl + + + diff --git a/seeyon/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp b/seeyon/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp new file mode 100644 index 0000000..0f620b0 --- /dev/null +++ b/seeyon/WEB-INF/jsp/plugin/qrCodeForm/qrCodeFormIndex.jsp @@ -0,0 +1,249 @@ +<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" %> +<%@ page language="java" import=" com.seeyon.apps.m3.skin.enums.M3StartPageCustomEnum" %> + + + + + <%@ include file="/WEB-INF/jsp/common/common.jsp" %> + 模板二维码生成 + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/seeyon/common/capextend/cap4/form/utils/qrcodeform/index.js b/seeyon/common/capextend/cap4/form/utils/qrcodeform/index.js new file mode 100644 index 0000000..ec27f89 --- /dev/null +++ b/seeyon/common/capextend/cap4/form/utils/qrcodeform/index.js @@ -0,0 +1,13 @@ + +csdk.event.on('formRendered', function(){ + + try { + if(cmp.href.getParam().qc = "ext") { + document.getElementById("relationBtns").style.display="none"; + document.getElementById("attachment_wrap").style.display="none"; + } + } catch(e) { + + } + +}); diff --git a/seeyon/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js b/seeyon/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js new file mode 100644 index 0000000..bc09362 --- /dev/null +++ b/seeyon/m3/apps/v5/capextend/cap4/form/utils/qrcodeform/index.js @@ -0,0 +1,11 @@ +document.addEventListener('cap_form_afterFormRender', function(evt) { + try { + if(cmp.href.getParam().qc == "ext") { + document.getElementById("relationBtns").style.display="none"; + document.getElementById("attachment_wrap").style.display="none"; + document.getElementsByClassName("cmp-button-left-iconContent btn-box2")[0].style.display="none"; + } + } catch(e) { + + } +}); \ No newline at end of file diff --git a/src/com/seeyon/apps/daohuaxiangSys/chushihua/HsDataPluginApi.java b/src/com/seeyon/apps/daohuaxiangSys/chushihua/HsDataPluginApi.java new file mode 100644 index 0000000..b818d71 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/chushihua/HsDataPluginApi.java @@ -0,0 +1,51 @@ +package com.seeyon.apps.daohuaxiangSys.chushihua; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.daohuaxiangSys.chushihua.constants.HsDataSyncConstants; + +import java.util.Map; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/12/8 + */ +public class HsDataPluginApi extends APluginInfoApi { + + @Override + public String getPluginId() { + return HsDataSyncConstants.getPluginId(); + } + + @Override + public String getCreateUser() { + return ""; + } + + @Override + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + for (HsDataSyncConstants value : HsDataSyncConstants.values()) { + if(value != HsDataSyncConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + return configVo; + } + + + @Override + public void registerCustomEvent(Map eventAndNodes) { + // 如果每个模板不一样 可以采用templatemanager去读取编码配置 + eventAndNodes.put("hsdata", "历史数据推送"); + } + + +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/chushihua/constants/HsDataSyncConstants.java b/src/com/seeyon/apps/daohuaxiangSys/chushihua/constants/HsDataSyncConstants.java new file mode 100644 index 0000000..e399449 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/chushihua/constants/HsDataSyncConstants.java @@ -0,0 +1,31 @@ +package com.seeyon.apps.daohuaxiangSys.chushihua.constants; + +public enum HsDataSyncConstants { + + // 如果有其他参数 这里去新增 todo + plugin("chushihua","插件ID"), + temp("hsdata_", "模板前缀"), + lastUpdate("2000-01-01 00:00:00", "最后更新时间"), + url("", "接口地址"); + + HsDataSyncConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/chushihua/quartz/HsDataSyncQuartz.java b/src/com/seeyon/apps/daohuaxiangSys/chushihua/quartz/HsDataSyncQuartz.java new file mode 100644 index 0000000..6820fa8 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/chushihua/quartz/HsDataSyncQuartz.java @@ -0,0 +1,312 @@ +package com.seeyon.apps.daohuaxiangSys.chushihua.quartz; + +import cn.hutool.core.convert.Convert; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.util.StringKit; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.parser.FormParseFactory; +import com.seeyon.apps.common.workflow.util.FormDataBeanUtil; +import com.seeyon.apps.daohuaxiangSys.chushihua.constants.HsDataSyncConstants; +import com.seeyon.apps.daohuaxiangSys.chushihua.vo.HsDataVo; +import com.seeyon.apps.daohuaxiangSys.jkts.util.FanWeiNewUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.FanWeiUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.InterfaceListUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.PropKit; +import com.seeyon.apps.ext.po.CstWorkFlowRequestTemplate; +import com.seeyon.apps.ext.quartz.AbstractQuartzTask; +import com.seeyon.apps.ext.workflow.manager.CstWorkFlowTemplateManager; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; + +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import com.seeyon.ctp.common.po.template.CtpTemplate; +import com.seeyon.ctp.common.template.manager.TemplateManager; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.organization.manager.OrgManagerDirect; +import com.seeyon.ctp.util.DateUtil; +import com.seeyon.ctp.util.JDBCAgent; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.json.JSONUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.songjian.utils.json.JSONArray; + +import javax.inject.Inject; +import java.io.IOException; +import java.sql.SQLException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 功能描述:
+ *
+ * 定时同步历史数据
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/12/8 + */ +public class HsDataSyncQuartz extends AbstractQuartzTask { + + private static final Log log = LogFactory.getLog(HsDataSyncQuartz.class); + + + @Inject + private ICstConfigApi cstConfigApi; + @Inject + private TemplateManager templateManager; + @Inject + private FormApi4Cap4 formApi4Cap4; + @Inject + private CstWorkFlowTemplateManager cstWorkFlowTemplateManager; + + private AttachmentManager attachmentManager; + + public void setAttachmentManager(AttachmentManager attachmentManager) { + this.attachmentManager = attachmentManager; + } + + public AttachmentManager getAttachmentManagery() { + if (attachmentManager == null) { + attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + } + return attachmentManager; + } + + private OrgManager orgManager; + + public OrgManager getOrgManager() { + if (this.orgManager == null) { + this.orgManager = ((OrgManager) AppContext.getBean("orgManager")); + } + return orgManager; + } + + + @Override + public String taskRun(String tempCode) throws Exception { + System.out.println("进入同步方法"); + final Map regist = FanWeiNewUtil.Regist(PropKit.getProp(PropKit.NEWADDRESS)); + System.out.println(regist); + System.out.println("spk:" + regist.get("spk")); +// return null; + + //模板id + Object templeteId = null; + // 查询满足条件的id + String sql = "select id from ctp_template where TEMPLETE_NUMBER = ? "; + System.out.println(sql+tempCode); + try(JDBCAgent agent = new JDBCAgent(true, false)) { + List params = new ArrayList<>(); + params.add(tempCode); + agent.execute(sql, params); + List> list = agent.resultSetToList(); + System.out.println(list.size()); + templeteId = list.get(0).get("id"); + System.out.println(templeteId); + } catch (Exception e) { + log.error("获取模板id失败:", e); + } + ceshi(Long.parseLong(templeteId.toString()), tempCode); + return null; + } + + + /** + * 功能描述:
+ *
+     *  调用第三方接口推送数据
+     *  null 表示成功  其他为失败信息
+     * 
+ * @param request + * @return: java.lang.String + * @Author: FanGaowei + * @Date: 2023/12/8 + **/ + private String push(String request, ConfigVo configVo) { + // todo 获取配置信息 调用接口 + + return ""; + } + + @Override + public String getName() { + return null; + } + + public void ceshi(Long tempId, String tempCode) throws IOException { + System.out.println("进入ceshi方法"); + List datas = new ArrayList(); + Map formBeanMap = new HashMap<>(); + + String dataSql = PropKit.getProp(PropKit.DATASQL); + try(JDBCAgent agent = new JDBCAgent(true, false)) { + List params = new ArrayList<>(); + params.add(tempId); + agent.execute(dataSql, params); + // 获取到所有的流程数据 + List> list = agent.resultSetToList(); + if(null != list) { + List hsData = list.stream().map(HsDataVo::new).collect(Collectors.toList()); + for (int i = 0; i < hsData.size(); i++) { + Map data = new HashMap(); + HsDataVo hsDatum = hsData.get(i); + FormBean formBean = formBeanMap.get(hsDatum.getFormId()); + if (null == formBean) { + formBean = formApi4Cap4.getForm(hsDatum.getFormId()); + formBeanMap.put(hsDatum.getFormId(), formBean); + } + FormDataMasterBean masterBean = formApi4Cap4.getDataMasterBeanById(hsDatum.getMasterId(), formBean, null); + // 转换数据 + FormDataVo formDataVo = FormDataBeanUtil.trans2FormDataVo(HsDataSyncConstants.getPluginId(), hsDatum.getFormId(), + hsDatum.getSummaryId(), formBean, masterBean); + String name = ""; + if ("formmain_9291".equals(tempCode)) { + name = formDataVo.getFieldData("客户名称文本").getStringValue(); + } else { + String userName = formDataVo.getFieldData("客户名称").getStringValue(); + System.out.println("userName:" + userName); + V3xOrgMember member = getOrgManager().getMemberByLoginName(userName); + name = member.getName(); + } + System.out.println("判断名称是否为指定名称"+name); + if(!("宜昌高新区盛世禾百货商行".equals(name)||"宜昌市西陵区高东云食品经营部".equals(name)||"宜昌市猇亭区明喜副食店".equals(name)|| + "湖北省馫昊商贸有限责任公司".equals(name)||"湖北省馫昊商贸有限责任公司".equals(name)||"宜昌梦泽涵商贸有限公司 ".equals(name))){ + continue; + } + + System.out.println("致远客户名称:" + name); + Map userIdAndDeptId = getUserIdAndDeptId(name); + System.out.println("人员信息:" + userIdAndDeptId.toString()); + data.put("khmc", userIdAndDeptId.get("userid")); + data.put("fgs", userIdAndDeptId.get("deptid")); + data.put("bt", formBean.getFormName()); + data.put("dh", formDataVo.getFieldData("流水号").getStringValue()); + data.put("sqrq", formDataVo.getFieldData("填表日期").getStringValue()); + data.put("trje", formDataVo.getFieldData("投入金额").getStringValue()); + data.put("bayj", formDataVo.getFieldData("备案意见").getStringValue()); + data.put("bajs", formDataVo.getFieldData("备案简述").getStringValue()); + data.put("ssschxsgs", formDataVo.getFieldData("分公司").getStringValue()); + data.put("jbr", formDataVo.getFieldData("经办人").getStringValue()); + data.put("lcbt", formBean.getFormName()); + + String pathId = formDataVo.getFieldData("上传附件").getStringValue(); + //附件 + JSONArray faths = null; + if (pathId == null || "".equals(pathId)) { + faths = new JSONArray(); + } else { + faths = getPathUrl(pathId); + } + Map parm = FanWeiNewUtil.createWF2(data, faths); + //调用新建接口 + String userId = null; + Object userid = userIdAndDeptId.get("userid"); + if (userid == null || "".equals(userid)) { + userId = ""; + } else { + userId = userid.toString(); + } + String s = FanWeiNewUtil.PostRestful(parm, userId); + //String s = FanWeiUtil.PostRestful(parm, userId); + System.out.println("新建推送结果" + s); + JSONObject returnMsg = JSON.parseObject(s); + Object code = returnMsg.get("code"); + if ("SUCCESS".equals(code.toString())) { + System.out.println("同步成功!"); + }else { + System.out.println("同步失败!"); + } + } + } + + } catch (Exception e) { + log.error("同步失败:" + tempId); + } + } + + /** + * 获取userid和deptid + * @param userName + * @return + * @throws Exception + */ + public Map getUserIdAndDeptId(String userName) throws Exception { +// 新平台指定对应关系 + Map datas = new HashMap(); + if("宜昌梦泽涵商贸有限公司".equals(userName)){ + datas.put("userid", "51"); + datas.put("deptid", "1545"); + }else if ("伍家岗区源玥酒水商行".equals(userName)){ + datas.put("userid", "50"); + datas.put("deptid", "1553"); + }else if ("湖北省馫昊商贸有限责任公司".equals(userName)){ + datas.put("userid", "49"); + datas.put("deptid", "1555"); + }else if ("宜昌市猇亭区明喜副食店".equals(userName)){ + datas.put("userid", "48"); + datas.put("deptid", "1537"); + }else if ("宜昌市西陵区高东云食品经营部".equals(userName)){ + datas.put("userid", "47"); + datas.put("deptid", "1530"); + }else if ("宜昌高新区盛世禾百货商行".equals(userName)){ + datas.put("userid", "46"); + datas.put("deptid", "1529"); + } +// Map datas = new HashMap(); +// String sql = PropKit.getProp(PropKit.SQL); +// try(JDBCAgent agent = new JDBCAgent(true, false)) { +// List params = new ArrayList<>(); +// params.add(userName); +// agent.execute(sql, params); +// List> list = agent.resultSetToList(); +// Map map = list.get(0); +// datas.put("userid", map.get("id")); +// datas.put("deptid", map.get("departmentid")); +// } catch (Exception e) { +// log.error("获取模板id失败:", e); +// } + return datas; + } + + /** + * 获取附件路径 + * @param pathId + * @return + */ + public JSONArray getPathUrl(String pathId) throws IOException { + InterfaceListUtil interfaceListUtil = new InterfaceListUtil(); + String oatoken = interfaceListUtil.getToken(PropKit.getProp(PropKit.LOGINNAME)); + long aLong = Long.parseLong(pathId); + final List attachmentIds = attachmentManager.getBySubReference(aLong); + JSONArray jsonArray = new JSONArray(); + for (int i = 0 ; i < attachmentIds.size();i++) { + Attachment attachment = attachmentManager.getAttachmentByFileURL(attachmentIds.get(i)); + Long fileUrl = attachment.getFileUrl(); + String filename = attachment.getFilename(); + String fileType = filename.substring(filename.lastIndexOf(".")+1); + String oaFileName = filename.substring(0,filename.lastIndexOf(".")); + //调用接口下载文件,文件存放在指定的路径下 + String dowUrl = PropKit.getProp(PropKit.DOWURL)+"/"+fileUrl+"?fileName="+fileType+"&token="+oatoken; + String str = SystemEnvironment.getApplicationFolder(); + String dowPath = str+"/dhxfile/"+filename; + String download = interfaceListUtil.download(dowUrl, dowPath); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", filename); + jsonObject.put("type", fileType); + jsonObject.put("url", PropKit.getProp(PropKit.JYNCFILE)+"/"+filename); + jsonArray.add(jsonObject); + } + return jsonArray; + } +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/chushihua/vo/HsDataVo.java b/src/com/seeyon/apps/daohuaxiangSys/chushihua/vo/HsDataVo.java new file mode 100644 index 0000000..60759e8 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/chushihua/vo/HsDataVo.java @@ -0,0 +1,55 @@ +package com.seeyon.apps.daohuaxiangSys.chushihua.vo; + +import cn.hutool.core.convert.Convert; + +import java.util.Map; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/12/8 + */ +public class HsDataVo { + + + private Long summaryId; + private Long formId; + private Long masterId; + + public HsDataVo(Map row) { + this.summaryId = Convert.toLong(row.get("id")); + this.masterId = Convert.toLong(row.get("form_recordid")); + this.formId = Convert.toLong(row.get("form_appid")); + } + + public Long getSummaryId() { + return summaryId; + } + + public HsDataVo setSummaryId(Long summaryId) { + this.summaryId = summaryId; + return this; + } + + public Long getFormId() { + return formId; + } + + public HsDataVo setFormId(Long formId) { + this.formId = formId; + return this; + } + + public Long getMasterId() { + return masterId; + } + + public HsDataVo setMasterId(Long masterId) { + this.masterId = masterId; + return this; + } +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/TongYongPlugin.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/TongYongPlugin.java new file mode 100644 index 0000000..fb3b25a --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/TongYongPlugin.java @@ -0,0 +1,41 @@ +package com.seeyon.apps.daohuaxiangSys.jkts; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.daohuaxiangSys.jkts.constants.DaohuaxiangConstants; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2023/10/25 + */ +public class TongYongPlugin extends APluginInfoApi { + + @Override + public String getPluginId() { + return DaohuaxiangConstants.getPluginId(); + } + + @Override + public String getCreateUser() { + return "稻花香"; + } + + @Override + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + for (DaohuaxiangConstants value : DaohuaxiangConstants.values()) { + if(value != DaohuaxiangConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + return configVo; + } + +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/constants/DaohuaxiangConstants.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/constants/DaohuaxiangConstants.java new file mode 100644 index 0000000..05c0a18 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/constants/DaohuaxiangConstants.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.constants; + + +public enum DaohuaxiangConstants { + + plugin("daohuaxiang", "插件ID"), + url("http://localhost", "接口地址"); + + DaohuaxiangConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} + diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/node/NewTongYongNode.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/node/NewTongYongNode.java new file mode 100644 index 0000000..09777c3 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/node/NewTongYongNode.java @@ -0,0 +1,75 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.node; + +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.daohuaxiangSys.jkts.constants.DaohuaxiangConstants; +import com.seeyon.apps.daohuaxiangSys.jkts.service.NewTongYongService; +import com.seeyon.apps.daohuaxiangSys.jkts.service.TongYongService; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; + +public class NewTongYongNode extends ACommonSuperNode { + + private ICstConfigApi cstConfigApi; + + public ICstConfigApi getICstConfigApi() { + if (cstConfigApi == null) { + cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + } + return cstConfigApi; + } + + @Autowired + NewTongYongService newTongYongService; + + @Override + public String getPluginId() { + return DaohuaxiangConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] { WorkFlowType.superNode }; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + // 获取数据 + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + Map map = newTongYongService.sendInter(formDataVo); + context.setRequest(map.get("request").toString()); + context.setResponse(map.get("response").toString()); + Object code = map.get("code"); + if ("200".equals(code.toString())) { + context.success(map.get("msg").toString(), false); + } else { + context.back(map.get("msg").toString()); + } + + return context; + } + + @Override + public String getNodeId() { + return "newTongYongNode"; + } + + @Override + public String getNodeName() { + return "新平台通用节点"; + } + + +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/node/TongYongNode.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/node/TongYongNode.java new file mode 100644 index 0000000..7f454dd --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/node/TongYongNode.java @@ -0,0 +1,74 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.node; + +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.daohuaxiangSys.jkts.constants.DaohuaxiangConstants; +import com.seeyon.apps.daohuaxiangSys.jkts.service.TongYongService; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; + +public class TongYongNode extends ACommonSuperNode { + + private ICstConfigApi cstConfigApi; + + public ICstConfigApi getICstConfigApi() { + if (cstConfigApi == null) { + cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + } + return cstConfigApi; + } + + @Autowired + TongYongService tongYongService; + + @Override + public String getPluginId() { + return DaohuaxiangConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] { WorkFlowType.superNode }; + } + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + // 获取数据 + SuperNodeContext context = new SuperNodeContext(); + context.setNeedSave(true); + Map map = tongYongService.sendInter(formDataVo); + context.setRequest(map.get("request").toString()); + context.setResponse(map.get("response").toString()); + Object code = map.get("code"); + if ("200".equals(code.toString())) { + context.success(map.get("msg").toString(), false); + } else { + context.back(map.get("msg").toString()); + } + + return context; + } + + @Override + public String getNodeId() { + return "tongYongNode"; + } + + @Override + public String getNodeName() { + return "通用节点"; + } + + +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/service/NewTongYongService.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/service/NewTongYongService.java new file mode 100644 index 0000000..3027d7a --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/service/NewTongYongService.java @@ -0,0 +1,108 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.daohuaxiangSys.jkts.util.FanWeiNewUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.FanWeiUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.InterfaceListUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.PropKit; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import org.songjian.utils.json.JSONArray; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class NewTongYongService { + + + private AttachmentManager attachmentManager; + + public void setAttachmentManager(AttachmentManager attachmentManager) { + this.attachmentManager = attachmentManager; + } + + public AttachmentManager getAttachmentManagery() { + if (attachmentManager == null) { + attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + } + return attachmentManager; + } + + public Map sendInter(FormDataVo formDataVo) throws Exception { + String pathId = formDataVo.getFieldData("上传附件").getStringValue(); + //附件 + JSONArray faths = null; + if (pathId == null || "".equals(pathId)) { + faths = new JSONArray(); + } else { + faths = getPathUrl(pathId); + } + //封装参数 + Map parm = FanWeiNewUtil.createWF(formDataVo, faths); + //调用新建接口 + String userid = formDataVo.getFieldData("经办人").getStringValue(); + String s = FanWeiNewUtil.PostRestful(parm, userid); + JSONObject returnMsg = JSON.parseObject(s); + Object code = returnMsg.get("code"); + System.out.println("新建code:" + code); + Map map = new HashMap<>(); + if ("SUCCESS".equals(code.toString())) { + //调用提交接口 +// Map data = (Map) returnMsg.get("data"); +// Object requestid = data.get("requestid"); +// String msg = FanWeiUtil.PostRestfulbyForm(requestid.toString(), userid); +// JSONObject tiJiaoReturnMsg = JSON.parseObject(msg); +// Object code2 = tiJiaoReturnMsg.get("code"); +// System.out.println("提交code:" + code2); + map.put("code", "200"); + map.put("msg", "推送成功"); + map.put("request", parm.toString()); + map.put("response", s); + } else { +// Map data = (Map) returnMsg.get("errMsg"); + map.put("code", "300"); + map.put("msg", "新建流程失败!"); + map.put("request", parm.toString()); + map.put("response", s); + } + return map; + + } + + /** + * 获取附件路径 + * @param pathId + * @return + */ + public JSONArray getPathUrl(String pathId) throws IOException { + InterfaceListUtil interfaceListUtil = new InterfaceListUtil(); + String oatoken = interfaceListUtil.getToken(PropKit.getProp(PropKit.LOGINNAME)); + long aLong = Long.parseLong(pathId); + final List attachmentIds = attachmentManager.getBySubReference(aLong); + JSONArray jsonArray = new JSONArray(); + for (int i = 0 ; i < attachmentIds.size();i++) { + Attachment attachment = attachmentManager.getAttachmentByFileURL(attachmentIds.get(i)); + Long fileUrl = attachment.getFileUrl(); + String filename = attachment.getFilename(); + String fileType = filename.substring(filename.lastIndexOf(".")+1); + String oaFileName = filename.substring(0,filename.lastIndexOf(".")); + //调用接口下载文件,文件存放在指定的路径下 + String dowUrl = PropKit.getProp(PropKit.DOWURL)+"/"+fileUrl+"?fileName="+fileType+"&token="+oatoken; + String str = SystemEnvironment.getApplicationFolder(); + String dowPath = str+"/dhxfile/"+filename; + String download = interfaceListUtil.download(dowUrl, dowPath); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", filename); + jsonObject.put("type", fileType); + jsonObject.put("url", PropKit.getProp(PropKit.JYNCFILE)+"/"+filename); + jsonArray.add(jsonObject); + } + return jsonArray; + } +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/service/TongYongService.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/service/TongYongService.java new file mode 100644 index 0000000..4553b9c --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/service/TongYongService.java @@ -0,0 +1,109 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.daohuaxiangSys.jkts.util.FanWeiNewUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.FanWeiUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.InterfaceListUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.PropKit; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import org.songjian.utils.json.JSONArray; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TongYongService { + + + private AttachmentManager attachmentManager; + + public void setAttachmentManager(AttachmentManager attachmentManager) { + this.attachmentManager = attachmentManager; + } + + public AttachmentManager getAttachmentManagery() { + if (attachmentManager == null) { + attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + } + return attachmentManager; + } + + public Map sendInter(FormDataVo formDataVo) throws Exception { + String pathId = formDataVo.getFieldData("上传附件").getStringValue(); + //附件 + JSONArray faths = null; + if (pathId == null || "".equals(pathId)) { + faths = new JSONArray(); + } else { + faths = getPathUrl(pathId); + } + //封装参数 + Map parm = FanWeiUtil.createWF(formDataVo, faths); + //调用新建接口 + String userid = formDataVo.getFieldData("客户id").getStringValue(); + String s = FanWeiUtil.PostRestful(parm, userid); + JSONObject returnMsg = JSON.parseObject(s); + Object code = returnMsg.get("code"); + System.out.println("新建code:" + code); + Map map = new HashMap<>(); + if ("SUCCESS".equals(code.toString())) { + //调用提交接口 +// Map data = (Map) returnMsg.get("data"); +// Object requestid = data.get("requestid"); +// String msg = FanWeiUtil.PostRestfulbyForm(requestid.toString(), userid); +// JSONObject tiJiaoReturnMsg = JSON.parseObject(msg); +// Object code2 = tiJiaoReturnMsg.get("code"); +// System.out.println("提交code:" + code2); + map.put("code", "200"); + map.put("msg", "推送成功"); + map.put("request", parm.toString()); + map.put("response", s); + } else { +// Map data = (Map) returnMsg.get("errMsg"); + map.put("code", "300"); + map.put("msg", "新建流程失败!"); + map.put("request", parm.toString()); + map.put("response", s); + } + return map; + + } + + /** + * 获取附件路径 + * @param pathId + * @return + */ + public JSONArray getPathUrl(String pathId) throws IOException { + InterfaceListUtil interfaceListUtil = new InterfaceListUtil(); + String oatoken = interfaceListUtil.getToken(PropKit.getProp(PropKit.LOGINNAME)); + long aLong = Long.parseLong(pathId); + final List attachmentIds = attachmentManager.getBySubReference(aLong); + JSONArray jsonArray = new JSONArray(); + for (int i = 0 ; i < attachmentIds.size();i++) { + Attachment attachment = attachmentManager.getAttachmentByFileURL(attachmentIds.get(i)); + Long fileUrl = attachment.getFileUrl(); + String filename = attachment.getFilename(); + String fileType = filename.substring(filename.lastIndexOf(".")+1); + String oaFileName = filename.substring(0,filename.lastIndexOf(".")); + //调用接口下载文件,文件存放在指定的路径下 + String dowUrl = PropKit.getProp(PropKit.DOWURL)+"/"+fileUrl+"?fileName="+fileType+"&token="+oatoken; + String str = SystemEnvironment.getApplicationFolder(); + String dowPath = str+"/dhxfile/"+filename; + String download = interfaceListUtil.download(dowUrl, dowPath); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", filename); + jsonObject.put("type", fileType); + jsonObject.put("url", PropKit.getProp(PropKit.JYNCFILE)+"/"+filename); + jsonArray.add(jsonObject); + } + return jsonArray; + } +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/util/A8FolderKit.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/A8FolderKit.java new file mode 100644 index 0000000..d7cb594 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/A8FolderKit.java @@ -0,0 +1,26 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.util; + +import com.seeyon.ctp.common.SystemEnvironment; + +/** + * Description + *
获取A8产品下面的文件夹路径
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class A8FolderKit { + + private static String SH_PROP = ""; + + /** + * Description: + *
获取到A8的安装应用目录  seeyon
+ * @return + */ + public static String getPropFile() { + if("".equals(SH_PROP)) { + SH_PROP = SystemEnvironment.getApplicationFolder() + "/WEB-INF/cfgHome/plugin/daohuaxiang/jyncfile.properties"; + } + return SH_PROP; + } + +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/util/BaseUtil.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/BaseUtil.java new file mode 100644 index 0000000..e5ede24 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/BaseUtil.java @@ -0,0 +1,110 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.util; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + + +/** + * sql执行工具类 + * 2021-06-08 + * @author huangzhengguo + * + */ +public class BaseUtil { + + + PreparedStatement ps = null; + ResultSet res = null; + Connection conn =null; + /** + * sql查询工具 + * @param sql sql语句 + * @param params sql参数 + * @return 结果集 + */ + public ResultSet executeQuery(String sql, Object[] params) + { + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + for(int i = 0; i < params.length; i++){ + ps.setObject(i+1, params[i]); + } + res = ps.executeQuery(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return res; + } + /** + * sql更新工具 + * @param sql + * @param params + * @return + */ + public int executeUpdate(String sql, Object[] params) + { + int res = 0; + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + for(int i = 0; i < params.length; i++) + { + ps.setObject(i+1, params[i]); + } + res = ps.executeUpdate(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return res; + } + + + public void close() { + release(res,null,conn,ps); + } + //定义一个释放资源的方法; + /* + * 定义一个方法: 释放资源: 直接将rs stmt conn 全部释放: + */ + public static void release(ResultSet rs ,Statement stmt , Connection conn,PreparedStatement ps){ + if(rs!=null){ + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + rs=null; + } + if(stmt!=null){ + try { + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + stmt=null; + } + if(conn!=null){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + conn=null; + } + if(ps!=null){ + try { + ps.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + ps=null; + } + + } +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/util/DBConnection.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/DBConnection.java new file mode 100644 index 0000000..f181afe --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/DBConnection.java @@ -0,0 +1,49 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.util; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class DBConnection { + // JDBC 驱动名及数据库 URL + static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + static final String DB_URL = "jdbc:sqlserver://119.96.243.50:1433;databaseName=U8CLOUD"; + + // 数据库的用户名与密码,根据自己的情况修改 + static final String USER = "sa"; + static final String PASS = "Sa123456"; + + public void conn() { + Connection conn = null; + + try { + // 注册 JDBC 驱动 + Class.forName(JDBC_DRIVER); + + // 打开链接 + System.out.println("连接数据库..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + + // 关闭链接 + conn.close(); + } catch (SQLException se) { + // 处理 JDBC 错误 + se.printStackTrace(); + } catch (Exception e) { + // 处理 Class.forName 错误 + e.printStackTrace(); + } finally { + // 关闭资源 + try { + if (conn != null) { + conn.close(); + } + } catch (SQLException se) { + se.printStackTrace(); + } + } + System.out.println("完成操作"); + } + +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiNewUtil.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiNewUtil.java new file mode 100644 index 0000000..c5e7c17 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiNewUtil.java @@ -0,0 +1,426 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.util; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import org.songjian.utils.json.JSONArray; + +import java.io.IOException; +import java.util.*; + +/** + * 描述: + * + * @author alexander + * @version 1.0 + * @date 2023/8/25 09:16 星期五 + */ +public class FanWeiNewUtil { + /** + * 模拟缓存服务 + */ + private static final Map SYSTEM_CACHE = new HashMap<>(); + + private static String privateKey = ""; + private static String publicKey = ""; + + /** + * ecology系统发放的授权许可证(appid) + * ce14aaca-fa08-4eb7-9f10-c2294285c4ea + */ + private static String APPID = "e47a15d2-95f2-4bf6-a546-8076ce445a19"; + + + /** + * 第一步: + * + * 调用ecology注册接口,根据appid进行注册,将返回服务端公钥和Secret信息 + */ + public static Map Regist(String address) throws IOException { + + //调用ECOLOGY系统接口进行注册 + String data = HttpRequest.post(address + "/api/ec/dev/auth/regist") + .header("appid",PropKit.getProp(PropKit.APPID)) + .header("cpk","123") + .header("loginid",PropKit.getProp(PropKit.LOGINID)) + .header("pwd",PropKit.getProp(PropKit.PWD)) + .timeout(2000) + .execute().body(); + + // 打印ECOLOGY响应信息 + System.out.println("Regist():"+data); + Map datas = JSONUtil.parseObj(data); + + //ECOLOGY返回的系统公钥 + SYSTEM_CACHE.put("SERVER_PUBLIC_KEY", StrUtil.nullToEmpty((String)datas.get("spk"))); + //ECOLOGY返回的系统密钥 + SYSTEM_CACHE.put("SERVER_SECRET",StrUtil.nullToEmpty((String)datas.get("secrit"))); + return datas; + } + + + + /** + * 第二步: + * + * 通过第一步中注册系统返回信息进行获取token信息 + */ + public static Map Getoken(String address) throws IOException { + // 从系统缓存或者数据库中获取ECOLOGY系统公钥和Secret信息 + String secret = PropKit.getProp(PropKit.NEWSECRET); + String spk = PropKit.getProp(PropKit.NEWSPK); + + + // 公钥加密,所以RSA对象私钥为null + RSA rsa = new RSA(null,spk); + //对秘钥进行加密传输,防止篡改数据 + String encryptSecret = rsa.encryptBase64(secret, CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey); + + //调用ECOLOGY系统接口进行注册 + String data = HttpRequest.post(address+ "/api/ec/dev/auth/applytoken") + .header("appid",PropKit.getProp(PropKit.APPID)) + .header("secret",encryptSecret) + .header("time","3600") + .execute().body(); + + System.out.println("Getoken():"+data); + Map datas = JSONUtil.parseObj(data); + + //ECOLOGY返回的token + // TODO 为Token缓存设置过期时间 + SYSTEM_CACHE.put("SERVER_TOKEN",StrUtil.nullToEmpty((String)datas.get("token"))); + + return datas; + } + + /** + * 第三步: + * + * 调用ecology系统的rest接口,请求头部带上token和用户标识认证信息 + * + * @param params 请求参数map,创建流程之类的post接口是以模拟form表单提交的方式,其他get接口以json字符串方式提交 + * + * 注意:ECOLOGY系统所有POST接口调用请求头请设置 "Content-Type","application/x-www-form-urlencoded; charset=utf-8" + */ + public static String PostRestful(Map params, String userid) throws IOException { + + //ECOLOGY返回的token + String token = (String) Getoken(PropKit.getProp(PropKit.NEWADDRESS)).get("token"); + + + //封装请求头参数 + RSA rsa = new RSA(null, PropKit.getProp(PropKit.NEWSPK)); + //对用户信息进行加密传输,暂仅支持传输OA用户ID + String encryptUserid = rsa.encryptBase64(userid,CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey); + + //调用ECOLOGY系统接口 + String data = HttpRequest.post(PropKit.getProp(PropKit.NEWADDRESS) + PropKit.getProp(PropKit.TONGYONGAPI)) + .header("appid",PropKit.getProp(PropKit.APPID)) + .header("token",token) + .header("userid",encryptUserid) + // .header("skipsession", "1") + .form(params) + .execute().body(); +// Map headermap = new HashMap(); +// headermap.put("appid",APPID); +// headermap.put("token",token); +// headermap.put("userid",encryptUserid); +// String data = HttpClientUtil.doPostFORM(address + api,headermap,params); + System.out.println("PostRestfulby():"+data); + return data; + } + + public static String PostRestfulbyForm(String requestId, String userid) throws IOException { + + //ECOLOGY返回的token + String token = (String) Getoken(PropKit.getProp(PropKit.NEWADDRESS)).get("token"); + + //封装请求头参数 + RSA rsa = new RSA(null, PropKit.getProp(PropKit.NEWSPK)); + //对用户信息进行加密传输,暂仅支持传输OA用户ID + String encryptUserid = rsa.encryptBase64(userid,CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey); + + Map m = new LinkedHashMap(); + m.put("requestId", requestId);//流程ID + + //调用ECOLOGY系统接口 + String data = HttpRequest.post(PropKit.getProp(PropKit.ADDRESS) + "/api/workflow/paService/submitRequest") + .header("appid",PropKit.getProp(PropKit.APPID)) + .header("token",token) + .header("userid",encryptUserid) + // .header("skipsession", "1") + .form(m) + .execute().body(); + // Map headermap = new HashMap(); + // headermap.put("appid",APPID); + // headermap.put("token",token); + // headermap.put("userid",encryptUserid); + // String data = HttpClientUtil.doPostFORM(address + api,headermap,params); + System.out.println("PostRestfulbyForm():"+data); + return data; + } + +// public static void getSub(){ +// String returnSTR = PostRestful("http://110.10.2.39","/api/hrm/resful/getHrmUserInfoWithPage",null,"1"); +// System.out.println(returnSTR); +// } +// +// /** +// * 消息接口 +// */ +// private static void sendMsg(){ +// PostRestfulbyForm("http://127.0.0.1:8888","/api/ec/dev/message/sendCustomMessageSingle",sendCustomMessageSingle(),"1"); +// } + + + /** + * 创建流程 + */ + public static Map createWF(FormDataVo formDataVo, JSONArray faths) throws NoSuchFieldException, IOException { + + //主表信息 + List mainlist = new ArrayList(); + //客户名称 + Map mainmap1 = new HashMap(); + mainmap1.put("fieldName","khmc");//OA字段名-出差类型(下拉框) + mainmap1.put("fieldValue",formDataVo.getFieldData("客户id").getStringValue());//字段值(下拉框选项值) + mainlist.add(mainmap1); + + //标题 + Map mainmap2 = new HashMap(); + mainmap2.put("fieldName","bt");//OA字段名-同行人员(多人力资源浏览框) + mainmap2.put("fieldValue",formDataVo.getFieldData("表头").getStringValue());//字段值(OA人员ID,多个以英文逗号分隔) + mainlist.add(mainmap2); + + //单号 + Map mainmap3 = new HashMap(); + mainmap3.put("fieldName","dh"); + mainmap3.put("fieldValue",formDataVo.getFieldData("流水号").getStringValue()); + mainlist.add(mainmap3); + + //申请日期 + Map mainmap4 = new HashMap(); + mainmap4.put("fieldName","sqrq"); + mainmap4.put("fieldValue",formDataVo.getFieldData("填表日期").getStringValue()); + mainlist.add(mainmap4); + + //投入金额 + Map mainmap5 = new HashMap(); + mainmap5.put("fieldName","trje"); + mainmap5.put("fieldValue",formDataVo.getFieldData("投入金额").getStringValue()); + mainlist.add(mainmap5); + + //备案意见 + Map mainmap6 = new HashMap(); + mainmap6.put("fieldName","bayj"); + mainmap6.put("fieldValue",formDataVo.getFieldData("备案意见").getStringValue()); + mainlist.add(mainmap6); + + //备案简述 + Map mainmap9 = new HashMap(); + mainmap9.put("fieldName","bajs"); + mainmap9.put("fieldValue",formDataVo.getFieldData("备案简述").getStringValue()); + mainlist.add(mainmap9); + + //分公司 + Map mainmap8 = new HashMap(); + mainmap8.put("fieldName","ssschxsgs"); + mainmap8.put("fieldValue",formDataVo.getFieldData("分公司").getStringValue()); + mainlist.add(mainmap8); + + //经办人 + Map mainmap10 = new HashMap(); + mainmap10.put("fieldName","jbr"); + mainmap10.put("fieldValue",formDataVo.getFieldData("经办人").getStringValue()); + mainlist.add(mainmap10); + + //备案类型 + Map mainmap11 = new HashMap(); + mainmap11.put("fieldName","balx"); + mainmap11.put("fieldValue","0"); + mainlist.add(mainmap11); + + //附件 + if(faths.size() > 0) { + Map mainmap7 = new HashMap(); + mainmap7.put("fieldName","banr"); + List fujianValue = new ArrayList(); + for (int i = 0; i < faths.size(); i++) { + Map fath = (Map) faths.get(i); + Map fujianMap = new HashMap(); + fujianMap.put("filePath", fath.get("url")); + fujianMap.put("fileName", fath.get("name")); + fujianValue.add(fujianMap); + } + + mainmap7.put("fieldValue",fujianValue); + mainlist.add(mainmap7); + } + + //接口主参数 + Map m = new LinkedHashMap(); + //流程ID + m.put("workflowId",PropKit.getProp(PropKit.NEWWORKFLOWID)); + //流程标题 + m.put("requestName",formDataVo.getColSummary().getSubject()); + //主表 + m.put("mainData",JSONUtil.toJsonStr(mainlist)); + return m; + + } + + /** + * 创建流程 + */ + public static Map createWF2(Map data, JSONArray faths) throws NoSuchFieldException, IOException { + + //主表信息 + List mainlist = new ArrayList(); + + //客户名称 + Map mainmap1 = new HashMap(); + mainmap1.put("fieldName","khmc");//OA字段名-出差类型(下拉框) + mainmap1.put("fieldValue",data.get("khmc"));//字段值(下拉框选项值) + mainlist.add(mainmap1); + + //标题 + Map mainmap2 = new HashMap(); + mainmap2.put("fieldName","bt");//OA字段名-同行人员(多人力资源浏览框) + mainmap2.put("fieldValue",data.get("bt"));//字段值(OA人员ID,多个以英文逗号分隔) + mainlist.add(mainmap2); + + //单号 + Map mainmap3 = new HashMap(); + mainmap3.put("fieldName","dh"); + mainmap3.put("fieldValue",data.get("dh")); + mainlist.add(mainmap3); + + //申请日期 + Map mainmap4 = new HashMap(); + mainmap4.put("fieldName","sqrq"); + mainmap4.put("fieldValue",data.get("sqrq")); + mainlist.add(mainmap4); + + //投入金额 + Map mainmap5 = new HashMap(); + mainmap5.put("fieldName","trje"); + mainmap5.put("fieldValue",data.get("trje")); + mainlist.add(mainmap5); + + //备案意见 + Map mainmap6 = new HashMap(); + mainmap6.put("fieldName","bayj"); + mainmap6.put("fieldValue",data.get("bayj")); + mainlist.add(mainmap6); + + //备案简述 + Map mainmap9 = new HashMap(); + mainmap9.put("fieldName","bajs"); + mainmap9.put("fieldValue",data.get("bajs")); + mainlist.add(mainmap9); + + //分公司 + Map mainmap8 = new HashMap(); + mainmap8.put("fieldName","ssschxsgs"); + mainmap8.put("fieldValue",data.get("ssschxsgs")); + mainlist.add(mainmap8); + + //经办人 + Map mainmap10 = new HashMap(); + mainmap10.put("fieldName","jbr"); + mainmap10.put("fieldValue",data.get("jbr")); + mainlist.add(mainmap10); + + + + //附件 + if(faths.size() > 0) { + Map mainmap7 = new HashMap(); + mainmap7.put("fieldName","banr"); + List fujianValue = new ArrayList(); + for (int i = 0; i < faths.size(); i++) { + Map fath = (Map) faths.get(i); + Map fujianMap = new HashMap(); + fujianMap.put("filePath", fath.get("url")); + fujianMap.put("fileName", fath.get("name")); + fujianValue.add(fujianMap); + } + + mainmap7.put("fieldValue",fujianValue); + mainlist.add(mainmap7); + } + + //接口主参数 + Map m = new LinkedHashMap(); + //流程ID + m.put("workflowId",PropKit.getProp(PropKit.NEWWORKFLOWID)); + //流程标题 + m.put("requestName",data.get("lcbt")); + //主表 + m.put("mainData",JSONUtil.toJsonStr(mainlist)); + + System.out.println("m:"+m); + return m; + + } + + /** + * 发送消息,参数封装 + * @return + */ + public static Map sendCustomMessageSingle() { + + Map map = new HashMap<>(); + + // map.put("code", "1149"); // 消息来源,新建消息来源获取code 请查看文档第四大点补充 + map.put("code", "1207"); // 消息来源,新建消息来源获取code 请查看文档第四大点补充 + map.put("userIdList", "1"); // userIdList参数 userIdList 接收人OA系统id / loginIdList 接收人登录名 / workCodeList 接收人编号 / lastNameList 接收人姓名(任选一个填入即可,以逗号分隔) + // map.put("loginIdList","zhangsan,wangwu" ); //接收人登录名 + // map.put("workCodeList","WS01640,WS01641" ); //接收人编号 + // map.put("lastNameList","张三,王五" ); //接收人姓名 + map.put("creater", "1"); //creater的值 创建人OA系统id / 创建人登录名 / 创建人编号 / 创建人姓名(对应接收人所传入的形式) + // map.put("creater","zhangsan"); + // map.put("creater","WS01640"); + // map.put("creater","张三"); + map.put("title", "接口创建的消息"); + map.put("context", "接口创建的消息,看下内容是否进来了"); + String linkUrl = "http://118.190.132.210:9999/custom_renfu.html?param=corp=ding58007d3a66cc643bacaaa37764f94726--flag=study_project" + + "--projectId=1826492840843284480--ticket=2u+cX2Bl4KPQ89QwNOG0VC/YmAv" + + "/Sa5pu92FXTgUfGDZlhmqdVyNLtJVcZv3Pe7teWbqGAJhufN8Y4tpIW6c1Q=="; + map.put("linkUrl", linkUrl); + map.put("linkMobileUrl", "http://www.baidu.com"); + + // map.put("targetId","559|id22"); //消息来源code +“|”+业务id 消息需要打上已处理标记 + // map.put("bizState","0"); //0 表示消息初始状态是待处理 消息需要打上已处理标记 + + return map; + } + + public static String getAPPID() { + return APPID; + } + + public static void setAPPID(String APPID) { + FanWeiNewUtil.APPID = APPID; + } + + public static String getPrivateKey() { + return privateKey; + } + + public static void setPrivateKey(String privateKey) { + FanWeiNewUtil.privateKey = privateKey; + } + + public static String getPublicKey() { + return publicKey; + } + + public static void setPublicKey(String publicKey) { + FanWeiNewUtil.publicKey = publicKey; + } +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiUtil.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiUtil.java new file mode 100644 index 0000000..54f8d89 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/FanWeiUtil.java @@ -0,0 +1,415 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.util; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import org.songjian.utils.json.JSONArray; + +import java.io.IOException; +import java.util.*; + +/** + * 描述: + * + * @author alexander + * @version 1.0 + * @date 2023/8/25 09:16 星期五 + */ +public class FanWeiUtil { + /** + * 模拟缓存服务 + */ + private static final Map SYSTEM_CACHE = new HashMap<>(); + + private static String privateKey = ""; + private static String publicKey = ""; + + /** + * ecology系统发放的授权许可证(appid) + * ce14aaca-fa08-4eb7-9f10-c2294285c4ea + */ + private static String APPID = "e47a15d2-95f2-4bf6-a546-8076ce445a19"; + + + /** + * 第一步: + * + * 调用ecology注册接口,根据appid进行注册,将返回服务端公钥和Secret信息 + */ + public static Map Regist(String address){ + + //获取当前系统RSA加密的公钥 + RSA rsa = new RSA(); + if(publicKey.equals("")) { + publicKey = rsa.getPublicKeyBase64(); + } + if(privateKey.equals("")) { + privateKey = rsa.getPrivateKeyBase64(); + } + + System.out.println("publicKey:"+publicKey+" privateKey:"+privateKey); + // 客户端RSA私钥 + SYSTEM_CACHE.put("LOCAL_PRIVATE_KEY",privateKey); + // 客户端RSA公钥 + SYSTEM_CACHE.put("LOCAL_PUBLIC_KEY",publicKey); + + //调用ECOLOGY系统接口进行注册 + String data = HttpRequest.post(address + "/api/ec/dev/auth/regist") + .header("appid",APPID) + .header("cpk",publicKey) + .timeout(2000) + .execute().body(); + + // 打印ECOLOGY响应信息 + System.out.println("Regist():"+data); + Map datas = JSONUtil.parseObj(data); + + //ECOLOGY返回的系统公钥 + SYSTEM_CACHE.put("SERVER_PUBLIC_KEY", StrUtil.nullToEmpty((String)datas.get("spk"))); + //ECOLOGY返回的系统密钥 + SYSTEM_CACHE.put("SERVER_SECRET",StrUtil.nullToEmpty((String)datas.get("secrit"))); + return datas; + } + + + + /** + * 第二步: + * + * 通过第一步中注册系统返回信息进行获取token信息 + */ + public static Map Getoken(String address) throws IOException { + // 从系统缓存或者数据库中获取ECOLOGY系统公钥和Secret信息 + String secret = PropKit.getProp(PropKit.SECRET); + String spk = PropKit.getProp(PropKit.SPK); + + + // 公钥加密,所以RSA对象私钥为null + RSA rsa = new RSA(null,spk); + //对秘钥进行加密传输,防止篡改数据 + String encryptSecret = rsa.encryptBase64(secret, CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey); + + //调用ECOLOGY系统接口进行注册 + String data = HttpRequest.post(address+ "/api/ec/dev/auth/applytoken") + .header("appid",PropKit.getProp(PropKit.APPID)) + .header("secret",encryptSecret) + .header("time","3600") + .execute().body(); + + System.out.println("Getoken():"+data); + Map datas = JSONUtil.parseObj(data); + + //ECOLOGY返回的token + // TODO 为Token缓存设置过期时间 + SYSTEM_CACHE.put("SERVER_TOKEN",StrUtil.nullToEmpty((String)datas.get("token"))); + + return datas; + } + + /** + * 第三步: + * + * 调用ecology系统的rest接口,请求头部带上token和用户标识认证信息 + * + * @param params 请求参数map,创建流程之类的post接口是以模拟form表单提交的方式,其他get接口以json字符串方式提交 + * + * 注意:ECOLOGY系统所有POST接口调用请求头请设置 "Content-Type","application/x-www-form-urlencoded; charset=utf-8" + */ + public static String PostRestful(Map params, String userid) throws IOException { + + //ECOLOGY返回的token + String token = (String) Getoken(PropKit.getProp(PropKit.ADDRESS)).get("token"); + + + //封装请求头参数 + RSA rsa = new RSA(null, PropKit.getProp(PropKit.SPK)); + //对用户信息进行加密传输,暂仅支持传输OA用户ID + String encryptUserid = rsa.encryptBase64(userid,CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey); + + //调用ECOLOGY系统接口 + String data = HttpRequest.post(PropKit.getProp(PropKit.ADDRESS) + PropKit.getProp(PropKit.TONGYONGAPI)) + .header("appid",PropKit.getProp(PropKit.APPID)) + .header("token",token) + .header("userid",encryptUserid) + // .header("skipsession", "1") + .form(params) + .execute().body(); +// Map headermap = new HashMap(); +// headermap.put("appid",APPID); +// headermap.put("token",token); +// headermap.put("userid",encryptUserid); +// String data = HttpClientUtil.doPostFORM(address + api,headermap,params); + System.out.println("PostRestfulby():"+data); + return data; + } + public static String PostRestfulbyForm(String requestId, String userid) throws IOException { + + //ECOLOGY返回的token + String token = (String) Getoken(PropKit.getProp(PropKit.ADDRESS)).get("token"); + + //封装请求头参数 + RSA rsa = new RSA(null, PropKit.getProp(PropKit.SPK)); + //对用户信息进行加密传输,暂仅支持传输OA用户ID + String encryptUserid = rsa.encryptBase64(userid,CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey); + + Map m = new LinkedHashMap(); + m.put("requestId", requestId);//流程ID + + //调用ECOLOGY系统接口 + String data = HttpRequest.post(PropKit.getProp(PropKit.ADDRESS) + "/api/workflow/paService/submitRequest") + .header("appid",PropKit.getProp(PropKit.APPID)) + .header("token",token) + .header("userid",encryptUserid) + // .header("skipsession", "1") + .form(m) + .execute().body(); + // Map headermap = new HashMap(); + // headermap.put("appid",APPID); + // headermap.put("token",token); + // headermap.put("userid",encryptUserid); + // String data = HttpClientUtil.doPostFORM(address + api,headermap,params); + System.out.println("PostRestfulbyForm():"+data); + return data; + } + +// public static void getSub(){ +// String returnSTR = PostRestful("http://110.10.2.39","/api/hrm/resful/getHrmUserInfoWithPage",null,"1"); +// System.out.println(returnSTR); +// } +// +// /** +// * 消息接口 +// */ +// private static void sendMsg(){ +// PostRestfulbyForm("http://127.0.0.1:8888","/api/ec/dev/message/sendCustomMessageSingle",sendCustomMessageSingle(),"1"); +// } + + /** + * 创建流程 + */ + public static Map createWF(FormDataVo formDataVo, JSONArray faths) throws NoSuchFieldException, IOException { + + //主表信息 + List mainlist = new ArrayList(); + //客户名称 + Map mainmap1 = new HashMap(); + mainmap1.put("fieldName","khmc");//OA字段名-出差类型(下拉框) + mainmap1.put("fieldValue",formDataVo.getFieldData("客户id").getStringValue());//字段值(下拉框选项值) + mainlist.add(mainmap1); + + //标题 + Map mainmap2 = new HashMap(); + mainmap2.put("fieldName","bt");//OA字段名-同行人员(多人力资源浏览框) + mainmap2.put("fieldValue",formDataVo.getFieldData("表头").getStringValue());//字段值(OA人员ID,多个以英文逗号分隔) + mainlist.add(mainmap2); + + //单号 + Map mainmap3 = new HashMap(); + mainmap3.put("fieldName","dh"); + mainmap3.put("fieldValue",formDataVo.getFieldData("流水号").getStringValue()); + mainlist.add(mainmap3); + + //申请日期 + Map mainmap4 = new HashMap(); + mainmap4.put("fieldName","sqrq"); + mainmap4.put("fieldValue",formDataVo.getFieldData("填表日期").getStringValue()); + mainlist.add(mainmap4); + + //投入金额 + Map mainmap5 = new HashMap(); + mainmap5.put("fieldName","trje"); + mainmap5.put("fieldValue",formDataVo.getFieldData("投入金额").getStringValue()); + mainlist.add(mainmap5); + + //备案意见 + Map mainmap6 = new HashMap(); + mainmap6.put("fieldName","bayj"); + mainmap6.put("fieldValue",formDataVo.getFieldData("备案意见").getStringValue()); + mainlist.add(mainmap6); + + //分公司 + Map mainmap8 = new HashMap(); + mainmap8.put("fieldName","fgs"); + mainmap8.put("fieldValue",formDataVo.getFieldData("分公司").getStringValue()); + mainlist.add(mainmap8); + + //备案简述 + Map mainmap11 = new HashMap(); + mainmap11.put("fieldName","bajs"); + mainmap11.put("fieldValue",formDataVo.getFieldData("备案简述").getStringValue()); + mainlist.add(mainmap11); + + //备案类型 + Map mainmap12 = new HashMap(); + mainmap12.put("fieldName","balx"); + mainmap12.put("fieldValue","0"); + mainlist.add(mainmap12); + + //附件 + if(faths.size() > 0) { + Map mainmap7 = new HashMap(); + mainmap7.put("fieldName","banr"); + List fujianValue = new ArrayList(); + for (int i = 0; i < faths.size(); i++) { + Map fath = (Map) faths.get(i); + Map fujianMap = new HashMap(); + fujianMap.put("filePath", fath.get("url")); + fujianMap.put("fileName", fath.get("name")); + fujianValue.add(fujianMap); + } + + mainmap7.put("fieldValue",fujianValue); + mainlist.add(mainmap7); + } + + //接口主参数 + Map m = new LinkedHashMap(); + //流程ID + m.put("workflowId",PropKit.getProp(PropKit.WORKFLOWID)); + //流程标题 + m.put("requestName",formDataVo.getColSummary().getSubject()); + //主表 + m.put("mainData",JSONUtil.toJsonStr(mainlist)); + return m; + + } + + + /** + * 创建流程 + */ + public static Map createWF2(Map data, JSONArray faths) throws NoSuchFieldException, IOException { + + //主表信息 + List mainlist = new ArrayList(); + //客户名称 + Map mainmap1 = new HashMap(); + mainmap1.put("fieldName","khmc");//OA字段名-出差类型(下拉框) + mainmap1.put("fieldValue",data.get("khmc"));//字段值(下拉框选项值) + mainlist.add(mainmap1); + + //标题 + Map mainmap2 = new HashMap(); + mainmap2.put("fieldName","bt");//OA字段名-同行人员(多人力资源浏览框) + mainmap2.put("fieldValue",data.get("bt"));//字段值(OA人员ID,多个以英文逗号分隔) + mainlist.add(mainmap2); + + //单号 + Map mainmap3 = new HashMap(); + mainmap3.put("fieldName","dh"); + mainmap3.put("fieldValue",data.get("dh")); + mainlist.add(mainmap3); + + //申请日期 + Map mainmap4 = new HashMap(); + mainmap4.put("fieldName","sqrq"); + mainmap4.put("fieldValue",data.get("sqrq")); + mainlist.add(mainmap4); + + //投入金额 + Map mainmap5 = new HashMap(); + mainmap5.put("fieldName","trje"); + mainmap5.put("fieldValue",data.get("trje")); + mainlist.add(mainmap5); + + //备案意见 + Map mainmap6 = new HashMap(); + mainmap6.put("fieldName","bayj"); + mainmap6.put("fieldValue",data.get("bayj")); + mainlist.add(mainmap6); + + //分公司 + Map mainmap8 = new HashMap(); + mainmap8.put("fieldName","fgs"); + mainmap8.put("fieldValue",data.get("fgs")); + mainlist.add(mainmap8); + + //附件 + if(faths.size() > 0) { + Map mainmap7 = new HashMap(); + mainmap7.put("fieldName","banr"); + List fujianValue = new ArrayList(); + for (int i = 0; i < faths.size(); i++) { + Map fath = (Map) faths.get(i); + Map fujianMap = new HashMap(); + fujianMap.put("filePath", fath.get("url")); + fujianMap.put("fileName", fath.get("name")); + fujianValue.add(fujianMap); + } + + mainmap7.put("fieldValue",fujianValue); + mainlist.add(mainmap7); + } + + //接口主参数 + Map m = new LinkedHashMap(); + //流程ID + m.put("workflowId",PropKit.getProp(PropKit.WORKFLOWID)); + //流程标题 + m.put("requestName",data.get("lcbt")); + //主表 + m.put("mainData",JSONUtil.toJsonStr(mainlist)); + return m; + + } + + /** + * 发送消息,参数封装 + * @return + */ + public static Map sendCustomMessageSingle() { + + Map map = new HashMap<>(); + + // map.put("code", "1149"); // 消息来源,新建消息来源获取code 请查看文档第四大点补充 + map.put("code", "1207"); // 消息来源,新建消息来源获取code 请查看文档第四大点补充 + map.put("userIdList", "1"); // userIdList参数 userIdList 接收人OA系统id / loginIdList 接收人登录名 / workCodeList 接收人编号 / lastNameList 接收人姓名(任选一个填入即可,以逗号分隔) + // map.put("loginIdList","zhangsan,wangwu" ); //接收人登录名 + // map.put("workCodeList","WS01640,WS01641" ); //接收人编号 + // map.put("lastNameList","张三,王五" ); //接收人姓名 + map.put("creater", "1"); //creater的值 创建人OA系统id / 创建人登录名 / 创建人编号 / 创建人姓名(对应接收人所传入的形式) + // map.put("creater","zhangsan"); + // map.put("creater","WS01640"); + // map.put("creater","张三"); + map.put("title", "接口创建的消息"); + map.put("context", "接口创建的消息,看下内容是否进来了"); + String linkUrl = "http://118.190.132.210:9999/custom_renfu.html?param=corp=ding58007d3a66cc643bacaaa37764f94726--flag=study_project" + + "--projectId=1826492840843284480--ticket=2u+cX2Bl4KPQ89QwNOG0VC/YmAv" + + "/Sa5pu92FXTgUfGDZlhmqdVyNLtJVcZv3Pe7teWbqGAJhufN8Y4tpIW6c1Q=="; + map.put("linkUrl", linkUrl); + map.put("linkMobileUrl", "http://www.baidu.com"); + + // map.put("targetId","559|id22"); //消息来源code +“|”+业务id 消息需要打上已处理标记 + // map.put("bizState","0"); //0 表示消息初始状态是待处理 消息需要打上已处理标记 + + return map; + } + + public static String getAPPID() { + return APPID; + } + + public static void setAPPID(String APPID) { + FanWeiUtil.APPID = APPID; + } + + public static String getPrivateKey() { + return privateKey; + } + + public static void setPrivateKey(String privateKey) { + FanWeiUtil.privateKey = privateKey; + } + + public static String getPublicKey() { + return publicKey; + } + + public static void setPublicKey(String publicKey) { + FanWeiUtil.publicKey = publicKey; + } +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/util/InterfaceListUtil.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/InterfaceListUtil.java new file mode 100644 index 0000000..cafb52e --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/InterfaceListUtil.java @@ -0,0 +1,346 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.util; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.RequestEntity; +import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; +import org.springframework.core.io.support.PropertiesLoaderUtils; + +import com.alibaba.fastjson.JSONObject; + +/** + * 接口调用工具类 + * 2021-06-08 + * @author huangzhengguo + * + */ +public class InterfaceListUtil { + + /** + * 获取一个token + * + + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public String getToken(String loginName) throws FileNotFoundException, IOException { + String address = ""; + String token = ""; + if("".equals(loginName)) { + address = PropKit.getProp(PropKit.OATOKENURL)+"/"+PropKit.getProp(PropKit.RESTNAME)+"/"+PropKit.getProp(PropKit.RESTPASSWORD); + }else { + address = PropKit.getProp(PropKit.OATOKENURL)+"/"+PropKit.getProp(PropKit.RESTNAME)+"/"+PropKit.getProp(PropKit.RESTPASSWORD)+"?loginName="+loginName; + } + HttpURLConnection connection = (HttpURLConnection) new URL(address).openConnection(); + connection.setRequestMethod("GET"); + int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String inputLine; + StringBuffer response = new StringBuffer(); + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + String result = response.toString(); + if(result.contains("{")) { + JSONObject jsObj = JSONObject.parseObject(result); + System.out.println(jsObj); + token = jsObj.get("id").toString(); + }else { + token = result; + } + System.out.println(token); + } else { + System.out.println("GET request not worked"); + } + return token; + } + + /** + * 调用get接口 + * + * @param par 拼接在url中的参数 + * @param strUrl 需要调用的url对应的配置文件的key + * @return + */ + public String doGet(String par, String strUrl, String token) { + String address = MessageFormat.format(getProperties(strUrl), par + "?token=") + token; + + DefaultHttpClient client = new DefaultHttpClient(); + String result = ""; + HttpGet get = new HttpGet(address); + try { + HttpResponse res = client.execute(get); + if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + result = EntityUtils.toString(res.getEntity()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } +// JSONObject jsObj = JSONObject.parseObject(result); + return result; + + } + + /** + * 调用post接口 + * + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + */ + public JSONObject doPost(String str, String urlStr,String token) { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { +// String token = getToken(getProperties("restUserName"), getProperties("restPassword")); + URL url = new URL(getProperties(urlStr) + "?token=" + token); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 + connection.setRequestProperty("Content-Type", "application/json"); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + // 连接对象获取一个输入流,向远程读取 + if (connection.getResponseCode() == 200) { + + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } + JSONObject json = JSONObject.parseObject(result); + return json; + + } + + /** + * 获取指定参数文件的值(pa.properties) + * + * @param str 参数文件中的key + * @return + */ + public String getProperties(String str) { + Properties properties = null; + try { + properties = PropertiesLoaderUtils.loadAllProperties("pa.properties"); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return (String) properties.get(str); + } + + /** + * 调用Soap接口 对接平台使用 + * @param action 平台接口中的方法参数名称 + * @param xml 传递平台的XML数据参数 + * @return 返回调取soap接口后接口的返回值(未处理) + * @throws HttpException + * @throws IOException + */ + public String doSoap(String action, String xml,String id) throws HttpException, IOException { + String wsdl = ""; + if("createDepartment".equals(action)||"updateDepartment".equals(action)) { + wsdl = getProperties("DeptWsdl"); + }else if("createPractitioner".equals(action)||"updatePractitioner".equals(action)) { + wsdl = getProperties("MemberWsdl"); + } + System.out.println("wsdl:"+wsdl); + int timeout = 10000; + + // 构造soap请求信息 + StringBuffer sb = new StringBuffer(""); + sb.append( + ""); + sb.append(""); + sb.append(""); + sb.append(" "); + sb.append("" + action + "" + xml + ""); + sb.append(""); + sb.append(""); + sb.append(""); + + // HttpClient发送SOAP请求 +// System.out.println("HttpClient 发送SOAP请求"); + HttpClient client = new HttpClient(); + PostMethod postMethod = new PostMethod(wsdl); + Header header = new Header(); + // 设置连接超时 + client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout); + // 设置读取时间超时 + client.getHttpConnectionManager().getParams().setSoTimeout(timeout); + // 然后把Soap请求数据添加到PostMethod中 + RequestEntity requestEntity = null; + try { + requestEntity = new StringRequestEntity(sb.toString(), "text/xml", "UTF-8"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + // 设置请求头部,否则可能会报 “no SOAPAction header” 的错误 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date businessTime = new Date(); + Date operationTime = new Date(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmss"); + Date root = new Date(); + String rootId = sdf1.format(root); + postMethod.setRequestHeader("SOAPAction", ""); + postMethod.setRequestHeader("Content-Type", "application/fhir+json"); + postMethod.setRequestHeader("rootId", rootId); + postMethod.setRequestHeader("token", id); + postMethod.setRequestHeader("domain", "OA"); + postMethod.setRequestHeader("businessTime", sdf.format(businessTime)); + postMethod.setRequestHeader("key", "806c1571-35de-41a2-b3c9-06ae5474d43a"); + postMethod.setRequestHeader("operationTime", sdf.format(operationTime)); + // 设置请求体 + postMethod.setRequestEntity(requestEntity); + int status = client.executeMethod(postMethod); + // 打印请求状态码 +// System.out.println("status:" + status); + // 获取响应体输入流 + InputStream is = postMethod.getResponseBodyAsStream(); + // 获取请求结果字符串 + byte[] bytes = new byte[is.available()]; + is.read(bytes); + String result = new String(bytes); + + return result; + } + + /** + * 下载文件到指定目录 + * @param dowUrl:http地址 + * @param dowPath:指定目录 + * */ + public String download(String dowUrl, String dowPath){ + try { +// log.info("下载地址是:"+dowUrl+",存储地址是:"+dowPath); + URL url = new URL(dowUrl); + + URLConnection urlConnection = url.openConnection(); + + HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;// http的连接类 + + //String contentType = httpURLConnection.getContentType();//请求类型,可用来过滤请求, + + httpURLConnection.setConnectTimeout(1000*5);//设置超时 + + httpURLConnection.setRequestMethod("GET");//设置请求方式,默认是GET + + httpURLConnection.setRequestProperty("Charset", "UTF-8");// 设置字符编码 + + httpURLConnection.connect();// 打开连接 + + BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream()); + + String path = dowPath;// 指定存放位置 + File filed = new File(path); + + OutputStream out = new FileOutputStream(filed); + int size = 0; + + byte[] b = new byte[2048]; + //把输入流的文件读取到字节数据b中,然后输出到指定目录的文件 + while ((size = bin.read(b)) != -1) { + out.write(b, 0, size); + } + // 关闭资源 + bin.close(); + out.close(); + return "200"; + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return "500"; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return "400"; + } + } +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/util/JdbcUtil.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/JdbcUtil.java new file mode 100644 index 0000000..b990bdf --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/JdbcUtil.java @@ -0,0 +1,82 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.util; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + + +/** + * jdbc工具类 + * 2021-06-08 + * @author huangzhengguo + * + */ + public class JdbcUtil { + private static String url; + private static String user; + private static String password; + + static { + // 使用properties加载属性文件 + //Properties prop = new Properties(); + //String ip = GetIP.getIp(); + try { + //InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("pa.properties"); + //prop.load(is); + // 注册驱动(获取属性文件中的数据) + String driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + Class.forName(driverClassName); + // 获取属性文件中的url,username,password + //System.out.println("ip:" + ip); + url = "jdbc:sqlserver://192.168.0.250:1433;databaseName=U8CLOUD"; + user = "sa"; + password = "Sa123456"; + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 获取数据库连接 + public static Connection getConnection() { + Connection conn = null; + try { + conn = DriverManager.getConnection(url, user, password); + } catch (SQLException e) { + e.printStackTrace(); + } + return conn; + } + + // 释放资源 + public static void close(Connection conn, Statement stat, ResultSet rs) { + close(conn, stat); + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + // 释放资源 + public static void close(Connection conn, Statement stat) { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if (stat != null) { + try { + stat.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/seeyon/apps/daohuaxiangSys/jkts/util/PropKit.java b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/PropKit.java new file mode 100644 index 0000000..24666d6 --- /dev/null +++ b/src/com/seeyon/apps/daohuaxiangSys/jkts/util/PropKit.java @@ -0,0 +1,137 @@ +package com.seeyon.apps.daohuaxiangSys.jkts.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 读取参数 + */ + +public class PropKit { + + private static long lastModify; + + private static ConcurrentHashMap props; + + public static final String PROFILE = "profile"; + + public static final String PAYBILLFILEURL = "paybillFileUrl"; + public static final String GENERALBILLURL = "generalbillUrl"; + public static final String TRANSFORMURL = "transformUrl"; + public static final String XCFZCANCELURL = "xcfzCancelUrl"; + public static final String SBFZCANCELURL = "sbfzCancelUrl"; + public static final String OATOKENURL = "oaTokenUrl"; + public static final String DOWURL = "dowUrl"; + public static final String JYNCFILE = "jyncFile"; + public static final String RESTNAME = "restname"; + public static final String RESTPASSWORD = "restpassword"; + public static final String ADDRESS = "address"; + public static final String TONGYONGAPI = "tongyongApi"; + public static final String APPID = "appid"; + public static final String SPK = "spk"; + public static final String WORKFLOWID = "workflowId"; + public static final String LOGINNAME = "loginName"; + public static final String SECRET = "secret"; + public static final String SQL = "sql"; + public static final String DATASQL = "dataSql"; + public static final String NEWADDRESS = "newAddress"; + public static final String NEWSPK = "newSpk"; + public static final String NEWSECRET = "newSecret"; + public static final String NEWWORKFLOWID = "newWorkflowId"; + public static final String LOGINID = "loginid"; + public static final String PWD = "pwd"; + + public static final String PROD_PAYBILLFILEURL = "prod.paybillFileUrl"; + public static final String PROD_GENERALBILLURL = "prod.generalbillUrl"; + public static final String PROD_TRANSFORMURL = "prod.transformUrl"; + public static final String PROD_XCFZCANCELURL = "prod.xcfzCancelUrl"; + public static final String PROD_SBFZCANCELURL = "prod.sbfzCancelUrl"; + public static final String PROD_OATOKENURL = "prod.oaTokenUrl"; + public static final String PROD_DOWURL = "prod.dowUrl"; + public static final String PROD_JYNCFILE = "prod.jyncFile"; + public static final String PROD_RESTNAME = "prod.restname"; + public static final String PROD_RESTPASSWORD = "prod.restpassword"; + public static final String PROD_ADDRESS = "prod.address"; + public static final String PROD_TONGYONGAPI = "prod.tongyongApi"; + public static final String PROD_APPID = "prod.appid"; + public static final String PROD_SPK = "prod.spk"; + public static final String PROD_WORKFLOWID = "prod.workflowId"; + public static final String PROD_LOGINNAME = "prod.loginName"; + public static final String PROD_SECRET = "prod.secret"; + public static final String PROD_SQL = "prod.sql"; + public static final String PROD_DATASQL = "prod.dataSql"; + public static final String PROD_NEWADDRESS = "prod.newAddress"; + public static final String PROD_NEWSPK = "prod.newSpk"; + public static final String PROD_NEWSECRET = "prod.newSecret"; + public static final String PROD_NEWWORKFLOWID = "prod.newWorkflowId"; + public static final String PROD_LOGINID = "prod.loginid"; + public static final String PROD_PWD = "prod.pwd"; + + /** + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public static String getProp(String key) throws FileNotFoundException, IOException { + File f = new File(A8FolderKit.getPropFile()); + if(null == props) { + props = new ConcurrentHashMap(); + } + if(f.lastModified() != lastModify) { + /** + * huangzhengguo + * 2022-10-18 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + /** + * end + */ + String profile = prop.getProperty(PROFILE); + if("prod".equals(profile)) { + props.put(PAYBILLFILEURL, prop.getProperty(PROD_PAYBILLFILEURL)); + props.put(GENERALBILLURL, prop.getProperty(PROD_GENERALBILLURL)); + props.put(TRANSFORMURL, prop.getProperty(PROD_TRANSFORMURL)); + props.put(XCFZCANCELURL, prop.getProperty(PROD_XCFZCANCELURL)); + props.put(OATOKENURL, prop.getProperty(PROD_OATOKENURL)); + props.put(DOWURL, prop.getProperty(PROD_DOWURL)); + props.put(JYNCFILE, prop.getProperty(PROD_JYNCFILE)); + props.put(RESTNAME, prop.getProperty(PROD_RESTNAME)); + props.put(RESTPASSWORD, prop.getProperty(PROD_RESTPASSWORD)); + props.put(SBFZCANCELURL, prop.getProperty(PROD_SBFZCANCELURL)); + props.put(ADDRESS, prop.getProperty(PROD_ADDRESS)); + props.put(TONGYONGAPI, prop.getProperty(PROD_TONGYONGAPI)); + props.put(APPID, prop.getProperty(PROD_APPID)); + props.put(SPK, prop.getProperty(PROD_SPK)); + props.put(WORKFLOWID, prop.getProperty(PROD_WORKFLOWID)); + props.put(LOGINNAME, prop.getProperty(PROD_LOGINNAME)); + props.put(SECRET, prop.getProperty(PROD_SECRET)); + props.put(SQL, prop.getProperty(PROD_SQL)); + props.put(DATASQL, prop.getProperty(PROD_DATASQL)); + props.put(NEWADDRESS, prop.getProperty(PROD_NEWADDRESS)); + props.put(NEWSPK, prop.getProperty(PROD_NEWSPK)); + props.put(NEWSECRET, prop.getProperty(PROD_NEWSECRET)); + props.put(NEWWORKFLOWID, prop.getProperty(PROD_NEWWORKFLOWID)); + props.put(LOGINID, prop.getProperty(PROD_LOGINID)); + props.put(PWD, prop.getProperty(PROD_PWD)); + } else { + props.put(PAYBILLFILEURL, prop.getProperty(PROD_PAYBILLFILEURL)); + props.put(GENERALBILLURL, prop.getProperty(PROD_GENERALBILLURL)); + props.put(TRANSFORMURL, prop.getProperty(PROD_TRANSFORMURL)); + props.put(XCFZCANCELURL, prop.getProperty(PROD_XCFZCANCELURL)); + props.put(OATOKENURL, prop.getProperty(PROD_OATOKENURL)); + props.put(DOWURL, prop.getProperty(PROD_DOWURL)); + props.put(JYNCFILE, prop.getProperty(PROD_JYNCFILE)); + props.put(RESTNAME, prop.getProperty(PROD_RESTNAME)); + props.put(RESTPASSWORD, prop.getProperty(PROD_RESTPASSWORD)); + } + } + return props.get(key); + } + +} diff --git a/src/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java b/src/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java new file mode 100644 index 0000000..14c7768 --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/QrCodeFormPluginApi.java @@ -0,0 +1,45 @@ +package com.seeyon.apps.qrCodeForm; + +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: FanGaowei + * @Date: 2022/8/11 + */ +public class QrCodeFormPluginApi extends APluginInfoApi { + + @Override + public String getPluginId() { + return QrCodeFormConstants.getPluginId(); + } + + @Override + public String getCreateUser() { + return "致威互联"; + } + + @Override + public String getDescription() { + return "微信扫码制单"; + } + + @Override + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + for (QrCodeFormConstants value : QrCodeFormConstants.values()) { + if(value != QrCodeFormConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + return configVo; + } +} diff --git a/src/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java b/src/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java new file mode 100644 index 0000000..49755c4 --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/QrCodeFormPluginInitializer.java @@ -0,0 +1,23 @@ +package com.seeyon.apps.qrCodeForm; + +import com.seeyon.apps.qrCodeForm.util.InitQrCodeFormUitl; +import com.seeyon.ctp.common.AbstractSystemInitializer; +import com.seeyon.ctp.common.exceptions.BusinessException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class QrCodeFormPluginInitializer extends AbstractSystemInitializer { + private static Log log = LogFactory.getLog(QrCodeFormPluginInitializer.class); + + public QrCodeFormPluginInitializer() { + } + + public void destroy() { + log.info("◆二维码扫码填单插件销毁成功!"); + } + + public void initialize() { + InitQrCodeFormUitl.initMenu(); + log.info("◆二维码扫码填单插件初始化成功!"); + } +} diff --git a/src/com/seeyon/apps/qrCodeForm/constant/Constants.java b/src/com/seeyon/apps/qrCodeForm/constant/Constants.java new file mode 100644 index 0000000..d065422 --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/constant/Constants.java @@ -0,0 +1,15 @@ +package com.seeyon.apps.qrCodeForm.constant; + +import com.seeyon.ctp.common.AppContext; + +public class Constants { + + //模拟移动端登录认证方式 + public static final String _REDIRECTURI = "/qrCodeForm.do?method=newMain&html="; + //流程表单跳转地址 + public static final String FLOW_URL = "/seeyon/m3/apps/v5/collaboration/html/newCollaboration.html?qc=ext&templateId="; + //无流程表单跳转地址 + public static final String UNFLOW_URL = "/seeyon/m3/apps/v5/cap4/htmls/native/form/index.html?"; + + +} diff --git a/src/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java b/src/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java new file mode 100644 index 0000000..7415d9c --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/constant/QrCodeFormConstants.java @@ -0,0 +1,32 @@ +package com.seeyon.apps.qrCodeForm.constant; + +public enum QrCodeFormConstants { + + plugin("qrCodeForm","插件ID"), + oaAddress("https://oa.dhx.com.cn", "OA地址"), + qwAppId("", "企微APPID"), + restId("qrcode", "rest账号"), + restPwd("f39f8102-1c7f-423c-8e6c-57e1d19b9a6f", "rest密码"), + qrcode_loginname("hr", "发起人账号"); + + QrCodeFormConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/src/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java b/src/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java new file mode 100644 index 0000000..6051998 --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/constant/SupportTypeEnum.java @@ -0,0 +1,31 @@ +package com.seeyon.apps.qrCodeForm.constant; + +import com.seeyon.ctp.common.code.EnumsCode; +import com.seeyon.ctp.common.i18n.ResourceUtil; + +public enum SupportTypeEnum implements EnumsCode { + ALL(0, "全部"), + FLOW(1, "仅支持流程表单"), + UNFLOW(2, "仅支持无流程表单"); + + private int key; + private String text; + + private SupportTypeEnum(int key, String text) { + this.key = key; + this.text = text; + } + + public String getValue() { + return String.valueOf(this.key); + } + + public int getKey() { + return this.key; + } + + public String getText() { + return ResourceUtil.getString(this.text); + } + +} diff --git a/src/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java b/src/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java new file mode 100644 index 0000000..fb4cbb3 --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/controller/QrCodeFormController.java @@ -0,0 +1,110 @@ +package com.seeyon.apps.qrCodeForm.controller; + +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.apps.qrCodeForm.manager.QrCodeFormManager; +import com.seeyon.apps.qrCodeForm.util.LoginUtil; +import com.seeyon.apps.weixin.util.SecurityCertUtil; +import com.seeyon.apps.weixin.util.WeixinUtil; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.constants.ProductEditionEnum; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.common.flag.SysFlag; +import com.seeyon.ctp.common.formula.FormulaUtil; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.Inject; +import org.apache.commons.logging.Log; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class QrCodeFormController extends BaseController { + private static Log log = CtpLogFactory.getLog(QrCodeFormController.class); + @Inject + private QrCodeFormManager qrCodeFormManager; + @Inject + private OrgManager orgManager; + @Inject + private ICstConfigApi cstConfigApi; + + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) { + log.info("访问二维码生成页面!"); + ModelAndView mav = new ModelAndView("plugin/qrCodeForm/qrCodeFormIndex"); + Map map = new HashMap(); + map.put("bizType", "1"); + map.put("type", "owner-authed-biz"); + map.put("businessType", 0); + map.put("activeTab", "mineapp"); + List> bizList = qrCodeFormManager.listBusiness(map); + mav.addObject("bizList", bizList); + return mav; + } + + + public ModelAndView newMain(HttpServletRequest request, HttpServletResponse response) throws Exception { + ModelAndView mav = new ModelAndView("/wechat/collaborationContent"); + String html = ""; + String type = request.getParameter("type"); + if(Strings.isNotBlank(type)) { + html = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), "url" + type); + } + if(Strings.isBlank(html)) { + html = URLDecoder.decode(request.getParameter("html"), "UTF-8"); + } +// String loginName = qrCodeFormManager.getLoginMember(code); + /** + * 客开改动,固定登录名 + */ + //String loginName = (String) FormulaUtil.getVar("qrcode_loginname"); + String loginName = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.qrcode_loginname.name()); + log.info("登录认证获取loginName为:" + loginName); + if(Strings.isEmpty(loginName)){ +// mav.addObject("msg", "未获取到人员信息!")b; +// return mav; + loginName = "seeyon"; + } + + V3xOrgMember member = orgManager.getMemberByLoginName(loginName); + if(member == null){ + mav.addObject("msg", "人员不存在!"); + return mav; + } + SecurityCertUtil.login(request, loginName); + + Map map = LoginUtil.getToken(String.valueOf(member.getId()), member.getLoginName(), request, response); + String success = String.valueOf(map.get("success")); + if (success != null && "false".equals(success)) { +// String message = map.get("message").toString(); +// if (message.contains("User not found")) { +// mav.addObject("msg", ResourceUtil.getString("wxt.user.binding.miss") +// + "," + ResourceUtil.getString("wxt.user.name") + wechatUser.getXtUserName() + +// "," + ResourceUtil.getString("wxt.dingding.user.id") + wechatUser.getXtUserId()); +// } else { +// } + mav.addObject("msg", (String) map.get("message")); + return mav; + } + + String token = (String) map.get("id"); + String suffix = (String) SysFlag.mobileEditionSuffix.getFlag(); + String edition = ProductEditionEnum.getCurrentProductEditionEnum().getValue(); + String v5timestamp = WeixinUtil.getV5Timestamp(); + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name()); + if (Strings.isNotBlank(html)) { + String url = address + "" + SystemEnvironment.getContextPath() + "/H5/collaboration/index.html?token=" + token + "&edition=" + edition + "&suffix=" + suffix + "&v5timestamp=" + v5timestamp + "&loginName=" + member.getLoginName() + "&html=" + URLEncoder.encode(html, "UTF-8") + "&isAccount=&accountid=" + member.getOrgAccountId() + "&appid="; + return new ModelAndView("redirect:" + url); + } else { + return new ModelAndView("redirect:" + address + "" + SystemEnvironment.getContextPath() + "/H5/collaboration/index.html?token=" + token + "&edition=" + edition + "&suffix=" + suffix + "&v5timestamp=" + v5timestamp + "&loginName=" + member.getLoginName() + "&html=&isAccount=&accountid=" + member.getOrgAccountId()); + } + } + +} diff --git a/src/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java b/src/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java new file mode 100644 index 0000000..06f5211 --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManager.java @@ -0,0 +1,18 @@ +package com.seeyon.apps.qrCodeForm.manager; + +import com.seeyon.cap4.form.modules.business.FormAppBO; +import com.seeyon.ctp.util.annotation.AjaxAccess; + +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Map; + +public interface QrCodeFormManager { + @AjaxAccess + List> listBusiness(Map params); + + @AjaxAccess + List listFormApp(Map params); + + Map qrCodeFormUrl(Map params) throws UnsupportedEncodingException; +} diff --git a/src/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java b/src/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java new file mode 100644 index 0000000..d7e633e --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/manager/QrCodeFormManagerImpl.java @@ -0,0 +1,160 @@ +package com.seeyon.apps.qrCodeForm.manager; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.qrCodeForm.constant.Constants; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.apps.qrCodeForm.constant.SupportTypeEnum; +import com.seeyon.apps.weixin.manager.WechatUserManager; +import com.seeyon.apps.weixin.po.WechatUser; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.modules.business.BusinessSourceTypeManager; +import com.seeyon.cap4.form.modules.business.FormAppBO; +import com.seeyon.cap4.form.util.BizUtil; +import com.seeyon.cap4.form.util.Enums; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.util.FlipInfo; +import com.seeyon.ctp.util.HttpClientUtil; +import com.seeyon.ctp.util.ParamUtil; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.AjaxAccess; +import com.seeyon.ctp.util.annotation.Inject; +import org.apache.commons.logging.Log; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class QrCodeFormManagerImpl implements QrCodeFormManager { + + private static Log log = CtpLogFactory.getLog(QrCodeFormManagerImpl.class); + + @Inject + private FormApi4Cap4 formApi4Cap4; + @Inject + private OrgManager orgManager; + @Inject + private ICstConfigApi cstConfigApi; + @Inject + public WechatUserManager wechatUserManager; + + + /** + * 获取应用包数据 + * + * @param params + * @return + */ + @Override + @AjaxAccess + public List> listBusiness(Map params) { + List> listMap = new ArrayList>(); + try { + FlipInfo fi = new FlipInfo(1, -1); + Map resultMap = formApi4Cap4.listBusiness(fi, params); + if (Strings.isNotEmpty(fi.getData())) { + listMap = fi.getData(); + } + } catch (BusinessException e) { + e.printStackTrace(); + } + return listMap; + } + + /** + * 获取所有的应用下的模板 + * + * @param params + * @return + */ + @AjaxAccess + @Override + public List listFormApp(Map params) { + List returnList = new ArrayList<>(); + String type = ParamUtil.getString(params, "type"); + String bizConfigId = ParamUtil.getString(params, "bizConfigId"); + BusinessSourceTypeManager sourceType = BizUtil.getSourceTypeById(type); + Long bizConfigL = 0L; + if (Strings.isNotBlank(bizConfigId)) { + bizConfigL = Long.parseLong(bizConfigId); + } + try { + List allList = sourceType.getFormAppBOList(AppContext.getCurrentUser(), "", "", false, bizConfigL); + if (Strings.isNotEmpty(allList)) { + returnList = allList.stream().filter(a -> !"PARENT".equals(a.getSourctTypeName())).collect(Collectors.toList()); + } + } catch (BusinessException e) { + log.error("获取所有模板异常", e); + } + return returnList; + } + + @Override + @AjaxAccess + public Map qrCodeFormUrl(Map params) throws UnsupportedEncodingException { + Map result = new HashMap<>(); + Integer sourceType = ParamUtil.getInt(params, "sourceType"); + //String fillUrl = Constants._URLTPL.replaceAll("\\{corpId}", Constants._CORPID); + String fillUrl; + String _redirecturi = Constants._REDIRECTURI; + if (sourceType == Enums.SourceType.SOURCE_TYPE_FLOWTEMPLATE.getKey()) { + String templateId = ParamUtil.getString(params, "templateId"); + String tourl = Constants.FLOW_URL + templateId; + try { +// fillUrl = fillUrl + URLEncoder.encode( + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name());; + fillUrl = address + SystemEnvironment.getContextPath() + _redirecturi; + fillUrl += URLEncoder.encode(tourl, "UTF-8"); +// "http://172.16.30.123:8081"+ SystemEnvironment.getContextPath() + _redirecturi + tourl, "UTF-8" +// ) + Constants._FIXURL; + result.put("fillUrl", fillUrl); + return result; + } catch (UnsupportedEncodingException e) { + log.error("地址处理异常", e); + } + } else if (sourceType == Enums.SourceType.SOURCE_TYPE_INFOMANAGE.getKey()) { + String formType = ParamUtil.getString(params, "formType"); + String type = ParamUtil.getString(params, "type"); + String title = ParamUtil.getString(params, "title"); + String moduleId = ParamUtil.getString(params, "moduleId"); + String formTemplateId = ParamUtil.getString(params, "formTemplateId"); + String moduleType = ParamUtil.getString(params, "moduleType"); + String operateType = ParamUtil.getString(params, "operateType"); + String rightId = ParamUtil.getString(params, "rightId"); + //http://127.0.0.1/seeyon/qrCodeForm.do?method=newMain&html=/seeyon/m3/apps/v5/cap4/htmls/native/form/index.html?cusType=true&formTemplateId=-4624141853295951831&moduleId=-4624141853295951831&moduleType=42&formType=main&type=new&operateType=0&rightId=-1 + String tourl = Constants.UNFLOW_URL + "cusType=true" + + "&formTemplateId=" + formTemplateId + + "&moduleId=" + moduleId + + "&moduleType=" + moduleType + + "&formType=" + formType + + "&type=" + type + + "&rightId=" + rightId + + "&operateType=" + operateType; + try { +// fillUrl = fillUrl + URLEncoder.encode( + String address = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId(), QrCodeFormConstants.oaAddress.name()); + fillUrl = address + SystemEnvironment.getContextPath() + _redirecturi; + + fillUrl += URLEncoder.encode(tourl, "UTF-8"); +// "http://172.16.30.123:80"+ SystemEnvironment.getContextPath() + _redirecturi + tourl, "UTF-8" +// ) + Constants._FIXURL; + log.info("生成地址为:" + fillUrl); + result.put("fillUrl", fillUrl); + return result; + } catch (UnsupportedEncodingException e) { + log.error("地址处理异常", e); + } + } + return result; + } + +} diff --git a/src/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java b/src/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java new file mode 100644 index 0000000..2cc5c6c --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/sso/WechatQRHandShake.java @@ -0,0 +1,141 @@ +package com.seeyon.apps.qrCodeForm.sso; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.weixin.manager.WechatUserManager; +import com.seeyon.apps.weixin.po.WechatUser; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.log.CtpLogFactory; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.portal.sso.SSOLoginContext; +import com.seeyon.ctp.portal.sso.SSOLoginHandshakeAbstract; +import com.seeyon.ctp.util.HttpClientUtil; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.annotation.Inject; +import org.apache.commons.logging.Log; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * @author + * @title: WechatQRHandShake + * @description: 企业微信扫码发起单据 + * @date 2021/11/30 9:47 + */ +public class WechatQRHandShake extends SSOLoginHandshakeAbstract { + + private static final Log log = CtpLogFactory.getLog(WechatQRHandShake.class); + //企业微信appid + public static final String _CORPID = AppContext.getSystemProperty("qrCodeForm.corpid"); + //企业微信corpsecret + public static final String _corpsecret = AppContext.getSystemProperty("qrCodeForm.corpsecret"); + //验证方式 + public static final String handshakeType = AppContext.getSystemProperty("qrCodeForm.handshakeType"); + + @Inject + public WechatUserManager wechatUserManager; + @Autowired + private OrgManager orgManager; + @Override + public String handshake(String s) { + log.info("--进入企业微信回调接口!"); + HttpServletRequest request = AppContext.getRawRequest(); + String code =request.getParameter("code"); + + String corpid =_CORPID; + String corpsecret =_corpsecret; + + log.info("获取access接口url:https://qyapi.weixin.qq.com/cgi-bin/gettoken?"+"corpid="+corpid+"&corpsecret="+corpsecret); + String access = null; + try { + access = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret); + log.info("获取access接口返回:"+access); + if(access==null || access.equals("")){ + log.error("--未获取到access!"); + return null; + } + + JSONObject jsonObject = JSONObject.parseObject(access); + if(jsonObject==null){ + log.error("--未获取到access的jsonObject!"); + return null; + } + + String accessToken = (String)jsonObject.get("access_token"); + if(accessToken==null || accessToken.equals("")){ + log.error("--未获取到accessToken!"); + return null; + } + + log.info("--获取访问用户身份接口url:https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?"+"access_token=" + accessToken + "&code=" + code); + String user = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=" + accessToken + "&code=" + code); + log.info("--获取访问用户身份接口返回值:" + user); + if(user==null || user.equals("")){ + log.error("--未获取到user!"); + return null; + } + + JSONObject userJson = JSONObject.parseObject(user); + if(userJson==null){ + log.error("--未获取到user的jsonObject!"); + return null; + } + + String userid = userJson.getString("UserId"); + if(userid==null || userid.equals("")){ + log.error("--未获取到userid!"); + return null; + } + String Loginname = null; +// if("1".equals(handshakeType)){//使用标准模块的微信绑定 + if(false){ //企业微信、微协同绑定等信息存储在微协同云服务中,废弃逻辑 + WechatUser wechatUser =wechatUserManager.getWechatUserByUserIdAndcorpId(userid,corpid); + Loginname=wechatUser.getXtLoginName(); + }else {//自定义如何根据微信得用户id获取OA的用户 + log.info("--获取成员接口url:https://qyapi.weixin.qq.com/cgi-bin/user/get?"+"access_token=" + accessToken + "&userid=" + userid); + String member = HttpClientUtil.getContent("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&userid=" + userid); + log.info("获取成员接口返回值:" + member); + if(member==null || member.equals("")){ + log.error("--未获取到member!"); + return null; + } + + JSONObject memberJson = JSONObject.parseObject(member); + if(userJson==null){ + log.error("--未获取到member的jsonObject!"); + return null; + } + + String mobile = memberJson.getString("mobile"); + if(mobile==null || mobile.equals("")){ + log.error("--未获取到mobile!"); + return null; + } + List memberList=orgManager.getMemberListByMobile(mobile,null); + Loginname = memberList!=null?memberList.get(0).getLoginName():null; + } + if(Loginname ==null || Loginname.equals("")){ + log.error("--未获取到loginName!"); + return null; + } + return Loginname; + + } catch (Exception e) { + log.error("获取微信验证失败",e); + } + + return null; + } + + @Override + public void logoutNotify(String s) { + + } + + @Override + public String getToUrl(HttpServletRequest req, SSOLoginContext ssoLoginContext, String ticket) { + return req.getParameter("tourl"); + } +} diff --git a/src/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java b/src/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java new file mode 100644 index 0000000..2f4c7bc --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/util/InitQrCodeFormUitl.java @@ -0,0 +1,117 @@ +package com.seeyon.apps.qrCodeForm.util; + +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.privilege.bo.PrivMenuBO; +import com.seeyon.ctp.privilege.enums.PrivMenuTypeEnums; +import com.seeyon.ctp.privilege.manager.PrivilegeMenuManager; +import com.seeyon.ctp.privilege.po.PrivMenu; +import com.seeyon.ctp.util.DBAgent; +import com.seeyon.ctp.util.DateUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +public class InitQrCodeFormUitl { + private static Log log = LogFactory.getLog(InitQrCodeFormUitl.class); + private static PrivilegeMenuManager privilegeMenuManager = (PrivilegeMenuManager) AppContext.getBean("privilegeMenuManager"); + + public static void initMenu() { + try { + List listmenu = new ArrayList(); + + StringBuffer queryString = new StringBuffer(" FROM "); + queryString.append(PrivMenu.class.getSimpleName()).append(" where ") + .append(" path = '711' "); + + listmenu = DBAgent.find(queryString.toString()); + if (listmenu == null || listmenu.size() < 1) { + creatFileImportMenu();//创建菜单资源 + } + log.info("模板二维码菜单完成"); + + } catch (Exception e) { + log.error("模板二维码菜单失败", e); + } + + } + + /** + * 配置菜单 + * + * @return + * @throws BusinessException + */ + private static void creatFileImportMenu() { + try { + List menus = new ArrayList(); + PrivMenu configmenu = new PrivMenu(); + configmenu.setNewId(); + configmenu.setName("模板二维码"); + configmenu.setIcon("conferencearrangemen.png"); + configmenu.setSortid(1); + configmenu.setPath("711"); + configmenu.setExt1("0"); + configmenu.setExt2("1"); + configmenu.setExt3(""); + configmenu.setExt4(1); + configmenu.setExt7(configmenu.getName()); + configmenu.setExt8(""); + configmenu.setExt9(""); + configmenu.setExt10(""); + configmenu.setExt11(""); + configmenu.setExt12(0); + configmenu.setExt13(0); + configmenu.setExt14(0); + configmenu.setExt15(0); + configmenu.setExt16(0); + Date nowDate = new Date(); + configmenu.setCreatedate(nowDate); + configmenu.setUpdatedate(nowDate); + configmenu.setType(PrivMenuTypeEnums.systemPresetMenu.getKey()); + configmenu.setParentId(0L); + menus.add(configmenu); + + PrivMenu syncConfig = new PrivMenu();//二维码生成 + syncConfig.setNewId(); + syncConfig.setName("二维码生成"); + syncConfig.setIcon("b_menu_thridpartyspace.png"); + syncConfig.setTarget("mainfrm"); + syncConfig.setSortid(1); + syncConfig.setPath("711001"); + syncConfig.setExt1("0"); + syncConfig.setExt2("2"); + syncConfig.setExt3(""); + syncConfig.setExt4(1); + syncConfig.setExt7(syncConfig.getName()); + syncConfig.setExt8("0"); + syncConfig.setExt9("0"); + syncConfig.setExt10("0"); + syncConfig.setExt11("1"); + syncConfig.setExt19(2L); + syncConfig.setEnterResource(1); + syncConfig.setResourceNavurl("/qrCodeForm.do?method=index"); + syncConfig.setResourceCode("qrCodeForm"); + syncConfig.setResourceModuleid("none"); + syncConfig.setCreatedate(nowDate); + syncConfig.setUpdatedate(nowDate); + syncConfig.setUpdateuserid(1L); + syncConfig.setShow(true); + syncConfig.setControl(true); + syncConfig.setType(PrivMenuTypeEnums.systemPresetMenu.getKey()); + syncConfig.setParentId(configmenu.getId()); + menus.add(syncConfig); + + DBAgent.saveAll(menus); + } catch (Exception e) { + log.error("组织机构同步菜单异常", e); + } + } + +} diff --git a/src/com/seeyon/apps/qrCodeForm/util/LoginUtil.java b/src/com/seeyon/apps/qrCodeForm/util/LoginUtil.java new file mode 100644 index 0000000..7bd8612 --- /dev/null +++ b/src/com/seeyon/apps/qrCodeForm/util/LoginUtil.java @@ -0,0 +1,71 @@ +package com.seeyon.apps.qrCodeForm.util; + +import cn.hutool.cache.CacheUtil; +import cn.hutool.cache.impl.TimedCache; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.qrCodeForm.constant.QrCodeFormConstants; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.constants.Constants; +import com.seeyon.ctp.rest.util.TokenUtil; +import com.seeyon.ctp.services.UserToken; +import com.seeyon.ctp.util.Strings; +import com.seeyon.ctp.util.TextEncoder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; + +public class LoginUtil { + private static Log log = LogFactory.getLog(LoginUtil.class); + + private static ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + private static TimedCache tokenCache = CacheUtil.newTimedCache(14 * 60 * 1000); + + //rest信息 +// public static final String restName = AppContext.getSystemProperty("qrCodeForm.restName"); +// public static final String restPassword = AppContext.getSystemProperty("qrCodeForm.restPassword"); + + + /** + * 获取token + * + * @param loginName 登录名 + * @return + */ + public static Map getToken(String memberId, String loginName, HttpServletRequest request, HttpServletResponse response) { + Map map = new HashMap(); + String tokenId = tokenCache.get(memberId); + if(null != tokenId) { + map.put("id", tokenId); + map.put("success", true); + return map; + } + try { + ConfigVo config = cstConfigApi.getConfig(QrCodeFormConstants.getPluginId()); + String userName = config.getParamVal(QrCodeFormConstants.restId.name()); + String password = config.getParamVal(QrCodeFormConstants.restPwd.name()); + password = TextEncoder.decode(password); + Long userId = null; + if (Strings.isNotBlank(memberId)) { + userId = Long.parseLong(memberId); + } + UserToken token = TokenUtil._getToken(userName, password, userId, loginName, null, Constants.login_useragent_from.wechat.name(), request, response); + if (token != null) { + map.put("success", true); + map.put("id", token.getId()); + tokenCache.put(memberId, token.getId()); + } + } catch (Exception e) { + log.error("", e); + map.put("success", false); + map.put("message", e.getMessage()); + } + return map; + } + +} diff --git a/src/com/seeyon/apps/src_dingding/ctrl/StartTaskController.java b/src/com/seeyon/apps/src_dingding/ctrl/StartTaskController.java new file mode 100644 index 0000000..fa4198e --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/ctrl/StartTaskController.java @@ -0,0 +1,137 @@ +package com.seeyon.apps.src_dingding.ctrl; + +import java.io.IOException; +import java.sql.SQLException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.ModelAndView; + +import com.seeyon.apps.src_dingding.service.DingdingService; +import com.seeyon.apps.src_dingding.task.DingdingTask; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.controller.BaseController; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.quartz.QuartzHolder; +import com.seeyon.ctp.util.annotation.NeedlessCheckLogin; +import com.taobao.api.ApiException; + +/** + * Description + *
定时任务控制器
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class StartTaskController extends BaseController { + + + private DingdingService dingdingService; + + public DingdingService getDingdingService() { + if (dingdingService == null) { + dingdingService = (DingdingService) AppContext.getBean("dingdingService"); + } + return dingdingService; } + + public void setDingdingService(DingdingService dingdingService) { + this.dingdingService = dingdingService; + } + + + @NeedlessCheckLogin + public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws IOException, RuntimeException, ApiException, BusinessException, SQLException, InterruptedException { +// 用于执行定时任务的开启和关闭 + String opera = request.getParameter("task"); + if("start".equals(opera)) { + String time; + try { +// time = ConfigKit.getTaskTime(); +// time = automaticService.getTaskTime(); + time = request.getParameter("time"); + } catch (Exception e) { + super.rendJavaScript(response, "alert('获取配置出错');"); + return null; + } + if(null == time) { + super.rendJavaScript(response, "alert('请正確配置请求地址中的time参数,如果定时执行,启用D-开头,如D-03,15表示每天三点十五执行,如果间隔时间执行,请用I-开头,例如I-03,00表示每三个小时执行一次!');"); + return null; + } else if(time.startsWith("D-")) { + // D-开头,每天执行任务 + String[] arr = time.split("-"); + try { + Integer[] itime = getTime(arr); + DingdingTask.registerSyncTask(false, itime[0], itime[1]); + super.rendJavaScript(response, "alert('任务注册成功,每天" + itime[0] + "点," + itime[1] + "分执行');"); + return null; + } catch (Exception e) { + super.rendJavaScript(response, "alert('" + e.getMessage() + "');"); + return null; + } + } else if(time.startsWith("I-")) { + // i-开头,是间隔时间执行 + String[] arr = time.split("-"); + try { + Integer[] itime = getTime(arr); + DingdingTask.registerSyncTask(true, itime[0], itime[1]); + super.rendJavaScript(response, "alert('任务注册成功,间隔" + itime[0] + "小时," + itime[1] + "分钟执行');"); + return null; + } catch (Exception e) { + super.rendJavaScript(response, "alert('" + e.getMessage() + "');"); + return null; + } + } else { + super.rendJavaScript(response, "alert('请正確配置链接地址中的time参数,如果定时执行,启用D-开头,如D-03,15表示每天三点十五执行,如果间隔时间执行,请用I-开头,例如I-03,00表示每三个小时执行一次!');"); + return null; + } + } else if("stop".equals(opera)){ + QuartzHolder.deleteQuartzJob(DingdingTask.jobName); + super.rendJavaScript(response, "alert('定时任务已经终止!');"); + return null; + } else if("run".equals(opera)) { + try{ + String datestr = request.getParameter("date"); + String ty = request.getParameter("ty"); + String msg = ""; + if("dk".equals(ty)){ + msg = getDingdingService().dingdingclockin(datestr); + + }else if ("kq".equals(ty)){ + msg = getDingdingService().setWorkAttendance(datestr); +// getDingdingService().setWorkAttendance1(); + }else{ + msg = "参数输入错误请校验填写ty参数,date参数,进行数据进行数据调试"; + } + super.rendJavaScript(response, msg); + }catch (Exception e) { + super.rendJavaScript(response, "alert('定时任务执行失败!"+e.getMessage()+"');"); + return null; + } + return null; + } else { + super.rendJavaScript(response, "alert('参数有误,请联系开发人员!');"); + return null; + } + } + + private Integer[] getTime(String[] arr) throws Exception { + String time = arr[1]; + arr = time.split(","); + if(arr.length != 2) { + throw new Exception("小时和分钟请用逗号隔开"); + } + int our = Integer.valueOf(arr[0]); + int minute = Integer.valueOf(arr[1]); + if(our < 0 || our >= 24) { + throw new Exception("小时数必须在0~24之间"); + } + if(minute < 0 || minute >= 60) { + throw new Exception("分钟数必须在0~60之间"); + } + return new Integer[] {our, minute}; + } + +// public void setPushZcService(PushZcService pushZcService) { +// this.pushZcService = pushZcService; +// } + +} diff --git a/src/com/seeyon/apps/src_dingding/dao/DingdingDaoImpl.java b/src/com/seeyon/apps/src_dingding/dao/DingdingDaoImpl.java new file mode 100644 index 0000000..778bf37 --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/dao/DingdingDaoImpl.java @@ -0,0 +1,729 @@ +package com.seeyon.apps.src_dingding.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; + +import com.seeyon.apps.src_dingding.service.DingdingService; +import com.seeyon.apps.src_dingding.vo.CheckOnWorkAttendanceVo; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.seeyon.apps.src_dingding.util.BaseUtil; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.util.JDBCAgent; +import com.seeyon.ctp.util.UUIDLong; + +public class DingdingDaoImpl extends BaseUtil implements IDingdingDao{ + + private final static Log log = LogFactory.getLog(DingdingDaoImpl.class); + + private String adddept = "insert into SRC_DINGDING_OA_DEPT values (?,?,?,?,?)"; + private String updateWorkAttendance = "update SRC_CHECK_ON_WORK_ATTENDANCE set SHANGBAN1 = ? ,XIABAN1 = ? ,SHANGBAN2 = ? , XIABAN2 = ? ,STATE = ? where id = ?"; + private String addmember = "insert into SRC_DINGDING_OA_MEMBER values (?,?,?,?,?)"; + private String addCheckOnWorkAttendance = "insert into SRC_CHECK_ON_WORK_ATTENDANCE VALUES"; + private String getdeptBysuperDeptId = "select * from SRC_DINGDING_OA_DEPT where DINGDINGDEPTID = '${dingdingdeptid}'"; + private String getdeptByPathName = "select NAME,ID from ORG_UNIT where PATH like ? and NAME = ? AND IS_INTERNAL = 1 AND IS_ENABLE = 1 AND IS_DELETED = 0"; + private String getDingdingOaDept = "select * from SRC_DINGDING_OA_DEPT "; + private String getDingdingOaMember = "select * from SRC_DINGDING_OA_MEMBER "; + private String getDepartmentById = "select ID,NAME,PATH from ORG_UNIT WHERE ID = ? AND IS_INTERNAL = 1 AND IS_ENABLE = 1 AND IS_DELETED = 0"; + private String getdeptsizeBydingdingid = "select count(id) as DINGDINGSIZE from src_dingding_oa_dept where dingdingdeptid = '${dingdingdeptid}'"; + private String getmembersizeBydingdingid = "select count(id) as DINGDINGSIZE from src_dingding_oa_member where dingdingmemberid = '${dingdingmemberid}'"; + private String getClockInNumBymember = "select COUNT(field0001) as num from formmain_10430 where field0001 = ? and field0006>=to_date(?,'YYYY-MM-DD') group by field0001"; + private String getClockInBymember = "select * from formson_10431 tb1 left join formmain_10430 tb2 on tb1.formmain_id = tb2.id where tb2.field0001 = ? and tb2.field0006=to_date(?,'YYYY-MM-DD')"; + private String getLeave = "select * from formmain_10368 where field0003 = ? and field0010 >= to_date(?,'YYYY-MM-DD') and field0009 <= TO_DATE(?,'YYYY-MM-DD')"; + private String getEvections = "select * from formmain_10367 where field0003 = ? and field0011 >= to_date(?,'YYYY-MM-DD') and field0010 <= to_date(?,'YYYY-MM-DD')"; + private String getWorkAttendanceByDate = "select * from SRC_CHECK_ON_WORK_ATTENDANCE where MEMBERID = ? and CHECKONWORKATTENDANCEDATE >= to_date(?,'YYYY-MM-DD HH24:MI:SS') and CHECKONWORKATTENDANCEDATE <= to_date(?,'YYYY-MM-DD HH24:MI:SS')"; +// private String getWorkAttendanceByDate = "select * from SRC_CHECK_ON_WORK_ATTENDANCE where MEMBERID = ? and CHECKONWORKATTENDANCEDATE >= ? and CHECKONWORKATTENDANCEDATE <= ?"; + private String getAdjustLeave = "select * from formmain_10363 where field0007 = ? and field0013 >= to_date(?,'YYYY-MM-DD') and field0001 <= to_date(?,'YYYY-MM-DD')"; + private String getOvertime = "select * from formson_10366 where field0033 = ? and field0030 >= to_date(?,'YYYY-MM-DD') and field0029 <= to_date(?,'YYYY-MM-DD')"; + private String getMakeCard = "select * from formmain_10369 where field0007 = ? and field0001 >= to_date(?,'YYYY-MM-DD') and field0001 <= to_date(?,'YYYY-MM-DD')"; + private String getGroupName = "select field0002 from formmain_10430 where field0001 = ? and field0002 is not null and rownum = 1"; + + + public int adddept(Map map) { + int i = 0; + try { + long id = UUIDLong.longUUID(); + String sql = adddept; + Object[] params = null; + params = new Object[] { id,map.get("oadeptid"),map.get("oadeptname"),map.get("dingdingdeptid"),map.get("dingdingdeptname") }; + i = super.executeUpdate(sql.toString(), params); + } finally { + super.close(); + } + return i; + } + + public Map getdeptBysuperDeptId(String deptid) { + Map map = new HashMap(); + String sql = getdeptBysuperDeptId; + sql = sql.replace("${dingdingdeptid}", deptid); + System.out.println(sql); + Object[] params = new Object[] {}; + ResultSet rs = super.executeQuery(sql, params); + try { + while (rs.next()) { + map.put("oadeptid", rs.getString("oadeptid")); + map.put("oadeptname", rs.getString("oadeptname")); + map.put("dingdingdeptid", rs.getString("dingdingdeptid")); + map.put("dingdingdeptname", rs.getString("dingdingdeptname")); + System.out.println(map); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + super.close(); + } + return map; + + } + + + public Map getdeptByPathName(String path,String name) throws BusinessException, SQLException { + Map ret = new HashMap(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getdeptByPathName); + List p = new ArrayList(); + p.add(path); + p.add(name); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + System.out.println("getdeptByPathName:"+list.size()); + if(list.size()==0) { + return null; + } + for (Map map : list) { + ret.put("name", map.get("name")); + ret.put("id", map.get("id")); + System.out.println(ret); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + @Override + public List> getDingdingOaDept() throws BusinessException, SQLException { + List> ret = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getDingdingOaDept); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + System.out.println(map); + Map m = new HashMap(); + m.put("dingdingdeptid", map.get("dingdingdeptid")); + m.put("dingdingdeptname", map.get("dingdingdeptname")); + m.put("oadeptid", map.get("oadeptid")); + m.put("oadeptname", map.get("oadeptname")); + System.out.println(m); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + @Override + public Map getDepartmentById(Long deptid) throws BusinessException, SQLException { + JDBCAgent agent = new JDBCAgent(); + Map ret = new HashMap(); + try { + StringBuilder sql = new StringBuilder(getDepartmentById); + List p = new ArrayList(); + p.add(deptid); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + System.out.println(map); + ret.put("id", map.get("id")); + ret.put("name", map.get("name")); + ret.put("path", map.get("path")); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + @Override + public int addmember(Map map) { + int i = 0; + try { + long id = UUIDLong.longUUID(); + String sql = addmember; + Object[] params = null; + params = new Object[] { id,map.get("oamemberid"),map.get("oamembername"),map.get("dingdingmemberid"),map.get("dingdingmembername") }; + i = super.executeUpdate(sql.toString(), params); + } finally { + super.close(); + } + return i; + } + + @Override + public boolean getdeptsizeBydingdingid(String dingdingdeptid) { + boolean boo = false; + String sql = getdeptsizeBydingdingid; + sql = sql.replace("${dingdingdeptid}", dingdingdeptid); + System.out.println(sql); + Object[] params = new Object[] {}; + ResultSet rs = super.executeQuery(sql, params); + try { + while (rs.next()) { + String dingdingsize = rs.getString("DINGDINGSIZE"); + int size = Integer.parseInt(dingdingsize); + if(size>0) { + boo = true; + } + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + super.close(); + } + return boo; + } + + + @Override + public boolean getmembersizeBydingdingid(String dingdingmemberid) { + boolean boo = false; + int ii = 0; + String sql = getmembersizeBydingdingid; + sql = sql.replace("${dingdingmemberid}", dingdingmemberid); + Object[] params = new Object[] {}; + ResultSet rs = super.executeQuery(sql, params); + try { + while (rs.next()) { + String dingdingsize = rs.getString("DINGDINGSIZE"); + int size = Integer.parseInt(dingdingsize); + ii = size; + if(size>0) { + boo = true; + } + } + log.info(sql+boo+ii); + } catch (SQLException e) { + e.printStackTrace(); + }finally { + super.close(); + } + return boo; + } + + @Override + public int getClockInNumBymember(String date, String memberId) { + int in = 0; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getClockInNumBymember); + List p = new ArrayList(); + p.add(memberId); + p.add(date); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + in = Integer.parseInt(map.get("num").toString()); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return in; + } + + @Override + public List> getClockInBymember(String date, String memberId) { + List> ret = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getClockInBymember); + List p = new ArrayList(); + p.add(memberId); + p.add(date); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + System.out.println(map); + Map m = new HashMap(); + m.put("clockInDate", map.get("field0008").toString()); + m.put("referenceDate", map.get("field0009").toString()); + m.put("groupName", map.get("field0002").toString()); + m.put("state", map.get("field0010")); + m.put("type", map.get("field0014")); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + @Override + public int addCheckOnWorkAttendance(CheckOnWorkAttendanceVo checkOnWorkAttendanceVo) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + System.out.println("开始保存考勤数据"); + int i = 0 ; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(addCheckOnWorkAttendance); + Object[] params = null; + sql.append(" ('"+checkOnWorkAttendanceVo.getId()+"','"+checkOnWorkAttendanceVo.getMemberId()+"'"); + if(checkOnWorkAttendanceVo.getCheckOnWorkAttendanceDate() == null){ + sql.append(",''"); + }else{ + sql.append(",TO_DATE('"+simpleDateFormat.format(checkOnWorkAttendanceVo.getCheckOnWorkAttendanceDate())+"','YYYY-MM-DD HH24:MI:SS')"); + } +// 上班1 + if(checkOnWorkAttendanceVo.getShangbanDate1() == null){ + sql.append(",''"); + }else{ + sql.append(",TO_DATE('"+simpleDateFormat.format(checkOnWorkAttendanceVo.getShangbanDate1())+"','YYYY-MM-DD HH24:MI:SS')"); + } + if(checkOnWorkAttendanceVo.getShangban1().length()==0){ + sql.append(",''"); + }else{ + sql.append(",'"+checkOnWorkAttendanceVo.getShangban1()+"'"); + } + +// 下班1 + if(checkOnWorkAttendanceVo.getXiabanDate1() == null){ + sql.append(",''"); + }else{ + sql.append(",TO_DATE('"+simpleDateFormat.format(checkOnWorkAttendanceVo.getXiabanDate1())+"','YYYY-MM-DD HH24:MI:SS')"); + } + if(checkOnWorkAttendanceVo.getXiaban1().length()==0){ + sql.append(",''"); + }else{ + sql.append(",'"+checkOnWorkAttendanceVo.getXiaban1()+"'"); + } + +// 上班2 + if(checkOnWorkAttendanceVo.getShangbanDate2() == null){ + sql.append(",''"); + }else{ + sql.append(",TO_DATE('"+simpleDateFormat.format(checkOnWorkAttendanceVo.getShangbanDate2())+"','YYYY-MM-DD HH24:MI:SS')"); + } + if(checkOnWorkAttendanceVo.getShangban2().length()==0){ + sql.append(",''"); + }else{ + sql.append(",'"+checkOnWorkAttendanceVo.getShangban2()+"'"); + } + +// 下班2 + if(checkOnWorkAttendanceVo.getXiabanDate2() == null){ + sql.append(",''"); + }else{ + sql.append(",TO_DATE('"+simpleDateFormat.format(checkOnWorkAttendanceVo.getXiabanDate2())+"','YYYY-MM-DD HH24:MI:SS')"); + } + if(checkOnWorkAttendanceVo.getXiaban2().length()==0){ + sql.append(",''"); + }else{ + sql.append(",'"+checkOnWorkAttendanceVo.getXiaban2()+"'"); + } + + sql.append(",'"+checkOnWorkAttendanceVo.getState()+"'"); + sql.append(",'"+checkOnWorkAttendanceVo.getGroupName()+"')"); + System.out.println("打印参数"+sql.toString()); + List p = new ArrayList(); + i=agent.execute(sql.toString(), p); + } catch (BusinessException e) { + e.printStackTrace(); + System.out.println(e); + } catch (SQLException e) { + e.printStackTrace(); + System.out.println(e); + } finally { + if (agent != null) { + agent.close(); + } + } + + System.out.println("创建数据条数"+i); + return i; + } + + @Override + public List> getLeave( String memberId,String startDate, String endDate) { + List> ret = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getLeave); + List p = new ArrayList(); + p.add(memberId); + p.add(startDate); + p.add(endDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + System.out.println(map); + Map m = new HashMap(); + m.put("member", map.get("field0003")); + m.put("type", map.get("field0031")); + m.put("startDateStr", map.get("field0009")); + m.put("endDateStr", map.get("field0010")); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + + @Override + public List getWorkAttendanceByDate(String memberId, String startDate, String endDate) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + log.info("查询的参数"+memberId+startDate+endDate); + List ret = new ArrayList(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getWorkAttendanceByDate); + List p = new ArrayList(); + p.add(memberId); + p.add(startDate); + p.add(endDate); + agent.execute(sql.toString(), p); + log.info("执行SQL"); + List list = agent.resultSetToList(); + log.info(list.size()); + for (Map map : list) { + log.info(map); + log.info(map.get("shangbandate1")!= null); + CheckOnWorkAttendanceVo m = new CheckOnWorkAttendanceVo(); + m.setId(Long.parseLong( map.get("id").toString())); + m.setMemberId(Long.parseLong(map.get("memberid").toString())); + log.info(sdf.parse(map.get("checkonworkattendancedate").toString())); + m.setCheckOnWorkAttendanceDate(sdf.parse(map.get("checkonworkattendancedate").toString())); + log.info("shangban1"+map.get("shangbandate1")); + if(map.get("shangbandate1") != null){ + m.setShangbanDate1(sdf.parse(map.get("shangbandate1").toString())); + m.setShangban1(map.get("shangban1").toString()); + }else{ + m.setShangbanDate1(null); + m.setShangban1("未打卡"); + } + log.info("xiaban1"+map.get("xiabandate1")); + if(map.get("xiabandate1") != null){ + m.setXiabanDate1(sdf.parse(map.get("xiabandate1").toString())); + m.setXiaban1(map.get("xiaban1").toString()); + }else{ + m.setXiabanDate1(null); + m.setXiaban1("未打卡"); + } + log.info("shangban2"+map.get("shangbandate2")); + if(map.get("shangbandate2") != null){ + m.setShangbanDate2(sdf.parse(map.get("shangbandate2").toString())); + m.setShangban2(map.get("shangban2").toString()); + }else{ + m.setShangbanDate2(null); + m.setShangban2("未打卡"); + } + log.info("xiaban2"+map.get("xiabandate2")); + if(map.get("xiabandate2") != null){ + m.setXiabanDate2(sdf.parse(map.get("xiabandate2").toString())); + m.setXiaban2(map.get("xiaban2").toString()); + }else{ + m.setXiabanDate2(null); + m.setXiaban2("未打卡"); + } + log.info(map.get("state")); + m.setState(map.get("state").toString()); + log.info(m.toString()); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + } + log.info(ret); + return ret; + } + + @Override + public List> getEvections(String memberId, String startDate, String endDate) { + List> ret = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getEvections); + List p = new ArrayList(); + p.add(memberId); + p.add(startDate); + p.add(endDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + System.out.println(list.size()); + for (Map map : list) { + System.out.println(map); + Map m = new HashMap(); + m.put("member", map.get("field0003")); + m.put("type", "出差"); + m.put("startDateStr", map.get("field0010")); + m.put("endDateStr", map.get("field0011")); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + if (agent != null) { + agent.close(); + } + return ret; + } + } + + @Override + public List> getAdjustLeave(String memberId, String startDate, String endDate) { + List> ret = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getAdjustLeave); + List p = new ArrayList(); + p.add(memberId); + p.add(startDate); + p.add(endDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + Map m = new HashMap(); + m.put("member", map.get("field0007")); + m.put("type", "调休"); + m.put("startDateStr", map.get("field0001")); + m.put("endDateStr", map.get("field0013")); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + @Override + public List> getOvertime(String memberId, String startDate, String endDate) { + List> ret = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getOvertime); + List p = new ArrayList(); + p.add(memberId); + p.add(startDate); + p.add(endDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + log.info("加班查询数据: "+map); + Map m = new HashMap(); + m.put("member", map.get("field0033")); + m.put("type", "加班"+map.get("field0031")+"小时" ); + m.put("startDateStr", map.get("field0029")); + m.put("endDateStr", map.get("field0030")); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + @Override + public List> getMakeCard(String memberId, String startDate, String endDate) { + List> ret = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getMakeCard); + List p = new ArrayList(); + p.add(memberId); + p.add(startDate); + p.add(endDate); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + System.out.println(map); + Map m = new HashMap(); + m.put("member", map.get("field0007")); + m.put("type", "补卡" ); + m.put("makeCardDateStr", map.get("field0001")); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + @Override + public String getGroupName(String memberId) { + String ret = ""; + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getGroupName); + List p = new ArrayList(); + p.add(memberId); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + ret = map.get("field0002").toString(); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + + @Override + public int updateWorkAttendance(CheckOnWorkAttendanceVo checkOnWorkAttendanceVo) { + int i = 0; + try { + String sql = updateWorkAttendance; + Object[] params = null; + params = new Object[] { checkOnWorkAttendanceVo.getShangban1(), + checkOnWorkAttendanceVo.getXiaban1(), + checkOnWorkAttendanceVo.getShangban2(), + checkOnWorkAttendanceVo.getXiaban2(), + checkOnWorkAttendanceVo.getState(),checkOnWorkAttendanceVo.getId() }; + i = super.executeUpdate(sql.toString(), params); + } finally { + super.close(); + } + return i; + } + + @Override + public List> getDingdingOaMember() throws BusinessException, SQLException { + List> ret = new ArrayList>(); + JDBCAgent agent = new JDBCAgent(); + try { + StringBuilder sql = new StringBuilder(getDingdingOaMember); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + for (Map map : list) { + System.out.println(map); + Map m = new HashMap(); + m.put("dingdingmemberid", map.get("dingdingmemberid")); + m.put("dingdingmembername", map.get("dingdingmembername")); + m.put("oamemberid", map.get("oamemberid")); + m.put("oamembername", map.get("oamembername")); + ret.add(m); + } + } catch (BusinessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return ret; + } + +} diff --git a/src/com/seeyon/apps/src_dingding/dao/IDingdingDao.java b/src/com/seeyon/apps/src_dingding/dao/IDingdingDao.java new file mode 100644 index 0000000..44f1cb1 --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/dao/IDingdingDao.java @@ -0,0 +1,183 @@ +package com.seeyon.apps.src_dingding.dao; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; + +import com.seeyon.apps.src_dingding.vo.CheckOnWorkAttendanceVo; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgMember; + +public interface IDingdingDao { + + /** + * 添加部门对照表信息 + * @param map + * @return + */ + public int adddept(Map map); + + + /** + * 添加人员对照表信息 + * @param map + * @return + */ + public int addmember(Map map); + + /** + * 根据部门ID查询部门对照表中的部门信息 + * @param deptid + * @return + */ + public Map getdeptBysuperDeptId(String deptid); + + /** + * 通过部门路径和部门名称查询OA系统中部门信息 + * @param path + * @param name + * @return + * @throws BusinessException + * @throws SQLException + */ + public Map getdeptByPathName(String path,String name)throws BusinessException, SQLException; + + /** + * 查询部门对照表中所有的部门信息 + * @return + * @throws BusinessException + * @throws SQLException + */ + public List> getDingdingOaDept()throws BusinessException, SQLException; + + /** + * 查询部门对照表中所有的部门信息 + * @return + * @throws BusinessException + * @throws SQLException + */ + public List> getDingdingOaMember()throws BusinessException, SQLException; + + /** + * 根据部门ID查询OA系统中的部门信息 + * @param deptid + * @return + * @throws BusinessException + * @throws SQLException + */ + public Map getDepartmentById(Long deptid)throws BusinessException, SQLException; + + /** + * 查询当前部门信息是否在部门对照表中存在 + * @param dingdingdeptid + * @return + */ + public boolean getdeptsizeBydingdingid(String dingdingdeptid); + + /** + * 查询当前人员信息是否在人员对照表中存在 + * @param dingdingmemberid + * @return + */ + public boolean getmembersizeBydingdingid(String dingdingmemberid); + + /** + * 获取指定人员近一月的打卡情况 + * @param date('yyyy-MM-dd') + * @param memberId + * @return + */ + public int getClockInNumBymember(String date,String memberId); + + /** + * 获取指定人员前一日打卡情况 + * @param date('yyyy-MM-dd') + * @param memberId + * @return + */ + public List> getClockInBymember(String date,String memberId); + + /** + * 将封装的打卡信息保存到考勤表中 + * @param checkOnWorkAttendanceVo 考勤数据对象 + * @return + */ + public int addCheckOnWorkAttendance(CheckOnWorkAttendanceVo checkOnWorkAttendanceVo); + + + /** + * 修改考勤表中的数据 + * @param checkOnWorkAttendanceVo 考勤数据对象 + * @return + */ + public int updateWorkAttendance(CheckOnWorkAttendanceVo checkOnWorkAttendanceVo); + + + /** + * 查询规定时间之内的请假单据 + * @param memberId 人员ID + * @param startDate 查询开始时间 + * @param endDate 查询结束时间 + * @return + */ + public List> getLeave(String memberId, String startDate,String endDate); + + + /** + * 查询指定时间内的考勤情况 + * @param memberId 人员ID + * @param startDate 查询开始时间 + * @param endDate 查询结束时间 + * @return + */ + + public List getWorkAttendanceByDate(String memberId, String startDate,String endDate); + + + /** + * 查询规定时间之内的出差单据 + * @param memberId 人员ID + * @param startDate 查询开始时间 + * @param endDate 查询结束时间 + * @return + */ + public List> getEvections(String memberId, String startDate,String endDate); + + + + /** + * 查询规定时间之内的调休单据 + * @param memberId 人员ID + * @param startDate 查询开始时间 + * @param endDate 查询结束时间 + * @return + */ + public List> getAdjustLeave(String memberId, String startDate,String endDate); + + + /** + * 查询规定时间之内的加班单据 + * @param memberId 人员ID + * @param startDate 查询开始时间 + * @param endDate 查询结束时间 + * @return + */ + public List> getOvertime(String memberId, String startDate,String endDate); + + /** + * 查询规定时间之内的补卡单据 + * @param memberId 人员ID + * @param startDate 查询开始时间 + * @param endDate 查询结束时间 + * @return + */ + public List> getMakeCard(String memberId, String startDate,String endDate); + + /** + * 查询规定时间之内的补卡单据 + * @param memberId 人员ID + * @return + */ + public String getGroupName(String memberId); + +} diff --git a/src/com/seeyon/apps/src_dingding/kit/A8FolderKit.java b/src/com/seeyon/apps/src_dingding/kit/A8FolderKit.java new file mode 100644 index 0000000..9138fd5 --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/kit/A8FolderKit.java @@ -0,0 +1,26 @@ +package com.seeyon.apps.src_dingding.kit; + +import com.seeyon.ctp.common.SystemEnvironment; + +/** + * Description + *
获取A8产品下面的文件夹路径
+ * Copyright(c) Beijing Seeyon Software Co.,LTD + */ +public class A8FolderKit { + + private static String SH_PROP = ""; + + /** + * Description: + *
获取到A8的安装应用目录  seeyon
+ * @return + */ + public static String getPropFile() { + if("".equals(SH_PROP)) { + SH_PROP = SystemEnvironment.getApplicationFolder() + "/WEB-INF/cfgHome/plugin/src_dingding/dingding.properties"; + } + return SH_PROP; + } + +} diff --git a/src/com/seeyon/apps/src_dingding/kit/PropKit.java b/src/com/seeyon/apps/src_dingding/kit/PropKit.java new file mode 100644 index 0000000..c491bba --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/kit/PropKit.java @@ -0,0 +1,70 @@ +package com.seeyon.apps.src_dingding.kit; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 读取参数 + */ + +public class PropKit { + + private static long lastModify; + + private static ConcurrentHashMap props; + + public static final String PROFILE = "profile"; + + public static final String JDBCDRIVER = "jdbc_driver"; + public static final String JDBCURL = "jdbc_url"; + public static final String JDBCUSER = "jdbc_user"; + public static final String JDBCPASSWORD = "jdbc_password"; + + public static final String PROD_JDBCDRIVER = "prod.jdbc_driver"; + public static final String PROD_JDBCURL = "prod.jdbc_url"; + public static final String PROD_JDBCUSER = "prod.jdbc_user"; + public static final String PROD_JDBCPASSWORD = "prod.jdbc_password"; + + /** + * @return + * @throws IOException + * @throws FileNotFoundException + */ + public static String getProp(String key) throws FileNotFoundException, IOException { + File f = new File(A8FolderKit.getPropFile()); + if(null == props) { + props = new ConcurrentHashMap(); + } + if(f.lastModified() != lastModify) { + /** + * huangzhengguo + * 2022-10-18 + */ + Properties prop = new Properties(); + prop.load(new FileInputStream(f)); +// Properties prop = PropertiesUtil.getFromFile((CtpLocalFile) f); + + /** + * end + */ + String profile = prop.getProperty(PROFILE); + if("prod".equals(profile)) { + props.put(JDBCDRIVER, prop.getProperty(PROD_JDBCDRIVER)); + props.put(JDBCURL, prop.getProperty(PROD_JDBCURL)); + props.put(JDBCUSER, prop.getProperty(PROD_JDBCUSER)); + props.put(JDBCPASSWORD, prop.getProperty(PROD_JDBCPASSWORD)); + } else { + props.put(JDBCDRIVER, prop.getProperty(PROD_JDBCDRIVER)); + props.put(JDBCURL, prop.getProperty(PROD_JDBCURL)); + props.put(JDBCUSER, prop.getProperty(PROD_JDBCUSER)); + props.put(JDBCPASSWORD, prop.getProperty(PROD_JDBCPASSWORD)); + } + } + return props.get(key); + } + +} diff --git a/src/com/seeyon/apps/src_dingding/service/DingdingService.java b/src/com/seeyon/apps/src_dingding/service/DingdingService.java new file mode 100644 index 0000000..8569f88 --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/service/DingdingService.java @@ -0,0 +1,1407 @@ +package com.seeyon.apps.src_dingding.service; + +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.seeyon.apps.src_dingding.vo.CheckOnWorkAttendanceVo; +import org.apache.commons.collections.map.HashedMap; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_dingding.dao.IDingdingDao; +import com.seeyon.apps.src_dingding.util.DingtalkUtil; +import com.seeyon.apps.src_dingding.util.FormExportUtil; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgAccount; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.ctp.services.ServiceException; +import com.seeyon.v3x.services.form.FormFactory; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import com.taobao.api.ApiException; +import www.seeyon.com.utils.StringUtil; +import www.seeyon.com.utils.UUIDUtil; + +public class DingdingService { + + private final static Log log = LogFactory.getLog(DingdingService.class); + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private IDingdingDao dingdingDao; + + public void setDingdingDao(IDingdingDao dingdingDao) { + this.dingdingDao = dingdingDao; + } + + public IDingdingDao getDingdingDao() { + if (dingdingDao == null) { + dingdingDao = (IDingdingDao) AppContext.getBean("dingdingDao"); + } + return dingdingDao; + } + + private OrgManager orgManager; + + public void setOrgManager(OrgManager orgManager) { + this.orgManager = orgManager; + } + + public OrgManager getOrgManager() { + if (orgManager == null) { + orgManager = (OrgManager) AppContext.getBean("orgManager"); + } + return orgManager; + } + + private FormFactory formFactory; + + public void setFormFactory(FormFactory formFactory) { + this.formFactory = formFactory; + } + + public FormFactory getFormFactory() { + if (formFactory == null) { + formFactory = (FormFactory) AppContext.getBean("formFactory"); + } + return formFactory; + } + +// public String dingdingclockin() { +// return "dingdingclockin"; +// } + + public String dingdingdept() throws RuntimeException, ApiException, BusinessException, SQLException, InterruptedException { +// 人员全路径名称是是唯一值,通过获取单位-部门-名称确定人员唯一性 +// 记录对应信息 单位-部门=部门ID 的map数据,循环编辑之后通过 部门ID 查询人员信息 +// 查询到的人员信息在根据单位-部门信息对应到OA系统中的人员信息上 +// 创建参数用于保存上级部门ID + List deptids = new ArrayList(); +// 创建参数用于保存同级部门ID + List newdeptids = new ArrayList(); +// 初次循环使用集团层级 + deptids.add("120474537"); + JSONObject deptparam = new JSONObject(); + do { + log.info("开始循环。。。"); + for(int in = 0 ; in < deptids.size();in++) { +// 设置查询钉钉的参数 + deptparam.put("dept_id", deptids.get(in)); + deptparam.put("language", "zh_CN"); + System.out.println("创建参数:"+deptparam.toString()); + log.info("创建参数:"+deptparam.toString()); + DingtalkUtil dingtalkUtil = new DingtalkUtil(); + JSONObject ret = dingtalkUtil.doPost(deptparam.toString(), "https://oapi.dingtalk.com/topapi/v2/department/listsub"); + log.info(ret); + JSONArray departments = ret.getJSONArray("result"); + if(departments==null) { + continue; + } + for(int i = 0 ; i < departments.size(); i++) { +// 根据当前钉钉ID查看情况。如果当前ID在对照表中存在则跳过当前同步操作 + JSONObject department = departments.getJSONObject(i); + Thread.sleep(200); + boolean isdeptsize = dingdingDao.getdeptsizeBydingdingid(department.getString("dept_id")); +// 如果当前钉钉ID在部门对照表中已存在则跳过当前循环 + log.info("同级部门信息:"+department.toString()); + newdeptids.add(department.getString("dept_id")); + log.info("钉钉部门对照数量:"+department+"------"+isdeptsize); + if(isdeptsize) { + continue; + } + log.info(department.getString("name")); + Map parammap = new HashedMap(); +// 判断上级单位是否为集团 + if(deptids.get(in).equals("120474537")) { +// 上级单位为集团则直接根据名称获取当前单位信息 + log.info("本层为单位层级"); + V3xOrgAccount account = getOrgManager().getAccountByName(department.getString("name")); + if(account!=null) { + parammap.put("oadeptid", account.getId().toString()); + parammap.put("oadeptname", account.getName()); + }else { + continue; + } + }else { + System.out.println("本层为部门层级"); + log.info("本层为部门层级"); +// 上级单位不为集团则先根据原本对应关系查询出所在单位信息 + log.info("1."+department); + Thread.sleep(400); + Map supdeptmap = dingdingDao.getdeptBysuperDeptId(department.getString("parent_id")); + log.info("1.1.1.1.1.supdeptmap:"+supdeptmap); + if("340713772".equals(department.getString("parent_id"))|| supdeptmap.isEmpty()) { + continue; + } + if("集团机关".equals(department.getString("name"))) { + parammap.put("oadeptid", supdeptmap.get("oadeptid").toString()); + parammap.put("oadeptname", supdeptmap.get("oadeptname")+"-"+department.getString("name")); + parammap.put("dingdingdeptid", department.getString("dept_id")); + parammap.put("dingdingdeptname", department.getString("name")); + System.out.println("oaid:"+parammap.get("oadeptid")+"oaname:"+parammap.get("oadeptname")+ + "dingdingid:"+parammap.get("dingdingdeptid")+"dingdingname:"+parammap.get("dingdingdeptname")); + dingdingDao.adddept(parammap); + continue; + } +// 已知条件,上级部门ID,上级部门路径名称,单位ID,当前部门名称,获取当前部门ID + String supoadeptid = supdeptmap.get("oadeptid").toString(); + log.info("2."+supoadeptid); +// 根据上级部门ID获取出上级部门的路径。 + Map supdept = dingdingDao.getDepartmentById(Long.parseLong(supoadeptid)); + log.info("3."+supdept); +// 根据 上级部门路径00__ + 部门名称的方式获取当前部门的id,然后根据ID获取当前部门信息 + Map dept= dingdingDao.getdeptByPathName(supdept.get("path")+"0___",department.getString("name")); + log.info("4."+dept); + if(dept==null) { + continue; + } + parammap.put("oadeptid", dept.get("id").toString()); + parammap.put("oadeptname", supdeptmap.get("oadeptname")+"-"+dept.get("name").toString()); + log.info("5."+parammap.get("oadeptname")); + } + parammap.put("dingdingdeptid", department.getString("dept_id")); + parammap.put("dingdingdeptname", department.getString("name")); + log.info("6."+parammap); + dingdingDao.adddept(parammap); + } + } + log.info("7."+newdeptids.size()); + deptids = newdeptids; + newdeptids = new ArrayList(); + log.info("7.deptids.size()!=0:"+deptids.size()!=0+""); + } while (deptids.size()!=0); + log.info("部门同步完成..........."); + return null; + } + + + + public String dingdingmember() throws BusinessException, SQLException, RuntimeException, ApiException, InterruptedException { + log.info("进行人员基础数据同步"); + DingtalkUtil dingtalkUtil = new DingtalkUtil(); +// 查询src_dingding_oa_dept数据库表获取所有钉钉对照OA部门信息 + List> dingdingoadepts = dingdingDao.getDingdingOaDept(); +// 循环遍历钉钉对照OA部门信息 + log.info("查询部门对照表中有多少部门数据"+dingdingoadepts.size()); + for (Map map : dingdingoadepts) { +// 调用接口根据钉钉部门ID获取人员信息 + int i = 0 ; + boolean ishasmore; + do { + log.info("钉钉部门对照表中的部门ID"+map.get("dingdingdeptid")); + JSONObject userparam = new JSONObject(); + userparam.put("dept_id",map.get("dingdingdeptid")); + userparam.put("cursor",i); + userparam.put("size",100); + log.info("人员参数:"+userparam); + JSONObject useridret = dingtalkUtil.doPost(userparam.toString(), "https://oapi.dingtalk.com/topapi/user/listsimple"); + log.info("查询钉钉中的人员信息"+useridret); + JSONObject result = useridret.getJSONObject("result"); + System.out.println(result); + if(result==null){ + System.out.println("接口调用失败跳过当前循环"); + ishasmore = false; + continue; + } + + ishasmore = result.getBooleanValue("has_more"); + if(ishasmore) { + i = result.getIntValue("next_cursor"); + } + JSONArray userids = result.getJSONArray("list"); +// 根据钉钉人员名称查询OA组织架构人员,并更具部门对照表中的OA部门ID进行对照 + for(int in = 0 ; in < userids.size() ; in++) { + JSONObject user = userids.getJSONObject(in); + Thread.sleep(200); + boolean ismembersize = dingdingDao.getmembersizeBydingdingid(user.getString("userid")); +// 如果当前钉钉ID在人员对照表中已存在则跳过当前循环 + if(ismembersize) { + log.info("2.当前数据已存在跳过当前人员保存"); + continue; + } + List members = orgManager.getMemberByName(user.getString("name")); + boolean boo = false; + for (V3xOrgMember v3xOrgMember : members) { + if(v3xOrgMember.getState()!=1) { + log.info(v3xOrgMember.getName()+"当前人员不是出于在职状态不进行同步"); + continue; + } + Thread.sleep(400); +// 根据OA部门中的人员与钉钉接口返回出来的人员进行人员对照 + long v3xuserdeptid = v3xOrgMember.getOrgDepartmentId(); + long oauserdeptid = Long.parseLong(map.get("oadeptid").toString()); + if(v3xuserdeptid == oauserdeptid) { +// 保存钉钉对照OA人员信息到src_dingding_oa_member数据库表中 + Map membermap = new HashMap(); + membermap.put("oamemberid", v3xOrgMember.getId()+""); + membermap.put("oamembername", v3xOrgMember.getName()); + membermap.put("dingdingmemberid", user.getString("userid")); + membermap.put("dingdingmembername", user.getString("name")); + log.info("3.添加人员的map:"+membermap); + int addmember = getDingdingDao().addmember(membermap); + if(addmember>0) { + boo = true; + } + } + } + log.info("1.人员对照添加"+boo); + } + System.out.println("单个人员创建完成ishasmore=" + ishasmore); + }while(ishasmore); + } + System.out.println("人员数据同步完成"); + return null; + } + + public String dingdingclockin() throws BusinessException, SQLException, RuntimeException, ApiException, ServiceException, InterruptedException { +// 查询当前系统人员对照表中的人员信息 + List> members = dingdingDao.getDingdingOaMember(); + +// 一次封装12人的考勤数据 + int groupSize = 5; // 每组的大小 + List>> memberLists = new ArrayList>>(); + for (int i = 0; i < members.size(); i += groupSize) { + int endIndex = Math.min(i + groupSize, members.size()); + List> group = members.subList(i, endIndex); + memberLists.add(group); + } + + for(int num = 0 ; num < memberLists.size();num++) { + JSONArray dingdingmemberids = new JSONArray(); + Map dingdings = new HashMap(); + for (Map map : memberLists.get(num)) { + dingdingmemberids.add(map.get("dingdingmemberid").toString()); + dingdings.put(map.get("dingdingmemberid").toString(), map.get("oamemberid").toString()); + } + + FormExport formExport = new FormExport(); + JSONObject param = new JSONObject(); + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + Date result = calendar.getTime(); + + param.put("workDateFrom", sdf.format(result)+" 00:00:00"); + param.put("workDateTo", sdf.format(result)+" 23:59:59"); +// param.put("workDateFrom", "2024-01-15 00:00:00"); +// param.put("workDateTo", "2024-01-15 23:59:59"); + param.put("userIdList", dingdingmemberids); + param.put("offset", 0); + param.put("limit", 50); + DingtalkUtil dingtalkUtil = new DingtalkUtil(); +// 根据人员ID获取考勤打卡信息 + JSONObject ret = dingtalkUtil.doPost(param.toString(), "https://oapi.dingtalk.com/attendance/list"); + JSONArray recordresult = ret.getJSONArray("recordresult"); + if(recordresult == null){ + log.info("考勤记录获取失败:"+ret); + return null; + } + FormExportUtil formExportUtil = new FormExportUtil(); + // 调用转换方法 + List> transformedData = formExportUtil.transformData(recordresult); + JSONArray array = new JSONArray(); + for (Map map : transformedData) { + JSONObject jsonObj = new JSONObject(map); + array.add(jsonObj); + } + // 打印结果 + log.info("打卡结果打印:"+array); + for(int i = 0 ; i from = new HashMap(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(userOaId)); + if(v3xOrgMember == null) { + continue; + } + from.put("考勤人员", userOaId); +// 考勤组ID + JSONArray datas = json.getJSONArray("data"); + JSONObject datajson = datas.getJSONObject(0); + String groupId = datajson.getString("groupId"); + if("-1".equals(groupId)){ + from.put("考勤组", "无"); + }else{ + JSONObject groupjson = new JSONObject(); + groupjson.put("op_user_id",""); + groupjson.put("group_id",groupId); + JSONObject group = dingtalkUtil.doPost(groupjson.toString(), "https://oapi.dingtalk.com/topapi/attendance/group/query"); + log.info("调用接口获取考勤组"+group.toString()); + JSONObject groupresult = group.getJSONObject("result"); + String groupName = groupresult.getString("name"); + from.put("考勤组", groupName); + } + from.put("考勤人员所在部门", v3xOrgMember.getOrgDepartmentId().toString()); + from.put("工号", v3xOrgMember.getLoginName()); + from.put("职位", v3xOrgMember.getOrgPostId().toString()); +// 对获取到的考勤该数据进行时间排序 + JSONArray datasSequence = formExportUtil.dingdingTimeSequence(datas); + List> subfroms = new ArrayList>(); + String start = "正常"; +// 如果显示的4次都是未打卡则默认当天为未打卡 + int lack = 0; +// 设置明细表信息 + for(int n = 0 ; n subfrom = new HashMap(); +// //基准时间 + long baseCheckTime = datasSequence.getJSONObject(n).getLong("baseCheckTime"); + Date jizhunshijian = new Date(); + jizhunshijian.setTime(baseCheckTime); + String jizhunshijianStr = simpleDateFormat.format(jizhunshijian); +// //实际打卡时间 + long userCheckTime = datasSequence.getJSONObject(n).getLong("userCheckTime"); + Date shijidaka = new Date(); + shijidaka.setTime(userCheckTime); + String shijidakaStr = simpleDateFormat.format(shijidaka); + //考勤结果 + String timeResult = datasSequence.getJSONObject(n).getString("timeResult"); + String timeResultStr = ""; + if("Normal".equals(timeResult)){ + timeResultStr = "正常"; + }else if("Early".equals(timeResult)) { + timeResultStr = "早退"; + if("正常".equals(start)){ + if(n<=1){start = "下班1早退";} + else{start = "下班2早退";} + }else{ + if(n<=1){start = start+"下班1早退";} + else{start = start+"下班2早退";} + } + }else if("Late".equals(timeResult)) { + timeResultStr = "迟到"; + if("正常".equals(start)){ + if(n<=1){start = start+"上班1迟到";} + else{start = start+"上班2迟到";} + }else{ + if(n<=1){start = start+"下班1早退";} + else{start = start+"下班2早退";} + } + }else if("SeriousLate".equals(timeResult)) { + timeResultStr = "严重迟到"; + }else if("Absenteeism".equals(timeResult)) { + timeResultStr = "旷工迟到"; + }else if("NotSigned".equals(timeResult)) { + lack++; + timeResultStr = "未打卡"; + if("正常".equals(start)){ + if(n<=1){start = start+"上班1未打卡"; } + else{ start = start+"上班2未打卡"; } + }else{ + if(n<=1){ start = start+"下班1未打卡"; } + else{ start = start+"下班2未打卡"; } + } + } + log.info("打卡时间:"+shijidakaStr); + subfrom.put("打卡时间", shijidakaStr); + log.info("基准时间:"+jizhunshijianStr); + subfrom.put("基准时间", jizhunshijianStr); +// 根据获取出来的基准时间判断是上班还是下班 + String checkType = datasSequence.getJSONObject(n).getString("checkType"); + + if("OnDuty".equals(checkType)){ + if(n<=1){subfrom.put("打卡类型", "上班1");} + else{subfrom.put("打卡类型", "上班2"); } + }else if ("OffDuty".equals(checkType)){ + if(n<=1){ subfrom.put("打卡类型", "下班1"); } + else{ subfrom.put("打卡类型", "下班2"); } + } + subfrom.put("打卡状态", timeResultStr); + + + subfroms.add(subfrom); + } + if(lack ==datasSequence.size()){ + start = "未打卡"; + } + from.put("当前打卡状态", start); +// 通过档案表生成方法将这12人一天的数据保存到档案中提供数据封装处理 + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + List subordinateFormExports = formExportUtil.setSubordinateFormValue(subfroms); + formExport.setSubordinateForms(subordinateFormExports); + Thread.sleep(100); +// 创建档案表 + getFormFactory().importBusinessFormData("hr", "CLOCKIN", + formExport, new String[] {}); + } + } + System.out.println("钉钉考勤原始数据创建完成"); + return null; + } + + public String dingdingclockin(String datestr) throws BusinessException, SQLException, RuntimeException, ApiException, ServiceException, InterruptedException { +// 查询当前系统人员对照表中的人员信息 + List> members = dingdingDao.getDingdingOaMember(); + +// 一次封装12人的考勤数据 + int groupSize = 5; // 每组的大小 + List>> memberLists = new ArrayList>>(); + for (int i = 0; i < members.size(); i += groupSize) { + int endIndex = Math.min(i + groupSize, members.size()); + List> group = members.subList(i, endIndex); + memberLists.add(group); + } + + for(int num = 0 ; num < memberLists.size();num++) { + JSONArray dingdingmemberids = new JSONArray(); + Map dingdings = new HashMap(); + for (Map map : memberLists.get(num)) { + dingdingmemberids.add(map.get("dingdingmemberid").toString()); + dingdings.put(map.get("dingdingmemberid").toString(), map.get("oamemberid").toString()); + } + + FormExport formExport = new FormExport(); + JSONObject param = new JSONObject(); + +// Calendar calendar = Calendar.getInstance(); +// calendar.add(Calendar.DAY_OF_MONTH, -1); +// Date result = calendar.getTime(); + + param.put("workDateFrom", datestr+" 00:00:00"); + param.put("workDateTo", datestr+" 23:59:59"); + param.put("userIdList", dingdingmemberids); + param.put("offset", 0); + param.put("limit", 50); + DingtalkUtil dingtalkUtil = new DingtalkUtil(); +// 根据人员ID获取考勤打卡信息 + JSONObject ret = dingtalkUtil.doPost(param.toString(), "https://oapi.dingtalk.com/attendance/list"); + JSONArray recordresult = ret.getJSONArray("recordresult"); + if(recordresult == null){ + log.info("考勤记录获取失败:"+ret); + return "考勤记录获取失败:"+ret; + } + FormExportUtil formExportUtil = new FormExportUtil(); + // 调用转换方法 + List> transformedData = formExportUtil.transformData(recordresult); + JSONArray array = new JSONArray(); + for (Map map : transformedData) { + JSONObject jsonObj = new JSONObject(map); + array.add(jsonObj); + } + // 打印结果 + log.info("打卡结果打印:"+array); + for(int i = 0 ; i from = new HashMap(); + V3xOrgMember v3xOrgMember = orgManager.getMemberById(Long.parseLong(userOaId)); + if(v3xOrgMember == null) { + continue; + } + from.put("考勤人员", userOaId); + // 考勤组ID + JSONArray datas = json.getJSONArray("data"); + JSONObject datajson = datas.getJSONObject(0); + String groupId = datajson.getString("groupId"); + if("-1".equals(groupId)){ + from.put("考勤组", "无"); + }else{ + JSONObject groupjson = new JSONObject(); + groupjson.put("op_user_id",""); + groupjson.put("group_id",groupId); + JSONObject group = dingtalkUtil.doPost(groupjson.toString(), "https://oapi.dingtalk.com/topapi/attendance/group/query"); + log.info("调用接口获取考勤组"+group.toString()); + JSONObject groupresult = group.getJSONObject("result"); + String groupName = groupresult.getString("name"); + from.put("考勤组", groupName); + } + from.put("考勤人员所在部门", v3xOrgMember.getOrgDepartmentId().toString()); + from.put("工号", v3xOrgMember.getLoginName()); + from.put("职位", v3xOrgMember.getOrgPostId().toString()); +// 对获取到的考勤该数据进行时间排序 + JSONArray datasSequence = formExportUtil.dingdingTimeSequence(datas); + List> subfroms = new ArrayList>(); + String start = "正常"; +// 如果显示的4次都是未打卡则默认当天为未打卡 + int lack = 0; +// 设置明细表信息 + for(int n = 0 ; n subfrom = new HashMap(); +// //基准时间 + long baseCheckTime = datasSequence.getJSONObject(n).getLong("baseCheckTime"); + Date jizhunshijian = new Date(); + jizhunshijian.setTime(baseCheckTime); + String jizhunshijianStr = simpleDateFormat.format(jizhunshijian); +// //实际打卡时间 + long userCheckTime = datasSequence.getJSONObject(n).getLong("userCheckTime"); + Date shijidaka = new Date(); + shijidaka.setTime(userCheckTime); + String shijidakaStr = simpleDateFormat.format(shijidaka); + //考勤结果 + String timeResult = datasSequence.getJSONObject(n).getString("timeResult"); + String timeResultStr = ""; + if("Normal".equals(timeResult)){ + timeResultStr = "正常"; + }else if("Early".equals(timeResult)) { + timeResultStr = "早退"; + if("正常".equals(start)){ + if(n<=1){start = "下班1早退";} + else{start = "下班2早退";} + }else{ + if(n<=1){start = start+"下班1早退";} + else{start = start+"下班2早退";} + } + }else if("Late".equals(timeResult)) { + timeResultStr = "迟到"; + if("正常".equals(start)){ + if(n<=1){start = start+"上班1迟到";} + else{start = start+"上班2迟到";} + }else{ + if(n<=1){start = start+"下班1早退";} + else{start = start+"下班2早退";} + } + }else if("SeriousLate".equals(timeResult)) { + timeResultStr = "严重迟到"; + }else if("Absenteeism".equals(timeResult)) { + timeResultStr = "旷工迟到"; + }else if("NotSigned".equals(timeResult)) { + lack++; + timeResultStr = "未打卡"; + if("正常".equals(start)){ + if(n<=1){start = start+"上班1未打卡"; } + else{ start = start+"上班2未打卡"; } + }else{ + if(n<=1){ start = start+"下班1未打卡"; } + else{ start = start+"下班2未打卡"; } + } + } + log.info("打卡时间:"+shijidakaStr); + subfrom.put("打卡时间", shijidakaStr); + log.info("基准时间:"+jizhunshijianStr); + subfrom.put("基准时间", jizhunshijianStr); +// 根据获取出来的基准时间判断是上班还是下班 + String checkType = datasSequence.getJSONObject(n).getString("checkType"); + + if("OnDuty".equals(checkType)){ + if(n<=1){subfrom.put("打卡类型", "上班1");} + else{subfrom.put("打卡类型", "上班2"); } + }else if ("OffDuty".equals(checkType)){ + if(n<=1){ subfrom.put("打卡类型", "下班1"); } + else{ subfrom.put("打卡类型", "下班2"); } + } + subfrom.put("打卡状态", timeResultStr); + + + subfroms.add(subfrom); + } + if(lack ==datasSequence.size()){ + start = "未打卡"; + } + from.put("当前打卡状态", start); +// 通过档案表生成方法将这12人一天的数据保存到档案中提供数据封装处理 + List valueExports = formExportUtil.setFormValue(from); + formExport.setValues(valueExports); + List subordinateFormExports = formExportUtil.setSubordinateFormValue(subfroms); + formExport.setSubordinateForms(subordinateFormExports); + Thread.sleep(100); +// 创建档案表 + getFormFactory().importBusinessFormData("hr", "CLOCKIN", + formExport, new String[] {}); + } + } + System.out.println(datestr+"钉钉考勤原始数据创建完成"); + return datestr+"钉钉考勤原始数据创建完成"; + } + + + public void setWorkAttendance(){ + log.info("开始设置考勤信息"); + try { + // 获取所有打卡人 + List> members = dingdingDao.getDingdingOaMember(); + // 循环遍历所有打卡人信息,设置前一天的打卡情况 + for (Map map:members) { +// 根据打卡人信息获取一月内的打卡情况 + log.info("设置当前考勤时间前一个月"); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH,-1); + String dateStr = sdf.format(calendar.getTime()); + calendar.add(Calendar.MONTH, -1); + String lastMonth = sdf.format(calendar.getTime()); + String memberId = map.get("oamemberid").toString(); + log.info(lastMonth+"--"+memberId); + int clockInNum = dingdingDao.getClockInNumBymember(lastMonth,memberId); +// 创建考勤对象 + CheckOnWorkAttendanceVo checkOnWorkAttendanceVo = new CheckOnWorkAttendanceVo(); + log.info(memberId+","+clockInNum+"此人前一个月如果存在打卡情况则进行考勤对象创建"); + if(clockInNum>0) { +// 存在打卡情况,创建基础参数显示考勤情况显示未上班1,下班1,上班2,下班2, +// Calendar calendar1 = Calendar.getInstance(); +//// 设置日期-1 +// calendar1.add(Calendar.DATE, -1); +// String yesterday = sdf.format(calendar1.getTime()); +// 查询参数的打卡记录 + List> clockInList = dingdingDao.getClockInBymember(dateStr, memberId); + log.info("指定时间的考勤数据条数:"+clockInList.size()); + if (clockInList.size() > 0) { +// 设置ID + checkOnWorkAttendanceVo.setId(UUIDUtil.getUUIDLong()); + checkOnWorkAttendanceVo.setMemberId(Long.parseLong(memberId)); + checkOnWorkAttendanceVo.setCheckOnWorkAttendanceDate(sdf.parse(dateStr)); + checkOnWorkAttendanceVo.setGroupName(clockInList.get(0).get("groupName").toString()); + log.info("创建考勤对象基础参数" + checkOnWorkAttendanceVo.getId()); +// 判断考勤时间点上打卡状态 + for (Map clockIn : clockInList) { + log.info(clockIn); +// 设置考勤相关数据 + if ("上班1".equals(clockIn.get("type").toString())) { + checkOnWorkAttendanceVo.setShangbanDate1(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); + if("迟到".equals(clockIn.get("state").toString())){ + Date date1 = simpleDateFormat.parse(clockIn.get("clockInDate").toString()); + Date date2 = simpleDateFormat.parse(clockIn.get("referenceDate").toString()); + long time = date1.getTime()-date2.getTime(); + long minute = time/1000/60; + checkOnWorkAttendanceVo.setShangban1(clockIn.get("state").toString()+minute+"分钟"); + }else{ + checkOnWorkAttendanceVo.setShangban1(clockIn.get("state").toString()); + } + } else if ("下班1".equals(clockIn.get("type").toString())) { + checkOnWorkAttendanceVo.setXiabanDate1(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); + if("早退".equals(clockIn.get("state").toString())){ + Date date1 = simpleDateFormat.parse(clockIn.get("clockInDate").toString()); + Date date2 = simpleDateFormat.parse(clockIn.get("referenceDate").toString()); + long time = date2.getTime()-date1.getTime(); + long minute = time/1000/60; + checkOnWorkAttendanceVo.setXiaban1(clockIn.get("state").toString()+minute+"分钟"); + }else{ + checkOnWorkAttendanceVo.setXiaban1(clockIn.get("state").toString()); + } + } else if ("上班2".equals(clockIn.get("type").toString())) { + checkOnWorkAttendanceVo.setShangbanDate2(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); + if("迟到".equals(clockIn.get("state").toString())){ + Date date1 = simpleDateFormat.parse(clockIn.get("clockInDate").toString()); + Date date2 = simpleDateFormat.parse(clockIn.get("referenceDate").toString()); + long time = date1.getTime()-date2.getTime(); + long minute = time/1000/60; + checkOnWorkAttendanceVo.setShangban2(clockIn.get("state").toString()+minute+"分钟"); + }else{ + checkOnWorkAttendanceVo.setShangban2(clockIn.get("state").toString()); + } + } else if ("下班2".equals(clockIn.get("type").toString())) { + checkOnWorkAttendanceVo.setXiabanDate2(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); + if("早退".equals(clockIn.get("state").toString())){ + Date date1 = simpleDateFormat.parse(clockIn.get("clockInDate").toString()); + Date date2 = simpleDateFormat.parse(clockIn.get("referenceDate").toString()); + long time = date2.getTime()-date1.getTime(); + long minute = time/1000/60; + checkOnWorkAttendanceVo.setXiaban2(clockIn.get("state").toString()+minute+"分钟"); + }else{ + checkOnWorkAttendanceVo.setXiaban2(clockIn.get("state").toString()); + } + } + } + checkOnWorkAttendanceVo = setState(checkOnWorkAttendanceVo); + log.info("考勤对象" + checkOnWorkAttendanceVo.toString()); + } else { +// 不存在打卡情况,创建未打卡数据 + checkOnWorkAttendanceVo.setId(UUIDUtil.getUUIDLong()); + checkOnWorkAttendanceVo.setMemberId(Long.parseLong(memberId)); + checkOnWorkAttendanceVo.setCheckOnWorkAttendanceDate(sdf.parse(dateStr)); + String groupName = dingdingDao.getGroupName(memberId); + checkOnWorkAttendanceVo.setGroupName(groupName); + checkOnWorkAttendanceVo.setShangban1("未打卡"); + checkOnWorkAttendanceVo.setXiaban1("未打卡"); + checkOnWorkAttendanceVo.setShangban2("未打卡"); + checkOnWorkAttendanceVo.setXiaban2("未打卡"); + checkOnWorkAttendanceVo.setState("休息"); + log.info("休息时间考勤对象" + checkOnWorkAttendanceVo.toString()); + } + // 保存打卡数据到数据库表中 + int addin = dingdingDao.addCheckOnWorkAttendance(checkOnWorkAttendanceVo); + log.info("当前考勤人员为:"+checkOnWorkAttendanceVo.getMemberId()+"添加信息条数为"+addin); + } + +// 根据单据修改当前人员一月内的考勤情况 + +// calendar表示时间前一个月的时间点。查询 单据结束时间在查询开始时间之后并且单据开始时间在查询结束时间之前的单据 +// 查询当前人员一年内的请假单 map : 人员,请假类型,开始时间 ,结束时间 + log.info("请假参数时间段"+memberId+"~~~~~~~~~~~~"+sdf.format(calendar.getTime())+"~~~~~~"+dateStr); + List> leaves = dingdingDao.getLeave(memberId,sdf.format(calendar.getTime()),dateStr); + leaveUpdateWorkAttendance(leaves,memberId); + +// 查询当前人员一年内的出差单 map : 人员,请假类型,开始时间 ,结束时间 + List> evections = dingdingDao.getEvections(memberId,sdf.format(calendar.getTime()),dateStr); + evectionUpdateWorkAttendance(evections,memberId); + +// 查询当前人员一年内的加班单 + List> overtimes = dingdingDao.getOvertime(memberId,sdf.format(calendar.getTime()),dateStr); + overtimesUpdateWorkAttendance(overtimes,memberId); + +// 查询当前人员一年内的补卡单 + List> makeCard = dingdingDao.getMakeCard(memberId,sdf.format(calendar.getTime()),dateStr); + makeCardUpdateWorkAttendance(makeCard,memberId); + +// 查询当前人员一年内的调休单 map : 人员,请假类型,开始时间 ,结束时间 + List> adjustLeaves = dingdingDao.getAdjustLeave(memberId,sdf.format(calendar.getTime()),dateStr); + leaveUpdateWorkAttendance(adjustLeaves,memberId); + } + log.info("创建完成!!!创建条数"+members.size()); + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + } + + /** + * 获取昨天的打卡情况生成考勤,并检测近一个的考勤情况根据单据情况变更数据 + * @throws SQLException + * @throws BusinessException + * @throws ParseException + */ + + public String setWorkAttendance(String dateStr) { + log.info("开始设置考勤信息"); + try { + // 获取所有打卡人 + List> members = dingdingDao.getDingdingOaMember(); + // 循环遍历所有打卡人信息,设置前一天的打卡情况 + for (Map map:members) { +// 根据打卡人信息获取一月内的打卡情况 + log.info("设置当前考勤时间前一个月"); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(sdf.parse(dateStr)); + calendar.add(Calendar.MONTH, -1); + String lastMonth = sdf.format(calendar.getTime()); + String memberId = map.get("oamemberid").toString(); + log.info(lastMonth+"--"+memberId); + int clockInNum = dingdingDao.getClockInNumBymember(lastMonth,memberId); +// 创建考勤对象 + CheckOnWorkAttendanceVo checkOnWorkAttendanceVo = new CheckOnWorkAttendanceVo(); + log.info(memberId+","+clockInNum+"此人前一个月如果存在打卡情况则进行考勤对象创建"); + if(clockInNum>0) { +// 存在打卡情况,创建基础参数显示考勤情况显示未上班1,下班1,上班2,下班2, +// Calendar calendar1 = Calendar.getInstance(); +//// 设置日期-1 +// calendar1.add(Calendar.DATE, -1); +// String yesterday = sdf.format(calendar1.getTime()); +// 查询参数的打卡记录 + List> clockInList = dingdingDao.getClockInBymember(dateStr, memberId); + log.info("指定时间的考勤数据条数:"+clockInList.size()); + if (clockInList.size() > 0) { +// 设置ID + checkOnWorkAttendanceVo.setId(UUIDUtil.getUUIDLong()); + checkOnWorkAttendanceVo.setMemberId(Long.parseLong(memberId)); + checkOnWorkAttendanceVo.setCheckOnWorkAttendanceDate(sdf.parse(dateStr)); + checkOnWorkAttendanceVo.setGroupName(clockInList.get(0).get("groupName").toString()); + log.info("创建考勤对象基础参数" + checkOnWorkAttendanceVo.getId()); +// 判断考勤时间点上打卡状态 + for (Map clockIn : clockInList) { + log.info(clockIn); +// 设置考勤相关数据 + if ("上班1".equals(clockIn.get("type").toString())) { + checkOnWorkAttendanceVo.setShangbanDate1(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); + if("迟到".equals(clockIn.get("state").toString())){ + Date date1 = simpleDateFormat.parse(clockIn.get("clockInDate").toString()); + Date date2 = simpleDateFormat.parse(clockIn.get("referenceDate").toString()); + long time = date1.getTime()-date2.getTime(); + long minute = time/1000/60; + checkOnWorkAttendanceVo.setShangban1(clockIn.get("state").toString()+minute+"分钟"); + }else{ + checkOnWorkAttendanceVo.setShangban1(clockIn.get("state").toString()); + } + } else if ("下班1".equals(clockIn.get("type").toString())) { + checkOnWorkAttendanceVo.setXiabanDate1(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); + if("早退".equals(clockIn.get("state").toString())){ + Date date1 = simpleDateFormat.parse(clockIn.get("clockInDate").toString()); + Date date2 = simpleDateFormat.parse(clockIn.get("referenceDate").toString()); + long time = date2.getTime()-date1.getTime(); + long minute = time/1000/60; + checkOnWorkAttendanceVo.setXiaban1(clockIn.get("state").toString()+minute+"分钟"); + }else{ + checkOnWorkAttendanceVo.setXiaban1(clockIn.get("state").toString()); + } + } else if ("上班2".equals(clockIn.get("type").toString())) { + checkOnWorkAttendanceVo.setShangbanDate2(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); + if("迟到".equals(clockIn.get("state").toString())){ + Date date1 = simpleDateFormat.parse(clockIn.get("clockInDate").toString()); + Date date2 = simpleDateFormat.parse(clockIn.get("referenceDate").toString()); + long time = date1.getTime()-date2.getTime(); + long minute = time/1000/60; + checkOnWorkAttendanceVo.setShangban2(clockIn.get("state").toString()+minute+"分钟"); + }else{ + checkOnWorkAttendanceVo.setShangban2(clockIn.get("state").toString()); + } + } else if ("下班2".equals(clockIn.get("type").toString())) { + checkOnWorkAttendanceVo.setXiabanDate2(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); + if("早退".equals(clockIn.get("state").toString())){ + Date date1 = simpleDateFormat.parse(clockIn.get("clockInDate").toString()); + Date date2 = simpleDateFormat.parse(clockIn.get("referenceDate").toString()); + long time = date2.getTime()-date1.getTime(); + long minute = time/1000/60; + checkOnWorkAttendanceVo.setXiaban2(clockIn.get("state").toString()+minute+"分钟"); + }else{ + checkOnWorkAttendanceVo.setXiaban2(clockIn.get("state").toString()); + } + } + } + checkOnWorkAttendanceVo = setState(checkOnWorkAttendanceVo); + log.info("考勤对象" + checkOnWorkAttendanceVo.toString()); + } else { +// 不存在打卡情况,创建未打卡数据 + checkOnWorkAttendanceVo.setId(UUIDUtil.getUUIDLong()); + checkOnWorkAttendanceVo.setMemberId(Long.parseLong(memberId)); + checkOnWorkAttendanceVo.setCheckOnWorkAttendanceDate(sdf.parse(dateStr)); + String groupName = dingdingDao.getGroupName(memberId); + checkOnWorkAttendanceVo.setGroupName(groupName); + checkOnWorkAttendanceVo.setShangban1("未打卡"); + checkOnWorkAttendanceVo.setXiaban1("未打卡"); + checkOnWorkAttendanceVo.setShangban2("未打卡"); + checkOnWorkAttendanceVo.setXiaban2("未打卡"); + checkOnWorkAttendanceVo.setState("休息"); + log.info("休息时间考勤对象" + checkOnWorkAttendanceVo.toString()); + } + // 保存打卡数据到数据库表中 + int addin = dingdingDao.addCheckOnWorkAttendance(checkOnWorkAttendanceVo); + log.info("当前考勤人员为:"+checkOnWorkAttendanceVo.getMemberId()+"添加信息条数为"+addin); + } + +// 根据单据修改当前人员一月内的考勤情况 + +// calendar表示时间前一个月的时间点。查询 单据结束时间在查询开始时间之后并且单据开始时间在查询结束时间之前的单据 +// 查询当前人员一年内的请假单 map : 人员,请假类型,开始时间 ,结束时间 + log.info("请假参数时间段"+memberId+"~~~~~~~~~~~~"+sdf.format(calendar.getTime())+"~~~~~~"+dateStr); + List> leaves = dingdingDao.getLeave(memberId,sdf.format(calendar.getTime()),dateStr); + leaveUpdateWorkAttendance(leaves,memberId); + +// 查询当前人员一年内的出差单 map : 人员,请假类型,开始时间 ,结束时间 + List> evections = dingdingDao.getEvections(memberId,sdf.format(calendar.getTime()),dateStr); + evectionUpdateWorkAttendance(evections,memberId); + +// 查询当前人员一年内的加班单 + List> overtimes = dingdingDao.getOvertime(memberId,sdf.format(calendar.getTime()),dateStr); + overtimesUpdateWorkAttendance(overtimes,memberId); + +// 查询当前人员一年内的补卡单 + List> makeCard = dingdingDao.getMakeCard(memberId,sdf.format(calendar.getTime()),dateStr); + makeCardUpdateWorkAttendance(makeCard,memberId); + +// 查询当前人员一年内的调休单 map : 人员,请假类型,开始时间 ,结束时间 + List> adjustLeaves = dingdingDao.getAdjustLeave(memberId,sdf.format(calendar.getTime()),dateStr); + leaveUpdateWorkAttendance(adjustLeaves,memberId); + } + log.info("创建完成!!!创建条数"+members.size()); + } catch (BusinessException e) { + e.printStackTrace(); + return e.toString(); + } catch (SQLException e) { + e.printStackTrace(); + return e.toString(); + } catch (ParseException e) { + e.printStackTrace(); + return e.toString(); + } + return "考勤信息创建完成!!!"; + } + + +// 请假,调休考勤变更 + public void leaveUpdateWorkAttendance(List> lists,String memberId) throws ParseException { + // 遍历当前查询到的请假单数量 + log.info("进入请假,调休考勤变更"+lists.size()); + for (Map list:lists) { +// 查询当前人员在指定时间内的考勤情况 + log.info("查询当前人员在指定时间内的考勤情况"+memberId+list.get("startDateStr")+list.get("endDateStr")); + List workAttendanceByDates = dingdingDao.getWorkAttendanceByDate(memberId, + list.get("startDateStr").toString().substring(0,10),list.get("endDateStr").toString().substring(0,10)); + log.info(list); + for (CheckOnWorkAttendanceVo cowav:workAttendanceByDates) { + if("病假".equals(list.get("type").toString()) || "工伤".equals(list.get("type").toString()) || + "产假".equals(list.get("type").toString()) || "产检假".equals(list.get("type").toString())){ + if(cowav.getShangbanDate1() == null ){ + cowav.setShangban1(list.get("type").toString()); + }else { + log.info("shangban1"+cowav.getShangbanDate1()+"shangban1不为空时:"); + if (cowav.getShangbanDate1().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getShangbanDate1().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() + &&cowav.getShangban1().equals("未打卡")){ + cowav.setShangban1(list.get("type").toString()); + } + } +// 下班1 + log.info("xiaban1"+cowav.getXiabanDate1()); + if(cowav.getXiabanDate1() == null ){ + cowav.setXiaban1(list.get("type").toString()); + }else { + if (cowav.getXiabanDate1().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getXiabanDate1().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getXiaban1().equals("未打卡") ){ + cowav.setXiaban1(list.get("type").toString()); + } + } +// 上班2 + log.info("shangban2"+cowav.getShangbanDate2()); + if(cowav.getShangbanDate2() == null){ + cowav.setShangban2(list.get("type").toString()); + }else { + if(cowav.getShangbanDate2().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getShangbanDate2().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getShangban2().equals("未打卡")){ + cowav.setShangban2(list.get("type").toString()); + } + } +// 下班2 + log.info("xiaban2"+cowav.getXiabanDate2()); + if(cowav.getXiabanDate2() == null ){ + cowav.setXiaban2(list.get("type").toString()); + }else { + if (cowav.getXiabanDate2().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getXiabanDate2().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getXiaban2().equals("未打卡") ){ + cowav.setXiaban2(list.get("type").toString()); + } + } + }else{ + // 上班1 + if(cowav.getShangbanDate1() == null){ + cowav.setShangban1("未打卡"); + }else{ + log.info(cowav.getShangbanDate1().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime()); + log.info(cowav.getShangbanDate1().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime()); + log.info(cowav.getShangban1().equals("未打卡") && cowav.getShangbanDate1() !=null); + if(cowav.getShangbanDate1().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getShangbanDate1().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getShangban1().equals("未打卡") && cowav.getShangbanDate1() !=null){ + cowav.setShangban1(list.get("type").toString()); + } + } +// 下班1 + if(cowav.getXiabanDate1() == null){ + cowav.setXiaban1("未打卡"); + }else{ + log.info(cowav.getXiabanDate1().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime()); + log.info(cowav.getXiabanDate1().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime()); + log.info(cowav.getXiaban1().equals("未打卡") && cowav.getXiabanDate1() !=null); + if(cowav.getXiabanDate1().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getXiabanDate1().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getXiabanDate1() !=null && cowav.getXiaban1().equals("未打卡") ){ + cowav.setXiaban1(list.get("type").toString()); + } + } +// 上班2 + if(cowav.getShangbanDate2() == null ){ + cowav.setShangban2(cowav.getShangban1()); +// cowav.setShangban2("未打卡"); + }else{ + log.info(cowav.getShangbanDate2().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime()); + log.info(cowav.getShangbanDate2().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime()); + log.info(cowav.getShangban2().equals("未打卡") && cowav.getShangbanDate2() !=null); + if(cowav.getShangbanDate2().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getShangbanDate2().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getShangbanDate2() !=null && cowav.getShangban2().equals("未打卡")){ + cowav.setShangban2(list.get("type").toString()); + } + } +// 下班2 + if(cowav.getXiabanDate2() == null ){ + cowav.setXiaban2(cowav.getXiaban1()); +// cowav.setXiaban2("未打卡"); + }else{ + log.info(cowav.getXiabanDate2().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime()); + log.info(cowav.getXiabanDate2().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime()); + log.info(cowav.getXiaban2().equals("未打卡") && cowav.getXiabanDate2() !=null); + if(cowav.getXiabanDate2().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getXiabanDate2().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getXiabanDate2() !=null && cowav.getXiaban2().equals("未打卡") ){ + cowav.setXiaban2(list.get("type").toString()); + } + } + } +// 状态 + cowav = setState(cowav); + log.info("修改后的考勤对象"+cowav); + int i = dingdingDao.updateWorkAttendance(cowav); + log.info("请假调休是否修改考勤成功"+i); + } + } + log.info("请假调休考勤变化完成。"); + } + + +// 出差考勤变更 + public void evectionUpdateWorkAttendance(List> lists,String memberId) throws ParseException { + // 遍历当前查询到的出差单数量 + log.info("进入出差考勤变化"+lists.size()); + for (Map list:lists) { + log.info(list); +// 查询当前人员在指定时间内的考勤情况 + log.info("查询指定时间内的考勤情况"+memberId+list.get("startDateStr")+list.get("endDateStr")); + List workAttendanceByDates = dingdingDao.getWorkAttendanceByDate(memberId, + list.get("startDateStr").toString().substring(0,10),list.get("endDateStr").toString().substring(0,10)); + log.info("workAttendanceByDates.size()"+workAttendanceByDates.size()); + for (CheckOnWorkAttendanceVo cowav:workAttendanceByDates) { +// 上班1 + log.info(cowav.getState()); + if(cowav.getShangbanDate1() == null ){ + cowav.setShangban1(list.get("type").toString()); + }else { + log.info("shangban1"+cowav.getShangbanDate1()+"shangban1不为空时:"); + if (cowav.getShangbanDate1().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getShangbanDate1().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() + &&cowav.getShangban1().equals("未打卡")){ + cowav.setShangban1(list.get("type").toString()); + } + } +// 下班1 + log.info("xiaban1"+cowav.getXiabanDate1()); + if(cowav.getXiabanDate1() == null ){ + cowav.setXiaban1(list.get("type").toString()); + }else { + if (cowav.getXiabanDate1().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getXiabanDate1().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getXiaban1().equals("未打卡") ){ + cowav.setXiaban1(list.get("type").toString()); + } + } +// 上班2 + log.info("shangban2"+cowav.getShangbanDate2()); + if(cowav.getShangbanDate2() == null){ + cowav.setShangban2(list.get("type").toString()); + }else { + if(cowav.getShangbanDate2().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getShangbanDate2().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getShangban2().equals("未打卡")){ + cowav.setShangban2(list.get("type").toString()); + } + } +// 下班2 + log.info("xiaban2"+cowav.getXiabanDate2()); + if(cowav.getXiabanDate2() == null ){ + cowav.setXiaban2(list.get("type").toString()); + }else { + if (cowav.getXiabanDate2().getTime()>=simpleDateFormat.parse(list.get("startDateStr").toString()).getTime() && + cowav.getXiabanDate2().getTime()<=simpleDateFormat.parse(list.get("endDateStr").toString()).getTime() && + cowav.getXiaban2().equals("未打卡") ){ + cowav.setXiaban2(list.get("type").toString()); + } + } +// 状态 + cowav = setState(cowav); + log.info("修改后的考勤对象"+cowav); + int i = dingdingDao.updateWorkAttendance(cowav); + log.info("考勤对象是否修改成功"+i); + } + } + log.info("出差变化完成。"); + } + + +// 加班考勤变更 + public void overtimesUpdateWorkAttendance(List> lists,String memberId) throws ParseException { + // 遍历当前查询到的加班单数量 + log.info("进入加班考勤变化"+lists.size()); + for (Map list:lists) { + log.info(list); +// 查询当前人员在指定时间内的考勤情况 + List workAttendanceByDates = dingdingDao.getWorkAttendanceByDate(memberId, + list.get("startDateStr").toString().substring(0,10),list.get("endDateStr").toString().substring(0,10)); + for (CheckOnWorkAttendanceVo cowav:workAttendanceByDates) { + if("正常".equals(cowav.getShangban1()) && cowav.getShangbanDate1() !=null){ + cowav.setState(list.get("type").toString()); + } + log.info("加班修改后的考勤情况"+cowav); + int i = dingdingDao.updateWorkAttendance(cowav); + log.info("考勤对象是否修改成功"+i); + } + } + log.info("加班考勤变化完成。"); + } + + +// 补卡考勤变更 + public void makeCardUpdateWorkAttendance(List> lists,String memberId) throws ParseException { + // 遍历当前查询到的加班单数量 + log.info("进入补卡考勤变化"+lists.size()); + for (Map list:lists) { + log.info(list); +// 查询当前人员在指定时间内的考勤情况 + log.info("进入补卡参数"+memberId+list.get("makeCardDateStr")+list.get("makeCardDateStr")); + List workAttendanceByDates = dingdingDao.getWorkAttendanceByDate(memberId, + list.get("makeCardDateStr").toString().substring(0,10),list.get("makeCardDateStr").toString().substring(0,10)); + for (CheckOnWorkAttendanceVo cowav:workAttendanceByDates) { +// 上班1 + if(cowav.getShangbanDate1() == null){ + cowav.setShangban1("未打卡"); + }else{ + if(cowav.getShangbanDate1().getTime()== simpleDateFormat.parse(list.get("makeCardDateStr").toString()).getTime() + && !"正常".equals(cowav.getShangban1()) ){ + cowav.setShangban1("正常"); + } + } +// 下班1 + if(cowav.getXiabanDate1() == null){ + cowav.setXiaban1("未打卡"); + }else{ + if(cowav.getXiabanDate1().getTime() == simpleDateFormat.parse(list.get("makeCardDateStr").toString()).getTime() + && !"正常".equals(cowav.getXiaban1()) ){ + cowav.setXiaban1("正常"); + } + } +// 上班2 + if(cowav.getShangbanDate2() == null ){ + cowav.setShangban2("未打卡"); + }else{ + if(cowav.getShangbanDate2().getTime() == simpleDateFormat.parse(list.get("makeCardDateStr").toString()).getTime() + && !"正常".equals(cowav.getShangban2()) ){ + cowav.setShangban2("正常"); + } + } +// 下班2 + if(cowav.getXiabanDate2() == null ){ + cowav.setXiaban2("未打卡"); + }else{ + if(cowav.getXiabanDate2().getTime() == simpleDateFormat.parse(list.get("makeCardDateStr").toString()).getTime() + && !"正常".equals(cowav.getXiaban2()) ){ + cowav.setXiaban2("正常"); + } + } + // 状态 + log.info("状态变化前字段内容"+cowav); + cowav = setState(cowav); + log.info("变化后的考勤对象"+cowav); + int i = dingdingDao.updateWorkAttendance(cowav); + log.info("考勤对象变化是否成功"+i); + } + } + log.info("补卡后的考勤变化完成。"); + } + +// -4304583669849241253 2024-01-29 16:11:00.0 2024-01-31 12:00:00.0 +// public void setWorkAttendance1(){ +// Map list = new HashMap(); +// list.put("startDateStr","2024-01-29 16:11:00.0"); +// list.put("endDateStr","2024-01-31 12:00:00.0"); +// List workAttendanceByDates = dingdingDao.getWorkAttendanceByDate("-4304583669849241253", +// list.get("startDateStr").toString().substring(0,10),list.get("endDateStr").toString().substring(0,10)); +// for (CheckOnWorkAttendanceVo checkOnWorkAttendanceVo:workAttendanceByDates) { +// System.out.println(checkOnWorkAttendanceVo.toString()); +// } +// } + +// 设置汇总后的考勤情况 通过考勤结果进行考勤状态汇总 + public CheckOnWorkAttendanceVo setState(CheckOnWorkAttendanceVo checkOnWorkAttendanceVo){ + String shangban1 = checkOnWorkAttendanceVo.getShangban1(); + String xiaban1 = checkOnWorkAttendanceVo.getXiaban1(); + String shangban2 = checkOnWorkAttendanceVo.getShangban2(); + String xiaban2 = checkOnWorkAttendanceVo.getXiaban2(); + // 获取打卡基准时间 + Date shangbanDate1 = checkOnWorkAttendanceVo.getShangbanDate1(); + Date xiabanDate1 = checkOnWorkAttendanceVo.getXiabanDate1(); + Date shangbanDate2 = checkOnWorkAttendanceVo.getShangbanDate2(); + Date xiabanDate2 = checkOnWorkAttendanceVo.getXiabanDate2(); + String state = ""; + if(!StringUtil.isEmpty(shangban1)){ + log.info(shangban1.equals(xiaban1) && shangban1.equals(shangban2) && shangban1.equals(xiaban2)); + log.info(shangban1.equals(xiaban1) && shangban2==null && xiaban2==null); + log.info(!(shangban1.equals(xiaban1))&& shangban2==null && xiaban2==null ); + if(shangban1.equals(xiaban1) && shangban1.equals(shangban2) && shangban1.equals(xiaban2)){ + if("未打卡".equals(shangban1)){ + checkOnWorkAttendanceVo.setState("缺卡"); + }else{ + if("正常".equals(xiaban1) && + (shangbanDate1.getTime()%1800000 != 0 || xiabanDate1.getTime()%1800000 != 0|| + shangbanDate2.getTime()%1800000 != 0||xiabanDate2.getTime()%1800000 != 0)){ + checkOnWorkAttendanceVo.setState("休息并打卡"); + }else{ + checkOnWorkAttendanceVo.setState(shangban1); + } + } + }else if (shangban1.equals(xiaban1) && shangban2==null && xiaban2==null){ + if("未打卡".equals(shangban1)){ + checkOnWorkAttendanceVo.setState("缺卡"); + }else{ + if("正常".equals(shangban1) && + (shangbanDate1.getTime()%1800000 != 0 || xiabanDate1.getTime()%1800000 != 0)){ + checkOnWorkAttendanceVo.setState("休息并打卡"); + }else{ + checkOnWorkAttendanceVo.setState(shangban1); + } + } + }else if (!(shangban1.equals(xiaban1))&& shangban2==null && xiaban2==null ){ + if(!"".equals(shangban1) && !"正常".equals(shangban1) && !"null".equals(shangban1)){ + state = state+"上班1"+shangban1+","; + }if (!"".equals(xiaban1) && !"正常".equals(xiaban1) && !"null".equals(xiaban1)){ + state = state+"下班1"+xiaban1+","; + } + if(state.length()==0){ + state = "正常"; + }else{ + state = state.substring(0,state.length()-1); + } + if("正常".equals(state) && + (shangbanDate1.getTime()%1800000 != 0 || xiabanDate1.getTime()%1800000 != 0)){ + checkOnWorkAttendanceVo.setState("休息并打卡"); + }else{ + checkOnWorkAttendanceVo.setState(state); + } + + }else{ + log.info(!"".equals(shangban1)); + log.info(!"".equals(xiaban1)); + log.info(!"".equals(shangban2)); + log.info(!"".equals(xiaban2)); + if(StringUtil.isNotEmpty(shangban1) && !"正常".equals(shangban1) && !"null".equals(shangban1)){ + state = state+"上班1"+shangban1+","; + }if (StringUtil.isNotEmpty(xiaban1) && !"正常".equals(xiaban1) && !"null".equals(xiaban1)){ + state = state+"下班1"+xiaban1+","; + }if(StringUtil.isNotEmpty(shangban2) && !"正常".equals(shangban2) && !"null".equals(shangban2)){ + state = state+"上班2"+shangban2+","; + }if(StringUtil.isNotEmpty(xiaban2) && !"正常".equals(xiaban2) && !"null".equals(xiaban2)){ + state = state+"下班2"+xiaban2+","; + } + if(state.length()==0){ + state = "正常"; + }else{ + state = state.substring(0,state.length()-1); + } + if("正常".equals(state) && + (shangbanDate1.getTime()%1800000 != 0 || xiabanDate1.getTime()%1800000 != 0|| + shangbanDate2.getTime()%1800000 != 0 || xiabanDate2.getTime()%1800000 != 0)){ + checkOnWorkAttendanceVo.setState("休息并打卡"); + }else{ + checkOnWorkAttendanceVo.setState(state); + } + } + }else{ + checkOnWorkAttendanceVo.setState("休息"); + log.info("上班1为空"+shangban1); + } + + return checkOnWorkAttendanceVo; + } + +} + + +// try { +// // 获取所有打卡人 +// List> members = dingdingDao.getDingdingOaMember(); +// // 循环遍历所有打卡人信息,设置前一天的打卡情况 +// for (Map map:members) { +//// 根据打卡人信息获取一月内的打卡情况 +// log.info("设置当前考勤时间前一个月"); +// Calendar calendar = Calendar.getInstance(); +// calendar.add(Calendar.MONTH, -1); +// String lastMonth = sdf.format(calendar.getTime()); +// String memberId = map.get("oamemberid").toString(); +// int clockInNum = dingdingDao.getClockInNumBymember(lastMonth,memberId); +//// 创建考勤对象 +// CheckOnWorkAttendanceVo checkOnWorkAttendanceVo = new CheckOnWorkAttendanceVo(); +// log.info(memberId+","+clockInNum+"此人前一个月如果存在打卡情况则进行考勤对象创建"); +// if(clockInNum>0){ +//// 存在打卡情况,创建基础参数显示考勤情况显示未上班1,下班1,上班2,下班2, +// Calendar calendar1 = Calendar.getInstance(); +//// 设置日期-1 +// calendar.add(Calendar.DATE, -1); +// String yesterday = sdf.format(calendar.getTime()); +//// 查询前一天的打卡记录 +// List> clockInList = dingdingDao.getClockInBymember(yesterday,memberId); +//// 设置ID +// checkOnWorkAttendanceVo.setId(UUIDUtil.getUUIDLong()); +// checkOnWorkAttendanceVo.setMemberId(Long.parseLong(memberId)); +// checkOnWorkAttendanceVo.setCheckOnWorkAttendanceDate(calendar.getTime()); +// log.info("创建考勤对象基础参数"+checkOnWorkAttendanceVo.getId()); +//// 判断考勤时间点上打卡状态 +// for (Map clockIn:clockInList) { +//// 设置考勤相关数据 +// if("上班1".equals(clockIn.get("type").toString())){ +// checkOnWorkAttendanceVo.setShangbanDate1(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); +// checkOnWorkAttendanceVo.setShangban1(clockIn.get("state").toString()); +// }else if ("下班1".equals(clockIn.get("type").toString())){ +// checkOnWorkAttendanceVo.setXiabanDate1(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); +// checkOnWorkAttendanceVo.setXiaban1(clockIn.get("state").toString()); +// }else if ("上班2".equals(clockIn.get("type").toString())){ +// checkOnWorkAttendanceVo.setShangbanDate2(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); +// checkOnWorkAttendanceVo.setShangban2(clockIn.get("state").toString()); +// }else if ("下班2".equals(clockIn.get("type").toString())){ +// checkOnWorkAttendanceVo.setXiabanDate2(simpleDateFormat.parse(clockIn.get("referenceDate").toString())); +// checkOnWorkAttendanceVo.setXiaban2(clockIn.get("state").toString()); +// } +// } +// checkOnWorkAttendanceVo = setState(checkOnWorkAttendanceVo); +// log.info("考勤对象"+checkOnWorkAttendanceVo.toString()); +// }else{ +//// 不存在打卡情况,创建未打卡数据 +// checkOnWorkAttendanceVo.setId(UUIDUtil.getUUIDLong()); +// checkOnWorkAttendanceVo.setMemberId(Long.parseLong(memberId)); +// checkOnWorkAttendanceVo.setCheckOnWorkAttendanceDate(calendar.getTime()); +// checkOnWorkAttendanceVo.setShangban1("未打卡"); +// checkOnWorkAttendanceVo.setXiaban1("未打卡"); +// checkOnWorkAttendanceVo.setShangban2("未打卡"); +// checkOnWorkAttendanceVo.setXiaban2("未打卡"); +// checkOnWorkAttendanceVo.setState("休息"); +// log.info("休息时间考勤对象"+checkOnWorkAttendanceVo.toString()); +// } +//// 保存打卡数据到数据库表中 +// int addin = dingdingDao.addCheckOnWorkAttendance(checkOnWorkAttendanceVo); +// +// log.info("人员考勤信息添加失败,当前考勤人员为:"+checkOnWorkAttendanceVo.getMemberId()+"添加信息条数为"+addin); +//// 根据单据修改当前人员一月内的考勤情况 +// +//// calendar表示时间前一个月的时间点。查询 单据结束时间在查询开始时间之后并且单据开始时间在查询结束时间之前的单据 +//// 查询当前人员一年内的请假单 map : 人员,请假类型,开始时间 ,结束时间 +// List> leaves = dingdingDao.getLeave(memberId,sdf.format(calendar.getTime()),sdf.format(new Date())); +// leaveUpdateWorkAttendance(leaves,memberId); +// +//// 查询当前人员一年内的出差单 map : 人员,请假类型,开始时间 ,结束时间 +// List> evections = dingdingDao.getEvections(memberId,sdf.format(calendar.getTime()),sdf.format(new Date())); +// evectionUpdateWorkAttendance(evections,memberId); +// +//// 查询当前人员一年内的加班单 +// List> overtimes = dingdingDao.getOvertime(memberId,sdf.format(calendar.getTime()),sdf.format(new Date())); +// overtimesUpdateWorkAttendance(overtimes,memberId); +// +//// 查询当前人员一年内的补卡单s +// List> makeCard = dingdingDao.getMakeCard(memberId,sdf.format(calendar.getTime()),sdf.format(new Date())); +// makeCardUpdateWorkAttendance(makeCard,memberId); +// +//// 查询当前人员一年内的调休单 map : 人员,请假类型,开始时间 ,结束时间 +// List> adjustLeaves = dingdingDao.getAdjustLeave(memberId,sdf.format(calendar.getTime()),sdf.format(new Date())); +// leaveUpdateWorkAttendance(adjustLeaves,memberId); +// } +// } catch (BusinessException e) { +// e.printStackTrace(); +// } catch (SQLException e) { +// e.printStackTrace(); +// } catch (ParseException e) { +// e.printStackTrace(); +// } +// +// +// log.info("开始设置考勤信息"); \ No newline at end of file diff --git a/src/com/seeyon/apps/src_dingding/task/DingdingTask.java b/src/com/seeyon/apps/src_dingding/task/DingdingTask.java new file mode 100644 index 0000000..6519c3e --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/task/DingdingTask.java @@ -0,0 +1,121 @@ +package com.seeyon.apps.src_dingding.task; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_dingding.service.DingdingService; +import com.seeyon.ctp.common.AppContext; +//import com.seeyon.apps.src_automatic.task.PushAuCardTask; +//import com.seeyon.apps.src_bill_detail.manager.PushZcService; +import com.seeyon.ctp.common.quartz.QuartzHolder; +import com.seeyon.ctp.common.quartz.QuartzJob; +import com.seeyon.ctp.util.SDFCoder; +import com.seeyon.ctp.util.UUIDLong; +import com.seeyon.ctp.util.json.JSONUtil; + +/** + * 自动计算任务 + */ +public class DingdingTask implements QuartzJob { + + /** 日志管理器 */ + private final static Log log = LogFactory.getLog(DingdingTask.class); + + /** 定义的任务插件ID */ +// private static String jobBeanId="pushCardTask"; + + /** 定义的任务名称 */ +// public static String jobName="QuartzPushCardTask"; + + /** 定义的任务插件ID */ + private static String jobBeanId="dingdingTask"; + + /** 定义的任务名称 */ + public static String jobName="QuartzDingdingTask"; + +// private PushZcService pushZcService; + + private volatile boolean running; + + private DingdingService dingdingService; + + public DingdingService getDingdingService() { + if (dingdingService == null) { + dingdingService = (DingdingService) AppContext.getBean("dingdingService"); + } + return dingdingService; } + + public void setDingdingService(DingdingService dingdingService) { + this.dingdingService = dingdingService; + } + + /** + * {@inheritDoc} + */ + @Override + public void execute(Map parameters) { + if(running) { + log.info("上次推送还在执行中,跳过本次数据推送"); + return; + } + try { + getDingdingService().dingdingdept(); + getDingdingService().dingdingmember(); + getDingdingService().dingdingclockin(); + getDingdingService().setWorkAttendance(); + } catch(Exception e) { + log.error("发生异常:", e); + } finally { + this.running = false; + } + } + + /** + * interval 如果是true,则是间隔执行 + */ + public static void registerSyncTask(boolean interval, int our, int minute) { +// jobBeanId = "pushCardTask"; +// jobName = "QuartzPushCardTask"; + jobBeanId = "dingdingTask"; + jobName = "QuartzDingdingTask"; + log.info("注册预算定时计算任务" + jobName + "..."); + try { + // 先删除任务 + QuartzHolder.deleteQuartzJob(jobName); + // 设定时间 每天同步的 + // if ("aa".length() > 5) { + if(interval) { + int delta = (our * 60 + minute) * 60 * 1000; + Map parameters = new HashMap(); + QuartzHolder.newQuartzJob(jobName, new Date(), delta, jobBeanId, parameters); + } else { + Map parameters = new HashMap(); + // 设置时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); // 年月日 也可以具体到时分秒如calendar.set(2015, 10, 12,11,32,52); + // 每日运行,只要改动 时间即可 + calendar.set(Calendar.HOUR_OF_DAY, our); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, 00); + Date date = calendar.getTime();// date就是你需要的时间 + QuartzHolder.newQuartzJobPerDay(null, jobName, date, jobBeanId, parameters); + log.info("定时计算任务" + jobName + ",成功"); + } + } catch (Exception e) { + log.error("注册定时计算任务失败", e); + } + } + +// public void setPushZcService(PushZcService pushZcService) { +// this.pushZcService = pushZcService; +// } +} diff --git a/src/com/seeyon/apps/src_dingding/util/BaseUtil.java b/src/com/seeyon/apps/src_dingding/util/BaseUtil.java new file mode 100644 index 0000000..065db59 --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/util/BaseUtil.java @@ -0,0 +1,110 @@ +package com.seeyon.apps.src_dingding.util; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + + +/** + * sql执行工具类 + * 2021-06-08 + * @author huangzhengguo + * + */ +public class BaseUtil { + + + PreparedStatement ps = null; + ResultSet res = null; + Connection conn =null; + /** + * sql查询工具 + * @param sql sql语句 + * @param params sql参数 + * @return 结果集 + */ + public ResultSet executeQuery(String sql, Object[] params) + { + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + for(int i = 0; i < params.length; i++){ + ps.setObject(i+1, params[i]); + } + res = ps.executeQuery(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return res; + } + /** + * sql更新工具 + * @param sql + * @param params + * @return + */ + public int executeUpdate(String sql, Object[] params) + { + int res = 0; + conn = JdbcUtil.getConnection(); + try { + ps = conn.prepareStatement(sql); + for(int i = 0; i < params.length; i++) + { + ps.setObject(i+1, params[i]); + } + res = ps.executeUpdate(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return res; + } + + + public void close() { + release(res,null,conn,ps); + } + //定义一个释放资源的方法; + /* + * 定义一个方法: 释放资源: 直接将rs stmt conn 全部释放: + */ + public static void release(ResultSet rs ,Statement stmt , Connection conn,PreparedStatement ps){ + if(rs!=null){ + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + rs=null; + } + if(stmt!=null){ + try { + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + stmt=null; + } + if(conn!=null){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + conn=null; + } + if(ps!=null){ + try { + ps.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + ps=null; + } + + } +} diff --git a/src/com/seeyon/apps/src_dingding/util/DingtalkUtil.java b/src/com/seeyon/apps/src_dingding/util/DingtalkUtil.java new file mode 100644 index 0000000..431aa1d --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/util/DingtalkUtil.java @@ -0,0 +1,127 @@ +package com.seeyon.apps.src_dingding.util; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.dingtalk.api.DefaultDingTalkClient; +import com.dingtalk.api.DingTalkClient; +import com.dingtalk.api.request.OapiGettokenRequest; +import com.dingtalk.api.response.OapiGettokenResponse; +import com.taobao.api.ApiException; + +public class DingtalkUtil { + + public String getToken() throws RuntimeException, ApiException, FileNotFoundException, IOException { +// DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); + DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); + OapiGettokenRequest request = new OapiGettokenRequest(); + request.setAppkey("dingtiefuskr6oycl5ah"); + request.setAppsecret("5V_zIyAXU3Fx0yl20uxGotc3zIdrAXnKERat_ciEez0u3jqaVjosQhlflu5-83St"); + request.setHttpMethod("GET"); + OapiGettokenResponse response = client.execute(request); + JSONObject jsonObject = JSON.parseObject(response.getBody()); + String token = jsonObject.getString("access_token"); + return token; + } + + + /** + * 调用post接口 + * + * @param str 调用接口传递的参数json + * @param urlStr 需要调用的url对应的参数文件中的编码 + * @return + * @throws ApiException + * @throws RuntimeException + */ + public JSONObject doPost(String str, String urlStr) throws RuntimeException, ApiException { + HttpURLConnection connection = null; + InputStream is = null; + OutputStream os = null; + BufferedReader br = null; + String result = null; + try { + String token = getToken(); + URL url = new URL(urlStr+"?access_token="+token); + // 通过远程url连接对象打开连接 + connection = (HttpURLConnection) url.openConnection(); + // 设置连接请求方式 + connection.setRequestMethod("POST"); + // 设置连接主机服务器超时时间:15000毫秒 + connection.setConnectTimeout(15000); + // 设置读取主机服务器返回数据超时时间:60000毫秒 + connection.setReadTimeout(60000); + + // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true + connection.setDoOutput(true); + // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无 + connection.setDoInput(true); + // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。 +// connection.setRequestProperty("access_token", token); + connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + // 通过连接对象获取一个输出流 + os = connection.getOutputStream(); + // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的 + if (!("".equals(str) || str == null)) { + os.write(str.getBytes("UTF-8")); + } + // 连接对象获取一个输入流,向远程读取 + System.out.println(connection.getResponseCode()); + if (connection.getResponseCode() == 200) { + is = connection.getInputStream(); + // 对输入流对象进行包装:charset根据工作项目组的要求来设置 + br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + + StringBuffer sbf = new StringBuffer(); + String temp = null; + // 循环遍历一行一行读取数据 + while ((temp = br.readLine()) != null) { + sbf.append(temp); + sbf.append("\r\n"); + } + result = sbf.toString(); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + // 关闭资源 + if (null != br) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != os) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (null != is) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // 断开与远程地址url的连接 + connection.disconnect(); + } + JSONObject json = JSONObject.parseObject(result); + return json; + + } +} diff --git a/src/com/seeyon/apps/src_dingding/util/FormExportUtil.java b/src/com/seeyon/apps/src_dingding/util/FormExportUtil.java new file mode 100644 index 0000000..af0e02c --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/util/FormExportUtil.java @@ -0,0 +1,111 @@ +package com.seeyon.apps.src_dingding.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.v3x.services.form.bean.RecordExport; +import com.seeyon.v3x.services.form.bean.SubordinateFormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; + +//创建无流程表单数据处理工具类 +public class FormExportUtil { + + /** + * 设置主表信息 + * @param map 设置主表字段。Map<主表显示名称,主表数据> + * @return + */ + public List setFormValue(Map map){ +// 创建返回值对象 + List valueExports = new ArrayList(); + ValueExport valueExport ; +// 获取参数信息(显示名称) + Set keys = map.keySet(); + if(keys.size()>0) { +// 对控件赋值 + for (String key : keys) { + valueExport = new ValueExport(); + valueExport.setDisplayName(key); + valueExport.setValue(map.get(key)); + valueExports.add(valueExport); + } + } + return valueExports; + } + + /** + * 设置从表信息 + * @param lists 设置主表字段。List> + */ + public List setSubordinateFormValue(List> lists){ + List subordinateFormExports = new ArrayList(); + SubordinateFormExport subordinateFormExport = new SubordinateFormExport(); + List recordExports = new ArrayList(); + List valueExports; + RecordExport recordExport; + for(int i = 0 ; i < lists.size() ; i++) { + recordExport = new RecordExport(); + valueExports = setFormValue(lists.get(i)); + recordExport.setRecord(valueExports); + recordExports.add(recordExport); + } + subordinateFormExport.setValues(recordExports); + subordinateFormExports.add(subordinateFormExport); + + return subordinateFormExports; + } + + + /** + * 格式转换将{"id":1,"str1":"123","str2":"asd","str3":"qwe"},{"id":2,"str1":"123","str2":"asd","str3":"qwe"},{"id":3,"str1":"123","str2":"asd","str3":"qwe"},{"id":1,"str1":"123","str2":"asd","str3":"qwe"},{"id":2,"str1":"123","str2":"asd","str3":"qwe"},{"id":3,"str1":"123","str2":"asd","str3":"qwe"}] + 有什么办法转换成 + [{"id":1,"data":[{"id":1,"str1":"123","str2":"asd","str3":"qwe"},{"id":1,"str1":"123","str2":"asd","str3":"qwe"}]}{"id":2,"data":[{"id":2,"str1":"123","str2":"asd","str3":"qwe"},{"id":2,"str1":"123","str2":"asd","str3":"qwe"}]}{"id":3,"data":[{"id":3,"str1":"123","str2":"asd","str3":"qwe"},{"id":3,"str1":"123","str2":"asd","str3":"qwe"}]}] + * @param inputList + * @return + */ + public List> transformData(JSONArray inputList) { + Map>> groupedData = new HashMap<>(); + for(int i = 0 ; i < inputList.size();i++) { + String userId = inputList.getJSONObject(i).getString("userId"); + + groupedData.computeIfAbsent(userId, k -> new ArrayList<>()).add(inputList.getJSONObject(i)); + } + + List> result = new ArrayList<>(); + + for (Map.Entry>> entry : groupedData.entrySet()) { + Map resultMap = new HashMap<>(); + resultMap.put("userId", entry.getKey()); + resultMap.put("data", entry.getValue()); + result.add(resultMap); + } + + return result; + } + + + + public JSONArray dingdingTimeSequence (JSONArray datas){ + + for (int i = 0; i < datas.size() - 1; i++) { + for (int j = 0; j < datas.size() - i - 1; j++) { + String value1 = datas.getJSONObject(j).getString("baseCheckTime"); + String value2 = datas.getJSONObject(j + 1).getString("baseCheckTime"); + long long1 = Long.parseLong(value1); + long long2 = Long.parseLong(value2); + if (long1 > long2) { + JSONObject temp = datas.getJSONObject(j); + datas.set(j, datas.getJSONObject(j + 1)); + datas.set(j + 1, temp); + } + } + } + return datas; + } + +} diff --git a/src/com/seeyon/apps/src_dingding/util/JdbcUtil.java b/src/com/seeyon/apps/src_dingding/util/JdbcUtil.java new file mode 100644 index 0000000..ca36feb --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/util/JdbcUtil.java @@ -0,0 +1,93 @@ +package com.seeyon.apps.src_dingding.util; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import com.seeyon.apps.src_dingding.kit.PropKit; + + + +/** + * jdbc工具类 + * 2021-06-08 + * @author huangzhengguo + * + */ + public class JdbcUtil { + private static String url; + private static String user; + private static String password; + + static { + // 使用properties加载属性文件 +// Properties prop = new Properties(); + try { +// InputStream is = JdbcUtil.class.getClassLoader().getResourceAsStream("jdbc.properties"); +// prop.load(is); + // 注册驱动(获取属性文件中的数据) +// String driverClassName = prop.getProperty("jdbc_driver"); + System.out.println(PropKit.getProp(PropKit.JDBCDRIVER)); + String driverClassName = PropKit.getProp(PropKit.JDBCDRIVER); + Class.forName(driverClassName); + // 获取属性文件中的url,username,password +// url = prop.getProperty("jdbc_url"); + System.out.println(PropKit.getProp(PropKit.JDBCURL)); + url = PropKit.getProp(PropKit.JDBCURL); +// user = prop.getProperty("jdbc_user"); + System.out.println(PropKit.getProp(PropKit.JDBCUSER)); + user = PropKit.getProp(PropKit.JDBCUSER); +// password = prop.getProperty("jdbc_password"); + System.out.println(PropKit.getProp(PropKit.JDBCPASSWORD)); + password = PropKit.getProp(PropKit.JDBCPASSWORD); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 获取数据库连接 + public static Connection getConnection() { + Connection conn = null; + try { + conn = DriverManager.getConnection(url, user, password); + } catch (SQLException e) { + e.printStackTrace(); + } + return conn; + } + + // 释放资源 + public static void close(Connection conn, Statement stat, ResultSet rs) { + close(conn, stat); + if (rs != null) { + try { + rs.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + // 释放资源 + public static void close(Connection conn, Statement stat) { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + if (stat != null) { + try { + stat.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/seeyon/apps/src_dingding/util/TimeUtil.java b/src/com/seeyon/apps/src_dingding/util/TimeUtil.java new file mode 100644 index 0000000..4a14e50 --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/util/TimeUtil.java @@ -0,0 +1,66 @@ +package com.seeyon.apps.src_dingding.util; + +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.ctpenumnew.manager.EnumManager; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.common.po.ctpenumnew.CtpEnumItem; +import com.seeyon.ctp.util.JDBCAgent; + +public class TimeUtil { + + private EnumManager enumManagerNew; + public EnumManager getEnumManager() { + if (this.enumManagerNew == null) { + this.enumManagerNew = ((EnumManager)AppContext.getBean("enumManagerNew")); + } + return enumManagerNew; + } + + public void setEnumManagerNew(EnumManager enumManagerNew) { + this.enumManagerNew = enumManagerNew; + } + +// 获取定时任务的同步频率 + public String getTime() { + JDBCAgent agent = new JDBCAgent(); + String time = ""; +// String sqlString = "select field0001,field0002,field0003 from formmain_0067"; + String sqlString = "select field0044,field0042,field0043 from formmain_1224"; + try { + StringBuilder sql = new StringBuilder(sqlString); + List p = new ArrayList(); + agent.execute(sql.toString(), p); + List list = agent.resultSetToList(); + Map map = list.get(0); + Long enumid = Long.parseLong(map.get("field0044").toString()); + String shi = map.get("field0042").toString(); + String fen = map.get("field0043").toString(); + String str = getEnumManager().getEnumItem(enumid).getValue(); + if("0".equals(str)) { + time = "I-"+shi+","+fen; + }else { + time = "D-"+shi+","+fen; + } + } catch (BusinessException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + }finally { + if (agent != null) { + agent.close(); + } + } + return time; + } + + +} diff --git a/src/com/seeyon/apps/src_dingding/vo/CheckOnWorkAttendanceVo.java b/src/com/seeyon/apps/src_dingding/vo/CheckOnWorkAttendanceVo.java new file mode 100644 index 0000000..2271c06 --- /dev/null +++ b/src/com/seeyon/apps/src_dingding/vo/CheckOnWorkAttendanceVo.java @@ -0,0 +1,142 @@ +package com.seeyon.apps.src_dingding.vo; + +import java.util.Date; + +public class CheckOnWorkAttendanceVo { + + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Date getCheckOnWorkAttendanceDate() { + return checkOnWorkAttendanceDate; + } + + public void setCheckOnWorkAttendanceDate(Date checkOnWorkAttendanceDate) { + this.checkOnWorkAttendanceDate = checkOnWorkAttendanceDate; + } + + public Date getShangbanDate1() { + return shangbanDate1; + } + + public void setShangbanDate1(Date shangbanDate1) { + this.shangbanDate1 = shangbanDate1; + } + + public String getShangban1() { + return shangban1; + } + + public void setShangban1(String shangban1) { + this.shangban1 = shangban1; + } + + public Date getXiabanDate1() { + return xiabanDate1; + } + + public void setXiabanDate1(Date xiabanDate1) { + this.xiabanDate1 = xiabanDate1; + } + + public String getXiaban1() { + return xiaban1; + } + + public void setXiaban1(String xiaban1) { + this.xiaban1 = xiaban1; + } + + public Date getShangbanDate2() { + return shangbanDate2; + } + + public void setShangbanDate2(Date shangbanDate2) { + this.shangbanDate2 = shangbanDate2; + } + + public String getShangban2() { + return shangban2; + } + + public void setShangban2(String shangban2) { + this.shangban2 = shangban2; + } + + public Date getXiabanDate2() { + return xiabanDate2; + } + + public void setXiabanDate2(Date xiabanDate2) { + this.xiabanDate2 = xiabanDate2; + } + + public String getXiaban2() { + return xiaban2; + } + + public void setXiaban2(String xiaban2) { + this.xiaban2 = xiaban2; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public long getMemberId() { + return memberId; + } + + public void setMemberId(long memberId) { + this.memberId = memberId; + } +// 数据ID + private long id; +// 考勤人员Id + private long memberId; +// 考勤日期 CHECKONWORKATTENDANCEDATE + private Date checkOnWorkAttendanceDate; +// 上班1基准时间 + private Date shangbanDate1; +// 上班1打卡状态 + private String shangban1; +// 下班1基准时间 + private Date xiabanDate1; +// 下班1打卡状态 + private String xiaban1; +// 上班2基准时间 + private Date shangbanDate2; +// 上班2打卡状态 + private String shangban2; +// 下班2基准时间 + private Date xiabanDate2; +// 下班2打卡状态 + private String xiaban2; +// 整体打卡状态 + private String state; +// 考勤组 + private String groupName; + + @Override + public String toString() { + return id+","+memberId + ",上班1:"+shangban1+",上班1基准"+shangbanDate1 + ",下班1:"+xiaban1+",下班1基准"+xiabanDate1+ + ",上班2:"+shangban2+",上班2基准"+shangbanDate2+",下班2:"+xiaban2+",下班2基准"+xiabanDate2+",状态:"+state+",考勤组名称:"+groupName; + } +} diff --git a/src/com/seeyon/apps/src_qyba/FVCommonNode.java b/src/com/seeyon/apps/src_qyba/FVCommonNode.java new file mode 100644 index 0000000..b779422 --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/FVCommonNode.java @@ -0,0 +1,169 @@ +package com.seeyon.apps.src_qyba; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.common.workflow.constants.WorkFlowType; +import com.seeyon.apps.common.workflow.node.ACommonSuperNode; +import com.seeyon.apps.ext.workflow.vo.FieldDataVo; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.ext.workflow.vo.SuperNodeContext; +import com.seeyon.apps.src_qyba.constants.FVConstants; +import com.seeyon.apps.src_qyba.service.FVService; +import com.seeyon.apps.src_qyba.util.FanWeiUtil; +import com.seeyon.cap4.form.bean.FormDataMasterBean; +import com.seeyon.ctp.common.AppContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import www.seeyon.com.utils.StringUtil; + +import java.util.HashMap; +import java.util.Map; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/2/27 + */ +public abstract class FVCommonNode extends ACommonSuperNode { + private final static Log log = LogFactory.getLog(FVCommonNode.class); + protected ICstConfigApi cstConfigApi = (ICstConfigApi) AppContext.getBean("cstConfigApi"); + + @Autowired + FVService fvService; + + @Override + public String getPluginId() { + return FVConstants.getPluginId(); + } + + @Override + public String getFormParse() { + return "json"; + } + + @Override + public WorkFlowType[] getTypes() { + return new WorkFlowType[] {WorkFlowType.superNode}; + } + + public ConfigVo getFVConfig() { + return cstConfigApi.getConfig(getPluginId()); + } + + + @Override + public SuperNodeContext proceed(String request, FormDataVo formDataVo, FormDataMasterBean formDataMasterBean) throws Exception { + SuperNodeContext context = new SuperNodeContext(); + log.info("进入区域备案处理超级节点中"); + try { + FieldDataVo fhjg = formDataVo.getFieldData("返回结果"); + String value = fhjg.getStringValue(); + if(value.startsWith("推送经销商平台成功")) { + return context.success("跳过:" + value); + } + } catch (Exception e) { + context.setErrMsg("调用失败:"+e); + context.setException(true); + context.back("调用失败:"+e); + } + ConfigVo configVo = getFVConfig(); + context.setNeedSave(true); + String url = ""; +// 进行新老接口分发 + FieldDataVo xttb = formDataVo.getFieldData("系统同步"); + String xttbvalue = xttb.getStringValue(); + String s = ""; + Map parm = new HashMap(); + if("CRM".equals(xttbvalue) || StringUtil.isEmpty(xttbvalue)){ + url = configVo.getParamVal(FVConstants.fvOldUrl.name()); +// 设置附件路径 + JSONArray filePath = fvService.getFilePath(formDataVo,configVo); +// 参数封装 + parm = FVService.createWF(filePath,formDataVo,configVo); + //调用新建接口 + String userid = formDataVo.getFieldData("经办人").getStringValue(); + s = FanWeiUtil.PostRestful(parm, userid,configVo); + } if ("NCRM".equals(xttbvalue) || StringUtil.isEmpty(xttbvalue)){ + url = configVo.getParamVal(FVConstants.fvNewUrl.name()); + // 设置附件路径 + JSONArray filePath = fvService.getFilePath(formDataVo,configVo); + //封装参数 + parm = FVService.createNewWF(filePath,formDataVo,configVo); + //调用新建接口 + String userid = formDataVo.getFieldData("经办人").getStringValue(); + s = FanWeiUtil.NewPostRestful(parm, userid,configVo); + } + JSONObject returnMsg = JSONObject.parseObject(s); + Object code = returnMsg.get("code"); + log.info("新建code:" + code); + Map map = new HashMap<>(); + if ("SUCCESS".equals(code.toString())) { + //调用提交接口 + map.put("code", "200"); + map.put("msg", "推送成功"); + map.put("request", parm.toString()); + map.put("response", s); + } else { +// Map data = (Map) returnMsg.get("errMsg"); + map.put("code", "300"); + map.put("msg", "新建流程失败!"+returnMsg.getString("msg")); + map.put("request", parm.toString()); + map.put("response", s); + } + try{ + context.setRequest(map.get("request").toString()); + context.setResponse(map.get("response").toString()); + Object jsoncode = map.get("code"); + if ("200".equals(jsoncode.toString())) { + context.success(map.get("msg").toString(), false); + formDataVo.getNewFieldDataMap().put("返回结果",map.get("msg").toString()); + } else { + context.setErrMsg(map.get("msg").toString()); + context.setException(true); + context.back("推送失败:" +map.get("msg").toString()); + formDataVo.getNewFieldDataMap().put("返回结果","推送失败:"+map.get("msg").toString()); + } + }catch (Exception e){ + context.setException(true); + context.back("推送失败:OA处理异常:" + e.getMessage()); + formDataVo.getNewFieldDataMap().put("返回结果","推送失败:OA处理异常:"+map.get("msg").toString()); + } + + return context; + } + public abstract String getMethod(); +} + +// url += getMethod(); +// context.setRequest(request); +// context.setUrl(url); +// try { +// String response = FVHttpUtil.doPost(url, "", configVo.getParamVal(FVConstants.fvOldUrl.name()), configVo.getParamVal(FVConstants.client_security.name())); +// context.setResponse(response); +// FVResponse fvResponse = FVHttpUtil.parseResponse(response); +// if(fvResponse.isSuccess()) { +// context.success("推送BIP成功:" + fvResponse.getMsg(), false); +// formDataVo.getNewFieldDataMap().put("返回结果", "推送成功:" + fvResponse.getMsg()); +// } else { +// context.setErrMsg(fvResponse.getMsg()); +// context.setException(true); +// context.back("推送BIP失败:" + fvResponse.getMsg()); +// formDataVo.getNewFieldDataMap().put("返回结果", "推送失败:" + fvResponse.getMsg()); +// } +// } catch (Exception e) { +// context.setException(true); +// context.back("推送BIP失败:OA处理异常:" + e.getMessage()); +// formDataVo.getNewFieldDataMap().put("返回结果", "推送失败:OA处理异常" + e.getMessage()); +// } + + + + + diff --git a/src/com/seeyon/apps/src_qyba/QYBAPluginApi.java b/src/com/seeyon/apps/src_qyba/QYBAPluginApi.java new file mode 100644 index 0000000..7b3a33f --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/QYBAPluginApi.java @@ -0,0 +1,40 @@ +package com.seeyon.apps.src_qyba; + +import com.seeyon.apps.src_qyba.constants.FVConstants; +import com.seeyon.apps.common.plugin.api.APluginInfoApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: huangzhengguo + * @Date: 2024/03/04 + */ +public class QYBAPluginApi extends APluginInfoApi { + + @Override + public String getPluginId() { + return FVConstants.getPluginId(); + } + + @Override + public String getCreateUser() { + return "湖北橙阳"; + } + + @Override + public ConfigVo getDefaultConfig() { + ConfigVo configVo = new ConfigVo(); + for (FVConstants value : FVConstants.values()) { + if(value != FVConstants.plugin) { + configVo.getDevParams().put(value.name(), value.getDefaultValue()); + configVo.getProdParams().put(value.name(), value.getDefaultValue()); + configVo.getParamMap().put(value.name(), value.getDescription()); + } + } + return configVo; + } +} diff --git a/src/com/seeyon/apps/src_qyba/constants/FVConstants.java b/src/com/seeyon/apps/src_qyba/constants/FVConstants.java new file mode 100644 index 0000000..ff561cc --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/constants/FVConstants.java @@ -0,0 +1,42 @@ +package com.seeyon.apps.src_qyba.constants; + +public enum FVConstants { + plugin("src_qyba","插件ID"), + fvOldUrl("http://10.1.90.21:9083", "旧经销商平台地址"), + fvNewUrl("http://10.1.90.21:9083", "新经销商平台地址"), + workflowId("8521", "workflowId"), + newWorkflowId("2026", "newWorkflowId"), + dowurl("https://oa.dhx.com.cn/seeyon/rest/attachment/file", "dowurl"), + addRess("https://crm.dhx9.com", "addRess"), + newAddRess("http://10.0.6.15:88", "newAddRess"), + spk("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAymEn8vp0E8pg6op/WXJ4A67jHAYeUBtut8vJgk09t4Bw3kheWnHUjVHDBEZ8iC/iX9YyBzL76WZR+lpDqdFh2iKYk+yctHKc4dt9r0vw6HYMUWDrYmctdKJtdOGpWxz4apBr7Rc/2A3FDxwsiXzPqpG/GY+/1IHp7E3jEX0nxzuJn/YUm/SoSgfMB4NCHF9n3rrIsp4jJ5SOSwLr68nlwT3djF2f8vQcqRxmT0J7X2xKehlpeiubszQj5TeFcA+onkOBKkoKc+83G8Gg8J1IWZLsd50cjawrmg8lxl+UBEsPZHEh0AhWDHKLRG+9jyZJ94hoWaQRSgwEIdGyShNMnwIDAQAB", "SPK"), + newspk("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvcOew5NM41jK7CFBnirP4Zz0QIexYEweS+4LTuQOVY+BqHu2EMxlPYRsjtvzZj7Pm9SsiNiEIeGXZ3mkAMbNNqu7G7kGb10pJzpBBTE80cRCY0bHoD3PhD8cBiKjpsRXJ+1mPdwD4fGEr0IcG6bKhBM3xsCmc4JiEvsv/+nPm9G7NQgoPGEKHkZk0IgyaBF5m6F2NKah92klxuz+vWCQoVsCpCjHN1sijQioWc6lRLgP7d6IZFEbOrLL7HdlOc8yKOAOZhURd78CqiVYBc1vP0pyC1/UW0Lq0f2MFpg/7Z18VwAf1vFUb+oiIdjFYMr5dgS+i784FaMUDzKUvndDWwIDAQAB", "NEWSPK"), + tongyongApi("/api/workflow/paService/doCreateRequest", "tongyongApi"), + appId("oa", "appId"), + secret("b44da0ec-6ba5-4d6e-b3d7-e0571b3bcdd6", "secret"), + newSecret("6553bad7-51f0-4d56-af44-3d64a8ce9814", "newSecret"), + client_security("30dcf9a3cfef4b98a157e926db6369f0", "client_security"), + dsname("BIPKF", "dsname"), + busicentercode("sxbip", "busicentercode"); + + FVConstants(String defaultValue, String description) { + this.defaultValue = defaultValue; + this.description = description; + } + + private String defaultValue; + private String description; + + public String getDefaultValue() { + return defaultValue; + } + + public String getDescription() { + return description; + } + + public static String getPluginId() { + return plugin.defaultValue; + } + +} diff --git a/src/com/seeyon/apps/src_qyba/node/FVNewZhengceNode.java b/src/com/seeyon/apps/src_qyba/node/FVNewZhengceNode.java new file mode 100644 index 0000000..04010ba --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/node/FVNewZhengceNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.src_qyba.node; + +import com.seeyon.apps.src_qyba.FVCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/2/27 + */ +public class FVNewZhengceNode extends FVCommonNode { + + @Override + public String getMethod() { + return ""; + } + + @Override + public String getNodeId() { + return "fvNewZhengceNode"; + } + + @Override + public String getNodeName() { + return "新平台政策推送BIP"; + } +} \ No newline at end of file diff --git a/src/com/seeyon/apps/src_qyba/node/FVOldZhengceNode.java b/src/com/seeyon/apps/src_qyba/node/FVOldZhengceNode.java new file mode 100644 index 0000000..3748ce8 --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/node/FVOldZhengceNode.java @@ -0,0 +1,30 @@ +package com.seeyon.apps.src_qyba.node; + +import com.seeyon.apps.src_qyba.FVCommonNode; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/2/27 + */ +public class FVOldZhengceNode extends FVCommonNode { + + @Override + public String getMethod() { + return ""; + } + + @Override + public String getNodeId() { + return "fvOldZhengceNode"; + } + + @Override + public String getNodeName() { + return "老平台政策推送BIP"; + } +} \ No newline at end of file diff --git a/src/com/seeyon/apps/src_qyba/service/FVService.java b/src/com/seeyon/apps/src_qyba/service/FVService.java new file mode 100644 index 0000000..fd2fb47 --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/service/FVService.java @@ -0,0 +1,299 @@ +package com.seeyon.apps.src_qyba.service; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.common.plugin.vo.ConfigVo; + +import com.seeyon.apps.daohuaxiangSys.jkts.util.InterfaceListUtil; +import com.seeyon.apps.daohuaxiangSys.jkts.util.PropKit; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; + +import com.seeyon.apps.src_qyba.constants.FVConstants; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.SystemEnvironment; +import com.seeyon.ctp.common.filemanager.manager.AttachmentManager; +import com.seeyon.ctp.common.po.filemanager.Attachment; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.IOException; +import java.util.*; + +public class FVService { + + private final static Log log = LogFactory.getLog(FVService.class); + + private AttachmentManager attachmentManager; + + public void setAttachmentManager(AttachmentManager attachmentManager) { + this.attachmentManager = attachmentManager; + } + + public AttachmentManager getAttachmentManagery() { + if (attachmentManager == null) { + attachmentManager = (AttachmentManager) AppContext.getBean("attachmentManager"); + } + return attachmentManager; + } + + public JSONArray getFilePath(FormDataVo formDataVo,ConfigVo configVo) throws Exception { + String pathId = formDataVo.getFieldData("上传附件").getStringValue(); + //附件 + JSONArray faths = null; + if (pathId == null || "".equals(pathId)) { + faths = new JSONArray(); + } else { + faths = getPathUrl(pathId,configVo); + } + return faths; + } + public JSONArray getnewFilePath(FormDataVo formDataVo,ConfigVo configVo) throws Exception { + String pathId = formDataVo.getFieldData("上传附件").getStringValue(); + //附件 + JSONArray faths = null; + if (pathId == null || "".equals(pathId)) { + faths = new JSONArray(); + } else { + faths = getPathUrl(pathId,configVo); + } + return faths; + } + + + + + + /** + * 创建流程 + */ + public static Map createWF( JSONArray faths, FormDataVo formDataVo, ConfigVo configVo) throws NoSuchFieldException, IOException { + //主表信息 + List mainlist = new ArrayList(); + //客户名称 +// JSONObject mainmap1 = new JSONObject(); +// mainmap1.put("fieldName","khmc");//OA字段名-出差类型(下拉框) +// mainmap1.put("fieldValue",formDataVo.getFieldData("客户id").getStringValue());//字段值(下拉框选项值) +// mainlist.add(mainmap1); + + //标题 + Map mainmap2 = new HashMap(); + mainmap2.put("fieldName","bt");//OA字段名-同行人员(多人力资源浏览框) + mainmap2.put("fieldValue",formDataVo.getFieldData("表头").getStringValue());//字段值(OA人员ID,多个以英文逗号分隔) + mainlist.add(mainmap2); + + //单号 + Map mainmap3 = new HashMap(); + mainmap3.put("fieldName","dh"); + mainmap3.put("fieldValue",formDataVo.getFieldData("流水号").getStringValue()); + mainlist.add(mainmap3); + + //申请日期 + Map mainmap4 = new HashMap(); + mainmap4.put("fieldName","sqrq"); + mainmap4.put("fieldValue",formDataVo.getFieldData("申请日期").getStringValue()); + mainlist.add(mainmap4); + + //投入金额 + Map mainmap5 = new HashMap(); + mainmap5.put("fieldName","trje"); + mainmap5.put("fieldValue",formDataVo.getFieldData("投入金额").getStringValue()); + mainlist.add(mainmap5); + + //备案意见 + Map mainmap6 = new HashMap(); + mainmap6.put("fieldName","bayj"); + mainmap6.put("fieldValue",formDataVo.getFieldData("备案意见").getStringValue()); + mainlist.add(mainmap6); + + //备案简述 + Map mainmap11 = new HashMap(); + mainmap11.put("fieldName","bajs"); + mainmap11.put("fieldValue",formDataVo.getFieldData("内容").getStringValue()); + mainlist.add(mainmap11); + + //备案类型 + Map mainmap12 = new HashMap(); + mainmap12.put("fieldName","balx"); + String type = formDataVo.getFieldData("备案类型").getStringValue(); + if("全国".equals(type)){ + mainmap12.put("fieldValue","3"); + }else if ("区域".equals(type)){ + mainmap12.put("fieldValue","1"); + } + mainlist.add(mainmap12); + + //区域 + Map mainmap13 = new HashMap(); + mainmap13.put("fieldName","qy"); + mainmap13.put("fieldValue",formDataVo.getFieldData("区域文本").getStringValue()); + mainlist.add(mainmap13); + + //经办人 +// Map mainmap10 = new HashMap(); +// mainmap10.put("fieldName","jbr"); +// mainmap10.put("fieldValue",formDataVo.getFieldData("经办人").getStringValue()); +// mainlist.add(mainmap10); + + //附件 + if(faths.size() > 0) { + Map jsonFile = new HashMap(); + jsonFile.put("fieldName","banr"); + List fujianValue = new ArrayList(); + for (int i = 0; i < faths.size(); i++) { + Map fath = (Map) faths.get(i); + Map fujianMap = new HashMap(); + fujianMap.put("filePath", fath.get("url")); + fujianMap.put("fileName", fath.get("name")); + fujianValue.add(fujianMap); + } + jsonFile.put("fieldValue",fujianValue); + mainlist.add(jsonFile); + } + + //接口主参数 + Map m = new LinkedHashMap(); +// JSONObject p = new JSONObject(); + //流程ID + m.put("workflowId", configVo.getParamVal(FVConstants.workflowId.name())); + //流程标题 + m.put("requestName",formDataVo.getColSummary().getSubject()); + //主表 + m.put("mainData", JSONUtil.toJsonStr(mainlist)); + log.info(m); + return m; + } + + /** + * 创建流程 + */ + public static Map createNewWF(JSONArray faths, FormDataVo formDataVo, ConfigVo configVo) throws NoSuchFieldException, IOException { + //主表信息 + List mainlist = new ArrayList(); + + //标题 + Map mainmap2 = new HashMap(); + mainmap2.put("fieldName","bt");//OA字段名-同行人员(多人力资源浏览框) + mainmap2.put("fieldValue",formDataVo.getFieldData("表头").getStringValue());//字段值(OA人员ID,多个以英文逗号分隔) + mainlist.add(mainmap2); + + //单号 + Map mainmap3 = new HashMap(); + mainmap3.put("fieldName","dh"); + mainmap3.put("fieldValue",formDataVo.getFieldData("流水号").getStringValue()); + mainlist.add(mainmap3); + + //申请日期 + Map mainmap4 = new HashMap(); + mainmap4.put("fieldName","sqrq"); + mainmap4.put("fieldValue",formDataVo.getFieldData("申请日期").getStringValue()); + mainlist.add(mainmap4); + + //投入金额 + Map mainmap5 = new HashMap(); + mainmap5.put("fieldName","trje"); + mainmap5.put("fieldValue",formDataVo.getFieldData("投入金额").getStringValue()); + mainlist.add(mainmap5); + + //备案意见 + Map mainmap6 = new HashMap(); + mainmap6.put("fieldName","bayj"); + mainmap6.put("fieldValue",formDataVo.getFieldData("备案意见").getStringValue()); + mainlist.add(mainmap6); + + //备案简述 + Map mainmap9 = new HashMap(); + mainmap9.put("fieldName","bajs"); + mainmap9.put("fieldValue",formDataVo.getFieldData("内容").getStringValue()); + mainlist.add(mainmap9); + + //经办人 + Map mainmap10 = new HashMap(); + mainmap10.put("fieldName","jbr"); + mainmap10.put("fieldValue",formDataVo.getFieldData("经办人").getStringValue()); + mainlist.add(mainmap10); + + + //公司名称 + Map mainmap12 = new HashMap(); + mainmap12.put("fieldName","ssschxsgs"); + mainmap12.put("fieldValue",formDataVo.getFieldData("馫香事业部公司名称").getStringValue()); + mainlist.add(mainmap12); + + //备案类型 + Map mainmap11 = new HashMap(); + mainmap11.put("fieldName","balx"); + String type = formDataVo.getFieldData("备案类型").getStringValue(); + if("全国".equals(type)){ + mainmap11.put("fieldValue","3"); + }else if ("区域".equals(type)){ + mainmap11.put("fieldValue","2"); + } + mainlist.add(mainmap11); + + //附件 + if(faths.size() > 0) { + Map jsonFile = new HashMap(); + jsonFile.put("fieldName","banr"); + JSONArray fujianValue = new JSONArray(); + for (int i = 0; i < faths.size(); i++) { + Map fath = (Map) faths.get(i); + Map fujianMap = new HashMap(); + fujianMap.put("filePath", fath.get("url")); + fujianMap.put("fileName", fath.get("name")); + fujianValue.add(fujianMap); + } + jsonFile.put("fieldValue",fujianValue); + mainlist.add(jsonFile); + } + //接口主参数 + Map m = new LinkedHashMap(); +// JSONObject p = new JSONObject(); + //流程ID + m.put("workflowId", configVo.getParamVal(FVConstants.newWorkflowId.name())); + //流程标题 + m.put("requestName",formDataVo.getColSummary().getSubject()); + //主表 + m.put("mainData",JSONUtil.toJsonStr(mainlist)); + log.info(m); + return m; + } + + + + + + /** + * 获取附件路径 + * @param pathId + * @return + */ + public JSONArray getPathUrl(String pathId,ConfigVo configVo) throws IOException { + InterfaceListUtil interfaceListUtil = new InterfaceListUtil(); + String oatoken = interfaceListUtil.getToken(PropKit.getProp(PropKit.LOGINNAME)); + long aLong = Long.parseLong(pathId); + final List attachmentIds = attachmentManager.getBySubReference(aLong); + JSONArray jsonArray = new JSONArray(); + for (int i = 0 ; i < attachmentIds.size();i++) { + Attachment attachment = attachmentManager.getAttachmentByFileURL(attachmentIds.get(i)); + Long fileUrl = attachment.getFileUrl(); + String filename = attachment.getFilename(); + String fileType = filename.substring(filename.lastIndexOf(".")+1); + String oaFileName = filename.substring(0,filename.lastIndexOf(".")); + //调用接口下载文件,文件存放在指定的路径下 +// String dowUrl = PropKit.getProp(PropKit.DOWURL)+"/"+fileUrl+"?fileName="+fileType+"&token="+oatoken; + String dowUrl = configVo.getParamVal(FVConstants.dowurl.name())+"/"+fileUrl+"?fileName="+fileType+"&token="+oatoken; + String str = SystemEnvironment.getApplicationFolder(); + String dowPath = str+"/dhxfile/"+filename; + String download = interfaceListUtil.download(dowUrl, dowPath); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", filename); + jsonObject.put("type", fileType); + jsonObject.put("url", PropKit.getProp(PropKit.JYNCFILE)+"/"+filename); + jsonArray.add(jsonObject); + } + return jsonArray; + } + + +} \ No newline at end of file diff --git a/src/com/seeyon/apps/src_qyba/util/FVHttpUtil.java b/src/com/seeyon/apps/src_qyba/util/FVHttpUtil.java new file mode 100644 index 0000000..790ad23 --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/util/FVHttpUtil.java @@ -0,0 +1,57 @@ +package com.seeyon.apps.src_qyba.util; + +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_qyba.vo.FVResponse; +import com.seeyon.ctp.util.json.JSONUtil; +import org.springframework.util.DigestUtils; + +import java.util.Base64; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: HuangZhengguo + * @Date: 2024/2/27 + */ +public class FVHttpUtil { + + private FVHttpUtil() { + + } + + public static String doPost(String url, String body, String clientId, String security) throws Exception { + String ts = System.currentTimeMillis() + ""; + String signature = ts + security; + byte[] bytes = DigestUtils.md5Digest(signature.getBytes("UTF-8")); + signature = Base64.getEncoder().encodeToString(bytes); + return HttpRequest.post(url).header("Content-Type", "application/json;charset=utf-8") + .header("ts", ts) + .header("signature", signature) + .header("client_id", clientId) + .body(body).execute().body(); + } + + public static FVResponse parseResponse(String response) throws Exception { + try { + JSONObject object = JSONUtil.parseJSONString(response, JSONObject.class); + return new FVResponse(object); + } catch (Exception e) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("Status", "0"); + jsonObject.put("Msg", "解析json异常"); + jsonObject.put("Data", response); + return new FVResponse(jsonObject); + } + } + + + + public static void main(String[] args) { + String url = "http://10.1.90.21:9083/servlet/NCTokenServlet?dsname=BIPcs&usercode=UFYJY&system=OA&busicentercode=sxbip"; + } + +} diff --git a/src/com/seeyon/apps/src_qyba/util/FanWeiUtil.java b/src/com/seeyon/apps/src_qyba/util/FanWeiUtil.java new file mode 100644 index 0000000..8b3c369 --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/util/FanWeiUtil.java @@ -0,0 +1,289 @@ +package com.seeyon.apps.src_qyba.util; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.seeyon.apps.common.config.ICstConfigApi; +import com.seeyon.apps.common.plugin.vo.ConfigVo; +import com.seeyon.apps.daohuaxiangSys.jkts.util.PropKit; +import com.seeyon.apps.ext.workflow.vo.FormDataVo; +import com.seeyon.apps.src_qyba.FVCommonNode; +import com.seeyon.apps.src_qyba.constants.FVConstants; +import com.seeyon.ctp.common.AppContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.songjian.utils.json.JSONArray; + +import java.io.IOException; +import java.util.*; + +/** + * 描述: + * + * @Author: huangzhengguo + * @Date: 2024/03/04 + */ +public class FanWeiUtil { + + private final static Log log = LogFactory.getLog(FanWeiUtil.class); + + /** + * 模拟缓存服务 + */ + private static final Map SYSTEM_CACHE = new HashMap<>(); + + private static String privateKey = ""; + private static String publicKey = ""; + + + /** + * ecology系统发放的授权许可证(appid) + * ce14aaca-fa08-4eb7-9f10-c2294285c4ea + */ + private static String APPID = "e47a15d2-95f2-4bf6-a546-8076ce445a19"; + + + /** + * 第一步: + * + * 调用ecology注册接口,根据appid进行注册,将返回服务端公钥和Secret信息 + */ + public static Map Regist(String address){ + + //获取当前系统RSA加密的公钥 + RSA rsa = new RSA(); + if(publicKey.equals("")) { + publicKey = rsa.getPublicKeyBase64(); + } + if(privateKey.equals("")) { + privateKey = rsa.getPrivateKeyBase64(); + } + + log.info("publicKey:"+publicKey+" privateKey:"+privateKey); + // 客户端RSA私钥 + SYSTEM_CACHE.put("LOCAL_PRIVATE_KEY",privateKey); + // 客户端RSA公钥 + SYSTEM_CACHE.put("LOCAL_PUBLIC_KEY",publicKey); + + //调用ECOLOGY系统接口进行注册 + String data = HttpRequest.post(address + "/api/ec/dev/auth/regist") + .header("appid",APPID) + .header("cpk",publicKey) + .timeout(2000) + .execute().body(); + + // 打印ECOLOGY响应信息 + log.info("Regist():"+data); + Map datas = JSONUtil.parseObj(data); + + //ECOLOGY返回的系统公钥 + SYSTEM_CACHE.put("SERVER_PUBLIC_KEY", StrUtil.nullToEmpty((String)datas.get("spk"))); + //ECOLOGY返回的系统密钥 + SYSTEM_CACHE.put("SERVER_SECRET",StrUtil.nullToEmpty((String)datas.get("secrit"))); + return datas; + } + + + + /** + * 第二步: + * + * 通过第一步中注册系统返回信息进行获取token信息 + */ + public static Map Getoken(String address,ConfigVo configVo) throws IOException { + // 从系统缓存或者数据库中获取ECOLOGY系统公钥和Secret信息 +// String secret = PropKit.getProp(PropKit.SECRET); + String secret = configVo.getParamVal(FVConstants.secret.name()); +// String spk = PropKit.getProp(PropKit.SPK); + String spk = configVo.getParamVal(FVConstants.spk.name()); + + + // 公钥加密,所以RSA对象私钥为null + RSA rsa = new RSA(null,spk); + //对秘钥进行加密传输,防止篡改数据 + String encryptSecret = rsa.encryptBase64(secret, CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey); + + //调用ECOLOGY系统接口进行注册 + String data = HttpRequest.post(address+ "/api/ec/dev/auth/applytoken") + .header("appid",configVo.getParamVal(FVConstants.appId.name())) + .header("secret",encryptSecret) + .header("time","3600") + .execute().body(); + + log.info("Getoken():"+data); + Map datas = JSONUtil.parseObj(data); + + //ECOLOGY返回的token + // TODO 为Token缓存设置过期时间 + SYSTEM_CACHE.put("SERVER_TOKEN",StrUtil.nullToEmpty((String)datas.get("token"))); + + return datas; + } + + /** + * 第三步: + * + * 调用ecology系统的rest接口,请求头部带上token和用户标识认证信息 + * + * @param params 请求参数map,创建流程之类的post接口是以模拟form表单提交的方式,其他get接口以json字符串方式提交 + * + * 注意:ECOLOGY系统所有POST接口调用请求头请设置 "Content-Type","application/x-www-form-urlencoded; charset=utf-8" + */ + public static String PostRestful(Map params, String userid,ConfigVo configVo) throws IOException { + + //ECOLOGY返回的token +// String token = (String) Getoken(PropKit.getProp(PropKit.ADDRESS)).get("token"); + String token = (String) Getoken(configVo.getParamVal(FVConstants.addRess.name()),configVo).get("token"); + + //封装请求头参数 +// RSA rsa = new RSA(null, PropKit.getProp(PropKit.SPK)); + RSA rsa = new RSA(null, configVo.getParamVal(FVConstants.spk.name())); + //对用户信息进行加密传输,暂仅支持传输OA用户ID + String encryptUserid = rsa.encryptBase64(userid,CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey); + + //调用ECOLOGY系统接口 +// String data = HttpRequest.post(PropKit.getProp(PropKit.ADDRESS) + PropKit.getProp(PropKit.TONGYONGAPI)) +// .header("appid",PropKit.getProp(PropKit.APPID)) +// .header("token",token) +// .header("userid",encryptUserid) +// // .header("skipsession", "1") +// .form(params) +// .execute().body(); + String data = HttpRequest.post(configVo.getParamVal(FVConstants.addRess.name()) + configVo.getParamVal(FVConstants.tongyongApi.name())) + .header("appid",configVo.getParamVal(FVConstants.appId.name())) + .header("token",token) + .header("userid",encryptUserid) + // .header("skipsession", "1") + .form(params) + .execute().body(); +// Map headermap = new HashMap(); +// headermap.put("appid",APPID); +// headermap.put("token",token); +// headermap.put("userid",encryptUserid); +// String data = HttpClientUtil.doPostFORM(address + api,headermap,params); + log.info("PostRestfulby():"+data); + return data; + } + +// public static String getAPPID() { +// return APPID; +// } +// +// public static void setAPPID(String APPID) { +// FanWeiUtil.APPID = APPID; +// } +// +// public static String getPrivateKey() { +// return privateKey; +// } +// +// public static void setPrivateKey(String privateKey) { +// FanWeiUtil.privateKey = privateKey; +// } +// +// public static String getPublicKey() { +// return publicKey; +// } +// +// public static void setPublicKey(String publicKey) { +// FanWeiUtil.publicKey = publicKey; +// } + + + /** + * 第二步: + * + * 通过第一步中注册系统返回信息进行获取token信息 + */ + public static Map NewGetoken(String address,ConfigVo configVo) throws IOException { + // 从系统缓存或者数据库中获取ECOLOGY系统公钥和Secret信息 +// String secret = PropKit.getProp(PropKit.NEWSECRET); +// String spk = PropKit.getProp(PropKit.NEWSPK); + String secret = configVo.getParamVal(FVConstants.newSecret.name()); + String spk = configVo.getParamVal(FVConstants.newspk.name()); + + + // 公钥加密,所以RSA对象私钥为null + RSA rsa = new RSA(null,spk); + //对秘钥进行加密传输,防止篡改数据 + String encryptSecret = rsa.encryptBase64(secret, CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey); + + //调用ECOLOGY系统接口进行注册 +// String data = HttpRequest.post(address+ "/api/ec/dev/auth/applytoken") +// .header("appid",PropKit.getProp(PropKit.APPID)) +// .header("secret",encryptSecret) +// .header("time","3600") +// .execute().body(); + String data = HttpRequest.post(address+ "/api/ec/dev/auth/applytoken") + .header("appid",configVo.getParamVal(FVConstants.appId.name())) + .header("secret",encryptSecret) + .header("time","3600") + .execute().body(); + + log.info("Getoken():"+data); + Map datas = JSONUtil.parseObj(data); + + //ECOLOGY返回的token + // TODO 为Token缓存设置过期时间 + SYSTEM_CACHE.put("SERVER_TOKEN",StrUtil.nullToEmpty((String)datas.get("token"))); + + return datas; + } + + /** + * 第三步: + * + * 调用ecology系统的rest接口,请求头部带上token和用户标识认证信息 + * + * @param params 请求参数map,创建流程之类的post接口是以模拟form表单提交的方式,其他get接口以json字符串方式提交 + * + * 注意:ECOLOGY系统所有POST接口调用请求头请设置 "Content-Type","application/x-www-form-urlencoded; charset=utf-8" + */ + public static String NewPostRestful(Map params, String userid,ConfigVo configVo) throws IOException { + + //ECOLOGY返回的token +// String token = (String) Getoken(PropKit.getProp(PropKit.NEWADDRESS)).get("token"); + String token = (String) NewGetoken(configVo.getParamVal(FVConstants.newAddRess.name()),configVo).get("token"); + + + //封装请求头参数 +// RSA rsa = new RSA(null, PropKit.getProp(PropKit.NEWSPK)); + RSA rsa = new RSA(null, configVo.getParamVal(FVConstants.newspk.name())); + //对用户信息进行加密传输,暂仅支持传输OA用户ID + String encryptUserid = rsa.encryptBase64(userid,CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey); + + //调用ECOLOGY系统接口 +// String data = HttpRequest.post(PropKit.getProp(PropKit.NEWADDRESS) + PropKit.getProp(PropKit.TONGYONGAPI)) +// .header("appid",PropKit.getProp(PropKit.APPID)) +// .header("token",token) +// .header("userid",encryptUserid) +// // .header("skipsession", "1") +// .form(params) +// .execute().body(); + String data = HttpRequest.post(configVo.getParamVal(FVConstants.newAddRess.name()) + configVo.getParamVal(FVConstants.tongyongApi.name())) + .header("appid",configVo.getParamVal(FVConstants.appId.name())) + .header("token",token) + .header("userid",encryptUserid) + // .header("skipsession", "1") + .form(params) + .execute().body(); +// Map headermap = new HashMap(); +// headermap.put("appid",APPID); +// headermap.put("token",token); +// headermap.put("userid",encryptUserid); +// String data = HttpClientUtil.doPostFORM(address + api,headermap,params); + log.info("PostRestfulby():"+data); + return data; + } + + + + + + + + +} diff --git a/src/com/seeyon/apps/src_qyba/vo/FVResponse.java b/src/com/seeyon/apps/src_qyba/vo/FVResponse.java new file mode 100644 index 0000000..6a5ed97 --- /dev/null +++ b/src/com/seeyon/apps/src_qyba/vo/FVResponse.java @@ -0,0 +1,72 @@ +package com.seeyon.apps.src_qyba.vo; + +import com.alibaba.fastjson.JSONObject; + +/** + * 功能描述:
+ *
+ *
+ * 
+ * + * @Author: huangzhengguo + * @Date: 2024/03/04 + */ +public class FVResponse { + + private boolean success; + private int status; + private String msg; + private String data; + + + public FVResponse(JSONObject object) { + if(object.containsKey("Status")) { + this.status = object.getInteger("Status"); + } else { + this.status = object.getInteger("status"); + } + this.success = (1 == status); + if(object.containsKey("Msg")) { + this.msg = object.getString("Msg"); + } else { + this.msg = object.getString("msg"); + } + this.data = object.getString("Data"); + } + + public boolean isSuccess() { + return success; + } + + public FVResponse setSuccess(boolean success) { + this.success = success; + return this; + } + + public int getStatus() { + return status; + } + + public FVResponse setStatus(int status) { + this.status = status; + return this; + } + + public String getMsg() { + return msg; + } + + public FVResponse setMsg(String msg) { + this.msg = msg; + return this; + } + + public String getData() { + return data; + } + + public FVResponse setData(String data) { + this.data = data; + return this; + } +} diff --git a/src/needless_check_login.xml b/src/needless_check_login.xml new file mode 100644 index 0000000..97114bc --- /dev/null +++ b/src/needless_check_login.xml @@ -0,0 +1,322 @@ + + + + /qrCodeForm.do + + index + newMain + + + + /sc.do + + qr + + + + /elearning.do + + error + m3Redirect + message + pcRedirect + + + + /phoneLogin/phoneLogin.do + + getMessageCode + validateMessageCode + + + + /wechat/miniprogram.do + + a8home + bind + bindMemberPhone + login + unbind + + + + /portal/spaceController.do + + showThemSpace + + + + /identification.do + + getSessionId + + + + /fileUpload.do + + showRTE + + + + /fileDownload.do + + showRTE + + + + /form/formUpgrade.do + + toUpgrade + upgrade + viewUpgrade + + + + formtalkFormMapperController.do + + importFormtalkData + + + + /thirdpartyController.do + + access + index + logoutNotify + show + mailAuth + + + + /main.do + + changeLocale + hangup + headerjs + index + login + login4Ucpc + login4Ucpc3 + login4Vjoin + logout + logout4Session + logout4Vjoin + logout4ZX + main + login4QrCode + qrCodeHelp + updateLoginSeed + + + + /trustdo/A8/XRD.do + + getLoginAccount + getLoginAcctoken + webLogin + + + + /share.do + + index + + + + /genericController.do + + index + + + + /edoc/edocUpgradeControllor.do + + upgrade + download + + + + /uploadService.do + + processUploadService + + + + /autoinstall.do + + ieSetDown + regInstallDown + regInstallDown64 + downloadAssistant + + + + /personalBind.do + + getBindTypeByLoginName + isCanUse + retrievePassword + sendVerificationCodeToBindEmail + sendVerificationCodeToBindNum + validateVerificationCode + + + + + + + + + + + /commonimage.do + + showImage + + + + /individualManager.do + + resetPassword + + + + /wechat/dingding.do + + binding + index + main + newIndex + newMain + viewh5Message + + + + /uc/rest.do + + commonPierce + downloadImage + getBgTimeStamp + getLoginsecurityMsg + sendsms + smsrequired + testIp + isQrLogin + getDigitalCodeInfo + + + + portalManager + + sendSMSLoginCode + smsLoginEnabled + + + + loginUserManager + + getLockTime + + + + qrCodeLoginManager + + isLogin + + + + meetingAjaxManager + + meetingPanelData + meetingPanelDisplay + + + + /m3/loginController.do + + transLogin + transLogout + getProfile + + + + /m3/mClientBindController.do + + bindApply + + + + m3ProductManager + + productInfo + productStatus + + + + /m3/homeSkinController.do + + downloadImage + getSkinImageUrl + + + + /m3/transModeController.do + + getTransModeForMobile + + + + /media/media.do + + mediaShow + + + + /ocipEdoc.do + + index + + + + /colView.do + + index + + + + /caAccountManagerController.do + + findKeyNumByLoginName + + + + /fddCallbackController.do + + asynch + synch + + + + /seeyonReport/seeyonReportController.do + + redirectSeeyonReport + + + + /imc.do + + index + logout + + + + + /cloudbuild.do + + download + getDownloadPageInfo + getLatestVersionInfo + getDownloadQrUrl + + + \ No newline at end of file diff --git a/src/needless_check_login_recheck.xml b/src/needless_check_login_recheck.xml new file mode 100644 index 0000000..0e84aeb --- /dev/null +++ b/src/needless_check_login_recheck.xml @@ -0,0 +1,426 @@ + + + + + + /qrCodeForm.do + com.seeyon.apps.qrCodeForm.controller.QrCodeFormController + + index + newMain + + + + + /sc.do + com.seeyon.cap4.form.modules.smartCode.controller.SmartCodeController + + qr + + + + /media/media.do + com.seeyon.ctp.common.media.controller.MediaController + + mediaShow + + + + /phoneLogin/phoneLogin.do + com.seeyon.ctp.login.controller.PhoneLoginController + + getMessageCode + validateMessageCode + + + + portalManager + com.seeyon.ctp.portal.manager.PortalManagerImpl + + sendSMSLoginCode + smsLoginEnabled + + + + /fileDownload.do + com.seeyon.ctp.common.fileupload.FileUploadController + + showRTE + + + + loginUserManager + com.seeyon.ctp.login.LoginUserManagerImpl + + getLockTime + + + + /main.do + com.seeyon.ctp.login.controller.MainController + + changeLocale + hangup + headerjs + index + login + login4Ucpc + login4Ucpc3 + login4Vjoin + logout + logout4Session + logout4Vjoin + logout4ZX + main + login4QrCode + qrCodeHelp + updateLoginSeed + + + + /trustdo/A8/XRD.do + com.seeyon.apps.trustdo.controller.XRDController + + getLoginAccount + getLoginAcctoken + webLogin + + + + /share.do + com.seeyon.v3x.system.share.controller.ShareController + + index + + + + /edoc/edocUpgradeControllor.do + com.seeyon.v3x.edoc.controller.EdocUpgradeControllor + + upgrade + download + + + + /m3/mClientBindController.do + com.seeyon.apps.m3.bind.controller.M3ClientBindController + + bindApply + + + + /uploadService.do + com.seeyon.ctp.services.FileUploadService + + processUploadService + + + + /uc/rest.do + com.seeyon.apps.zx.controller.ZxRestController + + commonPierce + downloadImage + getBgTimeStamp + getLoginsecurityMsg + sendsms + smsrequired + testIp + isQrLogin + getDigitalCodeInfo + + + + /m3/homeSkinController.do + com.seeyon.apps.m3.skin.controller.M3HomeSkinController + + downloadImage + getSkinImageUrl + + + + /colView.do + com.seeyon.apps.ocip.exchange.collaboration.controller.CollViewController + + index + + + + /autoinstall.do + com.seeyon.apps.autoinstall.controller.AutoInstallController + + ieSetDown + regInstallDown + regInstallDown64 + downloadAssistant + + + + + + + + + + + + /caAccountManagerController.do + com.seeyon.v3x.ca.caaccount.controller.CAAccountManagerController + + findKeyNumByLoginName + + + + /elearning.do + com.seeyon.apps.elearning.controller.ElearningController + + error + m3Redirect + message + pcRedirect + + + + /wechat/miniprogram.do + com.seeyon.apps.weixin.controller.MiniProgramController + + a8home + bind + bindMemberPhone + login + unbind + + + + /portal/spaceController.do + com.seeyon.ctp.portal.space.controller.SpaceController + + showThemSpace + + + + /identification.do + com.seeyon.v3x.identification.controller.IdentificationController + + getSessionId + + + + /fddCallbackController.do + com.seeyon.apps.econtract.fdd.controller.FddCallbackController + + asynch + synch + + + + m3ProductManager + com.seeyon.apps.m3.product.manager.impl.M3ProductManagerImpl + + productInfo + productStatus + + + + /ocipEdoc.do + com.seeyon.apps.ocip.exchange.edoc.OCIPEdocController + + index + + + + /m3/loginController.do + + transLogin + transLogout + getProfile + + + + /fileUpload.do + com.seeyon.ctp.common.fileupload.FileUploadController + + showRTE + processUpload + + + + qrCodeLoginManager + com.seeyon.ctp.login.manager.QrCodeLoginManagerImpl + + isLogin + + + + /form/formUpgrade.do + com.seeyon.ctp.form.service.FormUpgradeController + + toUpgrade + upgrade + viewUpgrade + + + + /seeyonReport/seeyonReportController.do + com.seeyon.apps.seeyonreport.controller.SeeyonReportController + + redirectSeeyonReport + + + + formtalkFormMapperController.do + com.seeyon.apps.formtalk.controller.FormtalkImportController + + importFormtalkData + + + + /thirdpartyController.do + com.seeyon.ctp.portal.sso.thirdpartyintegration.controller.ThirdpartyController + + access + index + logoutNotify + show + mailAuth + + + + /m3/transModeController.do + com.seeyon.apps.m3.transmissionmode.controller.M3TransModeController + + getTransModeForMobile + + + + /genericController.do + com.seeyon.v3x.common.controller.GenericController + + index + + + + /personalBind.do + com.seeyon.v3x.personalaffair.controller.PersonalBindController + + getBindTypeByLoginName + isCanUse + retrievePassword + sendVerificationCodeToBindEmail + sendVerificationCodeToBindNum + validateVerificationCode + + + + /commonimage.do + com.seeyon.apps.common.image.controller.ImageController + + showImage + + + + /individualManager.do + com.seeyon.v3x.personalaffair.controller.IndividualManagerController + + resetPassword + + + + meetingAjaxManager + com.seeyon.apps.meeting.manager.MeetingAjaxManagerImpl + + meetingPanelData + meetingPanelDisplay + + + + /wechat/dingding.do + com.seeyon.apps.weixin.controller.DingDingController + + binding + index + main + newIndex + newMain + viewh5Message + + + + /imc.do + com.seeyon.apps.imc.controller.ImcLoginController + + index + logout + + + + /wechat/feishu.do + com.seeyon.apps.weixin.controller.FeishuController + + newMain + viewh5Message + + + + + + + + + + + + + + + /wechat/pcapp.do + com.seeyon.apps.weixin.controller.PcAppController + + transferPageFromWxCoreServer + gotoPcApp + checkCodeTurnToRightPage + transfer + transferMsg + + + + /wechat/feishu/approvalData.do + com.seeyon.apps.zhifei.feishu.approval.controller.ApprovalDataController + + index + + + + /zhifei/feishu.do + com.seeyon.apps.zhifei.controller.FeishuController + + newMain + viewh5Message + + + + /zhifei/pcapp.do + com.seeyon.apps.zhifei.controller.ZhifeiPcAppController + + transferPageFromWxCoreServer + gotoPcApp + + + + /zhifei/feishu/approvalData.do + com.seeyon.apps.zhifei.feishu.approval.controller.ApprovalDataController + + index + + + + /cloudbuild.do + com.seeyon.apps.cloudbuild.controller.CloudBuildController + + download + getDownloadPageInfo + getLatestVersionInfo + getDownloadQrUrl + + +