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 @@ + + + + + + + + + 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 +