diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index fea3135..e4649f2 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,20 +4,43 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -27,8 +50,9 @@
@@ -44,27 +68,79 @@
-
+
+
+
- {
+ "keyToString": {
+ "RequestMappingsPanelOrder0": "0",
+ "RequestMappingsPanelOrder1": "1",
+ "RequestMappingsPanelWidth0": "75",
+ "RequestMappingsPanelWidth1": "75",
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "WebServerToolWindowFactoryState": "false",
+ "last_opened_file_path": "D:/worksplace/dipinshi-hesi/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "settings.editor.selected.configurable": "reference.projectsettings.compiler.javacompiler",
+ "spring.configuration.checksum": "b46d2d04d263a2ac42116bf89528daed",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
-
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -72,6 +148,12 @@
+
+
+
+
+
+
@@ -83,7 +165,32 @@
1731982764438
+
+
+
+
+ 1732084433359
+
+
+
+ 1732084433359
+
+
+ 1732085139319
+
+
+
+ 1732085139319
+
+
+ 1732527712083
+
+
+
+ 1732527712083
+
+
@@ -100,4 +207,50 @@
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/hosecloud/organize/HoseCloudTemplateService.java
+ 33
+
+
+
+ file://$PROJECT_DIR$/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/AbstractFinFilingService.java
+ 132
+
+
+
+ file://$PROJECT_DIR$/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/AbstractFinFilingService.java
+ 370
+
+
+
+ file://$PROJECT_DIR$/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/AbstractFinFilingService.java
+ 386
+
+
+
+ file://$PROJECT_DIR$/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/DefaultFormFinFilingService.java
+ 35
+
+
+
+ file://$PROJECT_DIR$/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/AbstractFinFilingService.java
+ 328
+
+
+
+ file://$PROJECT_DIR$/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/DiPinShiFinFilingService.java
+ 54
+
+
+
+
+
\ No newline at end of file
diff --git a/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/HelloController.java b/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/HelloController.java
new file mode 100644
index 0000000..3990375
--- /dev/null
+++ b/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/HelloController.java
@@ -0,0 +1,13 @@
+package cn.jiutqy.finfiling;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+//@RestController
+public class HelloController {
+
+ @GetMapping("/")
+ public String hello() {
+ return "Hello World";
+ }
+}
\ No newline at end of file
diff --git a/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/controller/VerifyWeChatController.java b/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/controller/VerifyWeChatController.java
new file mode 100644
index 0000000..5745070
--- /dev/null
+++ b/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/controller/VerifyWeChatController.java
@@ -0,0 +1,127 @@
+package cn.jiutqy.finfiling.controller;
+
+import cn.jiutqy.finfiling.dto.ReceiveMessage;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+public class VerifyWeChatController {
+
+ @GetMapping("/hook")
+ public String handleWeChatVerify(@RequestParam Map allParams) {
+ //通过参数msg_signature对请求进行校验
+ if (!verifySignature(allParams)) {
+ return "Invalid signature";
+ }
+
+ //解密echostr参数得到消息内容
+ String msg = decryptEchostr(allParams.get("echostr"));
+ if (msg == null) {
+ return "Failed to decrypt message";
+ }
+
+ // 在1秒内原样返回明文消息内容
+ return msg;
+ }
+
+ @PostMapping("/hook")
+ public ResponseEntity receiveMessage(@RequestBody ReceiveMessage message,
+ @RequestParam("msg_signature") String msgSignature,
+ @RequestParam("timestamp") String timestamp,
+ @RequestParam("nonce") String nonce) throws NoSuchAlgorithmException {
+
+ /*String token = "";
+ // 按照字母字典排序并拼接字符串
+ String sortedStr = Arrays.asList("token", token, "timestamp", timestamp, "nonce", nonce)
+ .stream().sorted().collect(Collectors.joining(""));
+
+ // 使用SHA1计算签名
+ MessageDigest md = MessageDigest.getInstance("SHA-1");
+ byte[] digest = md.digest(sortedStr.getBytes(StandardCharsets.UTF_8));
+ StringBuilder hexStr = new StringBuilder();
+ for (byte b : digest) {
+ hexStr.append(String.format("%02x", b & 0xFF));
+ }*/
+ return new ResponseEntity<>("", HttpStatus.OK);
+
+ }
+
+ private boolean verifySignature(Map params) {
+ String msgSignature = params.get("msg_signature");
+ String timestamp = params.get("timestamp");
+ String nonce = params.get("nonce");
+ String echostr = params.get("echostr");
+ String token = "";
+
+ try {
+ // 按照字母字典排序并拼接字符串
+ String sortedStr = Arrays.asList("token", token, "timestamp", timestamp, "nonce", nonce, "echostr", echostr)
+ .stream().sorted().collect(Collectors.joining(""));
+
+ // 使用SHA1计算签名
+ MessageDigest md = MessageDigest.getInstance("SHA-1");
+ byte[] digest = md.digest(sortedStr.getBytes(StandardCharsets.UTF_8));
+ StringBuilder hexStr = new StringBuilder();
+ for (byte b : digest) {
+ hexStr.append(String.format("%02x", b & 0xFF));
+ }
+
+ return hexStr.toString().equals(msgSignature);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ }
+
+ private String decryptEchostr(String encryptedStr) {
+ try {
+
+ byte[] aesKey = "".getBytes(StandardCharsets.UTF_8);
+ SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
+ Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+ cipher.init(Cipher.DECRYPT_MODE, keySpec);
+
+ // Base64解码
+ byte[] aesMsg = Base64.decodeBase64(encryptedStr);
+ byte[] decrypted = cipher.doFinal(aesMsg);
+
+
+ // 去掉头部的随机字节和长度字节,截取消息部分
+ int randomByteLength = 16;
+ int msgLenByteLength = 4;
+ // 跳过随机字节和长度字节
+ byte[] rawBytes = new byte[decrypted.length - randomByteLength - msgLenByteLength];
+ System.arraycopy(decrypted, randomByteLength + msgLenByteLength, rawBytes, 0, rawBytes.length);
+
+ // 提取msg
+ int msgLen = bytesToInt(Arrays.copyOfRange(rawBytes, 0, msgLenByteLength));
+ byte[] msgBytes = Arrays.copyOfRange(rawBytes, msgLenByteLength, msgLenByteLength + msgLen);
+
+ return new String(msgBytes, StandardCharsets.UTF_8);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private int bytesToInt(byte[] bytes) {
+ return (bytes[0] & 0xFF) << 24 |
+ (bytes[1] & 0xFF) << 16 |
+ (bytes[2] & 0xFF) << 8 |
+ (bytes[3] & 0xFF);
+ }
+
+}
diff --git a/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/dto/ReceiveMessage.java b/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/dto/ReceiveMessage.java
new file mode 100644
index 0000000..df2bb56
--- /dev/null
+++ b/fin-filing-admin/src/main/java/cn/jiutqy/finfiling/dto/ReceiveMessage.java
@@ -0,0 +1,22 @@
+package cn.jiutqy.finfiling.dto;
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "xml")
+@XmlAccessorType(XmlAccessType.FIELD)
+@Data
+public class ReceiveMessage {
+ @XmlElement(name = "ToUserName")
+ private String toUserName;
+
+ @XmlElement(name = "AgentID")
+ private String agentId;
+
+ @XmlElement(name = "Encrypt")
+ private String encrypt;
+}
diff --git a/fin-filing-admin/src/main/resources/application-dev.yml b/fin-filing-admin/src/main/resources/application-dev.yml
index 9985951..c30a891 100644
--- a/fin-filing-admin/src/main/resources/application-dev.yml
+++ b/fin-filing-admin/src/main/resources/application-dev.yml
@@ -17,7 +17,7 @@ jiutqy:
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
- port: 8080
+ port: 8081
servlet:
# 应用的访问路径
context-path: /
@@ -99,9 +99,56 @@ finfiling:
dipinshi:
host: https://qyapi.weixin.qq.com
oauth:
- reqUrl: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}}&corpsecret={corpsecret}
- appId:
- appSecret:
+ reqUrl: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}
+ appId: ww501bfd45644052f2
+ appSecret: nXt0bPsSF1frA3NPnKkvn9vic3VTuEWM1fu8J2tiSZk
+ forms:
+ goOut:
+ reqUrl: https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token={accessToken}
+ reqMethod: POST
+
+ travel:
+ reqUrl: https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token={accessToken}
+ reqMethod: POST
+
+ mapping:
+ relation:
+ #外出
+ - channelRelation:
+ inputChannelId: dipinshi
+ outputChannelId: hosecloud
+ formRelation:
+ inputFormId: goOut
+ inputGroupId: goOut
+ outputFormId: create
+
+ #国内出差
+ - channelRelation:
+ inputChannelId: dipinshi
+ outputChannelId: hosecloud
+ formRelation:
+ inputFormId: travel
+ inputGroupId: travelIn
+ outputFormId: create
+
+ #国外出差
+ - channelRelation:
+ inputChannelId: dipinshi
+ outputChannelId: hosecloud
+ formRelation:
+ inputFormId: travel
+ inputGroupId: travelOut
+ outputFormId: create
+
+ #国外出差 非美国
+ - channelRelation:
+ inputChannelId: dipinshi
+ outputChannelId: hosecloud
+ formRelation:
+ inputFormId: travel
+ inputGroupId: travelOutNoUSA
+ outputFormId: create
+
output:
channel:
@@ -109,7 +156,11 @@ finfiling:
host: https://app.ekuaibao.com
oauth:
reqUrl: https://app.ekuaibao.com/api/openapi/v1/auth/getAccessToken
- appId: 0ed9a207-c594-460c-9245-91dee9260a9c
- appSecret: fc559d05-bc67-4d34-9c15-e2953fe97bb8
+ appId: 7f913942-01b9-49eb-a751-053062c01ab1
+ appSecret: 98f95ef9-a586-4546-b1e6-66e811313544
+ forms:
+ create:
+ reqUrl: https://app.ekuaibao.com/api/openapi/v2.2/flow/data?accessToken={accessToken}
+ reqMethod: POST
diff --git a/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestEmailSend.java b/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestEmailSend.java
deleted file mode 100644
index 2c19986..0000000
--- a/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestEmailSend.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package cn.jiutqy.finfiling;
-
-
-import cn.jiutqy.archives.common.utils.email.EmailSendUtil;
-import cn.jiutqy.finfiling.common.dto.FinFilingAccessToken;
-import cn.jiutqy.finfiling.common.enums.ChannelEnum;
-import com.alibaba.fastjson.JSONObject;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.TestPropertySource;
-
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
-@TestPropertySource(properties = "server.port=8080")
-public class TestEmailSend {
-
- @Autowired
- private EmailSendUtil emailSendUtil;
-
- @Test
- public void testEmailSend(){
- emailSendUtil.sendEmail("pengzhihao@jiutqy.com", "测试邮件", "测试邮件内容");
- System.out.println("发送结束");
- }
-}
diff --git a/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestHuiLianYiFinFilingService.java b/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestHuiLianYiFinFilingService.java
deleted file mode 100644
index 032c5b6..0000000
--- a/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestHuiLianYiFinFilingService.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package cn.jiutqy.finfiling;
-
-import cn.jiutqy.finfiling.common.service.DefaultFormAtFinFilingService;
-import cn.jiutqy.finfiling.common.service.DefaultFormFinFilingService;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.TestPropertySource;
-
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
-@TestPropertySource(properties = "server.port=8080")
-public class TestHuiLianYiFinFilingService {
-
- @Autowired
- private DefaultFormFinFilingService defaultFormFinFilingService;
-
- @Autowired
- private DefaultFormAtFinFilingService defaultFormAtFinFilingService;
-
- // 测试汇联易附件上传
- @Test
- public void testSyncAt(){
- defaultFormAtFinFilingService.syncData("huilianyi","at");
- }
-
- //测试报销单
- @Test
- public void testSyncExpense(){
- String startCursor = "2024-09-26 00:00:00";
- String endCursor = "2024-09-26 23:59:59";
- String channelId = "huilianyi";
- String formId = "expenseReport";
- defaultFormFinFilingService.syncData(startCursor, endCursor, channelId, formId);
- }
-
- //测试报销单
- @Test
- public void testSyncExpense2(){
- String channelId = "huilianyi";
- String formId = "expenseReport";
- defaultFormFinFilingService.syncData(channelId, formId);
- }
-
- //测试出差申请单
- @Test
- public void testSyncTravelApplication(){
- String startCursor = "2024-09-26 00:00:00";
- String endCursor = "2024-09-26 23:59:59";
- String channelId = "huilianyi";
- String formId = "travelApplication";
- defaultFormFinFilingService.syncData(startCursor, endCursor, channelId, formId);
- }
-
- @Test
- public void testSyncTravelApplication2(){
- String channelId = "huilianyi";
- String formId = "travelApplication";
- defaultFormFinFilingService.syncData(channelId, formId);
- }
-
- //测试招待单
- @Test
- public void testSyncReceptionApplication(){
- String startCursor = "2024-09-26 00:00:00";
- String endCursor = "2024-09-27 23:59:59";
- String channelId = "huilianyi";
- String formId = "receptionApplication";
- defaultFormFinFilingService.syncData(startCursor, endCursor, channelId, formId);
-
- }
-
- //测试借款单
- @Test
- public void testLoanBill(){
- String startCursor = "2024-09-25 00:00:00";
- String endCursor = "2024-09-28 23:59:59";
- String channelId = "huilianyi";
- String formId = "loanBill";
- defaultFormFinFilingService.syncData(startCursor, endCursor, channelId, formId);
- }
-
- //对公报销 + 对公借款
- @Test
- public void testForCorporateExpense(){
- String startCursor = "2024-09-25 00:00:00";
- String endCursor = "2024-09-29 23:59:59";
- String channelId = "huilianyi";
- String formId = "corExpenseReport";
- defaultFormFinFilingService.syncData(startCursor, endCursor, channelId, formId);
- }
-
- @Test
- public void testInvoice(){
- String startCursor = "2024-09-25 00:00:00";
- String endCursor = "2024-09-29 23:59:59";
- String channelId = "huilianyi";
- String formId = "invoice";
- defaultFormFinFilingService.syncData(startCursor, endCursor, channelId, formId);
- }
-
-}
diff --git a/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestU9CFinFilingService.java b/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestService.java
similarity index 51%
rename from fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestU9CFinFilingService.java
rename to fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestService.java
index c8c2abb..34708c5 100644
--- a/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestU9CFinFilingService.java
+++ b/fin-filing-admin/src/test/java/cn/jiutqy/finfiling/TestService.java
@@ -1,34 +1,29 @@
package cn.jiutqy.finfiling;
-import cn.jiutqy.finfiling.common.service.DefaultFormAtFinFilingService;
import cn.jiutqy.finfiling.common.service.DefaultFormFinFilingService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@TestPropertySource(properties = "server.port=8080")
-public class TestU9CFinFilingService {
+public class TestService {
@Autowired
private DefaultFormFinFilingService defaultFormFinFilingService;
- @Autowired
- private DefaultFormAtFinFilingService defaultFormAtFinFilingService;
- // 测试U9C附件上传
@Test
- public void testSyncAt(){
- defaultFormAtFinFilingService.syncData("u9c","at");
- }
+ public void test() throws ParseException {
+
+ defaultFormFinFilingService.syncData("2024-12-01 00:00:00","2024-12-02 23:59:59","dipinshi","goOut");
+
- //测试报销单
- @Test
- public void testSyncExpense2(){
- String channelId = "u9c";
- String formId = "UFData9002021";
- defaultFormFinFilingService.syncData(channelId, formId);
}
}
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/config/properties/FinFilingChannelProperties.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/config/properties/FinFilingChannelProperties.java
index 14ce548..b94f4f8 100644
--- a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/config/properties/FinFilingChannelProperties.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/config/properties/FinFilingChannelProperties.java
@@ -14,13 +14,20 @@ public class FinFilingChannelProperties {
private Integer pageNum = 1;
- private Integer pageSize = 5;
+ private Integer pageSize = 10;
/**
* 首次同步过去多长时间的数据,格式为:1d 1h 1min 1sec,默认为:1d
*/
private String firstPassTime = "30d";
+ /**
+ * 缓冲时间
+ */
+ private String bufferTime = "0d";
+
+ private Integer sleepMS = 100;
+
private String cursorFormat = DateUtils.YYYY_MM_DD_HH_MM_SS;
private Map reqHeader;
@@ -29,6 +36,5 @@ public class FinFilingChannelProperties {
private Map forms;
- private String key;
}
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/config/properties/FinFilingMappingFormRelationProperties.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/config/properties/FinFilingMappingFormRelationProperties.java
index 759c09b..7a352a5 100644
--- a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/config/properties/FinFilingMappingFormRelationProperties.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/config/properties/FinFilingMappingFormRelationProperties.java
@@ -9,8 +9,8 @@ public class FinFilingMappingFormRelationProperties {
private String inputFormId;
+ private String inputGroupId;
+
private String outputFormId;
- private String outputAtFormId;
-
}
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/enums/FormEnum.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/enums/FormEnum.java
index 2609f4e..ce1780a 100644
--- a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/enums/FormEnum.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/enums/FormEnum.java
@@ -8,25 +8,23 @@ import java.util.Map;
public enum FormEnum implements IFinFilingFormService {
- UF_DATA_9002021("UFData9002021"),
- UF_DATA_3012018("UFData3012018"),
- UF_DATA_3022018("UFData3022018"),
- UF_DATA_3112021("UFData3112021"),
- UF_DATA_5012021("UFData5012021"),
- UF_DATA_5022023("UFData5022023"),
- UF_DATA_5032024("UFData5032024"),
- UF_DATA_5042024("UFData5042024"),
- UF_DATA_5052024("UFData5052024"),
+
+ GO_OUT("goOut"),
+
+ TRAVEL("tarvel")
+
+
+
;
- private static final Map FORM_ID_MAPPINGS = new HashMap<>();
+ private static final Map FORMID_MAPPINGS = new HashMap<>();
static
{
for (FormEnum formEnum : values())
{
- FORM_ID_MAPPINGS.put(formEnum.getFormId(), formEnum);
+ FORMID_MAPPINGS.put(formEnum.getFormId(), formEnum);
}
}
@@ -36,7 +34,7 @@ public enum FormEnum implements IFinFilingFormService {
FormEnum(String formId) {
this.formId = formId;
- this.channelService = ChannelEnum.U9C;
+ this.channelService = ChannelEnum.DI_PIN_SHI;
}
@@ -52,6 +50,6 @@ public enum FormEnum implements IFinFilingFormService {
@Override
public IFinFilingFormService resolveFormId(String formId) {
- return (formId != null ? FORM_ID_MAPPINGS.get(formId) : null);
+ return (formId != null ? FORMID_MAPPINGS.get(formId) : null);
}
}
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/AbstractFinFilingService.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/AbstractFinFilingService.java
index 372eaee..0a579bb 100644
--- a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/AbstractFinFilingService.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/AbstractFinFilingService.java
@@ -4,9 +4,13 @@ import cn.jiutqy.archives.common.enums.HttpMethod;
import cn.jiutqy.archives.common.utils.DateUtils;
import cn.jiutqy.archives.common.utils.ExceptionUtil;
import cn.jiutqy.archives.common.utils.http.OkHttpClientUtil;
+import cn.jiutqy.finfiling.common.enums.ChannelEnum;
+import cn.jiutqy.finfiling.dipinshi.IDiPinShiFinFilingService;
+import cn.jiutqy.finfiling.dipinshi.constants.BusinessTypeEnum;
+import cn.jiutqy.finfiling.dipinshi.vo.req.*;
import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.JSONPath;
import com.github.pagehelper.PageInfo;
import cn.jiutqy.finfiling.common.config.FinFilingConfig;
import cn.jiutqy.finfiling.common.config.properties.FinFilingChannelProperties;
@@ -43,36 +47,27 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
@Autowired
private FinFilingConfig finFilingConfig;
- public AbstractFinFilingService(){}
+ @Autowired
+ private IDiPinShiFinFilingService diPinShiFinFilingService;
+
+ public AbstractFinFilingService() {
+ }
@Override
public void syncData(String channelId, String formId) {
FinFilingChannelProperties channelProperties = finFilingConfig.getInput().getChannel().get(channelId);
- FinFilingFormProperties formProperties = channelProperties.getForms().get(formId);
- Integer pageNum = formProperties.getPageNum();
- if(null == pageNum){
- pageNum = channelProperties.getPageNum();
- }
+ //第一次是30天(可修改)之前,30天前到现在。往后都是从现在开始20分钟一次同步
+ Integer pageNum = channelProperties.getPageNum();
+ Integer pageSize = channelProperties.getPageSize();
- Integer pageSize = formProperties.getPageSize();
- if(null == pageSize){
- pageSize = channelProperties.getPageSize();
- }
-
- String firstPassTime = formProperties.getFirstPassTime();
- if(null == firstPassTime){
- firstPassTime = channelProperties.getFirstPassTime();
- }
-
- String cursorFormat = formProperties.getCursorFormat();
- if(null == cursorFormat){
- cursorFormat = channelProperties.getCursorFormat();
- }
+ String firstPassTime = channelProperties.getFirstPassTime();
+ String cursorFormat = channelProperties.getCursorFormat();
Date now = new Date();
- String endCursor = DateUtils.parseDateToStr(cursorFormat, now);
-
+ //结束时间
+ String endCursor = DateUtils.parseDateToStr(cursorFormat, now);
+ //开始时间
String startCursor;
FinFilingSyncCursor finFilingSyncCursor = finFilingSyncCursorService.findByChannelIdAndFormId(channelId, formId);
if(null == finFilingSyncCursor){
@@ -81,6 +76,7 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
startCursor = DateUtils.parseDateToStr(cursorFormat, finFilingSyncCursor.getEndCursor());
}
+ log.info("[{}]-[{}]执行同步开始时间[{}]-结束时间[{}]", channelId, formId, startCursor, endCursor);
Integer totalCount = syncData(startCursor,endCursor,channelId, formId, pageNum, pageSize, 0);
finFilingSyncCursor = new FinFilingSyncCursor();
@@ -101,100 +97,122 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
FinFilingFormProperties formProperties = channelProperties.getForms().get(formId);
Integer pageNum = formProperties.getPageNum();
- if(null == pageNum){
+ if (null == pageNum) {
pageNum = channelProperties.getPageNum();
}
Integer pageSize = formProperties.getPageSize();
- if(null == pageSize){
+ if (null == pageSize) {
pageSize = channelProperties.getPageSize();
}
- syncData(startCursor,endCursor,channelId, formId, pageNum, pageSize, 0);
+ syncData(startCursor, endCursor, channelId, formId, pageNum, pageSize, 0);
}
- private int syncData(String startCursor, String endCursor,String channelId, String formId,Integer pageNum,Integer pageSize,Integer totalCount) {
+ private int syncData(String startCursor, String endCursor, String channelId, String formId, Integer pageNum, Integer pageSize, Integer totalCount) {
// 调用渠道客户系统的接口获取数据
- PageInfo pageInfo = this.inputData(new FinFilingContext(startCursor, endCursor, channelId, formId,pageNum,pageSize),finFilingConfig);
+ PageInfo pageInfo = this.inputData(new FinFilingContext(startCursor, endCursor, channelId, formId, pageNum, pageSize), finFilingConfig);
totalCount = totalCount + pageInfo.getList().size();
- // 对输入数据进行分组,key为分组字段的值
- Map> dataMap = this.groupByInputData(channelId, formId, pageInfo.getList());
+ List approvalNos = pageInfo.getList();
+
+ List documents = new ArrayList<>();
+ //根据单号查询详情 取出有效数据x
+ for (String approvalNo : approvalNos) {
+ String detail = diPinShiFinFilingService.getApprovalNoDetail(approvalNo);
+
+ //根据类型判断:外出、国内出差、国际出差、国际出差非美国
+ JSONObject jsonObjectDetail = JSONObject.parseObject(detail).getJSONObject("info");
+
+ //取出出差类型,根据类型分别映射到不同VO --类型是外出和出差,出差需要再进行一次分类
+ String type = jsonObjectDetail.getString("sp_name");
+
+ if (BusinessTypeEnum.TRAVEL_IN.getName().equals(type)) {
+ DiPinShiAttendanceTravelInReqVO travelIn = takeTravelInData(jsonObjectDetail);
+ documents.add(travelIn);
+ } else if (BusinessTypeEnum.TRAVEL_OUT.getName().equals(type)) {
+ DiPinShiAttendanceTravelOutReqVO travelOut = takeTravelOutData(jsonObjectDetail);
+ documents.add(travelOut);
+ } else if (BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getName().equals(type)) {
+ DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSA = takeTravelOutNoSUAData(jsonObjectDetail);
+ documents.add(travelOutNotUSA);
+ } else if (BusinessTypeEnum.GO_OUT.getName().equals(type)) {
+ DiPinShiAttendanceGoOutReqVO goOut = takeGoOutData(jsonObjectDetail);
+ documents.add(goOut);
+ }
+ }
// 将获取到的数据进行转换
- for (String groupId : dataMap.keySet()) {
- List dataList = dataMap.get(groupId);
+ for (DiPinShiAttendanceReqVO document : documents) {
+ //groupId为goOut travelIn travelOut travelNoUSA
+ String groupId = document.getType();
// 根据分组后的字段获取mapping实现类
IFinFilingMapping mappingService = getFinFilingMappingService(channelId, formId, groupId);
- if(null == mappingService){
- log.error("映射实现类找不到,请检查对应实现类是否配置或者重写afterPropertiesSet方法是否设置了正确的formId值:channelId={},formId={}",channelId,groupId);
+ if (null == mappingService) {
+ log.error("映射实现类找不到,请检查对应实现类是否配置或者重写afterPropertiesSet方法是否设置了正确的formId值:channelId={},formId={}", channelId, groupId);
continue;
}
// 获取映射配置
- FinFilingMappingRelationProperties mappingRelationProperties = getMappingRelationProperties(channelId,formId, groupId);
- if(null == mappingRelationProperties){
- log.warn("mapping配置不正确,当前渠道或表单未配置映射关系:channelId={},formId={}",channelId,groupId);
+ FinFilingMappingRelationProperties mappingRelationProperties = getMappingRelationProperties(channelId, formId, groupId);
+ if (null == mappingRelationProperties) {
+ log.warn("mapping配置不正确,当前渠道或表单未配置映射关系:channelId={},formId={}", channelId, groupId);
continue;
}
// 初始化上下文对象
- FinFilingContext context = new FinFilingContext(startCursor,endCursor,mappingRelationProperties);
+ FinFilingContext context = new FinFilingContext(startCursor, endCursor, mappingRelationProperties);
// 字段映射
- mappingService.mapping(dataList, context, mappingRelationProperties, finFilingConfig);
-
+ FinFilingData sendData = mappingService.mapping(document, context, mappingRelationProperties, finFilingConfig);
+ if (sendData == null) {
+ continue;
+ }
// 调用渠道客户系统的接口推送数据
- for (FinFilingData data : dataList) {
- if (data.getOutputData().isEmpty()){
- continue;
- }
- FinFilingChannelProperties channelProperties = finFilingConfig.getOutput().getChannel().get(context.getOutputChannelId());
- channelProperties.setChannelId(context.getOutputChannelId());
- FinFilingFormProperties formProperties = channelProperties.getForms().get(context.getOutputFormId());
- // 记录同步结果,数据同步状态
- FinFilingSyncLog finFilingSyncLog = null;
- try {
- finFilingSyncLog = this.saveSyncLog(data,context);
- } catch (Exception e) {
- log.error("写入同步日志失败:{}",JSON.toJSONString(data));
- continue;
- }
+ FinFilingChannelProperties channelProperties = finFilingConfig.getOutput().getChannel().get(context.getOutputChannelId());
+ channelProperties.setChannelId(context.getOutputChannelId());
+ FinFilingFormProperties formProperties = channelProperties.getForms().get(context.getOutputFormId());
- try {
- // 将转换之后的数据同步到合思
- this.outputData(data,context,finFilingConfig);
- finFilingSyncLog.setInputDataId(data.getInputDataId());
- finFilingSyncLog.setSyncState(SyncStateEnum.SUCCESSED.value());
- finFilingSyncLog.setOutputDataId(data.getOutputDataId());
- log.info("输出成功:{}", JSON.toJSONString(finFilingSyncLog));
- } catch (Exception e) {
- log.error("输出异常",e);
- // 异常状态才记录输入JSON报文,异常信息
- finFilingSyncLog.setSyncState(SyncStateEnum.FAILED.value());
- finFilingSyncLog.setErrorMsg(ExceptionUtil.getExceptionMessage(e));
- log.error("输出失败:{}", JSON.toJSONString(finFilingSyncLog));
- }
+ // 记录同步结果,数据同步状态
+ FinFilingSyncLog finFilingSyncLog = null;
+ try {
+ finFilingSyncLog = this.saveSyncLog(sendData, context);
+ } catch (Exception e) {
+ log.error("写入同步日志失败:{}", JSON.toJSONString(sendData));
+ continue;
+ }
- try {
- updateSyncLog(finFilingSyncLog,context);
- } catch (Exception e) {
- log.error("修改同步日志失败",e);
- continue;
- }
+ try {
+ // 将转换之后的数据同步到合思
+ this.outputData(sendData, context, finFilingConfig);
+ finFilingSyncLog.setSyncState(SyncStateEnum.SUCCESSED.value());
+ finFilingSyncLog.setOutputDataId(sendData.getOutputDataId());
+ log.info("输出成功:{}", JSON.toJSONString(finFilingSyncLog));
+ } catch (Exception e) {
+ log.error("输出异常", e);
+ // 异常状态才记录输入JSON报文,异常信息
+ finFilingSyncLog.setSyncState(SyncStateEnum.FAILED.value());
+ finFilingSyncLog.setErrorMsg(ExceptionUtil.getExceptionMessage(e));
+ log.error("输出失败:{}", JSON.toJSONString(finFilingSyncLog));
+ }
- try {
- Thread.sleep(formProperties.getSleepMS());
- } catch (InterruptedException e) {
- log.error("等待异常", e);
- //continue;
- }
+ try {
+ updateSyncLog(finFilingSyncLog, context);
+ } catch (Exception e) {
+ log.error("修改同步日志失败", e);
+ continue;
+ }
+
+ try {
+ Thread.sleep(formProperties.getSleepMS());
+ } catch (InterruptedException e) {
+ log.error("等待异常", e);
+ //continue;
}
}
-
if (pageInfo.isHasNextPage()) {
syncData(startCursor, endCursor, channelId, formId, pageInfo.getNextPage(), pageSize, totalCount);
}
@@ -202,18 +220,66 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
return totalCount;
}
- private IFinFilingMapping getFinFilingMappingService(String channelId, String formId, String groupId) {
- FinFilingChannelProperties channelProperties = finFilingConfig.getInput().getChannel().get(channelId);
- FinFilingFormProperties formProperties = channelProperties.getForms().get(formId);
- if (StringUtils.isNotBlank(formProperties.getGroupByField())) {
- return FinFilingMappingFactory.getContainer(channelId, formId, groupId);
- }else{
- return FinFilingMappingFactory.getContainer(channelId, formId);
+ private DiPinShiAttendanceTravelInReqVO takeTravelInData(JSONObject jsonObjectDetail) {
+ DiPinShiAttendanceTravelInReqVO travelIn = new DiPinShiAttendanceTravelInReqVO();
+
+ return travelIn;
+ }
+
+ private DiPinShiAttendanceTravelOutReqVO takeTravelOutData(JSONObject jsonObjectDetail) {
+ DiPinShiAttendanceTravelOutReqVO travelOut = new DiPinShiAttendanceTravelOutReqVO();
+
+ return travelOut;
+ }
+
+ private DiPinShiAttendanceTravelOutNotUSAReqVO takeTravelOutNoSUAData(JSONObject jsonObjectDetail) {
+ DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSA = new DiPinShiAttendanceTravelOutNotUSAReqVO();
+
+ return travelOutNotUSA;
+ }
+ private DiPinShiAttendanceGoOutReqVO takeGoOutData(JSONObject jsonObjectDetail) {
+ DiPinShiAttendanceGoOutReqVO goOutReqVO = new DiPinShiAttendanceGoOutReqVO();
+ goOutReqVO.setData(jsonObjectDetail.toJSONString());
+ String userId = jsonObjectDetail.getJSONObject("applyer").getString("userid");
+ goOutReqVO.setApplicant(userId);
+ //TODO 根据userId查询手机号 或者邮箱也可以
+ goOutReqVO.setPhone("");
+ goOutReqVO.setApplicationType(jsonObjectDetail.getString("sp_name"));
+ goOutReqVO.setApprovalNo(jsonObjectDetail.getString("sp_no"));
+ JSONArray contents = jsonObjectDetail.getJSONObject("apply_data").getJSONArray("contents");
+ for (int i = 0; i < contents.size(); i++) {
+ JSONObject content = contents.getJSONObject(i);
+ if (content.getString("control").equals("Attendance")){
+ JSONObject attendance = content.getJSONObject("value").getJSONObject("attendance").getJSONObject("attendance");
+ String start = attendance.getLong("new_begin").toString();
+ String end = attendance.getLong("new_end").toString();
+ //装入的是小时
+ String hours = String.valueOf(attendance.getLong("new_duration") / 3600.0);
+ goOutReqVO.setStartTime(start);
+ goOutReqVO.setEndTime(end);
+ goOutReqVO.setGoOutHours(hours);
+
+ }
+ JSONArray title = content.getJSONArray("title");
+ for (int j = 0; j < title.size(); j++) {
+ String text = title.getJSONObject(j).getString("text");
+ if (text.equals("外出事由")){
+ String reason = content.getJSONObject("value").getString("text");
+ goOutReqVO.setGoOutReason(reason);
+ }
+ //TODO 办公类型
+
+ }
}
+ return goOutReqVO;
+ }
+
+ private IFinFilingMapping getFinFilingMappingService(String channelId, String formId, String groupId) {
+ return FinFilingMappingFactory.getContainer(channelId, formId, groupId);
}
private Map> groupByInputData(String channelId, String formId, List jsonList) {
- Map> dataMap = new HashMap<>();
+ Map> dataMap = new HashMap<>();
FinFilingChannelProperties channelProperties = finFilingConfig.getInput().getChannel().get(channelId);
FinFilingFormProperties formProperties = channelProperties.getForms().get(formId);
String groupByField = formProperties.getGroupByField();
@@ -222,16 +288,16 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
.collect(Collectors.groupingBy(json -> json.getString(groupByField)));
for (String inputFormId : groupByData.keySet()) {
List dataList = toFinFilingDataList(groupByData.get(inputFormId));
- dataMap.put(inputFormId,dataList);
+ dataMap.put(inputFormId, dataList);
}
- }else{
+ } else {
List dataList = toFinFilingDataList(jsonList);
- dataMap.put(formId,dataList);
+ dataMap.put(formId, dataList);
}
return dataMap;
}
- private List toFinFilingDataList(List jsonList){
+ private List toFinFilingDataList(List jsonList) {
List dataList = new ArrayList<>();
for (JSONObject inputData : jsonList) {
FinFilingData data = new FinFilingData();
@@ -244,24 +310,14 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
}
private FinFilingMappingRelationProperties getMappingRelationProperties(String channelId, String formId, String groupId) {
- FinFilingChannelProperties channelProperties = finFilingConfig.getInput().getChannel().get(channelId);
- FinFilingFormProperties formProperties = channelProperties.getForms().get(formId);
-
List relationProperties = finFilingConfig.getMapping().getRelation();
FinFilingMappingRelationProperties matchedRelationProperty = null;
for (FinFilingMappingRelationProperties relationProperty : relationProperties) {
String inputChannelId = relationProperty.getChannelRelation().getInputChannelId();
String inputFormId = relationProperty.getFormRelation().getInputFormId();
+ String inputGroupId = relationProperty.getFormRelation().getInputGroupId();
- String sourceKey;
- if (StringUtils.isNotBlank(formProperties.getGroupByField())) {
- sourceKey = FinFilingMappingFactory.buildContainerKey(channelId,formId,groupId);
- }else{
- sourceKey = FinFilingMappingFactory.buildContainerKey(channelId,formId);
- }
-
- String targetKey = FinFilingMappingFactory.buildContainerKey(inputChannelId,inputFormId);
- if (StringUtils.equalsIgnoreCase(sourceKey, targetKey)) {
+ if (channelId.equals(inputChannelId) && formId.equals(inputFormId) && inputGroupId.equals(groupId)) {
matchedRelationProperty = relationProperty;
break;
}
@@ -269,14 +325,14 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
return matchedRelationProperty;
}
- protected FinFilingSyncLog saveSyncLog(FinFilingData data, FinFilingContext context){
- FinFilingSyncLog finFilingSyncLog = buildSyncLog(data,context);
+ protected FinFilingSyncLog saveSyncLog(FinFilingData data, FinFilingContext context) {
+ FinFilingSyncLog finFilingSyncLog = buildSyncLog(data, context);
finFilingSyncLogService.save(finFilingSyncLog);
return finFilingSyncLog;
}
- protected void updateSyncLog(FinFilingSyncLog finFilingSyncLog,FinFilingContext context) {
+ protected void updateSyncLog(FinFilingSyncLog finFilingSyncLog, FinFilingContext context) {
finFilingSyncLog.setUpdateTime(new Date());
finFilingSyncLogService.updateById(finFilingSyncLog);
}
@@ -305,10 +361,11 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
return finFilingSyncLog;
}
- protected Object callData(FinFilingChannelProperties channelProperties, FinFilingFormProperties formProperties,String reqBody, FinFilingContext context){
+ protected List callData(FinFilingChannelProperties channelProperties, FinFilingFormProperties formProperties, String reqBody, FinFilingContext context) {
String result = null;
String reqUrl = formProperties.getReqUrl();
- if(!(StringUtils.startsWithIgnoreCase(reqUrl,"http://") || StringUtils.startsWithIgnoreCase(reqUrl,"https://"))){
+ List spNoList = new ArrayList<>();
+ if (!(StringUtils.startsWithIgnoreCase(reqUrl, "http://") || StringUtils.startsWithIgnoreCase(reqUrl, "https://"))) {
String host = channelProperties.getHost();
reqUrl = host + reqUrl;
}
@@ -317,9 +374,9 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
Map reqHeader = replaceVariable(channelProperties.getReqHeader(), context, channelProperties);
String reqMethod = formProperties.getReqMethod();
- if(HttpMethod.GET.name().equalsIgnoreCase(reqMethod)){
+ if (HttpMethod.GET.name().equalsIgnoreCase(reqMethod)) {
Map reqParam = replaceVariable(formProperties.getReqParam(), context, channelProperties);
- if(!CollectionUtils.isEmpty(formProperties.getReqHeader())) {
+ if (!CollectionUtils.isEmpty(formProperties.getReqHeader())) {
if (!CollectionUtils.isEmpty(reqHeader)) {
reqHeader.putAll(replaceVariable(formProperties.getReqHeader(), context, channelProperties));
} else {
@@ -327,34 +384,51 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
}
}
result = OkHttpClientUtil.doGet(reqUrl, reqParam, reqHeader);
- }else if(HttpMethod.POST.name().equalsIgnoreCase(reqMethod)){
- if(StringUtils.isBlank(reqBody)){
+ } else if (HttpMethod.POST.name().equalsIgnoreCase(reqMethod)) {
+ if (StringUtils.isBlank(reqBody)) {
reqBody = replaceVariable(formProperties.getReqBody(), context, channelProperties);
}
- if(!CollectionUtils.isEmpty(formProperties.getReqHeader())) {
+ if (!CollectionUtils.isEmpty(formProperties.getReqHeader())) {
if (!CollectionUtils.isEmpty(reqHeader)) {
reqHeader.putAll(replaceVariable(formProperties.getReqHeader(), context, channelProperties));
} else {
reqHeader = replaceVariable(formProperties.getReqHeader(), context, channelProperties);
}
}
- result = OkHttpClientUtil.doPostJson(reqUrl, reqBody, reqHeader);
- }else{
- throw new RuntimeException("暂不支持的请求方式:"+reqMethod);
+
+ if (ChannelEnum.HOSECLOUD.getChannelId().equals(channelProperties.getChannelId())) {
+ result = OkHttpClientUtil.doPostJson(reqUrl, reqBody, reqHeader);
+ JSONObject res = JSONObject.parseObject(JSONObject.toJSONString(result));
+ String id = res.getJSONObject("flow").getString("id");
+ spNoList.add(id);
+ } else {
+ String newNextCursor = "";
+ do {
+ result = OkHttpClientUtil.doPostJson(reqUrl, reqBody, reqHeader);
+ JSONObject res = JSONObject.parseObject(result);
+ JSONArray jsonArray = res.getJSONArray("sp_no_list");
+ spNoList.addAll(jsonArray.toJavaList(String.class));
+ newNextCursor = res.getString("new_next_cursor");
+ } while (StringUtils.isNotBlank(newNextCursor));
+ }
+
+
+ } else {
+ throw new RuntimeException("暂不支持的请求方式:" + reqMethod);
}
- if(StringUtils.isBlank(result)){
- throw new RuntimeException("接口返回报文为空:"+context);
+ if (StringUtils.isBlank(result)) {
+ throw new RuntimeException("接口返回报文为空:" + context);
}
- String resDataRootNode = formProperties.getResDataRootNode();
- return JSONPath.eval(result, resDataRootNode);
+
+ return spNoList;
}
- private Map replaceVariable(Map param,FinFilingContext context,FinFilingChannelProperties channelProperties) {
+ private Map replaceVariable(Map param, FinFilingContext context, FinFilingChannelProperties channelProperties) {
if (!CollectionUtils.isEmpty(param)) {
param = param.entrySet().stream()
.map(entry -> {
String value = entry.getValue();
- value = replaceVariable(value,context,channelProperties);
+ value = replaceVariable(value, context, channelProperties);
return new AbstractMap.SimpleEntry<>(entry.getKey(), value);
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@@ -364,41 +438,41 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
private String replaceVariable(String param, FinFilingContext context) {
if (StringUtils.isNotBlank(param)) {
- if(StringUtils.contains(param,"{startCursor}")){
+ if (StringUtils.contains(param, "{startCursor}")) {
param = StringUtils.replace(param, "{startCursor}", context.getStartCursor());
}
- if(StringUtils.contains(param,"{endCursor}")){
+ if (StringUtils.contains(param, "{endCursor}")) {
param = StringUtils.replace(param, "{endCursor}", context.getEndCursor());
}
- if(StringUtils.contains(param,"{pageNum}")){
+ if (StringUtils.contains(param, "{pageNum}")) {
param = StringUtils.replace(param, "{pageNum}", context.getPageNum().toString());
}
- if(StringUtils.contains(param,"{pageSize}")){
+ if (StringUtils.contains(param, "{pageSize}")) {
param = StringUtils.replace(param, "{pageSize}", context.getPageSize().toString());
}
- if(StringUtils.contains(param,"{inputChannelId}")){
+ if (StringUtils.contains(param, "{inputChannelId}")) {
param = StringUtils.replace(param, "{inputChannelId}", context.getInputChannelId());
}
- if(StringUtils.contains(param,"{inputFormId}")){
+ if (StringUtils.contains(param, "{inputFormId}")) {
param = StringUtils.replace(param, "{inputFormId}", context.getInputFormId());
}
- if(StringUtils.contains(param,"{outputChannelId}")){
+ if (StringUtils.contains(param, "{outputChannelId}")) {
param = StringUtils.replace(param, "{outputChannelId}", context.getOutputChannelId());
}
- if(StringUtils.contains(param,"{outputFormId}")){
+ if (StringUtils.contains(param, "{outputFormId}")) {
param = StringUtils.replace(param, "{outputFormId}", context.getOutputFormId());
}
- if(StringUtils.contains(param,"{outputDataId}")){
+ if (StringUtils.contains(param, "{outputDataId}")) {
param = StringUtils.replace(param, "{outputDataId}", context.getOutputDataId());
}
}
return param;
}
- private String replaceVariable(String param, FinFilingContext context,FinFilingChannelProperties channelProperties) {
+ private String replaceVariable(String param, FinFilingContext context, FinFilingChannelProperties channelProperties) {
param = replaceVariable(param, context);
if (StringUtils.isNotBlank(param)) {
- if(StringUtils.contains(param,"{accessToken}")){
+ if (StringUtils.contains(param, "{accessToken}")) {
IFinFilingAccessTokenService accessTokenService = getAccessTokenService(channelProperties.getChannelId());
String accessToken = accessTokenService.getAccessToken(channelProperties).getAccessToken();
param = StringUtils.replace(param, "{accessToken}", accessToken);
@@ -407,14 +481,13 @@ public abstract class AbstractFinFilingService implements IFinFilingService {
return param;
}
- protected IFinFilingAccessTokenService getAccessTokenService(String channelId){
+ protected IFinFilingAccessTokenService getAccessTokenService(String channelId) {
return FinFilingAccessTokenFactory.getContainer(channelId);
}
- protected abstract PageInfo inputData(FinFilingContext context, FinFilingConfig finFilingConfig);
+ protected abstract PageInfo inputData(FinFilingContext context, FinFilingConfig finFilingConfig);
protected abstract void outputData(FinFilingData data, FinFilingContext context, FinFilingConfig finFilingConfig);
-
}
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/DefaultFormAtFinFilingService.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/DefaultFormAtFinFilingService.java
deleted file mode 100644
index c6e5bea..0000000
--- a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/DefaultFormAtFinFilingService.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package cn.jiutqy.finfiling.common.service;
-
-import cn.jiutqy.archives.common.exception.ServiceException;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.JSONPath;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.github.pagehelper.PageInfo;
-import cn.jiutqy.finfiling.common.config.FinFilingConfig;
-import cn.jiutqy.finfiling.common.config.properties.FinFilingChannelProperties;
-import cn.jiutqy.finfiling.common.config.properties.FinFilingFormProperties;
-import cn.jiutqy.finfiling.common.domain.FinFilingSyncLog;
-import cn.jiutqy.finfiling.common.dto.FinFilingData;
-import cn.jiutqy.finfiling.common.enums.SyncStateEnum;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-import java.util.List;
-
-@Slf4j
-@Component
-public class DefaultFormAtFinFilingService extends AbstractFinFilingService{
-
- @Autowired
- private IFinFilingSyncLogService finFilingSyncLogService;
-
-
- @Override
- protected PageInfo inputData(FinFilingContext context, FinFilingConfig finFilingConfig) {
- LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
- queryWrapper.eq(FinFilingSyncLog::getInputChannelId,context.getInputChannelId());
- //queryWrapper.likeRight(FinFilingSyncLog::getInputFormId,context.getInputFormId());
- queryWrapper.eq(FinFilingSyncLog::getSyncState, SyncStateEnum.SUCCESSED.value());
- queryWrapper.ne(FinFilingSyncLog::getAtSyncState, SyncStateEnum.SUCCESSED.value());
-
- Page page = new Page<>(context.getPageNum(),context.getPageSize());
- page = finFilingSyncLogService.page(page,queryWrapper);
-
- List jsonList = (List) JSON.toJSON(page.getRecords());
-
- PageInfo pageInfo = new PageInfo<>(jsonList);
-
- pageInfo.setHasNextPage(page.hasNext());
- pageInfo.setNextPage(context.getPageNum() + 1);
-
- return pageInfo;
-
- }
-
- @Override
- protected void outputData(FinFilingData data, FinFilingContext context, FinFilingConfig finFilingConfig){
- FinFilingChannelProperties channelProperties = finFilingConfig.getOutput().getChannel().get(context.getOutputChannelId());
- channelProperties.setChannelId(context.getOutputChannelId());
- FinFilingFormProperties formProperties = channelProperties.getForms().get(context.getOutputFormId());
-
- Object result = callData(channelProperties,formProperties,String.valueOf(data.getOutputData()),context);
- String outputDataId = null;
- try {
- outputDataId = (String) JSONPath.eval(result, formProperties.getResDataIdNode());
- } catch (Exception e) {
- throw new ServiceException("无法解析resDataIdNode,返回报文:"+result);
- }
- context.addOutputDataId(outputDataId);
- }
-
- @Override
- protected FinFilingSyncLog saveSyncLog(FinFilingData data, FinFilingContext context) {
- FinFilingSyncLog finFilingSyncLog = data.getInputData().toJavaObject(FinFilingSyncLog.class);
- return finFilingSyncLog;
- }
-
- @Override
- protected void updateSyncLog(FinFilingSyncLog finFilingSyncLog, FinFilingContext context) {
- FinFilingSyncLog entity = new FinFilingSyncLog();
- entity.setLogId(finFilingSyncLog.getLogId());
- entity.setAtSyncState(finFilingSyncLog.getSyncState());
- entity.setAtErrorMsg(finFilingSyncLog.getErrorMsg());
- entity.setUpdateTime(new Date());
- finFilingSyncLogService.updateById(entity);
- }
-}
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/DefaultFormFinFilingService.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/DefaultFormFinFilingService.java
index 583910f..062fd26 100644
--- a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/DefaultFormFinFilingService.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/DefaultFormFinFilingService.java
@@ -1,66 +1,93 @@
package cn.jiutqy.finfiling.common.service;
-import cn.jiutqy.archives.common.exception.ServiceException;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.fastjson2.JSONPath;
import com.github.pagehelper.PageInfo;
import cn.jiutqy.finfiling.common.config.FinFilingConfig;
import cn.jiutqy.finfiling.common.config.properties.FinFilingChannelProperties;
import cn.jiutqy.finfiling.common.config.properties.FinFilingFormProperties;
import cn.jiutqy.finfiling.common.dto.FinFilingData;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
@Slf4j
@Component
-public class DefaultFormFinFilingService extends AbstractFinFilingService{
+public class DefaultFormFinFilingService extends AbstractFinFilingService {
+ private static final String APPLICATION_TEM_ID = "";
+
+ private static final String TRAVEL = "3";
+
+ private static final String GO_OUT = "4";
@Override
- protected PageInfo inputData(FinFilingContext context, FinFilingConfig finFilingConfig){
+ protected PageInfo inputData(FinFilingContext context, FinFilingConfig finFilingConfig) {
FinFilingChannelProperties channelProperties = finFilingConfig.getInput().getChannel().get(context.getInputChannelId());
channelProperties.setChannelId(context.getInputChannelId());
FinFilingFormProperties formProperties = channelProperties.getForms().get(context.getInputFormId());
- JSONArray jsonArray = (JSONArray)callData(channelProperties, formProperties, null, context);
+ //构建请求体
+ JSONObject reqBody = new JSONObject();
+ reqBody.put("starttime", convert(context.getStartCursor()));
+ reqBody.put("endtime", convert(context.getEndCursor()));
+ reqBody.put("new_cursor", "");
+ reqBody.put("size", 100);
+ JSONArray filters = new JSONArray();
+ JSONObject type = new JSONObject();
+ if ("goOut".equals(context.getInputFormId())) {
+ type.put("key", "record_type");
+ type.put("value", GO_OUT);
+ } else {
+ type.put("key", "record_type");
+ type.put("value", TRAVEL);
+ }
+ filters.add(type);
+ reqBody.put("filters", filters);
- List jsonList = IntStream.range(0, jsonArray.size())
- .mapToObj(jsonArray::getJSONObject)
- .collect(Collectors.toList());
+ List result = callData(channelProperties, formProperties, reqBody.toJSONString(), context);
- PageInfo pageInfo = new PageInfo<>(jsonList);
+ PageInfo pageInfo = new PageInfo<>(result);
- pageInfo.setHasNextPage(jsonList.size() == context.getPageSize());
+ pageInfo.setHasNextPage(result.size() == context.getPageSize());
pageInfo.setNextPage(context.getPageNum() + 1);
return pageInfo;
}
+ //将日期转成时间戳 xxxx-xx-xx xx:xx:xx
+ public long convert(String dateStr) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+
+ // 要转换的时间
+ Date date = null;
+ try {
+ date = sdf.parse(dateStr);
+
+ } catch (ParseException e) {
+ log.error("转换时间失败");
+ }
+
+ return date.getTime() / 1000;
+ }
+
@Override
- protected void outputData(FinFilingData data, FinFilingContext context, FinFilingConfig finFilingConfig){
+ protected void outputData(FinFilingData data, FinFilingContext context, FinFilingConfig finFilingConfig) {
FinFilingChannelProperties channelProperties = finFilingConfig.getOutput().getChannel().get(context.getOutputChannelId());
channelProperties.setChannelId(context.getOutputChannelId());
FinFilingFormProperties formProperties = channelProperties.getForms().get(context.getOutputFormId());
- Object result = callData(channelProperties,formProperties,String.valueOf(data.getOutputData()),context);
- log.info("输出报文:{}",result);
- String outputDataId = null;
- try {
- outputDataId = (String) JSONPath.eval(result, formProperties.getResDataIdNode());
- } catch (Exception e) {
- throw new ServiceException("无法解析resDataIdNode,返回报文:"+result+" 上下文:"+context);
- }
+ List result = callData(channelProperties, formProperties, String.valueOf(data.getOutputData()), context);
- if(StringUtils.isBlank(outputDataId)){
- throw new ServiceException("无法解析resDataIdNode,返回报文: "+ result+" 上下文:"+context);
- }
- data.setOutputDataId(outputDataId);
+ String documentId = result.get(1);
+ log.info("同步到合思成功,单据id为:{}", documentId);
+
+ data.setOutputDataId(documentId);
}
}
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/IFinFilingMapping.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/IFinFilingMapping.java
index fd19e58..6d0ca1a 100644
--- a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/IFinFilingMapping.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/common/service/IFinFilingMapping.java
@@ -4,19 +4,21 @@ import cn.jiutqy.finfiling.common.config.FinFilingConfig;
import cn.jiutqy.finfiling.common.config.properties.FinFilingMappingRelationProperties;
import cn.jiutqy.finfiling.common.dto.FinFilingData;
import cn.jiutqy.finfiling.common.factory.FinFilingMappingFactory;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceReqVO;
import java.util.List;
+import java.util.Map;
public interface IFinFilingMapping {
- default void mapping(List dataList, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig){
+ /*default void mapping(List dataList, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig){
for (FinFilingData data : dataList) {
mapping(data,context,mappingRelationProperties,finFilingConfig);
}
- }
+ }*/
//void mapping(List dataList, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig);
- void mapping(FinFilingData data, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig);
+ FinFilingData mapping(DiPinShiAttendanceReqVO reqVO, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig);
default void registerSelf(IFinFilingFormService form, IFinFilingMapping mappingService){
FinFilingMappingFactory.addContainer(form.getChannelId(),form.getFormId(),mappingService);
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/AbstractDiPinShiBaseService.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/AbstractDiPinShiBaseService.java
new file mode 100644
index 0000000..2574e26
--- /dev/null
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/AbstractDiPinShiBaseService.java
@@ -0,0 +1,18 @@
+package cn.jiutqy.finfiling.dipinshi;
+
+import cn.jiutqy.finfiling.common.enums.ChannelTypeEnum;
+import cn.jiutqy.finfiling.common.factory.FinFilingAccessTokenFactory;
+import cn.jiutqy.finfiling.common.service.IFinFilingAccessTokenService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+@Component
+public abstract class AbstractDiPinShiBaseService {
+
+ protected String getAccessToken(String url, String channelId, ChannelTypeEnum channelTypeEnum){
+ IFinFilingAccessTokenService accessTokenService = FinFilingAccessTokenFactory.getContainer(channelId);
+ String accessToken = accessTokenService.getAccessToken(channelId, channelTypeEnum).getAccessToken();
+ return StringUtils.replace(url,"{accessToken}",accessToken);
+
+ }
+}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiFinFilingService.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/DiPinShiFinFilingService.java
similarity index 98%
rename from fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiFinFilingService.java
rename to fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/DiPinShiFinFilingService.java
index 783387a..57885f6 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiFinFilingService.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/DiPinShiFinFilingService.java
@@ -1,4 +1,4 @@
-package cn.jiutqy.finfiling.quartz.dipinshi;
+package cn.jiutqy.finfiling.dipinshi;
import cn.jiutqy.archives.common.utils.StringUtils;
import cn.jiutqy.archives.common.utils.http.OkHttpClientUtil;
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/IDiPinShiFinFilingService.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/IDiPinShiFinFilingService.java
similarity index 85%
rename from fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/IDiPinShiFinFilingService.java
rename to fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/IDiPinShiFinFilingService.java
index 80c13fc..61662d8 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/IDiPinShiFinFilingService.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/IDiPinShiFinFilingService.java
@@ -1,4 +1,4 @@
-package cn.jiutqy.finfiling.quartz.dipinshi;
+package cn.jiutqy.finfiling.dipinshi;
import java.util.List;
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/constants/BusinessTypeEnum.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/constants/BusinessTypeEnum.java
new file mode 100644
index 0000000..2a2e258
--- /dev/null
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/constants/BusinessTypeEnum.java
@@ -0,0 +1,23 @@
+package cn.jiutqy.finfiling.dipinshi.constants;
+
+import lombok.Getter;
+
+@Getter
+public enum BusinessTypeEnum {
+
+ GO_OUT("ID01ErfUV64viD", "外出"),
+
+ TRAVEL_IN("ID01DLQ36ToAB9", "国内出差"),
+
+ TRAVEL_OUT("ID01DLQ21tIZeD", "国际出差"),
+
+ TRAVEL_OUT_NOT_USA("ID01ErfRpaaLYH", "国际出差非美国");
+
+ private final String name;
+ private final String code;
+
+ BusinessTypeEnum(String code, String name) {
+ this.code = code;
+ this.name = name;
+ }
+}
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/constants/WeChatTitleConstants.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/constants/WeChatTitleConstants.java
new file mode 100644
index 0000000..ddbfac1
--- /dev/null
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/constants/WeChatTitleConstants.java
@@ -0,0 +1,13 @@
+package cn.jiutqy.finfiling.dipinshi.constants;
+
+public class WeChatTitleConstants {
+
+ public static final String goOutReason = "外出事由";
+
+ //文本
+ public static final String goOutLocation = "外出地点";
+
+ //假期
+ public static final String ATTENDANCE = "Attendance";
+
+}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceGoOutReqVO.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceGoOutReqVO.java
similarity index 85%
rename from fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceGoOutReqVO.java
rename to fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceGoOutReqVO.java
index 3c08781..29c004f 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceGoOutReqVO.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceGoOutReqVO.java
@@ -1,4 +1,4 @@
-package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
+package cn.jiutqy.finfiling.dipinshi.vo.req;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceReqVO.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceReqVO.java
similarity index 79%
rename from fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceReqVO.java
rename to fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceReqVO.java
index 7fa27a9..26230a6 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceReqVO.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceReqVO.java
@@ -1,4 +1,4 @@
-package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
+package cn.jiutqy.finfiling.dipinshi.vo.req;
import lombok.Data;
@@ -10,6 +10,11 @@ public class DiPinShiAttendanceReqVO {
*/
private String applicant;
+ /**
+ * 手机号
+ */
+ private String phone;
+
/**
* 申请类型
*/
@@ -38,6 +43,6 @@ public class DiPinShiAttendanceReqVO {
/**
* 出差类型
*/
- private String travelType;
+ private String type;
}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelInReqVO.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelInReqVO.java
similarity index 89%
rename from fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelInReqVO.java
rename to fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelInReqVO.java
index df7ae65..54a243d 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelInReqVO.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelInReqVO.java
@@ -1,4 +1,4 @@
-package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
+package cn.jiutqy.finfiling.dipinshi.vo.req;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelOutNotUSAReqVO.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelOutNotUSAReqVO.java
similarity index 89%
rename from fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelOutNotUSAReqVO.java
rename to fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelOutNotUSAReqVO.java
index ef90a13..8a8cd3d 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelOutNotUSAReqVO.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelOutNotUSAReqVO.java
@@ -1,4 +1,4 @@
-package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
+package cn.jiutqy.finfiling.dipinshi.vo.req;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelOutReqVO.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelOutReqVO.java
similarity index 79%
rename from fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelOutReqVO.java
rename to fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelOutReqVO.java
index f633334..1ef61f1 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/req/DiPinShiAttendanceTravelOutReqVO.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/DiPinShiAttendanceTravelOutReqVO.java
@@ -1,4 +1,4 @@
-package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req;
+package cn.jiutqy.finfiling.dipinshi.vo.req;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/TravelDetail.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/TravelDetail.java
new file mode 100644
index 0000000..6c8186c
--- /dev/null
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/req/TravelDetail.java
@@ -0,0 +1,33 @@
+package cn.jiutqy.finfiling.dipinshi.vo.req;
+
+import lombok.Data;
+
+@Data
+public class TravelDetail {
+
+ /**
+ * 拜访日期
+ */
+ private String visitDate;
+
+ /**
+ * 国家、地区
+ */
+ private String address;
+
+ /**
+ * 供应商名称
+ */
+ private String vendorName;
+
+ /**
+ * 供应商类型
+ */
+ private String vendorType;
+
+ /**
+ * 出差目的
+ */
+ private String travelPurpose;
+
+}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/resp/DiPinShiAttendanceRespVO.java b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/resp/DiPinShiAttendanceRespVO.java
similarity index 52%
rename from fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/resp/DiPinShiAttendanceRespVO.java
rename to fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/resp/DiPinShiAttendanceRespVO.java
index c5c635f..ac472a4 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/attendance/vo/resp/DiPinShiAttendanceRespVO.java
+++ b/fin-filing-common/src/main/java/cn/jiutqy/finfiling/dipinshi/vo/resp/DiPinShiAttendanceRespVO.java
@@ -1,4 +1,4 @@
-package cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.resp;
+package cn.jiutqy.finfiling.dipinshi.vo.resp;
import lombok.Data;
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiAccessTokenService.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiAccessTokenService.java
index 14728fa..d510f7d 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiAccessTokenService.java
+++ b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiAccessTokenService.java
@@ -10,7 +10,9 @@ import cn.jiutqy.finfiling.quartz.dipinshi.dto.DiPinShiAccessToken;
import com.alibaba.fastjson2.JSON;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean;
+import org.springframework.stereotype.Component;
+@Component
public class DiPinShiAccessTokenService extends AbstractFinFilingAccessTokenService implements IFinFilingAccessTokenService, InitializingBean {
@Override
protected FinFilingAccessToken getAccessToken(FinFilingOauthProperties oauthProperties) {
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiGoOutMapping.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiGoOutMapping.java
new file mode 100644
index 0000000..4243354
--- /dev/null
+++ b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiGoOutMapping.java
@@ -0,0 +1,37 @@
+package cn.jiutqy.finfiling.quartz.dipinshi;
+
+import cn.jiutqy.finfiling.common.config.FinFilingConfig;
+import cn.jiutqy.finfiling.common.config.properties.FinFilingMappingRelationProperties;
+import cn.jiutqy.finfiling.common.dto.FinFilingData;
+import cn.jiutqy.finfiling.common.enums.ChannelEnum;
+import cn.jiutqy.finfiling.common.enums.FormEnum;
+import cn.jiutqy.finfiling.common.service.FinFilingContext;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceGoOutReqVO;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceReqVO;
+
+import java.util.Map;
+
+public class DiPinShiGoOutMapping extends DiPinShiMapping {
+
+ @Override
+ public FinFilingData mapping(DiPinShiAttendanceReqVO reqVO, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig) {
+
+ DiPinShiAttendanceGoOutReqVO travelInRep = (DiPinShiAttendanceGoOutReqVO) reqVO;
+
+ //将企微的数据 转成保存到合思同步时需要的数据,一个一个取出来塞进map里
+
+
+ //将travelOutRep里的数据取出来放入一个map中
+ Map data = null;
+ //取数据
+
+ //构建请求体
+ return mappingSendData(data, travelInRep);
+ }
+
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ super.registerSelf(FormEnum.GO_OUT,"goOut",this);
+ }
+}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiMapping.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiMapping.java
new file mode 100644
index 0000000..3c5bb3b
--- /dev/null
+++ b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiMapping.java
@@ -0,0 +1,214 @@
+package cn.jiutqy.finfiling.quartz.dipinshi;
+
+import cn.jiutqy.finfiling.common.domain.FinFilingSyncLog;
+import cn.jiutqy.finfiling.common.dto.FinFilingData;
+import cn.jiutqy.finfiling.common.service.IFinFilingMapping;
+import cn.jiutqy.finfiling.common.service.IFinFilingSyncLogService;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceReqVO;
+import cn.jiutqy.finfiling.quartz.constants.*;
+import cn.jiutqy.finfiling.quartz.hosecloud.organize.IHoseCloudPersonnelService;
+import cn.jiutqy.finfiling.quartz.hosecloud.organize.vo.HoseCloudPersonnelVO;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component
+public abstract class DiPinShiMapping implements IFinFilingMapping , InitializingBean {
+
+ private static final String LEGAL_ENTITY_ID = "ID01Dnd2qUASmj";
+
+ @Resource
+ private IFinFilingSyncLogService finFilingSyncLogService;
+
+ @Resource
+ private IHoseCloudPersonnelService personnelService;
+
+ protected FinFilingData mappingSendData(Map data, DiPinShiAttendanceReqVO reqVO) {
+ FinFilingData finFilingData = new FinFilingData();
+ //填充审批单号
+ FinFilingSyncLog finFilingSyncLog = finFilingSyncLogService.getFinFilingSyncLogByInputDataId("审批单号");
+ if (finFilingSyncLog != null) {
+ log.info("输入数据[{}]已同步", "审批单号");
+ return null;
+ }
+
+ JSONObject form = new JSONObject();
+ form.put("specificationId", TemplateAndCostConstants.TEMPLATE_DETAIL_ID);
+ //先填充公用的数据
+ //需要调用接口查询员工id
+ List strings = new ArrayList<>();
+ HoseCloudPersonnelVO personnelVO = personnelService.queryUser(strings);
+ form.put("submitterId", personnelVO.getId());
+ //申请日期需要转成时间戳 --看是什么样子的时间,然后转成时间戳
+ form.put("requisitionDate", "申请日期");
+ //法人实体不确定填写中文还是公司id
+ form.put("法人实体", LEGAL_ENTITY_ID);
+ //需要调用接口查询员工部门
+ form.put("expenseDepartment", personnelVO.getDefaultDepartment());
+ //需要转成时间戳
+ form.put("u_开始时间", "u_开始时间");
+ form.put("u_结束时间", "u_结束时间");
+
+ //根据类型填充详情
+ if (BusinessTypeEnum.GO_OUT.getName().equals(data.get("applicationType"))) {
+ hoseGoOutMapping(data, form);
+ } else if (BusinessTypeEnum.TRAVEL_IN.getName().equals(data.get("travelType"))) {
+ hoseTravelInMapping(data, form);
+ } else if (BusinessTypeEnum.TRAVEL_OUT.getName().equals(data.get("travelType"))) {
+ hoseTravelOutMapping(data, form);
+ } else if (BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getName().equals(data.get("travelType"))) {
+ hoseTravelOutNotUSAMapping(data, form);
+ }
+
+ finFilingData.setInputData(JSONObject.parseObject(JSONObject.toJSONString(reqVO.getData())));
+ finFilingData.setInputDataId(reqVO.getApprovalNo());
+ finFilingData.setOutputData(form);
+
+ return finFilingData;
+ }
+
+ private void hoseGoOutMapping(Map data, JSONObject form) {
+ form.put("u_出差类型", BusinessTypeEnum.GO_OUT.getCode());
+ String officeType = data.get("officeType");
+
+ form.put("u_办公类型",officeType.equals("居家办公") ? OfficeTypeCodeConstants.HOME_OFFICE : OfficeTypeCodeConstants.OUTSIDE_OFFICE);
+ //要么直接有时间,要么需要算时间
+ form.put("公出时长","");
+
+ //可能会有多个详情 需要遍历填充数据
+ JSONArray details = new JSONArray();
+
+ JSONObject detail = new JSONObject();
+ detail.put("feeTypeId",TemplateAndCostConstants.FEE_TYPE_ID);
+ detail.put("specificationId",TemplateAndCostConstants.FEE_TYPE_DETAIL_ID);
+
+ JSONObject feeTypeForm = new JSONObject();
+ //填充公出事由
+ feeTypeForm.put("u_公出事由","");
+ detail.put("feeTypeForm",feeTypeForm);
+ details.add(detail);
+
+ form.put("details",details);
+ }
+
+
+ private void hoseTravelInMapping(Map data, JSONObject form) {
+ form.put("u_出差类型",BusinessTypeEnum.TRAVEL_IN.getCode());
+ //要么直接有时间,要么需要算时间
+ form.put("出差天数","");
+
+ //可能会有多个详情 需要遍历填充数据
+ JSONArray details = new JSONArray();
+
+ JSONObject detail = new JSONObject();
+ detail.put("feeTypeId",TemplateAndCostConstants.FEE_TYPE_ID);
+ detail.put("specificationId",TemplateAndCostConstants.FEE_TYPE_DETAIL_ID);
+
+ JSONObject feeTypeForm = new JSONObject();
+ //填充数据
+ feeTypeForm.put("u_拜访日期","");
+ feeTypeForm.put("u_VendorName","");
+
+ if (VendorTypeEnum.EXISTING_VENDOR_WITH_SHIPMENT.getName().equals(data.get("供应商类型"))){
+ feeTypeForm.put("u_供应商类型",VendorTypeEnum.EXISTING_VENDOR_WITH_SHIPMENT.getCode());
+ }else if (VendorTypeEnum.KNOWN_VENDOR_WITHOUT_SHIPMENT.getName().equals(data.get("供应商类型"))){
+ feeTypeForm.put("u_供应商类型",VendorTypeEnum.KNOWN_VENDOR_WITHOUT_SHIPMENT.getCode());
+ }else if (VendorTypeEnum.NEW_VENDOR.getName().equals(data.get("供应商类型"))){
+ feeTypeForm.put("u_供应商类型",VendorTypeEnum.NEW_VENDOR.getCode());
+ }
+
+ //取出data里的出差目的,data里的出差目前有多个,用分号隔开,
+ feeTypeForm.put("u_出差",assemblePurpose(data));
+ detail.put("feeTypeForm",feeTypeForm);
+ details.add(detail);
+
+ form.put("details",details);
+ }
+
+ private void hoseTravelOutMapping(Map data, JSONObject form) {
+ form.put("u_出差类型",BusinessTypeEnum.TRAVEL_OUT.getCode());
+ //要么直接有时间,要么需要算时间
+ form.put("出差天数","");
+
+ //可能会有多个详情 需要遍历填充数据
+ JSONArray details = new JSONArray();
+
+ JSONObject detail = new JSONObject();
+ detail.put("feeTypeId",TemplateAndCostConstants.FEE_TYPE_ID);
+ detail.put("specificationId",TemplateAndCostConstants.FEE_TYPE_DETAIL_ID);
+
+ JSONObject feeTypeForm = new JSONObject();
+ //填充数据
+ feeTypeForm.put("u_出差",assemblePurpose(data));
+ detail.put("feeTypeForm",feeTypeForm);
+ details.add(detail);
+
+ form.put("details",details);
+ }
+
+
+
+ private void hoseTravelOutNotUSAMapping(Map data, JSONObject form) {
+ form.put("u_出差类型",BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getCode());
+ //要么直接有时间,要么需要算时间
+ form.put("出差天数","");
+
+ //可能会有多个详情 需要遍历填充数据
+ JSONArray details = new JSONArray();
+
+ JSONObject detail = new JSONObject();
+ detail.put("feeTypeId",TemplateAndCostConstants.FEE_TYPE_ID);
+ detail.put("specificationId",TemplateAndCostConstants.FEE_TYPE_DETAIL_ID);
+
+ JSONObject feeTypeForm = new JSONObject();
+ //填充数据
+ feeTypeForm.put("u_拜访日期","");
+ feeTypeForm.put("u_出差目的地","");
+ feeTypeForm.put("u_VendorName","");
+
+ if (VendorTypeEnum.EXISTING_VENDOR_WITH_SHIPMENT.getName().equals(data.get("供应商类型"))){
+ feeTypeForm.put("u_供应商类型",VendorTypeEnum.EXISTING_VENDOR_WITH_SHIPMENT.getCode());
+ }else if (VendorTypeEnum.KNOWN_VENDOR_WITHOUT_SHIPMENT.getName().equals(data.get("供应商类型"))){
+ feeTypeForm.put("u_供应商类型",VendorTypeEnum.KNOWN_VENDOR_WITHOUT_SHIPMENT.getCode());
+ }else if (VendorTypeEnum.NEW_VENDOR.getName().equals(data.get("供应商类型"))){
+ feeTypeForm.put("u_供应商类型",VendorTypeEnum.NEW_VENDOR.getCode());
+ }
+ feeTypeForm.put("u_供应商类型","");
+ feeTypeForm.put("u_出差",assemblePurpose(data));
+ detail.put("feeTypeForm",feeTypeForm);
+ details.add(detail);
+
+ form.put("details",details);
+ }
+
+ //填充出差目的
+ private List assemblePurpose(Map data){
+ String purpose = data.get("出差目的");
+ List purposes = Arrays.asList(purpose.split(";"));
+ return covertPurposesToCodes(purposes);
+ }
+
+ private List covertPurposesToCodes(List purposes) {
+ List codes = new ArrayList<>();
+ for (String purpose : purposes) {
+ String code = TravelPurposeEnum.getCodeByName(purpose);
+ if (code != null) {
+ codes.add(code);
+ } else {
+ log.warn("未找到对应的出差目的: {}", purpose);
+ }
+ }
+ return codes;
+
+ }
+
+}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelInMapping.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelInMapping.java
new file mode 100644
index 0000000..21ec6f4
--- /dev/null
+++ b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelInMapping.java
@@ -0,0 +1,31 @@
+package cn.jiutqy.finfiling.quartz.dipinshi;
+
+import cn.jiutqy.finfiling.common.config.FinFilingConfig;
+import cn.jiutqy.finfiling.common.config.properties.FinFilingMappingRelationProperties;
+import cn.jiutqy.finfiling.common.dto.FinFilingData;
+import cn.jiutqy.finfiling.common.enums.FormEnum;
+import cn.jiutqy.finfiling.common.service.FinFilingContext;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceReqVO;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceTravelInReqVO;
+
+import java.util.Map;
+
+public class DiPinShiTravelInMapping extends DiPinShiMapping {
+ @Override
+ public FinFilingData mapping(DiPinShiAttendanceReqVO reqVO, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig) {
+ DiPinShiAttendanceTravelInReqVO travelInRep = (DiPinShiAttendanceTravelInReqVO) reqVO;
+
+
+ //将travelOutRep里的数据取出来放入一个map中
+ Map data = null;
+ //取数据
+
+ //构建请求体
+ return mappingSendData(data, travelInRep);
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ super.registerSelf(FormEnum.TRAVEL,"travelIn",this);
+ }
+}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelNoUSAMapping.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelNoUSAMapping.java
new file mode 100644
index 0000000..45799aa
--- /dev/null
+++ b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelNoUSAMapping.java
@@ -0,0 +1,30 @@
+package cn.jiutqy.finfiling.quartz.dipinshi;
+
+import cn.jiutqy.finfiling.common.config.FinFilingConfig;
+import cn.jiutqy.finfiling.common.config.properties.FinFilingMappingRelationProperties;
+import cn.jiutqy.finfiling.common.dto.FinFilingData;
+import cn.jiutqy.finfiling.common.enums.FormEnum;
+import cn.jiutqy.finfiling.common.service.FinFilingContext;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceReqVO;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceTravelOutNotUSAReqVO;
+
+import java.util.Map;
+
+public class DiPinShiTravelNoUSAMapping extends DiPinShiMapping {
+ @Override
+ public FinFilingData mapping(DiPinShiAttendanceReqVO reqVO, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig) {
+ DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSARep = (DiPinShiAttendanceTravelOutNotUSAReqVO) reqVO;
+
+ //将travelOutNotUSARep里的数据取出来放入一个map中
+ Map data = null;
+ //取数据
+
+ //构建请求体
+ return mappingSendData(data, travelOutNotUSARep);
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ super.registerSelf(FormEnum.TRAVEL,"travelOutNoUSA",this);
+ }
+}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelOutMapping.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelOutMapping.java
new file mode 100644
index 0000000..53673cb
--- /dev/null
+++ b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/dipinshi/DiPinShiTravelOutMapping.java
@@ -0,0 +1,31 @@
+package cn.jiutqy.finfiling.quartz.dipinshi;
+
+import cn.jiutqy.finfiling.common.config.FinFilingConfig;
+import cn.jiutqy.finfiling.common.config.properties.FinFilingMappingRelationProperties;
+import cn.jiutqy.finfiling.common.dto.FinFilingData;
+import cn.jiutqy.finfiling.common.enums.FormEnum;
+import cn.jiutqy.finfiling.common.service.FinFilingContext;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceReqVO;
+import cn.jiutqy.finfiling.dipinshi.vo.req.DiPinShiAttendanceTravelOutReqVO;
+
+import java.util.Map;
+
+public class DiPinShiTravelOutMapping extends DiPinShiMapping {
+ @Override
+ public FinFilingData mapping(DiPinShiAttendanceReqVO reqVO, FinFilingContext context, FinFilingMappingRelationProperties mappingRelationProperties, FinFilingConfig finFilingConfig) {
+
+ DiPinShiAttendanceTravelOutReqVO travelOutRep = (DiPinShiAttendanceTravelOutReqVO) reqVO;
+ //将travelOutRep里的数据取出来放入一个map中
+ Map data = null;
+ //取数据
+
+ //构建请求体
+ return mappingSendData(data,travelOutRep);
+
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ super.registerSelf(FormEnum.TRAVEL,"travelOut",this);
+ }
+}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/enums/GeYuanOutboundTypeEnum.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/enums/GeYuanOutboundTypeEnum.java
deleted file mode 100644
index 3068103..0000000
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/enums/GeYuanOutboundTypeEnum.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package cn.jiutqy.finfiling.quartz.enums;
-
-import lombok.Getter;
-
-@Getter
-public enum GeYuanOutboundTypeEnum {
-
- GY_ADD("gy_add"),
- GY_UPDATE("gy_update"),
- GY_DELETE("gy_delete"),
- GY_GET("gy_get")
- ;
-
- private final String type;
-
- GeYuanOutboundTypeEnum(String type){
- this.type = type;
- }
-
- public static GeYuanOutboundTypeEnum getByType(String type){
- for(GeYuanOutboundTypeEnum typeEnum : GeYuanOutboundTypeEnum.values()){
- if(typeEnum.getType().equals(type)){
- return typeEnum;
- }
- }
- return null;
- }
-}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/enums/U9cMappingHoseEntityIdEnum.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/enums/U9cMappingHoseEntityIdEnum.java
deleted file mode 100644
index 978bfc0..0000000
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/enums/U9cMappingHoseEntityIdEnum.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.jiutqy.finfiling.quartz.enums;
-
-import lombok.Getter;
-
-@Getter
-public enum U9cMappingHoseEntityIdEnum {
-
- //测试
- UF_DATA_900_2021("UFData9002021", "上海玮驰仪器有限公司", "ID01C0qw92g4rB"),
- //正式
- UF_DATA_301_2018("UFData3012018", "上海玮驰仪器有限公司", "ID01C0qw92g4rB"),
- UF_DATA_302_2018("UFData3022018", "上海修睿科学仪器有限公司", "ID01C0qwdSvb9Z"),
- UF_DATA_311_2021("UFData3112021", "上海看咔科技有限公司", "ID01C0qycSdGnJ"),
- UF_DATA_501_2021("UFData5012021", "上海逐典生物科技有限公司", "ID01C0qD5FxL7V"),
- UF_DATA_502_2023("UFData5022023", "上海晴筝科技有限公司", "ID01C0qEk2fic7"),
- UF_DATA_503_2024("UFData5032024", "上海普纳生物技术有限公司", "ID01C0qJnGX39d"),
- UF_DATA_504_2024("UFData5042024", "上海阜金生物科技有限公司", "ID01C2KOZrONaf"),
- UF_DATA_505_2024("UFData5052024", "上海雏田生物技术有限公司", "ID01C0qzCCbwF9");
-
-
- private final String database;
- private final String name;
- private final String id;
-
- U9cMappingHoseEntityIdEnum(String database, String name, String id){
- this.database = database;
- this.name = name;
- this.id = id;
- }
-}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/sync/IOutboundSyncDiPinShiService.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/sync/IOutboundSyncDiPinShiService.java
deleted file mode 100644
index 5998beb..0000000
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/sync/IOutboundSyncDiPinShiService.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package cn.jiutqy.finfiling.quartz.sync;
-
-import cn.jiutqy.finfiling.quartz.enums.GeYuanOutboundTypeEnum;
-
-import java.util.Date;
-import java.util.Map;
-
-public interface IOutboundSyncDiPinShiService {
-
- void updateSyncTravel(String start, String end);
-
- void updateSyncGoOut(String start, String end);
-
- void retry(Date beforeTime);
-}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/sync/OutboundSyncDiPinShiService.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/sync/OutboundSyncDiPinShiService.java
deleted file mode 100644
index 2227145..0000000
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/sync/OutboundSyncDiPinShiService.java
+++ /dev/null
@@ -1,249 +0,0 @@
-package cn.jiutqy.finfiling.quartz.sync;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.jiutqy.archives.common.utils.ExceptionUtil;
-import cn.jiutqy.finfiling.common.domain.FinFilingSyncLog;
-import cn.jiutqy.finfiling.common.enums.ChannelEnum;
-import cn.jiutqy.finfiling.common.enums.SyncStateEnum;
-import cn.jiutqy.finfiling.common.service.IFinFilingSyncLogService;
-import cn.jiutqy.finfiling.quartz.constants.BusinessTypeEnum;
-import cn.jiutqy.finfiling.quartz.dipinshi.IDiPinShiFinFilingService;
-import cn.jiutqy.finfiling.quartz.hosecloud.IDiPinShiAttendanceService;
-import cn.jiutqy.finfiling.quartz.dipinshi.attendance.vo.req.*;
-import cn.jiutqy.finfiling.quartz.enums.GeYuanOutboundTypeEnum;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-
-@Slf4j
-@Component
-public class OutboundSyncDiPinShiService implements IOutboundSyncDiPinShiService{
-
- @Autowired
- private IFinFilingSyncLogService finFilingSyncLogService;
-
- @Autowired
- private IDiPinShiFinFilingService diPinShiFinFilingService;
-
- @Autowired
- private IDiPinShiAttendanceService attendanceService;
-
- @Override
- public void updateSyncTravel(String start, String end) {
- //批量获取数据单号
- List approvalNos = diPinShiFinFilingService.getBatchApprovalNoTravel(start, end , "TRAVEL");
-
- List travelReps = new ArrayList<>();
-
- //根据单号查询详情 取出有效数据x
- for (String approvalNo : approvalNos) {
- String detail = diPinShiFinFilingService.getApprovalNoDetail(approvalNo);
-
- //根据类型判断:外出、国内出差、国际出差、国际出差非美国
- JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(detail));
-
- //取出出差类型,根据类型分别映射到不同VO --这里的类型应该没这么好取
- String type = jsonObject.getString("type");
- if (BusinessTypeEnum.TRAVEL_IN.getName().equals(type)){
- //如果层级结构太多就手动取值然后塞进里
- DiPinShiAttendanceTravelInReqVO travelIn = JSONObject.parseObject(detail, DiPinShiAttendanceTravelInReqVO.class);
- travelReps.add(travelIn);
- }else if (BusinessTypeEnum.TRAVEL_OUT.getName().equals(type)){
- DiPinShiAttendanceTravelOutReqVO travelOut = JSONObject.parseObject(detail, DiPinShiAttendanceTravelOutReqVO.class);
- travelReps.add(travelOut);
- }else if (BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getName().equals(type)){
- DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSA = JSONObject.parseObject(detail, DiPinShiAttendanceTravelOutNotUSAReqVO.class);
- travelReps.add(travelOutNotUSA);
- }
-
- }
-
- FinFilingSyncLog finFilingSyncLog;
-
- if (CollectionUtil.isNotEmpty(travelReps)) {
- for (DiPinShiAttendanceReqVO travelRep : travelReps) {
- // 区分出差类型
- String tripType = travelRep.getTravelType();
-
- try {
- // 记录同步日志
- finFilingSyncLog = finFilingSyncLogService.getFinFilingSyncLogByInputChannelAndInputDataId(ChannelEnum.DI_PIN_SHI_TRAVEL.getChannelId(), travelRep.getApprovalNo());
- if (finFilingSyncLog == null){
- finFilingSyncLog = new FinFilingSyncLog();
- finFilingSyncLog.setInputChannelId(ChannelEnum.DI_PIN_SHI_TRAVEL.getChannelId());
- finFilingSyncLog.setInputDataId(travelRep.getApprovalNo());
- finFilingSyncLog.setInputData(JSON.toJSONString(travelRep.getData()));
- finFilingSyncLog.setSyncState(SyncStateEnum.INIT.value());
- finFilingSyncLog.setCreateTime(new Date());
- finFilingSyncLogService.save(finFilingSyncLog);
- }
- } catch (Exception e) {
- log.error("写入同步日志失败:{}-{}", ChannelEnum.DI_PIN_SHI_TRAVEL.getChannelId() , JSON.toJSONString(travelRep));
- return;
- }
-
- // 根据出差类型组装数据
- Map dataToSend = assembleTravelData(travelRep, tripType);
-
- try {
- //数据同步到合思,更改同步状态
- attendanceService.attendanceTravel(dataToSend);
- finFilingSyncLog.setOutputChannelId(ChannelEnum.HOSECLOUD.getChannelId());
- finFilingSyncLog.setOutputDataId(travelRep.getApprovalNo());
- finFilingSyncLog.setSyncState(SyncStateEnum.SUCCESSED.value());
- log.info("输出成功:{}", JSON.toJSONString(finFilingSyncLog));
- } catch (Exception e) {
- log.error("输出异常",e);
- finFilingSyncLog.setSyncState(SyncStateEnum.FAILED.value());
- finFilingSyncLog.setErrorMsg(ExceptionUtil.getExceptionMessage(e));
- log.error("输出失败:{}", JSON.toJSONString(finFilingSyncLog));
- }
-
- try {
- finFilingSyncLog.setUpdateTime(new Date());
- finFilingSyncLogService.updateById(finFilingSyncLog);
- } catch (Exception e) {
- log.error("修改同步日志失败",e);
- }
- }
- }
-
- }
-
-
- @Override
- public void updateSyncGoOut(String start, String end) {
- //批量获取数据单号
- List approvalNos = diPinShiFinFilingService.getBatchApprovalNoTravel(start, end , "GoOut");
-
- List goOuts = new ArrayList<>();
- //根据单号查询单号详情
- for (String approvalNo : approvalNos) {
- String detail = diPinShiFinFilingService.getApprovalNoDetail(approvalNo);
- DiPinShiAttendanceGoOutReqVO goOut = JSONObject.parseObject(detail, DiPinShiAttendanceGoOutReqVO.class);
- goOuts.add(goOut);
- }
-
- FinFilingSyncLog finFilingSyncLog;
- if (CollectionUtil.isNotEmpty(goOuts)){
- for (DiPinShiAttendanceGoOutReqVO goOut : goOuts) {
- //记录同步日志
- try {
- finFilingSyncLog = finFilingSyncLogService.getFinFilingSyncLogByInputChannelAndInputDataId(ChannelEnum.DI_PIN_SHI_GO_OUT.getChannelId(), goOut.getApprovalNo());
- if (finFilingSyncLog == null){
- finFilingSyncLog = new FinFilingSyncLog();
- finFilingSyncLog.setInputChannelId(ChannelEnum.DI_PIN_SHI_GO_OUT.getChannelId());
- finFilingSyncLog.setInputDataId(goOut.getApprovalNo());
- finFilingSyncLog.setInputData(JSON.toJSONString(goOut.getData()));
- finFilingSyncLog.setSyncState(SyncStateEnum.INIT.value());
- finFilingSyncLog.setCreateTime(new Date());
- finFilingSyncLogService.save(finFilingSyncLog);
- }
- } catch (Exception e) {
- log.error("写入同步日志失败:{}-{}", ChannelEnum.DI_PIN_SHI_GO_OUT.getChannelId() , JSON.toJSONString(goOut));
- return;
- }
-
- //字段映射
- Map dataToSend = goOutMapping(goOut);
-
- try {
- //数据同步到合思,更改同步状态
- attendanceService.attendanceGoOut(dataToSend);
- finFilingSyncLog.setOutputChannelId(ChannelEnum.HOSECLOUD.getChannelId());
- finFilingSyncLog.setOutputDataId(goOut.getApprovalNo());
- finFilingSyncLog.setSyncState(SyncStateEnum.SUCCESSED.value());
- log.info("输出成功:{}", JSON.toJSONString(finFilingSyncLog));
- } catch (Exception e) {
- log.error("输出异常",e);
- finFilingSyncLog.setSyncState(SyncStateEnum.FAILED.value());
- finFilingSyncLog.setErrorMsg(ExceptionUtil.getExceptionMessage(e));
- log.error("输出失败:{}", JSON.toJSONString(finFilingSyncLog));
- }
-
- try {
- finFilingSyncLog.setUpdateTime(new Date());
- finFilingSyncLogService.updateById(finFilingSyncLog);
- } catch (Exception e) {
- log.error("修改同步日志失败",e);
- }
- }
- }
-
-
- }
-
- private Map goOutMapping(DiPinShiAttendanceGoOutReqVO goOut) {
- //字段映射
- return null;
- }
-
- private Map assembleTravelData(DiPinShiAttendanceReqVO travelRep, String tripType) {
- Map sendData = null;
- if (BusinessTypeEnum.TRAVEL_IN.getName().equals(tripType)){
- if (travelRep instanceof DiPinShiAttendanceTravelInReqVO){
- DiPinShiAttendanceTravelInReqVO travelInRep = (DiPinShiAttendanceTravelInReqVO) travelRep;
- sendData = travelInMapping(travelInRep);
- }
- }else if (BusinessTypeEnum.TRAVEL_OUT.getName().equals(tripType)){
- if (travelRep instanceof DiPinShiAttendanceTravelOutReqVO){
- DiPinShiAttendanceTravelOutReqVO travelOutRep = (DiPinShiAttendanceTravelOutReqVO) travelRep;
- sendData = travelOutMapping(travelOutRep);
- }
- }else if (BusinessTypeEnum.TRAVEL_OUT_NOT_USA.getName().equals(tripType)){
- if (travelRep instanceof DiPinShiAttendanceTravelOutNotUSAReqVO){
- DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSARep = (DiPinShiAttendanceTravelOutNotUSAReqVO) travelRep;
- sendData = travelOutNotUSAMapping(travelOutNotUSARep);
- }
- }
-
- return sendData;
- }
-
- private Map travelInMapping(DiPinShiAttendanceTravelInReqVO travelInRep) {
- //将企微的数据 转成保存到合思同步时需要的数据,一个一个取出来塞进map里
-
- return null;
- }
-
- private Map travelOutMapping(DiPinShiAttendanceTravelOutReqVO travelOutRep) {
-
- return null;
- }
-
- private Map travelOutNotUSAMapping(DiPinShiAttendanceTravelOutNotUSAReqVO travelOutNotUSARep) {
-
- return null;
- }
-
- @Override
- public void retry(Date beforeTime) {
- List list = finFilingSyncLogService.listFailFinFiling(beforeTime);
- list.forEach(item -> {
- GeYuanOutboundTypeEnum typeEnum = GeYuanOutboundTypeEnum.getByType(item.getInputChannelId());
- if (typeEnum == null){
- return;
- }
- Map map = JSON.parseObject(item.getInputData());
-
- });
- }
-
-
- //转成日期格式yyyy-mm-dd mm:ss
- public String convertDateFormat(String stamp){
- long timestamp = Long.parseLong(stamp);
-
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
- sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
-
- Date date = new Date(timestamp);
- return sdf.format(date);
- }
-}
diff --git a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/task/DiPinShiSyncDataTask.java b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/task/DiPinShiSyncDataTask.java
index 358079d..cfa4aba 100644
--- a/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/task/DiPinShiSyncDataTask.java
+++ b/fin-filing-quartz/src/main/java/cn/jiutqy/finfiling/quartz/task/DiPinShiSyncDataTask.java
@@ -1,22 +1,22 @@
package cn.jiutqy.finfiling.quartz.task;
-import cn.jiutqy.finfiling.common.service.DefaultFormAtFinFilingService;
import cn.jiutqy.finfiling.common.service.DefaultFormFinFilingService;
+import cn.jiutqy.finfiling.common.service.IFinFilingSyncCursorService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
-import java.util.Date;
-
@Slf4j
@Component("diPinShiSyncDataTask")
public class DiPinShiSyncDataTask {
@Autowired
private DefaultFormFinFilingService defaultFormFinFilingService;
+
+
@Autowired
- private DefaultFormAtFinFilingService defaultFormAtFinFilingService;
+ private IFinFilingSyncCursorService finFilingSyncCursorService;
+
public void syncData(String channelId,String formId){
long startTime = System.currentTimeMillis();
diff --git a/pom.xml b/pom.xml
index b752690..b121091 100644
--- a/pom.xml
+++ b/pom.xml
@@ -106,6 +106,12 @@
logging-interceptor
4.9.3
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.1.0
+