Procházet zdrojové kódy

初步完成OA推送金蝶单据开发,供应商信息及费用科目信息同步OA

fyz před 1 měsícem
rodič
revize
f9ce2214d5
31 změnil soubory, kde provedl 1126 přidání a 66 odebrání
  1. 2 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/controller/DLController.java
  2. 33 5
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/delegate/DDDelegate.java
  3. 1 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/AccountsPayableEntity.java
  4. 2 3
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Department.java
  5. 1 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/OtherMeetEntity.java
  6. 2 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Person.java
  7. 2 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Position.java
  8. 1 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Audit.java
  9. 1 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/BillTypeID.java
  10. 1 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Delete.java
  11. 1 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/FNumber.java
  12. 4 2
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Model.java
  13. 1 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Query.java
  14. 1 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Save.java
  15. 1 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Submit.java
  16. 1 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/View.java
  17. 48 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/payment/PaymentDetail.java
  18. 74 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/payment/PaymentMain.java
  19. 48 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/reimbursement/CostDetail.java
  20. 105 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/reimbursement/CostMain.java
  21. 68 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/reimbursement/TripDetail.java
  22. 104 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/reimbursement/TripMain.java
  23. 18 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/DocumentService.java
  24. 5 1
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/DeptServiceImpl.java
  25. 447 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/DocumentServiceImpl.java
  26. 1 4
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/PersonServiceImpl.java
  27. 122 20
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/SupplierServiceImpl.java
  28. 5 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/SupplierService.java
  29. 14 4
      mjava-jiuyousimu/src/main/resources/application-dev.yml
  30. 8 17
      mjava-jiuyousimu/src/main/resources/static/json/dataForm.json
  31. 4 0
      mjava-jiuyousimu/src/test/java/test.java

+ 2 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/controller/DLController.java

