package com.malk.huagao.service.impl; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.malk.huagao.entity.*; import com.malk.huagao.mapper.KdYdDeliveryDetailMapper; import com.malk.huagao.mapper.KdYdDeliveryMapper; import com.malk.huagao.mapper.KdYdOrderDetailMapper; import com.malk.huagao.mapper.KdYdOrderMapper; import com.malk.huagao.service.IKdYdDeliveryService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.malk.server.aliwork.YDConf; import com.malk.server.aliwork.YDParam; import com.malk.server.dingtalk.DDR_New; import com.malk.service.aliwork.YDClient; import com.malk.utils.UtilMap; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringEscapeUtils; import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; /** *

* 服务实现类 *

* * @author LQY * @since 2025-10-15 */ @Service @Slf4j public class KdYdDeliveryServiceImpl extends ServiceImpl implements IKdYdDeliveryService { @Autowired private YDClient ydClient; @Autowired private KdYdDeliveryMapper kdYdDeliveryMapper; @Autowired private KdYdDeliveryDetailMapper kdYdDeliveryDetailMapper; @Value(value = "${kd.host}") private String kdHost; @Override public Map insertDelivery(Map map) { Map result = new HashMap<>(); try { MDC.put("MDC_KEY_PID", "1003"); String formInstId = UtilMap.getString(map, "formInstId"); String action = UtilMap.getString(map, "type"); // 处理特殊操作类型 if ("del".equals(action)) { String bm = UtilMap.getString(map, "bm"); Map headers = new HashMap<>(); headers.put("Content-Type", "application/x-www-form-urlencoded"); Map formParams = new HashMap<>(); Map djbh = new HashMap<>(); djbh.put("djbh", bm); result.put("data", djbh); String jsonStr = JSON.toJSONString(result); formParams.put("jsons", jsonStr); HttpResponse response = HttpRequest.post(kdHost+"/xk/dyzn/WsBasedyzn.asmx/hgdjydtbdeletefhtzd") .headerMap(headers, true) .form(formParams) .timeout(30000) // 30秒超时 .execute(); String responseBody = response.body(); System.out.println("responseBody===="+responseBody); // 返回删除操作的格式 result.put("table", "KD_YD_DELIVERY"); result.put("action", "del"); result.put("data", new HashMap() {{ put("bm", bm); // 删除的主键或标识 put("msg", "删除成功"); }}); return result; } // 查询表单数据 DDR_New ddrNew = ydClient.queryData(YDParam.builder() .formInstId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id); Map formData = ddrNew.getFormData(); // 提取主表字段 String djlx = UtilMap.getString(formData, "selectField_mg3fuqvg"); String orderId = UtilMap.getString(formData, "textField_mf6a0h6f"); LocalDateTime rq = parseTimestamp(UtilMap.getString(formData, "dateField_krbgloam")); String kh = UtilMap.getString(formData, "textField_mejnamf2"); String jsbb = UtilMap.getString(formData, "selectField_mg3fuqvn"); String djbh = UtilMap.getString(formData, "serialNumberField_mheazm7w"); String xsbm = UtilMap.getString(formData, "textField_krnn5bmr"); String lllx = UtilMap.getString(formData, "selectField_mejowmnc"); String jjr = UtilMap.getString(formData, "textField_mf6a0h5f"); String jjrdh = UtilMap.getString(formData, "textField_mf6a0h5g"); String jjdz = UtilMap.getString(formData, "textareaField_mf6a0h5h"); String xslx = UtilMap.getString(formData, "selectField_mgrn6p2d"); String bzfs = UtilMap.getString(formData, "selectField_mf6a0h5y"); String bz = UtilMap.getString(formData, "textareaField_mejnamfb"); // LocalDateTime hhsj = parseTimestamp(UtilMap.getString(formData, "dateField_mf6a0h67")); LocalDateTime hhsj = Optional.ofNullable( parseTimestamp(UtilMap.getString(formData, "dateField_mf6a0h67")) ) .orElseGet(() -> LocalDateTime.now() .withHour(17) .withMinute(0) .withSecond(0) .withNano(0)); String ysfs = UtilMap.getString(formData, "selectField_mf6a0h5z"); String hdfs = UtilMap.getString(formData, "selectField_mf6a0h60"); String kdgs = UtilMap.getString(formData, "selectField_mf6a0h61"); String fkfs = UtilMap.getString(formData, "selectField_mf6a0h66"); // 处理明细数据 List> deliveryList = new ArrayList<>(); List tableField = (List) formData.get("tableField_mejnamfd"); if (tableField != null && !tableField.isEmpty()) { int detailId = 1; for (Map item : tableField) { Map table1Map = new HashMap<>(); // int detailId = parseInt(safeGetString(item, "numberField_mjzg06br"), 0); String wlbm = safeGetString(item, "textField_mejnamff"); String wlmc = safeGetString(item, "textField_mejnamfg"); String ggxh = safeGetString(item, "textField_mejnamfh"); String xsdw = safeGetString(item, "textField_mejnamfk"); int jjsl = parseInt(safeGetString(item, "numberField_mf6a0h6r"), 0); // int count = parseInt(safeGetString(item, "numberField_mjzg06br"), 0); String ssxl = safeGetString(item, "textField_mejnamfx"); String sfzp = safeGetString(item, "radioField_mf6a0h6h"); String ckck = safeGetString(item, "textField_mf6a0h6l"); String ckcw = safeGetString(item, "textField_mf6a0h6k"); String sjr = safeGetString(item, "textField_mejnamf6"); String sjdh = safeGetString(item, "textField_mejnamf7"); String sjdz = safeGetString(item, "textareaField_mf6a0h5e"); String zbq = safeGetString(item, "numberField_mf6a0h6v"); String kddh = safeGetString(item, "textField_mf6a0h6w"); String mdh = safeGetString(item, "textField_mf6a0h6y"); LocalDateTime yhrq = parseTimestamp(safeGetString(item, "dateField_mejnamfo")); table1Map.put("wlbm", wlbm); table1Map.put("detailId", detailId); table1Map.put("wlmc", wlmc); table1Map.put("ggxh", ggxh); table1Map.put("xsdw", xsdw); table1Map.put("jjsl", jjsl); // table1Map.put("count", count); table1Map.put("ssxl", ssxl); table1Map.put("yhrq", yhrq); table1Map.put("sfzp", sfzp); table1Map.put("ckck", ckck); table1Map.put("ckcw", ckcw); table1Map.put("sjr", sjr); table1Map.put("sjdh", sjdh); table1Map.put("sjdz", sjdz); table1Map.put("zbq", zbq); table1Map.put("kddh", kddh); table1Map.put("mdh", mdh); deliveryList.add(table1Map); detailId++; } } // 构建返回数据 Map deliveryData = new HashMap<>(); deliveryData.put("djlx", djlx); deliveryData.put("orderId", orderId); deliveryData.put("rq", rq); deliveryData.put("kh", kh); deliveryData.put("jsbb", jsbb); deliveryData.put("djbh", djbh); deliveryData.put("xsbm", xsbm); deliveryData.put("lllx", lllx); deliveryData.put("jjr", jjr); deliveryData.put("jjrdh", jjrdh); deliveryData.put("jjdz", jjdz); deliveryData.put("xslx", xslx); deliveryData.put("bzfs", bzfs); deliveryData.put("bz", bz); deliveryData.put("hhsj", hhsj); deliveryData.put("ysfs", ysfs); deliveryData.put("hdfs", hdfs); deliveryData.put("kdgs", kdgs); deliveryData.put("fkfs", fkfs); deliveryData.put("DeliveryList", deliveryList); Map headers = new HashMap<>(); headers.put("Content-Type", "application/x-www-form-urlencoded"); result.put("data", deliveryData); // 将result转换为JSON字符串 String jsonStr = JSON.toJSONString(result); // 构建form参数 Map formParams = new HashMap<>(); formParams.put("jsons", jsonStr); log.info("请求参数:" + formParams); // 发送请求 HttpResponse response = null; if ("add".equals(action)) { response = HttpRequest.post(kdHost+"/xk/dyzn/WsBasedyzn.asmx/hgdjydtbcreatefhtzd") .headerMap(headers, true) .form(formParams) .timeout(30000) // 30秒超时 .execute(); } else { response = HttpRequest.post(kdHost+"/xk/dyzn/WsBasedyzn.asmx/") .headerMap(headers, true) .form(formParams) .timeout(30000) // 30秒超时 .execute(); } String responseBody = response.body(); log.info("返回结果responseBody:" + responseBody); try { String msg = JSON.parseArray(responseBody) .getJSONObject(0) .getString("msg"); String code = JSON.parseArray(responseBody) .getJSONObject(0) .getString("code"); ydClient.operateData( YDParam.builder() .formInstanceId(formInstId) .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_ml08nk3y, textareaField_mkz9u4p9", code, msg))) .useLatestVersion(true).build(), YDConf.FORM_OPERATION.update); } catch (Exception e) { System.out.println("解析JSON失败: " + e.getMessage()); } } catch (Exception e) { log.error("发货通知单同步异常", e); result.put("table", "KD_YD_DELIVERY"); result.put("action", "error"); result.put("data", new HashMap() {{ put("errorMsg", "操作失败:" + e.getMessage()); }}); } return result; } @Override public void CfkdYdDelivery(Map map) { MDC.put("MDC_KEY_PID", "1003"); String formInstId = UtilMap.getString(map, "formInstId"); // 查询原表单数据 DDR_New ddrNew = ydClient.queryData( YDParam.builder().formInstId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id ); Map formData1 = ddrNew.getFormData(); // 提取需要特殊处理的主表字段 String glbdjson = String.valueOf(formData1.get("associationFormField_mejmml36_id")); String sqr = String.valueOf(formData1.get("employeeField_krbgloal_id")); String xsy = String.valueOf(formData1.get("employeeField_mejnamf3_id")); String fhtzd = String.valueOf(formData1.get("serialNumberField_mheazm7w")); // 解析关联字段 JSON List sealjsonlist = parseJsonList(glbdjson); // 获取原表单的子表数据 List tableField = UtilMap.getList(formData1, "tableField_mejnamfd"); if (tableField == null || tableField.isEmpty()) { return; } // 按 dz 分组 Map> groupedByDz = new LinkedHashMap<>(); for (Map item : tableField) { String dz = UtilMap.getString(item, "textareaField_mf6a0h5e"); if (dz == null) dz = ""; groupedByDz.computeIfAbsent(dz, k -> new ArrayList<>()).add(item); } // 对每个 dz 分组,创建一条新表单 for (Map.Entry> entry : groupedByDz.entrySet()) { String dz = entry.getKey(); List subTableRows = entry.getValue(); // 构建新子表数据 List newSubTable = new ArrayList<>(); for (Map row : subTableRows) { newSubTable.add(new HashMap<>(row)); } // 构建新表单的formData HashMap updateMap = new HashMap<>(); // 1. 首先复制原表单的所有主表数据 for (Object obj : formData1.entrySet()) { Map.Entry formEntry = (Map.Entry) obj; String key = formEntry.getKey(); Object value = formEntry.getValue(); // 跳过不需要特殊处理的子表字段 if ("tableField_mejnamfd".equals(key)) { continue; } // 跳过需要特殊处理的主表关联字段 if (key.equals("associationFormField_mejmml36_id") || key.equals("associationFormField_mfavc4ve_id") || key.equals("associationFormField_mk0gzflu_id") || key.equals("employeeField_krbgloal_id") || key.equals("employeeField_mejnamf3_id") || key.equals("serialNumberField_mheazm7w")) { continue; } // 复制其他字段 updateMap.put(key, value); } // 2. 添加需要特殊处理的主表字段 updateMap.put("associationFormField_mejmml36", sealjsonlist); // updateMap.put("associationFormField_mfavc4ve", khjsonlist); updateMap.put("associationFormField_mk0gzflu", Arrays.asList(getfhdAss(fhtzd, formInstId))); updateMap.put("employeeField_krbgloal", sqr); updateMap.put("employeeField_mejnamf3", xsy); updateMap.put("textField_mjzk47so", fhtzd); // 3. 添加处理后的子表数据 updateMap.put("tableField_mejnamfd", newSubTable); String sqrid = sqr.substring(2, sqr.length() - 2); System.out.println("sqrid==" + sqrid); // 创建新表单实例 try { ydClient.operateData( YDParam.builder() .formUuid("FORM-FAE2575E112644ED914CAB4FEC9309F32AVR") .formDataJson(JSON.toJSONString(updateMap)) .userId(sqrid) .build(), YDConf.FORM_OPERATION.create ); } catch (Exception e) { log.error("创建新单据失败,dz=" + dz, e); } } } // 工具方法:安全解析 JSON 列表(处理宜搭返回的带引号字符串) private List parseJsonList(String jsonStr) { if (jsonStr == null || "null".equals(jsonStr) || jsonStr.isEmpty()) { return Collections.emptyList(); } try { // 宜搭有时返回的是 "\"[{...}]\"",需先 unescape String clean = StringEscapeUtils.unescapeJava(jsonStr); // 如果首尾是双引号,去掉 if (clean.startsWith("\"") && clean.endsWith("\"")) { clean = clean.substring(1, clean.length() - 1); } return (List) JSONArray.parse(clean); } catch (Exception e) { return Collections.emptyList(); } } private Object getfhdAss(String title, String id) { return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_VQDMMWS6OR1VHL8VMFD3", "FORM-A7F03ACEE01D4F609550C86BF7FE87D35M6I", "receipt", id, title, ""); } private static LocalDateTime parseTimestamp(String timestampStr) { if (timestampStr == null || timestampStr.trim().isEmpty()) return null; try { long timestamp = Long.parseLong(timestampStr.trim()); return LocalDateTime.ofInstant( Instant.ofEpochMilli(timestamp), ZoneId.systemDefault() ); } catch (NumberFormatException e) { return null; } } private static int parseInt(String str, int defaultValue) { if (str == null || str.trim().isEmpty()) { return defaultValue; } try { return Integer.parseInt(str.trim()); } catch (NumberFormatException e) { return defaultValue; } } private String safeGetString(Map formData, String key) { Object val = formData.get(key); return val == null ? "" : String.valueOf(val); } public static BigDecimal toBigDecimal(String str) { if (str == null || str.trim().isEmpty()) { return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); } try { return new BigDecimal(str.trim()) .setScale(2, RoundingMode.HALF_UP); } catch (NumberFormatException e) { // 返回默认值而不是抛出异常,避免程序中断 return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); } } /** * 重载方法,支持Number类型输入 */ public static BigDecimal toBigDecimal(Number number) { if (number == null) { return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); } return new BigDecimal(number.toString()) .setScale(2, RoundingMode.HALF_UP); } }