Explorar o código

Merge remote-tracking branch 'origin/master'

“lqy hai 5 meses
pai
achega
5abc56fa51
Modificáronse 23 ficheiros con 708 adicións e 80 borrados
  1. 5 0
      mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java
  2. 3 0
      mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java
  3. 33 0
      mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java
  4. 2 0
      mjava-heshu/src/main/java/com/malk/heshu/controller/HeShuController.java
  5. 3 3
      mjava-heshu/src/main/java/com/malk/heshu/entity/CustomerInfo.java
  6. 12 11
      mjava-heshu/src/test/java/com/malk/heshu/JdTest.java
  7. 2 0
      mjava-jinlun/src/main/java/com/malk/jinlun/service/CpClient.java
  8. 15 0
      mjava-jinlun/src/main/java/com/malk/jinlun/service/impl/CpClientImpl.java
  9. 24 8
      mjava-jinlun/src/main/java/com/malk/jinlun/service/impl/JinlunTaskServiceImpl.java
  10. 2 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/CommissionTable.java
  11. 41 11
      mjava-ounuo/src/main/java/com/malk/tuosi/schedule/ScheduleTask.java
  12. 37 5
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/TbServiceImpl.java
  13. 1 1
      mjava-ounuo/src/main/resources/application.yml
  14. 46 14
      mjava-siku/src/main/java/com/malk/siku/service/impl/SikuServiceImpl.java
  15. 4 4
      mjava-siku/src/test/java/com.malk.siku/SkTest.java
  16. 74 0
      mjava-yzl/pom.xml
  17. 17 0
      mjava-yzl/src/main/java/com/malk/yzl/YzlApplication.java
  18. 114 0
      mjava-yzl/src/main/java/com/malk/yzl/controller/ZzwController.java
  19. 32 0
      mjava-yzl/src/main/resources/application-dev.yml
  20. 15 0
      mjava-yzl/src/main/resources/application.yml
  21. 61 0
      mjava-yzl/src/main/resources/logback-spring.xml
  22. 138 0
      mjava-yzl/src/test/java/com/malk/yzl/JdTest.java
  23. 27 23
      mjava-zhongche/src/main/java/com/malk/zhongche/service/impl/ZhongcheServiceImpl.java

+ 5 - 0
mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java

