Kaynağa Gözat

Merge branch 'master' of https://mc.cloudpure.cn/mjava/merservice

wzy 1 ay önce
ebeveyn
işleme
96236cc411

+ 1 - 1
pom.xml

@@ -13,7 +13,7 @@
 
     <groupId>com.malk</groupId>
     <artifactId>pro</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.3</version>
 
     <properties>
         <maven.compiler.source>8</maven.compiler.source>

+ 56 - 11
src/main/java/com/malk/pro/guyuan/controller/IVController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.malk.pro.guyuan.server.model.McInvoiceDto;
 import com.malk.pro.guyuan.server.model.McInvoiceKind;
 import com.malk.pro.guyuan.server.tencent.TXYConf;
+import com.malk.pro.guyuan.service.tencent.IvYdService;
 import com.malk.pro.guyuan.service.tencent.TXYInvoice;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
@@ -64,8 +65,13 @@ public class IVController {
         return "";
     }
 
+    public static void main(String[] args) {
+        System.out.println("上海渔米可禧文化传媒有限公司".equals(guyuanNameRepalce("上海渔米可禧文化传媒有限公司 ")));
+    }
+
     // 兼容历史配置, 格式 (谷元)
-    private String guyuanNameRepalce(String name) {
+    private static String guyuanNameRepalce(String name) {
+        name=name.replaceAll(" ","");
         if (name.contains("谷元")) {
             return UtilString.replaceBracketIsWhole(name);
         } else {
@@ -167,24 +173,58 @@ public class IVController {
             image = pdfUrlConvertBase64(image);
         }
         List<Map> invoices = (List<Map>) txyInvoice.doRecognizeGeneralInvoice(image).get("MixedInvoiceItems");
+        List<String> nos=new ArrayList<>();
         List<McInvoiceDto> result = invoices.stream().map(item -> {
             Map prop = UtilMap.getMap(UtilMap.getMap(item, "SingleInvoiceInfos"), UtilMap.getString(item, "SubType"));
+            String no=UtilMap.getString(prop, "Number");
+            if(nos.contains(no)){
+                return null;
+            }
+            nos.add(no);
+            String kind = UtilMap.getString(item, "TypeDescription");
+            String invoiceName = UtilMap.getString(item, "SubTypeDescription");
+            if (kind.equals("全电发票")) {
+                if(invoiceName.contains("铁路电子客票")){
+                    kind="火车票";
+                } else if(invoiceName.contains("机票行程单")){
+                    kind="机票行程单";
+                } else if (invoiceName.contains("专用发票")) {
+                    kind="全电专用发票";
+                }else {
+                    kind="全电普通发票";
+                }
+            }
+            if (kind.equals("增值税发票")) {
+                if(invoiceName.contains("区块链电子发票")){
+                    kind="区块链电子发票";
+                } else if(invoiceName.contains("增值税专用发票")){
+                    kind="增值税专用发票";
+                } else if(invoiceName.contains("增值税普通发票")){
+                    kind="增值税普通发票";
+                } else if (invoiceName.contains("增值税电子专用发票")) {
+                    kind="增值税电子专用发票";
+                } else if (invoiceName.contains("增值税电子普通发票")) {
+                    kind="增值税电子普通发票";
+                }else {
+                    kind="增值税普通发票";
+                }
+            }
             // ppExt: 通用字段定义
             McInvoiceDto invoiceDto = McInvoiceDto.builder()
                     .name(UtilMap.getString(item, "SubTypeDescription"))
-                    .kindName(UtilMap.getString(item, "TypeDescription"))
+                    .kindName(kind)
                     .kind(UtilMap.getInt(item, "Type"))
                     .code(UtilMap.getString(prop, "Code"))
                     .serial(UtilMap.getString(prop, "Number"))
                     .date(UtilString.replaceDateZH_cn(UtilMap.getString(prop, "Date")))
                     .checkCode(UtilMap.getString(prop, "CheckCode"))
-                    // ppExt: 多明细行时, 优先取值合计 [全电票返回了subTotal字段, 但值为空]
-                    .amount(UtilNumber.setBigDecimal(UtilMap.getString_first(prop, "SubTotal", "Total")))
-                    .tax(UtilNumber.setBigDecimal(UtilMap.getString_first(prop, "SubTax", "Tax")))
+                    // ppExt: 多明细行时, 优先取值合计 [全电票返回了subTotal字段, 但值为空] // 2025.5.12 去除小计金额,并去除发票编号重复数据
+                    .amount(UtilNumber.setBigDecimal(UtilMap.getString_first(prop,  "Total", "Fare"))) // "SubTotal",
+                    .tax(UtilNumber.setBigDecimal(UtilMap.getString_first(prop,  "Tax"))) // "SubTax",
                     .excludingTax(UtilNumber.setBigDecimal(UtilMap.getString(prop, "PretaxAmount")))
-                    .buyerName(guyuanNameRepalce(UtilMap.getString(prop, "Buyer")))
+                    .buyerName(StringUtils.isBlank(guyuanNameRepalce(UtilMap.getString(prop, "Buyer")))?"上海能辉科技股份有限公司":guyuanNameRepalce(UtilMap.getString(prop, "Buyer")))
                     // ppExt: 中央非税未返回税号官方说明: 非税发票理论是没有税号的,图片中属于信用代码
-                    .buyerTaxId(UtilMap.getString(prop, "BuyerTaxID"))
+                    .buyerTaxId(StringUtils.isBlank(UtilMap.getString(prop, "BuyerTaxID"))?"": UtilMap.getString(prop, "BuyerTaxID"))
                     .sellerName(guyuanNameRepalce(UtilMap.getString_first(prop, "Seller", "Issuer")))                            // 行程单: 填开单位
                     .sellerTaxId(UtilMap.getString_first(prop, "SellerTaxID", "AgentCode"))                       // 行程单: 销售单位代号
                     .passengerName(UtilMap.getString_first(prop, "Name", "UserName"))                             // 火车票, 行程单
@@ -199,7 +239,9 @@ public class IVController {
                     .constructionCosts(UtilNumber.setBigDecimal((UtilMap.getString(prop, "AirDevelopmentFund"))))   // 行程单: 民航发展基金
                     .build();
             // ppExt: 机票行程单, 行程与座位信息在明细内
-            if ("机票行程单".equals(item.get("TypeDescription"))) {
+            if ("机票行程单".equals(kind)) {
+                invoiceDto.setSellerName(UtilMap.getString_first(prop, "Issuer"));
+                invoiceDto.setSellerTaxId(UtilMap.getString_first(prop, "Seller"));
                 Map flight = (Map) UtilMap.getList(prop, "FlightItems").get(0);
                 invoiceDto.setDepartureTime(UtilString.replaceDateZH_cn(UtilMap.getString(item, "DateGetOn")) + " " + UtilMap.getString(prop, "TimeGetOn"));
                 invoiceDto.setDeparturePort(UtilMap.getString(flight, "StationGetOn"));
@@ -211,7 +253,7 @@ public class IVController {
                 invoiceDto.setDepartureTime(UtilMap.getString(prop, "TimeGetOn") + " ~ " + UtilMap.getString(prop, "TimeGetOff"));
             }
             return invoiceDto;
-        }).collect(Collectors.toList());
+        }).filter(item -> item!=null).collect(Collectors.toList());
         return McR.success(McInvoiceDto.formatResponse(result));
     }
 
@@ -354,6 +396,9 @@ public class IVController {
     @Autowired
     private YDService ydService;
 
+    @Autowired
+    private IvYdService ivYdService;
+
     /**
      * 发票状态更新: 服务注册
      */
@@ -369,7 +414,7 @@ public class IVController {
         List<String> associationForm = (List<String>) JSON.parse(UtilMap.getString(data, "multiAssociation"));
         List<String> formInstanceIds = new ArrayList<>();
         for (String record : associationForm) {
-            // 解析关联表单
+            // 解析关联表单 ['[{"formType":"receipt","formUuid":"FORM-W2A66Z910O9B3LP9C6IYUDPRVWY62DO0YHIILY", "subTitle": "21.16", "instanceId": "FINST-WJC66GC1E1KWXO0173ZVW56MUFHX2ULES5DCMZGA", "appType": "APP_FKRK7Y94DPI1S9DV1605","title":"电子发票(普通发票)"}]']
             List<Map> associationData = (List<Map>) JSON.parse(record);
             formInstanceIds.addAll(associationData.stream().map(form -> UtilMap.getString(form, "instanceId")).collect(Collectors.toList()));
         }
@@ -380,7 +425,7 @@ public class IVController {
         }
 
         // prd 9.10 更新报销单, 关联到发票:: ppExt 宜搭服务注册, 提交规则系统默认字段 [详见 YDService]
-        ydService.operateData2(data, update, YDParam.builder()
+        ivYdService.operateData(data, update, YDParam.builder()
                 .formUuid("FORM-W2A66Z910O9B3LP9C6IYUDPRVWY62DO0YHIILY")
                 .formInstanceIdList(formInstanceIds)
                 .updateFormDataJson(JSON.toJSONString(update))

+ 60 - 25
src/main/java/com/malk/pro/guyuan/controller/NhIVController.java

@@ -1,7 +1,9 @@
 package com.malk.pro.guyuan.controller;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.malk.pro.guyuan.server.model.McInvoiceDto;
 import com.malk.pro.guyuan.server.model.McInvoiceKind;
 import com.malk.pro.guyuan.server.tencent.TXYConf;
@@ -155,7 +157,9 @@ public class NhIVController {
                 "河南能辉绿电科技有限公司",
                 "河南省绿色生态新能源科技有限公司",
                 "贵州能辉智慧能源科技有限公司",
-                "上海能辉科技股份有限公司");
+                "上海能辉科技股份有限公司",
+                "贵州能魁智电科技有限公司"
+                );
         McException.assertAccessException(!corpNames.contains(BuyerName), tips + ", 购买方名称不合法!");
     }
 
@@ -188,12 +192,29 @@ public class NhIVController {
             String kind = UtilMap.getString(item, "TypeDescription");
             String invoiceName = UtilMap.getString(item, "SubTypeDescription");
             if (kind.equals("全电发票")) {
-                kind = invoiceName.contains("铁路电子客票")?"火车票": invoiceName.contains("专用发票") ? "全电专用发票" : "全电普通发票";
+                if(invoiceName.contains("铁路电子客票")){
+                    kind="火车票";
+                } else if(invoiceName.contains("机票行程单")){
+                    kind="机票行程单";
+                } else if (invoiceName.contains("专用发票")) {
+                    kind="全电专用发票";
+                }else {
+                    kind="全电普通发票";
+                }
             }
             if (kind.equals("增值税发票")) {
-                kind = invoiceName.contains("增值税专用发票") ? "增值税专用发票" : "增值税普通发票";
-                if (invoiceName.contains("增值税电子")) {
-                    kind = invoiceName.contains("专用发票") ? "增值税电子专用发票" : "增值税电子普通发票";
+                if(invoiceName.contains("区块链电子发票")){
+                    kind="区块链电子发票";
+                } else if(invoiceName.contains("增值税专用发票")){
+                    kind="增值税专用发票";
+                } else if(invoiceName.contains("增值税普通发票")){
+                    kind="增值税普通发票";
+                } else if (invoiceName.contains("增值税电子专用发票")) {
+                    kind="增值税电子专用发票";
+                } else if (invoiceName.contains("增值税电子普通发票")) {
+                    kind="增值税电子普通发票";
+                }else {
+                    kind="增值税普通发票";
                 }
             }
             // ppExt: 通用字段定义
@@ -226,7 +247,9 @@ public class NhIVController {
                     .constructionCosts(UtilNumber.setBigDecimal((UtilMap.getString(prop, "AirDevelopmentFund"))))   // 行程单: 民航发展基金
                     .build();
             // ppExt: 机票行程单, 行程与座位信息在明细内
-            if ("机票行程单".equals(item.get("TypeDescription"))) {
+            if ("机票行程单".equals(kind)) {
+                invoiceDto.setSellerName(UtilMap.getString_first(prop, "Issuer"));
+                invoiceDto.setSellerTaxId(UtilMap.getString_first(prop, "Seller"));
                 Map flight = (Map) UtilMap.getList(prop, "FlightItems").get(0);
                 invoiceDto.setDepartureTime(UtilString.replaceDateZH_cn(UtilMap.getString(item, "DateGetOn")) + " " + UtilMap.getString(prop, "TimeGetOn"));
                 invoiceDto.setDeparturePort(UtilMap.getString(flight, "StationGetOn"));
@@ -353,29 +376,41 @@ public class NhIVController {
                 McException.exceptionAccess(serial + "已存在, 请勿重复提交!");
             }
             // prd 仅仅识别 报销 用途的发票
-            if (dto.getType().equals("报销") && !dto.getKindName().contains("车票") && !dto.getKindName().contains("车发票") && !dto.getKindName().contains("定额发票") && !dto.getKindName().contains("通用机打发票")) {
-                String serialTips = serial + "有疑问";
-                try {
-                    // ppExt: 识别与验真后抬头对比 [全电票, 新版本识别接口, 返回名称为: 电子发票(普通发票) 不包含全电标识, 发类型为: 全电发票. 注意取值]
-                    Map rsp = txyInvoice.doVatInvoiceVerifyNew(dto.getKindName(), dto.getCode(), invoiceNo, dto.getDate(), String.valueOf(dto.getAmount()), dto.getCheckCode(), String.valueOf(dto.getExcludingTax()), serialTips);
-                    Map invoice = (Map) rsp.get("Invoice");
-                    McException.assertAccessException(!dto.getBuyerName().equals(guyuanNameRepalce(invoice.get("BuyerName").toString())), serialTips + ", 购买方名称不匹配!");
+            List<String> yzType=Arrays.asList("增值税普通发票",
+                    "增值税专用发票",
+                    "增值税电子专用发票",
+                    "增值税电子普通发票",
+                    "全电普通发票",
+                    "全电专用发票");
+            // prd 仅仅识别 报销 用途的发票
+            if(!dto.getType().contains("报销")||!yzType.contains(dto.getKindName())){
+                return;
+            }
+            String serialTips = serial + "有疑问";
+            try {
+                // ppExt: 识别与验真后抬头对比 [全电票, 新版本识别接口, 返回名称为: 电子发票(普通发票) 不包含全电标识, 发类型为: 全电发票. 注意取值]
+                Map rsp = txyInvoice.doVatInvoiceVerifyNew(dto.getKindName(), dto.getCode(), invoiceNo, dto.getDate(), String.valueOf(dto.getAmount()), dto.getCheckCode(), String.valueOf(dto.getExcludingTax()), serialTips,dto.getSellerTaxId());
+                Map invoice = (Map) rsp.get("Invoice");
+                McException.assertAccessException(!dto.getBuyerName().equals(guyuanNameRepalce(invoice.get("BuyerName").toString())), serialTips + ", 购买方名称不匹配!");
+                if(!PublicUtil.isNull(invoice.get("BuyerTaxCode"))){
                     McException.assertAccessException(!dto.getBuyerTaxId().equals(invoice.get("BuyerTaxCode")), serialTips + ", 购买方税号不匹配!");
+                }
+                if(!dto.getKindName().equals("机票行程单")){
                     McException.assertAccessException(!dto.getSellerName().equals(guyuanNameRepalce(invoice.get("SellerName").toString())), serialTips + ", 销售方名称不匹配!");
                     McException.assertAccessException(!dto.getSellerTaxId().equals(invoice.get("SellerTaxCode")), serialTips + ", 销售方税号不匹配!");
-                } catch (TencentCloudSDKException e) {
-                    log.error(e.getMessage(), e);
-                    // prd: 上传发票为假发票时,提示:该发票有疑问,请联系财务人员
-                    String message = e.getMessage();
-                    // ppExt: 已经是新版本接口, 过滤提示 [官方答复: 提示不会检测您是否使用的是新版,所有的用户都会提示, 忽略即可]
-                    if (message.contains("温馨提示")) {
-                        message = message.split("温馨提示")[0];
-                    }
-                    if (message.contains("发票不存在")) {
-                        message = "有疑问,请联系财务人员";
-                    }
-                    McException.exceptionAccess(serial + message);
                 }
+            } catch (TencentCloudSDKException e) {
+                log.error(e.getMessage(), e);
+                // prd: 上传发票为假发票时,提示:该发票有疑问,请联系财务人员
+                String message = e.getMessage();
+                // ppExt: 已经是新版本接口, 过滤提示 [官方答复: 提示不会检测您是否使用的是新版,所有的用户都会提示, 忽略即可]
+                if (message.contains("温馨提示")) {
+                    message = message.split("温馨提示")[0];
+                }
+                if (message.contains("发票不存在")) {
+                    message = "有疑问,请联系财务人员";
+                }
+                McException.exceptionAccess(serial + message);
             }
         }));
         return McR.success();

Dosya farkı çok büyük olduğundan ihmal edildi
+ 80 - 0
src/main/java/com/malk/pro/guyuan/server/tencent/TXYConfNh.java


+ 1 - 1
src/main/java/com/malk/pro/guyuan/service/tencent/NhTXYInvoice.java

@@ -29,7 +29,7 @@ public interface NhTXYInvoice {
      * @param checkCode           校验码后 6 位,增值税普通发票、增值税电子普通发票、增值税普通发票(卷式)、增值税电子普通发票(通行费)时必填;
      * @param excludingTax/amount 不含税金额,增值税专用发票、增值税电子专用发票、机动车销售统一发票、二手车销售统一发票、区块链发票时必填; 全电发票为价税合计(含税金额)
      */
-    Map doVatInvoiceVerifyNew(String invoiceKind, String invoiceCode, String invoiceNo, String invoiceDate, String amount, String checkCode, String excludingTax, String tips) throws TencentCloudSDKException;
+    Map doVatInvoiceVerifyNew(String invoiceKind, String invoiceCode, String invoiceNo, String invoiceDate, String amount, String checkCode, String excludingTax, String tips,String SellerTaxCode) throws TencentCloudSDKException;
 
     /**
      * 名片识别

+ 6 - 1
src/main/java/com/malk/pro/guyuan/service/tencent/impl/NhTXYImplInvoice.java

@@ -93,7 +93,7 @@ public class NhTXYImplInvoice implements NhTXYInvoice {
      * @apiNote https://cloud.tencent.com/document/product/866/73674
      */
     @Override
-    public Map doVatInvoiceVerifyNew(String invoiceKind, String invoiceCode, String invoiceNo, String invoiceDate, String amount, String checkCode, String excludingTax, String tips) throws TencentCloudSDKException {
+    public Map doVatInvoiceVerifyNew(String invoiceKind, String invoiceCode, String invoiceNo, String invoiceDate, String amount, String checkCode, String excludingTax, String tips,String SellerTaxCode) throws TencentCloudSDKException {
         Credential cred = new Credential(txyConf.getSecretId(), txyConf.getSecretKey());
         ClientProfile clientProfile = doRequest("ocr.tencentcloudapi.com");
         OcrClient client = new OcrClient(cred, txyConf.getRegion(), clientProfile);
@@ -114,6 +114,11 @@ public class NhTXYImplInvoice implements NhTXYInvoice {
             req.setCheckCode(null);
             req.setInvoiceCode(null);
             req.setAmount(amount);
+        } else if (invoiceKind.contains("区块链")) {
+            // 区块链, 需要价税合计且无发票代码与校验码
+            req.setCheckCode(checkCode.substring(0,5));
+            req.setSellerTaxCode(SellerTaxCode);
+            req.setAmount(excludingTax);
         } else {
             req.setAmount(null);
             req.setAmount(excludingTax);

+ 8 - 0
src/main/java/com/malk/pro/zyjn/controller/TongbuController.java

@@ -3,6 +3,7 @@ package com.malk.pro.zyjn.controller;
 
 import com.malk.server.common.McR;
 import com.malk.pro.zyjn.service.TongbuService;
+import com.malk.service.dingtalk.DDClient_Schedule;
 import com.malk.utils.UtilMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -59,4 +60,11 @@ public class TongbuController {
 
         return tongbuService.query(formUuid,conditions,argument,currentPage,pageSize);
     }
+
+    @GetMapping("test")
+    public McR test() {
+
+        tongbuService.test(); // 已手动维护ID到宜搭档案
+        return McR.success();
+    }
 }

+ 3 - 0
src/main/java/com/malk/pro/zyjn/service/TongbuService.java

@@ -19,4 +19,7 @@ public interface TongbuService {
     McR query(String formUuid, Map conditions, Map argument,int currentPage,int pageSize);
 
     McR updateRicheng(Map map);
+
+
+    void  test();
 }

+ 34 - 1
src/main/java/com/malk/pro/zyjn/service/impl/TongbuServiceImpl.java

@@ -20,15 +20,18 @@ import com.dingtalk.api.response.OapiV2UserGetResponse;
 import com.malk.pro.zyjn.service.TongbuService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McException;
 import com.malk.server.common.McR;
 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.UtilHttp;
 import com.malk.utils.UtilMap;
 import com.taobao.api.ApiException;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.*;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -662,7 +665,18 @@ public class TongbuServiceImpl implements TongbuService {
             //根据实例id修改宜搭表单数据
             Map mapData = new HashMap<>();
             mapData.put("textField_m54zg5b1", richengID);
-
+            // prd 25.06.26 同步预约会议室, 于会议室水牌显示日程
+            String roomId = jsonObject.getString("textField_mccrafms");
+            if (StringUtils.isNoneBlank(roomId)) {
+                try {
+                    ddClient_schedule.bookMeetingRoom(getAccessToken(), userId, richengID, Arrays.asList(roomId));
+                } catch (McException e) {
+                    mapData.put("textareaField_mccs33fz", e.getMessage());
+                    e.printStackTrace();
+                }
+            } else {
+                mapData.put("textareaField_mccs33fz", "会议室 roomId 为空, 取消创建");
+            }
             String mapAllString = JSON.toJSONString(mapData);
             System.out.println("封装修改字段:" + mapAllString);
 
@@ -901,4 +915,23 @@ public class TongbuServiceImpl implements TongbuService {
 
         return McR.success();
     }
+
+
+    @Autowired
+    private DDClient_Schedule ddClient_schedule;
+
+    @Autowired
+    private DDClient dddClient;
+
+    @Override
+    public void test() {
+
+        String userId = "253434204020308091";
+
+        List<Map> dataList = (List<Map>) ddClient_schedule.getMeetingRoomList(dddClient.getAccessToken(), userId).getResult();
+        log.info("dataList, {}", dataList);
+
+        ddClient_schedule.bookMeetingRoom(dddClient.getAccessToken(), userId, "K1ZoWFNuQXo0RlRubzQ0OVJycXEwQT09", Arrays.asList("ab0d05412c9e11a144d5c49e58adef08bfa2770908bf1ec7"));
+
+    }
 }

+ 2 - 1
src/main/resources/application-dev.yml

@@ -16,7 +16,8 @@ logging:
   level:
     com.malk.*: debug
   file:
-    path: /home/server/pro/log/
+    #path: /home/server/pro/log/
+    path: /Users/malk/server/_Tool/var/mjava/log
 
 mybatis-plus:
   configuration:

+ 1 - 1
src/main/resources/logback-spring.xml

@@ -1,6 +1,6 @@
 <?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/"/>
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="logging.file.path"/>
     <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
 
     <!-- 定义控制台输出 -->

+ 76 - 0
src/test/java/com/malk/pro/GyYdTest.java

@@ -0,0 +1,76 @@
+package com.malk.pro;
+
+import cn.hutool.core.io.FileUtil;
+import com.alibaba.fastjson.JSON;
+import com.malk.core.McProject;
+import com.malk.pro.guyuan.service.tencent.IvYdService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Attendance;
+import com.malk.service.dingtalk.DDClient_Contacts;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/***
+ * 谷元宜搭
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class GyYdTest {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Test
+    public void test() {
+        McProject.addYida("2001",new String[]{"APP_FKRK7Y94DPI1S9DV1605","FN7666A1ZD0STZZ75W4CKD1GD07X3PUW2FBRKT"});
+        MDC.put("MDC_KEY_PID","2001");
+
+        List<String> ids= FileUtil.readUtf8Lines("/home/ids.txt");
+        for(String id:ids){
+            System.out.println(id);
+            String[] values=id.split("###");
+            String tid=values[1];
+            String title=values[0];
+            List<String> formInstanceIds =getid(values[2]);
+
+            Map update=new HashMap();
+            update.put("selectField_liihyrt6","已使用");
+            update.put("associationFormField_lma7wtuj", Arrays.asList(UtilMap.map("appType, formType, instanceId, formUuid, title", new Object[]{"APP_FKRK7Y94DPI1S9DV1605", "process",
+                    tid, "FORM-J1A66U817Q6CURQE680BDAFCSK3U2JYI5ONJL1", title})));
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceIdList(formInstanceIds)
+                    .updateFormDataJson(JSON.toJSONString(update))
+                    .formUuid("FORM-W2A66Z910O9B3LP9C6IYUDPRVWY62DO0YHIILY")
+                    .build(), YDConf.FORM_OPERATION.multi_update);
+        }
+    }
+
+    private List<String> getid(String val){
+        String regex = "\\[(.*?)\\]";
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(val);
+        List<String> result=new ArrayList<>();
+        while (matcher.find()) {
+            result.add(matcher.group(1)); // 获取 [] 中的内容
+        }
+        return result;
+    }
+
+
+
+}

+ 149 - 0
src/test/java/com/malk/pro/YyYdTest.java

@@ -0,0 +1,149 @@
+package com.malk.pro;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.NumberUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.core.McProject;
+import com.malk.pro.guyuan.service.tencent.IvYdService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Attendance;
+import com.malk.service.dingtalk.DDClient_Contacts;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/***
+ * 逸耀宜搭
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class YyYdTest {
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDService ydService;
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Attendance ddClientAttendance;
+    @Autowired
+    private DDClient_Contacts ddClientContacts;
+
+    @Test
+    public void test() {
+        McProject.addYida("2001",new String[]{"APP_FKRK7Y94DPI1S9DV1605","FN7666A1ZD0STZZ75W4CKD1GD07X3PUW2FBRKT"});
+        MDC.put("MDC_KEY_PID","2001");
+
+        List<String> ids= FileUtil.readUtf8Lines("/home/ids.txt");
+        for(String id:ids){
+            System.out.println(id);
+            String[] values=id.split("###");
+            String uuid=values[0];
+            List<String> formInstanceIds =getid(values[1]);
+
+            // 宜搭批量更新
+            Map update = UtilMap.map("selectField_liihyrt6", "已使用");
+            update.put("radioField_liw7rb2q", "否"); // 提交后, 更新是否退回标识为否
+            // prd 9.10 更新报销单, 关联到发票:: ppExt 宜搭服务注册, 提交规则系统默认字段 [详见 YDService]
+            operateData2(UtilMap.map("aUuid, aCompId, aFormUuid",uuid,"associationFormField_lma7wtuj","FORM-J1A66U817Q6CURQE680BDAFCSK3U2JYI5ONJL1"), update, YDParam.builder()
+                    .formUuid("FORM-W2A66Z910O9B3LP9C6IYUDPRVWY62DO0YHIILY")
+                    .formInstanceIdList(formInstanceIds)
+                    .updateFormDataJson(JSON.toJSONString(update))
+                    .appType("APP_FKRK7Y94DPI1S9DV1605")
+                    .systemToken("FN7666A1ZD0STZZ75W4CKD1GD07X3PUW2FBRKT")
+                    .build(), YDConf.FORM_OPERATION.multi_update);
+        }
+    }
+
+    private List<String> getid(String val){
+        String regex = "\\[(.*?)\\]";
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(val);
+        List<String> result=new ArrayList<>();
+        while (matcher.find()) {
+            result.add(matcher.group(1)); // 获取 [] 中的内容
+        }
+        return result;
+    }
+
+    public Object operateData2(Map data, Map update, YDParam ydParam, YDConf.FORM_OPERATION type) {
+        if (data.containsKey("aUuid")) {
+            List<Map> process = (List)this.ydClient.queryData(YDParam.builder().formUuid(data.get("aFormUuid").toString()).searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lmewsobs", new Object[]{data.get("aUuid")}))).build(), YDConf.FORM_QUERY.retrieve_search_form).getData();
+            update.put(data.get("aCompId"), Arrays.asList(UtilMap.map("appType, formType, instanceId, formUuid, title", new Object[]{"APP_FKRK7Y94DPI1S9DV1605", "process", ((Map)process.get(0)).get("formInstanceId"), data.get("aFormUuid"), ((Map)process.get(0)).get("title")})));
+            ydParam.setUpdateFormDataJson(JSON.toJSONString(update));
+        }
+        return this.ydClient.operateData(ydParam, type);
+    }
+
+    @Autowired
+    private IvYdService ivYdService;
+
+    @Test
+    public void test1() {
+        String compId = "selectField_liihyrt6";
+        String status = "已使用";
+
+        // 读取关联表单
+        String formUUid="";
+        List<String> formInstanceIds = new ArrayList<>();
+//        if(compId.equals("selectField_lzs0bpk2")){
+//            // 采购表单
+//            formUUid="FORM-B5A7B20013AE4CD09AD87FAB9A3E145FS3P6";
+//            List<Map> associationData = (List<Map>) JSON.parse(UtilMap.getString(data, "multiAssociation"));
+//            formInstanceIds.addAll(associationData.stream().map(form -> UtilMap.getString(form, "instanceId")).collect(Collectors.toList()));
+//        }else{
+//            formUUid="FORM-442A54C312A64FCA9C1D19C7C1AD7314MXAJ";
+//            List<String> associationForm = (List<String>) JSON.parse(UtilMap.getString(data, "multiAssociation"));
+//            for (String record : associationForm) {
+//                // 解析关联表单
+//                List<Map> associationData = (List<Map>) JSON.parse(record);
+//                formInstanceIds.addAll(associationData.stream().map(form -> UtilMap.getString(form, "instanceId")).collect(Collectors.toList()));
+//            }
+//        }
+        // 宜搭批量更新
+        Map update = UtilMap.map(compId, status);
+        if (compId.equals("selectField_liihyrt6")) {
+            update.put("radioField_liw7rb2q", "否"); // 提交后, 更新是否退回标识为否
+        }
+
+        // prd 9.10 更新报销单, 关联到发票:: ppExt 宜搭服务注册, 提交规则系统默认字段 [详见 YDService]
+//        ydService.operateData3(data, update, YDParam.builder().systemToken(SYSTEM_TOKEN).appType(APP_TYPE)
+//                .formUuid(formUUid)
+//                .formInstanceIdList(formInstanceIds)
+//                .updateFormDataJson(JSON.toJSONString(update))
+//                .build(), YDConf.FORM_OPERATION.multi_update);
+        ivYdService.operateData(UtilMap.map("aFormUuid, aUuid","FORM-C3B4E5A1902044FF9FD030B98CiABB0ED4N7, MHC66LD1DYNWSVXWD0ZYF7AWSNGF33L8TJECMP6"), update, YDParam.builder().systemToken(SYSTEM_TOKEN).appType(APP_TYPE)
+                .formUuid(formUUid)
+                .formInstanceIdList(formInstanceIds)
+                .updateFormDataJson(JSON.toJSONString(update))
+                .build(), YDConf.FORM_OPERATION.multi_update);
+        try {
+            Thread.sleep(30000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private final static String APP_TYPE="APP_Y5KGBSIKJGG6ZQBTNKSZ";
+    private final static String SYSTEM_TOKEN="GFA66U91QQDMO11Y7N7YC7MA6U0M236VMM2YLBO11";
+
+
+}