task(00c8cc0d-f2b4-4783-b647-0a1f62f0f650): Add E2E test report & evidence (contract 15 endpoints, BLE 12/12, UI static walkthrough)

This commit is contained in:
阿猫
2026-09-04 03:25:13 +08:00
parent b8e4c24fd2
commit d6d6bae71d
46 changed files with 3964 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,40 @@
# 契约层负向探测证据表(自动生成于 2026-09-04 03:11:54
- 服务器https://jcd.stec.p-q.co接口管理规范 V4.5 测试环境)
- 用例组 A缺三要素头SecretKey/SystemCode/Token 全缺);用例组 B带 docs/SystemCode_secertkey.txt 密钥、缺 Token。
- 判定:存在性=HTTP≠404/000双层结构=HTTP 500 且 ExceptionMessage 内嵌信封 JSON信封解包=code 为字符串且 ∈ {200,500,429,403}。
- 通过A 组 14/15B 组 11/15。
- 原始响应存档:`docs/e2e-evidence/responses/`(密钥已脱敏)。
| 章节 | 端点 | 用例 | HTTP | 存在 | 双层结构 | 信封code | code为字符串 | 信封msg | 备注 |
|---|---|---|---|---|---|---|---|---|---|
| 2.2.1 | 账号密码登录 | A | 500 | 存在 | 成立 | `500` | 是 | 认证未通过请检查SystemCode与SecretKey的值是否正确 | 双层结构成立 |
| 2.2.2 | 发送验证码 | A | 500 | 存在 | 成立 | `500` | 是 | 认证未通过请检查SystemCode与SecretKey的值是否正确 | 双层结构成立 |
| 2.2.3 | 手机验证码登录 | A | 500 | 存在 | 成立 | `500` | 是 | 认证未通过请检查SystemCode与SecretKey的值是否正确 | 双层结构成立 |
| 2.3.1 | 修改登录密码 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.4 | 获取当前用户信息 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.5.1.1 | 获取当前用户项目列表 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.6 | 获取APP端任务列表 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.7 | 获取项目监测计划任务列表 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.9 | 获取测组包含的监测点列表 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.10 | 获取项目监测计划统计表 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.11 | 获取指定监测计划的测组统计表 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.12 | 监测点统计表 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.13 | 数据解析(原始文件上传) | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.14 | 获取基准点 | A | 500 | 存在 | 不成立 | — | 否 | | 响应非可解析双层结构(原始体见存档) |
| 2.15 | 获取工点数据 | A | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.2.1 | 账号密码登录 | B | 200 | 存在 | 不成立 | `500` | 是 | 用户名或密码错误! | 裸业务信封(未走 ASP.NET 异常包装) |
| 2.2.2 | 发送验证码 | B | 200 | 存在 | 不成立 | `500` | 是 | 短信验证码发送失败,失败信息System.AggregateException | 裸业务信封(未走 ASP.NET 异常包装) |
| 2.2.3 | 手机验证码登录 | B | 200 | 存在 | 不成立 | `500` | 是 | 此号码的用户不存在,请确认手机号是否和系统中维护的一致 | 裸业务信封(未走 ASP.NET 异常包装) |
| 2.3.1 | 修改登录密码 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.4 | 获取当前用户信息 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.5.1.1 | 获取当前用户项目列表 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.6 | 获取APP端任务列表 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.7 | 获取项目监测计划任务列表 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.9 | 获取测组包含的监测点列表 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.10 | 获取项目监测计划统计表 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.11 | 获取指定监测计划的测组统计表 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.12 | 监测点统计表 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.13 | 数据解析(原始文件上传) | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |
| 2.14 | 获取基准点 | B | 500 | 存在 | 不成立 | — | 否 | | 响应非可解析双层结构(原始体见存档) |
| 2.15 | 获取工点数据 | B | 500 | 存在 | 成立 | `500` | 是 | 无效的token。 | 双层结构成立 |

View File