@@ -41,6 +41,7 @@ public class DLController {
 
     @PostMapping(value = "testToken")
     McR testToken() {
+        supplierService.testQuery();
         return McR.success();
     }
 
@@ -57,6 +58,7 @@ public class DLController {
     @PostMapping(value = "testQuery")
     McR testQuery(@RequestBody Map data) {
         supplierService.pushToOA();
+//        supplierService.accountPushToOA();
         return McR.success();
     }
     /**

+ 33 - 5
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/delegate/DDDelegate.java

@@ -2,12 +2,18 @@ package com.malk.jiuyousimu.delegate;
 
 import com.malk.delegate.DDEvent;
 import com.malk.jiuyousimu.service.DeptService;
+import com.malk.jiuyousimu.service.DingTalkService;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Workflow;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Primary;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.util.Map;
+
 /**
  * OA审批事件 [主项目也有实现, 添加 @Primary 优先注入主项目实现]
  * -
@@ -20,13 +26,20 @@ import org.springframework.stereotype.Service;
 public class DDDelegate implements DDEvent {
 
     @Autowired
-    DeptService deptService;
+    DingTalkService dingTalkService;
     // 审批任务回调执行业务逻辑
 
-    private static final String DXCPXS = "PROC-3F7AC816-B41B-4A48-8CFD-CE9FF92B05AB";
-    private static final String NDKJXS = "PROC-A9F9C430-5947-4B4F-9D8A-2591207E6153";
-    private static final String YPSQ = "PROC-B6CCD0BE-E74D-4FCD-8B3A-B68F7827C5AC";
-    private static final String KS = "PROC-B5937B5F-7883-4BAD-932A-F54A5113576C";
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+
+    @Value("${dingtalk.appKey}")
+    private String APP_EKY;
+
+    @Value("${dingtalk.appSecret}")
+    private String APP_SECRET;
 
     @Async
     @Override
@@ -57,6 +70,21 @@ public class DDDelegate implements DDEvent {
     @Async
     @Override
     public void executeEvent_Instance_Finish(String processInstanceId, String processCode, boolean isAgree, boolean isTerminate, String staffId) {
+        if  (isAgree){
+            String token = ddClient.getAccessToken(APP_EKY, APP_SECRET);
+            Map processData = ddClient_workflow.getProcessInstanceId(token, processInstanceId);
+            log.info("开始执行回调:{}",processInstanceId);
+            //支付申请
+            String payment = "PROC-E14838E3-BDE9-42B7-BA02-8011AA88B955";
+            //费用报销
+            String reimbursement = "PROC-15984B56-D500-4F37-A1E8-ED2B9CCC235A";
+            //付款申请
+//            String PAYMENT_APPLICATION = "PROC-82233BD3-A274-4B90-8710-97D9F9663634";
+
+            if (payment.equals(processCode)){
 
+            }else if (reimbursement.equals(processCode)){
+            }
+        }
     }
 }

+ 1 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/AccountsPayableEntity.java

@@ -1,5 +1,6 @@
 package com.malk.jiuyousimu.entity;
 
+import com.malk.jiuyousimu.entity.basic.FNumber;
 import lombok.Data;
 
 import java.util.List;

+ 2 - 3
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Department.java

@@ -1,14 +1,13 @@
 package com.malk.jiuyousimu.entity;
 
+import com.malk.jiuyousimu.entity.basic.FNumber;
 import lombok.Data;
 
-import java.util.List;
-
 @Data
 public class Department {
 
     //部门
-    private FNumber FCreateOrgId;//创建组织
+    private com.malk.jiuyousimu.entity.basic.FNumber FCreateOrgId;//创建组织
     private FNumber FUseOrgId;//使用组织
     private String FName;//名称
     private String FEffectDate;//生效日期

+ 1 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/OtherMeetEntity.java

@@ -1,5 +1,6 @@
 package com.malk.jiuyousimu.entity;
 
+import com.malk.jiuyousimu.entity.basic.FNumber;
 import lombok.Data;
 
 import java.util.List;

+ 2 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Person.java

@@ -1,12 +1,13 @@
 package com.malk.jiuyousimu.entity;
 
+import com.malk.jiuyousimu.entity.basic.FNumber;
 import lombok.Data;
 
 @Data
 public class Person {
 
     //部门
-    private FNumber FCreateOrgId;//创建组织
+    private com.malk.jiuyousimu.entity.basic.FNumber FCreateOrgId;//创建组织
     private FNumber FUseOrgId;//使用组织
     private String FName;//名称
     private String FEffectDate;//生效日期

+ 2 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Position.java

@@ -1,12 +1,13 @@
 package com.malk.jiuyousimu.entity;
 
+import com.malk.jiuyousimu.entity.basic.FNumber;
 import lombok.Data;
 
 @Data
 public class Position {
 
     //部门
-    private FNumber FCreateOrgId;//创建组织
+    private com.malk.jiuyousimu.entity.basic.FNumber FCreateOrgId;//创建组织
     private FNumber FUseOrgId;//使用组织
     private String FName;//名称
     private String FEffectDate;//生效日期

+ 1 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Audit.java

@@ -1,4 +1,4 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
 import lombok.Data;
 

+ 1 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/BillTypeID.java

@@ -1,4 +1,4 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
 import lombok.Data;
 

+ 1 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Delete.java

@@ -1,4 +1,4 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
 import lombok.Data;
 

+ 1 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/FNumber.java

@@ -1,4 +1,4 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
 import lombok.Data;
 

+ 4 - 2
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Model.java

@@ -1,5 +1,7 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
+import com.malk.jiuyousimu.entity.AccountsPayableEntity;
+import com.malk.jiuyousimu.entity.OtherMeetEntity;
 import lombok.Data;
 
 import java.util.List;
@@ -11,7 +13,7 @@ public class Model {
     private String FDATE;//业务日期
     private String FENDDATE_H;//到期日
     private String FCONTACTUNITTYPE;//往来单位类型
-    private FNumber FCONTACTUNIT;//往来单位
+    private com.malk.jiuyousimu.entity.basic.FNumber FCONTACTUNIT;//往来单位
     private FNumber FCURRENCYID ;//币别
     private Double FTOTALAMOUNTFOR_H;//总金额
     private Double FNOTSETTLEAMOUNTFOR;//未借款金额

+ 1 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Query.java

@@ -1,4 +1,4 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
 import lombok.Data;
 import lombok.NonNull;

+ 1 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Save.java

@@ -1,4 +1,4 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
 import lombok.Data;
 

+ 1 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Submit.java

@@ -1,4 +1,4 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
 import lombok.Data;
 

+ 1 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/View.java

@@ -1,4 +1,4 @@
-package com.malk.jiuyousimu.entity;
+package com.malk.jiuyousimu.entity.basic;
 
 import lombok.Data;
 

+ 48 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/payment/PaymentDetail.java

@@ -0,0 +1,48 @@
+package com.malk.jiuyousimu.entity.payment;
+
+import com.malk.jiuyousimu.entity.basic.FNumber;
+import lombok.Data;
+
+@Data
+public class PaymentDetail {
+
+    /**
+     * 费用项目编码
+     */
+    private FNumber FCOSTID;
+
+    /**
+     * 含税单价
+     */
+    private Double FTaxPrice;
+
+    /**
+     * 计价数量
+     */
+    private Integer FPriceQty;
+
+    /**
+     * 税率(百分比,如 13.00)
+     */
+    private Double FEntryTaxRate;
+
+    /**
+     * 不含税金额
+     */
+    private Double FNoTaxAmountFor_D;
+
+    /**
+     * 税额
+     */
+    private Double FTAXAMOUNTFOR_D;
+
+    /**
+     * 价税合计
+     */
+    private Double FALLAMOUNTFOR_D;
+    /**
+     * 费用承担部门
+     */
+    private FNumber FCOSTDEPARTMENTID;
+
+}

+ 74 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/payment/PaymentMain.java

@@ -0,0 +1,74 @@
+package com.malk.jiuyousimu.entity.payment;
+
+import com.malk.jiuyousimu.entity.basic.BillTypeID;
+import com.malk.jiuyousimu.entity.basic.FNumber;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 应付单
+ */
+@Data
+public class PaymentMain {
+
+    /**
+     * 单据类型
+     */
+    private BillTypeID FBillTypeID;//费用应付单-  YFD02_SYS
+
+    /**
+     * 业务日期
+     */
+    private LocalDate FDATE;
+
+    /**
+     * 到期日
+     */
+    private LocalDate FENDDATE_H;
+
+    /**
+     * 单据状态
+     */
+    private String FDOCUMENTSTATUS;
+
+    /**
+     * 供应商
+     */
+    private FNumber FSUPPLIERID;
+
+    /**
+     * 币别
+     */
+    private FNumber FCURRENCYID;
+
+    /**
+     * 所属公司主体-付款组织
+     */
+    private FNumber FPAYORGID;
+
+    /**
+     * 所属公司主体-结算组织
+     */
+    private FNumber FSETTLEORGID;
+
+    /**
+     * 所属公司主体-采购组织
+     */
+//    private FNumber FSETTLEORGID;
+
+    /**
+     * 采购部门
+     */
+    private FNumber FPURCHASEDEPTID;
+
+    /**
+     * 采购员
+     */
+    private FNumber FPURCHASERID;
+
+
+    private List<PaymentDetail> FEntityDetail;
+
+}

+ 48 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/reimbursement/CostDetail.java

@@ -0,0 +1,48 @@
+package com.malk.jiuyousimu.entity.reimbursement;
+
+import com.malk.jiuyousimu.entity.basic.FNumber;
+import lombok.Data;
+
+@Data
+public class CostDetail {
+    /**
+     * 计划付款日期
+     */
+    private String FPAYDATE;
+
+    /**
+     * 费用项目
+     */
+    private FNumber FExpID;
+
+    /**
+     * 发票类型
+     */
+    private String FInvoiceType;
+
+    /**
+     * 费用承担部门
+     */
+    private FNumber FExpenseDeptEntryID;
+
+    /**
+     * 税率(百分比,如 13.00)
+     */
+    private Double FTaxRate;
+
+    /**
+     * 费用金额
+     */
+    private Double FTaxSubmitAmt;
+
+    /**
+     * 税额
+     */
+    private Double FTaxAmt;
+
+    /**
+     * 申请报销金额
+     */
+    private Double FExpenseAmount;
+
+}

+ 105 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/reimbursement/CostMain.java

@@ -0,0 +1,105 @@
+package com.malk.jiuyousimu.entity.reimbursement;
+
+import com.malk.jiuyousimu.entity.basic.BillTypeID;
+import com.malk.jiuyousimu.entity.basic.FNumber;
+import com.malk.jiuyousimu.entity.payment.PaymentDetail;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 应付单
+ */
+@Data
+public class CostMain {
+    /**
+     * 单据类型
+     */
+    private BillTypeID FBillTypeID;//000ffecf2c6f97f311e32b0998d51004
+
+    /**
+     * 申请日期
+     */
+    private LocalDate FDATE;
+
+    /**
+     * 币别
+     */
+    private FNumber FCurrencyID;
+
+    /**
+     * 申请组织
+     */
+    private FNumber FOrgID;
+
+    /**
+     * 事由
+     */
+    private String FCausa;
+
+    /**
+     * 申请人
+     */
+    private FNumber FProposerID;
+
+    /**
+     * 申请部门
+     */
+    private FNumber FRequestDeptID;
+
+    /**
+     * 所属公司主体-费用承担组织
+     */
+    private FNumber FExpenseOrgId;
+
+    /**
+     * 所属公司主体-费用承担部门
+     */
+    private FNumber FExpenseDeptID;
+
+    /**
+     * 往来单位类型
+     */
+    private String FCONTACTUNITTYPE;
+
+    /**
+     * 往来单位
+     */
+    private FNumber FCONTACTUNIT;
+
+    /**
+     * 本位币
+     */
+    private FNumber FLocCurrencyID;//1
+
+    /**
+     * 汇率类型
+     */
+    private FNumber FExchangeTypeID;//1
+    /**
+     * 付款组织
+     */
+    private FNumber FPayOrgId;
+    /**
+     * 结算方式
+     */
+    private FNumber FPaySettlleTypeID;
+    /**
+     * 银行账号
+     */
+    private String FRefundBankAccount;
+    /**
+     * 开户银行
+     */
+    private String FBankBranchT;
+    /**
+     * 账户名称
+     */
+    private String FBankAccountNameT;
+    /**
+     * 明细信息
+     */
+    private List<CostDetail> FEntity;
+
+}

+ 68 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/reimbursement/TripDetail.java

@@ -0,0 +1,68 @@
+package com.malk.jiuyousimu.entity.reimbursement;
+
+import com.malk.jiuyousimu.entity.basic.FNumber;
+import lombok.Data;
+
+@Data
+public class TripDetail {
+    /**
+     * 开始日期
+     */
+    private String FTravelStartDate;
+
+    /**
+     * 结束日期
+     */
+    private String FTravelEndDate;
+
+    /**
+     * 出发地
+     */
+    private String FTravelStartSite;
+
+    /**
+     * 目的地
+     */
+    private String FTravelEndSite;
+
+    /**
+     * 天数
+     */
+    private String FDays;
+
+    /**
+     * 费用项目
+     */
+    private FNumber FExpID;
+
+    /**
+     * 发票类型
+     */
+    private String FInvoiceType;
+
+    /**
+     * 费用承担部门
+     */
+    private FNumber FExpenseDeptEntryID;
+
+    /**
+     * 税率(百分比,如 13.00)
+     */
+    private Double FTaxRate;
+
+    /**
+     * 费用金额
+     */
+    private Double FTaxSubmitAmt;
+
+    /**
+     * 税额
+     */
+    private Double FTaxAmt;
+
+    /**
+     * 申请报销金额
+     */
+    private Double FExpenseAmount;
+
+}

+ 104 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/reimbursement/TripMain.java

@@ -0,0 +1,104 @@
+package com.malk.jiuyousimu.entity.reimbursement;
+
+import com.malk.jiuyousimu.entity.basic.BillTypeID;
+import com.malk.jiuyousimu.entity.basic.FNumber;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 应付单
+ */
+@Data
+public class TripMain {
+    /**
+     * 单据类型
+     */
+    private BillTypeID FBillTypeID;//0050569440d0b9d111e346dc2d05234a
+
+    /**
+     * 申请日期
+     */
+    private LocalDate FDATE;
+
+    /**
+     * 币别
+     */
+    private FNumber FCurrencyID;
+
+    /**
+     * 申请组织
+     */
+    private FNumber FOrgID;
+
+    /**
+     * 事由
+     */
+    private String FCausa;
+
+    /**
+     * 申请人
+     */
+    private FNumber FProposerID;
+
+    /**
+     * 申请部门
+     */
+    private FNumber FRequestDeptID;
+
+    /**
+     * 所属公司主体-费用承担组织
+     */
+    private FNumber FExpenseOrgId;
+
+    /**
+     * 所属公司主体-费用承担部门
+     */
+    private FNumber FExpenseDeptID;
+
+    /**
+     * 往来单位类型
+     */
+    private String FCONTACTUNITTYPE;
+
+    /**
+     * 往来单位
+     */
+    private FNumber FCONTACTUNIT;
+
+    /**
+     * 本位币
+     */
+    private FNumber FLocCurrencyID;//1
+
+    /**
+     * 汇率类型
+     */
+    private FNumber FExchangeTypeID;//1
+    /**
+     * 付款组织
+     */
+    private FNumber FPayOrgId;
+    /**
+     * 结算方式
+     */
+    private FNumber FPaySettlleTypeID;
+    /**
+     * 银行账号
+     */
+    private String FRefundBankAccount;
+    /**
+     * 开户银行
+     */
+    private String FBankBranchT;
+    /**
+     * 账户名称
+     */
+    private String FBankAccountNameT;
+    /**
+     * 明细信息
+     */
+    private List<TripDetail> FEntity;
+
+}

+ 18 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/DocumentService.java

@@ -0,0 +1,18 @@
+package com.malk.jiuyousimu.service;
+
+import com.malk.server.common.McR;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 部门信息操作金蝶
+ */
+public interface DocumentService {
+
+    McR saveTrip(Map processData);
+
+    McR saveCost(Map processData);
+
+    McR savePayment(Map processData);
+}

+ 5 - 1
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/DeptServiceImpl.java

@@ -1,11 +1,15 @@
 package com.malk.jiuyousimu.service.Impl;
-import com.malk.jiuyousimu.entity.FNumber;
+import com.malk.jiuyousimu.entity.basic.FNumber;
 
 import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
 import com.kingdee.bos.webapi.entity.RepoRet;
 import com.kingdee.bos.webapi.sdk.K3CloudApi;
 import com.malk.jiuyousimu.entity.*;
+import com.malk.jiuyousimu.entity.basic.Audit;
+import com.malk.jiuyousimu.entity.basic.Delete;
+import com.malk.jiuyousimu.entity.basic.Save;
+import com.malk.jiuyousimu.entity.basic.Submit;
 import com.malk.jiuyousimu.service.DeptService;
 import com.malk.jiuyousimu.service.KingDeeService;
 import com.malk.server.common.McR;

+ 447 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/DocumentServiceImpl.java

@@ -0,0 +1,447 @@
+package com.malk.jiuyousimu.service.Impl;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.malk.jiuyousimu.entity.basic.FNumber;
+import com.malk.jiuyousimu.entity.basic.BillTypeID;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.kingdee.bos.webapi.entity.RepoRet;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.malk.jiuyousimu.entity.basic.Audit;
+import com.malk.jiuyousimu.entity.basic.Save;
+import com.malk.jiuyousimu.entity.basic.Submit;
+import com.malk.jiuyousimu.entity.payment.PaymentDetail;
+import com.malk.jiuyousimu.entity.payment.PaymentMain;
+import com.malk.jiuyousimu.entity.reimbursement.CostDetail;
+import com.malk.jiuyousimu.entity.reimbursement.CostMain;
+import com.malk.jiuyousimu.entity.reimbursement.TripDetail;
+import com.malk.jiuyousimu.entity.reimbursement.TripMain;
+import com.malk.jiuyousimu.service.DocumentService;
+import com.malk.jiuyousimu.service.KingDeeService;
+import com.malk.server.common.McR;
+import com.malk.service.dingtalk.*;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class DocumentServiceImpl implements DocumentService {
+
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+    @Autowired
+    private DDClient_Meeting ddClientMeeting;
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+    @Autowired
+    private DDClient_Personnel ddClientPersonnel;
+    @Value("${dingtalk.appKey}")
+    private String APP_EKY;
+    @Value("${dingtalk.appSecret}")
+    private String APP_SECRET;
+    @Value("${dingtalk.agentId}")
+    private Long agentId;
+
+    @Autowired
+    KingDeeService kingDeeService;
+    @Autowired
+    DDService ddService;
+
+    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    private static final Map<String,String> ALL_ENUM = new HashMap<>();
+    static {
+        ALL_ENUM.put("人民币","PRE001");
+        ALL_ENUM.put("美元","001");
+        ALL_ENUM.put("上海久有私募基金管理有限公司","100");
+        ALL_ENUM.put("上海久有川谷投资管理有限公司","114");
+        ALL_ENUM.put("现金", "01");
+        ALL_ENUM.put("银行转账", "02");
+        ALL_ENUM.put("网银", "03");
+        ALL_ENUM.put("现金支票", "JSFS02_SYS");
+        ALL_ENUM.put("转账支票", "JSFS03_SYS");
+        ALL_ENUM.put("信汇", "JSFS05_SYS");
+        ALL_ENUM.put("商业承兑汇票", "JSFS06_SYS");
+        ALL_ENUM.put("银行承兑汇票", "JSFS07_SYS");
+        ALL_ENUM.put("信用证", "JSFS08_SYS");
+        ALL_ENUM.put("应收票据背书", "JSFS09_SYS");
+        ALL_ENUM.put("内部利息结算", "JSFS10_SYS");
+        ALL_ENUM.put("票据退票", "JSFS12_SYS");
+        ALL_ENUM.put("集中结算", "JSFS21_SYS");
+        ALL_ENUM.put("保证金转货款", "JSFS22_SYS");
+        ALL_ENUM.put("微信", "JSFS31_SYS");
+        ALL_ENUM.put("支付宝", "JSFS32_SYS");
+        ALL_ENUM.put("供应链票据", "JSFS36_SYS");
+    }
+
+    /**
+     * 差旅费报销单
+     * @param processData  钉钉单据
+     * @return
+     */
+
+    @Override
+    public McR saveTrip(Map processData) {
+        String userId = String.valueOf(processData.get("originatorUserId"));
+        String userDeptId = String.valueOf(processData.get("originatorDeptId"));
+        List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
+        Map<String, Object> mainData = new HashMap<>();
+        List<CostDetail> costDetails = new ArrayList<>();
+        List<TripDetail> tripDetails = new ArrayList<>();
+        formComponentValues.forEach(e->{
+            String name = e.get("name").toString();
+            if ("TableField".equals(e.get("componentType"))) {
+                Object parse = JSON.parse(e.get("value").toString());
+                JSONArray jsonArray = JSON.parseArray(parse.toString());
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    JSONObject jsonObject = (JSONObject) jsonArray.get(i);
+                    Object rowValue = jsonObject.get("rowValue");
+                    JSONArray array = JSON.parseArray(rowValue.toString());
+                    for (int i1 = 0; i1 < array.size(); i1++) {
+                        jsonObject = (JSONObject) array.get(i1);
+                        if ("差旅费信息".equals(jsonObject.get("label"))){
+                            if (jsonObject.containsKey("extendValue")){
+                                rowValue = jsonObject.get("extendValue");
+                                jsonObject = JSONObject.parseObject(rowValue.toString());
+                                rowValue = jsonObject.get("list");
+                                JSONArray array1 =  JSON.parseArray(rowValue.toString());
+                                for (int i2 = 0; i2 < array1.size(); i2++) {
+                                    jsonObject = (JSONObject) array1.get(i2);
+                                    if (jsonObject.containsKey("rowValue")){
+                                        rowValue = jsonObject.get("rowValue");
+                                        JSONArray array2 = JSON.parseArray(rowValue.toString());
+                                        TripDetail tripDetail = new TripDetail();
+                                        for (int l = 0; l < array2.size(); l++) {
+                                            jsonObject = (JSONObject) array2.get(l);
+                                            switch (jsonObject.get("label").toString()){
+                                                case "开始日期": tripDetail.setFTravelStartDate(jsonObject.get("value").toString().substring(0,9));break;
+                                                case "结束日期": tripDetail.setFTravelEndDate(jsonObject.get("value").toString().substring(0,9));break;
+                                                case "费用承担部门": tripDetail.setFExpenseDeptEntryID(new FNumber(UtilMap.getString(jsonObject,"value")));break;
+                                                case "科目编号": tripDetail.setFExpID(new FNumber(UtilMap.getString(jsonObject,"value")));break;
+//                                                case "税率": tripDetail.setFTaxRate(UtilMap.getDouble(jsonObject,"value"));break;
+                                                case "天数": tripDetail.setFDays(UtilMap.getString(jsonObject,"value"));break;
+                                                case "发票类型": tripDetail.setFInvoiceType(UtilMap.getString(jsonObject,"value"));break;
+//                                                case "税额": tripDetail.setFTaxAmt(UtilMap.getDouble(jsonObject,"value"));break;
+//                                                case "非税金额": tripDetail.setFTaxSubmitAmt(UtilMap.getDouble(jsonObject,"value"));break;
+                                                case "申请报销金额": tripDetail.setFExpenseAmount(UtilMap.getDouble(jsonObject,"value"));
+                                                tripDetail.setFTaxSubmitAmt(UtilMap.getDouble(jsonObject,"value"));break;
+                                            }
+                                        }
+                                        tripDetails.add(tripDetail);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }else {
+                mainData.put(name, e.get("value"));
+            }
+        });
+        tripDetails.forEach(e->{
+            e.setFTravelStartSite(UtilMap.getString(mainData,"出发地"));
+            e.setFTravelEndSite(UtilMap.getString(mainData,"目的地"));
+        });
+
+        Save save = new Save();
+
+        TripMain tripMain = new TripMain();
+
+        tripMain.setFBillTypeID(new BillTypeID("0050569440d0b9d111e346dc2d05234a"));
+        tripMain.setFDATE(LocalDate.parse(UtilMap.getString(mainData,"申请日期").substring(0,9)));
+        tripMain.setFCurrencyID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"币别"))));
+        tripMain.setFOrgID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"所属公司主体"))));
+        tripMain.setFCausa(UtilMap.getString(mainData,"报销事由"));
+        tripMain.setFProposerID(new FNumber(userId));
+        tripMain.setFRequestDeptID(new FNumber(userDeptId));
+        tripMain.setFExpenseOrgId(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"所属公司主体"))));
+        tripMain.setFExpenseDeptID(new FNumber(userDeptId));
+        tripMain.setFCONTACTUNITTYPE("BD_Empinfo");
+        tripMain.setFCONTACTUNIT(new FNumber(userId));
+        tripMain.setFLocCurrencyID(new FNumber("1"));
+        tripMain.setFExchangeTypeID(new FNumber("1"));
+        tripMain.setFPayOrgId(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"所属公司主体"))));
+        tripMain.setFPaySettlleTypeID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"结算方式"))));
+        tripMain.setFRefundBankAccount(UtilMap.getString(mainData,"银行开户行"));
+        tripMain.setFBankBranchT(UtilMap.getString(mainData,"账户名称"));
+        tripMain.setFBankAccountNameT(UtilMap.getString(mainData,"收款账号"));
+        tripMain.setFEntity(tripDetails);
+
+        save.setModel(tripMain);
+        System.out.println(save);
+
+        try{
+            K3CloudApi client = new K3CloudApi(kingDeeService.initIden());
+            //业务对象标识
+            String formId = "ER_ExpReimbursement_Travel";
+            //调用接口
+            String resultJson = client.save(formId,JSONObject.toJSONString(save));
+            //用于记录结果
+            Gson gson = new Gson();
+            //对返回结果进行解析和校验
+            RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
+
+            if (kingDeeService.isTrue(repoRet)){
+                String id = repoRet.getResult().getId();
+
+                Submit submit = new Submit();
+                submit.setIds(id);
+                //提交
+                String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
+                RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
+                kingDeeService.isTrue(repoRet2);
+
+                if (kingDeeService.isTrue(repoRet2)){
+                    Audit audit = new Audit();
+                    audit.setIds(id);
+                    //审核
+                    String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
+                    RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
+                    kingDeeService.isTrue(repoRet3);
+                }
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+    /**
+     *  费用报销
+     */
+    @Override
+    public McR saveCost(Map processData) {
+        String userId = String.valueOf(processData.get("originatorUserId"));
+        String userDeptId = String.valueOf(processData.get("originatorDeptId"));
+        List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
+        Map<String, Object> mainData = new HashMap<>();
+        List<CostDetail> costDetails = new ArrayList<>();
+        formComponentValues.forEach(e->{
+            String name = e.get("name").toString();
+            if ("TableField".equals(e.get("componentType"))) {
+                Object parse = JSON.parse(e.get("value").toString());
+                JSONArray jsonArray = JSON.parseArray(parse.toString());
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    JSONObject jsonObject = (JSONObject) jsonArray.get(i);
+                    Object rowValue = jsonObject.get("rowValue");
+                    JSONArray array = JSON.parseArray(rowValue.toString());
+                    for (int i1 = 0; i1 < array.size(); i1++) {
+                        jsonObject = (JSONObject) array.get(i1);
+                        if (jsonObject.containsKey("extendValue")){
+                            rowValue = jsonObject.get("extendValue");
+                            jsonObject = JSONObject.parseObject(rowValue.toString());
+                            rowValue = jsonObject.get("list");
+                            JSONArray array1 =  JSON.parseArray(rowValue.toString());
+                            for (int i2 = 0; i2 < array1.size(); i2++) {
+                                jsonObject = (JSONObject) array1.get(i2);
+                                if (jsonObject.containsKey("rowValue")){
+                                    rowValue = jsonObject.get("rowValue");
+                                    JSONArray array2 = JSON.parseArray(rowValue.toString());
+                                    CostDetail costDetail = new CostDetail();
+
+                                    for (int l = 0; l < array2.size(); l++) {
+                                        jsonObject = (JSONObject) array2.get(l);
+                                        switch (jsonObject.get("label").toString()){
+                                            case "费用日期": costDetail.setFPAYDATE(jsonObject.get("value").toString().substring(0,9));break;
+                                            case "费用承担部门": costDetail.setFExpenseDeptEntryID(new FNumber(UtilMap.getString(jsonObject,"value")));break;
+                                            case "科目编号": costDetail.setFExpID(new FNumber(UtilMap.getString(jsonObject,"value")));break;
+                                            case "税率": costDetail.setFTaxRate(UtilMap.getDouble(jsonObject,"value"));break;
+                                            case "发票类型": costDetail.setFInvoiceType(UtilMap.getString(jsonObject,"value"));break;
+                                            case "税额": costDetail.setFTaxAmt(UtilMap.getDouble(jsonObject,"value"));break;
+                                            case "非税金额": costDetail.setFTaxSubmitAmt(UtilMap.getDouble(jsonObject,"value"));break;
+                                            case "申请报销金额": costDetail.setFExpenseAmount(UtilMap.getDouble(jsonObject,"value"));break;
+                                        }
+                                    }
+                                    costDetails.add(costDetail);
+                                }
+                            }
+                        }
+                    }
+                }
+            }else {
+                mainData.put(name, e.get("value"));
+            }
+        });
+        Save save = new Save();
+
+        CostMain costMain = new CostMain();
+
+        costMain.setFBillTypeID(new BillTypeID("000ffecf2c6f97f311e32b0998d51004"));
+        costMain.setFDATE(LocalDate.parse(UtilMap.getString(mainData,"申请日期").substring(0,9)));
+        costMain.setFCurrencyID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"币别"))));
+        costMain.setFOrgID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"所属公司主体"))));
+        costMain.setFCausa(UtilMap.getString(mainData,"报销事由"));
+        costMain.setFProposerID(new FNumber(userId));
+        costMain.setFRequestDeptID(new FNumber(userDeptId));
+        costMain.setFExpenseOrgId(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"所属公司主体"))));
+        costMain.setFExpenseDeptID(new FNumber(userDeptId));
+        costMain.setFCONTACTUNITTYPE("BD_Empinfo");
+        costMain.setFCONTACTUNIT(new FNumber(userId));
+        costMain.setFLocCurrencyID(new FNumber("1"));
+        costMain.setFExchangeTypeID(new FNumber("1"));
+        costMain.setFPayOrgId(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"所属公司主体"))));
+        costMain.setFPaySettlleTypeID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"结算方式"))));
+        costMain.setFRefundBankAccount(UtilMap.getString(mainData,"银行开户行"));
+        costMain.setFBankBranchT(UtilMap.getString(mainData,"账户名称"));
+        costMain.setFBankAccountNameT(UtilMap.getString(mainData,"收款账号"));
+        costMain.setFEntity(costDetails);
+
+        save.setModel(costMain);
+        System.out.println(save);
+
+        try{
+            K3CloudApi client = new K3CloudApi(kingDeeService.initIden());
+            //业务对象标识
+            String formId = "ER_ExpReimbursement";
+            //调用接口
+            String resultJson = client.save(formId,JSONObject.toJSONString(save));
+            //用于记录结果
+            Gson gson = new Gson();
+            //对返回结果进行解析和校验
+            RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
+
+            if (kingDeeService.isTrue(repoRet)){
+                String id = repoRet.getResult().getId();
+
+                Submit submit = new Submit();
+                submit.setIds(id);
+                //提交
+                String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
+                RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
+                kingDeeService.isTrue(repoRet2);
+
+                if (kingDeeService.isTrue(repoRet2)){
+                    Audit audit = new Audit();
+                    audit.setIds(id);
+                    //审核
+                    String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
+                    RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
+                    kingDeeService.isTrue(repoRet3);
+                }
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+    @Override
+    public McR savePayment(Map processData) {
+        String userId = String.valueOf(processData.get("originatorUserId"));
+        String userDeptId = String.valueOf(processData.get("originatorDeptId"));
+        List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
+        Map<String, Object> mainData = new HashMap<>();
+        List<PaymentDetail> paymentDetails = new ArrayList<>();
+        formComponentValues.forEach(e->{
+            String name = e.get("name").toString();
+            if ("TableField".equals(e.get("componentType"))) {
+                Object parse = JSON.parse(e.get("value").toString());
+                JSONArray jsonArray = JSON.parseArray(parse.toString());
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    JSONObject jsonObject = (JSONObject) jsonArray.get(i);
+                    Object rowValue = jsonObject.get("rowValue");
+                    JSONArray array = JSON.parseArray(rowValue.toString());
+                    for (int i1 = 0; i1 < array.size(); i1++) {
+                        jsonObject = (JSONObject) array.get(i1);
+                        if (jsonObject.containsKey("extendValue")){
+                            rowValue = jsonObject.get("extendValue");
+                            jsonObject = JSONObject.parseObject(rowValue.toString());
+                            rowValue = jsonObject.get("list");
+                            JSONArray array1 =  JSON.parseArray(rowValue.toString());
+                            for (int i2 = 0; i2 < array1.size(); i2++) {
+                                jsonObject = (JSONObject) array1.get(i2);
+                                if (jsonObject.containsKey("rowValue")){
+                                    rowValue = jsonObject.get("rowValue");
+                                    JSONArray array2 = JSON.parseArray(rowValue.toString());
+                                    PaymentDetail paymentDetail = new PaymentDetail();
+                                    paymentDetail.setFPriceQty(1);
+                                    for (int l = 0; l < array2.size(); l++) {
+                                        Map<String, Object> map = new HashMap<>();
+                                        jsonObject = (JSONObject) array2.get(l);
+
+                                        switch (jsonObject.get("label").toString()){
+                                            case "科目编号": paymentDetail.setFCOSTID(new FNumber(jsonObject.get("value").toString()));break;
+                                            case "税率": paymentDetail.setFEntryTaxRate(UtilMap.getDouble(jsonObject,"value"));break;
+                                            case "税额": paymentDetail.setFNoTaxAmountFor_D(UtilMap.getDouble(jsonObject,"value"));break;
+                                            case "金额(非税)": paymentDetail.setFALLAMOUNTFOR_D(UtilMap.getDouble(jsonObject,"value"));break;
+                                        }
+                                    }
+                                    paymentDetails.add(paymentDetail);
+                                }
+                            }
+                        }
+                    }
+                }
+            }else {
+                mainData.put(name, e.get("value"));
+            }
+        });
+        Save save = new Save();
+
+
+        PaymentMain paymentMain = new PaymentMain();
+        paymentMain.setFBillTypeID(new BillTypeID("YFD02_SYS"));
+        paymentMain.setFDATE(LocalDate.parse(UtilMap.getString(mainData,"业务日期").substring(0,9)));
+        paymentMain.setFENDDATE_H(LocalDate.parse(UtilMap.getString(mainData,"付款到期日").substring(0,9)));
+        paymentMain.setFDOCUMENTSTATUS("A");//单据状态为创建
+        paymentMain.setFSUPPLIERID(new FNumber(UtilMap.getString(mainData,"供应商编号")));
+        paymentMain.setFCURRENCYID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"币别"))));
+        paymentMain.setFPAYORGID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"所属公司主体"))));
+        paymentMain.setFSETTLEORGID(new FNumber(UtilMap.getString(ALL_ENUM,UtilMap.getString(mainData,"所属公司主体"))));
+        paymentMain.setFPURCHASEDEPTID(new FNumber(userDeptId));
+//        paymentMain.setFPURCHASERID(new FNumber());
+        paymentMain.setFEntityDetail(paymentDetails);
+
+        save.setModel(paymentMain);
+        System.out.println(save);
+
+        try{
+            K3CloudApi client = new K3CloudApi(kingDeeService.initIden());
+            //业务对象标识
+            String formId = "AP_Payable";
+            //调用接口
+            String resultJson = client.save(formId,JSONObject.toJSONString(save));
+            //用于记录结果
+            Gson gson = new Gson();
+            //对返回结果进行解析和校验
+            RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
+
+            if (kingDeeService.isTrue(repoRet)){
+                String id = repoRet.getResult().getId();
+
+                Submit submit = new Submit();
+                submit.setIds(id);
+                //提交
+                String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
+                RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
+                kingDeeService.isTrue(repoRet2);
+
+                if (kingDeeService.isTrue(repoRet2)){
+                    Audit audit = new Audit();
+                    audit.setIds(id);
+                    //审核
+                    String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
+                    RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
+                    kingDeeService.isTrue(repoRet3);
+                }
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+}

+ 1 - 4
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/PersonServiceImpl.java

@@ -2,12 +2,10 @@ package com.malk.jiuyousimu.service.Impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
-import com.kingdee.bos.webapi.entity.IdentifyInfo;
 import com.kingdee.bos.webapi.entity.RepoRet;
 import com.kingdee.bos.webapi.sdk.K3CloudApi;
-import com.malk.jiuyousimu.config.KDWebApiConf;
 import com.malk.jiuyousimu.entity.*;
-import com.malk.jiuyousimu.service.DingTalkService;
+import com.malk.jiuyousimu.entity.basic.*;
 import com.malk.jiuyousimu.service.KingDeeService;
 import com.malk.jiuyousimu.service.PersonService;
 import com.malk.server.common.McR;
@@ -20,7 +18,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;

+ 122 - 20
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/SupplierServiceImpl.java

@@ -2,10 +2,8 @@ package com.malk.jiuyousimu.service.Impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
-import com.kingdee.bos.webapi.entity.IdentifyInfo;
 import com.kingdee.bos.webapi.sdk.K3CloudApi;
-import com.malk.jiuyousimu.config.KDWebApiConf;
-import com.malk.jiuyousimu.entity.Query;
+import com.malk.jiuyousimu.entity.basic.Query;
 import com.malk.jiuyousimu.service.KingDeeService;
 import com.malk.jiuyousimu.service.SupplierService;
 import com.malk.server.common.McR;
@@ -18,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -35,12 +32,15 @@ public class SupplierServiceImpl implements SupplierService {
     private DDClient ddClient;
     @Override
     public List<Map<String,Object>>  getAllSupplierInfos() {
+        log.info("开始从金蝶获取供应商信息");
         Map meta = _getMeta();
+        meta = (Map) meta.get("SUPPLIER");
         String fieldKeys = meta.get("FieldKeys").toString();
         K3CloudApi client = new K3CloudApi(kingDeeService.initIden());
         Query query = new Query();
         query.setFormId("BD_Supplier");
         query.setFieldKeys(fieldKeys);
+        query.setLimit(10000);
         try {
             //调用接口
             List<List<Object>> billQuery = client.executeBillQuery(JSON.toJSONString(query));
@@ -67,6 +67,7 @@ public class SupplierServiceImpl implements SupplierService {
     }
     @Override
     public McR pushToOA() {
+        log.info("开始同步推送供应商到钉钉OA");
         //获取修改时间过滤节点
         LocalDateTime startTime = LocalDateTime.now()
                 .minusMinutes(30)
@@ -81,8 +82,10 @@ public class SupplierServiceImpl implements SupplierService {
 //        String isoEndTime = startTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
         //获取所有供应商数据
         List<Map<String,Object>> allSupplierInfos = getAllSupplierInfos();
+        log.info("获取供应商:{}",allSupplierInfos.toString());
         //所有供应商数据分组过滤是否含统一信用代码
-        Map<String, List<Map<String, Object>>> grouped = allSupplierInfos.stream().filter(map -> startTime.isBefore(LocalDateTime.parse(UtilMap.getString(map, "FModifyDate"))) &&
+        Map<String, List<Map<String, Object>>> grouped = allSupplierInfos.stream()
+                .filter(map -> startTime.isBefore(LocalDateTime.parse(UtilMap.getString(map, "FModifyDate"))) &&
                         endTime.isAfter(LocalDateTime.parse(UtilMap.getString(map, "FModifyDate"))))
                 .collect(Collectors.groupingBy(m -> (String) m.get("FName")));
         List<Map<String, Object>> result = grouped.values().stream()
@@ -102,23 +105,40 @@ public class SupplierServiceImpl implements SupplierService {
                 })
                 .collect(Collectors.toList());
 
+//        Map<String, List<Map<String, String>>> collect = result.stream()
+//                .collect(Collectors.groupingBy(
+//                        m -> m.get("FName") + "|" + m.get("FNumber") + "|" + m.get("FSOCIALCRECODE"), // 组合键
+//                        Collectors.mapping(
+//                                map -> {
+//                                    // 将每个记录的账号和开户行提取为独立的 Map
+//                                    Map<String, String> accountInfo = new HashMap<>();
+//                                    accountInfo.put("FBankCode", (String) map.get("FBankCode"));
+//                                    accountInfo.put("FOpenBankName", (String) map.get("FOpenBankName"));
+//                                    return accountInfo;
+//                                },
+//                                Collectors.toList()                       // 组内收集为 List
+//                        )
+//                ));
         Map<String, List<Map<String, String>>> collect = result.stream()
                 .collect(Collectors.groupingBy(
-                        m -> m.get("FName") + "|" + m.get("FNumber") + "|" + m.get("FSOCIALCRECODE"), // 组合键
-                        Collectors.mapping(
-                                map -> {
-                                    // 将每个记录的账号和开户行提取为独立的 Map
-                                    Map<String, String> accountInfo = new HashMap<>();
-                                    accountInfo.put("FBankCode", (String) map.get("FBankCode"));
-                                    accountInfo.put("FOpenBankName", (String) map.get("FOpenBankName"));
-                                    return accountInfo;
-                                },
-                                Collectors.toList()                       // 组内收集为 List
+                        m -> m.get("FName") + "|" + m.get("FNumber") + "|" + m.get("FSOCIALCRECODE"),
+                        Collectors.collectingAndThen(
+                                Collectors.toMap(
+                                        map -> map.get("FBankCode") + "|" + map.get("FOpenBankName"),  // 组合键
+                                        map -> {
+                                            Map<String, String> accountInfo = new HashMap<>();
+                                            accountInfo.put("FBankCode", (String) map.get("FBankCode"));
+                                            accountInfo.put("FOpenBankName",(String) map.get("FOpenBankName"));
+                                            return accountInfo;
+                                        },
+                                        (existing, replacement) -> existing  // 冲突时保留第一个,如需保留最后一个则改为 replacement
+                                ),
+                                map -> new ArrayList<>(map.values())
                         )
                 ));
         List<Map<String, Object>> output = collect.entrySet().stream()
                 .map(entry -> {
-                    String[] parts = entry.getKey().split("|", -1); // 拆分组合键,保留空值
+                    String[] parts = entry.getKey().split("\\|", -1); // 拆分组合键,保留空值
                     Map<String, Object> item = new HashMap<>();
                     // 假设组合键顺序为:FName | FNumber | FSOCIALCRECODE
                     item.put("FName", parts.length > 0 ? parts[0] : "");
@@ -134,8 +154,8 @@ public class SupplierServiceImpl implements SupplierService {
 //        for (String key : component.keySet()) {
         output.forEach(o->{
             List<Map> formValue = new ArrayList<>();
-            Map formData = UtilMap.empty();
             o.forEach((k,v)->{
+                Map formData = UtilMap.empty();
                 if (k.startsWith("bankInfos")) {
                     List<Map> rows = UtilMap.getList(o,k);
                     List<List<Map>> lastList = new ArrayList<>();
@@ -158,10 +178,10 @@ public class SupplierServiceImpl implements SupplierService {
                     formData.put("value", v);
                     formData.put("name", component.get(k));
                 }
+                formValue.add(formData);
             });
 
-            formValue.add(formData);
-            ddClient_workflow.doProcessInstancesNew(ddClient.getAccessToken(), "603864663125953014", "PROC-7760F325-C01C-4C11-B904-92E5B7521D32", formValue, "1064083060");
+            ddClient_workflow.doProcessInstancesNew(ddClient.getAccessToken(), "603864663125953014", ((Map) meta.get("SUPPLIER")).get("processCode").toString(), formValue, "1064083060");
         });
         return null;
     }
@@ -169,9 +189,91 @@ public class SupplierServiceImpl implements SupplierService {
 
     private Map _getMeta() {
         if (ObjectUtil.isNull(MATE)) {
-            MATE = (Map) UtilFile.readJsonObjectFromResource("static/json/form.json"); // 本地匹配宜搭组件ID
+            MATE = (Map) UtilFile.readJsonObjectFromResource("static/json/dataForm.json"); // 本地匹配宜搭组件ID
 //            MATE = (Map) UtilFile.readJsonObjectFromResource("static/json/formtest.json"); // 本地匹配宜搭组件ID
         }
         return MATE;
     }
+
+    @Override
+    public List<Map<String,Object>>  getAllCostAccount() {
+        log.info("开始获取所有费用科目");
+        Map meta = _getMeta();
+        meta = (Map) meta.get("ACCOUNT");
+        String fieldKeys = meta.get("FieldKeys").toString();
+        K3CloudApi client = new K3CloudApi(kingDeeService.initIden());
+        Query query = new Query();
+        query.setFormId("BD_Expense");
+        query.setFieldKeys(fieldKeys);
+        try {
+            //调用接口
+            List<List<Object>> billQuery = client.executeBillQuery(JSON.toJSONString(query));
+            String[] split = fieldKeys.split(",");
+            List<Map<String,Object>> suppliers = new ArrayList<>();
+            billQuery.forEach(b->{
+                Map<String, Object> map = new HashMap<>();
+                for (int i = 0; i < split.length; i++) {
+                    String item = split[i];
+                    map.put(item,b.get(i));
+                }
+                suppliers.add(map);
+            });
+            return suppliers;
+
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+        return null;
+    }
+    @Override
+    public McR accountPushToOA() {
+        //获取修改时间过滤节点
+        LocalDateTime startTime = LocalDateTime.now()
+                .minusMinutes(30)
+                .withSecond(0)
+                .withNano(0);
+        LocalDateTime endTime = LocalDateTime.now()
+                .minusMinutes(30)
+                .withSecond(0)
+                .withNano(0);
+        // 使用 ISO_LOCAL_DATE_TIME 格式化(格式:yyyy-MM-dd'T'HH:mm:ss)
+//        String isoStartTime = startTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
+//        String isoEndTime = startTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
+        //获取所有供应商数据
+        List<Map<String, Object>> allSupplierInfos = getAllCostAccount();
+        log.info("获取所有费用科目:{}",allSupplierInfos.toString());
+        List<Map<String, Object>> collect = allSupplierInfos.stream()
+                .filter(map -> startTime.isBefore(LocalDateTime.parse(UtilMap.getString(map, "FModifyDate"))) &&
+                endTime.isAfter(LocalDateTime.parse(UtilMap.getString(map, "FModifyDate"))))
+                .collect(Collectors.toList());
+        Map meta = _getMeta();
+        Map<String, String> component = (Map) ((Map) meta.get("ACCOUNT")).get("compIds");
+//        for (String key : component.keySet()) {
+        collect.forEach(o->{
+            List<Map> formValue = new ArrayList<>();
+            o.forEach((k,v)->{
+                Map formData = UtilMap.empty();
+                formData.put("value", v.toString());
+                formData.put("name", component.get(k));
+                formValue.add(formData);
+            });
+            ddClient_workflow.doProcessInstancesNew(ddClient.getAccessToken(), "603864663125953014", ((Map) meta.get("ACCOUNT")).get("processCode").toString(), formValue, "1064083060");
+        });
+        return McR.success();
+    }
+    @Override
+    public void testQuery(){
+        String fieldKeys = "FSOCIALCRECODE";
+        K3CloudApi client = new K3CloudApi(kingDeeService.initIden());
+        Query query = new Query();
+        query.setFormId("BD_Supplier");
+        query.setFieldKeys(fieldKeys);
+        try {
+            //调用接口
+            List<List<Object>> billQuery = client.executeBillQuery(JSON.toJSONString(query));
+
+        } catch (Exception e) {
+            fail(e.getMessage());
+        }
+    }
 }

+ 5 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/SupplierService.java

@@ -24,4 +24,9 @@ public interface SupplierService {
      */
     McR pushToOA();
 
+    List<Map<String,Object>>  getAllCostAccount();
+
+    McR accountPushToOA();
+
+    void testQuery();
 }

+ 14 - 4
mjava-jiuyousimu/src/main/resources/application-dev.yml

@@ -37,16 +37,26 @@ file:
 #  file:
 #    path: /Users/malk/server/_Tool/var/mjava/log
 
+#测试架构
+#dingtalk:
+#  agentId: 4326533184
+#  appKey: dingum9maa6vaeqi5jgv
+#  appSecret: fxsacsd9MHKnaxkFxP3QOjMe9FrqMTTfZU7InN1DJoM1WUoK6S3usH1EzhSpzgGy
+#  corpId:
+#  aesKey: uLbNXSzj16uYK6nuA0mMuOJVtMSVOGBwfvwhbh2ugOf
+#  token: zcJKprGXPkztJ7q3RK
+#  operator: ""   # OA管理员账号
+
+#正式架构
 # dingtalk
 dingtalk:
-  agentId: 4326533184
-  appKey: dingum9maa6vaeqi5jgv
-  appSecret: fxsacsd9MHKnaxkFxP3QOjMe9FrqMTTfZU7InN1DJoM1WUoK6S3usH1EzhSpzgGy
+  agentId: 4326067175
+  appKey: dingc6t2cxxc6k6ulymx
+  appSecret: PtHQ53j6mzjbMMyVh0-0GgAqz2JGVGZt4ktRaSecCuYWB0QXNVfba6mlAf5QHuUJ
   corpId:
   aesKey: uLbNXSzj16uYK6nuA0mMuOJVtMSVOGBwfvwhbh2ugOf
   token: zcJKprGXPkztJ7q3RK
   operator: ""   # OA管理员账号
-
 #测试环境
 kingdee:
   # 第三方系统登录授权的账套ID

+ 8 - 17
mjava-jiuyousimu/src/main/resources/static/json/dataForm.json

@@ -1,6 +1,6 @@
 {
   "SUPPLIER": {
-    "processCode": "PROC-B4D7A962-EEE7-41FB-B749-52FF723E4DAF",
+    "processCode": "PROC-7760F325-C01C-4C11-B904-92E5B7521D32",
     "creator": "603864663125953014",
     "FieldKeys": "FName,FNumber,FModifyDate,FSOCIALCRECODE,FBankCode,FOpenBankName",
     "attachmentUrl": {
@@ -11,32 +11,23 @@
       "FName": "供应商名称",
       "FNumber": "供应商编号",
       "FModifyDate": "修改时间",
-      "FSOCIALCRECODE": "统一社会信用代码",
+      "FSOCIALCRECODE": "社会统一信用代码",
       "FBankCode": "银行账号",
       "FOpenBankName": "开户银行"
     }
   },
-  "NDKJXS": {
-    "processCode": "PROC-A9F9C430-5947-4B4F-9D8A-2591207E6153",
-    "processCode1": "PROC-452744BC-BDA4-4641-AA5B-B5D68A47242B",
+  "ACCOUNT": {
+    "processCode": "PROC-1726DAD7-340D-4B71-96A6-532C719ABE0E",
     "creator": "proposerCode",
+    "FieldKeys": "FName,FNumber,FModifyDate",
     "attachmentUrl": {
       "downloadUrl": "downloadUrl",
       "name": "name"
     },
     "compIds": {
-      "crmId": "crmId",
-      "名称": "name",
-      "签署法人实体": "signingLegal",
-      "是否加盖公章": "isSealUsed",
-      "合同描述": "contractContent",
-      "合同编号": "contractCode",
-      "甲方信息": "partyAInfo",
-      "乙方信息": "partyBInfo",
-      "合同签订日期": "contractSignDate",
-      "合同事宜": "contractIssue",
-      "是否涉及法人章": "involveCorporateSeal",
-      "是否涉密": "isConfidential"
+      "FName": "科目名称",
+      "FNumber": "科目编号",
+      "FModifyDate": "修改时间"
     }
   }
 }

+ 4 - 0
mjava-jiuyousimu/src/test/java/test.java

@@ -1,6 +1,10 @@
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
 import com.malk.jiuyousimu.Boot;
+import com.malk.jiuyousimu.entity.basic.Query;
 import com.malk.jiuyousimu.service.Impl.DeptServiceImpl;
+import com.malk.jiuyousimu.service.KingDeeService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.dingtalk.DDConf;