@@ -28,6 +28,11 @@ public class BoyangController {
     public McR sign(@RequestBody Map body) {
         return boyangService.eSignSubmit(body);
     }
+    @GetMapping("/retrySign")
+    public McR retrySign(String businessId) {
+        return boyangService.retrySign(businessId);
+    }
+
 
     @GetMapping("/getOrganization")
     public McR getOrganization(String name) {

+ 3 - 0
mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java

@@ -14,4 +14,7 @@ public interface BoyangService {
     McR getOrganization(String name);
 
     void start(String processInstanceId,String signFlowId);
+
+    //根据审批编号重试发起e签宝签署
+    McR retrySign(String businessId);
 }

+ 33 - 0
mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java

@@ -23,6 +23,9 @@ import org.springframework.stereotype.Service;
 import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 @Slf4j
@@ -516,6 +519,36 @@ public class BoyangServiceImpl implements BoyangService {
         }
     }
 
+    @Override
+    public McR retrySign(String businessId) {
+        // 前12位: 年月日时分
+        String datePart = businessId.substring(0, 12);
+        // 16-17位: 秒
+        String secondPart = businessId.substring(15, 17);
+
+        // 组合完整时间: 年月日时分秒
+        String dateTimeStr = datePart + secondPart;
+        LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+
+        // 转换为时间戳(毫秒)
+        long startTime = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+        long endTime = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() + 1000;//应对审批编号与实际时间戳存在差异情况
+
+        Map instanceIds = ddClient_workflow.getInstanceIds(ddClient.getAccessToken(), "PROC-7DF36B3B-FBAD-4DF6-B8CD-723FFA8DBEC5", startTime, endTime, null);
+
+        List<String> list = UtilMap.getList(instanceIds, "list");
+
+        if (list.size() == 1){
+            String processInstanceId = list.get(0);
+            Map map = new HashMap();
+            map.put("processInstanceId",processInstanceId);
+
+            return eSignSubmit(map);
+        }else {
+            return McR.errorUnknown("未找到符合条件的数据");
+        }
+    }
+
     //下载钉钉OA审批单附件
     private void downloadDdFile(String processInstanceId,String fileId,String downloadPath){
         try {

+ 2 - 0
mjava-heshu/src/main/java/com/malk/heshu/controller/HeShuController.java

@@ -122,6 +122,8 @@ public class HeShuController {
             if(formData==null){
                 return McR.error("201","未查询到数据!");
             }
+            formData.put("textField_mma6vp851",formData.get("textField_mma6vp85"));
+            formData.put("textField_mma6vp7p1",formData.get("textField_mma6vp7p"));
             CustomerInfo customerInfo = BeanUtil.toBean(formData, CustomerInfo.class);
             List<Map> list=UtilMap.getList(formData,"tableField_mma72l0q");
             List<CustomerInfo.CustBank> bkList=new ArrayList<>();

+ 3 - 3
mjava-heshu/src/main/java/com/malk/heshu/entity/CustomerInfo.java

@@ -35,14 +35,13 @@ public class CustomerInfo {
     private String FINVOICETEL;             // 开票联系电话
     @Alias("textField_mma72kww")
     private String FINVOICEBANKACCOUNT;     // 银行账号
+    @Alias("textField_mma6vp7p1")
     private String FINVOICEADDRESS;         // 开票通讯地址
     private FNumber FSUPPLIERID;       // 对应供应商
     private String FIsGroup;                // 集团客户
     private String FIsDefPayer;             // 默认付款方
     private FNumber FCustTypeId;       // 客户类别
     private FNumber FGROUPCUSTID;      // 对应集团客户
-
-    @Alias("textField_mma72kww")
     private FNumber FGroup;            // 客户分组
     private FNumber FTRADINGCURRID;    // 结算币别(必填)
     private FNumber FCorrespondOrgId;  // 对应组织
@@ -70,12 +69,13 @@ public class CustomerInfo {
     @Alias("dateField_mma6vp7w")
     private String FFoundDate;               // 创立日期
     private String FDomains;                 // 行业
-    @Alias("textField_mma6vp85")
+    @Alias("textField_mma6vp851")
     private String FSOCIALCRECODE;           // 统一社会信用代码
     @Alias("textField_mma6vp7p")
     private String FRegisterAddress;         // 注册地址
     @Alias("textField_mogukmd2")
     private String F_UNW_Remark_apv;           // 开票要求
+    @Alias("textField_mma72kx0")
     private String F_UNW_Text_kpyx;          // 开票电子邮箱
 
     private CustomerExt FT_BD_CUSTOMEREXT;   // 商务信息

+ 12 - 11
mjava-heshu/src/test/java/com/malk/heshu/JdTest.java

@@ -56,13 +56,14 @@ public class JdTest {
     @Test
     public void saveCust() throws Exception {
         JSONObject params=new JSONObject();
-        params.put("fid","7eeb3600-3450-46e9-b4e7-47ab4e0ad18e");
+        params.put("fid","f27295d0-7eec-4210-aca0-77d83fc1331e");
         params.put("key","textField_mnhav84y");
         try {
             Map formData= (Map) ydClient.queryData(YDParam.builder().formInstId(params.getString("fid")).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
             if(formData==null){
                 return ;
             }
+            formData.put("textField_mma6vp851",formData.get("textField_mma6vp85"));
             CustomerInfo customerInfo = BeanUtil.toBean(formData, CustomerInfo.class);
             List<Map> list=UtilMap.getList(formData,"tableField_mma72l0q");
             List<CustomerInfo.CustBank> bkList=new ArrayList<>();
@@ -94,16 +95,16 @@ public class JdTest {
             }
             customerInfo.setFGroup(new FNumber(custType));
             String operator=UtilMap.getString(formData,"radioField_mma72l0t");// 操作类型 客商准入  客商更新
-            if(operator.equals("客商更新")){
-                String fId=UtilMap.getString(formData,"textField_moi1ejl1");
-                if(!PublicUtil.isNull(fId)){
-                    // 反审核
-                    unAudit("BD_Customer",fId);
-                    customerInfo.setFCUSTID(Integer.parseInt(fId));
-                }
-            }
-            McR mcr=saveToAudit("BD_Customer",customerInfo,params.getString("fid"),params.getString("key"),"selectField_mogukmd8","textareaField_mogukmda","textField_moi1ejl1",lxrList);
-            System.out.println(JSONObject.toJSONString(mcr));
+//            if(operator.equals("客商更新")){
+//                String fId=UtilMap.getString(formData,"textField_moi1ejl1");
+//                if(!PublicUtil.isNull(fId)){
+//                    // 反审核
+//                    unAudit("BD_Customer",fId);
+//                    customerInfo.setFCUSTID(Integer.parseInt(fId));
+//                }
+//            }
+//            McR mcr=saveToAudit("BD_Customer",customerInfo,params.getString("fid"),params.getString("key"),"selectField_mogukmd8","textareaField_mogukmda","textField_moi1ejl1",lxrList);
+            System.out.println(JSONObject.toJSONString(customerInfo));
         }catch (Exception e){
         }
     }

+ 2 - 0
mjava-jinlun/src/main/java/com/malk/jinlun/service/CpClient.java

@@ -16,6 +16,8 @@ public interface CpClient {
 
     List<Map> getCpUserInfo(String corpId, List<String> departmentIds, List<String> ids, String mobile, String name, int page, int size);
 
+    List<Map> getCpDepartmentInfo();
+
     Map getCpBoResultData(Map result);
 
     void isSuccess(Map result);

+ 15 - 0
mjava-jinlun/src/main/java/com/malk/jinlun/service/impl/CpClientImpl.java

@@ -202,6 +202,21 @@ public class CpClientImpl implements CpClient {
         return content;
     }
 
+    @Override
+    public List<Map> getCpDepartmentInfo() {
+        String s = UtilHttp.doPost(cloudpivotConfig.getRedirectUri() + "openapi/v3/organization/department/query", CloudpivotConfig.initTokenHeader(getCpAccessToken()), null, new HashMap());
+
+        Map result = (Map) JSONObject.parse(s);
+
+        isSuccess(result);
+
+        Map data = UtilMap.getMap(result, "data");
+
+        List<Map> content = UtilMap.getList(data, "content");
+
+        return content;
+    }
+
 
     //获取云枢表单详情返回结果中单据字段值
     @Override

+ 24 - 8
mjava-jinlun/src/main/java/com/malk/jinlun/service/impl/JinlunTaskServiceImpl.java

@@ -786,8 +786,8 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
         List<Map> filterString = new ArrayList<>();
 
         //审核日期为昨天至今天
-        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
-//        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FBillNo","67","S305-251031001","","","0"));//单据编号等于XX
+        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",131,"","","0"));//审核日期在今天之前N天以后
+//        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FBillNo","67","S305-260505001","","","0"));//单据编号等于XX
 
         billQuery.setFilterString(filterString);
         billQuery.setLimit(limit);
@@ -915,6 +915,12 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
         //处理同一出库单多个明细
         List<Map<String, Object>> list = mergeListMap(dataList, "ShortText1775629055296", "Sheet1775629877034");
 
+        List<Map> cpDepartmentInfo = cpClient.getCpDepartmentInfo();
+        Map<String, String> cpDepartmentMap = new HashMap<>();
+        for (Map cpDepartment : cpDepartmentInfo) {
+            cpDepartmentMap.put(UtilMap.getString(cpDepartment,"id"),UtilMap.getString(cpDepartment,"name"));
+        }
+
         //处理特殊字段格式
         for (Map<String, Object> stringObjectMap : list) {
             //成员
@@ -922,6 +928,7 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
             if(cpUserMap.containsKey(salerName)){
                 Map cpUserInfo = cpUserMap.get(salerName);
                 stringObjectMap.put("StaffSingle1775629353797",cpUserInfo);//销售员
+                stringObjectMap.put("ShortText1775629254048",cpDepartmentMap.get(UtilMap.getString(cpUserInfo,"mainDepartmentId")));//销售部门
             }else {
                 List<Map> cpUserInfoList = cpClient.getCpUserInfo(null, null, null, null, salerName, 0, 1);
                 if (cpUserInfoList.size() == 1){
@@ -929,6 +936,8 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
                     cpUserInfo.put("type",3);
                     stringObjectMap.put("StaffSingle1775629353797",cpUserInfo);//销售员
                     cpUserMap.put(salerName,cpUserInfo);
+
+                    stringObjectMap.put("ShortText1775629254048",cpDepartmentMap.get(UtilMap.getString(cpUserInfo,"mainDepartmentId")));//销售部门
                 }else {
                     stringObjectMap.put("StaffSingle1775629353797",null);
                 }
@@ -944,7 +953,7 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
                     Map cpUserInfo = (Map) cpUserInfoList.get(0);
                     cpUserInfo.put("type",3);
                     stringObjectMap.put("StaffSelector1775629377100",cpUserInfo);//跟单员
-                    cpUserMap.put(salerName,cpUserInfo);
+                    cpUserMap.put(gendanName,cpUserInfo);
                 }else {
                     stringObjectMap.put("StaffSelector1775629377100",null);
                 }
@@ -1024,10 +1033,10 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
 
         BillQuery billQuery = new BillQuery();
         billQuery.setFormId("AR_MatchRecord");
-        billQuery.setFieldKeys("FBILLNO,FCURWRITTENOFFAMOUNTFOR,FCURWRITTENOFFAMOUNT,FCURRENCYID.FName,FSOURCETYPE.FName,FSRCBILLNO,FVERIFYDATE,FCONTACTUNITTYPE,FCONTACTUNIT.FNumber,FCONTACTUNIT.FName,FBILLNUMBER");
+        billQuery.setFieldKeys("FBILLNO,FPLANAMOUNTFOR,FPLANAMOUNT,FCURWRITTENOFFAMOUNTFOR,FCURWRITTENOFFAMOUNT,FCURRENCYID.FName,FSOURCETYPE.FName,FSRCBILLNO,FVERIFYDATE,FCONTACTUNITTYPE,FCONTACTUNIT.FNumber,FCONTACTUNIT.FName,FBILLNUMBER");
         List<Map> filterString = new ArrayList<>();
 
-        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FVERIFYDATE","265",1,"","","0"));//核销日期在今天之前N天以后
+        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FVERIFYDATE","265",12,"","","0"));//核销日期在今天之前N天以后
 //        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FVERIFYDATE","39","2026-01-01 00:00:00","","","0"));//核销日期>=XX
 //        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FVERIFYDATE","16","2026-03-31 00:00:00","","","0"));//核销日期<=XX
         filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCURWRITTENOFFAMOUNTFOR","21",0,"","","0"));//本次核销金额>0
@@ -1055,6 +1064,9 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
         for (Map map : list) {
             Map body = new HashMap();
             body.put("ShortText1776845631494",UtilMap.getString(map, "FBILLNO"));//核销单号
+            Double fplanamountfor = UtilMap.getDouble(map, "FPLANAMOUNTFOR");
+            body.put("Number1778657486463", fplanamountfor);//应收金额
+            body.put("Number1778657494744",UtilMap.getDouble(map, "FPLANAMOUNT"));//应收金额本位币
             body.put("Number1776845666515",UtilMap.getDouble(map, "FCURWRITTENOFFAMOUNTFOR"));//本次核销金额
             body.put("Number1776845698524",UtilMap.getDouble(map, "FCURWRITTENOFFAMOUNT"));//本次核销金额本位币
             body.put("ShortText1776845718075",UtilMap.getString(map, "FCURRENCYID.FName"));//结算币别
@@ -1075,15 +1087,17 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
             body.put("ShortText1776845907662",UtilMap.getString(map, "FCONTACTUNIT.FNumber"));//往来单位编码
             body.put("Text1776845928307",UtilMap.getString(map, "FCONTACTUNIT.FName"));//往来单位名称
 
-            String saleOrderNumber = UtilMap.getString(map, "FBILLNUMBER");//销售订单号
+//            String saleOrderNumber = UtilMap.getString(map, "FBILLNUMBER");//销售订单号
+            String saleOrderNumber = "";//销售订单号    必须查询应收单获取到期日
 
             if (Strings.isBlank(saleOrderNumber)){
                 //查询应收单
                 BillQuery billQuery2 = new BillQuery();
                 billQuery2.setFormId("AR_receivable");
-                billQuery2.setFieldKeys("FBillNo,FSourceBillNo");
+                billQuery2.setFieldKeys("FBillNo,FSourceBillNo,FENDDATE");
                 List<Map> filterString2 = new ArrayList<>();
-                filterString2.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FBillNo","17",fsrcbillno,"","","0"));//单据编号包含XX
+                filterString2.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FBillNo","67",fsrcbillno,"","","0"));//单据编号等于XX
+                filterString2.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FPAYAMOUNTFOR","76",fplanamountfor,"","","0"));//收款计划-应收金额等于XX
                 billQuery2.setFilterString(filterString2);
                 billQuery2.setLimit(1);
                 billQuery2.setStartRow(0);
@@ -1093,6 +1107,8 @@ public class JinlunTaskServiceImpl implements JinlunTaskService {
                     if (!ysdList.isEmpty()){
                         Map ysd = ysdList.get(0);
                         String fSourceBillNo = UtilMap.getString(ysd, "FSourceBillNo");//销售出库单单号
+                        String fenddate = UtilMap.getString(ysd, "FENDDATE").split("\\.")[0].replace("T"," ");//到期日
+                        body.put("Date1778657519700",fenddate);
 
                         if (Strings.isNotBlank(fSourceBillNo)){
                             //查询销售出库单

+ 2 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/CommissionTable.java

@@ -33,5 +33,7 @@ public class CommissionTable {
     private String addedPlates;
     /*单价*/
     private String price;
+    /*任务完成时间*/
+    private String date;
 
 }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 41 - 11
mjava-ounuo/src/main/java/com/malk/tuosi/schedule/ScheduleTask.java


+ 37 - 5
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/TbServiceImpl.java

@@ -413,12 +413,14 @@ public class TbServiceImpl implements TBService {
                                             JSONObject fileObject = resultArray.getJSONObject(i);//新下载地址
                                             String downloadUrl1 = fileObject.getString("downloadUrl");
                                             long millisTimestamp = System.currentTimeMillis();//当前时间戳
-                                            String fileName = millisTimestamp + "_" + fileObject.getString("fileName");
+//                                            String fileName = millisTimestamp + "_" + fileObject.getString("fileName");//去掉了时间戳
+                                            String fileName = fileObject.getString("fileName");
                                             try{
                                                 String savePath = downloadFile(downloadUrl1,basedir,fileName);//TODO;存储图片至file目录下
                                                 successDownloads.add(fileName + "->" + savePath);
                                                 System.out.println("文件存储成功["+i+"]=====>"+fileName+"保存路径:"+savePath);
-                                                String newsavepath = "http://ounuo.raresoft.net:7880/file/"+fileName;
+//                                                String newsavepath = "http://ounuo.raresoft.net:7880/file/"+fileName;
+                                                String newsavepath = "http://192.168.22.152:7880/file/"+fileName;//换成欧诺公司内部的访问地址
                                                 newdownloadUrls.add(newsavepath);
                                             }catch (IOException e){
                                                 faileDownloads.add(fileName+"->"+e.getMessage());
@@ -453,6 +455,8 @@ public class TbServiceImpl implements TBService {
                 cardData.put("name_customer", customerName);
                 cardData.put("arr_picture", valueAsString);//todo:里面的每个需要转成jsonString类型
                 cardData.put("link","https://www.teambition.com/project/6878b323386fac7ab9dbe5e9/tasks/view/6878b323cc336006f34d1d22/task/"+taskId);
+                cardData.put("picture_link",generateHtmlLinks(valueAsString));
+
                 JSONObject message = new JSONObject();
                 message.put("cardData", cardData);
                 message.put("outTrackId", String.valueOf(System.currentTimeMillis()));
@@ -473,8 +477,8 @@ public class TbServiceImpl implements TBService {
                 }else if("鲁萍".equals(businessManager)){
                     message.put("openSpaceId","dtv1.card//IM_GROUP.cidibXgbOJLBc5L8xHNRzo5Jg==");
                 }
-//                message.put("openSpaceId", "dtv1.card//IM_GROUP.cidTppONwRCrkshRlCt28O+NA==");//正式群id:cidTppONwRCrkshRlCt28O+NA==   测试群id:cidKoVDKhvynnj+73h0uxSJBA==
-                message.put("cardTemplateId", "160b26bf-d699-49fc-a6dc-9cd20eed7750.schema");
+//                message.put("openSpaceId", "dtv1.card//IM_GROUP.cidKoVDKhvynnj+73h0uxSJBA==");//正式群id:cidTppONwRCrkshRlCt28O+NA==   测试群id:cidKoVDKhvynnj+73h0uxSJBA==
+                message.put("cardTemplateId", "7c91d56c-5dee-4294-88a5-f68238854030.schema");//160b26bf-d699-49fc-a6dc-9cd20eed7750.schema
                 message.put("robotCode", "dinghhozexm92tupobfo");
 //                message.put("link","https://www.teambition.com/project/6878b323386fac7ab9dbe5e9/tasks/view/6878b323cc336006f34d1d22/task/" + taskId);
                 createAndDeliverCard(message);//调用卡片推送
@@ -811,12 +815,27 @@ public class TbServiceImpl implements TBService {
     @Autowired
     private DDClient_Extension ddClientExtension;
     /*群消息卡片推送*/
+    @SneakyThrows
     public McR createAndDeliverCard(@RequestBody JSONObject param){
         log.info("推送消息:{}",param);
         McException.assertParamException_Null(param,"cardData","outTrackId","openSpaceId","robotCode","cardTemplateId");
         Map<String,Object> data = new HashMap();
         data.put("imGroupOpenDeliverModel", UtilMap.map("robotCode",param.getString("robotCode")));
-        data.put("imGroupOpenSpaceModel",UtilMap.map("supportForward",true));
+        /*卡片支持群搜索*/
+        HashMap<String, Object> searchSupport  = new HashMap<>();
+        searchSupport.put("searchTypeName","群卡片");
+        String cardData = param.getString("cardData");
+        // 1. 提取 JSON 部分(从第一个 '{' 到最后一个 '}')
+        int start = cardData.indexOf('{');
+        int end = cardData.lastIndexOf('}');
+        String jsonStr = cardData.substring(start, end + 1);
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode node = mapper.readTree(jsonStr);
+        String nameTask = node.get("name_task").asText();       // "20260508测试"
+        String nameCustomer = node.get("name_customer").asText(); // "客户A"
+        String namePerson = node.get("name_person").asText();     // "鲜明阳,牧之"
+        searchSupport.put("searchDesc",nameTask + nameCustomer + namePerson);
+        data.put("imGroupOpenSpaceModel",UtilMap.map("supportForward, searchSupport",true,searchSupport));//增加查询条件
         if(param.containsKey("extInfo")){
             data.putAll(param.getJSONObject("extInfo"));
         }
@@ -825,4 +844,17 @@ public class TbServiceImpl implements TBService {
         return McR.success(map);
     }
 
+    public static String generateHtmlLinks(String jsonArrayStr) throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode root = mapper.readTree(jsonArrayStr);
+        StringBuilder html = new StringBuilder();
+        for (JsonNode node : root) {
+            String url = node.get("arr").asText();
+            // 生成 <a> 标签,链接地址和显示文字均为 URL
+            html.append("<a href=\"").append(url).append("\">").append(url).append("</a>");
+            html.append("<br/>");  // 换行
+        }
+        return html.toString();
+    }
+
 }

+ 1 - 1
mjava-ounuo/src/main/resources/application.yml

@@ -1,3 +1,3 @@
 spring:
   profiles:
-    active: dev
+    active: prod

+ 46 - 14
mjava-siku/src/main/java/com/malk/siku/service/impl/SikuServiceImpl.java

@@ -436,10 +436,10 @@ public class SikuServiceImpl implements SikuService {
         if ("常规需求".equals(type)){
             List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
 
-            int index = 0;
             for (Map detail : detailList) {
-                index++;
                 String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid
+                int index = UtilMap.getInt(detail, "numberField_mn36ykxx");//子表index
+
                 Map body = new HashMap();
                 body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号
                 body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
@@ -489,7 +489,7 @@ public class SikuServiceImpl implements SikuService {
                 expenseListItem.put("consumeAmount",consumeAmount);
                 expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
                 String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级
-                expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
+                expenseListItem.put("expenseTypeBizCode",UtilMap.getString(detail,"textField_mp0m3ks3"));//费用类型业务编码
                 expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
                 expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
                 expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
@@ -527,10 +527,10 @@ public class SikuServiceImpl implements SikuService {
         }else {
             List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
 
-            int index = 0;
             for (Map detail : detailList) {
-                index ++;
                 String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid
+                int index = UtilMap.getInt(detail, "numberField_mn36ykxz");//子表index
+
                 Map body = new HashMap();
                 body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号
                 body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
@@ -578,7 +578,7 @@ public class SikuServiceImpl implements SikuService {
                 expenseListItem.put("consumeAmount",consumeAmount);
                 expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
                 String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级
-                expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
+                expenseListItem.put("expenseTypeBizCode",UtilMap.getString(detail,"textField_mp0m3ks5"));//费用类型业务编码
                 expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
                 expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
                 expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
@@ -1256,10 +1256,9 @@ public class SikuServiceImpl implements SikuService {
         //针对多供应商分期付款拆分多条每刻项目支付单
         if ("常规采购".equals(type)){
             List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij56");//常规-采购明细
-            int index = 0;
             for (Map detail : detailList) {
-                index++;
                 String uuid = UtilMap.getString(detail, "textField_mmvhqm0q");//子表uuid
+                int index = UtilMap.getInt(detail, "numberField_mn36ykxx");//子表uuid
 
                 Map body = new HashMap();
                 body.put("formCode",xqbh + "-" + index);//有值时会使用该值作为单据号
@@ -1308,7 +1307,7 @@ public class SikuServiceImpl implements SikuService {
                 expenseListItem.put("consumeAmount",consumeAmount);
                 expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
                 String gysej = UtilMap.getString(detail, "selectField_mkkkw28y");//供应商二级
-                expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
+                expenseListItem.put("expenseTypeBizCode",UtilMap.getString(detail,"textField_mp0m3ks3"));//费用类型业务编码
                 expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
                 expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
                 expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
@@ -1346,10 +1345,10 @@ public class SikuServiceImpl implements SikuService {
         }else {
             List<Map> detailList = UtilMap.getList(formData, "tableField_mkkmij61");//free-采购明细
 
-            int index = 0;
             for (Map detail : detailList) {
-                index ++;
                 String uuid = UtilMap.getString(detail, "textField_mmvhqm0s");//子表uuid
+                int index = UtilMap.getInt(detail, "numberField_mn36ykxz");//子表uuid
+
                 Map body = new HashMap();
                 body.put("formCode",xqbh + "-" +index);//有值时会使用该值作为单据号
                 body.put("formSubTypeBizCode",formSubTypeBizCode);//表单类型的业务编号
@@ -1398,7 +1397,7 @@ public class SikuServiceImpl implements SikuService {
                 expenseListItem.put("consumeAmount",consumeAmount);
                 expenseListItem.put("corpExpense",true);//是否对公费用,需要填写true
                 String gysej = UtilMap.getString(detail, "selectField_mmwuzaql");//供应商二级
-                expenseListItem.put("expenseTypeBizCode",MkBxUtil.expenseTypeSearch(UtilMap.map("keyword",gysej)));//费用类型业务编码
+                expenseListItem.put("expenseTypeBizCode",UtilMap.getString(detail,"textField_mp0m3ks5"));//费用类型业务编码
                 expenseListItem.put("corpType","NO_RECEIPT");//业务场景:ALL_RECEIPTS(全部到票) NO_RECEIPT(预付未到票) RECEIPT_DEDUCTION(到票核销) RECEIPT_PAY_SOME(到票部分支付或不支付) PAY_BEFORE_RECEIPT(支付前期已到的发票)
                 expenseListItem.put("nonReceiptAmount",new HashMap<>(consumeAmount));//未到票金额(预付未到票场景必填)
                 expenseListItem.put("forecastReceiptDate",System.currentTimeMillis());//预计到票时间(预付未到票场景必填)
@@ -1955,6 +1954,7 @@ public class SikuServiceImpl implements SikuService {
                 List<Map> ydExpenseList = new ArrayList<>();
 
                 double totalAmt = 0d;
+                double totalTaxAmt = 0d;
 
                 for (Map expense : expenseList) {
                     String expenseType = getMkStrValue(expense, "expenseTypeCode");//费用类型
@@ -1962,17 +1962,26 @@ public class SikuServiceImpl implements SikuService {
                     String comments = getMkStrValue(expense, "comments");//用途
                     long consumeTime = getMkDateValue(expense, "consumeTime");//消费日期
 
+                    List<Map> invoiceTaxList = getMkListValue(expense, "invoiceTaxList");//税票信息
+                    double deductionTaxAmount = 0;
+                    for (Map invoiceTax : invoiceTaxList) {
+                        deductionTaxAmount += Double.parseDouble(getMkStrValue(invoiceTax, "deductionTaxAmount"));//抵扣税额
+                    }
+
                     Map expenseMap = new HashMap();
                     expenseMap.put("textField_mnwlpiwc",expenseType);
                     expenseMap.put("numberField_mnwlpiwd",acceptAmount);
                     expenseMap.put("textareaField_mnwlpiwh",comments);
                     expenseMap.put("dateField_mnwlpiwe",consumeTime);
+                    expenseMap.put("numberField_mol7a35x",deductionTaxAmount);
 
                     ydExpenseList.add(expenseMap);
 
                     totalAmt += acceptAmount;
+                    totalTaxAmt += deductionTaxAmount;
                 }
 
+                ydFormData.put("textField_mnyfvfxr",formCode);
                 ydFormData.put("textField_mnwtck7h","项目报销单(个人)");
                 ydFormData.put("textField_mnwtwu9z",projectCode);
                 ydFormData.put("textField_mnwlpivn",projectName);
@@ -1984,6 +1993,7 @@ public class SikuServiceImpl implements SikuService {
                 ydFormData.put("textField_mnwlpivq",cf31);
                 ydFormData.put("tableField_mnwlpiwb",ydExpenseList);
                 ydFormData.put("numberField_mo007gcg",totalAmt);
+                ydFormData.put("numberField_mowkibv8",totalTaxAmt);
 
                 break;
             case "FT212801282906280987"://打车(企业支付)
@@ -2014,6 +2024,7 @@ public class SikuServiceImpl implements SikuService {
                 List<Map> ydExpenseList2 = new ArrayList<>();
 
                 double totalAmt2 = 0d;
+                double totalTaxAmt2 = 0d;
 
                 for (Map expense : expenseList2) {
                     String expenseType = getMkStrValue(expense, "expenseTypeCode");//费用类型
@@ -2021,17 +2032,26 @@ public class SikuServiceImpl implements SikuService {
                     String comments = getMkStrValue(expense, "comments");//用途
                     long consumeTime = getMkDateValue(expense, "consumeTime");//消费日期
 
+                    List<Map> invoiceTaxList = getMkListValue(expense, "invoiceTaxList");//税票信息
+                    double deductionTaxAmount = 0;
+                    for (Map invoiceTax : invoiceTaxList) {
+                        deductionTaxAmount += Double.parseDouble(getMkStrValue(invoiceTax, "deductionTaxAmount"));//抵扣税额
+                    }
+
                     Map expenseMap = new HashMap();
                     expenseMap.put("textField_mnwlpiwc",expenseType);
                     expenseMap.put("numberField_mnwlpiwd",acceptAmount);
                     expenseMap.put("textareaField_mnwlpiwh",comments);
                     expenseMap.put("dateField_mnwlpiwe",consumeTime);
+                    expenseMap.put("numberField_mol7a35x",deductionTaxAmount);
 
                     ydExpenseList2.add(expenseMap);
 
                     totalAmt2 += acceptAmount;
+                    totalTaxAmt2 += deductionTaxAmount;
                 }
 
+                ydFormData.put("textField_mnyfvfxr",formCode);
                 ydFormData.put("textField_mnwtck7h","打车(企业支付)");
                 ydFormData.put("textField_mnwtwu9z",projectCode2);
                 ydFormData.put("textField_mnwlpivn",projectName2);
@@ -2043,6 +2063,7 @@ public class SikuServiceImpl implements SikuService {
                 ydFormData.put("textField_mnwlpivq",cf31_2);
                 ydFormData.put("tableField_mnwlpiwb",ydExpenseList2);
                 ydFormData.put("numberField_mo007gcg",totalAmt2);
+                ydFormData.put("numberField_mowkibv8",totalTaxAmt2);
 
                 break;
             case "FT204524106635297811"://项目差旅报销单
@@ -2069,6 +2090,7 @@ public class SikuServiceImpl implements SikuService {
                 List<Map> ydExpenseList3 = new ArrayList<>();
 
                 double totalAmt3 = 0d;
+                double totalTaxAmt3 = 0d;
 
                 for (Map expense : expenseList3) {
                     String expenseType = getMkStrValue(expense, "expenseTypeCode");//费用类型
@@ -2076,17 +2098,26 @@ public class SikuServiceImpl implements SikuService {
                     String comments = getMkStrValue(expense, "comments");//用途
                     long consumeTime = getMkDateValue(expense, "consumeTime");//消费日期
 
+                    List<Map> invoiceTaxList = getMkListValue(expense, "invoiceTaxList");//税票信息
+                    double deductionTaxAmount = 0;
+                    for (Map invoiceTax : invoiceTaxList) {
+                        deductionTaxAmount += Double.parseDouble(getMkStrValue(invoiceTax, "deductionTaxAmount"));//抵扣税额
+                    }
+
                     Map expenseMap = new HashMap();
                     expenseMap.put("textField_mnwlpiwc",expenseType);
                     expenseMap.put("numberField_mnwlpiwd",acceptAmount);
                     expenseMap.put("textareaField_mnwlpiwh",comments);
                     expenseMap.put("dateField_mnwlpiwe",consumeTime);
+                    expenseMap.put("numberField_mol7a35x",deductionTaxAmount);
 
                     ydExpenseList3.add(expenseMap);
 
                     totalAmt3 += acceptAmount;
+                    totalTaxAmt3 += deductionTaxAmount;
                 }
 
+                ydFormData.put("textField_mnyfvfxr",formCode);
                 ydFormData.put("textField_mnwtck7h","项目差旅报销单");
                 ydFormData.put("textField_mnwtwu9z",projectCode3);
                 ydFormData.put("textField_mnwlpivn",projectName3);
@@ -2098,6 +2129,7 @@ public class SikuServiceImpl implements SikuService {
                 ydFormData.put("textField_mnwlpivq",cf31_3);
                 ydFormData.put("tableField_mnwlpiwb",ydExpenseList3);
                 ydFormData.put("numberField_mo007gcg",totalAmt3);
+                ydFormData.put("numberField_mowkibv8",totalTaxAmt3);
 
                 break;
             default:
@@ -2331,7 +2363,7 @@ public class SikuServiceImpl implements SikuService {
             body.put("type",2);
             body.put("budget_cycle",0);
             body.put("total_quota",0);
-            body.put("member_used",2);//0 :全员可见 1:项目成员可见 2:公司主体可见
+            body.put("member_used",1);//0 :全员可见 1:项目成员可见 2:公司主体可见
             body.put("legal_entity_id",ddLegalEntity.get(htqygssh));//项目所属公司主体ID
             body.put("start_date",startDate);
             body.put("expiry_date",endDate);
@@ -2345,7 +2377,7 @@ public class SikuServiceImpl implements SikuService {
             body.put("out_budget_id",projectCode);
             body.put("name",projectName);
             body.put("type",2);
-            body.put("member_used",2);//0 :全员可见 1:项目成员可见 2:公司主体可见
+            body.put("member_used",1);//0 :全员可见 1:项目成员可见 2:公司主体可见
             body.put("legal_entity_id",ddLegalEntity.get(htqygssh));//项目所属公司主体ID
             body.put("leader_employee_id",JSONObject.toJSONString(leader_employee_id));
 

+ 4 - 4
mjava-siku/src/test/java/com.malk.siku/SkTest.java

@@ -26,12 +26,12 @@ public class SkTest {
     @Test
     public void getSecret(){
         //每刻报销-测试环境
-        String appCode="AP52Y01LHHTAP9";
-        String appSecret="N4WuERLteAUPaWebnsHy";
+        /*String appCode="AP52Y01LHHTAP9";
+        String appSecret="N4WuERLteAUPaWebnsHy";*/
 
         //每刻报销-生产环境
-        /*String appCode="AP52RG1SCG8S6L";
-        String appSecret="YFTbD2MviqUwztBTbMWd";*/
+        String appCode="AP52RG1SCG8S6L";
+        String appSecret="YFTbD2MviqUwztBTbMWd";
 
         //每刻云票-测试环境
         /*String appCode="AP53EP1SVDS1N9";

+ 74 - 0
mjava-yzl/pom.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.18</version> <!-- 使用最新的稳定版或其他适用版本 -->
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.malk</groupId>
+    <artifactId>mjava-yzl</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>yzl</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 17 - 0
mjava-yzl/src/main/java/com/malk/yzl/YzlApplication.java

@@ -0,0 +1,17 @@
+package com.malk.yzl;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+@EnableScheduling
+public class YzlApplication {
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(YzlApplication.class,args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

+ 114 - 0
mjava-yzl/src/main/java/com/malk/yzl/controller/ZzwController.java

@@ -0,0 +1,114 @@
+package com.malk.yzl.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Schedule;
+import com.malk.utils.PublicUtil;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+import static com.malk.utils.ISO8601Converter.toISO8601;
+
+@RestController
+@Slf4j
+@RequestMapping("/zzw/")
+public class ZzwController {
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private DDClient_Schedule ddClientSchedule;
+    @Autowired
+    private DDClient ddClient;
+
+    @PostMapping("/schedule/create")
+    public McR createSchedule(@RequestBody JSONObject jsonObject){
+        log.info("创建日程接口:{}",jsonObject);
+        if(!PublicUtil.isNull(jsonObject,"sId")){
+            return McR.success("已创建日程");
+        }
+        if(PublicUtil.isNull(jsonObject,"summary","start","end","createUid","fid")){
+            return McR.error("201","参数不能为空!");
+        }
+        List<String> userIds=new ArrayList<>();
+        Map<String,Map> userSaveMap=new HashMap<>();
+        Map formdata=ydClient.queryData(YDParam.builder().formInstId(jsonObject.getString("fid")).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        List<Map> mapList=ydConf.associationForm(String.valueOf(formdata.get("associationFormField_mn774naw_id")));
+        for (Map map : mapList) {
+            String instanceId=UtilMap.getString(map, "instanceId");
+            Map user=ydClient.queryData(YDParam.builder().formInstId(instanceId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            if(user!=null&&user.containsKey("employeeField_mogigdaq_id")){
+                userIds.addAll(UtilMap.getList(user, "employeeField_mogigdaq_id"));
+                userSaveMap.put(UtilMap.getString(user,"textField_mn6syci3"),UtilMap.map("textField_mowiqmgq, associationFormField_mn774naw, textField_mowj9roq, selectField_mowiqmgr, dateField_mn6vz0hj",
+                        UtilMap.getString(formdata,"serialNumberField_mn6vz0ha"),Arrays.asList(map),UtilMap.getString(user,"textField_mn6syci3"),"未操作",jsonObject.getLong("end")));
+            }
+        }
+        Map map=new HashMap();
+        map.put("summary",jsonObject.getString("summary"));
+        map.put("start",getDate(jsonObject.getLong("start")));
+        map.put("end",getDate(jsonObject.getLong("end")));
+        map.put("userIds", userIds);
+        if(!PublicUtil.isNull(jsonObject,"location")){
+            map.put("location", UtilMap.map("displayName",jsonObject.getString("location")));
+        }
+        String result=ddClientSchedule.eventsSchedule(ddClient.getAccessToken(),jsonObject.getString("createUid"),map);
+        JSONObject obj=JSONObject.parseObject(result);
+        if(obj.containsKey("id")&& !PublicUtil.isNull(obj.get("id"))){
+            log.info("创建成功:{}",obj);
+            ydClient.operateData(YDParam.builder().updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mowj9rop, textField_moxsll4l",obj.getString("id"),"是"))).formInstId(jsonObject.getString("fid")).build(), YDConf.FORM_OPERATION.update);
+            JSONArray attendees =  obj.getJSONArray("attendees");
+            for (int i = 0; i < attendees.size(); i++) {
+                JSONObject attendee=attendees.getJSONObject(i);
+                String name=attendee.getString("displayName");
+                save(obj.getString("id"),name,getStatus(attendee.getString("responseStatus")),userSaveMap.get(name));
+            }
+        }else {
+            log.info("请求失败!{}",obj.getString("message"));
+            return McR.error("201",obj.getString("message"));
+        }
+        return McR.success("已创建日程");
+    }
+
+    private Map getDate(long time){
+        return UtilMap.map("dateTime, timeZone",toISO8601(time, "Asia/Shanghai"),"Asia/Shanghai");
+    }
+
+    private String getStatus(String code){
+        switch (code){
+            case "needsAction": return "未操作";
+            case "accepted": return "已接受";
+            case "declined": return "已拒绝";
+            case "tentative": return "暂定接受";
+        }
+        return "";
+    }
+
+    private void save(String sid,String uname,String status,Map saveMap){
+        if(saveMap==null||saveMap.isEmpty()){
+            saveMap=new HashMap();
+        }
+        if(PublicUtil.isNull(uname)){
+            return;
+        }
+        saveMap.put("textField_mowj9rop", sid);
+        saveMap.put("selectField_mowiqmgr", status);
+        ydClient.operateData(YDParam.builder().formDataJson(JSONObject.toJSONString(saveMap)).formUuid("FORM-CD59959AAB334321A2542558A8285D5BMZ2K").searchCondition(JSONObject.toJSONString(Arrays.asList(
+                ydConf.searchCondition_TextFiled("textField_mowj9rop",sid,"eq"),ydConf.searchCondition_TextFiled("textField_mowj9roq",uname,"eq")
+        ))).build(), YDConf.FORM_OPERATION.upsert);
+    }
+
+}

+ 32 - 0
mjava-yzl/src/main/resources/application-dev.yml

@@ -0,0 +1,32 @@
+server:
+  port: 9000
+  servlet:
+    context-path: /api/yzl
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: ./log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 4557768490
+  appKey: dingwpwgcqsh1lihphx1
+  appSecret: 0v_GKckYxTO_kcupoifZ8mfcNAI06eUMjvQk8DjikevqlmcdaKBhjr5WqPPP8zZK
+  corpId:
+  aesKey:
+  token:
+# teambition
+teambition:
+  AppID:
+  AppSecret:
+  TenantId:
+  OperatorId:    # 公共账号, 需要有操作权限 [牧语]
+# aliwork
+aliwork:
+  appType: APP_OKUNHYV4085YXZVZM8VX
+  systemToken: NYE66V61MYB409PAGLDNABX1OS0I2OTSUS6NMIU2
+

+ 15 - 0
mjava-yzl/src/main/resources/application.yml

@@ -0,0 +1,15 @@
+spring:
+  profiles:
+    active: dev
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: auto

+ 61 - 0
mjava-yzl/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.malk.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 138 - 0
mjava-yzl/src/test/java/com/malk/yzl/JdTest.java

@@ -0,0 +1,138 @@
+package com.malk.yzl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.aliwork.YDSearch;
+import com.malk.server.dingtalk.DDR_New;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Schedule;
+import com.malk.utils.PublicUtil;
+import com.malk.utils.UtilMap;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.lang.reflect.Array;
+import java.util.*;
+
+import static com.malk.utils.ISO8601Converter.toISO8601;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class JdTest {
+
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private DDClient_Schedule ddClientSchedule;
+    @Autowired
+    private DDClient ddClient;
+
+
+    @Test
+    public void test(){
+        Map map=new HashMap();
+//        map.put("summary","日程名称");
+        map.put("start",getDate(1778292000000L));
+        map.put("end",getDate(1778295600000L));
+        map.put("userIds", Arrays.asList("153620324221442254"));
+        map.put("location", UtilMap.map("displayName","甬水商务中心"));
+        String result=ddClientSchedule.eventsSchedule(ddClient.getAccessToken(),"tom",map);
+        JSONObject obj=JSONObject.parseObject(result);
+        if(obj.containsKey("id")&& !PublicUtil.isNull(obj.get("id"))){
+
+        }else {
+            System.out.println("请求失败!"+obj.getString("message"));
+        }
+        System.out.println(result);
+
+
+//        ddClientSchedule.queryAttendees(ddClient.getAccessToken(),"h1TfGwHiP1Nj7U3mXWoptkgiEiE","RFZQRU1JN2NNOFpMRTNNckRhL1ZEZz09");
+    }
+
+    private Map getDate(long time){
+        return UtilMap.map("dateTime, timeZone",toISO8601(time, "Asia/Shanghai"),"Asia/Shanghai");
+    }
+
+    @Test
+    public void queryOrder2(){
+        List<String> users=new ArrayList<>();
+        Map<String,Map> userSaveMap=new HashMap<>();
+
+        Map formdata=ydClient.queryData(YDParam.builder().formInstId("FINST-LX966EB1ZTY4NI2SNVIU787ICN2B2R4OUTGOMUE8").build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        System.out.println(formdata);
+        List<Map> mapList=ydConf.associationForm(String.valueOf(formdata.get("associationFormField_mn774naw_id")));
+        System.out.println(mapList);
+        for (Map map : mapList) {
+            String instanceId=UtilMap.getString(map, "instanceId");
+            Map user=ydClient.queryData(YDParam.builder().formInstId(instanceId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+            if(user!=null&&user.containsKey("employeeField_mogigdaq_id")){
+                users.addAll(UtilMap.getList(user, "employeeField_mogigdaq_id"));
+                userSaveMap.put(UtilMap.getString(user,"textField_mn6syci3"),UtilMap.map("textField_mowiqmgq, associationFormField_mn774naw, textField_mowj9roq, selectField_mowiqmgr, dateField_mn6vz0hj",
+                        UtilMap.getString(formdata,"serialNumberField_mn6vz0ha"),Arrays.asList(map),UtilMap.getString(user,"textField_mn6syci3"),"未操作",null));
+            }
+        }
+        save("","","未操作",userSaveMap);
+    }
+
+    private void save(String sid,String uname,String status,Map saveMap){
+        if(saveMap==null||saveMap.isEmpty()){
+            saveMap=new HashMap();
+        }
+        if(PublicUtil.isNull(uname)){
+            return;
+        }
+        saveMap.put("textField_mowj9rop", sid);
+        saveMap.put("selectField_mowiqmgr", status);
+        ydClient.operateData(YDParam.builder().formDataJson(JSONObject.toJSONString(saveMap)).formUuid("FORM-CD59959AAB334321A2542558A8285D5BMZ2K").searchCondition(JSONObject.toJSONString(Arrays.asList(
+                ydConf.searchCondition_TextFiled("textField_mowj9rop",sid,"eq"),ydConf.searchCondition_TextFiled("textField_mowj9roq",uname,"eq")
+        ))).build(), YDConf.FORM_OPERATION.upsert);
+    }
+
+    @Test
+    public void sync(){
+        long now = System.currentTimeMillis();
+        List<Map> dataList = (List<Map>)ydClient.queryData(YDParam.builder().formUuid("FORM-F99DB628726944A18721E5F7B08B196CZ8F3").searchCondition(JSONObject.toJSONString(Arrays.asList(
+                new YDSearch("textField_moxsll4l","是","是否已创建日程",YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ),
+                new YDSearch("dateField_mn6vz0hj",now,"截至时间",YDSearch.Type.DATE_FIELD, YDSearch.Operator.GE)
+        ))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+        for (Map map : dataList) {
+            Map formData=UtilMap.getMap(map,"formData");
+            List userIds=UtilMap.getList(formData,"employeeField_moglrzqk_id");
+            if(userIds==null||userIds.size()<1){
+                continue;
+            }
+            String sid=UtilMap.getString(formData,"textField_mowj9rop");
+            String result=ddClientSchedule.queryAttendees(ddClient.getAccessToken(),String.valueOf(userIds.get(0)),sid);
+            JSONObject obj=JSONObject.parseObject(result);
+            if(obj.containsKey("attendees")&& !PublicUtil.isNull(obj.get("attendees"))){
+                JSONArray attendees =  obj.getJSONArray("attendees");
+                for (int i = 0; i < attendees.size(); i++) {
+                    JSONObject attendee=attendees.getJSONObject(i);
+                    String name=attendee.getString("displayName");
+                    save(sid,name,getStatus(attendee.getString("responseStatus")),null);
+                }
+            }else {
+                System.out.println("请求失败!"+obj.getString("message"));
+            }
+        }
+    }
+
+    private String getStatus(String code){
+        switch (code){
+            case "needsAction": return "未操作";
+            case "accepted": return "已接受";
+            case "declined": return "已拒绝";
+            case "tentative": return "暂定接受";
+        }
+        return "";
+    }
+}

+ 27 - 23
mjava-zhongche/src/main/java/com/malk/zhongche/service/impl/ZhongcheServiceImpl.java

@@ -135,7 +135,7 @@ public class ZhongcheServiceImpl implements ZhongcheService {
         String projectId = UtilMap.getString(formData, "textField_mkkrgg8u");//项目id
         String taskId = UtilMap.getString(formData, "textField_mkkrgg8y");//任务id
         long dueDate = UtilMap.getLong(formData, "dateField_mn757w7y");//预计完成时间
-        List<String> questionTypes = UtilMap.getList(formData, "multiSelectField_mn757w7v");//任务类型
+        List<String> questionTypes = UtilMap.getList(formData, "checkboxField_mp28uz2w");//任务类型
 
         Map taskInfo = tbClient.queryTaskDetail(taskId, null, null).get(0);
 
@@ -213,31 +213,33 @@ public class ZhongcheServiceImpl implements ZhongcheService {
 
         String parentTaskId = UtilMap.getString(taskInfo, "parentTaskId");
 
-        Map parentTaskInfo = tbClient.queryTaskDetail(parentTaskId, null, null).get(0);
+        if (Strings.isNotBlank(parentTaskId)){
+            Map parentTaskInfo = tbClient.queryTaskDetail(parentTaskId, null, null).get(0);
 
-        String projectId = UtilMap.getString(parentTaskInfo, "projectId");
-        String sfcId = UtilMap.getString(parentTaskInfo, "sfcId");
+            String projectId = UtilMap.getString(parentTaskInfo, "projectId");
+            String sfcId = UtilMap.getString(parentTaskInfo, "sfcId");
 
-        //获取项目任务类型
-        List<Map> result = searchProjectSfc(projectId);
+            //获取项目任务类型
+            List<Map> result = searchProjectSfc(projectId);
 
-        String sfcId2 = "";//任务(企业)
-        String sfcId3 = "";//末级任务(企业)
+            String sfcId2 = "";//任务(企业)
+            String sfcId3 = "";//末级任务(企业)
 
-        for (Map resultMap : result) {
-            String name = UtilMap.getString(resultMap, "name");
-            String id = UtilMap.getString(resultMap, "id");
+            for (Map resultMap : result) {
+                String name = UtilMap.getString(resultMap, "name");
+                String id = UtilMap.getString(resultMap, "id");
 
-            switch (name){
-                case "任务(企业)":sfcId2 = id;break;
-                case "末级任务(企业)":sfcId3 = id;break;
-                default:break;
+                switch (name){
+                    case "任务(企业)":sfcId2 = id;break;
+                    case "末级任务(企业)":sfcId3 = id;break;
+                    default:break;
+                }
             }
-        }
 
-        //若父任务任务类型为末级任务(企业),更新为任务(企业)
-        if (sfcId.equals(sfcId3)){
-            updateTaskSfc(parentTaskId, sfcId2);
+            //若父任务任务类型为末级任务(企业),更新为任务(企业)
+            if (sfcId.equals(sfcId3)){
+                updateTaskSfc(parentTaskId, sfcId2);
+            }
         }
 
         return McR.success();
@@ -245,10 +247,11 @@ public class ZhongcheServiceImpl implements ZhongcheService {
 
     @Override
     public void updateLastTaskSfc() {
-        List<String> projectIds = searchProject();
+//        List<String> projectIds = searchProject();
+        List<String> projectIds = new ArrayList<String>(){{add("681b19b2ac9fa0e9bfaa186e");}};
 
         for (String projectId : projectIds) {
-            if (!"69e1fcd4c41c37563c72888e".equals(projectId)) continue;
+//            if (!"68d20eee0e4637c8b70445fc".equals(projectId)) continue;
 
             String sfcId = "";//末级任务(企业)
             String sfcId2 = "";//任务(企业)
@@ -266,8 +269,9 @@ public class ZhongcheServiceImpl implements ZhongcheService {
                 }
             }
 
-            //查询项目下所有非顶级任务且任务类型为任务(企业)
-            List<Map> taskList = tbClient.queryProjectTaskList(projectId, UtilMap.map("q, pageSize", "taskLayer = exceptTopLevel AND scenarioId = " + sfcId2, 1000), null);
+            //查询项目下所有任务类型为任务(企业)
+//            List<Map> taskList = tbClient.queryProjectTaskList(projectId, UtilMap.map("q, pageSize", "taskLayer = exceptTopLevel AND scenarioId = " + sfcId2, 1000), null);
+            List<Map> taskList = tbClient.queryProjectTaskList(projectId, UtilMap.map("q, pageSize", "scenarioId = " + sfcId2, 1000), null);
 
             //遍历所有任务,查询末级任务
             for (Map task : taskList) {