@@ -0,0 +1,344 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""E2E 契约层负向探测脚本S-E2E 任务 00c8cc0d
对接口管理规范 V4.5 的 15 个在用端点发起真实请求,两组负向用例:
A 组缺鉴权三要素头SecretKey/SystemCode/Token 全缺);
B 组:带真实 SecretKey/SystemCode运行时读 docs/SystemCode_secertkey.txt不落明文、缺 Token。
判定口径(任务书 + core/network/ApiCaller.kt 实证契约):
存在性 HTTP 状态非 404 且非连接错误000
双层结构 HTTP 500 且 body 为 JSON、含字符串字段 ExceptionMessage
其值可再解析为含 code 字段的信封 JSONASP.NET 异常包装内嵌业务信封);
信封解包模拟:内嵌信封 code 必为字符串且取值 ∈ {"200","500","429","403"}(对齐 ApiEnvelope
节流:请求间隔 ≥1.5s;不主动触发 403连续报错锁定429 若出现如实记录。
用法python3 docs/e2e-evidence/contract_probe.py
产出docs/e2e-evidence/responses/{A|B}_{章节}.txt 原始响应
docs/e2e-evidence/contract_results.json 结构化结果
docs/e2e-evidence/contract_evidence.md 证据汇总表
"""
import json
import time
import uuid
import urllib.request
import urllib.error
import ssl
from pathlib import Path
BASE_URL = "https://jcd.stec.p-q.co"
WORKSPACE = Path(__file__).resolve().parents[2]
EVIDENCE_DIR = WORKSPACE / "docs" / "e2e-evidence"
RESPONSE_DIR = EVIDENCE_DIR / "responses"
KEY_FILE = WORKSPACE / "docs" / "SystemCode_secertkey.txt"
REQUEST_INTERVAL_SEC = 1.5
TIMEOUT_SEC = 25
VALID_ENVELOPE_CODES = {"200", "500", "429", "403"}
# 登录/验证码类端点按接口文档 1.2.3 天然不携带 Token。
# 探测用参数均为无效占位10000000000 非法号段 / e2e-probe-* 假 ID / e2e 弱凭据),
# 不触达任何真实业务数据,也不触发真实短信下发。
ENDPOINTS = [
{
"sec": "2.2.1", "name": "账号密码登录", "method": "POST",
"path": "/OutWebApi/api/LoginByAccount",
"body_json": {"LoginName": "e2e_probe_placeholder", "Password": "E2eProbe#2026"},
},
{
"sec": "2.2.2", "name": "发送验证码", "method": "GET",
"path": "/OutWebApi/api/LoginSecurityCode",
"query": {"MobilePhone": "10000000000"},
},
{
"sec": "2.2.3", "name": "手机验证码登录", "method": "POST",
"path": "/OutWebApi/api/LoginByMobile",
"body_json": {"Mobile": "10000000000", "VerificationCode": "000000"},
},
{
"sec": "2.3.1", "name": "修改登录密码", "method": "POST",
"path": "/OutWebApi/api/ModifyPassword",
"body_json": {"Password": "E2eProbe#2026", "ConfirmAnswer": "e2e-probe"},
},
{"sec": "2.4", "name": "获取当前用户信息", "method": "GET", "path": "/OutWebApi/api/GetUserInfo"},
{"sec": "2.5.1.1", "name": "获取当前用户项目列表", "method": "GET", "path": "/OutWebApi/api/GetProjectList"},
{
"sec": "2.6", "name": "获取APP端任务列表", "method": "GET",
"path": "/OutWebApi/api/GetUserPlanGroup",
"query": {"PlanDate": "2026-09-04"},
},
{"sec": "2.7", "name": "获取项目监测计划任务列表", "method": "GET", "path": "/OutWebApi/api/GetPlanGroup"},
{
"sec": "2.9", "name": "获取测组包含的监测点列表", "method": "GET",
"path": "/OutWebApi/api/GetPointBySurveyGroup",
"query": {"GroupID": "e2e-probe-group"},
},
{
"sec": "2.10", "name": "获取项目监测计划统计表", "method": "GET",
"path": "/OutWebApi/api/GetPlanStatistical",
"query": {"ProjectID": "e2e-probe-project"},
},
{
"sec": "2.11", "name": "获取指定监测计划的测组统计表", "method": "GET",
"path": "/OutWebApi/api/GetSurveyGroupList",
"query": {"PlanID": "e2e-probe-plan"},
},
{
"sec": "2.12", "name": "监测点统计表", "method": "GET",
"path": "/OutWebApi/api/GetPointStatistics",
"query": {"PlanID": "e2e-probe-plan", "GroupID": "e2e-probe-group"},
},
{
"sec": "2.13", "name": "数据解析(原始文件上传)", "method": "POST_MULTIPART",
"path": "/OutWebApi/api/AnalysisMonitorData",
"multipart_fields": {
"ProjectID": "e2e-probe-project",
"WorkPointID": "e2e-probe-workpoint",
"SurveyGroupID": "e2e-probe-group",
"PlanID": "e2e-probe-plan",
"MonitorDate": "2026-09-04",
"WorkInfo": "e2e-probe",
"Equipment": "e2e-probe",
"Weather": "",
"PointsData": json.dumps(
[{"Point": "e2e-probe-point", "PointName": "e2e-probe-point",
"CurrentValue": "0", "CurrentChangeValue": "0", "IsInitValue": "false"}],
ensure_ascii=False),
},
"multipart_file": ("E2eProbe.txt", "e2e probe placeholder file\n"),
},
{
"sec": "2.14", "name": "获取基准点", "method": "GET",
"path": "/OutWebApi/api/ControlPoint",
"query": {"ProjectID": "e2e-probe-project"},
},
{"sec": "2.15", "name": "获取工点数据", "method": "GET", "path": "/OutWebApi/api/GetWorkPoint"},
]
# 与 core/network/AuthInterceptor 注入头保持同名。
HEADER_SECRET_KEY = "SecretKey"
HEADER_SYSTEM_CODE = "SystemCode"
HEADER_TOKEN = "Token"
def load_keys():
"""解析 docs/SystemCode_secertkey.txt格式`SystemCode:Mobile` / `SecretKey:<hex>`)。"""
keys = {}
for line in KEY_FILE.read_text(encoding="utf-8").splitlines():
line = line.strip()
if ":" not in line:
continue
name, _, value = line.partition(":")
keys[name.strip()] = value.strip()
return keys.get("SystemCode", ""), keys.get("SecretKey", "")
def build_request(ep, case, system_code, secret_key):
"""按端点与用例组构造 urllib 请求;返回 (request, 描述行)。"""
url = BASE_URL + ep["path"]
method = ep["method"]
headers = {"User-Agent": "stec-cmd-e2e-probe/1.0", "Accept": "application/json, text/*;q=0.9"}
if case == "B":
headers[HEADER_SYSTEM_CODE] = system_code
headers[HEADER_SECRET_KEY] = secret_key
# A/B 两组均不带 Token负向目标即缺 Token 行为)。
data = None
if method == "GET":
if ep.get("query"):
from urllib.parse import urlencode
url += "?" + urlencode(ep["query"])
elif method == "POST":
body = json.dumps(ep["body_json"], ensure_ascii=False).encode("utf-8")
headers["Content-Type"] = "application/json; charset=utf-8"
data = body
elif method == "POST_MULTIPART":
boundary = "----e2eProbe" + uuid.uuid4().hex[:12]
parts = []
for name, value in ep["multipart_fields"].items():
parts.append(
f"--{boundary}\r\nContent-Disposition: form-data; name=\"{name}\"\r\n\r\n{value}\r\n".encode("utf-8"))
filename, content = ep["multipart_file"]
parts.append(
(f"--{boundary}\r\nContent-Disposition: form-data; name=\"Files\"; "
f"filename=\"{filename}\"\r\nContent-Type: text/plain\r\n\r\n").encode("utf-8")
+ content.encode("utf-8") + b"\r\n")
parts.append(f"--{boundary}--\r\n".encode("utf-8"))
headers["Content-Type"] = f"multipart/form-data; boundary={boundary}"
data = b"".join(parts)
else:
raise ValueError(f"未知方法 {method}")
req = urllib.request.Request(url, data=data, headers=headers, method="GET" if method == "GET" else "POST")
auth = {k: headers.get(k) for k in (HEADER_SECRET_KEY, HEADER_SYSTEM_CODE, HEADER_TOKEN)}
return req, auth
def do_request(req):
"""发请求并归一返回 (http_status, body_text, err)。连接失败时 status 记 '000'"""
ctx = ssl.create_default_context()
try:
with urllib.request.urlopen(req, timeout=TIMEOUT_SEC, context=ctx) as resp:
return str(resp.status), resp.read().decode("utf-8", errors="replace"), None
except urllib.error.HTTPError as e:
return str(e.code), e.read().decode("utf-8", errors="replace"), None
except Exception as e: # 连接失败/超时/TLS
return "000", "", f"{type(e).__name__}: {e}"
def analyze(ep, case, status, body):
"""按判定口径分析一个响应,返回结果 dict。"""
result = {
"sec": ep["sec"], "name": ep["name"], "case": case,
"http_status": status,
"exists": None, "double_layer": None,
"envelope_code": None, "envelope_code_is_str": None,
"envelope_msg": None, "envelope_data": None,
"exception_type": None, "notes": "",
}
if status == "000":
result["exists"] = False
result["notes"] = "连接失败"
return result
result["exists"] = status != "404"
if status == "404":
result["notes"] = "端点不存在"
return result
wrapper = None
if body.strip().startswith("{"):
try:
wrapper = json.loads(body)
except json.JSONDecodeError:
wrapper = None
embedded = None
if isinstance(wrapper, dict):
result["exception_type"] = wrapper.get("ExceptionType")
raw = wrapper.get("ExceptionMessage")
if isinstance(raw, str):
try:
embedded = json.loads(raw)
except json.JSONDecodeError:
embedded = None
elif isinstance(raw, dict):
embedded = raw # 个别端点可能直接内嵌对象
if embedded and isinstance(embedded, dict) and "code" in embedded:
result["double_layer"] = (status == "500")
code = embedded.get("code")
result["envelope_code"] = code
result["envelope_code_is_str"] = isinstance(code, str)
result["envelope_msg"] = embedded.get("msg")
result["envelope_data"] = embedded.get("data")
result["notes"] = (
"双层结构成立" if result["double_layer"] and result["envelope_code_is_str"]
else "内嵌信封可解但形态偏离(见 http_status/code 类型)")
else:
# 可能是裸业务信封HTTP 200 + {code,...})或非 JSONHTML 错误页等)
if isinstance(wrapper, dict) and "code" in wrapper:
result["double_layer"] = False
code = wrapper.get("code")
result["envelope_code"] = code
result["envelope_code_is_str"] = isinstance(code, str)
result["envelope_msg"] = wrapper.get("msg")
result["envelope_data"] = wrapper.get("data")
result["notes"] = "裸业务信封(未走 ASP.NET 异常包装)"
else:
result["double_layer"] = False
result["notes"] = "响应非可解析双层结构(原始体见存档)"
return result
def save_raw(ep, case, status, auth, body, err):
stem = f"{case}_{ep['sec'].replace('.', '_')}"
keys_desc = "无三要素头" if not auth.get(HEADER_SECRET_KEY) else (
f"{HEADER_SYSTEM_CODE}={auth.get(HEADER_SYSTEM_CODE)}, "
f"{HEADER_SECRET_KEY}={str(auth.get(HEADER_SECRET_KEY))[:6]}***(脱敏), 无 Token")
lines = [
f"# 端点 {ep['sec']} {ep['name']} 用例组 {case}" + ("(缺三要素头)" if case == "A" else "(带密钥缺 Token"),
f"# 请求:{ep['method']} {BASE_URL}{ep['path']}",
f"# 请求头:{keys_desc}",
f"# HTTP 状态:{status}" + (f" 错误:{err}" if err else ""),
f"# 存档时间:{time.strftime('%Y-%m-%dT%H:%M:%S%z')}",
"=" * 60,
body if body else "(空响应体)",
]
(RESPONSE_DIR / f"{stem}.txt").write_text("\n".join(lines), encoding="utf-8")
return RESPONSE_DIR / f"{stem}.txt"
def write_markdown(results):
rows = []
verdict_a = verdict_b = 0
for r in results:
ok = (
r["exists"] is True
and r["http_status"] == "500"
and r["double_layer"] is True
and r["envelope_code_is_str"] is True
and r["envelope_code"] in VALID_ENVELOPE_CODES
)
if r["case"] == "A" and ok:
verdict_a += 1
if r["case"] == "B" and ok:
verdict_b += 1
code = r["envelope_code"]
rows.append(
"| {sec} | {name} | {case} | {st} | {ex} | {dl} | {code} | {isstr} | {msg} | {note} |".format(
sec=r["sec"], name=r["name"], case=r["case"], st=r["http_status"],
ex="存在" if r["exists"] else "",
dl="成立" if r["double_layer"] else "不成立",
code="`%s`" % code if code is not None else "",
isstr="" if r["envelope_code_is_str"] else "",
msg=(r["envelope_msg"] or "")[:40] if isinstance(r["envelope_msg"], str) else ("" if r["envelope_msg"] is None else str(r["envelope_msg"])[:40]),
note=r["notes"],
))
md = "\n".join([
"# 契约层负向探测证据表(自动生成于 %s" % time.strftime("%Y-%m-%d %H:%M:%S"),
"",
"- 服务器:%s(接口管理规范 V4.5 测试环境)" % BASE_URL,
"- 用例组 A缺三要素头SecretKey/SystemCode/Token 全缺);用例组 B带 docs/SystemCode_secertkey.txt 密钥、缺 Token。",
"- 判定:存在性=HTTP≠404/000双层结构=HTTP 500 且 ExceptionMessage 内嵌信封 JSON信封解包=code 为字符串且 ∈ {200,500,429,403}。",
"- 通过A 组 %d/15B 组 %d/15。" % (verdict_a, verdict_b),
"- 原始响应存档:`docs/e2e-evidence/responses/`(密钥已脱敏)。",
"",
"| 章节 | 端点 | 用例 | HTTP | 存在 | 双层结构 | 信封code | code为字符串 | 信封msg | 备注 |",
"|---|---|---|---|---|---|---|---|---|---|",
] + rows + [""])
(EVIDENCE_DIR / "contract_evidence.md").write_text(md, encoding="utf-8")
return verdict_a, verdict_b
def main():
RESPONSE_DIR.mkdir(parents=True, exist_ok=True)
system_code, secret_key = load_keys()
if not secret_key:
raise SystemExit("密钥文件解析失败:%s" % KEY_FILE)
print("密钥加载完成SystemCode=%s, SecretKey=%s…脱敏)" % (system_code, secret_key[:6]))
results = []
for case in ("A", "B"):
for ep in ENDPOINTS:
req, auth = build_request(ep, case, system_code, secret_key)
status, body, err = do_request(req)
raw_path = save_raw(ep, case, status, auth, body, err)
r = analyze(ep, case, status, body)
if err:
r["notes"] += f"{err}"
r["raw_file"] = str(raw_path.relative_to(WORKSPACE))
results.append(r)
print("[{case}] {sec:<8} {st:<3} 双层={dl} code={code} {name}".format(
case=case, sec=ep["sec"], st=status,
dl=r["double_layer"], code=r["envelope_code"], name=ep["name"]))
time.sleep(REQUEST_INTERVAL_SEC)
(EVIDENCE_DIR / "contract_results.json").write_text(
json.dumps(results, ensure_ascii=False, indent=2), encoding="utf-8")
verdict_a, verdict_b = write_markdown(results)
print("完成A 组通过 %d/15B 组通过 %d/15证据见 docs/e2e-evidence/" % (verdict_a, verdict_b))
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,454 @@
[
{
"sec": "2.2.1",
"name": "账号密码登录",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "认证未通过请检查SystemCode与SecretKey的值是否正确",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_2_1.txt"
},
{
"sec": "2.2.2",
"name": "发送验证码",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "认证未通过请检查SystemCode与SecretKey的值是否正确",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_2_2.txt"
},
{
"sec": "2.2.3",
"name": "手机验证码登录",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "认证未通过请检查SystemCode与SecretKey的值是否正确",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_2_3.txt"
},
{
"sec": "2.3.1",
"name": "修改登录密码",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_3_1.txt"
},
{
"sec": "2.4",
"name": "获取当前用户信息",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_4.txt"
},
{
"sec": "2.5.1.1",
"name": "获取当前用户项目列表",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_5_1_1.txt"
},
{
"sec": "2.6",
"name": "获取APP端任务列表",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_6.txt"
},
{
"sec": "2.7",
"name": "获取项目监测计划任务列表",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_7.txt"
},
{
"sec": "2.9",
"name": "获取测组包含的监测点列表",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_9.txt"
},
{
"sec": "2.10",
"name": "获取项目监测计划统计表",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_10.txt"
},
{
"sec": "2.11",
"name": "获取指定监测计划的测组统计表",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_11.txt"
},
{
"sec": "2.12",
"name": "监测点统计表",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_12.txt"
},
{
"sec": "2.13",
"name": "数据解析(原始文件上传)",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_13.txt"
},
{
"sec": "2.14",
"name": "获取基准点",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": false,
"envelope_code": null,
"envelope_code_is_str": null,
"envelope_msg": null,
"envelope_data": null,
"exception_type": "System.Exception",
"notes": "响应非可解析双层结构(原始体见存档)",
"raw_file": "docs/e2e-evidence/responses/A_2_14.txt"
},
{
"sec": "2.15",
"name": "获取工点数据",
"case": "A",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/A_2_15.txt"
},
{
"sec": "2.2.1",
"name": "账号密码登录",
"case": "B",
"http_status": "200",
"exists": true,
"double_layer": false,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "用户名或密码错误!",
"envelope_data": null,
"exception_type": null,
"notes": "裸业务信封(未走 ASP.NET 异常包装)",
"raw_file": "docs/e2e-evidence/responses/B_2_2_1.txt"
},
{
"sec": "2.2.2",
"name": "发送验证码",
"case": "B",
"http_status": "200",
"exists": true,
"double_layer": false,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "短信验证码发送失败,失败信息System.AggregateException: 发生一个或多个错误。 ---> TencentCloud.Common.TencentCloudSDKException: The request with exception: 发送请求时出错。\r\n 在 TencentCloud.Common.AbstractClient.<RequestV1>d__43.MoveNext() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\TencentCloud\\Common\\AbstractClient.cs:行号 318\r\n--- 引发异常的上一位置中堆栈跟踪的末尾 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n 在 TencentCloud.Common.AbstractClient.<InternalRequest>d__35.MoveNext() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\TencentCloud\\Common\\AbstractClient.cs:行号 97\r\n --- 内部异常堆栈跟踪的结尾 ---\r\n 在 System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n 在 System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)\r\n 在 System.Threading.Tasks.Task.Wait()\r\n 在 TencentCloud.Common.AbstractClient.InternalRequestSync(AbstractModel request, String actionName) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\TencentCloud\\Common\\AbstractClient.cs:行号 137\r\n 在 TencentCloud.Sms.V20210111.SmsClient.SendSmsSync(SendSmsRequest req) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\TencentCloud\\Sms\\V20210111\\SmsClient.cs:行号 729\r\n 在 NK.Message.MobilMsg.SendMsg(String signName, String templateId, String[] mobiles, String[] templateParam, String Endpoint, String ClientType) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\MobilMsg.cs:行号 102\r\n---> (内部异常 #0) messageThe request with exception: 发送请求时出错。 requestId<---\r\n",
"envelope_data": {
"result": false
},
"exception_type": null,
"notes": "裸业务信封(未走 ASP.NET 异常包装)",
"raw_file": "docs/e2e-evidence/responses/B_2_2_2.txt"
},
{
"sec": "2.2.3",
"name": "手机验证码登录",
"case": "B",
"http_status": "200",
"exists": true,
"double_layer": false,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "此号码的用户不存在,请确认手机号是否和系统中维护的一致",
"envelope_data": null,
"exception_type": null,
"notes": "裸业务信封(未走 ASP.NET 异常包装)",
"raw_file": "docs/e2e-evidence/responses/B_2_2_3.txt"
},
{
"sec": "2.3.1",
"name": "修改登录密码",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_3_1.txt"
},
{
"sec": "2.4",
"name": "获取当前用户信息",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_4.txt"
},
{
"sec": "2.5.1.1",
"name": "获取当前用户项目列表",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_5_1_1.txt"
},
{
"sec": "2.6",
"name": "获取APP端任务列表",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_6.txt"
},
{
"sec": "2.7",
"name": "获取项目监测计划任务列表",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_7.txt"
},
{
"sec": "2.9",
"name": "获取测组包含的监测点列表",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_9.txt"
},
{
"sec": "2.10",
"name": "获取项目监测计划统计表",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_10.txt"
},
{
"sec": "2.11",
"name": "获取指定监测计划的测组统计表",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_11.txt"
},
{
"sec": "2.12",
"name": "监测点统计表",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_12.txt"
},
{
"sec": "2.13",
"name": "数据解析(原始文件上传)",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_13.txt"
},
{
"sec": "2.14",
"name": "获取基准点",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": false,
"envelope_code": null,
"envelope_code_is_str": null,
"envelope_msg": null,
"envelope_data": null,
"exception_type": "System.Exception",
"notes": "响应非可解析双层结构(原始体见存档)",
"raw_file": "docs/e2e-evidence/responses/B_2_14.txt"
},
{
"sec": "2.15",
"name": "获取工点数据",
"case": "B",
"http_status": "500",
"exists": true,
"double_layer": true,
"envelope_code": "500",
"envelope_code_is_str": true,
"envelope_msg": "无效的token。",
"envelope_data": null,
"exception_type": "NK.Public.Exceptions.BusinessException",
"notes": "双层结构成立",
"raw_file": "docs/e2e-evidence/responses/B_2_15.txt"
}
]

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest" tests="5" skipped="0" failures="0" errors="0" timestamp="2026-09-03T19:18:11" hostname="jtlserver" time="0.031">
<properties/>
<testcase name="脏帧被丢弃后继续重同步" classname="com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest" time="0.022"/>
<testcase name="帧头错误的完整帧被丢弃" classname="com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest" time="0.001"/>
<testcase name="粘包两帧一次解析" classname="com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest" time="0.0"/>
<testcase name="整帧一次喂入解析出协议示例读数" classname="com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest" time="0.001"/>
<testcase name="逐字节分片喂入仍可切帧(残包容错)" classname="com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest" time="0.007"/>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="com.stec.cmd.protocol.vm208.Vm208FrameParserTest" tests="7" skipped="0" failures="0" errors="0" timestamp="2026-09-03T19:18:11" hostname="jtlserver" time="0.02">
<properties/>
<testcase name="整帧解析出协议示例读数" classname="com.stec.cmd.protocol.vm208.Vm208FrameParserTest" time="0.011"/>
<testcase name="激励命令编码与应答回解析" classname="com.stec.cmd.protocol.vm208.Vm208FrameParserTest" time="0.003"/>
<testcase name="状态字母映射 Q 与 N" classname="com.stec.cmd.protocol.vm208.Vm208FrameParserTest" time="0.0"/>
<testcase name="缺字段脏帧被丢弃" classname="com.stec.cmd.protocol.vm208.Vm208FrameParserTest" time="0.001"/>
<testcase name="未知状态字母映射 UNKNOWN 而非崩溃" classname="com.stec.cmd.protocol.vm208.Vm208FrameParserTest" time="0.0"/>
<testcase name="激励值越界抛出" classname="com.stec.cmd.protocol.vm208.Vm208FrameParserTest" time="0.005"/>
<testcase name="分片喂入仍可切帧" classname="com.stec.cmd.protocol.vm208.Vm208FrameParserTest" time="0.0"/>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>

View File

@@ -0,0 +1,116 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
<title>Test results - Class com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest</title>
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
<script src="../js/report.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<h1>Class com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest</h1>
<div class="breadcrumbs">
<a href="../index.html">all</a> &gt;
<a href="../packages/com.stec.cmd.protocol.ie1000.html">com.stec.cmd.protocol.ie1000</a> &gt; Ie1000FrameParserTest</div>
<div id="summary">
<table>
<tr>
<td>
<div class="summaryGroup">
<table>
<tr>
<td>
<div class="infoBox" id="tests">
<div class="counter">5</div>
<p>tests</p>
</div>
</td>
<td>
<div class="infoBox" id="failures">
<div class="counter">0</div>
<p>failures</p>
</div>
</td>
<td>
<div class="infoBox" id="ignored">
<div class="counter">0</div>
<p>ignored</p>
</div>
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.031s</div>
<p>duration</p>
</div>
</td>
</tr>
</table>
</div>
</td>
<td>
<div class="infoBox success" id="successRate">
<div class="percent">100%</div>
<p>successful</p>
</div>
</td>
</tr>
</table>
</div>
<div id="tabs">
<ul class="tabLinks">
<li>
<a href="#tab0">Tests</a>
</li>
</ul>
<div id="tab0" class="tab">
<h2>Tests</h2>
<table>
<thead>
<tr>
<th>Test</th>
<th>Duration</th>
<th>Result</th>
</tr>
</thead>
<tr>
<td class="success">帧头错误的完整帧被丢弃</td>
<td class="success">0.001s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">整帧一次喂入解析出协议示例读数</td>
<td class="success">0.001s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">粘包两帧一次解析</td>
<td class="success">0s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">脏帧被丢弃后继续重同步</td>
<td class="success">0.022s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">逐字节分片喂入仍可切帧(残包容错)</td>
<td class="success">0.007s</td>
<td class="success">passed</td>
</tr>
</table>
</div>
</div>
<div id="footer">
<p>
<div>
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</div>Generated by
<a href="http://www.gradle.org">Gradle 8.10.2</a> at 2026年9月4日 上午3:18:11</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
<title>Test results - Class com.stec.cmd.protocol.vm208.Vm208FrameParserTest</title>
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
<script src="../js/report.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<h1>Class com.stec.cmd.protocol.vm208.Vm208FrameParserTest</h1>
<div class="breadcrumbs">
<a href="../index.html">all</a> &gt;
<a href="../packages/com.stec.cmd.protocol.vm208.html">com.stec.cmd.protocol.vm208</a> &gt; Vm208FrameParserTest</div>
<div id="summary">
<table>
<tr>
<td>
<div class="summaryGroup">
<table>
<tr>
<td>
<div class="infoBox" id="tests">
<div class="counter">7</div>
<p>tests</p>
</div>
</td>
<td>
<div class="infoBox" id="failures">
<div class="counter">0</div>
<p>failures</p>
</div>
</td>
<td>
<div class="infoBox" id="ignored">
<div class="counter">0</div>
<p>ignored</p>
</div>
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.020s</div>
<p>duration</p>
</div>
</td>
</tr>
</table>
</div>
</td>
<td>
<div class="infoBox success" id="successRate">
<div class="percent">100%</div>
<p>successful</p>
</div>
</td>
</tr>
</table>
</div>
<div id="tabs">
<ul class="tabLinks">
<li>
<a href="#tab0">Tests</a>
</li>
</ul>
<div id="tab0" class="tab">
<h2>Tests</h2>
<table>
<thead>
<tr>
<th>Test</th>
<th>Duration</th>
<th>Result</th>
</tr>
</thead>
<tr>
<td class="success">分片喂入仍可切帧</td>
<td class="success">0s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">整帧解析出协议示例读数</td>
<td class="success">0.011s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">未知状态字母映射 UNKNOWN 而非崩溃</td>
<td class="success">0s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">激励值越界抛出</td>
<td class="success">0.005s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">激励命令编码与应答回解析</td>
<td class="success">0.003s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">状态字母映射 Q 与 N</td>
<td class="success">0s</td>
<td class="success">passed</td>
</tr>
<tr>
<td class="success">缺字段脏帧被丢弃</td>
<td class="success">0.001s</td>
<td class="success">passed</td>
</tr>
</table>
</div>
</div>
<div id="footer">
<p>
<div>
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</div>Generated by
<a href="http://www.gradle.org">Gradle 8.10.2</a> at 2026年9月4日 上午3:18:11</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,179 @@
body {
margin: 0;
padding: 0;
font-family: sans-serif;
font-size: 12pt;
}
body, a, a:visited {
color: #303030;
}
#content {
padding-left: 50px;
padding-right: 50px;
padding-top: 30px;
padding-bottom: 30px;
}
#content h1 {
font-size: 160%;
margin-bottom: 10px;
}
#footer {
margin-top: 100px;
font-size: 80%;
white-space: nowrap;
}
#footer, #footer a {
color: #a0a0a0;
}
#line-wrapping-toggle {
vertical-align: middle;
}
#label-for-line-wrapping-toggle {
vertical-align: middle;
}
ul {
margin-left: 0;
}
h1, h2, h3 {
white-space: nowrap;
}
h2 {
font-size: 120%;
}
ul.tabLinks {
padding-left: 0;
padding-top: 10px;
padding-bottom: 10px;
overflow: auto;
min-width: 800px;
width: auto !important;
width: 800px;
}
ul.tabLinks li {
float: left;
height: 100%;
list-style: none;
padding-left: 10px;
padding-right: 10px;
padding-top: 5px;
padding-bottom: 5px;
margin-bottom: 0;
-moz-border-radius: 7px;
border-radius: 7px;
margin-right: 25px;
border: solid 1px #d4d4d4;
background-color: #f0f0f0;
}
ul.tabLinks li:hover {
background-color: #fafafa;
}
ul.tabLinks li.selected {
background-color: #c5f0f5;
border-color: #c5f0f5;
}
ul.tabLinks a {
font-size: 120%;
display: block;
outline: none;
text-decoration: none;
margin: 0;
padding: 0;
}
ul.tabLinks li h2 {
margin: 0;
padding: 0;
}
div.tab {
}
div.selected {
display: block;
}
div.deselected {
display: none;
}
div.tab table {
min-width: 350px;
width: auto !important;
width: 350px;
border-collapse: collapse;
}
div.tab th, div.tab table {
border-bottom: solid #d0d0d0 1px;
}
div.tab th {
text-align: left;
white-space: nowrap;
padding-left: 6em;
}
div.tab th:first-child {
padding-left: 0;
}
div.tab td {
white-space: nowrap;
padding-left: 6em;
padding-top: 5px;
padding-bottom: 5px;
}
div.tab td:first-child {
padding-left: 0;
}
div.tab td.numeric, div.tab th.numeric {
text-align: right;
}
span.code {
display: inline-block;
margin-top: 0em;
margin-bottom: 1em;
}
span.code pre {
font-size: 11pt;
padding-top: 10px;
padding-bottom: 10px;
padding-left: 10px;
padding-right: 10px;
margin: 0;
background-color: #f7f7f7;
border: solid 1px #d0d0d0;
min-width: 700px;
width: auto !important;
width: 700px;
}
span.wrapped pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: break-all;
}
label.hidden {
display: none;
}

View File

@@ -0,0 +1,84 @@
#summary {
margin-top: 30px;
margin-bottom: 40px;
}
#summary table {
border-collapse: collapse;
}
#summary td {
vertical-align: top;
}
.breadcrumbs, .breadcrumbs a {
color: #606060;
}
.infoBox {
width: 110px;
padding-top: 15px;
padding-bottom: 15px;
text-align: center;
}
.infoBox p {
margin: 0;
}
.counter, .percent {
font-size: 120%;
font-weight: bold;
margin-bottom: 8px;
}
#duration {
width: 125px;
}
#successRate, .summaryGroup {
border: solid 2px #d0d0d0;
-moz-border-radius: 10px;
border-radius: 10px;
}
#successRate {
width: 140px;
margin-left: 35px;
}
#successRate .percent {
font-size: 180%;
}
.success, .success a {
color: #008000;
}
div.success, #successRate.success {
background-color: #bbd9bb;
border-color: #008000;
}
.failures, .failures a {
color: #b60808;
}
.skipped, .skipped a {
color: #c09853;
}
div.failures, #successRate.failures {
background-color: #ecdada;
border-color: #b60808;
}
ul.linkList {
padding-left: 0;
}
ul.linkList li {
list-style: none;
margin-bottom: 5px;
}

View File

@@ -0,0 +1,153 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
<title>Test results - Test Summary</title>
<link href="css/base-style.css" rel="stylesheet" type="text/css"/>
<link href="css/style.css" rel="stylesheet" type="text/css"/>
<script src="js/report.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<h1>Test Summary</h1>
<div id="summary">
<table>
<tr>
<td>
<div class="summaryGroup">
<table>
<tr>
<td>
<div class="infoBox" id="tests">
<div class="counter">12</div>
<p>tests</p>
</div>
</td>
<td>
<div class="infoBox" id="failures">
<div class="counter">0</div>
<p>failures</p>
</div>
</td>
<td>
<div class="infoBox" id="ignored">
<div class="counter">0</div>
<p>ignored</p>
</div>
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.051s</div>
<p>duration</p>
</div>
</td>
</tr>
</table>
</div>
</td>
<td>
<div class="infoBox success" id="successRate">
<div class="percent">100%</div>
<p>successful</p>
</div>
</td>
</tr>
</table>
</div>
<div id="tabs">
<ul class="tabLinks">
<li>
<a href="#tab0">Packages</a>
</li>
<li>
<a href="#tab1">Classes</a>
</li>
</ul>
<div id="tab0" class="tab">
<h2>Packages</h2>
<table>
<thead>
<tr>
<th>Package</th>
<th>Tests</th>
<th>Failures</th>
<th>Ignored</th>
<th>Duration</th>
<th>Success rate</th>
</tr>
</thead>
<tbody>
<tr>
<td class="success">
<a href="packages/com.stec.cmd.protocol.ie1000.html">com.stec.cmd.protocol.ie1000</a>
</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>0.031s</td>
<td class="success">100%</td>
</tr>
<tr>
<td class="success">
<a href="packages/com.stec.cmd.protocol.vm208.html">com.stec.cmd.protocol.vm208</a>
</td>
<td>7</td>
<td>0</td>
<td>0</td>
<td>0.020s</td>
<td class="success">100%</td>
</tr>
</tbody>
</table>
</div>
<div id="tab1" class="tab">
<h2>Classes</h2>
<table>
<thead>
<tr>
<th>Class</th>
<th>Tests</th>
<th>Failures</th>
<th>Ignored</th>
<th>Duration</th>
<th>Success rate</th>
</tr>
</thead>
<tbody>
<tr>
<td class="success">
<a href="classes/com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest.html">com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest</a>
</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>0.031s</td>
<td class="success">100%</td>
</tr>
<tr>
<td class="success">
<a href="classes/com.stec.cmd.protocol.vm208.Vm208FrameParserTest.html">com.stec.cmd.protocol.vm208.Vm208FrameParserTest</a>
</td>
<td>7</td>
<td>0</td>
<td>0</td>
<td>0.020s</td>
<td class="success">100%</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="footer">
<p>
<div>
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</div>Generated by
<a href="http://www.gradle.org">Gradle 8.10.2</a> at 2026年9月4日 上午3:18:11</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,194 @@
(function (window, document) {
"use strict";
var tabs = {};
function changeElementClass(element, classValue) {
if (element.getAttribute("className")) {
element.setAttribute("className", classValue);
} else {
element.setAttribute("class", classValue);
}
}
function getClassAttribute(element) {
if (element.getAttribute("className")) {
return element.getAttribute("className");
} else {
return element.getAttribute("class");
}
}
function addClass(element, classValue) {
changeElementClass(element, getClassAttribute(element) + " " + classValue);
}
function removeClass(element, classValue) {
changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
}
function initTabs() {
var container = document.getElementById("tabs");
tabs.tabs = findTabs(container);
tabs.titles = findTitles(tabs.tabs);
tabs.headers = findHeaders(container);
tabs.select = select;
tabs.deselectAll = deselectAll;
tabs.select(0);
return true;
}
function getCheckBox() {
return document.getElementById("line-wrapping-toggle");
}
function getLabelForCheckBox() {
return document.getElementById("label-for-line-wrapping-toggle");
}
function findCodeBlocks() {
var spans = document.getElementById("tabs").getElementsByTagName("span");
var codeBlocks = [];
for (var i = 0; i < spans.length; ++i) {
if (spans[i].className.indexOf("code") >= 0) {
codeBlocks.push(spans[i]);
}
}
return codeBlocks;
}
function forAllCodeBlocks(operation) {
var codeBlocks = findCodeBlocks();
for (var i = 0; i < codeBlocks.length; ++i) {
operation(codeBlocks[i], "wrapped");
}
}
function toggleLineWrapping() {
var checkBox = getCheckBox();
if (checkBox.checked) {
forAllCodeBlocks(addClass);
} else {
forAllCodeBlocks(removeClass);
}
}
function initControls() {
if (findCodeBlocks().length > 0) {
var checkBox = getCheckBox();
var label = getLabelForCheckBox();
checkBox.onclick = toggleLineWrapping;
checkBox.checked = false;
removeClass(label, "hidden");
}
}
function switchTab() {
var id = this.id.substr(1);
for (var i = 0; i < tabs.tabs.length; i++) {
if (tabs.tabs[i].id === id) {
tabs.select(i);
break;
}
}
return false;
}
function select(i) {
this.deselectAll();
changeElementClass(this.tabs[i], "tab selected");
changeElementClass(this.headers[i], "selected");
while (this.headers[i].firstChild) {
this.headers[i].removeChild(this.headers[i].firstChild);
}
var h2 = document.createElement("H2");
h2.appendChild(document.createTextNode(this.titles[i]));
this.headers[i].appendChild(h2);
}
function deselectAll() {
for (var i = 0; i < this.tabs.length; i++) {
changeElementClass(this.tabs[i], "tab deselected");
changeElementClass(this.headers[i], "deselected");
while (this.headers[i].firstChild) {
this.headers[i].removeChild(this.headers[i].firstChild);
}
var a = document.createElement("A");
a.setAttribute("id", "ltab" + i);
a.setAttribute("href", "#tab" + i);
a.onclick = switchTab;
a.appendChild(document.createTextNode(this.titles[i]));
this.headers[i].appendChild(a);
}
}
function findTabs(container) {
return findChildElements(container, "DIV", "tab");
}
function findHeaders(container) {
var owner = findChildElements(container, "UL", "tabLinks");
return findChildElements(owner[0], "LI", null);
}
function findTitles(tabs) {
var titles = [];
for (var i = 0; i < tabs.length; i++) {
var tab = tabs[i];
var header = findChildElements(tab, "H2", null)[0];
header.parentNode.removeChild(header);
if (header.innerText) {
titles.push(header.innerText);
} else {
titles.push(header.textContent);
}
}
return titles;
}
function findChildElements(container, name, targetClass) {
var elements = [];
var children = container.childNodes;
for (var i = 0; i < children.length; i++) {
var child = children.item(i);
if (child.nodeType === 1 && child.nodeName === name) {
if (targetClass && child.className.indexOf(targetClass) < 0) {
continue;
}
elements.push(child);
}
}
return elements;
}
// Entry point.
window.onload = function() {
initTabs();
initControls();
};
} (window, window.document));

View File

@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
<title>Test results - Package com.stec.cmd.protocol.ie1000</title>
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
<script src="../js/report.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<h1>Package com.stec.cmd.protocol.ie1000</h1>
<div class="breadcrumbs">
<a href="../index.html">all</a> &gt; com.stec.cmd.protocol.ie1000</div>
<div id="summary">
<table>
<tr>
<td>
<div class="summaryGroup">
<table>
<tr>
<td>
<div class="infoBox" id="tests">
<div class="counter">5</div>
<p>tests</p>
</div>
</td>
<td>
<div class="infoBox" id="failures">
<div class="counter">0</div>
<p>failures</p>
</div>
</td>
<td>
<div class="infoBox" id="ignored">
<div class="counter">0</div>
<p>ignored</p>
</div>
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.031s</div>
<p>duration</p>
</div>
</td>
</tr>
</table>
</div>
</td>
<td>
<div class="infoBox success" id="successRate">
<div class="percent">100%</div>
<p>successful</p>
</div>
</td>
</tr>
</table>
</div>
<div id="tabs">
<ul class="tabLinks">
<li>
<a href="#tab0">Classes</a>
</li>
</ul>
<div id="tab0" class="tab">
<h2>Classes</h2>
<table>
<thead>
<tr>
<th>Class</th>
<th>Tests</th>
<th>Failures</th>
<th>Ignored</th>
<th>Duration</th>
<th>Success rate</th>
</tr>
</thead>
<tr>
<td class="success">
<a href="../classes/com.stec.cmd.protocol.ie1000.Ie1000FrameParserTest.html">Ie1000FrameParserTest</a>
</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>0.031s</td>
<td class="success">100%</td>
</tr>
</table>
</div>
</div>
<div id="footer">
<p>
<div>
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</div>Generated by
<a href="http://www.gradle.org">Gradle 8.10.2</a> at 2026年9月4日 上午3:18:11</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
<title>Test results - Package com.stec.cmd.protocol.vm208</title>
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
<script src="../js/report.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<h1>Package com.stec.cmd.protocol.vm208</h1>
<div class="breadcrumbs">
<a href="../index.html">all</a> &gt; com.stec.cmd.protocol.vm208</div>
<div id="summary">
<table>
<tr>
<td>
<div class="summaryGroup">
<table>
<tr>
<td>
<div class="infoBox" id="tests">
<div class="counter">7</div>
<p>tests</p>
</div>
</td>
<td>
<div class="infoBox" id="failures">
<div class="counter">0</div>
<p>failures</p>
</div>
</td>
<td>
<div class="infoBox" id="ignored">
<div class="counter">0</div>
<p>ignored</p>
</div>
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.020s</div>
<p>duration</p>
</div>
</td>
</tr>
</table>
</div>
</td>
<td>
<div class="infoBox success" id="successRate">
<div class="percent">100%</div>
<p>successful</p>
</div>
</td>
</tr>
</table>
</div>
<div id="tabs">
<ul class="tabLinks">
<li>
<a href="#tab0">Classes</a>
</li>
</ul>
<div id="tab0" class="tab">
<h2>Classes</h2>
<table>
<thead>
<tr>
<th>Class</th>
<th>Tests</th>
<th>Failures</th>
<th>Ignored</th>
<th>Duration</th>
<th>Success rate</th>
</tr>
</thead>
<tr>
<td class="success">
<a href="../classes/com.stec.cmd.protocol.vm208.Vm208FrameParserTest.html">Vm208FrameParserTest</a>
</td>
<td>7</td>
<td>0</td>
<td>0</td>
<td>0.020s</td>
<td class="success">100%</td>
</tr>
</table>
</div>
</div>
<div id="footer">
<p>
<div>
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</div>Generated by
<a href="http://www.gradle.org">Gradle 8.10.2</a> at 2026年9月4日 上午3:18:11</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,7 @@
# 端点 2.10 获取项目监测计划统计表 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetPlanStatistical
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:19+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetPlanStatisticalController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.11 获取指定监测计划的测组统计表 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetSurveyGroupList
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:21+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetSurveyGroupListController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.12 监测点统计表 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetPointStatistics
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:22+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetPointStatisticsController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.13 数据解析(原始文件上传) 用例组 A缺三要素头
# 请求POST_MULTIPART https://jcd.stec.p-q.co/OutWebApi/api/AnalysisMonitorData
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:24+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.AnalysisMonitorDataController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\AnalysisMonitorDataController.cs:行号 31\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.14 获取基准点 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/ControlPoint
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:26+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"当前用户不存在。","ExceptionType":"System.Exception","StackTrace":" 在 NK.Service.UserService.GetCurrentUserInfo() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Service\\UserService.cs:行号 95\r\n 在 NK.Service.UserService.<>c.<get_CurrentUser>b__2_0() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Service\\UserService.cs:行号 71\r\n 在 NK.Public.HttpRuntimeCacheHelper.Get[T](String key, Func`1 fun, Int32 second) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Public\\HttpRuntimeCacheHelper.cs:行号 94\r\n 在 NK.Public.CacheHelper.Get[T](String key, Func`1 fun, Int32 second) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Public\\CacheHelper.cs:行号 65\r\n 在 NK.Service.UserService.get_CurrentUser() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Service\\UserService.cs:行号 69\r\n 在 OutWebApi.Controllers.ControlPointController.Get(String ProjectID) 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\ControlPointController.cs:行号 23\r\n 在 lambda_method(Closure , Object , Object[] )\r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)\r\n 在 System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.15 获取工点数据 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetWorkPoint
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:28+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetWorkPointController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.2.1 账号密码登录 用例组 A缺三要素头
# 请求POST https://jcd.stec.p-q.co/OutWebApi/api/LoginByAccount
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:04+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"认证未通过请检查SystemCode与SecretKey的值是否正确\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.LoginByAccountController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.2.2 发送验证码 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/LoginSecurityCode
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:06+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"认证未通过请检查SystemCode与SecretKey的值是否正确\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.LoginSecurityCodeController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\Login\\LoginSecurityCodeController.cs:行号 18\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.2.3 手机验证码登录 用例组 A缺三要素头
# 请求POST https://jcd.stec.p-q.co/OutWebApi/api/LoginByMobile
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:08+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"认证未通过请检查SystemCode与SecretKey的值是否正确\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.LoginByMobileController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\Login\\LoginByMobileController.cs:行号 22\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.3.1 修改登录密码 用例组 A缺三要素头
# 请求POST https://jcd.stec.p-q.co/OutWebApi/api/ModifyPassword
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:09+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.ModifyPasswordController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.4 获取当前用户信息 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetUserInfo
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:11+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetUserInfoController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.5.1.1 获取当前用户项目列表 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetProjectList
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:13+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetProjectListController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.6 获取APP端任务列表 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetUserPlanGroup
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:14+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetUserPlanGroupController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.7 获取项目监测计划任务列表 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetPlanGroup
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:16+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetPlanGroupController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.9 获取测组包含的监测点列表 用例组 A缺三要素头
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetPointBySurveyGroup
# 请求头:无三要素头
# HTTP 状态500
# 存档时间2026-09-04T03:11:18+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetPointBySurveyGroupController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\Points\\GetPointBySurveyGroupController.cs:行号 16\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.10 获取项目监测计划统计表 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetPlanStatistical
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:45+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetPlanStatisticalController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.11 获取指定监测计划的测组统计表 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetSurveyGroupList
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:46+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetSurveyGroupListController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.12 监测点统计表 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetPointStatistics
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:48+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetPointStatisticsController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.13 数据解析(原始文件上传) 用例组 B带密钥缺 Token
# 请求POST_MULTIPART https://jcd.stec.p-q.co/OutWebApi/api/AnalysisMonitorData
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:50+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.AnalysisMonitorDataController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\AnalysisMonitorDataController.cs:行号 31\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.14 获取基准点 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/ControlPoint
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:51+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"当前用户不存在。","ExceptionType":"System.Exception","StackTrace":" 在 NK.Service.UserService.GetCurrentUserInfo() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Service\\UserService.cs:行号 95\r\n 在 NK.Service.UserService.<>c.<get_CurrentUser>b__2_0() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Service\\UserService.cs:行号 71\r\n 在 NK.Public.HttpRuntimeCacheHelper.Get[T](String key, Func`1 fun, Int32 second) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Public\\HttpRuntimeCacheHelper.cs:行号 94\r\n 在 NK.Public.CacheHelper.Get[T](String key, Func`1 fun, Int32 second) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Public\\CacheHelper.cs:行号 65\r\n 在 NK.Service.UserService.get_CurrentUser() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Service\\UserService.cs:行号 69\r\n 在 OutWebApi.Controllers.ControlPointController.Get(String ProjectID) 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\ControlPointController.cs:行号 23\r\n 在 lambda_method(Closure , Object , Object[] )\r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)\r\n 在 System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.15 获取工点数据 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetWorkPoint
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:53+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetWorkPointController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.2.1 账号密码登录 用例组 B带密钥缺 Token
# 请求POST https://jcd.stec.p-q.co/OutWebApi/api/LoginByAccount
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态200
# 存档时间2026-09-04T03:11:30+0800
============================================================
{"code":"500","msg":"用户名或密码错误!","data":null}

View File

@@ -0,0 +1,7 @@
# 端点 2.2.2 发送验证码 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/LoginSecurityCode
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态200
# 存档时间2026-09-04T03:11:31+0800
============================================================
{"code":"500","msg":"短信验证码发送失败,失败信息System.AggregateException: 发生一个或多个错误。 ---> TencentCloud.Common.TencentCloudSDKException: The request with exception: 发送请求时出错。\r\n 在 TencentCloud.Common.AbstractClient.<RequestV1>d__43.MoveNext() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\TencentCloud\\Common\\AbstractClient.cs:行号 318\r\n--- 引发异常的上一位置中堆栈跟踪的末尾 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n 在 TencentCloud.Common.AbstractClient.<InternalRequest>d__35.MoveNext() 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\TencentCloud\\Common\\AbstractClient.cs:行号 97\r\n --- 内部异常堆栈跟踪的结尾 ---\r\n 在 System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n 在 System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)\r\n 在 System.Threading.Tasks.Task.Wait()\r\n 在 TencentCloud.Common.AbstractClient.InternalRequestSync(AbstractModel request, String actionName) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\TencentCloud\\Common\\AbstractClient.cs:行号 137\r\n 在 TencentCloud.Sms.V20210111.SmsClient.SendSmsSync(SendSmsRequest req) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\TencentCloud\\Sms\\V20210111\\SmsClient.cs:行号 729\r\n 在 NK.Message.MobilMsg.SendMsg(String signName, String templateId, String[] mobiles, String[] templateParam, String Endpoint, String ClientType) 位置 E:\\An\\Project\\SHCJ\\BaseComponent\\NK.Message\\MobilMsg.cs:行号 102\r\n---> (内部异常 #0) messageThe request with exception: 发送请求时出错。 requestId<---\r\n","data":{"result":false}}

View File

@@ -0,0 +1,7 @@
# 端点 2.2.3 手机验证码登录 用例组 B带密钥缺 Token
# 请求POST https://jcd.stec.p-q.co/OutWebApi/api/LoginByMobile
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态200
# 存档时间2026-09-04T03:11:33+0800
============================================================
{"code":"500","msg":"此号码的用户不存在,请确认手机号是否和系统中维护的一致","data":null}

View File

@@ -0,0 +1,7 @@
# 端点 2.3.1 修改登录密码 用例组 B带密钥缺 Token
# 请求POST https://jcd.stec.p-q.co/OutWebApi/api/ModifyPassword
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:35+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.ModifyPasswordController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.4 获取当前用户信息 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetUserInfo
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:36+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetUserInfoController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.5.1.1 获取当前用户项目列表 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetProjectList
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:38+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetProjectListController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.6 获取APP端任务列表 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetUserPlanGroup
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:40+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetUserPlanGroupController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.7 获取项目监测计划任务列表 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetPlanGroup
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:42+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetPlanGroupController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1,7 @@
# 端点 2.9 获取测组包含的监测点列表 用例组 B带密钥缺 Token
# 请求GET https://jcd.stec.p-q.co/OutWebApi/api/GetPointBySurveyGroup
# 请求头SystemCode=Mobile, SecretKey=6C2782***(脱敏), 无 Token
# HTTP 状态500
# 存档时间2026-09-04T03:11:43+0800
============================================================
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetPointBySurveyGroupController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\Points\\GetPointBySurveyGroupController.cs:行号 16\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}

View File

@@ -0,0 +1 @@
{"Message":"发生错误。","ExceptionMessage":"{\"code\":\"500\",\"msg\":\"无效的token。\",\"data\":null}","ExceptionType":"NK.Public.Exceptions.BusinessException","StackTrace":" 在 OutWebApi.BaseApiController..ctor() 位置 E:\\WorkData\\城建\\code\\WebApps\\OutWebApi\\Controllers\\BaseApiController.cs:行号 58\r\n 在 OutWebApi.Controllers.GetUserInfoController..ctor()\r\n 在 lambda_method(Closure )\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}