From d375b548b04002a93cff85ba342307a8fcd61b7b Mon Sep 17 00:00:00 2001 From: huangyujie <27665451@qq.com> Date: Wed, 25 Mar 2026 17:09:58 +0800 Subject: [PATCH] =?UTF-8?q?chore(pdd):=20cat.rule.get=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=EF=BC=88=E6=91=98=E8=A6=81=20catRuleSummary?= =?UTF-8?q?=E3=80=81=E5=8A=A0=E9=95=BF=20bodySnippet=E3=80=81DEBUG=20?= =?UTF-8?q?=E5=85=A8=E9=87=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- .../external/pdd/PddOpenApiSupport.java | 73 +++++++++++++++++++ .../service/external/pdd/PddPopClient.java | 18 +++++ 2 files changed, 91 insertions(+) diff --git a/service/src/main/java/cn/qihangerp/service/external/pdd/PddOpenApiSupport.java b/service/src/main/java/cn/qihangerp/service/external/pdd/PddOpenApiSupport.java index 22b66c95..6d37b60b 100644 --- a/service/src/main/java/cn/qihangerp/service/external/pdd/PddOpenApiSupport.java +++ b/service/src/main/java/cn/qihangerp/service/external/pdd/PddOpenApiSupport.java @@ -573,6 +573,79 @@ public final class PddOpenApiSupport { } } + /** {@code pdd.goods.cat.rule.get} 成功体在日志中的加长片段上限(字符) */ + public static final int CAT_RULE_GET_LOG_BODY_SNIPPET_MAX = 12000; + + /** + * 将 {@code pdd.goods.cat.rule.get} 响应压缩为一行摘要,便于检索与对照发品逻辑(不含完整 JSON)。 + */ + public static String summarizeCatRuleGetForLog(String catRuleBody) { + if (!StringUtils.hasText(catRuleBody)) { + return "(empty)"; + } + if (isError(catRuleBody)) { + return "ERROR " + formatError(catRuleBody); + } + try { + JSONObject root = JSON.parseObject(catRuleBody); + if (root == null) { + return "(parse root null)"; + } + JSONObject inner = unwrapCatRulePayload(root); + if (inner == null) { + return "(no cat_rule_get_response/goods_cat_rule_get_response)"; + } + StringBuilder sb = new StringBuilder(256); + JSONObject gpr = inner.getJSONObject("goods_properties_rule"); + if (gpr != null) { + sb.append("input_max_spec_num=").append(gpr.getIntValue("input_max_spec_num")); + JSONArray props = gpr.getJSONArray("properties"); + int n = props == null ? 0 : props.size(); + sb.append(" goodsPropTotal=").append(n); + int reqSku = 0; + int reqGoods = 0; + if (props != null) { + for (int i = 0; i < props.size(); i++) { + Object el = props.get(i); + if (!(el instanceof JSONObject p)) { + continue; + } + if (!isTruthyRequired(p.get("required"))) { + continue; + } + boolean sku = p.getBooleanValue("is_sku") || p.getBooleanValue("isSku"); + if (sku) { + reqSku++; + } else { + reqGoods++; + } + } + } + sb.append(" requiredNonSku=").append(reqGoods).append(" requiredSku=").append(reqSku); + } else { + sb.append("goods_properties_rule=(absent)"); + } + List reqGoodsRows = listRequiredGoodsLevelPropertyRules(catRuleBody); + if (!reqGoodsRows.isEmpty()) { + sb.append(" requiredGoodsProps=["); + for (int i = 0; i < reqGoodsRows.size(); i++) { + if (i > 0) { + sb.append(';'); + } + CatGoodsPropertyRuleRow r = reqGoodsRows.get(i); + sb.append(r.getRefPid()).append(':'); + sb.append(r.getName() == null ? "" : r.getName()); + } + sb.append(']'); + } + Long saleParent = findFirstSaleParentSpecId(catRuleBody); + sb.append(" saleParentSpecId=").append(saleParent != null && saleParent > 0 ? saleParent : "none"); + return sb.toString(); + } catch (Exception e) { + return "(summarizeFail " + e.getClass().getSimpleName() + ": " + e.getMessage() + ")"; + } + } + private static boolean isTruthyRequired(Object v) { if (v == null) { return false; diff --git a/service/src/main/java/cn/qihangerp/service/external/pdd/PddPopClient.java b/service/src/main/java/cn/qihangerp/service/external/pdd/PddPopClient.java index b34c46b7..05508c1e 100644 --- a/service/src/main/java/cn/qihangerp/service/external/pdd/PddPopClient.java +++ b/service/src/main/java/cn/qihangerp/service/external/pdd/PddPopClient.java @@ -133,6 +133,24 @@ public class PddPopClient { String raw = resp.body(); boolean httpOk = httpStatus >= 200 && httpStatus < 300; boolean popBizError = PddOpenApiSupport.isError(raw); + if ("pdd.goods.cat.rule.get".equals(type)) { + String catSummary = PddOpenApiSupport.summarizeCatRuleGetForLog(raw); + String bodyLong = PddOpenApiSupport.snippet(raw, PddOpenApiSupport.CAT_RULE_GET_LOG_BODY_SNIPPET_MAX); + if (log.isDebugEnabled()) { + log.debug("PDD_POP api={} host={} clientId={} httpStatus={} durationMs={} catRuleSummary={} fullBody={}", + type, host, clientMasked, httpStatus, durationMs, catSummary, raw); + } + if (!httpOk || popBizError) { + String errSummary = popBizError ? PddOpenApiSupport.formatError(raw) : ""; + log.warn("PDD_POP api={} host={} clientId={} httpStatus={} durationMs={} popBizError={} errSummary={} paramPayloadSnippet={} catRuleSummary={} bodySnippet={}", + type, host, clientMasked, httpStatus, durationMs, popBizError, errSummary, + paramLogSnippet != null ? paramLogSnippet : "", catSummary, bodyLong); + } else { + log.info("PDD_POP api={} host={} clientId={} httpStatus={} durationMs={} catRuleSummary={} bodySnippet={}", + type, host, clientMasked, httpStatus, durationMs, catSummary, bodyLong); + } + return raw; + } String snippet = PddOpenApiSupport.snippet(raw, 600); if (!httpOk || popBizError) { String errSummary = popBizError ? PddOpenApiSupport.formatError(raw) : "";