diff --git a/CLAUDE.md b/CLAUDE.md index 12bfedd..a2949e6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,12 +44,15 @@ cd frontend && npm run dev │ ├── api/client.ts SSE 客户端 + fetch 封装 │ ├── stores/chat.ts Pinia: 消息/流式/节点进度 │ ├── stores/session.ts Pinia: 会话管理 + │ ├── stores/kb.ts Pinia: KB 状态管理(多租户知识库) │ ├── components/ │ │ ├── Sidebar.vue 会话列表 + 下载 + 历史版本 │ │ ├── ChatMessages.vue 消息列表渲染 │ │ ├── ProcessSection.vue 过程折叠区(替代 StreamingMessage + NodeProgress) - │ │ ├── UnifiedInput.vue 统一输入框(文本+文件拖拽/粘贴/芯片) - │ │ └── SummaryCard.vue 结果摘要卡片(含耗时) + │ │ ├── UnifiedInput.vue 统一输入框(文本+文件拖拽/粘贴/芯片,含 .jrxml) + │ │ ├── SummaryCard.vue 结果摘要卡片(含耗时) + │ │ ├── KbSelector.vue KB 下拉选择器(对话中切换知识库) + │ │ └── KbManager.vue KB 管理面板(创建/上传/构建/删除) │ └── utils/format.ts 工具函数 │ ▼ HTTP + SSE (Server-Sent Events) @@ -87,9 +90,16 @@ validation_service/ (FastAPI, 端口 8001) — 不变 | `backend/annotation_detector.py` | 批注检测: 圈选(cv2 HoughCircles) + 箭头(HoughLinesP聚类) + OCR关联 + LLM格式化 | 中 | | `backend/embeddings.py` | 嵌入模型工厂 (HuggingFace/OpenAI) | 低 | | `backend/validation.py` | 验证服务 HTTP 客户端 | 低 | -| `backend/session.py` | 会话 JSON 文件 CRUD | 低 | +| `backend/session.py` | 会话 JSON 文件 CRUD(含 kb_id) | 低 | +| `backend/kb_manager.py` | 用户+知识库 CRUD(多租户,原子 JSON 持久化) | 中 | +| `backend/kb_searcher.py` | 知识库隔离搜索 + 模板检索(per-KB ChromaDB) | 中 | +| `backend/kb_parser.py` | KB 解析管道:文件解析→字段提取→chunk切割→向量嵌入 | 中 | +| `backend/field_matcher.py` | OCR↔KB 字段匹配:Embedding 粗筛 + LLM 精确确认 | 中 | +| `agent/datasource.py` | 数据源模式解析:$P{{xxx}} 参数 vs JDBC 直连 | 低 | +| `agent/jrxml_windower.py` | JRXML Band 级窗口化引擎:拆解/切分/重组/元素计数校验 | 中 | | `validation_service/main.py` | FastAPI 验证服务 | 低 | -| `scripts/init_kb.py` | 知识库初始化/模型下载 | 低 | +| `scripts/init_kb.py` | 旧 RAG 知识库初始化/模型下载 | 低 | +| `scripts/init_default_kb.py` | 多租户默认 KB 初始化(默认用户 + 预置 KB) | 低 | | `app.py` | ~~旧 Streamlit UI~~(已由 api_server.py + frontend/ 替代) | 废弃 | ## 关键约定 @@ -427,3 +437,115 @@ cd frontend && npx playwright test ### consult_answer 前端显示修复 - `api_server.py` — `agent_complete` SSE 事件新增 `consult_answer` 字段 + +## 更新 (v12 — 2026-05-23) + +### 多租户知识库系统 + +**核心架构**:用户自行维护多套知识库,每套 KB 拥有独立的文件存储、JSON 元数据和 ChromaDB 向量集合。会话可绑定不同 KB,LLM 基于 KB 中的字段定义和 JRXML 模板生成报表。 + +**存储架构**: +``` +kb_data/ +├── users.json # 用户注册表 +└── {user_id}/ + ├── profile.json + └── {kb_id}/ + ├── meta.json # KB 元数据 + 字段定义 + 模板索引 + ├── raw/ # 原始上传文件 + ├── chunks.json # RAG chunks(含 JRXML 模板完整文本) + └── chroma/ # KB 专属 ChromaDB +``` + +**新增后端模块**: + +| 文件 | 职责 | +|------|------| +| `backend/kb_manager.py` | 用户+KB CRUD:create_user/list_users/create_kb/list_kbs/get_kb/delete_kb/update_kb_meta/get_kb_raw_dir/get_kb_chroma_path。原子 JSON 写入(tempfile + os.replace) | +| `backend/kb_parser.py` | KB 解析管道:`parse_jrxml_fields()` XML 提取参数/字段/查询 → `process_file_for_kb()` 处理多种格式(jrxml/zip/tar/pdf/docx/xlsx/md) → `chunk_file_results()` 切割 → `build_kb_from_files()` 全管线(parse→chunk→embed→update meta) | +| `backend/kb_searcher.py` | `KBChromaSearcher` 类:per-KB ChromaDB 懒连接。`search()` 语义搜索、`search_templates()` 仅搜索 JRXML 模板 chunk、`add_chunks()` 向量写入。全局 searcher 缓存 `_searchers: dict` | +| `backend/field_matcher.py` | OCR↔KB 字段匹配:1) Embedding 粗筛(余弦相似度 top-3)2) LLM 精确确认。返回 `{"工单号": "billNo", ...}` 映射 | +| `agent/datasource.py` | 数据源模式:`resolve_datasource_mode()` 检测用户意图 → `"parameter"`(默认 $P{xxx})或 `"jdbc"`(SQL 直连)。未配置 DB 时生成反问消息 | +| `scripts/init_default_kb.py` | 默认 KB 初始化:创建默认用户 → 解析 `rag/jrxml_source/` 下的 17 个 JRXML + 16 个 MD → chunk + embed → ChromaDB | + +**新增 API 端点**(api_server.py): + +``` +POST /api/users # 创建用户 +GET /api/users # 用户列表 +GET /api/users/{user_id} # 用户详情 +DELETE /api/users/{user_id} # 删除用户 +GET /api/users/{user_id}/kbs # KB 列表 +POST /api/users/{user_id}/kbs # 创建 KB +GET /api/kbs/{kb_id} # KB 详情 +DELETE /api/kbs/{kb_id} # 删除 KB +POST /api/kbs/{kb_id}/upload # 上传文件到 KB +POST /api/kbs/{kb_id}/build # 构建 KB(chunk→embed) +GET /api/kbs/{kb_id}/status # KB 状态 +GET /api/kbs/{kb_id}/fields # KB 字段+模板列表 +GET /api/kbs/{kb_id}/search?q=&type= # KB 语义搜索 +PUT /api/sessions/{session_id}/kb # 绑定会话-KB +GET /api/sessions/{session_id}/kb # 获取会话绑定的 KB +``` + +**三条模板获取路径**: + +1. **管理页预上传**:用户上传文件到 KB → 解析管道 → chunks + ChromaDB → 对话选择 KB → retrieve 节点从 KB 检索 +2. **对话框即时上传**:用户拖入 `.jrxml` → `_parse_jrxml_file()` → 注入 `agent_state["uploaded_template_jrxml"]` → 生成节点直接使用该模板 +3. **口头引用模板**:用户说"根据标准结算单模板" → `_detect_template_intent()` 正则匹配 → `retrieve()` 在 KB 中搜索模板 → 注入 `kb_template_jrxml` + +**模板上下文注入**:所有 6 个生成节点(generate/generate_skeleton/refine_layout/map_fields/modify_jrxml/correct_jrxml)通过 `_build_template_context(state)` 获取模板上下文,优先级:聊天上传 > KB 检索 > KB 字段定义。6 个 prompt 模板全部新增 `{template_context}` 占位符。 + +**前端新增**: + +| 文件 | 职责 | +|------|------| +| `stores/kb.ts` | Pinia store:用户列表、KB 列表、当前选择、字段/模板缓存、CRUD 操作、会话绑定 | +| `components/KbSelector.vue` | 对话顶部 KB 下拉选择器 + 管理按钮 | +| `components/KbManager.vue` | 模态面板:创建 KB、上传文件(支持 .jrxml/.md/.xlsx/.docx/.pdf/.csv/.zip 等)、构建、删除 | + +**API Server 增强**: +- `_process_files()` 检测 `.jrxml` 文件 → 提取参数/字段/查询/页面尺寸 → 注入 `uploaded_template_jrxml` + `uploaded_template_params` +- `agent/state.py` 新增 10 个字段:`kb_id`, `kb_fields`, `kb_field_mapping`, `uploaded_template_jrxml`, `uploaded_template_params`, `kb_template_jrxml`, `kb_template_name`, `datasource_mode`, `db_config` + +**字段匹配管线**(`_match_ocr_to_kb` → 尚未集成到节点):OCR 提取中文字段名 → `match_ocr_to_kb()` 两阶段匹配 → 结果为 `{"工单号": "billNo"}` → `format_field_mapping_context()` 注入 prompt → LLM 使用 `$P{billNo}` 而非 `$P{工单号}` + +## 更新 (v13 — 2026-05-24) + +### 3 阶段管道内容丢失修复 — Band 级窗口化 + 程序化字段映射 + +**问题**:`generate_skeleton` 生成 34k 字符骨架 JRXML → `refine_layout` 将完整 34k 发给 LLM → LLM 重新生成简化版(~3k 字符,丢失 91.5%)。`map_fields` 同样存在字段映射时内容丢失问题。 + +**根因**:LLM 看到完整 JRXML 时倾向于"重新生成"而非"在原基础上修改坐标/字段名"。提示词调控无法可靠解决。 + +**修复方案**(按用户要求 — 程序化节点控制,不靠 LLM 提示词): + +#### `refine_layout`:Band 级窗口化 LLM 精调 + +新增 `agent/jrxml_windower.py` — JRXML 拆解/切分/重组引擎: + +| 函数 | 用途 | +|------|------| +| `decompose_jrxml()` | ET 安全解析 → 分离 header(field 声明/queryString 等,不发给 LLM)+ 所有 band | +| `split_band_into_windows()` | 超过 4000 字符的 band 在元素闭合标签处切分为多个窗口 | +| `reassemble_band_windows()` | 合并同一 band 的多个窗口结果 | +| `reassemble_jrxml()` | header + 所有修改后 band + footer → 完整 JRXML | +| `count_elements()` | 正则计数 textField/staticText/field(兼容命名空间前缀) | +| `validate_element_count()` | 校验元素数变化,>10% 回退到前一版本 | + +**LLM 每次只看到 ~2-4k 字符片段**,无法"重写整个报表"。header 部分完全不发给 LLM,原样保留。 + +#### `map_fields`:完全程序化替换(零 LLM 调用) + +`_programmatic_map_fields()` — 纯正则替换 `$F{field_N}` → OCR 真实字段名,100% 确定性。 + +`_sanitize_field_name()` — 非 ASCII 字符(中文/日文)转义为 `_uXXXX_` Unicode 码点格式,确保 JRXML 合法。 + +#### 新增测试 + +| 文件 | 用例数 | 覆盖 | +|------|--------|------| +| `tests/test_jrxml_windower.py` | 28 | 拆解/往返重组/窗口切分/元素计数/命名空间/多 section 多 band | +| `tests/test_programmatic_map_fields.py` | 20 | 字段声明替换/引用替换/中文转义/坐标保留/部分映射/空字段跳过 | + +完整测试套件(385 项)无回归。 diff --git a/agent/datasource.py b/agent/datasource.py new file mode 100644 index 0000000..2171a1f --- /dev/null +++ b/agent/datasource.py @@ -0,0 +1,115 @@ +"""数据源模式解析模块。 + +默认使用 $P{xxx} 参数模式;用户可选择 JDBC 直连模式。 +""" + +import json +import os +import re +from typing import Optional + +from dotenv import load_dotenv + +from agent.state import AgentState + +load_dotenv() + + +def resolve_datasource_mode(state: AgentState) -> str: + """返回数据源模式: "parameter" 或 "jdbc"。 + + 优先读取 state 中已设定的模式,否则根据用户输入检测。 + """ + existing = state.get("datasource_mode", "") + if existing in ("parameter", "jdbc"): + return existing + + user_input = state.get("user_input", "") + if _detect_jdbc_intent(user_input): + return "jdbc" + return "parameter" + + +def _detect_jdbc_intent(user_input: str) -> bool: + """检测用户是否想要 JDBC 直连数据库模式。""" + patterns = [ + r"(直连|直连数据库|数据库直连)", + r"(从|在)(数据库|DB|MySQL|PostgreSQL|Oracle|SQL Server)\w*", + r"(jdbc|JDBC)", + r"(连接|连)(数据库|DB)", + r"(查询|select|SELECT)\s", + ] + for pat in patterns: + if re.search(pat, user_input): + return True + return False + + +def _sanitize_url(url: str) -> str: + """剥离 JDBC URL 中的 user:password@ 片段,防止泄露到 LLM prompt。""" + return re.sub(r"://[^@]*@", "://***:***@", url) + + +def build_datasource_context(mode: str, kb_fields: list, db_config: Optional[dict] = None) -> str: + """构建数据源上下文字符串,注入生成 prompt。""" + if mode == "jdbc": + if not db_config or not db_config.get("url"): + return ( + "[数据源模式: JDBC]\n" + "⚠ 用户想要 JDBC 直连模式,但尚未配置数据库连接信息。\n" + "请先生成带 $P{xxx} 参数占位符的 JRXML,并提醒用户配置 JDBC 连接。" + ) + safe_url = _sanitize_url(db_config.get("url", "")) + return ( + "[数据源模式: JDBC]\n" + f"连接URL: {safe_url}\n" + f"驱动: {db_config.get('driver', '')}\n" + "请使用 中的 SQL 查询。" + ) + + # parameter mode + if kb_fields: + field_list = "\n".join( + f"| {f['name']} | {f.get('description', '')} | {f.get('type', 'java.lang.String')} |" + for f in kb_fields + ) + return ( + "[数据源模式: 参数]\n" + "使用 $P{xxx} 参数模式,以下为可用参数:\n" + f"| 参数名 | 含义 | 类型 |\n|---|---|---|\n{field_list}" + ) + return "[数据源模式: 参数]\n使用 $P{xxx} 参数模式生成 JRXML。" + + +def configure_jdbc(state: AgentState, url: str = "", driver: str = "", + username: str = "", password: str = "") -> dict: + """配置 JDBC 连接并返回更新字段。 + + 注意:db_config 会被存入 AgentState 并持久化到会话文件。 + 生产环境应使用外部密钥管理服务,避免明文存储密码。 + """ + return { + "datasource_mode": "jdbc", + "db_config": { + "url": url, + "driver": driver or "com.mysql.cj.jdbc.Driver", + "username": username, + "password": password, + }, + } + + +def ask_db_config(state: AgentState) -> Optional[str]: + """如果用户选了 JDBC 模式但未配置 DB 连接,返回反问消息。""" + mode = resolve_datasource_mode(state) + if mode == "jdbc": + db_config = state.get("db_config", {}) + if not db_config or not db_config.get("url"): + return ( + "您选择了数据库直连模式,请提供以下信息:\n" + "1. JDBC URL(如 jdbc:mysql://localhost:3306/dbname)\n" + "2. 数据库用户名\n" + "3. 数据库密码\n" + "4. 驱动类名(可选,默认 com.mysql.cj.jdbc.Driver)" + ) + return None diff --git a/agent/jrxml_windower.py b/agent/jrxml_windower.py new file mode 100644 index 0000000..33c9b56 --- /dev/null +++ b/agent/jrxml_windower.py @@ -0,0 +1,377 @@ +"""JRXML 窗口化拆解与重组工具。 + +用于 3 阶段生成管道的 refine_layout 和 map_fields 节点: +- 将大段 JRXML 按 band 拆解为独立窗口 +- 每个窗口独立发送给 LLM 进行坐标精调 +- 重组所有窗口 + 校验元素完整性 + +调用者: agent/nodes.py (refine_layout, map_fields) +""" + +from __future__ import annotations + +import re +from dataclasses import dataclass +from typing import Optional + +import defusedxml.ElementTree as ET + +from backend.logger import get_logger + +_windower_log = get_logger("jrxml.windower") + +# 需要按 section 拆解的 band 容器标签 +_SECTION_TAGS = { + "title", "pageHeader", "columnHeader", "detail", "columnFooter", + "pageFooter", "lastPageFooter", "summary", "noData", "background", +} + +# 不发给 LLM 的 header 元素(原样保留) +_HEADER_TAGS = { + "property", "propertyExpression", "import", "template", "reportFont", + "style", "subDataset", "scriptlet", "parameter", "queryString", + "field", "sortField", "variable", "filterExpression", "group", +} + + +@dataclass +class BandInfo: + """单个 band 的拆解信息。""" + section_name: str # 所属 section 名,如 "title", "detail" + band_index: int # 在该 section 中的序号(0-based) + band_xml: str # 完整 ... 原始 XML + element_count: int # textField + staticText 数量 + char_length: int # 字符数 + + @property + def label(self) -> str: + """用于日志和 prompt 的标识。""" + if self.band_index > 0: + return f"{self.section_name}_band{self.band_index}" + return self.section_name + + +@dataclass +class JRXMLParts: + """JRXML 拆解结果。""" + declaration: str # (如有) + root_open: str # + header_xml: str # fields/params/queryString 等(不发给 LLM) + bands: list[BandInfo] # 按出现顺序 + footer: str # + + @property + def band_count(self) -> int: + return len(self.bands) + + @property + def total_elements(self) -> int: + return sum(b.element_count for b in self.bands) + + +# ── 拆解 ────────────────────────────────────────────────────────── + +def decompose_jrxml(jrxml: str) -> Optional[JRXMLParts]: + """将 JRXML 字符串拆解为 header + bands + footer 三部分。 + + 使用 defusedxml.ElementTree 进行安全解析。 + 返回 None 表示解析失败。 + """ + try: + root = ET.fromstring(jrxml) + except ET.ParseError as e: + _windower_log.error("JRXML 解析失败: %s", e) + return None + + tag = _local_tag(root.tag) + if tag != "jasperReport": + _windower_log.error("根元素不是 jasperReport: %s", tag) + return None + + # 提取 XML 声明 + declaration = "" + if jrxml.strip().startswith("") + if decl_end != -1: + declaration = jrxml[:decl_end + 2] + + # 提取根元素属性来重建 root_open + root_open = _build_root_open(jrxml, root) + + # 分离 header 子元素和 section 子元素 + header_children = [] + section_children = [] # (section_tag, child_elem) + + for child in root: + child_tag = _local_tag(child.tag) + if child_tag in _HEADER_TAGS: + header_children.append(child) + elif child_tag in _SECTION_TAGS: + section_children.append((child_tag, child)) + + # 构建 header_xml:序列化所有 header 子元素 + header_parts = [] + for child in header_children: + header_parts.append(_elem_to_string(child)) + header_xml = "\n".join(header_parts) + + # 提取 bands:每个 section 内可能有多个 + bands = [] + for sec_tag, sec_elem in section_children: + for bi, band_elem in enumerate(sec_elem): + band_local = _local_tag(band_elem.tag) + if band_local != "band": + continue + band_xml = _elem_to_string(band_elem) + ec = _count_elements_in_text(band_xml) + bands.append(BandInfo( + section_name=sec_tag, + band_index=bi, + band_xml=band_xml, + element_count=ec, + char_length=len(band_xml), + )) + + # 提取 footer: 闭合标签 + footer = _extract_footer(jrxml) + + parts = JRXMLParts( + declaration=declaration, + root_open=root_open, + header_xml=header_xml, + bands=bands, + footer=footer, + ) + _windower_log.info( + "JRXML 拆解完成: %d bands, %d 个元素, header %d 字符", + len(bands), parts.total_elements, len(header_xml), + ) + return parts + + +# ── 窗口切分 ────────────────────────────────────────────────────── + +# 安全的元素边界:在这些闭合标签后切分 +_SAFE_SPLIT_CLOSING = re.compile( + r"(?:[\w:]+:)?(?:textField|staticText|line|rectangle|ellipse|image|" + r"frame|subreport|elementGroup|break|componentElement)>\s*" +) + + +def split_band_into_windows(band: BandInfo, max_chars: int = 4000) -> list[str]: + """将一个 band 的 XML 在元素边界处切分为多个窗口。 + + 每个窗口是合法的 XML 片段(完整的 ...), + 大小不超过 max_chars。 + """ + if band.char_length <= max_chars: + return [band.band_xml] + + inner = _extract_band_inner(band.band_xml) + if not inner: + return [band.band_xml] + + segments = _split_at_boundaries(inner, _SAFE_SPLIT_CLOSING) + if len(segments) <= 1: + return [band.band_xml] + + windows = _greedy_aggregate(segments, band.band_xml, max_chars) + return windows + + +# ── 重组 ────────────────────────────────────────────────────────── + +def reassemble_band_windows(modified_windows: list[str]) -> str: + """将多个窗口的修改结果重新合并为一个 band XML。 + + 策略:取第一个窗口的开头(band 标签)和最后一个窗口的结尾(/band 标签), + 中间拼接所有窗口内部的元素内容。 + """ + if len(modified_windows) == 1: + return modified_windows[0] + + first = modified_windows[0] + band_open_end = first.find(">") + if band_open_end == -1: + return "\n".join(modified_windows) + band_open = first[:band_open_end + 1] + + last = modified_windows[-1] + band_close = _extract_band_close(last) + + inner_parts = [] + for win in modified_windows: + inner = _extract_band_inner(win) + if inner: + inner_parts.append(inner) + + return band_open + "\n" + "\n".join(inner_parts) + "\n" + band_close + + +def reassemble_jrxml(parts: JRXMLParts, modified_bands: dict[str, str]) -> str: + """将修改后的 bands 与 header/footer 重新组装为完整 JRXML。 + + modified_bands 的 key 格式为 "{section_name}_band{index}" 或 "{section_name}"(index=0 时)。 + """ + result = [] + if parts.declaration: + result.append(parts.declaration) + result.append(parts.root_open) + if parts.header_xml.strip(): + result.append(parts.header_xml) + + current_section = None + for band in parts.bands: + if band.section_name != current_section: + if current_section is not None: + result.append(f"{current_section}>") + current_section = band.section_name + result.append(f"<{current_section}>") + + modified = modified_bands.get(band.label, band.band_xml) + result.append(modified) + + if current_section is not None: + result.append(f"{current_section}>") + + result.append(parts.footer) + return "\n".join(result) + + +# ── 元素计数与校验 ──────────────────────────────────────────────── + +_ELEMENT_RE = re.compile(r"<(?:[\w:]+:)?(textField|staticText|field)\b", re.IGNORECASE) + + +def count_elements(jrxml: str) -> int: + """正则计数 JRXML 中的 textField + staticText + field 声明。""" + return len(_ELEMENT_RE.findall(jrxml)) + + +def validate_element_count(original: str, modified: str, stage: str) -> dict: + """校验修改前后的元素数变化。 + + 返回: + {"ok": bool, "original": int, "modified": int, "change_pct": float} + 变化 > 10% 时 ok=False,调用方应回退。 + """ + orig = count_elements(original) + mod = count_elements(modified) + if orig == 0: + return {"ok": True, "original": 0, "modified": mod, "change_pct": 0} + change = abs(mod - orig) / orig + ok = change <= 0.10 + if not ok: + _windower_log.error( + "%s 元素数变化过大: %d → %d (%.1f%%)", + stage, orig, mod, change * 100, + ) + elif change > 0.05: + _windower_log.warning( + "%s 元素数有差异: %d → %d (%.1f%%)", + stage, orig, mod, change * 100, + ) + return {"ok": ok, "original": orig, "modified": mod, "change_pct": round(change, 4)} + + +# ── 内部工具函数 ────────────────────────────────────────────────── + +def _local_tag(tag: str) -> str: + """去除 XML 命名空间前缀。""" + return tag.split("}")[-1] if "}" in tag else tag + + +def _elem_to_string(elem: ET.Element) -> str: + """将 ElementTree 元素序列化为字符串(使用 defusedxml 的 tostring)。""" + raw = ET.tostring(elem, encoding="unicode") + return raw.strip() + + +def _build_root_open(jrxml: str, root: ET.Element) -> str: + """从原始文本重建 开头标签。""" + m = re.search(r"]*>", jrxml, re.IGNORECASE) + if m: + return m.group(0) + attrs = [] + for k, v in root.attrib.items(): + attrs.append(f'{k}="{v}"') + return "" + + +def _extract_footer(jrxml: str) -> str: + """提取 闭合标签。""" + m = re.search(r"(?:[\w:]+:)?jasperReport>\s*$", jrxml, re.IGNORECASE) + if m: + return m.group(0).rstrip() + return "" + + +_BAND_CLOSE_RE = re.compile(r"(?:[\w:]+:)?band>\s*$", re.IGNORECASE) + +def _extract_band_close(band_xml: str) -> str: + """提取 band 的闭合标签(兼容命名空间前缀),如 '' 或 ''。""" + m = _BAND_CLOSE_RE.search(band_xml) + return m.group(0).rstrip() if m else "" + +def _extract_band_inner(band_xml: str) -> str: + """提取 和 之间的内容(兼容命名空间前缀)。""" + tag_end = band_xml.find(">") + if tag_end == -1: + return "" + close_m = _BAND_CLOSE_RE.search(band_xml) + if not close_m: + return band_xml[tag_end + 1:].strip() + return band_xml[tag_end + 1:close_m.start()].strip() + + +def _split_at_boundaries(text: str, boundary_re: re.Pattern) -> list[str]: + """在正则匹配的闭合标签处切分文本。 + + 返回切分后的片段列表(分隔符附加到前一个片段末尾)。 + """ + segments = [] + last_end = 0 + for m in boundary_re.finditer(text): + end = m.end() + segments.append(text[last_end:end]) + last_end = end + if last_end < len(text): + segments.append(text[last_end:]) + elif not segments: + segments.append(text) + return segments + + +def _greedy_aggregate(segments: list[str], band_xml: str, max_chars: int) -> list[str]: + """贪心聚合:将片段组合成不超过 max_chars 的窗口。 + + 每个窗口包上 和 标签。 + """ + tag_end = band_xml.find(">") + band_open = band_xml[:tag_end + 1] if tag_end != -1 else "" + band_close = _extract_band_close(band_xml) + overhead = len(band_open) + len(band_close) + 1 # +1 for \n + + windows = [] + current = [] + current_len = overhead + + for seg in segments: + seg_len = len(seg) + if current and current_len + seg_len > max_chars: + windows.append(band_open + "\n" + "".join(current) + "\n" + band_close) + current = [seg] + current_len = overhead + seg_len + else: + current.append(seg) + current_len += seg_len + + if current: + windows.append(band_open + "\n" + "".join(current) + "\n" + band_close) + + return windows + + +def _count_elements_in_text(xml_text: str) -> int: + """统计 XML 文本中的 textField + staticText 数量。""" + return len(_ELEMENT_RE.findall(xml_text)) diff --git a/agent/nodes.py b/agent/nodes.py index c49eaf7..1097708 100644 --- a/agent/nodes.py +++ b/agent/nodes.py @@ -418,7 +418,8 @@ def load_session_node(state: AgentState) -> Dict: state["session_name"] = data.get("session_name", "") state["created_at"] = data.get("created_at", "") except Exception: - pass + _node_log.warning("会话加载失败,使用空状态", + extra={"session_id": state.get("session_id", "")}) return state @@ -454,7 +455,8 @@ def save_session_node(state: AgentState) -> Dict: state["session_name"] = session_name state["updated_at"] = persistable["updated_at"] except Exception: - pass + _node_log.exception("会话保存失败", + extra={"session_id": state.get("session_id", "")}) return state @@ -493,6 +495,90 @@ def _format_row_coordinates(row: dict) -> dict: return {"y_center": row.get("y_center", 0), "columns": cols} +def _build_sampled_text(ocr_rows: list) -> str: + """从 OCR 行数据构建采样坐标 JSON 字符串。""" + sampled = {} + if isinstance(ocr_rows, list) and len(ocr_rows) >= 1: + sampled["header_row"] = _format_row_coordinates(ocr_rows[0]) + if len(ocr_rows) > 1: + sampled["first_data_row"] = _format_row_coordinates(ocr_rows[1]) + if len(ocr_rows) > 2: + sampled["last_row"] = _format_row_coordinates(ocr_rows[-1]) + return json.dumps(sampled, ensure_ascii=False, indent=2) + + +def _extract_band_height(band_xml: str) -> int: + """从 中提取高度值。""" + m = re.search(r']*\sheight\s*=\s*"(\d+)"', band_xml) + return int(m.group(1)) if m else 0 + + +def _extract_xml_fragment(text: str) -> str: + """从 LLM 响应中提取 XML 片段(去除 markdown 代码块和解释文本)。""" + text = text.strip() + # 尝试提取 markdown 代码块内的内容 + m = re.search(r"```(?:xml)?\s*([\s\S]*?)```", text, re.IGNORECASE) + if m: + content = m.group(1).strip() + if content: + return content + # 尝试找到 ... 片段 + m = re.search(r"()", text, re.IGNORECASE) + if m: + return m.group(1).strip() + return text + + +def _programmatic_map_fields(jrxml: str, ocr_fields: list[dict]) -> str: + """程序化字段映射:将 $F{{field_N}} 替换为 OCR 提取的真实字段名。 + + 纯正则替换,不调 LLM。100% 确定性,零内容丢失。 + """ + result = jrxml + for i, f in enumerate(ocr_fields): + placeholder = f"field_{i+1}" + raw_name = f.get("field_name", "") + if not raw_name: + continue + real_name = _sanitize_field_name(raw_name) + if real_name == placeholder: + continue + # 替换 field 声明: ]*\bname\s*=\s*"){re.escape(placeholder)}(")', + rf'\g<1>{real_name}\g<2>', result, + ) + # 替换所有引用: $F{{field_1}} → $F{{customer_name}} + result = result.replace(f'$F{{{placeholder}}}', f'$F{{{real_name}}}') + return result + + +def _sanitize_field_name(name: str) -> str: + """将 OCR 字段名净化为合法的 JRXML field name(仅 ASCII 字母/数字/下划线)。 + + 非 ASCII 字符会被替换为其 Unicode 码点,确保唯一且合法。 + """ + result = [] + for ch in name: + if ch.isascii() and (ch.isalnum() or ch == '_'): + result.append(ch) + elif ch.isascii(): + result.append('_') + else: + # 非 ASCII 转 _uXXXX_ 格式,保留可追溯性 + cp = ord(ch) + result.append(f'_u{cp:04X}_') + cleaned = ''.join(result) + cleaned = cleaned.strip('_') + if not cleaned: + return "unnamed_field" + if cleaned[0].isdigit(): + cleaned = 'f_' + cleaned + # 压缩连续下划线 + cleaned = re.sub(r'_{2,}', '_', cleaned) + return cleaned.lower() + + def _format_ocr_context(state: AgentState) -> str: """将 OCR 提取结果格式化为 LLM 可用的上下文文本。""" ocr_result = state.get("ocr_extraction_result") @@ -619,27 +705,116 @@ def _log_ocr_layers(state: AgentState) -> None: @log_node("retrieve") def retrieve(state: AgentState) -> Dict: - """在 ChromaDB + 错误知识库中搜索相关的 JRXML 模板和组件。""" + """在 ChromaDB + 错误知识库中搜索相关的 JRXML 模板和组件。 + 支持按 KB 隔离搜索 + 模板意图检测。 + """ try: from backend.rag_adapter import search_chunks from backend.error_kb import search_error_cases user_input = state.get("user_input", "") - context = search_chunks(user_input, k=5) + kb_id = state.get("kb_id", "") + context = search_chunks(user_input, k=5, kb_id=kb_id) - # 如果有最近错误,同时搜索错误知识库 + # 错误知识库 error_msg = state.get("error_msg", "") if error_msg: error_context = search_error_cases(error_msg, k=2) if error_context: context = f"{context}\n\n[历史错误修正案例]\n{error_context}" + # 模板意图检测:用户是否提到了模板名? + template_keywords = _detect_template_intent(user_input) + if template_keywords and kb_id: + try: + from backend.kb_searcher import search_templates_in_kb + templates = search_templates_in_kb(kb_id, template_keywords, k=1) + if templates: + tmpl = templates[0] + state["kb_template_jrxml"] = tmpl.get("content", "") + state["kb_template_name"] = ( + tmpl.get("metadata", {}).get("report_name", "") + ) + context += ( + f"\n\n[匹配到模板: {state['kb_template_name']}]\n" + f"{state['kb_template_jrxml']}" + ) + except Exception: + _node_log.warning("模板检索失败", extra={"kb_id": kb_id}) + state["retrieved_context"] = context except Exception: + _node_log.exception("RAG 检索失败", extra={"user_input": user_input[:80]}) state["retrieved_context"] = "" return state +def _detect_template_intent(user_input: str) -> str: + """检测用户输入中是否包含模板引用意图,返回提取的搜索关键词。""" + import re + patterns = [ + r"根据(.+?)模板", + r"基于(.+?)模板", + r"参照(.+?)模板", + r"用(.+?)模板", + r"使用(.+?)模板", + r"(.+单)模板", + ] + for pat in patterns: + m = re.search(pat, user_input) + if m: + kw = m.group(1).strip() + if len(kw) >= 2: + return kw + return "" + + +def _build_template_context(state: dict) -> str: + """构建模板上下文,用于注入生成 prompt。 + 优先级:对话上传 > KB 检索 > KB 字段定义。 + """ + parts = [] + + # 对话中上传的 JRXML 模板 + uploaded = state.get("uploaded_template_jrxml", "") + if uploaded: + params = state.get("uploaded_template_params", []) + param_str = "\n".join( + f" - {p['name']} ({p.get('type', 'String')})" for p in params + ) if params else "(参数列表未解析)" + parts.append( + "[对话上传的模板]\n" + f"以下为用户上传的 JRXML 模板,请基于此模板进行修改:\n" + f"模板参数:\n{param_str}\n" + f"```xml\n{uploaded}\n```" + ) + + # KB 检索到的模板 + kb_tmpl = state.get("kb_template_jrxml", "") + kb_name = state.get("kb_template_name", "") + if kb_tmpl and not uploaded: + parts.append( + f"[知识库模板: {kb_name}]\n" + f"以下为从知识库检索到的 JRXML 模板,请作为结构参考:\n" + f"```xml\n{kb_tmpl}\n```" + ) + + # KB 字段定义 + kb_fields = state.get("kb_fields", []) + if kb_fields: + field_table = "\n".join( + f"| {f['name']} | {f.get('description', '')} | {f.get('type', 'String')} |" + for f in kb_fields + ) + parts.append( + "[可用数据字段]\n" + "生成 JRXML 时请使用以下字段作为 $P{{xxx}} 参数:\n" + f"| 字段名 | 含义 | 类型 |\n|---|---|---|\n{field_table}" + ) + + return "\n\n".join(parts) + + @log_node("generate") def generate(state: AgentState) -> Dict: """根据用户需求和检索到的上下文生成初始 JRXML。""" @@ -656,6 +831,7 @@ def generate(state: AgentState) -> Dict: prompt = load_prompt("initial_generation").format( context=state.get("retrieved_context", ""), user_request=user_request, + template_context=_build_template_context(state), ) full = [] for chunk in llm.stream(prompt): @@ -683,6 +859,7 @@ def generate_skeleton(state: AgentState) -> Dict: layout_schema=schema_text, context=state.get("retrieved_context", ""), user_request=user_request, + template_context=_build_template_context(state), ) prev_jrxml = state.get("current_jrxml", "") full_text = _generate_with_continuation(llm, prompt, writer, "generate_skeleton") @@ -700,92 +877,145 @@ def generate_skeleton(state: AgentState) -> Dict: @log_node("refine_layout") def refine_layout(state: AgentState) -> Dict: - """阶段二:使用采样坐标(表头 + 首行数据 + 最后一行)精确调整元素位置。""" + """阶段二:Band 级窗口化精调 — 拆解骨架 JRXML 为独立 band,逐窗口 LLM 调整坐标。 + + 流程: + 1. decompose_jrxml() 拆解为 header + bands + footer + 2. 每个 band 作为一个(或多个,若 >4000 字符)窗口发给 LLM + 3. LLM 只修改该窗口内 reportElement 的 x/y/width/height + 4. reassemble_jrxml() 重组 + validate_element_count() 校验 + """ from langgraph.config import get_stream_writer + from agent.jrxml_windower import ( + decompose_jrxml, split_band_into_windows, reassemble_band_windows, + reassemble_jrxml, validate_element_count, + ) writer = get_stream_writer() llm = get_llm(caller="refine_layout") - ocr_rows = state.get("ocr_elements", []) - sampled = {} - if isinstance(ocr_rows, list) and len(ocr_rows) >= 1: - sampled["header_row"] = _format_row_coordinates(ocr_rows[0]) - if len(ocr_rows) > 1: - sampled["first_data_row"] = _format_row_coordinates(ocr_rows[1]) - if len(ocr_rows) > 2: - sampled["last_row"] = _format_row_coordinates(ocr_rows[-1]) - sampled_text = json.dumps(sampled, ensure_ascii=False, indent=2) - - prompt = load_prompt("refine_layout").format( - current_jrxml=state.get("current_jrxml", ""), - sampled_coordinates=sampled_text, - ) prev_jrxml = state.get("current_jrxml", "") - full_text = _generate_with_continuation(llm, prompt, writer, "refine_layout") - if not full_text.strip(): - _node_log.error("refine_layout LLM 返回空响应,保留前一版本") + if not prev_jrxml.strip(): + _node_log.warning("refine_layout 无输入 JRXML,跳过") return state - jrxml = _extract_jrxml(full_text) - if len(jrxml.strip()) < 200: - _node_log.warning(f"refine_layout 输出过短({len(jrxml)} 字符),回退到前一版本") - jrxml = prev_jrxml - state["current_jrxml"] = jrxml - state["conversation_history"].append({"role": "assistant", "content": jrxml}) + + # 拆解 JRXML + parts = decompose_jrxml(prev_jrxml) + if parts is None or parts.band_count == 0: + _node_log.warning("refine_layout 拆解失败或无 band,跳过") + return state + + # 构建采样坐标 + ocr_rows = state.get("ocr_elements", []) + sampled_text = _build_sampled_text(ocr_rows) + template_ctx = _build_template_context(state) + + # 逐 band 窗口化精调 + modified_bands: dict[str, str] = {} + total_windows = 0 + for band in parts.bands: + if band.element_count == 0: + modified_bands[band.label] = band.band_xml + continue + + windows = split_band_into_windows(band, max_chars=4000) + total_windows += len(windows) + band_results: list[str] = [] + + for wi, win_xml in enumerate(windows): + prompt = load_prompt("refine_layout").format( + band_name=band.section_name, + band_index=band.band_index, + band_height=_extract_band_height(win_xml), + window_index=wi + 1, + total_windows=len(windows), + xml_fragment=win_xml, + sampled_coordinates=sampled_text, + template_context=template_ctx, + ) + try: + response = llm.invoke(prompt) + content = response.content if hasattr(response, "content") else str(response) + fragment = _extract_xml_fragment(content) + if fragment: + band_results.append(fragment) + writer({"type": "stream", "node": "refine_layout", + "text": f"[{band.label} 窗口 {wi+1}/{len(windows)} 完成] "}) + else: + _node_log.warning("refine_layout 窗口 %s/%d 返回空,使用原文", + band.label, wi + 1) + band_results.append(win_xml) + except Exception as e: + _node_log.warning("refine_layout 窗口 %s/%d LLM 失败: %s,使用原文", + band.label, wi + 1, e) + band_results.append(win_xml) + + if len(band_results) == 1: + modified_bands[band.label] = band_results[0] + else: + modified_bands[band.label] = reassemble_band_windows(band_results) + + # 重组并校验 + result = reassemble_jrxml(parts, modified_bands) + validation = validate_element_count(prev_jrxml, result, "refine_layout") + _node_log.info( + "refine_layout 窗口化完成: %d bands, %d 窗口, 元素 %d→%d (%.1f%%)", + parts.band_count, total_windows, + validation["original"], validation["modified"], + validation["change_pct"] * 100, + ) + + if not validation["ok"]: + _node_log.error("refine_layout 元素丢失过多,回退到骨架版本") + return state + + state["current_jrxml"] = result + state["conversation_history"].append({"role": "assistant", "content": result}) return state @log_node("map_fields") def map_fields(state: AgentState) -> Dict: - """阶段三:将占位字段名替换为 OCR 提取的真实字段名。""" - from langgraph.config import get_stream_writer + """阶段三:程序化字段映射 — 用正则将 $F{field_N} 替换为 OCR 字段名,不调 LLM。 - writer = get_stream_writer() - llm = get_llm(caller="map_fields") + 仅当 OCR 字段名包含中文等需要语义解释时才回退到 LLM。 + """ + from agent.jrxml_windower import validate_element_count - ocr_result = state.get("ocr_extraction_result", {}) - fields_text = "" - if isinstance(ocr_result, dict) and ocr_result.get("fields"): - field_descs = [] - for f in ocr_result["fields"]: - fname = f.get("field_name", "") - fval = f.get("field_value", "") - if fname: - field_descs.append(f" - {fname}: {fval}") - if field_descs: - fields_text = "提取的字段:\n" + "\n".join(field_descs) - if not fields_text: - elements = ocr_result.get("elements", []) if isinstance(ocr_result, dict) else [] - if elements: - texts = [e.get("text", "") for e in elements if e.get("text")] - fields_text = "OCR 文本内容:\n" + "\n".join(f" - {t}" for t in texts[:50]) - - prompt = load_prompt("field_mapping").format( - current_jrxml=state.get("current_jrxml", ""), - ocr_fields=fields_text, - ) prev_jrxml = state.get("current_jrxml", "") - full_text = _generate_with_continuation(llm, prompt, writer, "map_fields") - # 空响应重试:有时 LLM 第一轮不输出,换个方式再试一次 - if not full_text.strip(): - _node_log.warning("map_fields 第一轮返回空响应,尝试简化 prompt 重试") - retry_prompt = ( - "请将以下 JRXML 中的占位字段名 $F{field_1}, $F{field_2}, ... 替换为 OCR 提取的真实字段名。\n" - "规则:根据列顺序映射——$F{field_1} 对应第1列,$F{field_2} 对应第2列,以此类推。\n" - "同时更新 声明和所有 $F{...} 引用。\n" - "只输出完整 JRXML,不要解释。\n\n" - f"OCR 字段:\n{fields_text}\n\n" - f"JRXML:\n{prev_jrxml}" - ) - full_text = _generate_with_continuation(llm, retry_prompt, writer, "map_fields") - if not full_text.strip(): - _node_log.error("map_fields LLM 重试后仍返回空响应,保留占位字段版本") + if not prev_jrxml.strip(): + _node_log.warning("map_fields 无输入 JRXML,跳过") return state - jrxml = _extract_jrxml(full_text) - if len(jrxml.strip()) < 200: - _node_log.warning(f"map_fields 输出过短({len(jrxml)} 字符),回退到前一版本") - jrxml = prev_jrxml - state["current_jrxml"] = jrxml - state["conversation_history"].append({"role": "assistant", "content": jrxml}) + + # 提取 OCR 字段列表 + ocr_result = state.get("ocr_extraction_result", {}) + ocr_fields: list[dict] = [] + if isinstance(ocr_result, dict) and ocr_result.get("fields"): + ocr_fields = ocr_result["fields"] + + if not ocr_fields: + _node_log.info("map_fields 无 OCR 字段,保留占位字段名") + state["conversation_history"].append({"role": "assistant", "content": prev_jrxml}) + return state + + # 程序化替换(主路径) + result = _programmatic_map_fields(prev_jrxml, ocr_fields) + + # 校验 + validation = validate_element_count(prev_jrxml, result, "map_fields") + _node_log.info( + "map_fields 程序化完成: %d 个字段, 元素 %d→%d (%.1f%%)", + len(ocr_fields), + validation["original"], validation["modified"], + validation["change_pct"] * 100, + ) + + if not validation["ok"]: + _node_log.error("map_fields 元素丢失过多,回退到前一版本") + return state + + state["current_jrxml"] = result + state["conversation_history"].append({"role": "assistant", "content": result}) return state @@ -810,6 +1040,7 @@ def modify_jrxml(state: AgentState) -> Dict: conversation_history=conv_text, modification_request=state.get("user_modification_request", ""), ocr_context=_format_ocr_context(state), + template_context=_build_template_context(state), ) prev_jrxml = state.get("current_jrxml", "") full_text = _generate_with_continuation(llm, prompt, writer, "modify_jrxml") @@ -1181,6 +1412,7 @@ def correct_jrxml(state: AgentState) -> Dict: ocr_context=ocr_context, layout_schema_text=layout_text, fidelity_context=fidelity_text, + template_context=_build_template_context(state), ) # 保存修正前状态(供 validate 判断是否写入错误知识库) state["last_error_case"] = { diff --git a/agent/state.py b/agent/state.py index 9ca14ed..c92db82 100644 --- a/agent/state.py +++ b/agent/state.py @@ -51,3 +51,14 @@ class AgentState(TypedDict, total=False): # 需求9:分层精确生成 layout_schema: dict # extract_layout_schema() 输出,列+区域结构 ocr_elements: list # OCR 原始行数据(用于阶段二坐标采样) + + # 需求10:多租户知识库 + kb_id: str # 当前会话绑定的知识库 ID + kb_fields: list # KB 提取的字段定义 [{name, description, type, required}] + kb_field_mapping: dict # OCR 字段 → KB 字段映射 {"工单号": "billNo", ...} + uploaded_template_jrxml: str # 对话中上传的 JRXML 模板原文 + uploaded_template_params: list # 解析出的参数 [{name, type}] + kb_template_jrxml: str # 从 KB 检索到的模板 JRXML + kb_template_name: str # 检索到的模板名称 + datasource_mode: str # "parameter" 或 "jdbc" + db_config: dict # JDBC 连接配置 diff --git a/api_server.py b/api_server.py index 5c797d5..558c205 100644 --- a/api_server.py +++ b/api_server.py @@ -30,7 +30,7 @@ from pathlib import Path from typing import Optional from dotenv import load_dotenv -from fastapi import FastAPI, HTTPException, UploadFile, File +from fastapi import FastAPI, HTTPException, UploadFile, File, Form, BackgroundTasks from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import StreamingResponse, FileResponse @@ -50,6 +50,13 @@ from backend.session import ( ) from backend.file_parser import parse_file from backend.layout_analyzer import analyze_layout, extract_layout_schema +from backend.kb_manager import ( + create_user, list_users, get_user, delete_user, + create_kb, list_kbs, get_kb, update_kb_meta, delete_kb, + get_kb_raw_dir, +) +from backend.kb_parser import parse_jrxml_fields, build_kb_from_files +from backend.kb_searcher import search_kb, search_templates_in_kb # ───────────────────────────────────────────── # 常量(从 app.py 迁移) @@ -97,6 +104,7 @@ SKIP_NODES = {"load_session", "process_input", "manage_context", _api_log = get_logger("api") UPLOADS_DIR = Path(os.getenv("UPLOADS_DIR", "./uploads")) +MAX_UPLOAD_SIZE = 50 * 1024 * 1024 # 50 MB def _check_session_id(session_id: str) -> None: """校验 session_id 合法性(防路径穿越),非法时抛出 HTTPException(400)。""" @@ -380,6 +388,218 @@ async def remove_session(session_id: str): return {"status": "deleted", "session_id": session_id} +# ───────────────────────────────────────────── +# 用户管理 +# ───────────────────────────────────────────── + +@app.post("/api/users") +async def create_new_user(payload: dict): + name = payload.get("name", "").strip() + if not name: + raise HTTPException(status_code=400, detail="用户名不能为空") + try: + user = create_user(name) + return user + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@app.get("/api/users") +async def list_all_users(): + return {"users": list_users()} + + +@app.get("/api/users/{user_id}") +async def get_user_info(user_id: str): + user = get_user(user_id) + if user is None: + raise HTTPException(status_code=404, detail="用户不存在") + return user + + +@app.delete("/api/users/{user_id}") +async def remove_user(user_id: str): + ok = delete_user(user_id) + if not ok: + raise HTTPException(status_code=404, detail="用户不存在") + return {"status": "deleted", "user_id": user_id} + + +# ───────────────────────────────────────────── +# 知识库 CRUD +# ───────────────────────────────────────────── + +@app.get("/api/users/{user_id}/kbs") +async def list_user_kbs(user_id: str): + return {"kbs": list_kbs(user_id)} + + +@app.post("/api/users/{user_id}/kbs") +async def create_user_kb(user_id: str, payload: dict): + name = payload.get("name", "").strip() + description = payload.get("description", "") + if not name: + raise HTTPException(status_code=400, detail="知识库名称不能为空") + try: + kb = create_kb(user_id, name, description) + return kb + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + +@app.get("/api/kbs/{kb_id}") +async def get_kb_info(kb_id: str): + kb = get_kb(kb_id) + if kb is None: + raise HTTPException(status_code=404, detail="知识库不存在") + return kb + + +@app.delete("/api/kbs/{kb_id}") +async def remove_kb(kb_id: str): + ok = delete_kb(kb_id) + if not ok: + raise HTTPException(status_code=404, detail="知识库不存在") + return {"status": "deleted", "kb_id": kb_id} + + +# ───────────────────────────────────────────── +# 知识库文件上传 +# ───────────────────────────────────────────── + +@app.post("/api/kbs/{kb_id}/upload") +async def upload_to_kb(kb_id: str, file: UploadFile = File(...)): + kb = get_kb(kb_id) + if kb is None: + raise HTTPException(status_code=404, detail="知识库不存在") + + raw_dir = get_kb_raw_dir(kb_id) + if raw_dir is None: + raise HTTPException(status_code=500, detail="知识库存储目录不可用") + + raw_dir.mkdir(parents=True, exist_ok=True) + safe_name = Path(file.filename or "upload").name + dest = raw_dir / safe_name + + content = await file.read() + if len(content) > MAX_UPLOAD_SIZE: + raise HTTPException(status_code=413, detail="文件大小超过 50MB 上限") + + dest.write_bytes(content) + + from backend.kb_parser import process_file_for_kb + result = process_file_for_kb(kb_id, str(dest), source_name=safe_name) + + _api_log.info("KB文件上传", extra={ + "kb_id": kb_id, "file": safe_name, "type": result.get("type"), + }) + + return { + "filename": safe_name, + "type": result.get("type", ""), + "error": result.get("error"), + } + + +@app.post("/api/kbs/{kb_id}/build") +async def build_kb(kb_id: str): + """构建知识库:对已上传的文件执行 chunk → embed 管线。""" + from backend.kb_parser import build_kb_from_files as build_fn + raw_dir = get_kb_raw_dir(kb_id) + if raw_dir is None or not raw_dir.exists(): + raise HTTPException(status_code=404, detail="知识库无已上传文件") + + files = [str(p) for p in raw_dir.iterdir() if p.is_file()] + if not files: + raise HTTPException(status_code=400, detail="知识库无文件,请先上传") + + result = build_fn(kb_id, files) + return result + + +@app.get("/api/kbs/{kb_id}/status") +async def kb_status(kb_id: str): + kb = get_kb(kb_id) + if kb is None: + raise HTTPException(status_code=404, detail="知识库不存在") + return { + "kb_id": kb_id, + "name": kb.get("name", ""), + "field_count": len(kb.get("fields", [])), + "template_count": len(kb.get("templates", [])), + "file_count": kb.get("file_count", 0), + "chunk_count": kb.get("chunk_count", 0), + "parse_status": kb.get("parse_status", "empty"), + "created_at": kb.get("created_at", ""), + } + + +@app.get("/api/kbs/{kb_id}/fields") +async def kb_fields(kb_id: str): + kb = get_kb(kb_id) + if kb is None: + raise HTTPException(status_code=404, detail="知识库不存在") + return {"fields": kb.get("fields", []), "templates": kb.get("templates", [])} + + +@app.get("/api/kbs/{kb_id}/search") +async def kb_search(kb_id: str, q: str = "", type: str = ""): + if not q: + raise HTTPException(status_code=400, detail="查询参数 q 不能为空") + if type == "template": + results = search_templates_in_kb(kb_id, q, k=5) + else: + ctx = search_kb(kb_id, q, k=5) + return {"query": q, "context": ctx} + return {"query": q, "results": results} + + +# ───────────────────────────────────────────── +# 会话-知识库绑定 +# ───────────────────────────────────────────── + +@app.put("/api/sessions/{session_id}/kb") +async def bind_session_kb(session_id: str, payload: dict): + _check_session_id(session_id) + kb_id = payload.get("kb_id", "").strip() + data = load_session(session_id) + if data is None: + raise HTTPException(status_code=404, detail="会话不存在") + + agent_state = data.get("agent_state", {}) + if kb_id: + kb = get_kb(kb_id) + if kb is None: + raise HTTPException(status_code=404, detail="知识库不存在") + agent_state["kb_id"] = kb_id + agent_state["kb_fields"] = kb.get("fields", []) + else: + agent_state.pop("kb_id", None) + agent_state.pop("kb_fields", None) + + save_session(session_id, agent_state) + return {"session_id": session_id, "kb_id": kb_id or None} + + +@app.get("/api/sessions/{session_id}/kb") +async def get_session_kb(session_id: str): + _check_session_id(session_id) + data = load_session(session_id) + if data is None: + raise HTTPException(status_code=404, detail="会话不存在") + agent_state = data.get("agent_state", {}) + kb_id = agent_state.get("kb_id", "") + result = {"kb_id": kb_id, "kb_fields": agent_state.get("kb_fields", [])} + if kb_id: + kb = get_kb(kb_id) + if kb: + result["kb_name"] = kb.get("name", "") + result["templates"] = kb.get("templates", []) + return result + + # ───────────────────────────────────────────── # 文件上传 # ───────────────────────────────────────────── @@ -396,6 +616,9 @@ async def upload_file(file: UploadFile = File(...), session_id: str = ""): dest = _ensure_upload_dir(session_id) / f"{file_id}_{safe_name}" content = await file.read() + if len(content) > MAX_UPLOAD_SIZE: + raise HTTPException(status_code=413, detail="文件大小超过 50MB 上限") + dest.write_bytes(content) content_type = file.content_type or mimetypes.guess_type(safe_name)[0] or "application/octet-stream" @@ -423,20 +646,47 @@ async def upload_file(file: UploadFile = File(...), session_id: str = ""): # 文件处理辅助 # ───────────────────────────────────────────── -def _process_files(file_ids: list[str], session_id: str) -> dict: - """处理上传的文件:解析 → 布局分析 → 提取 schema 文本。 +def _parse_jrxml_file(file_path: str) -> dict: + """解析上传的 JRXML 文件,提取模板参数和字段。 Returns: - {full_prompt_prefix, uploaded_paths, layout_schema, ocr_text} + {jrxml_text, parameters: [{name, type}], fields: [{name, type}], + query: str, report_name: str, page_width: str, page_height: str} + """ + jrxml_info = parse_jrxml_fields(file_path) + try: + raw_xml = Path(file_path).read_text(encoding="utf-8") + except Exception: + raw_xml = "" + return { + "jrxml_text": raw_xml, + "parameters": jrxml_info.get("parameters", []), + "fields": jrxml_info.get("fields", []), + "query": jrxml_info.get("query", ""), + "report_name": jrxml_info.get("report_name", ""), + "page_width": jrxml_info.get("page_width", ""), + "page_height": jrxml_info.get("page_height", ""), + "error": jrxml_info.get("error"), + } + + +def _process_files(file_ids: list[str], session_id: str) -> dict: + """处理上传的文件:解析 → 布局分析 → 提取 schema 文本。 + JRXML 文件额外解析为模板上下文注入 agent_state。 + + Returns: + {full_prompt_prefix, uploaded_paths, layout_schema, ocr_text, + jrxml_template: dict | None} """ if not file_ids: return {"full_prompt_prefix": "", "uploaded_paths": [], - "layout_schema": {}, "ocr_text": ""} + "layout_schema": {}, "ocr_text": "", "jrxml_template": None} parts = [] uploaded_paths = [] layout_schema = {} ocr_text = "" + jrxml_template = None for fid in file_ids: info = _file_registry.get(fid) @@ -446,8 +696,33 @@ def _process_files(file_ids: list[str], session_id: str) -> dict: file_path = info["path"] uploaded_paths.append(file_path) + suffix = Path(info["filename"]).suffix.lower() - parsed = parse_file(file_path, Path(info["filename"]).suffix) + # JRXML 文件 → 解析为模板 + if suffix == ".jrxml": + jrxml_template = _parse_jrxml_file(file_path) + if jrxml_template.get("error"): + parts.append(f"[JRXML 模板: {info['filename']}]\n解析失败: {jrxml_template['error']}") + else: + params = jrxml_template["parameters"] + fields = jrxml_template["fields"] + param_desc = "\n".join( + f" - {p['name']} ({p.get('type', 'String')})" for p in params + ) if params else " (无参数)" + field_desc = "\n".join( + f" - {f['name']} ({f.get('type', 'String')})" for f in fields + ) if fields else " (无字段)" + parts.append( + f"[上传的 JRXML 模板: {jrxml_template['report_name'] or info['filename']}]\n" + f"页面尺寸: {jrxml_template['page_width']}x{jrxml_template['page_height']}\n" + f"参数列表:\n{param_desc}\n" + f"字段列表:\n{field_desc}\n" + f"SQL查询: {jrxml_template['query'] or '(无)'}\n" + f"--- XML 内容 ---\n{jrxml_template['jrxml_text']}" + ) + continue + + parsed = parse_file(file_path, suffix) if parsed.get("error"): parts.append(f"[文件: {info['filename']}]\n解析失败: {parsed['error']}") continue @@ -490,6 +765,7 @@ def _process_files(file_ids: list[str], session_id: str) -> dict: "uploaded_paths": uploaded_paths, "layout_schema": layout_schema, "ocr_text": ocr_text, + "jrxml_template": jrxml_template, } @@ -543,6 +819,12 @@ async def chat(session_id: str, payload: dict): if file_result.get("uploaded_paths"): agent_state["uploaded_file_path"] = file_result["uploaded_paths"][0] + # ── 注入 JRXML 模板(对话中上传的模板)── + jrxml_tmpl = file_result.get("jrxml_template") + if jrxml_tmpl and not jrxml_tmpl.get("error"): + agent_state["uploaded_template_jrxml"] = jrxml_tmpl["jrxml_text"] + agent_state["uploaded_template_params"] = jrxml_tmpl["parameters"] + # ── 设置本轮输入 ── if agent_state.get("current_jrxml"): agent_state["user_modification_request"] = full_prompt @@ -591,7 +873,7 @@ async def chat(session_id: str, payload: dict): # ───────────────────────────────────────────── @app.get("/api/sessions/{session_id}/download/latest") -async def download_latest(session_id: str): +async def download_latest(session_id: str, background_tasks: BackgroundTasks): """下载最新 JRXML 文件。""" _check_session_id(session_id) data = load_session(session_id) @@ -607,6 +889,7 @@ async def download_latest(session_id: str): encoding="utf-8") tmp.write(jrxml) tmp.close() + background_tasks.add_task(os.unlink, tmp.name) return FileResponse( tmp.name, @@ -616,7 +899,7 @@ async def download_latest(session_id: str): @app.get("/api/sessions/{session_id}/download/{version}") -async def download_version(session_id: str, version: int): +async def download_version(session_id: str, version: int, background_tasks: BackgroundTasks): """下载指定版本的 JRXML 文件。""" _check_session_id(session_id) data = load_session(session_id) @@ -635,6 +918,7 @@ async def download_version(session_id: str, version: int): encoding="utf-8") tmp.write(jrxml) tmp.close() + background_tasks.add_task(os.unlink, tmp.name) return FileResponse( tmp.name, diff --git a/backend/field_matcher.py b/backend/field_matcher.py new file mode 100644 index 0000000..3d3e19b --- /dev/null +++ b/backend/field_matcher.py @@ -0,0 +1,136 @@ +"""OCR 字段 → KB 字段匹配模块。 + +两阶段匹配: +1. Embedding 粗筛(相似度 top-3) +2. LLM 精确确认 + +返回映射: {"工单号": "billNo", "客户名称": "customerName", ...} +""" + +import json +import os +from typing import Optional + +from dotenv import load_dotenv + +from backend.logger import get_logger + +load_dotenv() + +_match_log = get_logger("field_matcher") + + +def _embed(text: str) -> list: + """获取文本的向量嵌入。""" + from backend.rag_adapter import _get_searcher + searcher = _get_searcher() + if searcher._model is None: + _ = searcher.model + emb = searcher.model.encode(text, normalize_embeddings=True, show_progress_bar=False) + return emb.tolist() + + +def _cosine_similarity(a: list, b: list) -> float: + """余弦相似度(假设向量已归一化,点积即相似度)。""" + return sum(x * y for x, y in zip(a, b)) + + +def match_ocr_to_kb(ocr_fields: list[str], kb_fields: list[dict], + llm=None) -> dict[str, str]: + """将 OCR 提取的字段名匹配到 KB 字段定义。 + + Args: + ocr_fields: OCR 提取的中文字段名列表 + kb_fields: KB 字段定义 [{"name": "billNo", "description": "工单号", ...}] + llm: 可选的 LLM 实例,用于精确确认 + + Returns: + {"工单号": "billNo", "客户": "customerName", ...} + """ + if not ocr_fields or not kb_fields: + return {} + + result = {} + + # 阶段 1: Embedding 粗筛 + try: + ocr_embs = {f: _embed(f) for f in ocr_fields} + kb_embs = {f["name"]: _embed(f.get("description", f["name"])) for f in kb_fields} + except Exception as e: + _match_log.warning("Embedding 匹配失败,回退到 LLM: %s", e) + return _match_via_llm(ocr_fields, kb_fields, llm) + + candidates = {} + for ocr_name, ocr_emb in ocr_embs.items(): + scored = [] + for kb_name, kb_emb in kb_embs.items(): + sim = _cosine_similarity(ocr_emb, kb_emb) + scored.append((kb_name, sim)) + scored.sort(key=lambda x: x[1], reverse=True) + candidates[ocr_name] = scored[:3] + + # 阶段 2: LLM 精确确认 + if llm: + confirmed = _match_via_llm(ocr_fields, kb_fields, llm, candidates) + result.update(confirmed) + else: + for ocr_name, cands in candidates.items(): + if cands and cands[0][1] > 0.5: + result[ocr_name] = cands[0][0] + + return result + + +def _match_via_llm(ocr_fields: list[str], kb_fields: list[dict], + llm, candidates: Optional[dict] = None) -> dict[str, str]: + """使用 LLM 精确确认字段映射。""" + kb_desc = "\n".join( + f"- {f['name']}: {f.get('description', '')} ({f.get('type', 'java.lang.String')})" + for f in kb_fields + ) + + candidates_hint = "" + if candidates: + cand_lines = [] + for ocr_name, cands in candidates.items(): + cand_str = ", ".join(f"{n}({s:.2f})" for n, s in cands) + cand_lines.append(f" {ocr_name} -> 候选: {cand_str}") + candidates_hint = ( + "向量相似度候选(仅供参考,请根据语义确认):\n" + + "\n".join(cand_lines) + ) + + prompt = ( + "请将以下 OCR 识别的字段名匹配到知识库定义的字段。\n\n" + f"OCR 字段: {json.dumps(ocr_fields, ensure_ascii=False)}\n\n" + f"知识库字段:\n{kb_desc}\n\n" + f"{candidates_hint}\n\n" + "请以 JSON 对象格式输出映射关系,键为 OCR 字段名,值为 KB 字段名:\n" + '{"工单号": "billNo", "客户名称": "customerName"}' + ) + + try: + response = llm.invoke(prompt) + content = response.content if hasattr(response, "content") else str(response) + start = content.find("{") + end = content.rfind("}") + 1 + if start >= 0 and end > start: + return json.loads(content[start:end]) + except Exception as e: + _match_log.warning("LLM 字段匹配失败: %s", e) + + return {} + + +def format_field_mapping_context(mapping: dict[str, str]) -> str: + """将字段映射格式化为 prompt 上下文字符串。""" + if not mapping: + return "" + + lines = ["[字段映射 — OCR -> KB]", + "请在 JRXML 中使用以下参数名:", + "| OCR 字段 | JRXML 参数 |", + "|---|---|"] + for ocr_name, kb_name in mapping.items(): + lines.append(f"| {ocr_name} | $P{{{kb_name}}} |") + return "\n".join(lines) diff --git a/backend/kb_manager.py b/backend/kb_manager.py new file mode 100644 index 0000000..be3bf66 --- /dev/null +++ b/backend/kb_manager.py @@ -0,0 +1,227 @@ +"""多租户知识库管理模块。 + +用户 + 知识库 CRUD,持久化到 kb_data/ 目录。 +每个 KB 拥有独立的 JSON 元数据文件和文件存储目录。 +""" + +import json +import os +import re +import uuid +import tempfile +import shutil +from datetime import datetime, timezone +from pathlib import Path +from typing import Optional + +from dotenv import load_dotenv +from backend.logger import get_logger + +load_dotenv() + +_kb_log = get_logger("kb_manager") + +KB_DATA_DIR = Path(os.getenv("KB_DATA_DIR", "./kb_data")) +_USERS_FILE = KB_DATA_DIR / "users.json" + +_VALID_ID_RE = re.compile(r'^[a-fA-F0-9]{12,}$') + + +def _validate_id(id_str: str, label: str = "id") -> None: + if not _VALID_ID_RE.match(id_str): + raise ValueError(f"Invalid {label}: {id_str!r}") + + +def _now_iso() -> str: + return datetime.now(timezone.utc).isoformat() + + +def _ensure_dir(path: Path) -> None: + path.mkdir(parents=True, exist_ok=True) + + +def _read_json(fp: Path) -> dict: + with open(fp, "r", encoding="utf-8") as f: + return json.load(f) + + +def _write_json_atomic(fp: Path, data: dict) -> None: + _ensure_dir(fp.parent) + tmp = tempfile.NamedTemporaryFile( + mode="w", suffix=".json", delete=False, + dir=fp.parent, encoding="utf-8", + ) + try: + json.dump(data, tmp, ensure_ascii=False, indent=2) + tmp.flush() + os.fsync(tmp.fileno()) + tmp.close() + os.replace(tmp.name, str(fp)) + except Exception: + tmp.close() + Path(tmp.name).unlink(missing_ok=True) + raise + + +# ── User CRUD ────────────────────────────────────────────────────────────── + +def _load_users() -> list[dict]: + _ensure_dir(KB_DATA_DIR) + if _USERS_FILE.exists(): + return _read_json(_USERS_FILE) + return [] + + +def _save_users(users: list[dict]) -> None: + _write_json_atomic(_USERS_FILE, users) + + +def create_user(name: str, user_id: Optional[str] = None) -> dict: + uid = user_id or uuid.uuid4().hex + users = _load_users() + if any(u["user_id"] == uid for u in users): + raise ValueError(f"User {uid} already exists") + user = {"user_id": uid, "name": name, "created_at": _now_iso()} + users.append(user) + _save_users(users) + _ensure_dir(KB_DATA_DIR / uid) + _write_json_atomic(KB_DATA_DIR / uid / "profile.json", user) + _kb_log.info("创建用户", extra={"user_id": uid, "user_name": name}) + return user + + +def list_users() -> list[dict]: + return _load_users() + + +def get_user(user_id: str) -> Optional[dict]: + _validate_id(user_id, "user_id") + for u in _load_users(): + if u["user_id"] == user_id: + return u + return None + + +def delete_user(user_id: str) -> bool: + _validate_id(user_id, "user_id") + users = _load_users() + filtered = [u for u in users if u["user_id"] != user_id] + if len(filtered) == len(users): + return False + _save_users(filtered) + user_dir = KB_DATA_DIR / user_id + if user_dir.exists(): + shutil.rmtree(user_dir) + _kb_log.info("删除用户", extra={"user_id": user_id}) + return True + + +# ── KB CRUD ──────────────────────────────────────────────────────────────── + +def _kb_dir(kb_id: str) -> Optional[Path]: + _validate_id(kb_id, "kb_id") + for user_dir in KB_DATA_DIR.iterdir(): + if user_dir.is_dir() and not user_dir.name.startswith("."): + candidate = user_dir / kb_id + if candidate.is_dir(): + return candidate + return None + + +def _ensure_user_dir(user_id: str) -> Path: + _validate_id(user_id, "user_id") + d = KB_DATA_DIR / user_id + _ensure_dir(d) + return d + + +def create_kb(user_id: str, name: str, description: str = "", + kb_id: Optional[str] = None) -> dict: + user_dir = _ensure_user_dir(user_id) + kid = kb_id or uuid.uuid4().hex + kb_dir = user_dir / kid + _ensure_dir(kb_dir) + _ensure_dir(kb_dir / "raw") + + now = _now_iso() + meta = { + "kb_id": kid, "user_id": user_id, "name": name, + "description": description, "created_at": now, "updated_at": now, + "fields": [], "templates": [], "file_count": 0, + "chunk_count": 0, "parse_status": "empty", + } + _write_json_atomic(kb_dir / "meta.json", meta) + _kb_log.info("创建知识库", extra={"kb_id": kid, "user_id": user_id, "kb_name": name}) + return meta + + +def list_kbs(user_id: str) -> list[dict]: + user_dir = _ensure_user_dir(user_id) + kbs = [] + for kb_dir in sorted(user_dir.iterdir(), key=os.path.getmtime, reverse=True): + if kb_dir.is_dir() and not kb_dir.name.startswith("."): + meta_path = kb_dir / "meta.json" + if meta_path.exists(): + meta = _read_json(meta_path) + kbs.append({ + "kb_id": meta.get("kb_id", kb_dir.name), + "name": meta.get("name", kb_dir.name), + "description": meta.get("description", ""), + "created_at": meta.get("created_at", ""), + "updated_at": meta.get("updated_at", ""), + "field_count": len(meta.get("fields", [])), + "template_count": len(meta.get("templates", [])), + "file_count": meta.get("file_count", 0), + "chunk_count": meta.get("chunk_count", 0), + "parse_status": meta.get("parse_status", "empty"), + }) + return kbs + + +def get_kb(kb_id: str) -> Optional[dict]: + _validate_id(kb_id, "kb_id") + kb_dir = _kb_dir(kb_id) + if kb_dir is None: + return None + meta_path = kb_dir / "meta.json" + return _read_json(meta_path) if meta_path.exists() else None + + +def update_kb_meta(kb_id: str, updates: dict) -> Optional[dict]: + kb_dir = _kb_dir(kb_id) + if kb_dir is None: + return None + meta_path = kb_dir / "meta.json" + meta = _read_json(meta_path) + meta.update(updates) + meta["updated_at"] = _now_iso() + _write_json_atomic(meta_path, meta) + return meta + + +def delete_kb(kb_id: str) -> bool: + kb_dir = _kb_dir(kb_id) + if kb_dir is None: + return False + shutil.rmtree(kb_dir) + _kb_log.info("删除知识库", extra={"kb_id": kb_id}) + return True + + +def get_kb_raw_dir(kb_id: str) -> Optional[Path]: + kb_dir = _kb_dir(kb_id) + return kb_dir / "raw" if kb_dir else None + + +def get_kb_chunks_path(kb_id: str) -> Optional[Path]: + kb_dir = _kb_dir(kb_id) + return kb_dir / "chunks.json" if kb_dir else None + + +def get_kb_chroma_path(kb_id: str) -> Optional[Path]: + kb_dir = _kb_dir(kb_id) + if kb_dir is None: + return None + chroma_dir = kb_dir / "chroma" + _ensure_dir(chroma_dir) + return chroma_dir diff --git a/backend/kb_parser.py b/backend/kb_parser.py new file mode 100644 index 0000000..1bc13ad --- /dev/null +++ b/backend/kb_parser.py @@ -0,0 +1,336 @@ +"""KB 解析管道 — 文件提取→字段解析→chunk 切割→向量嵌入。 + +调用者: api_server.py (upload endpoint), scripts/init_default_kb.py +""" + +import os +import json +import shutil +import zipfile +import tarfile +import tempfile +import defusedxml.ElementTree as ET +from pathlib import Path +from typing import Optional + +from dotenv import load_dotenv +from backend.logger import get_logger +from backend.file_parser import parse_file + +load_dotenv() + +_kb_parse_log = get_logger("kb_parser") + + +def _find_tag(elem, tag): + for el in elem.iter(): + local = el.tag.split("}")[-1] if "}" in el.tag else el.tag + if local == tag: + return el + return None + + +def _find_all_tags(elem, tag): + results = [] + for el in elem.iter(): + local = el.tag.split("}")[-1] if "}" in el.tag else el.tag + if local == tag: + results.append(el) + return results + + +def parse_jrxml_fields(jrxml_path: str) -> dict: + """解析 JRXML 文件,提取参数和字段定义。""" + try: + tree = ET.parse(jrxml_path) + root = tree.getroot() + except ET.ParseError as e: + return {"error": f"JRXML 解析失败: {e}", "parameters": [], "fields": [], + "report_name": ""} + + report_name = root.attrib.get("name", "") + page_width = root.attrib.get("pageWidth", "") + page_height = root.attrib.get("pageHeight", "") + + parameters = [] + for p in _find_all_tags(root, "parameter"): + params = {"name": p.attrib.get("name", ""), + "type": p.attrib.get("class", "java.lang.String"), + "description": ""} + desc = _find_tag(p, "parameterDescription") + if desc is not None and desc.text: + params["description"] = desc.text.strip() + parameters.append(params) + + fields = [] + for f in _find_all_tags(root, "field"): + fields.append({"name": f.attrib.get("name", ""), + "type": f.attrib.get("class", "java.lang.String"), + "description": ""}) + + query_text = "" + query = _find_tag(root, "queryString") + if query is not None and query.text: + query_text = query.text.strip() + + return {"report_name": report_name, "page_width": page_width, + "page_height": page_height, "parameters": parameters, + "fields": fields, "query": query_text, "error": None} + + +def _extract_archive(file_path: str, dest_dir: str) -> list[str]: + extracted = [] + resolved_dest = os.path.realpath(dest_dir) + + if zipfile.is_zipfile(file_path): + with zipfile.ZipFile(file_path, "r") as zf: + for member in zf.namelist(): + member_path = os.path.realpath(os.path.join(dest_dir, member)) + if not member_path.startswith(resolved_dest + os.sep): + continue + zf.extract(member, dest_dir) + if not member.endswith("/"): + extracted.append(member_path) + elif tarfile.is_tarfile(file_path): + with tarfile.open(file_path, "r:*") as tf: + for member in tf.getmembers(): + member_path = os.path.realpath(os.path.join(dest_dir, member.name)) + if not member_path.startswith(resolved_dest + os.sep): + continue + tf.extract(member, dest_dir) + if not member.name.endswith("/"): + extracted.append(member_path) + return extracted + + +def process_file_for_kb(kb_id: str, file_path: str, + source_name: str = "") -> dict: + from backend.kb_manager import get_kb_raw_dir + raw_dir = get_kb_raw_dir(kb_id) + if raw_dir is None: + return {"error": "KB 不存在"} + + fname = source_name or os.path.basename(file_path) + dest = raw_dir / fname + shutil.copy2(file_path, dest) + + suffix = Path(fname).suffix.lower() + + if suffix == ".jrxml": + jrxml_info = parse_jrxml_fields(file_path) + text = f"[JRXML 模板: {jrxml_info['report_name']}]\n" + text += f"页面: {jrxml_info['page_width']}x{jrxml_info['page_height']}\n" + text += "参数:\n" + "\n".join( + f" {p['name']} ({p['type']})" for p in jrxml_info["parameters"]) + text += "\n字段:\n" + "\n".join( + f" {f['name']} ({f['type']})" for f in jrxml_info["fields"]) + if jrxml_info["query"]: + text += f"\n查询:\n{jrxml_info['query']}" + try: + raw_xml = Path(file_path).read_text(encoding="utf-8") + except Exception: + raw_xml = "" + return {"filename": fname, "type": "jrxml", "text": text, + "raw_xml": raw_xml, "jrxml_info": jrxml_info, "error": None} + + if suffix in (".zip", ".tar", ".gz", ".tgz"): + tmpdir = tempfile.mkdtemp(prefix="kb_extract_") + try: + extracted = _extract_archive(file_path, tmpdir) + sub_results = [] + for ep in extracted: + sub = process_file_for_kb( + kb_id, ep, source_name=os.path.basename(ep)) + sub_results.append(sub) + return {"filename": fname, "type": "archive", "text": "", + "archive_contents": sub_results, "error": None} + finally: + shutil.rmtree(tmpdir, ignore_errors=True) + + parse_result = parse_file(str(dest)) + return {"filename": fname, "type": suffix.lstrip("."), + "text": parse_result.get("text", ""), + "error": parse_result.get("error")} + + +def chunk_file_results(results: list[dict], kb_name: str = "") -> list[dict]: + chunks = [] + chunk_idx = 0 + + for r in results: + if r.get("type") == "archive": + for sub in r.get("archive_contents", []): + chunks.extend(chunk_file_results([sub], kb_name)) + continue + + fname = r.get("filename", "") + ftype = r.get("type", "") + text = r.get("text", "") + if not text.strip(): + continue + + if ftype == "jrxml" and r.get("raw_xml"): + jinfo = r.get("jrxml_info", {}) + report_name = jinfo.get("report_name", "") + chunks.append({ + "id": f"chunk_{chunk_idx}", + "content": f"[JRXML 模板: {report_name}]\n{r['text']}\n\n" + f"\n{r['raw_xml']}\n", + "metadata": {"chunk_type": "jrxml_template", + "source_file": fname, + "report_name": report_name, + "kb_name": kb_name, + "param_count": len(jinfo.get("parameters", [])), + "field_count": len(jinfo.get("fields", []))}, + }) + chunk_idx += 1 + continue + + paragraphs = [p.strip() for p in text.split("\n\n") if p.strip()] + for para in paragraphs: + if len(para) < 10: + continue + chunk_type = "md_section" if ftype in ("md", "") else f"{ftype}_text" + chunks.append({ + "id": f"chunk_{chunk_idx}", + "content": para, + "metadata": {"chunk_type": chunk_type, + "source_file": fname, "kb_name": kb_name}, + }) + chunk_idx += 1 + return chunks + + +def extract_fields_with_llm(text: str, llm=None) -> list[dict]: + if llm is None: + return _extract_fields_from_table(text) + prompt = ( + "请分析以下接口文档内容,提取所有字段定义。\n" + "对每个字段,输出: 字段名, 含义, 类型, 是否必需。\n" + "以 JSON 数组格式输出,每个元素为 {\"name\": \"...\", " + "\"description\": \"...\", \"type\": \"...\", \"required\": false}。\n\n" + f"{text}" + ) + try: + response = llm.invoke(prompt) + content = response.content if hasattr(response, "content") else str(response) + start = content.find("[") + end = content.rfind("]") + 1 + if start >= 0 and end > start: + return json.loads(content[start:end]) + except Exception as e: + _kb_parse_log.warning("LLM 字段提取失败,使用表格回退: %s", e) + return _extract_fields_from_table(text) + + +def _extract_fields_from_table(text: str) -> list[dict]: + fields = [] + lines = text.split("\n") + header_found = False + for line in lines: + line = line.strip() + if not line.startswith("|"): + continue + cells = [c.strip() for c in line.split("|")[1:-1]] + if not cells: + continue + if not header_found: + if any(h in str(c) for c in cells + for h in ["字段", "名称", "含义", "说明", "类型"]): + header_found = True + continue + if all(c.replace("-", "").replace(":", "").replace(" ", "") == "" + for c in cells): + continue + if len(cells) >= 2: + name = cells[0].replace("**", "").replace("L ", "").replace("\\", "").strip() + if not name or name in ("", "---"): + continue + field = {"name": name, "description": "", "type": "java.lang.String", + "required": False} + if len(cells) >= 2 and cells[1]: + field["description"] = cells[1].replace("", " ").strip() + if len(cells) >= 3 and cells[2]: + field["required"] = cells[2].strip() in ("是", "Y", "y", "yes", "Yes", "必填") + if len(cells) >= 4 and cells[3]: + field["type"] = cells[3].strip() + fields.append(field) + return fields + + +def build_kb_from_files(kb_id: str, file_paths: list[str], + llm=None) -> dict: + from backend.kb_manager import update_kb_meta, get_kb_chunks_path + from backend.kb_searcher import get_kb_searcher + + all_results = [] + errors = [] + for fp in file_paths: + try: + r = process_file_for_kb(kb_id, fp) + all_results.append(r) + if r.get("error"): + errors.append({"file": os.path.basename(fp), "error": r["error"]}) + except Exception as e: + errors.append({"file": os.path.basename(fp), "error": str(e)}) + + chunks = chunk_file_results(all_results) + + chunks_path = get_kb_chunks_path(kb_id) + if chunks_path: + chunks_path.parent.mkdir(parents=True, exist_ok=True) + with open(chunks_path, "w", encoding="utf-8") as f: + json.dump(chunks, f, ensure_ascii=False, indent=2) + + searcher = get_kb_searcher(kb_id) + if searcher and chunks: + try: + searcher.add_chunks(chunks) + except Exception as e: + errors.append({"file": "embedding", "error": str(e)}) + + all_fields = [] + template_names = [] + for r in all_results: + _collect_from_result(r, all_fields, template_names) + + for r in all_results: + if r.get("type") in ("archive", "jrxml"): + continue + text = r.get("text", "") + if text.strip(): + for ef in extract_fields_with_llm(text, llm): + if not any(f["name"] == ef["name"] for f in all_fields): + all_fields.append(ef) + + update_kb_meta(kb_id, { + "fields": all_fields, "templates": template_names, + "file_count": len(file_paths), "chunk_count": len(chunks), + "parse_status": "ready" if not errors else "partial", + }) + + _kb_parse_log.info("KB 构建完成", extra={ + "kb_id": kb_id, "fields": len(all_fields), + "templates": len(template_names), "chunks": len(chunks), + }) + + return {"status": "ready" if not errors else "partial", + "field_count": len(all_fields), "chunk_count": len(chunks), + "template_count": len(template_names), "errors": errors} + + +def _collect_from_result(r: dict, all_fields: list, template_names: list) -> None: + jinfo = r.get("jrxml_info") + if jinfo and jinfo.get("report_name"): + template_names.append({"name": jinfo["report_name"], + "file": r.get("filename", "")}) + for p in jinfo.get("parameters", []): + field = {"name": p["name"], "description": p.get("description", ""), + "type": p.get("type", "java.lang.String"), "required": False} + if not any(f["name"] == field["name"] for f in all_fields): + all_fields.append(field) + for f in jinfo.get("fields", []): + field = {"name": f["name"], "description": f.get("description", ""), + "type": f.get("type", "java.lang.String"), "required": False} + if not any(fi["name"] == field["name"] for fi in all_fields): + all_fields.append(field) diff --git a/backend/kb_searcher.py b/backend/kb_searcher.py new file mode 100644 index 0000000..b89189e --- /dev/null +++ b/backend/kb_searcher.py @@ -0,0 +1,170 @@ +"""KB 隔离的 ChromaDB 语义搜索适配器。 + +每个知识库拥有独立的 ChromaDB collection。 +调用者: backend/rag_adapter.py, agent/nodes.py, api_server.py +""" + +import os +import logging +from pathlib import Path +from typing import Optional + +from dotenv import load_dotenv + +load_dotenv() + +logger = logging.getLogger(__name__) + +_PROJECT_ROOT = Path(__file__).resolve().parent.parent + + +def _resolve(path: str) -> Path: + p = Path(path) + return p if p.is_absolute() else _PROJECT_ROOT / p + + +class KBChromaSearcher: + """连接指定 KB 的 ChromaDB,提供语义搜索。""" + + def __init__(self, chroma_path: str, collection_name: str = "kb_chunks", + model_name: Optional[str] = None, use_gpu: Optional[bool] = None, + use_fp16: Optional[bool] = None): + self.chroma_path = str(_resolve(chroma_path)) + self.collection_name = collection_name + model_path = model_name or os.getenv( + "RAG_EMBED_MODEL", "./rag/models/paraphrase-multilingual-MiniLM-L12-v2") + resolved = _resolve(model_path) + self.model_name = str(resolved) if resolved.exists() else model_path + self.use_gpu = (use_gpu if use_gpu is not None + else os.getenv("RAG_USE_GPU", "true").lower() in ("true", "1")) + self.use_fp16 = (use_fp16 if use_fp16 is not None + else os.getenv("RAG_USE_FP16", "true").lower() in ("true", "1")) + self._model = None + self._client = None + self._collection = None + + @property + def model(self): + if self._model is None: + import torch + from sentence_transformers import SentenceTransformer + device = "cuda" if (self.use_gpu and torch.cuda.is_available()) else "cpu" + logger.info("加载嵌入模型: %s (device=%s)", self.model_name, device) + model = SentenceTransformer(self.model_name, device=device) + if device == "cuda" and self.use_fp16: + model = model.half() + self._model = model + return self._model + + @property + def client(self): + if self._client is None: + import chromadb + self._client = chromadb.PersistentClient(path=self.chroma_path) + return self._client + + @property + def collection(self): + if self._collection is None: + try: + self._collection = self.client.get_collection(self.collection_name) + except Exception: + self._collection = self.client.create_collection( + self.collection_name, metadata={"hnsw:space": "cosine"}) + return self._collection + + def is_ready(self) -> bool: + try: + self.client.get_collection(self.collection_name) + return True + except Exception: + return False + + def search(self, query: str, k: int = 5, threshold: Optional[float] = None) -> list[dict]: + if not self.is_ready(): + return [] + query_embedding = self.model.encode( + query, normalize_embeddings=True, show_progress_bar=False) + results = self.collection.query( + query_embeddings=[query_embedding.tolist()], + n_results=k, include=["documents", "metadatas", "distances"]) + output = [] + if not results["ids"] or not results["ids"][0]: + return output + for i, doc_id in enumerate(results["ids"][0]): + dist = results["distances"][0][i] + if threshold is not None and dist > threshold: + continue + output.append({ + "id": doc_id, + "content": results["documents"][0][i], + "metadata": results["metadatas"][0][i] or {}, + "distance": dist, + }) + return output + + def search_templates(self, query: str, k: int = 3) -> list[dict]: + results = self.search(query, k=k * 2) + templates = [] + for r in results: + meta = r.get("metadata", {}) + chunk_type = meta.get("chunk_type", "") + if "jrxml" in chunk_type.lower() or meta.get("report_name"): + templates.append(r) + if len(templates) >= k: + break + return templates + + def search_as_context(self, query: str, k: int = 5) -> str: + results = self.search(query, k=k) + if not results: + return "" + parts = [] + for r in results: + meta = r.get("metadata", {}) + header = f"[类型:{meta.get('chunk_type', 'N/A')}]" + if meta.get("report_name"): + header += f" [报表:{meta['report_name']}]" + parts.append(f"{header}\n{r['content']}") + return "\n\n---\n\n".join(parts) + + def add_chunks(self, chunks: list[dict]) -> None: + if not chunks: + return + ids = [c["id"] for c in chunks] + docs = [c["content"] for c in chunks] + metas = [c.get("metadata", {}) for c in chunks] + embeddings = self.model.encode( + docs, normalize_embeddings=True, show_progress_bar=True) + self.collection.upsert( + ids=ids, documents=docs, metadatas=metas, + embeddings=embeddings.tolist()) + + +_searchers: dict = {} + + +def get_kb_searcher(kb_id: str) -> Optional[KBChromaSearcher]: + from backend.kb_manager import get_kb_chroma_path + if kb_id in _searchers: + return _searchers[kb_id] + chroma_path = get_kb_chroma_path(kb_id) + if chroma_path is None: + return None + searcher = KBChromaSearcher(str(chroma_path)) + _searchers[kb_id] = searcher + return searcher + + +def search_kb(kb_id: str, query: str, k: int = 5) -> str: + searcher = get_kb_searcher(kb_id) + if searcher is None: + return "" + return searcher.search_as_context(query, k=k) + + +def search_templates_in_kb(kb_id: str, query: str, k: int = 3) -> list[dict]: + searcher = get_kb_searcher(kb_id) + if searcher is None: + return [] + return searcher.search_templates(query, k=k) diff --git a/backend/rag_adapter.py b/backend/rag_adapter.py index 9a8fc23..f775b90 100644 --- a/backend/rag_adapter.py +++ b/backend/rag_adapter.py @@ -150,6 +150,12 @@ def _get_searcher() -> RAGSearcher: return _searcher -def search_chunks(query: str, k: int = 5) -> str: - """搜索 JRXML 知识库并返回拼接后的上下文文本(便捷函数)。""" +def search_chunks(query: str, k: int = 5, kb_id: str = "") -> str: + """搜索知识库并返回拼接后的上下文文本。 + + 若指定 kb_id,使用该 KB 专属 ChromaDB;否则使用全局默认库。 + """ + if kb_id: + from backend.kb_searcher import search_kb + return search_kb(kb_id, query, k=k) return _get_searcher().search_as_context(query, k=k) diff --git a/backend/session.py b/backend/session.py index fae4f53..1d1b77b 100644 --- a/backend/session.py +++ b/backend/session.py @@ -56,6 +56,7 @@ def create_session(name: str = "", agent_state: Optional[dict] = None, "session_name": name or f"新建报表 {now[:10]}", "created_at": now, "updated_at": now, + "kb_id": agent_state.get("kb_id", "") if agent_state else "", "agent_state": agent_state, } with open(_session_path(sid), "w", encoding="utf-8") as f: diff --git a/frontend/README.md b/frontend/README.md index 33895ab..fb083ad 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,5 +1,52 @@ -# Vue 3 + TypeScript + Vite +# JRXML Agent 前端 -This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + + + + + 知识库管理 + + + + + + {{ creating ? '创建中...' : '创建' }} + + + + 加载中... + 暂无知识库 + + + + {{ k.name }} + + {{ k.parse_status === 'ready' ? '就绪' : k.parse_status === 'partial' ? '部分' : '空' }} + + + + {{ k.field_count }}字段 · {{ k.template_count }}模板 · + {{ k.file_count }}文件 · {{ k.chunk_count }}块 + + + + {{ uploading === k.kb_id ? '上传中...' : '上传文件' }} + + + {{ building === k.kb_id ? '构建中...' : '构建' }} + + 删除 + + + + 关闭 + + { const kbId = uploading; if (kbId) handleFileSelect(e, kbId); }" /> + + + + + + diff --git a/frontend/src/components/KbSelector.vue b/frontend/src/components/KbSelector.vue new file mode 100644 index 0000000..c17b78f --- /dev/null +++ b/frontend/src/components/KbSelector.vue @@ -0,0 +1,108 @@ + + + + + 知识库 + + -- 不使用知识库 -- + + {{ k.name }} ({{ k.field_count }}字段, {{ k.template_count }}模板) + + + + + + + + + 当前: {{ kb.currentKbName }} + + + + diff --git a/frontend/src/components/UnifiedInput.vue b/frontend/src/components/UnifiedInput.vue index 2d52b63..a6e3a8d 100644 --- a/frontend/src/components/UnifiedInput.vue +++ b/frontend/src/components/UnifiedInput.vue @@ -140,7 +140,7 @@ function handlePaste(e: ClipboardEvent) { ref="fileInputRef" type="file" multiple - accept="image/*,.pdf,.docx,.doc,.xlsx,.xls,.txt,.csv" + accept="image/*,.pdf,.docx,.doc,.xlsx,.xls,.txt,.csv,.jrxml" style="display:none" @change="handleFileSelect" /> diff --git a/frontend/src/stores/kb.ts b/frontend/src/stores/kb.ts new file mode 100644 index 0000000..6682c4f --- /dev/null +++ b/frontend/src/stores/kb.ts @@ -0,0 +1,152 @@ +/** Pinia store — multi-tenant KB management. */ + +import { ref } from 'vue' +import { defineStore } from 'pinia' + +export interface KbSummary { + kb_id: string + name: string + description: string + created_at: string + updated_at: string + field_count: number + template_count: number + file_count: number + chunk_count: number + parse_status: string +} + +export interface UserInfo { + user_id: string + name: string + created_at: string +} + +export interface KbTemplate { + name: string + file: string +} + +export interface KbField { + name: string + description: string + type: string + required: boolean +} + +export const useKbStore = defineStore('kb', () => { + const users = ref([]) + const currentUserId = ref('') + const kbs = ref([]) + const currentKbId = ref('') + const currentKbName = ref('') + const currentKbFields = ref([]) + const currentKbTemplates = ref([]) + const loading = ref(false) + const showManager = ref(false) + + function setKbs(list: KbSummary[]) { kbs.value = list } + + function selectKb(kbId: string) { + currentKbId.value = kbId + const kb = kbs.value.find(k => k.kb_id === kbId) + if (kb) currentKbName.value = kb.name + } + + async function refreshUsers() { + try { + const r = await fetch('/api/users') + const data = await r.json() + users.value = data.users || [] + if (users.value.length > 0 && !currentUserId.value) { + currentUserId.value = users.value[0].user_id + } + } catch (e) { console.error('获取用户列表失败:', e) } + } + + async function refreshKbs(userId?: string) { + const uid = userId || currentUserId.value + if (!uid) return + loading.value = true + try { + const r = await fetch(`/api/users/${uid}/kbs`) + const data = await r.json() + kbs.value = data.kbs || [] + } catch (e) { console.error('获取知识库列表失败:', e) } + finally { loading.value = false } + } + + async function createKb(name: string, description = ''): Promise { + if (!currentUserId.value) return null + try { + const r = await fetch(`/api/users/${currentUserId.value}/kbs`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name, description }), + }) + if (!r.ok) throw new Error('创建失败') + const kb = await r.json() + await refreshKbs() + return kb + } catch (e) { console.error('创建知识库失败:', e); return null } + } + + async function deleteKb(kbId: string): Promise { + try { + const r = await fetch(`/api/kbs/${kbId}`, { method: 'DELETE' }) + if (!r.ok) throw new Error('删除失败') + if (currentKbId.value === kbId) { currentKbId.value = ''; currentKbName.value = '' } + await refreshKbs() + return true + } catch (e) { console.error('删除知识库失败:', e); return false } + } + + async function uploadFileToKb(kbId: string, file: File): Promise { + try { + const form = new FormData() + form.append('file', file) + const r = await fetch(`/api/kbs/${kbId}/upload`, { method: 'POST', body: form }) + return r.ok + } catch (e) { console.error('KB文件上传失败:', e); return false } + } + + async function buildKb(kbId: string): Promise { + try { + const r = await fetch(`/api/kbs/${kbId}/build`, { method: 'POST' }) + if (!r.ok) throw new Error('构建失败') + await refreshKbs() + return true + } catch (e) { console.error('KB构建失败:', e); return false } + } + + async function fetchKbFields(kbId: string) { + try { + const r = await fetch(`/api/kbs/${kbId}/fields`) + const data = await r.json() + currentKbFields.value = data.fields || [] + currentKbTemplates.value = data.templates || [] + } catch (e) { console.error('获取KB字段失败:', e) } + } + + async function bindKbToSession(sessionId: string, kbId: string) { + try { + await fetch(`/api/sessions/${sessionId}/kb`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ kb_id: kbId }), + }) + } catch (e) { console.error('绑定KB失败:', e) } + } + + async function init() { + await refreshUsers() + if (currentUserId.value) await refreshKbs() + } + + return { + users, currentUserId, kbs, currentKbId, currentKbName, + currentKbFields, currentKbTemplates, loading, showManager, + setKbs, selectKb, refreshUsers, refreshKbs, createKb, deleteKb, + uploadFileToKb, buildKb, fetchKbFields, bindKbToSession, init, + } +}) diff --git a/frontend/tests/e2e/main-flows.spec.ts b/frontend/tests/e2e/main-flows.spec.ts index b394013..f721607 100644 --- a/frontend/tests/e2e/main-flows.spec.ts +++ b/frontend/tests/e2e/main-flows.spec.ts @@ -166,3 +166,155 @@ test.describe("Input UX", () => { await expect(page.locator(".send-btn")).toBeEnabled(); }); }); + +// ── KB (Knowledge Base) API mocks ─────────────────────────────── + +function mockKbApi(page: any) { + mockApi(page); + + page.route("**/api/users", (route: any) => { + if (route.request().method() === "POST") { + return route.fulfill({ + json: { user_id: "u_e2e_test_001", name: "E2E用户", created_at: "2026-05-23T00:00:00Z" }, + }); + } + return route.fulfill({ + json: { users: [{ user_id: "u_e2e_test_001", name: "E2E用户", created_at: "2026-05-23T00:00:00Z" }] }, + }); + }); + + page.route("**/api/users/*/kbs", (route: any) => { + if (route.request().method() === "POST") { + return route.fulfill({ + json: { + kb_id: "kb_e2e_001", user_id: "u_e2e_test_001", + name: "E2E测试库", description: "", + created_at: "2026-05-23T00:00:00Z", updated_at: "2026-05-23T00:00:00Z", + fields: [], templates: [], file_count: 0, chunk_count: 0, parse_status: "empty", + }, + }); + } + return route.fulfill({ + json: { + kbs: [{ + kb_id: "kb_e2e_001", name: "E2E测试库", description: "", + created_at: "2026-05-23T00:00:00Z", updated_at: "2026-05-23T00:00:00Z", + field_count: 10, template_count: 3, file_count: 2, chunk_count: 50, parse_status: "ready", + }], + }, + }); + }); + + page.route("**/api/kbs/*/status", (route: any) => + route.fulfill({ json: { parse_status: "ready", file_count: 2, chunk_count: 50 } }) + ); + page.route("**/api/kbs/*/fields", (route: any) => + route.fulfill({ json: { + fields: [{ name: "billNo", description: "工单号", type: "String" }], + templates: [{ name: "结算单", file: "结算单.jrxml" }], + }}) + ); + page.route("**/api/kbs/*", (route: any) => { + if (route.request().method() === "DELETE") { + return route.fulfill({ json: { status: "deleted" } }); + } + return route.fulfill({ + json: { + kb_id: "kb_e2e_001", user_id: "u_e2e_test_001", + name: "E2E测试库", description: "", + fields: [], templates: [], + file_count: 2, chunk_count: 50, parse_status: "ready", + }, + }); + }); + + page.route("**/api/kbs/*/upload", (route: any) => + route.fulfill({ json: { filename: "test.jrxml", type: "jrxml", error: null } }) + ); + + page.route("**/api/sessions/*/kb", (route: any) => { + if (route.request().method() === "PUT") { + return route.fulfill({ json: { kb_id: "kb_e2e_001", kb_name: "E2E测试库" } }); + } + return route.fulfill({ json: { kb_id: "kb_e2e_001", kb_name: "E2E测试库" } }); + }); +} + +// ── KB feature tests ──────────────────────────────────────────── + +test.describe("KB selector", () => { + test("KB selector renders in chat interface", async ({ page }) => { + await mockKbApi(page); + await page.goto("/"); + + await expect(page.locator(".kb-selector")).toBeVisible({ timeout: 5000 }); + await expect(page.locator(".kb-label")).toContainText("知识库"); + await expect(page.locator(".kb-select")).toBeVisible(); + await expect(page.locator(".kb-manage-btn")).toBeVisible(); + }); + + test("can select a KB from dropdown", async ({ page }) => { + await mockKbApi(page); + await page.goto("/"); + + const select = page.locator(".kb-select"); + await expect(select).toBeVisible({ timeout: 5000 }); + await select.selectOption({ label: "E2E测试库 (10字段, 3模板)" }); + await expect(page.locator(".kb-badge")).toContainText("E2E测试库"); + }); +}); + +test.describe("KB manager", () => { + test("opens KB manager overlay", async ({ page }) => { + await mockKbApi(page); + await page.goto("/"); + + await page.locator(".kb-manage-btn").click(); + await expect(page.locator(".kb-manager")).toBeVisible({ timeout: 3000 }); + await expect(page.locator(".kb-manager h3")).toContainText("知识库管理"); + }); + + test("can close KB manager", async ({ page }) => { + await mockKbApi(page); + await page.goto("/"); + + await page.locator(".kb-manage-btn").click(); + await expect(page.locator(".kb-manager")).toBeVisible({ timeout: 3000 }); + await page.locator(".close-btn").click(); + await expect(page.locator(".kb-manager")).not.toBeVisible({ timeout: 3000 }); + }); + + test("create form has name input and create button", async ({ page }) => { + await mockKbApi(page); + await page.goto("/"); + + await page.locator(".kb-manage-btn").click(); + await expect(page.locator(".kb-manager")).toBeVisible({ timeout: 3000 }); + + await expect(page.locator('.kb-manager .create-form .kb-input').first()).toBeVisible(); + await expect(page.locator('.kb-manager .create-form button.primary')).toBeVisible(); + }); + + test("KB cards show name, status, and actions", async ({ page }) => { + await mockKbApi(page); + await page.goto("/"); + + await page.locator(".kb-manage-btn").click(); + await expect(page.locator(".kb-manager")).toBeVisible({ timeout: 3000 }); + + await expect(page.locator(".kb-card")).toBeVisible({ timeout: 3000 }); + await expect(page.locator(".kb-card strong")).toContainText("E2E测试库"); + await expect(page.locator(".kb-status.ready")).toContainText("就绪"); + await expect(page.locator(".kb-actions button")).toHaveCount(3); + }); +}); + +test.describe("JRXML upload in chat", () => { + test("file input accepts .jrxml extension", async ({ page }) => { + await mockKbApi(page); + await page.goto("/"); + + const input = page.locator('.unified-input input[type="file"]'); + await expect(input).toHaveAttribute("accept", /\.jrxml/); + }); +}); diff --git a/kb_data/2db10c2ebbf6434aab28035026e196c3/49b972ec9e424f04aec34899c978f087/meta.json b/kb_data/2db10c2ebbf6434aab28035026e196c3/49b972ec9e424f04aec34899c978f087/meta.json new file mode 100644 index 0000000..79c68f2 --- /dev/null +++ b/kb_data/2db10c2ebbf6434aab28035026e196c3/49b972ec9e424f04aec34899c978f087/meta.json @@ -0,0 +1,13 @@ +{ + "kb_id": "49b972ec9e424f04aec34899c978f087", + "user_id": "2db10c2ebbf6434aab28035026e196c3", + "name": "smoke_kb", + "description": "", + "created_at": "2026-05-23T12:21:32.409028+00:00", + "updated_at": "2026-05-23T12:21:32.409028+00:00", + "fields": [], + "templates": [], + "file_count": 0, + "chunk_count": 0, + "parse_status": "empty" +} \ No newline at end of file diff --git a/kb_data/2db10c2ebbf6434aab28035026e196c3/profile.json b/kb_data/2db10c2ebbf6434aab28035026e196c3/profile.json new file mode 100644 index 0000000..1cba500 --- /dev/null +++ b/kb_data/2db10c2ebbf6434aab28035026e196c3/profile.json @@ -0,0 +1,5 @@ +{ + "user_id": "2db10c2ebbf6434aab28035026e196c3", + "name": "SmokeTest", + "created_at": "2026-05-23T12:21:32.399217+00:00" +} \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/chroma.sqlite3 b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/chroma.sqlite3 new file mode 100644 index 0000000..5bfb3bf Binary files /dev/null and b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/chroma.sqlite3 differ diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/data_level0.bin b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/data_level0.bin new file mode 100644 index 0000000..4d75b05 Binary files /dev/null and b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/data_level0.bin differ diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/header.bin b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/header.bin new file mode 100644 index 0000000..bb54792 Binary files /dev/null and b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/header.bin differ diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/length.bin b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/length.bin new file mode 100644 index 0000000..bbe616e Binary files /dev/null and b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/length.bin differ diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/link_lists.bin b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chroma/d474a46a-3dff-4c26-80e6-5b1ef6b93d51/link_lists.bin new file mode 100644 index 0000000..e69de29 diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chunks.json b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chunks.json new file mode 100644 index 0000000..c93fa13 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/chunks.json @@ -0,0 +1,3950 @@ +[ + { + "id": "chunk_0", + "content": "[JRXML 模板: jiesuandan]\n[JRXML 模板: jiesuandan]\n页面: 595x842\n参数:\n orgName (java.lang.String)\n detailAddress (java.lang.String)\n contactNumber (java.lang.String)\n fax (java.lang.String)\n bankAccount (java.lang.String)\n email (java.lang.String)\n accountNumber (java.lang.String)\n naCustomer (java.lang.String)\n contactName (java.lang.String)\n contactCellphone (java.lang.String)\n billNo (java.lang.String)\n billDate (java.lang.String)\n mileage (java.math.BigDecimal)\n carNoWhole (java.lang.String)\n carModelShort (java.lang.String)\n deliveryTime (java.lang.String)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n extraCostTotal (java.math.BigDecimal)\n amountAll (java.math.BigDecimal)\n totalWorkHour (java.math.BigDecimal)\n numberCount (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n partList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n businessTypeName (java.lang.String)\n creatorName (java.lang.String)\n carModel (java.lang.String)\n vin (java.lang.String)\n printCount (java.lang.String)\n serviceNum (java.lang.String)\n serviceDisCountSubTotal (java.math.BigDecimal)\n totalStuffNum (java.lang.String)\n couponFavourable (java.math.BigDecimal)\n pointFavourable (java.math.BigDecimal)\n partinfoDiscountFavourable (java.math.BigDecimal)\n naEmployee (java.lang.String)\n memo (java.lang.String)\n repairPerson (java.lang.String)\n cellPhone (java.lang.String)\n carBrandName (java.lang.String)\n orgContactMobile (java.lang.String)\n orgDetailAddress (java.lang.String)\n selfPartList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n payItemList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n extraChargeList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n stuffDisCountTotal (java.math.BigDecimal)\n selfTotalStuffNum (java.lang.String)\n czkExpense (java.math.BigDecimal)\n disCountAll (java.math.BigDecimal)\n packageFavourable (java.math.BigDecimal)\n serviceFavourable (java.math.BigDecimal)\n partinfoFavourable (java.math.BigDecimal)\n gatheringFavourable (java.math.BigDecimal)\n discountFavourable (java.math.BigDecimal)\n oweAmount (java.math.BigDecimal)\n amountReal (java.math.BigDecimal)\n printTime (java.lang.String)\n creationtime (java.lang.String)\n extraNumber (java.lang.String)\n carSeriesName (java.lang.String)\n qRCodeStr (java.lang.String)\n vipExpense (java.math.BigDecimal)\n storeLogo (java.lang.String)\n partFavourableTotal (java.math.BigDecimal)\n serviceFavourableTotal (java.math.BigDecimal)\n partFavourableCommonTotal (java.math.BigDecimal)\n serviceFavourableCommonTotal (java.math.BigDecimal)\n serviceSubtotalVip (java.math.BigDecimal)\n stuffSubtotalVip (java.math.BigDecimal)\n nextMileage (java.math.BigDecimal)\n printContent (java.lang.String)\n repairPersonContact (java.lang.String)\n payItemTogether (java.lang.String)\n payItemTogetherChinese (java.lang.String)\n printOrgName (java.lang.String)\n orgContactNumber (java.lang.String)\n maintainType (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n balanceStatus (java.lang.String)\n czkDetailInfo (java.lang.String)\n paymentTypeDetails (java.lang.String)\n signaturePhotoUrl (java.lang.String)\n czkDiscountFavourable (java.math.BigDecimal)\n isCustomerLevelFavourable (java.lang.Integer)\n nextMileageRemind (java.math.BigDecimal)\n claimInsuranceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n字段:\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n serviceMemo (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n extraPrintVo (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n customCode (java.lang.String)\n partName (java.lang.String)\n unit (java.lang.String)\n number (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n partBrand (java.lang.String)\n standard (java.lang.String)\n supplierCode (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n partMemo (java.lang.String)\n isBring (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n payWay (java.lang.String)\n payAmount (java.math.BigDecimal)\n chinesePayAmount (java.lang.String)\n extraName (java.lang.String)\n subtotal (java.math.BigDecimal)\n memo (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "F6标准结算单(壹).jrxml", + "report_name": "jiesuandan", + "kb_name": "", + "param_count": 87, + "field_count": 33 + } + }, + { + "id": "chunk_1", + "content": "[JRXML 模板: jiesuandan]\n[JRXML 模板: jiesuandan]\n页面: 595x842\n参数:\n orgName (java.lang.String)\n detailAddress (java.lang.String)\n contactNumber (java.lang.String)\n fax (java.lang.String)\n bankAccount (java.lang.String)\n email (java.lang.String)\n accountNumber (java.lang.String)\n naCustomer (java.lang.String)\n contactName (java.lang.String)\n contactCellphone (java.lang.String)\n billNo (java.lang.String)\n billDate (java.lang.String)\n mileage (java.math.BigDecimal)\n carNoWhole (java.lang.String)\n carModelShort (java.lang.String)\n deliveryTime (java.lang.String)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n extraCostTotal (java.math.BigDecimal)\n amountAll (java.math.BigDecimal)\n totalWorkHour (java.math.BigDecimal)\n numberCount (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n partList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n businessTypeName (java.lang.String)\n creatorName (java.lang.String)\n carModel (java.lang.String)\n vin (java.lang.String)\n printCount (java.lang.String)\n serviceNum (java.lang.String)\n serviceDisCountSubTotal (java.math.BigDecimal)\n totalStuffNum (java.lang.String)\n couponFavourable (java.math.BigDecimal)\n pointFavourable (java.math.BigDecimal)\n partinfoDiscountFavourable (java.math.BigDecimal)\n naEmployee (java.lang.String)\n memo (java.lang.String)\n repairPerson (java.lang.String)\n cellPhone (java.lang.String)\n carBrandName (java.lang.String)\n orgContactMobile (java.lang.String)\n orgDetailAddress (java.lang.String)\n selfPartList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n payItemList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n extraChargeList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n stuffDisCountTotal (java.math.BigDecimal)\n selfTotalStuffNum (java.lang.String)\n czkExpense (java.math.BigDecimal)\n disCountAll (java.math.BigDecimal)\n packageFavourable (java.math.BigDecimal)\n serviceFavourable (java.math.BigDecimal)\n partinfoFavourable (java.math.BigDecimal)\n gatheringFavourable (java.math.BigDecimal)\n discountFavourable (java.math.BigDecimal)\n oweAmount (java.math.BigDecimal)\n amountReal (java.math.BigDecimal)\n printTime (java.lang.String)\n creationtime (java.lang.String)\n extraNumber (java.lang.String)\n carSeriesName (java.lang.String)\n qRCodeStr (java.lang.String)\n vipExpense (java.math.BigDecimal)\n storeLogo (java.lang.String)\n partFavourableTotal (java.math.BigDecimal)\n serviceFavourableTotal (java.math.BigDecimal)\n partFavourableCommonTotal (java.math.BigDecimal)\n serviceFavourableCommonTotal (java.math.BigDecimal)\n serviceSubtotalVip (java.math.BigDecimal)\n stuffSubtotalVip (java.math.BigDecimal)\n nextMileage (java.math.BigDecimal)\n printContent (java.lang.String)\n repairPersonContact (java.lang.String)\n payItemTogether (java.lang.String)\n payItemTogetherChinese (java.lang.String)\n printOrgName (java.lang.String)\n orgContactNumber (java.lang.String)\n maintainType (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n balanceStatus (java.lang.String)\n czkDetailInfo (java.lang.String)\n paymentTypeDetails (java.lang.String)\n signaturePhotoUrl (java.lang.String)\n czkDiscountFavourable (java.math.BigDecimal)\n isCustomerLevelFavourable (java.lang.Integer)\n claimInsuranceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n字段:\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n serviceMemo (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n extraPrintVo (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n customCode (java.lang.String)\n partName (java.lang.String)\n unit (java.lang.String)\n number (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n partBrand (java.lang.String)\n standard (java.lang.String)\n supplierCode (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n partMemo (java.lang.String)\n isBring (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n payWay (java.lang.String)\n payAmount (java.math.BigDecimal)\n chinesePayAmount (java.lang.String)\n extraName (java.lang.String)\n subtotal (java.math.BigDecimal)\n memo (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "F6标准结算单(壹)维保单.jrxml", + "report_name": "jiesuandan", + "kb_name": "", + "param_count": 86, + "field_count": 33 + } + }, + { + "id": "chunk_2", + "content": "[JRXML 模板: jiesuandan]\n[JRXML 模板: jiesuandan]\n页面: 595x842\n参数:\n orgName (java.lang.String)\n detailAddress (java.lang.String)\n contactNumber (java.lang.String)\n fax (java.lang.String)\n bankAccount (java.lang.String)\n email (java.lang.String)\n accountNumber (java.lang.String)\n naCustomer (java.lang.String)\n contactName (java.lang.String)\n contactCellphone (java.lang.String)\n billNo (java.lang.String)\n billDate (java.lang.String)\n mileage (java.math.BigDecimal)\n carNoWhole (java.lang.String)\n carModelShort (java.lang.String)\n deliveryTime (java.lang.String)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n extraCostTotal (java.math.BigDecimal)\n amountAll (java.math.BigDecimal)\n totalWorkHour (java.math.BigDecimal)\n numberCount (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n partList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n businessTypeName (java.lang.String)\n creatorName (java.lang.String)\n carModel (java.lang.String)\n vin (java.lang.String)\n printCount (java.lang.String)\n serviceNum (java.lang.String)\n serviceDisCountSubTotal (java.math.BigDecimal)\n totalStuffNum (java.lang.String)\n couponFavourable (java.math.BigDecimal)\n pointFavourable (java.math.BigDecimal)\n partinfoDiscountFavourable (java.math.BigDecimal)\n naEmployee (java.lang.String)\n memo (java.lang.String)\n repairPerson (java.lang.String)\n cellPhone (java.lang.String)\n carBrandName (java.lang.String)\n orgContactMobile (java.lang.String)\n orgDetailAddress (java.lang.String)\n selfPartList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n payItemList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n extraChargeList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n stuffDisCountTotal (java.math.BigDecimal)\n selfTotalStuffNum (java.lang.String)\n czkExpense (java.math.BigDecimal)\n disCountAll (java.math.BigDecimal)\n packageFavourable (java.math.BigDecimal)\n serviceFavourable (java.math.BigDecimal)\n partinfoFavourable (java.math.BigDecimal)\n gatheringFavourable (java.math.BigDecimal)\n discountFavourable (java.math.BigDecimal)\n oweAmount (java.math.BigDecimal)\n amountReal (java.math.BigDecimal)\n printTime (java.lang.String)\n creationtime (java.lang.String)\n extraNumber (java.lang.String)\n carSeriesName (java.lang.String)\n qRCodeStr (java.lang.String)\n vipExpense (java.math.BigDecimal)\n storeLogo (java.lang.String)\n partFavourableTotal (java.math.BigDecimal)\n serviceFavourableTotal (java.math.BigDecimal)\n partFavourableCommonTotal (java.math.BigDecimal)\n serviceFavourableCommonTotal (java.math.BigDecimal)\n serviceSubtotalVip (java.math.BigDecimal)\n stuffSubtotalVip (java.math.BigDecimal)\n nextMileage (java.math.BigDecimal)\n printContent (java.lang.String)\n repairPersonContact (java.lang.String)\n payItemTogether (java.lang.String)\n payItemTogetherChinese (java.lang.String)\n printOrgName (java.lang.String)\n orgContactNumber (java.lang.String)\n maintainType (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n balanceStatus (java.lang.String)\n czkDetailInfo (java.lang.String)\n paymentTypeDetails (java.lang.String)\n signaturePhotoUrl (java.lang.String)\n czkDiscountFavourable (java.math.BigDecimal)\n isCustomerLevelFavourable (java.lang.Integer)\n receivedAmount (java.math.BigDecimal)\n fromMaintainType (java.lang.String)\n claimInsuranceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n字段:\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n serviceMemo (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n extraPrintVo (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n customCode (java.lang.String)\n partName (java.lang.String)\n unit (java.lang.String)\n number (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n partBrand (java.lang.String)\n standard (java.lang.String)\n supplierCode (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n partMemo (java.lang.String)\n isBring (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n payWay (java.lang.String)\n payAmount (java.math.BigDecimal)\n chinesePayAmount (java.lang.String)\n extraName (java.lang.String)\n subtotal (java.math.BigDecimal)\n memo (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "F6标准结算单(壹)附表.jrxml", + "report_name": "jiesuandan", + "kb_name": "", + "param_count": 88, + "field_count": 33 + } + }, + { + "id": "chunk_3", + "content": "[JRXML 模板: jiesuandan]\n[JRXML 模板: jiesuandan]\n页面: 595x842\n参数:\n orgName (java.lang.String)\n detailAddress (java.lang.String)\n contactNumber (java.lang.String)\n fax (java.lang.String)\n bankAccount (java.lang.String)\n email (java.lang.String)\n accountNumber (java.lang.String)\n customerName (java.lang.String)\n contactName (java.lang.String)\n contactCellphone (java.lang.String)\n billNo (java.lang.String)\n billDate (java.lang.String)\n mileage (java.math.BigDecimal)\n fullCarNo (java.lang.String)\n carModelShort (java.lang.String)\n deliveryTime (java.lang.String)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n extraCostTotal (java.math.BigDecimal)\n amountAll (java.math.BigDecimal)\n totalWorkHour (java.math.BigDecimal)\n numberCount (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n partList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n businessTypeName (java.lang.String)\n creatorName (java.lang.String)\n carModel (java.lang.String)\n vin (java.lang.String)\n printCount (java.lang.String)\n serviceNum (java.lang.String)\n serviceDisCountSubTotal (java.math.BigDecimal)\n totalStuffNum (java.lang.String)\n couponFavourable (java.math.BigDecimal)\n pointFavourable (java.math.BigDecimal)\n partinfoDiscountFavourable (java.math.BigDecimal)\n employeeName (java.lang.String)\n memo (java.lang.String)\n repairPerson (java.lang.String)\n customerCellPhone (java.lang.String)\n carBrandName (java.lang.String)\n orgContactMobile (java.lang.String)\n orgDetailAddress (java.lang.String)\n selfPartList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n payItemList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n extraChargeList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n stuffDisCountTotal (java.math.BigDecimal)\n selfTotalStuffNum (java.lang.String)\n czkExpense (java.math.BigDecimal)\n disCountAll (java.math.BigDecimal)\n packageFavourable (java.math.BigDecimal)\n serviceFavourable (java.math.BigDecimal)\n partinfoFavourable (java.math.BigDecimal)\n gatheringFavourable (java.math.BigDecimal)\n discountFavourable (java.math.BigDecimal)\n oweAmount (java.math.BigDecimal)\n settleAmountReal (java.math.BigDecimal)\n printTime (java.lang.String)\n creationtime (java.lang.String)\n extraNumber (java.lang.String)\n carSeriesName (java.lang.String)\n qRCodeStr (java.lang.String)\n vipExpense (java.math.BigDecimal)\n storeLogo (java.lang.String)\n partFavourableTotal (java.math.BigDecimal)\n serviceFavourableTotal (java.math.BigDecimal)\n partFavourableCommonTotal (java.math.BigDecimal)\n serviceFavourableCommonTotal (java.math.BigDecimal)\n serviceVipExpense (java.math.BigDecimal)\n partVipExpense (java.math.BigDecimal)\n nextMileage (java.math.BigDecimal)\n printContent (java.lang.String)\n repairPersonContact (java.lang.String)\n payItemTogether (java.lang.String)\n payItemTogetherChinese (java.lang.String)\n printOrgName (java.lang.String)\n orgContactNumber (java.lang.String)\n maintainType (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n balanceStatus (java.lang.String)\n czkDetailInfo (java.lang.String)\n paymentTypeDetails (java.lang.String)\n signaturePhotoUrl (java.lang.String)\n czkExpenseFavourable (java.math.BigDecimal)\n customerLevelFavourable (java.math.BigDecimal)\n centerMemberFavourable (java.math.BigDecimal)\n settleOweAmount (java.math.BigDecimal)\n字段:\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n serviceMemo (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n extraPrintVo (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n customCode (java.lang.String)\n partName (java.lang.String)\n unit (java.lang.String)\n number (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n partBrand (java.lang.String)\n standard (java.lang.String)\n supplierCode (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n partMemo (java.lang.String)\n isBring (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n payWay (java.lang.String)\n payAmount (java.math.BigDecimal)\n chinesePayAmount (java.lang.String)\n extraName (java.lang.String)\n subtotal (java.math.BigDecimal)\n memo (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "F6标准结算单-维保单.jrxml", + "report_name": "jiesuandan", + "kb_name": "", + "param_count": 87, + "field_count": 31 + } + }, + { + "id": "chunk_4", + "content": "[JRXML 模板: Blank_A4]\n[JRXML 模板: Blank_A4]\n页面: 595x842\n参数:\n title (java.lang.String)\n billNo (java.lang.String)\n creatorName (java.lang.String)\n printTime (java.lang.String)\n naEmployee (java.lang.String)\n billDate (java.lang.String)\n deliveryTime (java.lang.String)\n naCustomer (java.lang.String)\n carModel (java.lang.String)\n cellPhone (java.lang.String)\n carNoWhole (java.lang.String)\n vin (java.lang.String)\n serviceDetailVOList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n amountAll (java.math.BigDecimal)\n字段:\n index (java.lang.String)\n serviceName (java.lang.String)\n cooperationServiceName (java.lang.String)\n cooperationOrgName (java.lang.String)\n auditStatus (java.lang.String)\n cooperationCost (java.math.BigDecimal)\n\n\n\n\n\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "协作单.jrxml", + "report_name": "Blank_A4", + "kb_name": "", + "param_count": 14, + "field_count": 6 + } + }, + { + "id": "chunk_5", + "content": "[JRXML 模板: dingjin]\n[JRXML 模板: dingjin]\n页面: 595x842\n参数:\n title (java.lang.String)\n billNO (java.lang.String)\n printTime (java.lang.String)\n customerName (java.lang.String)\n cellPhone (java.lang.String)\n carNo (java.lang.String)\n orgName (java.lang.String)\n amountAll (java.math.BigDecimal)\n memo (java.lang.String)\n settlePerson (java.lang.String)\n employeeName (java.lang.String)\n billDate (java.lang.String)\n detailAddress (java.lang.String)\n contactMobile (java.lang.String)\n gatheringList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n transactionDate (java.lang.String)\n naServicePerson (java.lang.String)\n relationServices (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n relationParts (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n balanceStatus (java.lang.String)\n字段:\n index (java.lang.String)\n paymentType (java.lang.String)\n amount (java.math.BigDecimal)\n infoName (java.lang.String)\n labelName (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "定金收款单.jrxml", + "report_name": "dingjin", + "kb_name": "", + "param_count": 20, + "field_count": 5 + } + }, + { + "id": "chunk_6", + "content": "[JRXML 模板: Blank_A4]\n[JRXML 模板: Blank_A4]\n页面: 223x842\n参数:\n title (java.lang.String)\n abbreviation (java.lang.String)\n billNO (java.lang.String)\n printTime (java.lang.String)\n customerName (java.lang.String)\n cellPhone (java.lang.String)\n carNo (java.lang.String)\n orgName (java.lang.String)\n amountAll (java.math.BigDecimal)\n memo (java.lang.String)\n settlePerson (java.lang.String)\n employeeName (java.lang.String)\n billDate (java.lang.String)\n detailAddress (java.lang.String)\n contactMobile (java.lang.String)\n gatheringList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n transactionDate (java.lang.String)\n naServicePerson (java.lang.String)\n relationServices (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n relationParts (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n balanceStatus (java.lang.String)\n字段:\n paymentType (java.lang.String)\n amount (java.math.BigDecimal)\n infoName (java.lang.String)\n labelName (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "定金收款小票.jrxml", + "report_name": "Blank_A4", + "kb_name": "", + "param_count": 21, + "field_count": 4 + } + }, + { + "id": "chunk_7", + "content": "[JRXML 模板: tkd]\n[JRXML 模板: tkd]\n页面: 136x792\n参数:\n partList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n billNo (java.lang.String)\n abbreviation (java.lang.String)\n modifiedtime (java.lang.String)\n customerName (java.lang.String)\n cars (java.lang.String)\n endDate (java.lang.String)\n memberCardNo (java.lang.String)\n cardName (java.lang.String)\n billType (java.lang.String)\n num (java.lang.Integer)\n amount (java.math.BigDecimal)\n favourable (java.math.BigDecimal)\n receivable (java.math.BigDecimal)\n memo (java.lang.String)\n printOrg (java.lang.String)\n printDate (java.lang.String)\n signUrl (java.lang.String)\n employeeName (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n packageList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n balanceStatus (java.lang.String)\n cardType (java.lang.String)\n checkoutStr (java.lang.String)\n permanent (java.lang.Integer)\n cardAmount (java.math.BigDecimal)\n realAmount (java.math.BigDecimal)\n字段:\n seq (java.lang.Integer)\n name (java.lang.String)\n num (java.lang.Integer)\n infiniteFlag (java.lang.Integer)\n seq (java.lang.Integer)\n name (java.lang.String)\n num (java.math.BigDecimal)\n seq (java.lang.Integer)\n name (java.lang.String)\n num (java.lang.Integer)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "开卡单.jrxml", + "report_name": "tkd", + "kb_name": "", + "param_count": 27, + "field_count": 10 + } + }, + { + "id": "chunk_8", + "content": "[JRXML 模板: jiesuandan]\n[JRXML 模板: jiesuandan]\n页面: 595x842\n参数:\n orgName (java.lang.String)\n gatheringTime (java.lang.String)\n title (java.lang.String)\n printTime (java.lang.String)\n rowList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n column1 (java.lang.String)\n column2 (java.lang.String)\n column3 (java.lang.String)\n column4 (java.lang.String)\n column5 (java.lang.String)\n column6 (java.lang.String)\n column7 (java.lang.String)\n column8 (java.lang.String)\n column9 (java.lang.String)\n column10 (java.lang.String)\n column11 (java.lang.String)\n column12 (java.lang.String)\n column13 (java.lang.String)\n字段:\n row1 (java.lang.String)\n row2 (java.lang.String)\n row3 (java.lang.String)\n row4 (java.lang.String)\n row5 (java.lang.String)\n row6 (java.lang.String)\n row7 (java.lang.String)\n row8 (java.lang.String)\n row9 (java.lang.String)\n row10 (java.lang.String)\n row11 (java.lang.String)\n row12 (java.lang.String)\n row13 (java.lang.String)\n row14 (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "收款日报表打印.jrxml", + "report_name": "jiesuandan", + "kb_name": "", + "param_count": 18, + "field_count": 14 + } + }, + { + "id": "chunk_9", + "content": "[JRXML 模板: checkedQuotation]\n[JRXML 模板: checkedQuotation]\n页面: 595x842\n参数:\n title (java.lang.String)\n billNo (java.lang.String)\n maintainBillNo (java.lang.String)\n printTime (java.lang.String)\n naEmployee (java.lang.String)\n billDate (java.lang.String)\n deliveryTime (java.lang.String)\n naCustomer (java.lang.String)\n carModel (java.lang.String)\n cellPhone (java.lang.String)\n carNoWhole (java.lang.String)\n vin (java.lang.String)\n repairPerson (java.lang.String)\n mileage (java.lang.String)\n oilCapacity (java.lang.String)\n repairPersonContact (java.lang.String)\n nextMileage (java.lang.String)\n nextMaintainDate (java.lang.String)\n customerMemo (java.lang.String)\n merchantAddress (java.lang.String)\n merchantPhone (java.lang.String)\n qrCode (java.lang.String)\n icon (java.lang.String)\n sign (java.lang.String)\n warningLightItemList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n personalCheckInfoList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n computerCheckInfoList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n showWarningLightItem (java.lang.Boolean)\n showComputerCheckInfo (java.lang.Boolean)\n showPersonalCheckInfo (java.lang.Boolean)\n serviceDetailVOList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n stuffDetailVOList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n numberSub (java.math.BigDecimal)\n warningLightBrightItemUrls (java.lang.String)\n字段:\n index (java.lang.String)\n itemComponent (java.lang.String)\n memo (java.lang.String)\n childList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n itemName (java.lang.String)\n itemResults (java.lang.String)\n optionNameS (java.lang.String)\n optionNameE (java.lang.String)\n optionNameU (java.lang.String)\n index (java.lang.String)\n errorCode (java.lang.String)\n itemName (java.lang.String)\n optionNameS (java.lang.String)\n optionNameE (java.lang.String)\n optionNameU (java.lang.String)\n memo (java.lang.String)\n warningIconCode (java.lang.String)\n index (java.lang.String)\n serviceName (java.lang.String)\n workHourPrice (java.math.BigDecimal)\n index (java.lang.String)\n partStanardName (java.lang.String)\n unit (java.lang.String)\n number (java.math.BigDecimal)\n price (java.math.BigDecimal)\n amount (java.math.BigDecimal)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t 26 ? $P{carModel}.substring( 0,26 )+\"...\" :$P{carModel}]]>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t 26 ? $P{customerMemo}.substring( 0,26 )+\"...\" :$P{customerMemo}]]>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t7]]>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t7]]>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t7]]>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t7]]>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t7]]>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t7]]>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t7]]>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t 13*$F{childList}.getData().size() ? $F{memo}.substring( 0,13*$F{childList}.getData().size() )+\"...\" :$F{memo}]]>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t 14 ? $F{memo}.substring( 0,14 )+\"...\" :$F{memo}]]>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t0]]>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t0]]>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t0]]>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t0]]>\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "检测估算单.jrxml", + "report_name": "checkedQuotation", + "kb_name": "", + "param_count": 36, + "field_count": 26 + } + }, + { + "id": "chunk_10", + "content": "[JRXML 模板: jiesuandan]\n[JRXML 模板: jiesuandan]\n页面: 595x842\n参数:\n orgName (java.lang.String)\n detailAddress (java.lang.String)\n contactNumber (java.lang.String)\n fax (java.lang.String)\n bankAccount (java.lang.String)\n email (java.lang.String)\n accountNumber (java.lang.String)\n naCustomer (java.lang.String)\n contactName (java.lang.String)\n contactCellphone (java.lang.String)\n billNo (java.lang.String)\n billDate (java.lang.String)\n mileage (java.math.BigDecimal)\n carNoWhole (java.lang.String)\n carModelShort (java.lang.String)\n deliveryTime (java.lang.String)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n extraCostTotal (java.math.BigDecimal)\n amountAll (java.math.BigDecimal)\n totalWorkHour (java.math.BigDecimal)\n numberCount (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n businessTypeName (java.lang.String)\n creatorName (java.lang.String)\n carModel (java.lang.String)\n vin (java.lang.String)\n printCount (java.lang.String)\n serviceNum (java.lang.String)\n serviceDisCountSubTotal (java.math.BigDecimal)\n totalStuffNum (java.lang.String)\n couponFavourable (java.math.BigDecimal)\n pointFavourable (java.math.BigDecimal)\n partinfoDiscountFavourable (java.math.BigDecimal)\n naEmployee (java.lang.String)\n memo (java.lang.String)\n repairPerson (java.lang.String)\n cellPhone (java.lang.String)\n carBrandName (java.lang.String)\n orgContactMobile (java.lang.String)\n orgDetailAddress (java.lang.String)\n payItemList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n extraChargeList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n stuffDisCountTotal (java.math.BigDecimal)\n selfTotalStuffNum (java.lang.String)\n czkExpense (java.math.BigDecimal)\n disCountAll (java.math.BigDecimal)\n packageFavourable (java.math.BigDecimal)\n serviceFavourable (java.math.BigDecimal)\n partinfoFavourable (java.math.BigDecimal)\n gatheringFavourable (java.math.BigDecimal)\n discountFavourable (java.math.BigDecimal)\n oweAmount (java.math.BigDecimal)\n amountReal (java.math.BigDecimal)\n printTime (java.lang.String)\n creationtime (java.lang.String)\n extraNumber (java.lang.String)\n carSeriesName (java.lang.String)\n qRCodeStr (java.lang.String)\n vipExpense (java.math.BigDecimal)\n storeLogo (java.lang.String)\n partFavourableTotal (java.math.BigDecimal)\n serviceFavourableTotal (java.math.BigDecimal)\n partFavourableCommonTotal (java.math.BigDecimal)\n serviceFavourableCommonTotal (java.math.BigDecimal)\n serviceSubtotalVip (java.math.BigDecimal)\n stuffSubtotalVip (java.math.BigDecimal)\n nextMileage (java.math.BigDecimal)\n printContent (java.lang.String)\n repairPersonContact (java.lang.String)\n payItemTogether (java.lang.String)\n payItemTogetherChinese (java.lang.String)\n printOrgName (java.lang.String)\n orgContactNumber (java.lang.String)\n maintainType (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n balanceStatus (java.lang.String)\n memberCardNo (java.lang.String)\n czkDetailInfo (java.lang.String)\n settleReceivedAmoutChinese (java.lang.String)\n settleOweAmoutChinese (java.lang.String)\n字段:\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n serviceMemo (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n extraPrintVo (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n empNameStr (java.lang.String)\n infiniteFlag (java.lang.Integer)\n unusedNumber (java.lang.Integer)\n number (java.lang.Integer)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "洗车单.jrxml", + "report_name": "jiesuandan", + "kb_name": "", + "param_count": 82, + "field_count": 14 + } + }, + { + "id": "chunk_11", + "content": "[JRXML 模板: carWash]\n[JRXML 模板: carWash]\n页面: 136x842\n参数:\n orgName (java.lang.String)\n detailAddress (java.lang.String)\n contactNumber (java.lang.String)\n fax (java.lang.String)\n bankAccount (java.lang.String)\n email (java.lang.String)\n accountNumber (java.lang.String)\n naCustomer (java.lang.String)\n contactName (java.lang.String)\n contactCellphone (java.lang.String)\n billNo (java.lang.String)\n billDate (java.lang.String)\n mileage (java.math.BigDecimal)\n carNoWhole (java.lang.String)\n carModelShort (java.lang.String)\n deliveryTime (java.lang.String)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n extraCostTotal (java.math.BigDecimal)\n amountAll (java.math.BigDecimal)\n totalWorkHour (java.math.BigDecimal)\n numberCount (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n partList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n businessTypeName (java.lang.String)\n creatorName (java.lang.String)\n carModel (java.lang.String)\n vin (java.lang.String)\n printCount (java.lang.String)\n serviceNum (java.lang.String)\n serviceDisCountSubTotal (java.math.BigDecimal)\n totalStuffNum (java.lang.String)\n couponFavourable (java.math.BigDecimal)\n pointFavourable (java.math.BigDecimal)\n partinfoDiscountFavourable (java.math.BigDecimal)\n naEmployee (java.lang.String)\n memo (java.lang.String)\n repairPerson (java.lang.String)\n cellPhone (java.lang.String)\n carBrandName (java.lang.String)\n orgContactMobile (java.lang.String)\n orgDetailAddress (java.lang.String)\n selfPartList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n payItemList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n extraChargeList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n stuffDisCountTotal (java.math.BigDecimal)\n selfTotalStuffNum (java.lang.String)\n czkExpense (java.math.BigDecimal)\n disCountAll (java.math.BigDecimal)\n packageFavourable (java.math.BigDecimal)\n serviceFavourable (java.math.BigDecimal)\n partinfoFavourable (java.math.BigDecimal)\n gatheringFavourable (java.math.BigDecimal)\n discountFavourable (java.math.BigDecimal)\n oweAmount (java.math.BigDecimal)\n amountReal (java.math.BigDecimal)\n printTime (java.lang.String)\n creationtime (java.lang.String)\n extraNumber (java.lang.String)\n carSeriesName (java.lang.String)\n qRCodeStr (java.lang.String)\n vipExpense (java.math.BigDecimal)\n storeLogo (java.lang.String)\n partFavourableTotal (java.math.BigDecimal)\n serviceFavourableTotal (java.math.BigDecimal)\n partFavourableCommonTotal (java.math.BigDecimal)\n serviceFavourableCommonTotal (java.math.BigDecimal)\n serviceSubtotalVip (java.math.BigDecimal)\n stuffSubtotalVip (java.math.BigDecimal)\n nextMileage (java.math.BigDecimal)\n printContent (java.lang.String)\n repairPersonContact (java.lang.String)\n payItemTogether (java.lang.String)\n payItemTogetherChinese (java.lang.String)\n printOrgName (java.lang.String)\n orgContactNumber (java.lang.String)\n balanceStatus (java.lang.String)\n receiptAmount (java.math.BigDecimal)\n stubPrintFlag (java.lang.String)\n stubServiceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n czkDetailInfo (java.lang.String)\n字段:\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n leftCount (java.math.BigDecimal)\n unusedNumber (java.lang.Integer)\n number (java.lang.Integer)\n subtotal (java.math.BigDecimal)\n empNameStr (java.lang.String)\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n leftCount (java.math.BigDecimal)\n unusedNumber (java.lang.Integer)\n number (java.lang.Integer)\n subtotal (java.math.BigDecimal)\n customCode (java.lang.String)\n partName (java.lang.String)\n unit (java.lang.String)\n number (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n partBrand (java.lang.String)\n standard (java.lang.String)\n supplierCode (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n partMemo (java.lang.String)\n isBring (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n spec (java.lang.String)\n payWay (java.lang.String)\n payAmount (java.math.BigDecimal)\n chinesePayAmount (java.lang.String)\n extraName (java.lang.String)\n subtotal (java.math.BigDecimal)\n memo (java.lang.String)\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n leftCount (java.math.BigDecimal)\n unusedNumber (java.lang.Integer)\n number (java.lang.Integer)\n subtotal (java.math.BigDecimal)\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n leftCount (java.math.BigDecimal)\n unusedNumber (java.lang.Integer)\n number (java.lang.Integer)\n subtotal (java.math.BigDecimal)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t 10 ? 10 : $P{naCustomer}.length(), $P{naCustomer}.length())]]>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t 7 ? 7 : $P{cellPhone}.length(), $P{cellPhone}.length())]]>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t 0 ? $F{serviceName}.replaceAll(\"卡消费\",$F{empNameStr}): $F{serviceName}+\"(\"+$F{empNameStr}+\")\"]]>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "洗车单小票.jrxml", + "report_name": "carWash", + "kb_name": "", + "param_count": 81, + "field_count": 47 + } + }, + { + "id": "chunk_12", + "content": "[JRXML 模板: Blank_A4]\n[JRXML 模板: Blank_A4]\n页面: 595x842\n参数:\n billNo (java.lang.String)\n tradingOrgName (java.lang.String)\n tradingDate (java.lang.String)\n customerName (java.lang.String)\n carNo (java.lang.String)\n employeeName (java.lang.String)\n cardName (java.lang.String)\n memberCardNo (java.lang.String)\n cardEndDate (java.lang.String)\n tradingAmount (java.lang.String)\n amount (java.lang.String)\n remark (java.lang.String)\n orgOfPrinting (java.lang.String)\n dateOfPrinting (java.lang.String)\n字段:\n index (java.lang.String)\n serviceName (java.lang.String)\n cooperationServiceName (java.lang.String)\n cooperationOrgName (java.lang.String)\n auditStatus (java.lang.String)\n cooperationCost (java.math.BigDecimal)\n\n\n\n\n\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "消费单.jrxml", + "report_name": "Blank_A4", + "kb_name": "", + "param_count": 14, + "field_count": 6 + } + }, + { + "id": "chunk_13", + "content": "[JRXML 模板: Blank_A4]\n[JRXML 模板: Blank_A4]\n页面: 595x842\n参数:\n tradingStoreName (java.lang.String)\n tradingTime (java.lang.String)\n idSource (java.lang.String)\n cardName (java.lang.String)\n memberNo (java.lang.String)\n noCar (java.lang.String)\n customerName (java.lang.String)\n paymentTypeAndAmount (java.lang.String)\n orgOfPrinting (java.lang.String)\n dateOfPrinting (java.lang.String)\n amount (java.lang.String)\n字段:\n index (java.lang.String)\n serviceName (java.lang.String)\n cooperationServiceName (java.lang.String)\n cooperationOrgName (java.lang.String)\n auditStatus (java.lang.String)\n cooperationCost (java.math.BigDecimal)\n\n\n\n\n\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "退卡单.jrxml", + "report_name": "Blank_A4", + "kb_name": "", + "param_count": 11, + "field_count": 6 + } + }, + { + "id": "chunk_14", + "content": "[JRXML 模板: stockInPrint]\n[JRXML 模板: stockInPrint]\n页面: 595x842\n参数:\n sortNumber (java.lang.String)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n serviceName (java.lang.String)\n labelName (java.lang.String)\n workHour (java.math.BigDecimal)\n sortNumber (java.lang.String)\n partName (java.lang.String)\n number (java.math.BigDecimal)\n unit (java.lang.String)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n sortNumber (java.lang.String)\n extraName (java.lang.String)\n subtotal (java.math.BigDecimal)\n sortNumber (java.lang.String)\n subtotal (java.math.BigDecimal)\n wayName (java.lang.String)\n title (java.lang.String)\n billNo (java.lang.String)\n billStatus (java.lang.String)\n creatorName (java.lang.String)\n sortNumber (java.lang.String)\n partName (java.lang.String)\n storageName (java.lang.String)\n number (java.lang.String)\n employeeName (java.lang.String)\n sumNumber (java.lang.String)\n saleReturnPartList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n fromMaintainNo (java.lang.String)\n naCustomer (java.lang.String)\n cellPhone (java.lang.String)\n repairPerson (java.lang.String)\n repairPersonContact (java.lang.String)\n carNoWhole (java.lang.String)\n vin (java.lang.String)\n carModel (java.lang.String)\n detailAddress (java.lang.String)\n contactMobile (java.lang.String)\n contactNumber (java.lang.String)\n contactName (java.lang.String)\n contactCellphone (java.lang.String)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n saleReturnServiceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n saleReturnExtraList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n saleReturnWayList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n totalWorkHour (java.math.BigDecimal)\n totalStuffNum (java.math.BigDecimal)\n extraCostTotal (java.math.BigDecimal)\n returnWayTotal (java.math.BigDecimal)\n printCount (java.lang.String)\n serviceMobile (java.lang.String)\n字段:\n sortNumber (java.lang.String)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n serviceName (java.lang.String)\n labelName (java.lang.String)\n workHour (java.math.BigDecimal)\n sortNumber (java.lang.String)\n partName (java.lang.String)\n number (java.math.BigDecimal)\n unit (java.lang.String)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n sortNumber (java.lang.String)\n subtotal (java.math.BigDecimal)\n extraName (java.lang.String)\n sortNumber (java.lang.String)\n subtotal (java.math.BigDecimal)\n wayName (java.lang.String)\n Field_1 (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "退货单.jrxml", + "report_name": "stockInPrint", + "kb_name": "", + "param_count": 53, + "field_count": 19 + } + }, + { + "id": "chunk_15", + "content": "[JRXML 模板: jiesuandan]\n[JRXML 模板: jiesuandan]\n页面: 595x842\n参数:\n orgName (java.lang.String)\n detailAddress (java.lang.String)\n contactNumber (java.lang.String)\n fax (java.lang.String)\n bankAccount (java.lang.String)\n email (java.lang.String)\n accountNumber (java.lang.String)\n naCustomer (java.lang.String)\n contactName (java.lang.String)\n contactCellphone (java.lang.String)\n billNo (java.lang.String)\n billDate (java.lang.String)\n mileage (java.math.BigDecimal)\n carNoWhole (java.lang.String)\n carModelShort (java.lang.String)\n deliveryTime (java.lang.String)\n serviceSubtotalAll (java.math.BigDecimal)\n stuffSubtotalAll (java.math.BigDecimal)\n extraCostTotal (java.math.BigDecimal)\n amountAll (java.math.BigDecimal)\n totalWorkHour (java.math.BigDecimal)\n numberCount (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n partList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n businessTypeName (java.lang.String)\n creatorName (java.lang.String)\n carModel (java.lang.String)\n vin (java.lang.String)\n printCount (java.lang.String)\n serviceNum (java.lang.String)\n serviceDisCountSubTotal (java.math.BigDecimal)\n totalStuffNum (java.lang.String)\n couponFavourable (java.math.BigDecimal)\n pointFavourable (java.math.BigDecimal)\n partinfoDiscountFavourable (java.math.BigDecimal)\n naEmployee (java.lang.String)\n memo (java.lang.String)\n repairPerson (java.lang.String)\n cellPhone (java.lang.String)\n carBrandName (java.lang.String)\n orgContactMobile (java.lang.String)\n orgDetailAddress (java.lang.String)\n selfPartList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n payItemList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n extraChargeList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n stuffDisCountTotal (java.math.BigDecimal)\n selfTotalStuffNum (java.lang.String)\n czkExpense (java.math.BigDecimal)\n disCountAll (java.math.BigDecimal)\n packageFavourable (java.math.BigDecimal)\n serviceFavourable (java.math.BigDecimal)\n partinfoFavourable (java.math.BigDecimal)\n gatheringFavourable (java.math.BigDecimal)\n discountFavourable (java.math.BigDecimal)\n oweAmount (java.math.BigDecimal)\n amountReal (java.math.BigDecimal)\n printTime (java.lang.String)\n creationtime (java.lang.String)\n extraNumber (java.lang.String)\n carSeriesName (java.lang.String)\n qRCodeStr (java.lang.String)\n vipExpense (java.math.BigDecimal)\n storeLogo (java.lang.String)\n partFavourableTotal (java.math.BigDecimal)\n serviceFavourableTotal (java.math.BigDecimal)\n partFavourableCommonTotal (java.math.BigDecimal)\n serviceFavourableCommonTotal (java.math.BigDecimal)\n serviceSubtotalVip (java.math.BigDecimal)\n stuffSubtotalVip (java.math.BigDecimal)\n nextMileage (java.math.BigDecimal)\n printContent (java.lang.String)\n repairPersonContact (java.lang.String)\n payItemTogether (java.lang.String)\n payItemTogetherChinese (java.lang.String)\n printOrgName (java.lang.String)\n orgContactNumber (java.lang.String)\n maintainType (java.lang.String)\n naInsurer (java.lang.String)\n insurancepolicyNo (java.lang.String)\n balanceStatus (java.lang.String)\n czkDetailInfo (java.lang.String)\n receiptAmount (java.math.BigDecimal)\n settleReceivedAmoutChinese (java.lang.String)\n settleOweAmoutChinese (java.lang.String)\n字段:\n serviceName (java.lang.String)\n workHour (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n serviceMemo (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n extraPrintVo (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n customCode (java.lang.String)\n partName (java.lang.String)\n unit (java.lang.String)\n number (java.math.BigDecimal)\n price (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n partBrand (java.lang.String)\n spec (java.lang.String)\n supplierCode (java.lang.String)\n discountedSubtotal (java.math.BigDecimal)\n partMemo (java.lang.String)\n isBring (java.lang.String)\n singleFavourable (java.math.BigDecimal)\n isMember (java.lang.Integer)\n discount (java.math.BigDecimal)\n partCustomCode (java.lang.String)\n standard (java.lang.String)\n cargoSpace (java.lang.String)\n outStockEmployeeName (java.lang.String)\n standa (java.lang.String)\n payWay (java.lang.String)\n payAmount (java.math.BigDecimal)\n chinesePayAmount (java.lang.String)\n extraName (java.lang.String)\n subtotal (java.math.BigDecimal)\n memo (java.lang.String)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "销售单.jrxml", + "report_name": "jiesuandan", + "kb_name": "", + "param_count": 84, + "field_count": 36 + } + }, + { + "id": "chunk_16", + "content": "[JRXML 模板: Blank_A4]\n[JRXML 模板: Blank_A4]\n页面: 222x352\n参数:\n title (java.lang.String)\n abbreviation (java.lang.String)\n billNo (java.lang.String)\n printTime (java.lang.String)\n customerName (java.lang.String)\n cellPhone (java.lang.String)\n carNo (java.lang.String)\n orgName (java.lang.String)\n amountAll (java.math.BigDecimal)\n memo (java.lang.String)\n settlePerson (java.lang.String)\n employeeName (java.lang.String)\n billDate (java.lang.String)\n detailAddress (java.lang.String)\n contactMobile (java.lang.String)\n partList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n transactionDate (java.lang.String)\n naEmployee (java.lang.String)\n mileage (java.math.BigDecimal)\n deliveryTime (java.lang.String)\n vin (java.lang.String)\n carNoWhole (java.lang.String)\n naCustomer (java.lang.String)\n carModelShort (java.lang.String)\n vipExpense (java.math.BigDecimal)\n serviceFavourable (java.math.BigDecimal)\n partFavourableCommonTotal (java.math.BigDecimal)\n oweAmount (java.math.BigDecimal)\n serviceFavourableCommonTotal (java.math.BigDecimal)\n czkExpense (java.math.BigDecimal)\n partinfoFavourable (java.math.BigDecimal)\n discountFavourable (java.math.BigDecimal)\n pointFavourable (java.math.BigDecimal)\n couponFavourable (java.math.BigDecimal)\n balanceStatus (java.lang.String)\n gatheringFavourable (java.math.BigDecimal)\n payItemTogether (java.lang.String)\n orgContactMobile (java.lang.String)\n orgDetailAddress (java.lang.String)\n printOrgName (java.lang.String)\n serviceList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n firstSettlementTime (java.lang.String)\n extraCostTotal (java.math.BigDecimal)\n extraChargeList (net.sf.jasperreports.engine.data.JRMapCollectionDataSource)\n orgContactNumber (java.lang.String)\n czkDetailInfo (java.lang.String)\n creatorName (java.lang.String)\n totalStuffNum (java.lang.String)\n stuffSubtotalAll (java.math.BigDecimal)\n stuffSubtotalVip (java.math.BigDecimal)\n字段:\n subtotal (java.math.BigDecimal)\n serviceName (java.lang.String)\n unusedNumber (java.lang.Integer)\n number (java.lang.Integer)\n isMember (java.lang.Integer)\n partName (java.lang.String)\n number (java.math.BigDecimal)\n subtotal (java.math.BigDecimal)\n isMember (java.lang.Integer)\n\n\n\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t 10 ? 10 : $P{naCustomer}.length(), $P{naCustomer}.length())]]>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t 7 ? 7 : $P{cellPhone}.length(), $P{cellPhone}.length())]]>\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n", + "metadata": { + "chunk_type": "jrxml_template", + "source_file": "销售单小票.jrxml", + "report_name": "Blank_A4", + "kb_name": "", + "param_count": 50, + "field_count": 9 + } + }, + { + "id": "chunk_17", + "content": "# F6 打印单说明知识库", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_18", + "content": "> 来源:`C:\\Users\\hp_z66\\Desktop\\Jaspersoft Studio\\workbuddy-jaspersoft` 目录下 15 个 md 文件整合\n> 整合日期:2026-04-22", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_19", + "content": "1. [打印单定制介绍](#1-打印单定制介绍)\n2. [工具与环境](#2-工具与环境)\n3. [模板修改流程](#3-模板修改流程)\n4. [常见编辑操作](#4-常见编辑操作)\n5. [语法介绍](#5-语法介绍)\n6. [高级语法与工具类](#6-高级语法与工具类)\n7. [保存与输出](#7-保存与输出)\n8. [后台配置与命名规范](#8-后台配置与命名规范)\n9. [常见打印分类及通用模板](#9-常见打印分类及通用模板)\n10. [各打印单接口参数文档](#10-各打印单接口参数文档)\n - 10.1 工单结算单\n - 10.2 新版附表\n - 10.3 结算单(指定内容)\n - 10.4 委托单\n - 10.5 协作单\n - 10.6 增项单\n - 10.7 保险单\n - 10.8 定金单\n - 10.9 报价单\n - 10.10 检测单\n - 10.11 出/入库单据\n - 10.12 调拨单\n - 10.13 材料标签\n - 10.14 采购单/采购退货单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_20", + "content": "## 1. 打印单定制介绍", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_21", + "content": "F6 系统的打印单基于 **TIBCO Jaspersoft Studio** 模板引擎,使用 `.jrxml`(源码)和 `.jasper`(编译后)文件。打印数据由后端接口传入模板参数,模板通过 `$P{}` / `$F{}` 表达式渲染。", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_22", + "content": "| 名称 | 地址 |\n|------|------|\n| 打印单后台 | http://print.f6yc.com/print-server/ui/index.html#/template/classification |\n| 打印单模板样式 | https://xcz.yuque.com/ombipo/rpc7ms/fbd6ay?singleDoc# |\n| 打印单参数表 | https://xcz.yuque.com/ombipo/rpc7ms/ro5fs1?singleDoc# |\n| 简易开发教程 | https://alidocs.dingtalk.com/i/nodes/dQPGYqjpJYgZGbvbCdEKGDGZWakx1Z5N |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_23", + "content": "## 2. 工具与环境", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_24", + "content": "| 项目 | 说明 |\n|------|------|\n| 编辑工具 | TIBCO Jaspersoft Studio |\n| **默认版本** | Jaspersoft 6.3.1 + JDK 1.6 |\n| **可选版本** | Jaspersoft 6.8 + JDK 1.8(用户可指定) |\n| WIN 下载 | 钉钉附件《Jaspersoft Studio-6.3.1.final.rar》 |\n| MAC 下载 | 钉钉附件《TIBCOJaspersoftStudio-6.3.1.final-mac-x86_64.zip》 |\n| 工具类 JAR | print-core-1.0.7.jar(金额转大写、日期转换) |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_25", + "content": "> **版本说明**:默认使用 Jaspersoft 6.3.1 + JDK 1.6。如需使用 JDK 1.8 语法(如 stream API 从 List 中取特定值),需指定使用 Jaspersoft 6.8 + JDK 1.8 版本。", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_26", + "content": "## 3. 模板修改流程", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_27", + "content": "1. **下载模板**:在打印单后台通过模板名称查询并下载 `.jrxml` 文件\n2. **打开编辑**:Jaspersoft Studio → File → Open File → 选择模板\n3. **编辑模板**:增减组件、调整参数、修改样式\n4. **格式预览**:工具内只能预览样式,参数判断需上传到门店后实际打印预览\n5. **保存输出**:保存 `.jrxml` → Compile Report 生成 `.jasper` → Export 到桌面\n6. **后台配置**:上传模板、配置门店生效", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_28", + "content": "## 4. 常见编辑操作", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_29", + "content": "### 4.1 新增静态文本", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_30", + "content": "1. 从 Palette 拖拽 Static Text 组件到模板\n2. 双击编辑显示文本\n3. 调整组件大小和位置参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_31", + "content": "### 4.2 新增动态字段(如展示工单号)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_32", + "content": "1. 在参数表中搜索参数名称和类型(如 `billNo`,类型 `java.lang.String`)\n2. 拖拽 Text Field 组件到模板\n3. 双击写入公式:`$P{参数名称}`\n4. 若提示 \"The current expression is not valid\":\n - 说明参数未预设,需手动创建\n - Outline → Parameters(右键)→ Create Parameter\n - 设置 Name(参数名)和 Class(数字:`java.math.BigDecimal`,文本:`java.lang.String`)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_33", + "content": "### 4.3 列表中增减字段(如项目列表、材料列表)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_34", + "content": "1. 确认参数所属列表(如 `partName` 属于 `partList`)\n2. 双击列表进入编辑页面\n3. 列表内参数固定写法:`$F{参数名称}`(注意不是 `$P{}`)\n4. 列表内只能使用所属列表下的参数,不可跨列表引用\n5. 未预设参数需在列表编辑页面内新增 Field", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_35", + "content": "### 4.4 新增边框和样式", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_36", + "content": "- 选择组件 → Properties → Borders 编辑", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_37", + "content": "## 5. 语法介绍", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_38", + "content": "### 5.1 基础语法", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_39", + "content": "| 用途 | 语法 | 示例 |\n|------|------|------|\n| 文本拼接参数 | `$P{参数}+\"文本\"` | `$P{printOrgName}+\"结算单\"` |\n| 保留小数 | `$P{参数}.setScale(位数, BigDecimal.ROUND_DOWN)` | `$P{stuffSubtotalAll}.setScale(2, BigDecimal.ROUND_DOWN)` |\n| 字符串截取 | `$P{参数}.substring(起始,长度)` | `$P{billDate}.substring(0,10)` |\n| IF 判断 | `(条件) ? 值1 : 值2` | `($P{printOrgName}==null?$P{orgName}:$P{printOrgName})+\"结算单\"` |\n| 相等判断 | `==` 或 `.equals(\"文本\")` | `$P{balanceStatus}.equals(\"7100\")` |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_40", + "content": "### 5.2 运算语法", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_41", + "content": "| 运算 | 语法 |\n|------|------|\n| 加 | `$P{参数1}.add($P{参数2})` |\n| 减 | `$P{参数1}.subtract($P{参数2})` |\n| 乘 | `$P{参数1}.multiply($P{参数2})` 或 `$P{参数1}.multiply(new BigDecimal(1.13))` |\n| 除 | `$P{参数1}.divide($P{参数2}, 2, BigDecimal.ROUND_HALF_UP)` |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_42", + "content": "## 6. 高级语法与工具类", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_43", + "content": "### 6.1 JAR 包导入(金额转大写等)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_44", + "content": "1. 项目右键 → Properties → Java Build Path → Add External JARs → 选择 `print-core-1.0.7.jar`\n2. 启用成功后按语法调用", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_45", + "content": "### 6.2 数字金额转中文大写", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_46", + "content": "```\ncom.f6car.printserver.core.CharacterUtil.chinese($P{amount}==null?BigDecimal.ZERO:$P{amount})\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_47", + "content": "### 6.3 日期时间戳转日期", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_48", + "content": "参数类型选 `java.lang.Long`:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_49", + "content": "```\n$P{nextMaintainDateRemind} == null ? \"\" : new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").format(new Date($P{nextMaintainDateRemind}))\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_50", + "content": "### 6.4 从 List 中取特定值写入外层表格(JDK 1.8 语法)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_51", + "content": "从支付方式列表 `payItemList` 中找到支付方式等于\"记账\"的第一个支付金额:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_52", + "content": "```java\n$P{payItemList}.getData().stream()\n .filter(map -> \"记账\".equals(map.get(\"payWay\")))\n .map(map -> {\n Object amt = map.get(\"payAmount\");\n return amt == null ? BigDecimal.ZERO : new BigDecimal(amt.toString());\n })\n .findFirst()\n .orElse(BigDecimal.ZERO)\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_53", + "content": "## 7. 保存与输出", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_54", + "content": "1. **保存** `.jrxml` 源文件\n2. 右键 `.jrxml` → **Compile Report** → 生成 `.jasper` 编译文件\n3. 右键 `.jasper` → **Export Files to...** → 另存到桌面\n4. 上传 `.jasper` 到打印单后台", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_55", + "content": "## 8. 后台配置与命名规范", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_56", + "content": "### 8.1 注意事项", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_57", + "content": "- **不要随意删除模板**,删除不可恢复\n- **结算单模板名称必须包含\"结算单\"三个字**,否则收款后无法显示\n- **洗车单定制模板名称必须包含\"洗车单\"三个字**", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_58", + "content": "### 8.2 命名规范", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_59", + "content": "| 类型 | 模板名称 | 模板编码 | 模板备注 |\n|------|----------|----------|----------|\n| 简单调整 | 基础表+特殊修改需求 | 修改人姓名首字母+模板分类+日期 | 各修改点 |\n| 定制调整 | 门店名称+定制 | 修改人姓名首字母+模板分类+日期 | 各修改点 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_60", + "content": "## 9. 常见打印分类及通用模板", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_61", + "content": "| 打印单分类 | 对应系统打印模块 | 通用模板名称 | 模板编码 |\n|------------|------------------|--------------|----------|\n| 新结算单打印 | 维保单 | F6标准结算单(壹) | newSettleFirst |\n| 结算单-新 | 除维保单的其他单据 | 无 | 无 |\n| 附表-新 | 新附表 | 无 | 无 |\n| 销售单 | 销售单 | 销售单(日期版) | xiaoshodanriqiban |\n| 洗车单 | 洗车单 | 洗车单 | wash01 |\n| 报价单打印 | 报价单 | 报价单打印 | quotationPrint |\n| 新库存入库单打印 | 入库单 | 新库存入库单打印 | 9001 |\n| 新库存出库单打印 | 出库单 | 新库存出库单打印 | 9002 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_62", + "content": "> **注意**:采购单和采购退货单走打印平台定制,需先向赵亚妮提供门店编码、门店名称开通后再上传配置", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_63", + "content": "## 10. 各打印单接口参数文档", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_64", + "content": "### 10.1 工单结算单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_65", + "content": "**打印平台模版分类**:新结算单打印 / 结算单-新", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_66", + "content": "| 接口类型 | 地址 | 方法 |\n|----------|------|------|\n| maintain 接口 | `/print/dispatchPrint/genUrl` | POST |\n| erp 接口 | `/print/getPrintPDFPath.do?templateId=&templateType=newSettlePrint&idSourceBill=` | GET |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_67", + "content": "**maintain 入参**:`{ \"pkId\": \"工单ID\", \"rowCode\": \"costSettlePrint\", \"rowId\": \"12\" }`", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_68", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| **基础信息** | | |\n| billNo | String | 工单号 |\n| maintainType | String | 工单类型 |\n| balanceStatus | String | 结算状态:\"7000\"未结算 / \"7100\"已结算 / \"7200\"部分结算 |\n| creatorName | String | 创建人名称 |\n| naEmployee | String | 服务顾问 |\n| creationtime | String | 创建时间 |\n| memo | String | 工单备注 |\n| printCount | String | 打印次数 |\n| printTime | String | 打印时间 |\n| deliveryTime | String | 交车时间 |\n| mergePackageContent | String | 套餐合并标识 |\n| printContent | String | 免责条款 |\n| engineNumber | String | 发动机号 |\n| transmissionNo | String | 变速箱号 |\n| **金额信息** | | |\n| amountAll | Double | 应收总计 |\n| disCountAll | Double | 总优惠合计 |\n| oweAmount | Double | 未收金额 |\n| receiptAmount | Double | 实收金额 |\n| chineseAmount | String | 实收金额(大写) |\n| vipExpense | Double | 会员卡消费金额 |\n| czkExpense | Double | 储值卡消费金额 |\n| serviceSubtotalAll | Double | 工时费小计 |\n| stuffSubtotalAll | Double | 材料费小计 |\n| serviceDisCountSubTotal | Double | 项目折后金额合计 |\n| stuffDisCountTotal | Double | 材料折后金额合计 |\n| partFavourableTotal | Double | 材料优惠金额合计 |\n| serviceFavourableTotal | Double | 项目优惠金额合计 |\n| extraCostTotal | Double | 附加费小计 |\n| **托修方信息** | | |\n| naCustomer | String | 单位名称/托修方 |\n| repairPerson | String | 送修人 |\n| carNoWhole | String | 车牌号整体 |\n| carBrandName | String | 品牌名称 |\n| carSeriesName | String | 车系名称 |\n| businessTypeName | String | 维修类别 |\n| vin | String | 车辆VIN码 |\n| billDate | String | 进厂日期 |\n| mileage | BigDecimal | 出厂里程 |\n| cellPhone | String | 联系电话 |\n| **承修方信息** | | |\n| orgName | String | 单位名称 |\n| abbreviation | String | 门店简称 |\n| orgContactNumber | String | 联系电话 |\n| orgDetailAddress | String | 联系地址 |\n| orgContactMobile | String | 联系电话 |\n| bankAccount | String | 开户银行 |\n| accountNumber | String | 账号 |\n| **二期新增** | | |\n| oilCapacity | String | 油量 |\n| nextMileage | Double | 下次保养里程 |\n| nextMaintainDate | String | 下次保养日期 |\n| memberCardNo | String | 会员号 |\n| points | String | 积分 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_69", + "content": "#### serviceList(项目列表)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_70", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| sortNumber | String | 序号 |\n| customCode | String | 项目编码 |\n| serviceName | String | 项目名称 |\n| labelName | String | 业务分类名称 |\n| price | Double | 工时单价 |\n| workHour | Double | 工时 |\n| subtotal | Double | 金额 |\n| discount | Double | 折扣 |\n| discountedSubtotal | Double | 折后金额 |\n| singleFavourable | Double | 优惠金额 |\n| taxRateOutput | BigDecimal | 销项税率 |\n| isMember | Integer | 是否会员卡项目 |\n| empNameStr | String | 修理工 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_71", + "content": "#### partList(材料列表)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_72", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| sortNumber | String | 序号 |\n| customCode | String | 材料编码 |\n| partName | String | 材料名称 |\n| partBrand | String | 配件品牌 |\n| spec | String | 规格型号 |\n| partShowName | String | 配件名称规格型号品牌 |\n| supplierCode | String | 供应商编码(零件号) |\n| unit | String | 单位 |\n| number | Double | 数量 |\n| price | Double | 价格 |\n| subtotal | Double | 金额 |\n| discount | Double | 折扣 |\n| discountedSubtotal | Double | 折后金额 |\n| singleFavourable | Double | 优惠金额 |\n| isBring | Integer | 是否自带(1自带) |\n| taxRateOutput | BigDecimal | 销项税率 |\n| cargoSpace | String | 货位 |\n| applyModel | String | 适用车型 |\n| employeeName | String | 员工名称 |\n| outStockEmployeeName | String | 领料人 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_73", + "content": "#### payItemList(付款方式)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_74", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| payWay | String | 付款方式 |\n| payAmount | Double | 付款金额 |\n| chinesePayAmount | String | 大写付款方式 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_75", + "content": "**结算前待付/结算后实付(根据 balanceStatus 判断)**:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_76", + "content": "```\n$P{balanceStatus}.equals(\"7100\") ? 实付逻辑 : 待付逻辑\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_77", + "content": "**对应大写**:\n```\n$P{balanceStatus}.equals(\"7100\") ? $P{payItemTogetherChinese} : $P{settleOweAmoutChinese}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_78", + "content": "### 10.2 新版附表", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_79", + "content": "**打印平台模版分类**:附表-新", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_80", + "content": "1. **新版附表没有 `billStatus`、`balanceStatus` 字段**,切勿使用做判断。用 `payItemList` 判空替代:\n - 收银金额:`$P{payItemList}.getRecordCount()==0?$P{receivedAmount}:$P{receivedAmount}.setScale(2,BigDecimal.ROUND_HALF_EVEN).toString()+\"(\"+$P{paymentTypeDetails}+\")\"`\n - 合计金额:`$P{payItemList}.getRecordCount()==0?($P{settleOweAmout}).setScale(2,BigDecimal.ROUND_HALF_EVEN):($P{settleReceivedAmout}).setScale(2,BigDecimal.ROUND_HALF_EVEN)`", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_81", + "content": "2. **新版附表没有 `maintainType` 字段**,用 `fromMaintainType` 替代判断。如判断理赔:`fromMaintainType.equals('LPD')`", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_82", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| billNo | String | 附表单号 |\n| fromBillNo | String | 附表源工单号 |\n| fromMaintainType | String | 来源单据类型 |\n| billDate | String | 进厂日期 |\n| naEmployee | String | 服务顾问 |\n| businessTypeName | String | 业务类型 |\n| naCustomer | String | 客户姓名 |\n| cellPhone | String | 联系电话 |\n| carNoWhole | String | 车牌号 |\n| vin | String | 车辆VIN码 |\n| carModel | String | 品牌车型全称 |\n| carModelShort | String | 车型简称 |\n| mileage | Double | 出厂里程 |\n| amountAll | Double | 应收总计 |\n| amountAllChinese | String | 应收总计中文大写 |\n| disCountAll | Double | 总优惠合计 |\n| amountReal | Double | 实收金额 |\n| oweAmount | Double | 未收金额 |\n| receiptAmount | Double | 收据金额 |\n| serviceSubtotalAll | Double | 工时费小计 |\n| stuffSubtotalAll | Double | 材料费小计 |\n| extraCostTotal | Double | 附加费小计 |\n| payItemList | List | 付款方式集合 |\n| serviceList | List | 项目集合 |\n| partList | List | 材料集合 |\n| extraChargeList | List | 附加费用集合 |\n| extraPrintVo | Object | 附加项目 |\n| printContent | String | 免责条款 |\n| orgName | String | 门店名称 |\n| printOrgName | String | 打印抬头 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_83", + "content": "### 10.3 结算单(指定内容)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_84", + "content": "**打印平台模版分类**:结算单-新", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_85", + "content": "- **接口**:`/blazer/maintenance/print/file/dispatchCondition`\n- **方法**:POST\n- **支持场景**:维保单/洗车单/维修单/贴膜单/理赔单/零售单,支持指定项目/材料/附加费打印", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_86", + "content": "```json\n{\n \"rowId\": \"10329\",\n \"rowCode\": \"partialSettlementStatement\",\n \"pkId\": \"工单ID\",\n \"serviceList\": [{ \"pkId\": 项目ID, \"module\": 1 }],\n \"partList\": [{ \"pkId\": 材料ID, \"module\": 2 }],\n \"extraList\": [{ \"type\": 附加费类型, \"module\": 3 }]\n}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_87", + "content": "#### PrintModuleEnum 打印模块枚举", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_88", + "content": "| key | code | name |\n|-----|------|------|\n| MAN_HOUR_COST | 1 | 工时费模块 |\n| MATERIAL_COST | 2 | 材料费模块 |\n| EXTRA_COST | 3 | 附加费模块 |\n| OTHER_COST | 4 | 其他费用模块 |\n| SERVICE_COST | 5 | 服务费用模块 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_89", + "content": "与结算单类似,额外包含 `signaturePhotoUrl`(签名图片)、`storeLogo`(logo)等字段。", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_90", + "content": "#### 扩展模块列表 extendedModuleList", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_91", + "content": "| 字段 | 说明 |\n|------|------|\n| module | 打印模块(PrintModuleEnum.code) |\n| name | 项目/材料/附加费名称 |\n| number | 工时/数量/\"-\" |\n| price | 单价/\"-\" |\n| subtotal | 金额 |\n| discount | 折扣(附加费为1.00) |\n| discountedSubtotal | 折后金额 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_92", + "content": "### 10.4 委托单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_93", + "content": "**打印平台模版分类**:委托单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_94", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| printOrgName | String | 打印抬头 |\n| orgName | String | 维修厂名称 |\n| billNo | String | 工单号 |\n| naEmployee | String | 服务顾问 |\n| employeePhone | String | 服务顾问手机号 |\n| naCustomer | String | 单位名称(客户姓名) |\n| carNoWhole | String | 车牌号整体 |\n| cellPhone | String | 联系电话 |\n| repairPerson | String | 送修人 |\n| repairPersonContact | String | 送修人联系方式 |\n| billDate | String | 进厂日期 |\n| deliveryTime | String | 交车时间 |\n| mileage | BigDecimal | 出厂里程 |\n| oilCapacity | String | 当前油量 |\n| vin | String | 车辆VIN码 |\n| carModelShort | String | 车型简称 |\n| signaturePhotoUrl | String | 签名图片 |\n| orgContactNumber | String | 联系电话(维修厂) |\n| orgDetailAddress | String | 联系地址(维修厂) |\n| printContentEntrust | String | 委托单免责条款 |\n| serviceSubtotalVip | BigDecimal | 服务项目明细小计(会员项目) |\n| stuffSubtotalVip | BigDecimal | 材料收入小计(会员项目) |\n| serviceSubtotalAll | BigDecimal | 工时费小计 |\n| stuffSubtotalAll | BigDecimal | 材料费小计 |\n| serviceList | List | 工单对应项目集合 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_95", + "content": "**ServicePrintAttribute**:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_96", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| serviceName | String | 项目名称 |\n| price | BigInteger | 工时单价 |\n| workHour | BigInteger | 工时 |\n| subtotal | BigInteger | 金额 |\n| serviceMemo | String | 附加信息备注 |\n| isMember | Integer | 当前项目是否使用会员 |\n| empNameStr | String | 修理工名称 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_97", + "content": "### 10.5 协作单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_98", + "content": "**打印平台模版分类**:协作单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_99", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| title | String | 打印抬头(门店简称) |\n| billNo | String | 工单号 |\n| creatorName | String | 制单人 |\n| printTime | String | 打印时间 |\n| naEmployee | String | 服务顾问 |\n| billDate | String | 进厂日期 |\n| deliveryTime | String | 交车时间 |\n| naCustomer | String | 车主姓名 |\n| cellPhone | String | 车主电话 |\n| carModel | String | 车型 |\n| carNoWhole | String | 车牌号 |\n| vin | String | 车辆VIN码 |\n| amountAll | BigDecimal | 小计 |\n| serviceDetailVOList | List | 协作项目集合 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_100", + "content": "**CooperationServicePrintAttribute**:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_101", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| serviceName | String | 工单项目名称 |\n| cooperationServiceName | String | 协作项目名称 |\n| cooperationOrgName | String | 协作门店 |\n| auditStatus | String | 审核状态 |\n| cooperationCost | BigDecimal | 协作成本 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_102", + "content": "### 10.6 增项单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_103", + "content": "**打印平台模版分类**:增项单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_104", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| title | String | 打印抬头(门店名称+\"新增项目确认单\") |\n| sourceBillNo | String | 关联工单号 |\n| printTime | String | 打印时间 |\n| naEmployee | String | 服务顾问 |\n| arrivalTime | String | 进厂日期 |\n| deliveryTime | String | 交车时间 |\n| naCustomer | String | 车主姓名 |\n| cellPhone | String | 车主电话 |\n| repairPerson | String | 送修人 |\n| repairPersonContact | String | 送修人联系方式 |\n| carModel | String | 车型 |\n| carNoWhole | String | 车牌号 |\n| carColor | String | 车身颜色 |\n| engineCode | String | 发动机号 |\n| vin | String | 车辆VIN码 |\n| mileage | String | 进厂里程 |\n| oilCapacity | String | 进厂油量 |\n| merchantAddress | String | 商家联系地址 |\n| merchantTel | String | 商家联系方式(固定电话) |\n| merchantPhone | String | 商家联系方式(手机) |\n| workHourPriceSubtotal | String | 工时费(小计) |\n| amountSubtotal | String | 材料费(小计) |\n| attachedServiceVoList | List | 增项服务项目集合 |\n| attachedStuffVoList | List | 增项配件材料集合 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_105", + "content": "**ServicePrintAttribute**(增项服务):", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_106", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| serviceName | String | 项目名称 |\n| labelName | String | 业务分类 |\n| customCode | String | 项目编码 |\n| price | Double | 工时单价 |\n| workHour | Double | 工时 |\n| number | Integer | 项目数量 |\n| discount | Double | 折扣 |\n| discountedSubtotal | Double | 折后金额 |\n| subtotal | Double | 金额 |\n| serviceMemo | String | 项目备注 |\n| isMember | Integer | 是否使用会员 |\n| nameMember | String | 会员项目来源名 |\n| empNameStr | String | 修理工名称 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_107", + "content": "**PartPrintAttribute**(增项材料):", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_108", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| partName | String | 材料名称 |\n| labelName | String | 业务分类 |\n| partBrand | String | 配件品牌 |\n| customCode | String | 材料编码 |\n| price | Double | 单价 |\n| number | Integer | 材料数量 |\n| unit | String | 单位 |\n| discount | Double | 折扣 |\n| discountedSubtotal | Double | 折后金额 |\n| subtotal | Double | 金额 |\n| partMemo | String | 材料备注 |\n| isMember | Integer | 是否使用会员 |\n| nameMember | String | 会员项目来源名 |\n| employeeName | String | 员工名称 |\n| empNameStr | String | 修理工名称 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_109", + "content": "### 10.7 保险单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_110", + "content": "**打印平台模版分类**:保险单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_111", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| companyTitle | String | 打印title |\n| customerName | String | 客户姓名 |\n| carNo | String | 车牌号 |\n| vin | String | vin码 |\n| carModel | String | 车型 |\n| cellPhone | String | 手机号 |\n| insureDate | String | 起保日期(yyyy-MM-dd) |\n| receivable | BigDecimal | 应收金额 |\n| preferentialAmount | BigDecimal | 优惠金额 |\n| receiveAmount | BigDecimal | 实收金额 |\n| oweAmount | BigDecimal | 未收金额 |\n| commissionAmountTotal | BigDecimal | 手续费 |\n| companyRefundAmount | BigDecimal | 保险公司返点 |\n| customerRefundAmount | BigDecimal | 客户返点 |\n| insuranceCompanyName | String | 承保公司 |\n| memo | String | 备注 |\n| employeeName | String | 服务顾问 |\n| contacts | String | 保险公司联系人 |\n| contactMobile | String | 保险公司联系人手机号 |\n| channelName | String | 来店途径 |\n| startDate | String | 开始日期(yyyy-MM-dd) |\n| endDate | String | 结束日期(yyyy-MM-dd) |\n| renewal | Integer | 是否续保(0否/1是) |\n| tsInsuranceDetailList | List | 保险单明细 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_112", + "content": "**TsInsuranceDetailPrintVo**:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_113", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| policyNo | String | 保单号 |\n| insuranceType | Integer | 保险类型(0交强险/1商业险) |\n| name | String | 险种名称 |\n| amount | BigDecimal | 保额 |\n| receivable | BigDecimal | 应收金额 |\n| discount | BigDecimal | 折扣 |\n| concessionary | BigDecimal | 优惠金额 |\n| commissionRate | BigDecimal | 手续费率 |\n| commissionAmount | BigDecimal | 手续费 |\n| paid | BigDecimal | 实收金额 |\n| memo | String | 备注 |\n| companyRefundAmount | BigDecimal | 保险公司返点 |\n| customerRefundAmount | BigDecimal | 客户返点 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_114", + "content": "### 10.8 定金单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_115", + "content": "**打印平台模版分类**:定金单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_116", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| title | String | 标题(门店名称) |\n| abbreviation | String | 门店简称 |\n| billNO | String | 定金单号 |\n| printTime | String | 打印时间 |\n| customerName | String | 客户姓名 |\n| cellPhone | String | 手机号码 |\n| carNo | String | 适用车辆(顿号隔开) |\n| orgName | String | 适用门店(顿号隔开) |\n| balanceStatus | String | 结算状态 |\n| receivedAmount | Double | 已收金额 |\n| amount | Double | 收款交易金额 |\n| amountAll | Double | 定金单收款小计 |\n| preRefundBalance | Double | 定金单退款前余额 |\n| advancesReceivedBalance | Double | 定金单收款后剩余面额 |\n| memo | String | 定金备注 |\n| settlePerson | String | 结算人 |\n| employeeName | String | 收款人 |\n| businessDate | String | 收款时间 |\n| billDate | String | 交易时间 |\n| transactionDate | String | 交易时间 |\n| detailAddress | String | 联系地址 |\n| contactMobile | String | 联系方式 |\n| naServicePerson | String | 服务顾问 |\n| gatheringList | List | 收款方式列表 |\n| relationServices | List | 适用项目列表 |\n| relationParts | List | 适用材料列表 |\n| relationCars | List | 适用车辆列表 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_117", + "content": "**gatheringList** 项:paymentType(支付方式), amount(金额-BigDecimal)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_118", + "content": "**relationServices** 项:infoId(项目id), infoName(项目名称), labelName(业务分类)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_119", + "content": "**relationParts** 项:infoId(材料id), infoName(材料名称), labelName(业务分类)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_120", + "content": "**relationCars** 项:idCar(车辆信息id), carNo(车牌号), vin(vin码)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_121", + "content": "### 10.9 报价单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_122", + "content": "**打印平台模版分类**:报价单打印", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_123", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| partDetailVoList | List | 材料列表 |\n| serviceDetailVoList | List | 项目列表 |\n| amountChinese | String | 商品金额中文大写 |\n| realAmountWithoutCardChinese | String | 待付金额中文大写 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_124", + "content": "#### QuotationPartDetailPrintVo(报价单材料)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_125", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| pkId | BigInteger | 无意义主键 |\n| partName | String | 材料名称 |\n| partShowName | String | 材料显示名称 |\n| number | BigDecimal | 数量 |\n| price | BigDecimal | 单价 |\n| subtotal | BigDecimal | 总价 |\n| discount | BigDecimal | 折扣 |\n| realSubtotal | BigDecimal | 折后总计 |\n| unit | String | 单位 |\n| spec | String | 规格型号 |\n| brand | String | 品牌名称 |\n| supplierCode | String | 零件号 |\n| customCode | String | 材料编码 |\n| employeeName | String | 服务员工姓名 |\n| memo | String | 备注 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_126", + "content": "#### QuotationServiceDetailPrintVo(报价单项目)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_127", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| pkId | BigInteger | 无意义主键 |\n| customCode | String | 项目编码 |\n| serviceName | String | 项目名称 |\n| workHour | BigDecimal | 工时 |\n| price | BigDecimal | 单价 |\n| subtotal | BigDecimal | 工时费 |\n| discount | BigDecimal | 折扣 |\n| realSubtotal | BigDecimal | 折后金额 |\n| memo | String | 备注 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_128", + "content": "### 10.10 检测单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_129", + "content": "**打印平台模版分类**:检测单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_130", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| carCheckPackageName | String | 模板名称 |\n| title | String | 标题 |\n| billNo | String | 检测单号 |\n| printTime | String | 打印时间 |\n| naEmployee | String | 服务顾问 |\n| billDate | String | 进厂时间 |\n| deliveryTime | String | 预计交车 |\n| naCustomer | String | 车主 |\n| carModel | String | 车型 |\n| cellPhone | String | 车主电话 |\n| carNoWhole | String | 车牌号 |\n| vin | String | vin码 |\n| repairPerson | String | 送修人 |\n| repairPersonContact | String | 送修人联系方式 |\n| mileage | String | 进厂里程 |\n| oilCapacity | String | 进厂油量 |\n| nextMileage | String | 下次保养里程 |\n| nextMaintainDate | String | 下次保养日期 |\n| customerMemo | String | 车主描述 |\n| merchantAddress | String | 联系地址 |\n| merchantPhone | String | 联系方式 |\n| qrCode | String | 二维码 |\n| qrCodeToB | String | B端二维码 |\n| qrCodeToC | String | C端二维码 |\n| icon | String | 车辆环视图 |\n| maintainBillNo | String | 结算单号 |\n| showComputerCheckInfo | Boolean | 是否展示电脑检测 |\n| computerCheckInfoList | List | 电脑检测 |\n| personalCheckInfoList | List | 人工检测项(正常+异常) |\n| sortedPersonalCheckInfoList | List | 人工检测项(问题排序靠前) |\n| optionPersonalCheckInfoList | List | 异常人工检测项 |\n| normalPersonalCheckInfoList | List | 正常人工检测项 |\n| iconMemo | String | 环视图备注 |\n| iconResult | String | 环视图结论 |\n| warningLightResult | String | 警示灯结论 |\n| showWarningLightItem | Boolean | 是否展示警示灯 |\n| warningLightItemList | List | 警示灯 |\n| employeeName | String | 服务技师 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_131", + "content": "#### ComputerPrintItem(电脑检测项)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_132", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| index | String | 序号 |\n| errorCode | String | 故障码 |\n| itemName | String | 检测项目 |\n| optionNameS | String | 建议处理(Y) |\n| optionNameE | String | 择期处理(Y) |\n| optionNameU | String | 急需处理(Y) |\n| memo | String | 备注 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_133", + "content": "#### PersonalPrintItem(人工检测小类)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_134", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| index | BigInteger | 序号 |\n| itemComponent | String | 检测部件 |\n| memo | String | 备注 |\n| childList | List | 子项目列表 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_135", + "content": "#### PrintTinyItem(检测项目)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_136", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| itemName | String | 检测项目 |\n| itemResults | String | 检测结果 |\n| optionNameS | String | 建议处理(Y) |\n| optionNameE | String | 择期处理(Y) |\n| optionNameU | String | 急需处理(Y) |\n| memo | String | 备注 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_137", + "content": "### 10.11 出/入库单据", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_138", + "content": "| 场景 | 入口 | REST 接口 | 底层接口 |\n|------|------|-----------|----------|\n| 库存出库单 | 出入库单据-出库单 | `/stock/stockInAndOutBill/stockOutPrint?idStock=XXX&isNew=true` | PrintServiceImpl#getStockOutPrintUrl |\n| 库存入库单 | 出入库单据-入库单 | `/stock/stockInAndOutBill/stockInPrint?idStock=XXX&isNew=true` | PrintServiceImpl#getStockInPrintUrl |\n| 手工出入库 | 手工出入库 | `/stock/manual/print?pkId=XXX&billType=0&isNew=true` | PrintService#getManualStorageStockInPrintUrl |\n| 领料单 | 领料详情 | `/stock/maintain/print?idSourceBill=XXX&hasPreview=true` | PrintServiceImpl#getMaintainPrintUrl |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_139", + "content": "> 日志关键字:出库单→\"出库单打印参数\",入库单→\"入库单打印参数\",手工→\"手工出入库单据打印入参是\",领料→\"领料单打印参数\"", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_140", + "content": "#### 出库单参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_141", + "content": "**定制类模版分类**:`newStockOutMaintainCustomPrint`(20250925新增)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_142", + "content": "| 字段 | 说明 | 备注 |\n|------|------|------|\n| title | 门店名称+\"出库单\" | |\n| billNo | 出库单号 | |\n| sourceBillNo | 来源单号 | |\n| showSourceBillNo | 显示来源单号(boolean) | |\n| billStatus | 单据状态(制单/完成) | |\n| inOutDate | 出库日期 | |\n| showInOutDate | 是否显示出库日期(boolean) | |\n| objectName | 出入库对象 | |\n| objectNameGD | 出入库对象工单 | 客户姓名+车牌+VIN+品牌车系车型(前80字符) |\n| creatorName | 制单人 | |\n| billDate | 制单日期(yyyy-MM-dd) | |\n| sumNumber | 材料总数量 | |\n| sumAmount | 总金额 | 脱敏显示**** |\n| chineseAmount | 总金额(中文大写) | 脱敏显示**** |\n| nowDateTime | 打印当前时间(yyyy-MM-dd HH:mm) | |\n| idOwnOrg | 门店ID | |\n| remark | 备注信息 | |\n| showRemark | 是否显示备注(boolean) | |\n| isGdType | 是否工单类型(boolean) | |\n| saName | 服务顾问 | 工单出库场景 |\n| printCount | 打印次数 | |\n| showCustomCode | 是否显示材料编码(boolean) | |\n| showBusinessLabel | 是否显示业务分类(boolean) | |\n| showApplyModel | 是否显示适用车型(boolean) | |\n| showStorageName | 是否显示仓库(boolean) | |\n| showDefSeat | 是否显示货位(boolean) | |\n| showChineseAmount | 是否显示大写金额(boolean) | |\n| showChineseSubtotal | 是否显示大写行合计(boolean) | |\n| columnCount | 显示几列 | |\n| batchPrintConfig | 批次成本展示设置 | 0不展示/1总成本/2和3展示批次 |\n| memo | 车主描述 | 20250925新增 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_143", + "content": "**partInfoDetailMapList** 材料行:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_144", + "content": "| 字段 | 说明 |\n|------|------|\n| sortNumber | 序号(合计行显示\"合计\") |\n| partShowName | 材料组合名称 |\n| partName | 材料名称 |\n| partBrand | 材料品牌(2025.02.27新增) |\n| supplierCode | 零件号 |\n| labelName | 业务分类 |\n| applyModel | 适用车型 |\n| customCode | 材料编码 |\n| storageName | 仓库名称 |\n| defSeat | 货位 |\n| number | 数量 |\n| unit | 单位 |\n| price | 单价 |\n| subtotal | 金额 |\n| employeeName | 出库人 |\n| salesEmployeeNameList | 材料行销售人员(20250925新增) |\n| orderBatchList | 批次成本信息(List) |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_145", + "content": "**orderBatchList** 项:orderNo(批次号), count(数量), price(单位成本), priceNoTax(除税单位成本), totalPrice(总成本), totalPriceNoTax(除税总成本)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_146", + "content": "#### 入库单参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_147", + "content": "**定制类模版分类**:`newStockInMaintainCustomPrint`(20250925新增)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_148", + "content": "与出库单类似,额外字段:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_149", + "content": "| 字段 | 说明 |\n|------|------|\n| noTaxSumAmount | 除税总金额 |\n| chineseNoTaxSumAmount | 除税总金额(大写) |\n| noTaxPrice | 除税单价(材料行) |\n| noTaxSubtotal | 除税金额(材料行) |\n| sumSubtotal | 入库总金额(工单退才有) |\n| chineseSubtotal | 大写入库总金额(工单退才有) |\n| showReturnIn | 显示退料入库一行(工单退才有) |\n| showSign | 仓管签字位置(工单退=2,其它=1) |\n| stockInType | 退料入库(工单退才有) |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_150", + "content": "#### 领料单参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_151", + "content": "| 字段 | 说明 |\n|------|------|\n| idOwnOrg | 门店ID |\n| title | 门店名称+\"领料单\" |\n| billNo | 工单号 |\n| nowDateTime | 打印当前时间 |\n| employeeName | 服务顾问 |\n| carModel | 车型 |\n| carNoWhole | 车牌号 |\n| memo | 车主描述(2025.08.14新增) |\n| printTimes | 打印次数 |\n| columnCount | 显示几列 |\n| batchPrintConfig | 批次成本设置 |\n| stuffDetailVOList | 材料列表 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_152", + "content": "### 10.12 调拨单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_153", + "content": "**前端调用接口**:`/stock/allot/print?idAllot=`\n**模版编码**:`allotInPrint`", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_154", + "content": "| 字段 | 说明 | 备注 |\n|------|------|------|\n| printFlag | 均价门店false/批次门店true | |\n| showPrice | 参配-打印调拨价格及金额 | 勾选true |\n| orgName | 打印抬头 | 调入:XXX调入单/调出:XXX调出单 |\n| billNo | 调拨单号 | 调入:DRD/调出:DCD前缀 |\n| idOwnOrg | 门店ID | |\n| naOrgIn | 调入门店名称 | |\n| naOrgOut | 调出门店名称 | |\n| detailAddress | 供应商详细地址 | |\n| statusName | 调拨单状态 | 制单/待发货/待收货/已完成 |\n| billDate | 单据日期(yyyy-MM-dd) | |\n| creatorName | 创建人 | |\n| nowDateTime | 打印时间 | |\n| remark | 备注信息 | |\n| showRemark | 是否显示备注 | |\n| sumNumber | 总数量 | |\n| sumAmount | 总金额 | 脱敏显示**** |\n| printCount | 打印次数 | |\n| allotDetailVoList | 调拨单明细行 | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_155", + "content": "**allotDetailVoList** 明细行:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_156", + "content": "| 字段 | 说明 |\n|------|------|\n| sortNumber | 序号 |\n| partShowName | 材料组合名称 |\n| customCode | 材料自定义编码 |\n| partName | 材料名称(20250731追加) |\n| partBrand | 材料品牌(20250731追加) |\n| supplierCode | 材料零件号(20250731追加) |\n| standard | 材料规格型号(20250731追加) |\n| carNo | 车牌(20250731追加) |\n| defSeat | 货位(调入/调出门店货位) |\n| unit | 单位 |\n| price | 单价 |\n| numCus | 个数(均价/批次逻辑不同) |\n| amount | 金额(均价/批次逻辑不同) |\n| orderNo | 批次号 |\n| productDate | 批次生成日期 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_157", + "content": "### 10.13 材料标签", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_158", + "content": "**打印平台模版分类**:材料价格通用标签打印", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_159", + "content": "材料标签支持一次打多张,与 `labelList` 集合元素个数匹配。", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_160", + "content": "#### 通用材料标签", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_161", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| labelList | List | 材料标签列表 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_162", + "content": "**Label**:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_163", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| name | String | 材料名称 |\n| supplierCode | String | 零件号 |\n| customCode | String | 材料编码 |\n| sellPrice | BigDecimal | 销售价格 |\n| date | String | 打印日期(yyyy/MM/dd) |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_164", + "content": "#### 采购库存材料标签", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_165", + "content": "- 不带供应商:**采购库存通用标签打印-新**\n- 带供应商:**采购库存通用标签打印-包含供应商-新**", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_166", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| labelList | List | 材料标签列表 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_167", + "content": "**Object**:", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_168", + "content": "| 字段 | 类型 | 说明 |\n|------|------|------|\n| partName | String | 材料名称 |\n| partBrand | String | 材料品牌 |\n| customCode | String | 材料编码 |\n| partShowName | String | 组合名称 |\n| supplierCode | String | 材料供应商编码 |\n| spec | String | 材料规格型号 |\n| unit | String | 材料单位 |\n| barCode | String | 材料编码 |\n| billDate | String | 单据日期(yyyy-MM-dd) |\n| supplierName | String | 供应商名称 |\n| storageName | String | 材料仓库名称 |\n| defSeat | String | 材料货位 |\n| date | String | 打印日期(yyyy/MM/dd) |", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_169", + "content": "### 10.14 采购单/采购退货单", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_170", + "content": "走打印平台定制,需先向赵亚妮提供门店编码、门店名称开通后再上传配置。", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_171", + "content": "参考文档:[采购单/采购退打印](https://alidocs.dingtalk.com/i/nodes/7NkDwLng8ZMajY9YijOwlz4bJKMEvZBY)", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_172", + "content": "## 附录:关键注意事项", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_173", + "content": "1. **结算单**模板名称必须包含\"结算单\"三个字\n2. **洗车单**定制模板名称必须包含\"洗车单\"三个字\n3. **新版附表**不能用 `billStatus`、`balanceStatus`、`maintainType` 做判断\n4. 列表内参数用 `$F{}`,外层参数用 `$P{}`\n5. 数字类型参数用 `java.math.BigDecimal`,文本用 `java.lang.String`\n6. 未预设参数需先创建 Parameter(外层)或 Field(列表内)\n7. **删除模板不可恢复**,操作前务必确认\n8. 价格脱敏场景显示 `****`\n9. 工具类 JAR:`print-core-1.0.7.jar`,提供金额转大写和日期转换功能", + "metadata": { + "chunk_type": "md_section", + "source_file": "F6打印单说明知识库.md", + "kb_name": "" + } + }, + { + "id": "chunk_174", + "content": "打印平台模版分类:保险单", + "metadata": { + "chunk_type": "md_section", + "source_file": "保险单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_175", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| companyTitle | 打印title | | String |\n| customerName | 客户姓名 | | String |\n| carNo | 车牌号 | | String |\n| vin | vin码 | | String |\n| carModel | 车型 | | String |\n| cellPhone | 手机号 | | String |\n| insureDate | 起保日期 | | String yyyy-MM-dd |\n| receivable | 应收金额 | | BigDecimal |\n| preferentialAmount | 优惠金额 | | BigDecimal |\n| receiveAmount | 实收金额 | | BigDecimal |\n| oweAmount | 未收金额 | | BigDecimal |\n| commissionAmountTotal | 手续费 | | BigDecimal |\n| companyRefundAmount | 保险公司返点 | | BigDecimal |\n| customerRefundAmount | 客户返点 | | BigDecimal |\n| insuranceCompanyName | 承保公司 | | String |\n| memo | 备注 | | String |\n| employeeName | 服务顾问 | | String |\n| contacts | 保险公司联系人 | | String |\n| contactMobile | 保险公司联系人手机号 | | String |\n| channelName | 来店途径 | | String |\n| startDate | 开始日期 | | String yyyy-MM-dd |\n| endDate | 结束日期 | | String yyyy-MM-dd |\n| renewal | 是否续保 0否/1是 | | Integer |\n| tsInsuranceDetailList | 保险单明细 | | List |\n| | | | |\n| | | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "保险单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_176", + "content": "TsInsuranceDetailPrintVo:", + "metadata": { + "chunk_type": "md_section", + "source_file": "保险单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_177", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| policyNo | 保单号 | | String |\n| insuranceType | 保险类型(0交强险/1商业险) | | Integer |\n| name | 险种名称 | | String |\n| amount | 保额 | | BigDecimal |\n| receivable | 应收金额(元) | | BigDecimal |\n| discount | 折扣 | | BigDecimal |\n| concessionary | 优惠金额(元) | | BigDecimal |\n| commissionRate | 手续费率 | | BigDecimal |\n| commissionAmount | 手续费 | | BigDecimal |\n| paid | 实收金额(元) | | BigDecimal |\n| memo | 备注 | | String |\n| companyRefundAmount | 保险公司返点 | | BigDecimal |\n| customerRefundAmount | 客户返点 | | BigDecimal |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "保险单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_178", + "content": "> 更新: 2023-09-20 11:32:29 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "保险单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_179", + "content": "# 出/入库单据打印", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_180", + "content": "| **场景** | | 入口 | 打印效果 | **底层模版** | 接口 |\n| --- | --- | --- | --- | --- | --- |\n| 库存 | 出入库单据-出库单 |  |  |  | REST:/stock/stockInAndOutBill/stockOutPrint?idStock=XXX&isNew=true底层接口:com.f6car.stock.service.impl.print.PrintServiceImpl#getStockOutPrintUrl日志关键字:+\"出库单打印参数:\" (有 apollo 开关 log.stockInout.print.switch 默认true) |\n| | 领料出库(工单领料)-出库单 |  |  |\n| | 出入库单据-入库单 |  |  |  | REST:/stock/stockInAndOutBill/stockInPrint?idStock=XXX&isNew=true底层接口:com.f6car.stock.service.impl.print.PrintServiceImpl#getStockInPrintUrl日志关键字:+\"入库单打印参数:\" (有 apollo 开关 log.stockInout.print.switch 默认true) |\n| | 领料出库(工单领料)-退料单 |  |  |\n| | 手工出入库-出库单 |  |  |  | REST:/stock/manual/print?pkId=XXX&billType=0&isNew=true (type=0 表示入库单 type=1 表示出库单)底层接口:com.f6car.stock.service.print.PrintService#getManualStorageStockInPrintUrl日志关键字:+\"手工出入库单据打印入参是:\" |\n| | 手工出入库-入库单 |  |  |  |\n| | 领料详情-打印领料单 |  |  |  | REST:/stock/maintain/print?idSourceBill=XXX&hasPreview=true底层接口:com.f6car.stock.service.impl.print.PrintServiceImpl#getMaintainPrintUrl日志关键字:+\"领料单打印参数:\" (有 apollo 开关 log.stock.maintain.print.switch 默认false) |", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_181", + "content": "# 出入库单据-出库单 && 领料出库-出库单打印模版参数说明", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_182", + "content": "出库单据定制类需求模版分类(newStockOutMaintainCustomPrint)--20250925新增", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_183", + "content": "HashMap resultMap", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_184", + "content": "| **字段** | **说明** | 备注 |\n| --- | --- | --- |\n| title | 门店名称+ \"出库单\" | |\n| billNo | 出库单号 | |\n| sourceBillNo | 来源单号 | |\n| showSourceBillNo | 显示来源单号 (boolean) | |\n| billStatus | 单据状态(制单、完成) | |\n| inOutDate | 出库日期 | |\n| showInOutDate | 是否显示出库日期(boolean) | |\n| objectName | 出入库对象 | |\n| objectNameGD | 出入库对象工单工单出库单:客户姓名+车牌号整体+车辆VIN码+车辆品牌车系车型全称 (拼接后取前 80 个字符)非工单出库单:\"\" | |\n| creatorName | 制单人 | |\n| billDate | 制单日期 (yyyy-MM-dd) | |\n| sumNumber | 材料总数量 | |\n| sumAmount | 总金额 \\--脱敏场景显示 _\\*_\\*_\\*\\*_ | |\n| chineseAmount | 总金额(中文大写)\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| nowDateTime | 打印当前时间 (yyyy-MM-dd HH:mm) | |\n| idOwnOrg | 门店ID | |\n| remark | 备注信息 | |\n| showRemark | 是否显示备注(boolean)\\-- 备注不为空时是 true | |\n| isGdType | 是否是工单类型单据出库(boolean)\\-- 工单出库单是 true | |\n| saName | 服务顾问姓名\\-- 工单出库单场景 | |\n| printCount | 打印次数 | |\n| showCustomCode | 配置出入库打印参数-是否显示材料编码(boolean) | |\n| showBusinessLabel | 配置出入库打印参数-是否显示材料业务分类(boolean) | |\n| showApplyModel | 配置出入库打印参数-是否显示材料适用车型(boolean) | |\n| showStorageName | 配置出入库打印参数-是否显示出库仓库(boolean) | |\n| showDefSeat | 配置出入库打印参数-是否显示出库货位(boolean) | |\n| showChineseAmount | 配置出入库打印参数-是否显示大写金额(boolean) | |\n| showChineseSubtotal | 配置出入库打印参数-是否显示大写行合计(boolean) | |\n| columnCount | 显示几列 | |\n| batchPrintConfig | 配置出入库打印参数-查询批次成本展示设置 0:都不展示,1:总成本(将批次成本合并),2和3:展示批次成本 | |\n| memo | 车主描述 | \\--20250925 新增 |\n| partInfoDetailMapList | | |\n| sortNumber | 序号**通用模版追加一行合计行,显示 合计** | |\n| partShowName | 材料组合名称 | |\n| partName | 材料名称 | |\n| partBrand | 材料品牌 | \\-- 2025.02.27 新增 |\n| supplierCode | 零件号 | |\n| labelName | 业务分类 | |\n| applyModel | 适用车型 | |\n| customCode | 材料编码 | |\n| storageName | 仓库名称 | |\n| defSeat | 货位 | |\n| number | 数量**\\-- 通用模版追加一行合计行,显示 材料出库总数** | |\n| unit | 单位 | |\n| price | 单价\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| subtotal | 金额\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| employeeName | 出库人 | |\n| salesEmployeeNameList | 材料行销售人员 | \\--20250925 新增 |\n| orderBatchList\\--List> | 材料行成本相关 | |\n| orderNo | 批次号\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 均价模式下,显示 \"\"**\\-- 通用模版追加一行合计,追加行,显示 \"\"** | |\n| count | 批次出库几个\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 均价模式下,显示 \"\"**\\-- 通用模版追加一行合计,追加行,显示总数** | |\n| price | 批次单位成本\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价单位成本**\\-- 通用模版追加一行合计,追加行,显示 \"\" | |\n| priceNoTax | 批次单位除税成本\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价单位成本**\\-- 通用模版追加一行合计,追加行,显示 \"\" | 2025.08.14 新增 |\n| totalPrice | 批次总成本\\-- batchPrintConfig = 1 场景下,显示合计总成本\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价总成本**\\-- 通用模版追加一行合计,追加行,显示总成本 | |\n| totalPriceNoTax | 批次除税总成本\\-- batchPrintConfig = 1 场景下,显示合计总成本\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价除税总成本**\\-- 通用模版追加一行合计,追加行,显示总成本 | 2025.08.14 新增 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_185", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_186", + "content": "```plaintext\n{\n \"saName\":\"xuetting\",\n \"objectNameGD\":\"18551638685【苏ABF358】 LFV2A21K6A3092399 大众 速腾 1.4T 双离合变速器(DSG) 2011 速腾\",\n \"creatorName\":\"cltest\",\n \"showStorageName\":true,\n \"remark\":\"\",\n \"title\":\"流程配置ES出库单\",\n \"showSourceBillNo\":true,\n \"sumAmount\":\"860.0\",\n \"showChineseAmount\":true,\n \"billStatus\":\"完成\",\n \"sumNumber\":\"1.0\",\n \"isGdType\":true,\n \"printCount\":\"3\",\n \"billNo\":\"CKD20250116001\",\n \"showDefSeat\":true,\n \"idOwnOrg\":\"15870306745529549109\",\n \"showApplyModel\":true,\n \"memo\":\"\",\n \"partInfoDetailMapList\":[\n {\n \"employeeName\":\"cltest\",\n \"sortNumber\":\"1\",\n \"partShowName\":\" 3M 燃油宝1号 PN6868 3M (PN6868)\",\n \"defSeat\":\"A\",\n \"orderBatchList\":[\n {\n \"orderNo\":\"20211213000001\",\n \"totalPrice\":\"0.0\",\n \"price\":\"0.0\",\n \"count\":\"1.0\"\n }\n ],\n \"supplierCode\":\"PN6868\",\n \"partName\":\"3M 燃油宝1号 PN6868\",\n \"applyModel\":\"\",\n \"customCode\":\"CL0000015\",\n \"storageName\":\"主仓库\",\n \"number\":\"1.0\",\n \"unit\":\"瓶\",\n \"price\":\"860.0\",\n \"subtotal\":\"860.0\",\n \"labelName\":\"保养\",\n \"salesEmployeeNameList\": \"B2C一店新员工,B2C一店采购员\"\n \n },\n {\n \"number\":\"1.0\",\n \"subtotal\":\"860.0\",\n \"sortNumber\":\"合计\",\n \"orderBatchList\":[\n {\n \"orderNo\":\"\",\n \"totalPrice\":\"0.0\",\n \"price\":\"\",\n \"count\":\"1.0\"\n }\n ]\n }],\n \"sourceBillNo\":\"WXD20250103001\",\n \"billDate\":\"2025-01-16\",\n \"chineseAmount\":\"捌佰陆拾元整\",\n \"columnCount\":\"5\",\n \"showCustomCode\":true,\n \"showBusinessLabel\":true,\n \"batchPrintConfig\":\"3\",\n \"nowDateTime\":\"2025-02-18 10:04\",\n \"showInOutDate\":true,\n \"showChineseSubtotal\":true,\n \"objectName\":\"18551638685【苏ABF358】大众 速腾\",\n \"inOutDate\":\"2025-01-16\",\n \"showRemark\":false\n}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_187", + "content": "# 出入库单据-入库单 && 退料入库-入库单打印模版参数说明", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_188", + "content": "入库单据定制类需求模版分类(newStockInMaintainCustomPrint)--20250925新增", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_189", + "content": "HashMap resultMap", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_190", + "content": "| **字段** | **说明** | 备注 |\n| --- | --- | --- |\n| title | 门店名称+ \"入库单\" | |\n| billNo | 入库单号 | |\n| sourceBillNo | 来源单号 | |\n| showSourceBillNo | 显示来源单号 (boolean)默认:true | |\n| billStatus | 单据状态(制单、完成) | |\n| inOutDate | 入库日期\\-- yyyy-MM-dd | |\n| showInOutDate | 是否显示入库日期(boolean)\\-制单是 false\\-完成是 true | |\n| objectName | 出入库对象 | |\n| creatorName | 制单人 | |\n| billDate | 制单日期 (yyyy-MM-dd) | |\n| sumNumber | 材料总数量 | |\n| sumAmount | 总金额 \\--脱敏场景显示 _\\*_\\*_\\*\\*_ | |\n| noTaxSumAmount | 除税总金额 \\--脱敏场景显示 _\\*_\\*_\\*\\*_ | |\n| chineseAmount | 总金额(中文大写)\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| chineseNoTaxSumAmount | 除税总金额(中文大写)\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| nowDateTime | 打印当前时间 (yyyy-MM-dd HH:mm) | |\n| idOwnOrg | 门店ID | |\n| remark | 备注信息 | |\n| showRemark | 是否显示备注(boolean)\\-- 备注不为空时是 true | |\n| isGdType | 是否是工单类型单据出库(boolean)\\-- 工单出库单是 true | |\n| saName | 服务顾问姓名\\-- 工单出库单场景 | |\n| printCount | 打印次数 | |\n| showCustomCode | 配置出入库打印参数-是否显示材料编码(boolean) | |\n| showBusinessLabel | 配置出入库打印参数-是否显示材料业务分类(boolean) | |\n| showApplyModel | 配置出入库打印参数-是否显示材料适用车型(boolean) | |\n| showStorageName | 配置出入库打印参数-是否显示出库仓库(boolean) | |\n| showDefSeat | 配置出入库打印参数-是否显示出库货位(boolean) | |\n| showChineseAmount | 配置出入库打印参数-是否显示大写金额(boolean) | |\n| showChineseSubtotal | 配置出入库打印参数-是否显示大写行合计(boolean) | |\n| sumSubtotal | 入库总金额\\-- 脱敏场景显示 \\*\\*\\*\\*\\-- 工单退-才有 | |\n| chineseSubtotal | 大写入库总金额\\-- 脱敏场景显示 \\*\\*\\*\\*\\-- 工单退-才有 | |\n| showReturnIn | 显示退料入库一行\\-- 工单退-true | |\n| showSign | 【仓管签字】显示的位置工单退-2;其它场景1 | |\n| stockInType | 退料入库\\-- 工单退-才有 | |\n| columnCount | 显示几列 | |\n| memo | 车主描述 | \\--20250925 新增 |\n| partInfoDetailMapList | | |\n| sortNumber | 序号 | |\n| partShowName | 材料组合名称 | |\n| partName | 材料名称 | |\n| partBrand | 材料品牌 | |\n| labelName | 业务分类 | |\n| applyModel | 适用车型 | |\n| customCode | 材料编码 | |\n| storageName | 仓库名称 | |\n| defSeat | 货位 | |\n| number | 数量**\\-- 通用模版追加一行合计行,显示 材料出库总数** | |\n| unit | 单位 | |\n| price | 单价\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| noTaxPrice | 除税单价\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| subtotal | 金额\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| noTaxSubtotal | 除税金额\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| employeeName | 入库人 | |\n| salesEmployeeNameList | 材料行销售人员 | \\--20250925 新增 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_191", + "content": "# 手工出入库-出/入库单", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_192", + "content": "HashMap resultMap", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_193", + "content": "| **字段** | **说明** | **备注** |\n| --- | --- | --- |\n| title | 出库单:门店名称+ \"出库单\"入库单:门店名称+ \"入库单\" | |\n| billNo | 出库单号/入库单号 | |\n| sourceBillNo | 来源单号 空 | |\n| showSourceBillNo | 显示来源单号 (boolean)false | |\n| billStatus | 单据状态(制单、完成) | |\n| inOutDate | 出库日期 (yyyy-MM-dd) | |\n| showInOutDate | 是否显示出库日期(boolean) | |\n| objectName | 出入库对象 | |\n| objectNameGD | 出入库对象 | |\n| creatorName | 制单人 | |\n| billDate | 制单日期 (yyyy-MM-dd) | |\n| sumNumber | 材料总数量 | |\n| sumAmount | 总金额 \\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| chineseAmount | 总金额(中文大写)\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| nowDateTime | 打印当前时间 (yyyy-MM-dd HH:mm) | |\n| idOwnOrg | 门店ID | |\n| remark | 备注信息 | |\n| showRemark | 是否显示备注(boolean)-- 备注不为空时是 true | |\n| printCount | 打印次数 | |\n| showCustomCode | 配置出入库打印参数-是否显示材料编码(boolean) | |\n| showBusinessLabel | 配置出入库打印参数-是否显示材料业务分类(boolean) | |\n| showApplyModel | 配置出入库打印参数-是否显示材料适用车型(boolean) | |\n| showStorageName | 配置出入库打印参数-是否显示出库仓库(boolean) | |\n| showDefSeat | 配置出入库打印参数-是否显示出库货位(boolean) | |\n| showChineseAmount | 配置出入库打印参数-是否显示大写金额(boolean) | |\n| showChineseSubtotal | 配置出入库打印参数-是否显示大写行合计(boolean) | |\n| columnCount | 显示几列 | |\n| batchPrintConfig | 配置出入库打印参数-查询批次成本展示设置 0:都不展示,1:总成本(将批次成本合并),2和3:展示批次成本 | |\n| partInfoDetailMapList | | |\n| sortNumber | 序号**\\-- 通用模版追加一行合计行,显示 合计** | |\n| partShowName | 材料组合名称 (材料名称 规格型号 材料品牌 零件号) | |\n| partName | 材料名称 | |\n| partBrand | 材料品牌 -- 2025.02.27 新增 | |\n| supplierCode | 零件号 | |\n| labelName | 业务分类 | |\n| applyModel | 适用车型 | |\n| customCode | 材料编码 | |\n| storageName | 仓库名称 | |\n| defSeat | 货位 | |\n| number | 数量**\\-- 通用模版追加一行合计行,显示 材料出库总数** | |\n| unit | 单位 | |\n| price | 单价\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| subtotal | 金额\\--脱敏场景显示 _\\*_\\*\\*\\* | |\n| employeeName | 出库人 | |\n| taxRate | 税率 | |\n| orderBatchList\\--List> | 材料行成本相关 | |\n| orderNo | 批次号\\- batchPrintConfig = 1 场景下,显示 \"\"\\-- 均价模式下,显示 \"\"**\\-- 通用模版追加一行合计,追加行,显示 \"\"** | |\n| count | 批次出库几个\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 均价模式下,显示出库/入库个数**\\-- 通用模版追加一行合计,追加行,显示总数** | |\n| price | 批次单位成本\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价单位成本**\\-- 通用模版追加一行合计,追加行,显示 \"\"\\*\\* | |\n| priceNoTax | 批次除税单位成本\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价单位成本**\\-- 通用模版追加一行合计,追加行,显示 \"\"\\*\\* | 2025.08.14 追加 |\n| totalPrice | 批次总成本\\-- batchPrintConfig = 1 场景下,显示合计总成本\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价总成本**\\-- 通用模版追加一行合计,追加行,显示总成本\\*\\*\\*\\* | |\n| totalPriceNoTax | 批次除税总成本\\-- batchPrintConfig = 1 场景下,显示合计总成本\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价总成本**\\-- 通用模版追加一行合计,追加行,显示总成本\\*\\*\\*\\* | 2025.08.14 追加 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_194", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_195", + "content": "日志关键字:+\"手工出入库单据打印入参是\"", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_196", + "content": "```plaintext\n{\n \"objectNameGD\":\"\",\n \"creatorName\":\"王◇龙\",\n \"showStorageName\":true,\n \"remark\":\"\",\n \"title\":\"ISC总店出库单\",\n \"showSourceBillNo\":false,\n \"sumAmount\":\"410.0\",\n \"showChineseAmount\":true,\n \"billStatus\":\"完成\",\n \"sumNumber\":\"2.0\",\n \"printCount\":\"5\",\n \"billNo\":\"SGC20240515001\",\n \"showDefSeat\":true,\n \"idOwnOrg\":\"4060685614490690260\",\n \"showApplyModel\":true,\n \"partInfoDetailMapList\":[\n {\n \"employeeName\":\"XN\",\n \"sortNumber\":\"1\",\n \"partShowName\":\" 材料09080112 123456 米其林 (1240)\",\n \"defSeat\":\"A-14-02\",\n \"orderBatchList\":[\n {\n \"orderNo\":\"20210909000128\",\n \"totalPrice\":\"400.0\",\n \"price\":\"400.0\",\n \"count\":\"1.0\"\n }\n ],\n \"supplierCode\":\"1240\",\n \"partName\":\"材料09080112\",\n \"applyModel\":\"大众 途安\",\n \"customCode\":\"CL090800112\",\n \"storageName\":\"主仓库\",\n \"number\":\"1.0\",\n \"unit\":\"条\",\n \"price\":\"400.0\",\n \"subtotal\":\"400.0\",\n \"labelName\":\"轮胎\"\n },\n {\n \"employeeName\":\"XN\",\n \"sortNumber\":\"2\",\n \"partShowName\":\" fnst=>1 AC德科 (FNST>=1)\",\n \"defSeat\":\"\",\n \"orderBatchList\":[\n {\n \"orderNo\":\"20201104000002\",\n \"totalPrice\":\"4.0\",\n \"price\":\"4.0\",\n \"count\":\"1.0\"\n }\n ],\n \"supplierCode\":\"FNST>=1\",\n \"partName\":\"fnst=>1\",\n \"applyModel\":\"江淮瑞风S52....\",\n \"customCode\":\"fnst>=1\",\n \"storageName\":\"总2仓\",\n \"number\":\"1.0\",\n \"unit\":\"个\",\n \"price\":\"10.0\",\n \"subtotal\":\"10.0\",\n \"labelName\":\"保养\"\n },\n {\n \"number\":\"2.0\",\n \"subtotal\":\"410.0\",\n \"sortNumber\":\"合计\",\n \"orderBatchList\":[\n {\n \"orderNo\":\"\",\n \"totalPrice\":\"404.0\",\n \"price\":\"\",\n \"count\":\"2.0\"\n }\n ]\n }\n ],\n \"sourceBillNo\":\"\",\n \"billDate\":\"2024-05-15\",\n \"chineseAmount\":\"肆佰壹拾元整\",\n \"columnCount\":\"5\",\n \"showCustomCode\":true,\n \"showBusinessLabel\":true,\n \"batchPrintConfig\":\"3\",\n \"nowDateTime\":\"2025-02-18 09:33\",\n \"showInOutDate\":true,\n \"showChineseSubtotal\":true,\n \"objectName\":\"\",\n \"inOutDate\":\"2024-05-15\",\n \"showRemark\":false\n}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_197", + "content": "# 领料详情-打印领料单", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_198", + "content": "HashMap resultMap", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_199", + "content": "| **字段** | **说明** | **备注** |\n| --- | --- | --- |\n| idOwnOrg | 门店ID | |\n| title | 门店名称+ \"领料单\" | |\n| billNo | 工单号 | |\n| nowDateTime | 打印当前时间 (yyyy-MM-dd HH:mm) | |\n| employeeName | 服务顾问 | |\n| carModel | 车型 | |\n| carNoWhole | 车牌号 | |\n| memo | 车主描述 | 2025.08.14 新增 |\n| printTimes | 打印次数 | |\n| columnCount | 显示几列 | |\n| batchPrintConfig | 配置出入库打印参数-查询批次成本展示设置 0:都不展示,1:总成本(将批次成本合并),2和3:展示批次成本 | |\n| stuffDetailVOList | | |\n| index | 序号**\\-- 通用模版追加一行合计行,显示 合计** | |\n| partName | 材料组合名称 (材料名称 规格型号 材料品牌 零件号) | |\n| unit | 单位 | |\n| defSeatList | 货位 | |\n| salesEmployeeNameList | 销售人员List | 8.14新增 |\n| orderBatchList\\--List> | 材料行成本相关 | |\n| orderNo | 批次号\\- batchPrintConfig = 1 场景下,显示 \"\"\\-- 均价模式下,显示 \"\"**\\-- 通用模版追加一行合计,追加行,显示 \"\"** | |\n| count | 批次出库几个\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 均价模式下,显示出库/入库个数**\\-- 通用模版追加一行合计,追加行,显示总数** | |\n| price | 批次单位成本\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价单位成本**\\-- 通用模版追加一行合计,追加行,显示 \"\"\\*\\* | |\n| priceNoTax | 批次除税单位成本\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价单位成本**\\-- 通用模版追加一行合计,追加行,显示 \"\"\\*\\* | 2025.08.14 追加 |\n| totalPrice | 批次总成本\\-- batchPrintConfig = 1 场景下,显示合计总成本\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价总成本**\\-- 通用模版追加一行合计,追加行,显示总成本\\*\\*\\*\\* | |\n| totalPriceNoTax | 批次除税总成本\\-- batchPrintConfig = 1 场景下,显示合计总成本\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价总成本**\\-- 通用模版追加一行合计,追加行,显示总成本\\*\\*\\*\\* | 2025.08.14 追加 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "出_入库单据打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_200", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| title | 打印抬头(门店简称) | | String |\n| billNo | 工单号 | | String |\n| creatorName | 制单人 | | String |\n| printTime | 打印时间 | | String |\n| naEmployee | 服务顾问 | | String |\n| billDate | 进厂日期 | | String |\n| deliveryTime | 交车时间(出厂时间) | | String |\n| naCustomer | 车主姓名 | | String |\n| cellPhone | 车主电话 | | String |\n| carModel | 车型 | | String |\n| carNoWhole | 车牌号 | | String |\n| vin | 车辆VIN码 | | String |\n| amountAll | 小计 | | BigDecimal |\n| serviceDetailVOList | 协作项目集合 | | List |", + "metadata": { + "chunk_type": "md_section", + "source_file": "协作单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_201", + "content": "## CooperationServicePrintAttribute", + "metadata": { + "chunk_type": "md_section", + "source_file": "协作单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_202", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| serviceName | 工单项目名称 | | String |\n| cooperationServiceName | 协作项目名称 | | String |\n| cooperationOrgName | 协作门店 | | String |\n| auditStatus | 审核状态 | | String |\n| cooperationCost | 协作成本 | | BigDecimal |", + "metadata": { + "chunk_type": "md_section", + "source_file": "协作单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_203", + "content": "> 更新: 2023-08-28 16:06:07 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "协作单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_204", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| title | 打印抬头(门店名称+\"新增项目确认单\") | | String |\n| sourceBillNo | 关联工单号 | | String |\n| printTime | 打印时间 | | String |\n| naEmployee | 服务顾问 | | String |\n| arrivalTime | 进厂日期 | | String |\n| deliveryTime | 交车时间 | | String |\n| naCustomer | 车主姓名 | | String |\n| cellPhone | 车主电话 | | String |\n| repairPerson | 送修人 | | String |\n| repairPersonContact | 送修人联系方式 | | String |\n| carModel | 车型 | | String |\n| carNoWhole | 车牌号 | | String |\n| carColor | 车身颜色 | | String |\n| engineCode | 发动机号 | | String |\n| vin | 车辆VIN码 | | String |\n| mileage | 进厂里程 | | String |\n| oilCapacity | 进厂油量 | | String |\n| merchantAddress | 商家联系地址 | | String |\n| merchantTel | 商家联系方式(固定电话) | | String |\n| merchantPhone | 商家联系方式(手机) | | String |\n| workHourPriceSubtotal | 工时费(小计) | | String |\n| amountSubtotal | 材料费(小计) | | String |\n| attachedServiceVoList | 增项服务项目集合 | | List |\n| attachedStuffVoList | 增项配件材料集合 | | List |", + "metadata": { + "chunk_type": "md_section", + "source_file": "增项单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_205", + "content": "**ServicePrintAttribute**", + "metadata": { + "chunk_type": "md_section", + "source_file": "增项单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_206", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| serviceName | 工单项目名称 | | String |\n| labelName | 业务分类名称 | | String |\n| customCode | 项目编码 | | String |\n| price | 工时单价 | | Double |\n| workHour | 工时 | | Double |\n| number | 项目数量 | | Integer |\n| discount | 折扣 | | Double |\n| discountedSubtotal | 折后金额 | | Double |\n| subtotal | 金额 | | Double |\n| serviceMemo | 项目备注 | | String |\n| isMember | 当前项目是否使用会员 | | Integer |\n| nameMember | 会员项目的来源名(如套餐代码) | | String |\n| empNameStr | 服务项目明细对应修理工名称组装字符串 | | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "增项单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_207", + "content": "If you get gains,please give a like", + "metadata": { + "chunk_type": "md_section", + "source_file": "增项单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_208", + "content": "**PartPrintAttribute**", + "metadata": { + "chunk_type": "md_section", + "source_file": "增项单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_209", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| partName | 材料名称 | | String |\n| labelName | 业务分类名称 | | String |\n| partBrand | 配件品牌 | | String |\n| customCode | 材料编码 | | String |\n| price | 单价 | | Double |\n| number | 材料数量 | | Integer |\n| unit | 单位 | | String |\n| discount | 折扣 | | Double |\n| discountedSubtotal | 折后金额 | | Double |\n| subtotal | 金额 | | Double |\n| partMemo | 材料备注 | | String |\n| isMember | 当前项目是否使用会员 | | Integer |\n| nameMember | 会员项目的来源名(如套餐代码) | | String |\n| employeeName | 员工名称 | | String |\n| empNameStr | 材料明细对应修理工名称组装字符串 | | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "增项单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_210", + "content": "> 更新: 2023-09-05 10:34:22 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "增项单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_211", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| printOrgName | 打印抬头 | | String |\n| orgName | 维修厂名称 | | String |\n| billNo | 工单号 | | String |\n| naEmployee | 服务顾问 | | String |\n| employeePhone | 服务顾问手机号 | | String |\n| naCustomer | 单位名称(客户姓名) | | String |\n| carNoWhole | 车牌号整体 = carPrefix + carNo | | String |\n| cellPhone | 联系电话(客户) | | String |\n| repairPerson | 送修人 | | String |\n| repairPersonContact | 送修人联系方式 | | String |\n| billDate | 进厂日期 | | String |\n| deliveryTime | 交车时间(出厂时间) | | String |\n| mileage | 出厂里程(进厂里程) | | BigDecimal |\n| oilCapacity | 当前油量 | | String |\n| vin | 车辆VIN码 | | String |\n| carModelShort | 车型简称 | | String |\n| signaturePhotoUrl | 签名图片 | | String |\n| orgContactNumber | 联系电话(维修厂) | | String |\n| orgDetailAddress | 联系地址(维修厂) | | String |\n| orgContactMobile | 联系电话(维修厂) | | String |\n| printContentEntrust | 委托单免责条款 | | String |\n| serviceSubtotalVip | 服务项目明细小计(会员项目) | | BigDecimal |\n| stuffSubtotalVip | 材料收入小计(会员项目) | | BigDecimal |\n| serviceSubtotalAll | 工时费小计 | | BigDecimal |\n| stuffSubtotalAll | 材料费小计 | | BigDecimal |\n| serviceList | 工单对应项目集合 | | List |\n| | | | |\n| | | | |\n| | | | |\n| | | | |\n| | | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "委托单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_212", + "content": "## ServicePrintAttribute", + "metadata": { + "chunk_type": "md_section", + "source_file": "委托单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_213", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| serviceName | 项目名称 | | String |\n| price | 工时单价 | | BigInteger |\n| workHour | 工时 | | BigInteger |\n| subtotal | 金额 | | BigInteger |\n| serviceMemo | 附加信息备注 | | String |\n| isMember | 当前项目是否使用会员 | | Integer |\n| empNameStr | 服务项目明细对应修理工名称组装字符串 | | String |\n| | | | |\n| | | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "委托单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_214", + "content": "> 更新: 2022-11-30 15:56:54 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "委托单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_215", + "content": "# 定金单打印接口文档", + "metadata": { + "chunk_type": "md_section", + "source_file": "定金单打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_216", + "content": "# 定金单打印接口文档", + "metadata": { + "chunk_type": "md_section", + "source_file": "定金单打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_217", + "content": "| 字段 | 含义 | 类型 |\n| --- | --- | --- |\n| title | 标题(门店名称) | String |\n| abbreviation | 门店简称 | String |\n| billNO | 定金单号 | String |\n| printTime | 打印时间 | String |\n| customerName | 客户姓名 | String |\n| cellPhone | 手机号码 | String |\n| carNo | 适用车辆(顿号、隔开) | String |\n| orgName | 适用门店(顿号、隔开) | String |\n| balanceStatus | 结算状态 | String |\n| receivedAmount | 已收金额 | Double |\n| amount | 收款交易金额 | Double |\n| amountAll | 定金单收款小计 | Double |\n| preRefundBalance | 定金单退款前余额 | Double |\n| advancesReceivedBalance | 定金单收款后剩余面额 | Double |\n| memo | 定金备注 | String |\n| settlePerson | 结算人 | String |\n| employeeName | 收款人 | String |\n| businessDate | 收款时间 | String |\n| billDate | 交易时间 | String |\n| transactionDate | 交易时间 | String |\n| detailAddress | 联系地址 | String |\n| contactMobile | 联系方式(手机+固定电话) | String |\n| naServicePerson | 服务顾问 | String |\n| gatheringList | 收款方式 | List |\n| L paymentType | 支付方式 | String |\n| L amount | 金额 | BigDecimal |\n| relationServices | 适用项目列表 | List |\n| L infoId | 项目id | BigInteger |\n| L infoName | 项目名称 | String |\n| L labelName | 业务分类 | String |\n| relationParts | 适用材料列表 | List |\n| L infoId | 材料id | BigInteger |\n| L infoName | 材料名称 | String |\n| L labelName | 业务分类 | String |\n| relationCars | 适用车辆列表 | List |\n| L idCar | 车辆信息id | BigInteger |\n| L carNo | 车牌号 | String |\n| L vin | vin码 | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "定金单打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_218", + "content": "```plaintext\n收款收款{\n \"data\": {\n \"preRefundBalance\": 20000,\n \"memo\": \"我是备注。\",\n \"title\": \"演示主店\",\n \"carNo\": \"藏AVB2131\",\n \"naServicePerson\": \"唐铭远\",\n \"contactMobile\": \"15051779785\",\n \"employeeName\": \"刘思杰\",\n \"amount\": 10000,\n \"orgName\": \"演示主店测试、第一分店\",\n \"advancesReceivedBalance\": 10000,\n \"amountAll\": 10000,\n \"balanceStatus\": \"7100\",\n \"billDate\": \"2024-07-11 16:27:49\",\n \"businessDate\": \"2024-07-24 14:49:01\",\n \"receivedAmount\": 10000,\n \"abbreviation\": \"演示主店测试\",\n \"transactionDate\": \"2024-07-11 16:27:49\",\n \"relationServices\": [\n {\n \"infoName\": \"龙膜全车贴膜(不含撕膜)\",\n \"infoId\": \"10545055918005551735\",\n \"infoType\": 1,\n \"id\": \"239\",\n \"labelName\": \"其他\",\n \"idSubscription\": \"11159\"\n }\n ],\n \"customerName\": \"牛洋\",\n \"gatheringList\": [\n {\n \"amount\": 4000,\n \"paymentType\": \"支付宝\"\n },\n {\n \"amount\": 3000,\n \"paymentType\": \"现金\"\n },\n {\n \"amount\": 3000,\n \"paymentType\": \"挂账\"\n }\n ],\n \"detailAddress\": \"西藏自治区那曲市班戈县西藏自治区那曲市班戈县北拉镇邮政所\",\n \"billNO\": \"DJD20240711001\",\n \"cellPhone\": \"17625046227\",\n \"printTime\": \"2024-07-11 17:28:08\",\n \"relationParts\": [\n {\n \"infoName\": \"奔腾CI-4 15W40 4*4L 胜牌 (706650)\",\n \"infoId\": \"10545055918005692400\",\n \"infoType\": 2,\n \"id\": \"240\",\n \"labelName\": \"业务分类测试\",\n \"idSubscription\": \"11159\"\n }\n ],\n \"relationCars\": [\n {\n \"carNo\": \"AV616E\",\n \"vin\": \"LSVAA49J132047371\",\n \"idCar\": 15809106713748983890\n }\n ],\n },\n \"storeId\": 4060685614487994527,\n \"tempId\": 41\n}\n```\n> 更新: 2024-07-25 20:54:41 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "定金单打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_219", + "content": "# 工单结算单接口文档", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_220", + "content": "# 打印单最新接口参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_221", + "content": "#### maintain接口", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_222", + "content": "**接口:/print/dispatchPrint/genUrl**", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_223", + "content": "**方法:post**", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_224", + "content": "```plaintext\n{\n \"pkId\": \"14581820313319918809\",\n \"rowCode\": \"costSettlePrint\",\n \"rowId\": \"12\"\n}\n```\n```plaintext\n{\n \"code\": 200,\n \"data\": {\n \"url\": \"http://s1.f6yc.com/printserver/test/printFile/201912/191213154046701.pdf\"\n },\n \"message\": \"SUCCESS\"\n}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_225", + "content": "#### erp接口", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_226", + "content": "**/print/getPrintPDFPath.do**", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_227", + "content": "templateId=56&templateType=newSettlePrint&idSourceBill=10546443563897503197", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_228", + "content": "**rest get**", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_229", + "content": "**支持各种新版打印类型**", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_230", + "content": "```plaintext\n{\n \"code\": 200,\n \"data\": \"http://s1.f6yc.com/printserver/test/printFile/201912/191213154046701.pdf\",\n \"message\": \"SUCCESS\"\n}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_231", + "content": "#### jasper取参对照", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_232", + "content": "```plaintext\n{\n \"data\": {\n \"cellPhone\": \"15421562365\", //联系电话\n \"naCustomer\": \"0322新\",\t\t\t//单位名称\n \"repairPerson\": \"\",\t\t\t\t\t //送修人\n \"carOwnerName\":\"\",\t // 车辆所有人\n \"accountNumber\": \"\",\t\t\t\t //账号\n \"billNo\": \"GD20190517001\", //工单号\n \"carNoWhole\": \"苏1542\", //车牌号\n \"\" \n \"carColor\":\"\" //车身颜色\n \"orgDetailAddress\": \"江苏省盐城市阜宁县豆豆\",//联系地址\n \"vin\": \"11111111111111111\", //车辆VIN码\n \"naEmployee\": \"员工1(旧1)\",\t\t //服务顾问\n \"billDate\": \"2019-05-17 11:49\",//进厂日期\n \"businessTypeName\": \"维修\",\t\t //维修类别\n \"deliveryTime\": \"2019-05-17 12:49\",//交车时间(出厂时间)\n \"email\": \"126544@qq.com\",\t\t\t\t\t //组织邮件\n \"maintainType\": \"GD\",\t\t\t\t\t\t\t //工单类型\n \"billStatus\":\"6300\",\t\t\t\t\t\t\t //单据状态\n \"orgContactMobile\": \"15315256232\", //联系电话\n \"memo\": \"\",\t\t\t\t\t\t\t\t\t\t\t\t //工单备注\n \"orgMemo\":\"\",\t\t\t\t\t\t\t\t\t\t\t// 门店备注\n \"carMemo\":\"\",\t\t\t\t\t\t\t\t\t\t\t// 车辆备注\n \"printCount\": \"1\",\t\t\t\t\t\t\t\t //打印次数\n \"orgContactNumber\": \"\",\t\t\t\t\t\t //联系电话-承修方信息\n \"carSeriesName\": \"商用车\",\t\t\t\t\t //车系名称\n \"carBrandName\": \"商用车\",\t\t\t\t\t //品牌名称\n \"balanceStatus\": \"7000\",\t\t\t\t\t //结算状态\n \"printTime\": \"2019-07-26 11:43:48\",//打印时间\n \"firstSettlementTime\":\"2019-07-26 11:43:48\",//结算时间(第一次收款时间)\n \"orgName\": \"新公司测试\",\t\t\t\t\t\t //单位名称-承修方信息\n \"abbreviation\": \"门店简称\",\t\t\t\t\t\t //门店简称\n \"engineNumber\": \"123\",\t\t\t\t\t\t //发动机号\t\n \"transmissionNo\": \"123\", //变速箱号\n \"creationtime\": \"2019-05-17 11:50:46.0\",//创建时间\n \"creatorName\": \"员工1(旧1)\",\t\t\t\t //创建人名称\n \"employeePhone\":\"18734033191\", //服务顾问手机号\n \"paymentTypeDetails\":\"记账\", //支付方式(记账公司)汇总\n \"bankAccount\": \"\",\t\t\t\t\t\t\t\t //开户银行\n \"naInsurer\":\"\", //理赔公司名称\n \"insurancepolicyNo\":\"\", //理赔单理赔保险单号\n \"mergePackageContent\": \"1\",\t\t\t\t //套餐合并标识\n \"totalStuffNum\": 1.0,\t\t\t\t //材料数量合计\n \"selfTotalStuffNum\": 0.0, //自带材料数量合计\n \"serviceNum\": \"1\", //维修项目小计\n \"spreadRate\": 0.0,\t\t\t\t\t\t\t\t //进销差价率\n \"managementCost\": 0.0,\t\t\t\t\t\t //进销差价合计\n \"amountAll\": 160.0,\t\t\t\t\t\t\t\t //应收总计\n \"serviceDisCountSubTotal\": 100.0, //项目折后金额合计\n \"stuffSubtotalAll\": 60.0,\t\t\t\t\t //材料费小计\n \"serviceSubtotalAll\": 100.0,\t\t\t //工时费小计\n \"receiptAmount\": 160.0,\t\t\t\t\t\t //实收金额\n \"chineseAmount\": \"壹佰陆拾元整\", //实收金额(大写)\n \"oweAmount\": 160.0,\t\t\t\t\t\t\t\t //未收金额\t\n \"remainAmount\":1.0, //结算金额tsf\n \"receivedAmount\":1.0, //收款金额tsf\n \"settleOweAmout\":1.0, //结算单中用的待付金额(未收)\n \"settleOweAmoutChinese\":\"壹\", //待付金额大写\n \"settleReceivedAmout\":1.0, //实付金额\n \"settleReceivedAmoutChinese\":1.0, //实付金额大写\n \"totalWorkHour\": 1.0,\t\t\t\t\t\t\t //项目工时合计\n \"serviceFavourableTotal\": 52.0,\t\t //项目优惠金额合计\n \"serviceFavourableCommonTotal\": 52.0,//普通项目优惠金额合计\n \"stuffSubtotalAll\": 532.0, //材料费小计\n \"partFavourableTotal\": 102.0, //材料优惠金额合计\n \"partFavourableCommonTotal\": 92.0, //普通材料优惠金额合计\n \"stuffDisCountTotal\": 60.0,\t\t\t\t //材料折后金额合计\n \"extraCostTotal\": 0.0, //附加费小计\n \"allOtherCost\": 0.0,\t\t\t\t\t\t\t //附加费合计应收\n \"packageFavourable\": 0.0,\t\t\t\t\t //套餐优惠\n \"czkExpense\": 0.0,\t\t\t\t\t\t //储值卡消费金额\n \"vipExpense\": 0.0,\t\t\t\t\t\t\t\t //会员卡消费金额\n \"czkExpenseFavourable\": 0.0, //储值卡优惠金额\n \"czkDiscountFavourable\": 0.0, //储值卡办卡优惠金额\n \"vipExpenseFavourable\": 0.0,\t\t\t //计次卡/套餐卡优惠金额\n \"partinfoDiscountFavourable\": 0.0, //材料折扣优惠\n \"partinfoFavourable\": 0.0, \t\t\t //材料项目(非会员项目)客户等级优惠\n \"couponFavourable\": 0.0, //优惠券优惠\n \"pointFavourable\": 0.0, //积分优惠\n \"discountFavourable\": 0.0,\t\t\t\t //结算时设置的结清优惠\n \"gatheringFavourable\": 0.0,\t\t\t\t //收银时设置的收银优惠\n \"customerLevelFavourable\": 0.0, //客户级别优惠金额\n \"serviceFavourable\": 0.0,\t\t\t\t\t //服务项目(非会员项目)客户等级优惠\n \"disCountAll\": 0.0,\t\t\t\t\t\t\t\t //总优惠合计\n \"disCountAllBak\":0.0, //总优惠合计bak\n \"printContent\": \"\",\t\t\t\t\t //免责条款\n \"printContentEntrust\":\"\", //委托单免责条款\n \"mainCostList\": [ //维修结算费用集合\n {\n \"subtotal\": 60.0, //价格\n \"sortNumber\": \"1\", //序号\n \"costName\": \"材料费\" //名称\n },\n {\n \"subtotal\": 100.0,\n \"sortNumber\": \"2\",\n \"costName\": \"工时费\"\n },\n {\n \"subtotal\": 160.0,\n \"sortNumber\": \"3\",\n \"costName\": \"合计\"\n }\n ], \n \"partList\": [ //工单对应配件材料集合\n {\n \"unit\": \"个\",\t\t\t\t\t\t\t //单位\n \"isBring\": 0,\t\t\t\t\t\t\t //是否自带,1表示自带,0表示非自带\n \"discountedSubtotal\": 60.0, //折后金额\n \"price\": 60.0,\t\t\t\t\t\t //价格\n \"partName\": \"分全\",\t\t\t\t\t //材料名称\n \"number\": 1.0,\t\t\t\t\t\t\t//数量\n \"subtotal\": 60.0,\t\t\t\t\t\t//金额\n \"taxRateOutput\": 0.13, //销项税率\n \"singleFavourable\":0.0, //优惠金额\n \"partBrand\":\"\", //配件品牌\n \"spec\":\"\", //规格型号\n \"supplierCode\":\"\", //供应商编码(零件号)\n \"customCode\":\"\", //材料编码\n \"isMember\":0, //是否是会员卡材料 1是\n \"discount\":0.5, //折扣\n \"partMemo\":\"\", //备注\n \"employeeName\":\"\", //员工名称(维修技师)\n \"cargoSpace\":\"\", //货位\n \"outStockEmployeeName\":\"\", //领料人\n \"sortNumber\": \"1\"\t\t\t\t\t\t//序号\n }\n ],\n \"serviceList\": [\t\t\t\t\t\t\t\t//工单对应项目集合\n {\n \"discountedSubtotal\": 100.0,//折后金额\n \"price\": 100.0,\t\t\t\t\t\t\t//工时单价\n \"workHour\": 1.0,\t\t\t\t\t\t//工时\n \"subtotal\": 100.0,\t\t\t\t\t//金额\n \"taxRateOutput\": 0.13, //销项税率\n \"sortNumber\": \"1\",\t\t\t\t\t//序号\n \"discount\":1, //折扣\n \"singleFavourable\":0.0, //优惠金额\n \"isMember\":1, //是否是会员卡项目 1是 0否\n \"empNameStr\":\"\", //修理工\n \"unusedNumber\":1, //会员卡项目-未使用次数\n \"number\":2, //会员卡项目-总次数\n \"infiniteFlag\":1, //是否无限,0:否,1:是\n \"serviceName\": \"0322新\"\t\t //项目名称\n }\n ],\n \"cardList\": [ //会员卡列表\n {\n \"favourable\": 20, //优惠\n \"amount\": 2019799, //余额\n \"consumeAmount\":10, //本次消费金额\n \"memberCardNo\": \"123232rg\",//卡号\n \"name\": \"测试洗车卡项目2\" //卡名称\n }\n ],\n \"czkList\": [ //储值卡列表\n {\n \"favourable\": 20, //优惠\n \"amount\": 2019799, //余额\n \"consumeAmount\":10, //本次消费金额\n \"memberCardNo\": \"123232rg\",//卡号\n \"name\": \"测试洗车卡项目2\" //卡名称\n }\n ],\n \"extraPrintVo\": { //附加项目\n \"processItemName\": \"加工\", //加工条目名称\n \"checkCustomName\": \"检测费\",\t\t\t //检测费名称\n \"diagnosisCustomName\": \"诊断费\", //诊断费名称\n \"diagnosisItemName\": \"维修诊断\", //维修诊断项目\n \"diagnosisMemo\": \"\", //诊断费备注\n \"diagnosisCost\": 0.0,\t\t\t\t\t\t //诊断费\n \"commissionCustomName\": \"代办费\", //代办费名称\n \"managementCustomName\": \"管理费\", //管理费名称\n \"commissionMemo\": \"\",\t\t\t\t\t\t //代办费备注\n \"processMemo\": \"\", //加工费\n \"commissionCost\": 0.0,\t\t\t\t //代办费\n \"checkCost\": 0.0,\t\t\t\t\t\t\t\t //检测费\n \"managementCost\": 0.0,\t\t\t\t\t //管理费\n \"processCustomName\": \"加工费\", //加工费名称\n \"processCost\": 0.0,\t\t\t\t\t\t\t //加工费\n \"managementMemo\": \"\",\t\t\t\t\t\t //管理费备注\n \"checkMemo\": \"\"\t\t\t\t\t\t\t\t\t //检测费备注\n }\n },\n \"storeId\": 25965086392720693,\n \"tempId\": 123\n}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_233", + "content": "#### 参数说明(完整)", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_234", + "content": "| 字段 | 类型 | 说明 |\n| --- | --- | --- |\n| \\------基础信息 | | |\n| **billNo** | String | _工单号_ |\n| **maintainType** | String | _工单类型_ |\n| **balanceStatus** | String | _结算状态__\"7000\" -- 未结算(即存在待付金额)__\"7100\" -- 已结算__\"7200\" -- 部分结算_ |\n| **creatorName** | String | _创建人名称_ |\n| **naEmployee** | String | _服务顾问_ |\n| **spreadRate** | Double | _进销差价率_ |\n| carCategoryName | String | _客户车辆分类名称_ |\n| **creationtime** | String | _创建时间_ |\n| **memo** | String | _工单备注_ |\n| **printCount** | String | _打印次数_ |\n| **printTime** | String | _打印时间_ |\n| **deliveryTime** | String | _交车时间(出厂时间),收款取收款时间,未收款完工的取完工时间,未完工的取预计交车时间_ |\n| **mergePackageContent** | String | _套餐合并标识_ |\n| **printContent** | String | _免责条款_ |\n| **engineNumber** | String | _发动机号_ |\n| **transmissionNo** | String | 变速箱号 |\n| **printMaintainGuaZi** | String | _guazi标识_ |\n| **amountAll** | Double | _应收总计_ |\n| **disCountAll** | Double | _总优惠合计_ |\n| **oweAmount** | Double | _未收金额_ |\n| **vipExpense** | Double | _会员卡消费金额_ |\n| **vipExpenseFavourable** | Double | _计次卡/套餐卡优惠金额_ |\n| **czkExpense** | Double | _储值卡消费金额_ |\n| **czkExpenseFavourable** | Double | _储值卡优惠金额_ |\n| **czkSettleFavourable** | Double | _储值卡结算优惠金额(仅未收款返回)_ |\n| **accountAmount** | Double | 记账金额 |\n| **totalOweAmount** | Double | _未付金额_ |\n| **serviceFavourable** | Double | _服务项目(非会员项目)客户等级优惠_ |\n| **partinfoFavourable** | Double | _材料项目(非会员项目)客户等级优惠_ |\n| **partinfoDiscountFavourable** | Double | _材料折扣优惠_ |\n| **pointFavourable** | Double | _积分优惠_ |\n| **packageFavourable** | Double | _套餐优惠_ |\n| **discountFavourable** | Double | _结算时设置的结清优惠_ |\n| **gatheringFavourable** | Double | _收银时设置的收银优惠_ |\n| **couponFavourable** | Double | _优惠券优惠_ |\n| **customerLevelFavourable** | Double | _客户级别优惠金额_ |\n| **customerLevelName** | String | _客户级别_ |\n| **customerDetailAddress** | String | 客户详细地址 |\n| **channelName** | String | 来店途径名称 |\n| **receiptMemo** | String | 收银备注 |\n| **customerSourceName** | String | _客户来源名称_ |\n| **carSourceName** | String | _车辆来源名称_ |\n| \\-----托修方信息 | | |\n| **naCustomer** | String | _单位名称/托修方_ |\n| **repairPerson** | String | _送修人_ |\n| **carNoWhole** | String | _车牌号整体_ |\n| **carBrandName** | String | _品牌名称_ |\n| **carSeriesName** | String | _车系名称_ |\n| carMemo | String | 车辆备注 |\n| **businessTypeName** | String | _维修类别_ |\n| **vin** | String | _车辆VIN码_ |\n| carFuelTypeNameOriginal | carFuelTypeNameOriginal | 燃料类型 |\n| **billDate** | String | _进厂日期_ |\n| **mileage** | java.math.BigDecimal | _出厂里程_ |\n| **contractNumber** | | _合同编号(空)_ |\n| **certificateNumber** | | _合格证号(空)_ |\n| **cellPhone** | String | _联系电话_ |\n| **email** | String | _组织邮件_ |\n| \\------承修方信息 | | |\n| **orgName** | String | _单位名称_ |\n| **abbreviation** | String | 门店简称 |\n| **orgContactNumber** | String | _联系电话_ |\n| **orgDetailAddress** | String | _联系地址_ |\n| **orgContactMobile** | String | _联系电话_ |\n| **bankAccount** | String | _开户银行_ |\n| **accountNumber** | String | _账号_ |\n| **businessLicenseCode** | String | 营业执照编码 |\n| \\------项目信息 | | |\n| serviceList | array | 项目条目 |\n| #### orderNumber | String | 序号(验证可用) |\n| sortNumber | String | _序号_ |\n| customCode | String | 项目编码 |\n| serviceName | String | _项目名称_ |\n| **labelName** | String | _业务分类名称_ |\n| **nameMember** | String | _会员项目的来源名_ |\n| **labelName** | String | 业务分类 |\n| price | Double | _工时单价_ |\n| workHour | Double | _工时_ |\n| subtotal | Double | _金额_ |\n| ```plaintext taxRateOutput ``` | BigDecimal | _销项税率_ |\n| ```plaintext singleFavourable ``` | Double | 优惠金额 |\n| discountedSubtotal | Double | _折后金额_ |\n| **serviceMemo** | String | _单据服务项目备注_ |\n| discount | Double | 折扣 |\n| unusedNumber | Integer | 会员卡项目-未使用次数 |\n| number | Integer | 会员卡项目-总次数 |\n| ```plaintextfavourableVoList ``` | List | 优惠明细 |\n| ```plaintextdiscountType ``` | Integer | 优惠类型(编码) |\n| ```plaintextdiscountTypeName ``` | String | 优惠类型名称 |\n| amount | Double | 优惠金额 |\n| ```plaintextsourceId ``` | String | 优惠项目的主键,如:如果优惠项是优惠券,那么该字段为优惠券的id |\n| **memo** | String | 项目说明 |\n| **qualityCheckEmployeeName** | String | 质检人姓名 |\n| **qualityCheckEmployeeCode** | String | 质检人工号 |\n| **cooperationMemo** | String | 协作备注 |\n| **totalWorkHour** | Double | _项目工时合计_ |\n| **serviceSubtotalAll** | Double | _工时费小计_ |\n| **serviceNum** | Double | _维修项目小计_ |\n| **serviceDisCountSubTotal** | Double | _项目折后金额合计_ |\n| \\-------材料信息 | | |\n| partList | array | 材料条目 |\n| #### orderNumber | String | 序号(验证可用) |\n| sortNumber | String | _序号_ |\n| customCode | String | 材料编码 |\n| partName | String | _材料名称_ |\n| **partBrand** | String | _配件品牌_ |\n| spec | String | 规格型号 |\n| standard | String | 规格型号(旧) |\n| **partShowName** | String | _配件名称规格型号品牌_ |\n| **supplierCode** | String | _供应商编码(零件号)_ |\n| unit | String | _单位_ |\n| number | Double | _数量_ |\n| **nameMember** | String | _会员项目的来源名_ |\n| price | Double | _价格_ |\n| cost | Double | _材料成本_ |\n| subtotal | Double | _退货金额_ |\n| taxRateOutput | BigDecimal | _销项税率_ |\n| singleFavourable | Double | 优惠金额 |\n| discountedSubtotal | Double | _折后金额_ |\n| **partMemo** | String | _单据服务材料备注_ |\n| discount | Double | 折扣 |\n| **applyModel** | String | 适用车型 |\n| ```plaintextcargoSpace ``` | String | 材料货位 |\n| **defSeats** | List | 材料货位列表 |\n| ```plaintextfavourableVoList ``` | List | 优惠明细 |\n| ```plaintextdiscountType ``` | Integer | 优惠类型(编码) |\n| ```plaintextdiscountTypeName ``` | String | 优惠类型名称 |\n| ```plaintextamount ``` | Double | 优惠金额 |\n| ```plaintextsourceId ``` | String | 优惠项目的主键,如:如果优惠项是优惠券,那么该字段为优惠券的id |\n| \\-------自带材料(新版维修/贴膜)信息 | | |\n| **bringPartList** | array | 自带材料条目 |\n| **partShowName** | String | 自带材料名称(文本) |\n| **photoList** | List | 自带图片路径(url) |\n| empNameStr | String | 技师 |\n| outStockEmployeeName | String | 领料人 |\n| **isBring** | String | _是否自带_ |\n| **selfPartList** | array | _工单对应配件自带材料集合(内容同上面材料)_ |\n| **totalStuffNum** | String | _材料数量合计_ |\n| **selfTotalStuffNum** | String | _自带材料数量合计_ |\n| **stuffSubtotalAll** | Double | _材料费小计_ |\n| **partFavourableTotal** | Double | _材料优惠金额合计_ |\n| **partFavourableCommonTotal** | Double | _普通材料优惠金额合计_ |\n| **stuffDisCountTotal** | Double | _材料折后金额合计_ |\n| **managementCost** | Double | _进销差价合计_ |\n| \\------附加费用信息 | | |\n| **extraChargeList** | | |\n| **sortNumber** | String | _序号_ |\n| **extraName** | String | _附加费名称_ |\n| **subtotal** | Double | _金额_ |\n| **memo** | String | _备注_ |\n| \\-----维修结算费用集合(江苏结算单) | | |\n| **mainCostList** | array | |\n| **sortNumber** | String | _序号_ |\n| **costName** | String | _名称_ |\n| **memo** | String | _备注_ |\n| **subtotal** | Double | _金额_ |\n| \\----_其他结算费用集合(江苏结算单)_ | | |\n| **otherCostList** | array | 内容同上 维修结算费用集合 |\n| **extraCostTotal** | Double | _附加费小计_ |\n| **allOtherCost** | Double | _附加费合计应收_ |\n| **favourableExtraCost** | Double | _附加费优惠金额_ |\n| **receiptAmount** | Double | _实收金额(已收金额-储值卡金额,如未收款,则还加入了欠款金额+客户等级优惠-积分优惠-结清优惠)_ |\n| **receiptAmountChinese** | String | _实收金额大写(逻辑同上)_ |\n| **amountReal** | Double | 工单收款后真正的实收 |\n| **chineseAmount** | String | _实收金额(大写)(逻辑同上)_ |\n| **payItemTogetherChinese** | String | _付款方式总额大写_ |\n| **payItemTogetherExcludeAccountAmountChinese** | String | 付款总额(排除记账金额)大写 |\n| **settleOweAmout** | Double | 结算单中用的待付金额(未收),使用后台逻辑算好 |\n| **settleOweAmoutChinese** | String | 待付金额大写 |\n| \\-----结算付款方式及优惠保存信息 | array | |\n| **settlementPayItemList** | | |\n| **payWay** | String | _付款方式_ |\n| **payAmount** | Double | _付款金额_ |\n| **chinesePayAmount** | String | _大写付款方式_ |\n| **accountAgreementName** | String | _记账客户名称_ |\n| \\-----付款方式信息 | array | |\n| **payItemList** | | |\n| **payWay** | String | _付款方式_ |\n| **payAmount** | Double | _付款金额_ |\n| **chinesePayAmount** | String | _大写付款方式_ |\n| \\-----附加项目(江苏结算单) | | |\n| **extraPrintVo** | obj | |\n| **commissionCustomName** | String | _代办费自定义名称_ |\n| **commissionCost** | Double | _代办费成本_ |\n| **commissionMemo** | String | _代办费备注_ |\n| **diagnosisCustomName** | String | _诊断费自定义名称_ |\n| **diagnosisCost** | Double | _诊断费成本_ |\n| **diagnosisItemName** | String | _诊断详细名称_ |\n| **diagnosisMemo** | String | _诊断费备注_ |\n| **checkCustomName** | String | _检查费自定义名称_ |\n| **checkCost** | Double | _检查费成本_ |\n| **checkMemo** | String | _检查费备注_ |\n| **processCustomName** | String | _加工费自定义名称_ |\n| **processCost** | Double | _加工费成本_ |\n| **processMemo** | String | _加工费备注_ |\n| **processItemName** | String | _加工详细名称_ |\n| **managementCustomName** | String | _管理费自定义名称_ |\n| **managementCost** | Double | _管理费成本_ |\n| **managementMemo** | String | _管理费备注_ |\n| \\-----二期新增字段 | | |\n| **oilCapacity** | String | 油量 |\n| **nextMileage** | Double | _下次保养里程(工单数据源,目前维保、洗车单读取)_ |\n| **nextMaintainDate** | String | _下次保养日期(工单数据源,目前维保、洗车单读取)_ |\n| **nextMileageRemind** | Double | _下次服务里程(服务提醒数据源,目前维修、贴膜单读取)_ |\n| **nextMaintainDateRemind** | Long | _下次服务时间(服务提醒数据源,目前维修、贴膜单读取)_ |\n| **repairPersonContact** | String | _送修人联系方式_ |\n| **memberCardNo** | String | _会员号_ |\n| **points** | String | _积分_ |\n| **czkList** | array | 储值卡列表 |\n| **name** | String | 名称 |\n| **memberCardNo** | String | 卡号 |\n| ```plaintext **cardOwner** ``` | String | 持卡人 |\n| **amount** | Double | 金额 |\n| **cardList** | array | 套餐卡列表 |\n| **name** | String | 名称 |\n| **memberCardNo** | String | 卡号 |\n| ```plaintext **cardOwner** ``` | String | 持卡人 |\n| **amount** | Double | 金额 |\n| **combineServiceAndPartList** | array | 项目材料组合列表 |\n| **servicePrintVo** | 参见serviceList | |\n| **partPrintVo** | 参见partList | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_235", + "content": "#### 1.结算前 待付 结算后实付(跟进结算状态判断,7100 为已结算)", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_236", + "content": "```plaintext\n$P{balanceStatus}.equals(\"7100\")?($P{amountAll}.subtract($P{vipExpense}).subtract($P{czkExpense}).subtract($P{serviceFavourable}.add($P{partFavourableCommonTotal}==null?BigDecimal.ZERO:$P{partFavourableCommonTotal}).add($P{serviceFavourableCommonTotal}==null?BigDecimal.ZERO:$P{serviceFavourableCommonTotal}).add($P{partinfoFavourable}).add($P{discountFavourable}).add($P{couponFavourable}).add($P{pointFavourable}).add($P{gatheringFavourable})).setScale( 2, BigDecimal.ROUND_HALF_EVEN ).toString()+($P{payItemTogether}==null?\"\":\"(\"+$P{payItemTogether}+\")\")):($P{amountAll}.subtract($P{vipExpense}).subtract($P{czkExpense}).subtract($P{serviceFavourable}.add($P{partFavourableCommonTotal}==null?BigDecimal.ZERO:$P{partFavourableCommonTotal}).add($P{serviceFavourableCommonTotal}==null?BigDecimal.ZERO:$P{serviceFavourableCommonTotal}).add($P{partinfoFavourable}).add($P{discountFavourable}).add($P{couponFavourable}).add($P{pointFavourable}).add($P{gatheringFavourable})).setScale( 2, BigDecimal.ROUND_HALF_EVEN ))\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_237", + "content": "```plaintext\n$P{balanceStatus}.equals(\"7100\")?$P{payItemTogetherChinese}:$P{settleOweAmoutChinese}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_238", + "content": "# 工具类jar包附件下载:", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_239", + "content": "[请至钉钉文档查看附件《print-core-1.0.7.jar》](https://alidocs.dingtalk.com/i/nodes/vy20BglGWOexYpophlEGoZvGJA7depqY?iframeQuery=anchorId%3DX02mjljl3qzo6fk6o7712b)", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_240", + "content": "### 数字金额转中文方法调用示例:", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_241", + "content": "**数字金额**:$P{amount}==null?BigDecimal.ZERO:$P{amount} \n**转中文**:**com.f6car.printserver.core.CharacterUtil.chinese(**$P{amount}==null?BigDecimal.ZERO:$P{amount})", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_242", + "content": "### 日期时间戳转日期示例:", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_243", + "content": "**日期格式选择:**java.lang.Long", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_244", + "content": "**日期时间戳**:$P{nextMaintainDateRemind} **转为目标格式**:$P{nextMaintainDateRemind} == null ? \"\" : new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\").format(new Date($P{nextMaintainDateRemind}))", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_245", + "content": "其中,\"yyyy-MM-dd HH:mm:ss\" 根据实际需求指定,比如到日则选择 \"yyyy-MM-dd\"", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_246", + "content": "洗车单小票不支持定制,定制洗车单的模板名称必须包含“洗车单”三个字 ,否则无法显示对应模板", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_247", + "content": "> 更新: 2025-02-24 17:08:50 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "工单结算单接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_248", + "content": "| **最常用的基础操作** |\n| --- |\n| [1、新增静态文本](#jwTdk) |\n| [2、新增动态字段(例如想要展示结算单中的工单号)](#fKwpz) |\n| [3、列表中增减字段(例如结算单中的项目列表和材料列表)](#IUyOs) |\n| [4、新增边框和样式设置](#RKqIf) |\n| [6、保存+输出](#M31IF) |\n| [7、打印单后台配置](#gr6xz) |", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_249", + "content": "## 常用链接地址:", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_250", + "content": "###### 打印单后台地址", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_251", + "content": "[http://print.f6yc.com/print-server/ui/index.html#/template/classification](http://print.f6yc.com/print-server/ui/index.html#/template/classification)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_252", + "content": "###### 打印单模板样式", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_253", + "content": "[https://xcz.yuque.com/ombipo/rpc7ms/fbd6ay?singleDoc#](https://xcz.yuque.com/ombipo/rpc7ms/fbd6ay?singleDoc#) 《打印单各类模板样式》", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_254", + "content": "###### 打印单参数表", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_255", + "content": "[https://xcz.yuque.com/ombipo/rpc7ms/ro5fs1?singleDoc#](https://xcz.yuque.com/ombipo/rpc7ms/ro5fs1?singleDoc#) 《打印单最新接口参数》", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_256", + "content": "###### 打印单工具简易开发教程(附带案例)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_257", + "content": "[《打印单定制简易开发教程》](https://alidocs.dingtalk.com/i/nodes/dQPGYqjpJYgZGbvbCdEKGDGZWakx1Z5N?utm_scene=team_space)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_258", + "content": "jdk1.8 使用 jaspersoft6.8版本", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_259", + "content": "[请至钉钉文档查看附件《Jaspersoft Studio-6.8.0.zip》](https://alidocs.dingtalk.com/i/nodes/20eMKjyp81R0ndXdsdYe4BaDWxAZB1Gv?corpId=&iframeQuery=anchorId%3DX02mgkgykvfbfbiqcbc8b4)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_260", + "content": "[请至钉钉文档查看附件《Jaspersoft Studio-6.3.1.final.rar》](https://alidocs.dingtalk.com/i/nodes/20eMKjyp81R0ndXdsdYe4BaDWxAZB1Gv?corpId=&iframeQuery=anchorId%3DX02mki20wvdslzwftp0ao)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_261", + "content": "[请至钉钉文档查看附件《TIBCOJaspersoftStudio-6.3.1.final-mac-x86\\_64.zip》](https://alidocs.dingtalk.com/i/nodes/20eMKjyp81R0ndXdsdYe4BaDWxAZB1Gv?corpId=&iframeQuery=anchorId%3DX02mki26xyvtjfkmi00ki)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_262", + "content": "## 打印单模板修改流程", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_263", + "content": "#### 1、下载需要的模板", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_264", + "content": "###### 通过模板名称,直接到模板管理中通过模板名称查询并下载", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_265", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_266", + "content": "#### 2、打开编辑工具 TIBCO Jaspersoft Studio", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_267", + "content": "###### 打开文件夹,双击Jaspersoft Studio.exe 运行工具", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_268", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_269", + "content": "###### 点击File-->Open File-->选择下载的模板文件", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_270", + "content": "###### 进入编辑模板的页面", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_271", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_272", + "content": "#### 3、常见编辑操作", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_273", + "content": "##### 1.新增静态文本", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_274", + "content": "###### 新增组件到模板中", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_275", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_276", + "content": "###### 双击组件编辑显示文本", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_277", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_278", + "content": "###### 调整组件大小和位置参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_279", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_280", + "content": "##### 2.新增动态字段(例如想要展示结算单中的工单号)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_281", + "content": "###### 在参数表中搜索想要的参数名称和类型:名称是:billNo 类型是文本信息=java.lang.String", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_282", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_283", + "content": "###### 拖拽一个 Text Field 组件到模板中", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_284", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_285", + "content": "###### 双击组件写入公式固定写法$P{参数名称}", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_286", + "content": "###### ", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_287", + "content": "###### 遇到提示:The current expression is not valid. Please verify it!;表明这个参数在模板中没有预先创建,需要手动创建参数信息", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_288", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_289", + "content": "###### 模板中预设参数信息:Outline-->Parameters(右键单击)-->Create Parameter", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_290", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_291", + "content": "###### 编辑参数信息:Name(填写参数名称);Class(数字就选择:java.math.BigDecimal 文本就选择java.lang.String)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_292", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_293", + "content": "##### 3.列表中增减字段(例如结算单中的项目列表和材料列表)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_294", + "content": "###### 例如查找材料名称,可以发现参数名是partName,是在一个名字叫partList 的列表里面的,在材料信息的列表中能使用到的参数就只有partList下的这个参数,其他参数无法在列表中直接使用(例如工单号在材料列表中展示不了)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_295", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_296", + "content": "###### 双击需要编辑的列表,进入列表编辑页面", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_297", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_298", + "content": "###### 编辑方式与新增动态字段相同,但是固定写法从$P{参数名称} 改为 $F{参数名称}", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_299", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_300", + "content": "###### 提示The current expression is not valid. Please verify it! 参数没有预设时,在列表编辑页面中新增,逻辑与上面相同", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_301", + "content": "##### 4.新增边框和样式设置", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_302", + "content": "###### 选择需要编辑的组件,选择Boeders 进行编辑", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_303", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_304", + "content": "#### 4、常见语法介绍", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_305", + "content": "###### 文本拼接参数:$P{参数名称}+\"特定文本内容\" —— 例如打印单标题:$P{printOrgName}+\"结算单\"", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_306", + "content": "###### 小数保留2位小数或多位:$P{参数名称}.setScale( 保留几位小数, BigDecimal.ROUND\\_DOWN ) ——例如折后金额小计,保留2位小数:$P{stuffSubtotalAll}.setScale( 2, BigDecimal.ROUND\\_DOWN )", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_307", + "content": "###### 字符串截取:$P{参数名称}.substring(起始位置,截取长度)——例如进厂日期,保留前10位:$P{billDate}.substring(0,10)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_308", + "content": "###### 三元运算-IF判断:(关系表达式) ? 表达式1 : 表达式2 ——例如打印单标题:($P{printOrgName}==null?$P{orgName}:($P{printOrgName}.isEmpty()?$P{orgName}:$P{printOrgName}))+\"结算单\"", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_309", + "content": "###### 常见运算:", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_310", + "content": "是否相等:”==“ 或者 $P{参数名称}.equals(\"文本内容\")", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_311", + "content": "加:$P{参数名称1}.add($P{参数名称2})", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_312", + "content": "减:$P{参数名称1}.subtract($P{参数名称2})", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_313", + "content": "乘:$P{参数名称1}.multiply($P{参数名称2}) ;$P{参数名称1}.multiply(new BigDecimal(1.13))", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_314", + "content": "除:$P{参数名称1}.divide($P{参数名称2}, 2, BigDecimal.ROUND_HALF_UP)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_315", + "content": "#### 4.1、高级语法介绍", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_316", + "content": "###### jar包导入:例如金额转大写,研发通过编写一个jar工具包实现特定功能,下面是导入jar包步骤", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_317", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_318", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_319", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_320", + "content": "启用成功后按照研发语法实现具体功能,比如", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_321", + "content": "###### 从list中取特定的值写入外层表格中:该公式使用jdk1.8语法,jaspersoft6.8可用", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_322", + "content": "下面表达式的意思是,从支付方式列表(payItemList) 中找到", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_323", + "content": "支付方式(payWay)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_324", + "content": "第一个支付金额(payAmount)", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_325", + "content": "```java\n$P{payItemList}.getData().stream()\n .filter(map -> \"记账\".equals(map.get(\"payWay\")))\n .map(map -> {\n Object amt = map.get(\"payAmount\");\n return amt == null ? BigDecimal.ZERO : new BigDecimal(amt.toString());\n })\n .findFirst()\n .orElse(BigDecimal.ZERO)\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_326", + "content": "#### 5、格式预览", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_327", + "content": "###### 工具中只能预览模板的样式,涉及到参数判断的需要将模板上传到门店后在F6系统工单中打印预览", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_328", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_329", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_330", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_331", + "content": "#### 6、保存+输出", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_332", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_333", + "content": "###### 选择.jrxml的文件,右键选择Compile Report 进行编译", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_334", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_335", + "content": "###### 选择.jasper的文件,右键选择Export Files to...", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_336", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_337", + "content": "###### 另存到桌面", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_338", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_339", + "content": "#### 7、打印单后台配置", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_340", + "content": "###### 新增/编辑模板", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_341", + "content": "注意:不要随便删除模板,删除一定要再三确认清楚,避免出现误操作的情况(删除不可恢复) 预计5.16号后 对删除的功能二次确认进行优化。", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_342", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_343", + "content": "###### 模板名称命名规范", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_344", + "content": "* **简单调整**\\*\\***\\*\\*模板名称:基础表+特殊修改需求**", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_345", + "content": "**模板编码:修改人姓名首字母英文大写+模板分类+日期**", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_346", + "content": "**模板备注:模板各修改点**", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_347", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_348", + "content": "* **定制调整**\\*\\***\\*\\*模板名称:门店名称+定制**", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_349", + "content": "**模板编码:修改人姓名首字母英文大写+模板分类+日期**", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_350", + "content": "**模板备注:模板各修改点**", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_351", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_352", + "content": "###### 给指定门店配置打印单", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_353", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_354", + "content": "#### 8、常见打印分类及对应的通用模板", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_355", + "content": "| 常见打印单分类 | 对应系统上的打印模块 | 通用模板名称 | 模板编码 |\n| --- | --- | --- | --- |\n| 新结算单打印 | 维保单 | F6标准结算单(壹) | newSettleFirst |\n| 结算单-新 | 除维保单的其他单据(维修单、贴膜单......) | 无 | 无 |\n| 附表-新 | 新附表 | 无 | 无 |\n| 销售单 | 销售单 | 销售单(日期版) | xiaoshodanriqiban |\n| 洗车单 | 洗车单 | 洗车单 | wash01 |\n| 报价单打印 | 报价单 | 报价单打印 | quotationPrint |\n| 新库存入库单打印 | 入库单 | 新库存入库单打印 | 9001 |\n| 新库存出库单打印 | 出库单 | 新库存出库单打印 | 9002 |\n| | | | |\n| **注:采购单和采购退货单走打印平台定制,先向赵亚妮提供门店编码、门店名称,开通后再上传配置门店生效** | | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_356", + "content": "**注意:结算单要在收款后页面打印,请确保模板名称中包含“结算单”三个字**", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_357", + "content": "> 更新: 2025-05-16 13:54:24 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "打印单定制介绍.md", + "kb_name": "" + } + }, + { + "id": "chunk_358", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| partDetailVoList | 材料列表 | | List |\n| serviceDetailVoList | 项目列表 | | List |\n| amountChinese | 商品金额中文大写 | | |\n| realAmountWithoutCardChinese | 待付金额中文大写 | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "报价单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_359", + "content": "## QuotationPartDetailPrintVo", + "metadata": { + "chunk_type": "md_section", + "source_file": "报价单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_360", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| pkId | 无意义主键 | 是 | BigInteger |\n| idOwnOrg | 门店id | 是 | BigInteger |\n| idQuotation | 报价单id | 是 | BigInteger |\n| idPart | 材料id | 否 | BigInteger |\n| partName | 材料名称(非组合,对应材料名称字段) | 是 | String |\n| partShowName | 材料在界面上显示的名称(组合供应商编码等信息) | 是 | String |\n| idMdmPart | 云材料ID | 否 | String |\n| labelId | 业务分类id | 否 | BigInteger |\n| labelName | 荣誉的业务分类名称 | 否 | String |\n| number | 数量 | 是 | BigDecimal |\n| price | 单价 | 是 | BigDecimal |\n| subtotal | 总价 | 是 | BigDecimal |\n| idEmployee | 服务员工id | 否 | String |\n| employeeName | 服务员工姓名 | 否 | String |\n| isMember | 套餐2,套餐卡1,普通0 | 是 | byte |\n| memo | 备注 | 否 | String |\n| discount | 折扣 | 是 | BigDecimal |\n| realSubtotal | 折后总计 | 是 | BigDecimal |\n| stockNumber | 门店库存数量 | 否 | BigDecimal |\n| groupId | 公司id | 是 | BigInteger |\n| unit | 单位 | 否 | String |\n| spec | 规格型号 | 否 | String |\n| brand | 品牌名称 | 否 | String |\n| brandId | 品牌id | 否 | String |\n| supplierCode | 零件号 | 否 | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "报价单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_361", + "content": "## QuotationServiceDetailPrintVo", + "metadata": { + "chunk_type": "md_section", + "source_file": "报价单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_362", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| pkId | 无意义主键 | 是 | BigInteger |\n| customCode | 项目编码 | 否 | String |\n| serviceName | 项目名称 | 是 | String |\n| workHour | 工时 | 否 | BigDecimal |\n| price | 单价 | 是 | BigDecimal |\n| subtotal | 工时费 | 是 | BigDecimal |\n| discount | 折扣 | 是 | BigDecimal |\n| realSubtotal | 折后金额 | 是 | BigDecimal |\n| memo | 备注 | 否 | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "报价单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_363", + "content": "> 更新: 2025-05-26 14:19:50 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "报价单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_364", + "content": "# 新版附表打印接口文档", + "metadata": { + "chunk_type": "md_section", + "source_file": "新版附表打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_365", + "content": "# 新版附表打印接口文档", + "metadata": { + "chunk_type": "md_section", + "source_file": "新版附表打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_366", + "content": "| 字段 | 含义 | 类型 |\n| --- | --- | --- |\n| billNo | 附表单号 | String |\n| fromBillNo | 附表源工单号 | String |\n| fromMaintainType | 来源单据类型 | String |\n| billDate | 进厂日期 | String |\n| creatorName | 创建人名称 | String |\n| creationtime | 创建时间 | String |\n| naEmployee | 服务顾问 | String |\n| employeePhone | 服务顾问手机号 | String |\n| businessTypeName | 业务类型 | String |\n| nextMaintainDate | 下次保养日期 | String |\n| oilCapacity | 当前油量 | String |\n| mileage | 出厂里程(进厂里程) | Double |\n| nextMileage | 下次保养里程 | Double |\n| vin | 车辆VIN码 | String |\n| carNoWhole | 车牌号 | String |\n| carModel | 品牌车型全称 | String |\n| carModelShort | 车型简称 | String |\n| carColor | 车身颜色 | String |\n| carCategoryName | 车辆分类名称 | String |\n| carBrandName | 车辆品牌名称 | String |\n| carSeriesName | 车系名称 | String |\n| engineNumber | 发动机号 | String |\n| transmissionNo | 变速箱号 | String |\n| registerDate | 车辆注册日期 | String |\n| cardDate | 车辆发证日期 | String |\n| carNatureOfUseName | 车辆使用性质 | String |\n| carFuelTypeName | 车辆燃料(能源)类型 | String |\n| carSourceName | 车辆来源 | String |\n| carOwnerName | 车辆所有人姓名 | String |\n| naCustomer | 客户姓名 | String |\n| customerSourceName | 客户来源名称 | String |\n| customerDetailAddress | 客户详细地址 | String |\n| cellPhone | 联系电话(客户) | String |\n| memberCardNo | 会员卡号 | String |\n| points | 客户积分 | String |\n| customerLevelName | 客户等级名称 | String |\n| repairPerson | 送修人 | String |\n| repairPersonContact | 送修人联系方式 | String |\n| memo | 备注 | String |\n| completeDate | 完工日期 | String |\n| firstGatheringTime | 初次收款时间 | String |\n| estimatedDeliveryTime | 预计交车时间 | String |\n| deliveryTime | 交车时间 | String |\n| printContent | 免责条款 | String |\n| printContentJs | 免责条款江苏 | printContentJs |\n| storeLogo | 门店logo | String |\n| orgName | 门店名称 | String |\n| orgMemo | 门店备注 | String |\n| orgContacts | 联系人(维修厂) | String |\n| orgContactNumber | 联系电话(维修厂) | String |\n| orgDetailAddress | 联系地址(维修厂) | String |\n| orgContactMobile | 联系电话(维修厂) | String |\n| fax | 传真 | String |\n| email | 组织邮件 | String |\n| bankAccount | 开户银行 | String |\n| accountNumber | 账号 | String |\n| businessLicenseCode | 企业执照号 | String |\n| channelName | 来店途径名称 | String |\n| printOrgName | 打印抬头(需读取配置) | String |\n| amountAll | 应收总计(合计金额) | Double |\n| amountAllChinese | 应收总计(合计金额)中文大写 | String |\n| disCountAll | 总优惠合计(附表:项目优惠+材料优惠+收银优惠) | Double |\n| disCountAllBak | 项目优惠+材料优惠+收银优惠,等同于disCountAll | Double |\n| amountReal | 实收金额 | Double |\n| chineseAmount | 实收金额(中文大写) | Double |\n| oweAmount | 未收金额 | Double |\n| vipExpense | 套餐卡消费金额(附表为0) | Double |\n| vipExpenseFavourable | 套餐卡优惠金额(附表为0) | Double |\n| czkExpense | 储值卡消费金额(附表为0) | Double |\n| czkExpenseFavourable | 储值卡优惠金额(附表为0) | Double |\n| remainAmount | 结算金额tsf附表:应收-项目优惠-材料优惠 | Double |\n| receivedAmount | 收款金额tsf附表:等同于已收金额 | Double |\n| serviceList | 项目集合 | List |\n| └─ sortNumber | 序号 | String |\n| └─ orderNumber | 序号(全部) | String |\n| └─ name | 名称 | String |\n| └─ serviceName | 项目名称 | String |\n| └─ labelName | 业务分类名称 | String |\n| └─ price | 工时单价 | Double |\n| └─ workHour | 工时 | Double |\n| └─ subtotal | 金额 | Double |\n| └─ singleFavourable | 优惠金额 | Double |\n| └─ discountedSubtotal | 折后金额 | Double |\n| └─ serviceMemo | 附加信息备注 | String |\n| └─ discount | 折扣 | Double |\n| └─ empNameStr | 服务项目明细对应修理工名称组装字符串 | String |\n| └─ infiniteFlag | 是否无限,0:否,1:是 | Integer |\n| └─ customCode | 自定义编码 | String |\n| totalWorkHour | 项目工时合计 | Double |\n| totalWorkHourVip | VIP项目工时合计(附表为0) | Double |\n| serviceSubtotalAll | 工时费小计 | Double |\n| serviceSubtotalVip | 服务项目明细小计(会员项目,附表为0) | Double |\n| serviceNum | 维修项目小计 | String |\n| serviceFavourable | 服务项目(非会员项目)客户等级优惠(附表为0) | Double |\n| serviceDiscountFavourable | 项目优惠 | Double |\n| serviceFavourableTotal | 项目优惠金额合计 | Double |\n| serviceFavourableCommonTotal | 普通项目优惠金额合计 | Double |\n| serviceDisCountSubTotal | 项目折后金额合计 | Double |\n| partList | 工单对应配件材料集合 | List |\n| └─ sortNumber | 序号 | String |\n| └─ orderNumber | 序号(全部) | String |\n| └─ name | 名称 | String |\n| └─ partName | 材料名称 | String |\n| └─ partShowName | 材料名称(全) | String |\n| └─ partBrand | 配件品牌 | String |\n| └─ standard | 配件名称规格型号品牌 | String |\n| └─ spec | 规格型号 | String |\n| └─ supplierCode | 供应商编码 | String |\n| └─ unit | 单位 | String |\n| └─ number | 数量 | Double |\n| └─ price | 价格(单价) | Double |\n| └─ subtotal | 金额(材料金额) | Double |\n| └─ discount | 折扣 | Double |\n| └─ singleFavourable | 优惠金额 | Double |\n| └─ discountedSubtotal | 折后金额 | Double |\n| └─ partMemo | 备注 | String |\n| └─ customCode | 自定义编码 | String |\n| └─ employeeName | 员工名称 | String |\n| └─ outStockEmployeeName | 领料人 | String |\n| └─ empNameStr | 明细对应修理工名称组装字符串 | String |\n| └─ labelName | 业务分类名称 | String |\n| └─ idPart | 配件材料pk | BigInteger |\n| └─ idInfo | 本地材料id(长码) | String |\n| └─ applyModel | 适用车型 | String |\n| stuffNum | 材料数目合计 | String |\n| totalStuffNum | 材料数量合计 | String |\n| totalStuffNumVip | Vip材料数量合计(附表为0) | String |\n| stuffSubtotalAll | 材料费小计 | Double |\n| stuffSubtotalVip | 材料收入小计(会员项目,附表为0) | Double |\n| partinfoFavourable | 材料项目(非会员项目)客户等级优惠(附表为0) | Double |\n| partinfoDiscountFavourable | 材料折扣优惠 | Double |\n| partFavourableTotal | 材料优惠金额合计 | Double |\n| partFavourableCommonTotal | 普通材料优惠金额合计 | Double |\n| stuffDisCountTotal | 材料折后金额合计 | Double |\n| pointFavourable | 积分优惠(附表为0) | Double |\n| packageFavourable | 套餐优惠(附表为0) | Double |\n| discountFavourable | 结清优惠(附表为0) | Double |\n| gatheringFavourable | 收银优惠 | Double |\n| couponFavourable | 优惠券优惠(附表为0) | Double |\n| czkDiscountFavourable | 储值卡折扣优惠(附表为0) | Double |\n| customerLevelFavourable | 客户级别优惠金额(附表为0) | Double |\n| extraChargeList | 附加费用集合 | List |\n| └─ sortNumber | 序号 | String |\n| └─ extraName | 附加费名称 | String |\n| └─ subtotal | 金额 | Double |\n| └─ memo | 备注 | String |\n| extraCostTotal | 附加费小计 | Double |\n| extraNumber | 附加费数量小计 | String |\n| managementCost | 管理费 | Double |\n| extraPrintVo | 附加项目 | ExtraPrintAttribute |\n| └─ commissionCustomName | 代办费自定义名称 | String |\n| └─ commissionCost | 代办费金额 | Double |\n| └─ commissionMemo | 代办费备注 | String |\n| └─ diagnosisCustomName | 诊断费自定义名称 | String |\n| └─ diagnosisCost | 诊断费金额 | Double |\n| └─ diagnosisItemName | 诊断详细名称 | String |\n| └─ diagnosisMemo | 诊断费备注 | String |\n| └─ checkCustomName | 检查费自定义名称 | String |\n| └─ checkItemName | 诊断详细名称 | String |\n| └─ checkCost | 检查费金额 | Double |\n| └─ checkMemo | 检查费备注 | String |\n| └─ processCustomName | 加工费自定义名称 | String |\n| └─ processCost | 加工费金额 | Double |\n| └─ processMemo | 加工费备注 | String |\n| └─ processItemName | 加工详细名称 | String |\n| └─ managementCustomName | 管理费自定义名称 | String |\n| └─ managementCost | 管理费金额 | Double |\n| └─ managementMemo | 管理费备注 | String |\n| └─ fuelName | 加油费 | String |\n| └─ fuelAmount | 加油费金额 | Double |\n| └─ trailName | 拖车费 | String |\n| └─ trailAmount | 拖车费金额 | Double |\n| allOtherCost | 附加费合计应收 | Double |\n| receiptAmount | 收据金额(附表:应收-项目优惠-材料优惠-收银优惠) | Double |\n| receiptAmountChinese | 收据金额中文大写 | String |\n| payItemList | 付款方式集合 | List |\n| └─ payWay | 付款方式 | String |\n| └─ payAmount | 付款金额 | Double |\n| └─ chinesePayAmount | 付款金额中文大写 | String |\n| payItemTogether | 付款方式拼接 | String |\n| payItemTogetherChinese | 付款方式总额中文大写 | String |\n| paymentTypeDetails | 支付方式汇总 | String |\n| settleOweAmout | 结算单中用的待付金额(未收) | Double |\n| settleOweAmoutChinese | 结算单中用的待付金额大写(未收) | String |\n| settleReceivedAmout | 结算单中用的实付金额(实收) | Double |\n| settleReceivedAmoutChinese | 结算单中用的实付金额大写(未收) | String |\n| realPayAmountChinese | 客户实付大写(应收-所有优惠) | String |\n| naInsurer | 理赔公司名称 | String |\n| insurancepolicyNo | 理赔单理赔保险单号 | String |\n| insuranceCompany | 保险公司名称 | String |\n| contactName | 联系人姓名 | String |\n| contactCellphone | 联系人电话 | String |\n| insuranceNo | 商业险单号 | String |\n| insuranceNoTCI | 交强险单号 | String |\n| insuranceExpiryDate | 商业险到期日 | String |\n| insuranceExpiryDateTCI | 交强险到期日 | String |\n| printEmployeeName | 打印人姓名 | String |\n| printTime | 打印时间 | String |\n| printCount | 打印次数 | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "新版附表打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_367", + "content": "1. ++新版附表没有“状态”字段,所有模板中切勿使用 billStatus【单据状态】、balanceStatus【结算状态】来进行判断输出;采用直接取值方式填值++\n \n 1. ++没有了balanceStatus,采用收款方式列表payItemList判空的方式来验证是否有收款信息++\n \n 1. ++收银金额可写作:++$P{payItemList}.getRecordCount()==0?$P{receivedAmount}:$P{receivedAmount}.setScale( 2, BigDecimal.ROUND\\_HALF\\_EVEN ).toString()+\"(\"+$P{paymentTypeDetails}+\")\"\n \n 2. ++待付金额可写作:$P{oweAmount}++\n \n 3. ++实付金额可写作:$P{amountReal}++\n \n 4. ++合计金额可写作:++$P{payItemList}.getRecordCount()==0?($P{settleOweAmout}).setScale( 2, BigDecimal.ROUND_HALF_EVEN ):($P{settleReceivedAmout}).setScale( 2, BigDecimal.ROUND_HALF_EVEN )\n \n 5. ++大写可写作:++$P{payItemList}.getRecordCount()==0?$P{settleOweAmoutChinese}:$P{chineseAmount}\n \n2. ++新版附表没有“单据类型”字段(原附表的maintainType为\"GDFB\"、\"LPDFB\"两种附表类型),所有模板中切勿使用 maintainType【单据类型】字段作为判断条件。根据情况可以取 fromMaintainType【来源单据类型】进行判断。如:++\n \n 1. ++是否展示理赔公司、理赔单等理赔相关信息栏,老附表判断逻辑为 maintainType.equals('LPDFB')。可更换为 fromMaintainType.equals('LPD')++", + "metadata": { + "chunk_type": "md_section", + "source_file": "新版附表打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_368", + "content": "1. 出参标注颜色为 **绿 色** 的字段,为 ++**附表本身内容**++(如车牌号、VIN码等) 或 ++**无法变更内容**++(如门店信息等)\n \n 1. 客户在附表页面直接变更信息,会直观反映在打印内容中。\n \n2. 出参标注颜色为 **橙 色** 的字段,为 ++**通过客户ID、车辆ID、项目ID、材料ID**++ 等,++**反查**++ 基础数据获得内容,\n \n 1. 若客户通过 ++**附表页面选择组件方式**++ 修改附表信息,因ID发生变化,该部分打印内容会随之变化,变更信息将 ++**会体现在打印内容中**++。\n \n 2. 若客户通过 ++**手动填写文本内容方式**++ 修改附表信息,因ID未发生变化,该部分打印内容不会变化,变更信息将 ++**不会体现在打印内容中**++,若客户不满意结果,请客户直接将 ++**基础数据进行变更**++ 后,通过页面组件选择后再进行打印。", + "metadata": { + "chunk_type": "md_section", + "source_file": "新版附表打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_369", + "content": "> 更新: 2024-01-11 12:11:34 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "新版附表打印接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_370", + "content": "# 材料标签接口参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_371", + "content": "# 材料标签接口参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_372", + "content": "打印平台模版分类:材料价格通用标签打印", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_373", + "content": "材料标签支持一次打多张,与labelList集合里的元素个数相匹配:", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_374", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| labelList | 材料标签列表 | | List |\n| | | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_375", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| name | 材料名称 | | String |\n| supplierCode | 零件号 | | String |\n| customCode | 材料编码 | | String |\n| sellPrice | 销售价格 | | BigDecimal |\n| date | 打印日期 | | String yyyy/MM/dd |\n| | | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_376", + "content": "# 采购库存材料标签打印", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_377", + "content": "### 打印平台模版分类:", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_378", + "content": "不带供应商信息:采购库存通用标签打印-新", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_379", + "content": "带供应商信息:采购库存通用标签打印-包含供应商-新", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_380", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_381", + "content": "材料标签支持一次打多张,于labelList集合里的元素个数相匹配:", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_382", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| labelList | 材料名称 | | List |", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_383", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| partName | 材料名称 | | String |\n| partBrand | 材料品牌 | | String |\n| customCode | 材料编码 | | String |\n| partShowName | 组合名称(材料品牌,名称,规格型号组合) | | String |\n| supplierCode | 材料供应商编码 | | String |\n| spec | 材料规格型号 | | String |\n| unit | 材料单位 | | String |\n| barCode | 材料编码 | | String |\n| billDate | 单据日期 | | String yyyy-MM-dd |\n| supplierName | 供应商名称 | | String |\n| storageName | 材料仓库名称 | | String |\n| defSeat | 材料货位 | | String |\n| date | 打印的当前日期 | | String yyyy/MM/dd |", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_384", + "content": "> 更新: 2023-09-14 14:27:45 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "材料标签接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_385", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| carCheckPackageName | 模板名称 | | String |\n| title | 标题 | | String |\n| billNo | 检测单号 | | String |\n| printTime | 打印时间 | | String |\n| naEmployee | 服务顾问 | | String |\n| billDate | 进厂时间 | | String |\n| deliveryTime | 预计交车 | | String |\n| naCustomer | 车主 | | String |\n| carModel | 车型 | | String |\n| cellPhone | 车主电话 | | String |\n| carNoWhole | 车牌号 | | String |\n| vin | vin码 | | String |\n| repairPerson | 送修人 | | String |\n| repairPersonContact | 送修人联系方式 | | String |\n| mileage | 进厂里程 | | String |\n| oilCapacity | 进厂油量 | | String |\n| nextMileage | 下次保养里程 | | String |\n| nextMaintainDate | 下次保养日期 | | String |\n| customerMemo | 车主描述 | | String |\n| merchantAddress | 联系地址 | | String |\n| merchantPhone | 联系方式(手机 + 固定电话) | | String |\n| qrCode | 二维码 | | String |\n| qrCodeToB | 新版检测单B端二维码 | | String |\n| qrCodeToC | 新版检测单C端二维码 | | String |\n| icon | 车辆环视图 | | String |\n| maintainBillNo | 结算单号 | | String |\n| showComputerCheckInfo | 是否展示电脑检测 | | Boolean |\n| computerCheckInfoList | 电脑检测 | | List |\n| personalCheckInfoList | 包含正常和异常人工检测项 | | List |\n| sortedPersonalCheckInfoList | 包含正常和异常人工检测项,问题项目排序靠前 | | List |\n| optionPersonalCheckInfoList | 异常人工检测项 | | List |\n| normalPersonalCheckInfoList | 正常人工检测项 | | List |\n| iconMemo | 环视图备注 | | String |\n| iconResult | 环视图结论 | | String |\n| warningLightResult | 警示灯结论 | | String |\n| warningLightMemo | 警示灯备注 | | String |\n| showWarningLightItem | 是否展示警示灯 | | Boolean |\n| warningLightItemList | 警示灯 | | List |\n| warningLightBrightItemUrls | 警示灯列表字符串 | | String |\n| employeeName | 服务技师 | | String |\n| | | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_386", + "content": "## ComputerPrintItem", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_387", + "content": "| 字段 | 含义 | 类型 |\n| --- | --- | --- |\n| index | 序号 | String |\n| errorCode | 故障码 | String |\n| itemName | 检测项目 | String |\n| optionNameS | 建议处理(Y) | String |\n| optionNameE | 择期处理(Y) | String |\n| optionNameU | 急需处理(Y) | String |\n| memo | 备注 | String |\n| | | |\n| | | |\n| | | |\n| | | |\n| | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_388", + "content": "## PersonalPrintItem(检测小类)", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_389", + "content": "| 字段 | 含义 | 类型 |\n| --- | --- | --- |\n| index | 序号 | BigInteger |\n| itemComponent | 检测部件(小类名称) | String |\n| memo | 备注 | String |\n| childList | 子项目列表 | List |", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_390", + "content": "## PrintTinyItem(检测项目)", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_391", + "content": "| 字段 | 含义 | 类型 |\n| --- | --- | --- |\n| itemName | 检测项目 | String |\n| itemResults | 检测结果 | String |\n| optionNameS | 建议处理 Y | String |\n| optionNameE | 择期处理 Y | String |\n| optionNameU | 急需处理 Y | String |\n| memo | 备注 | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_392", + "content": "## ComputerPrintItem", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_393", + "content": "| 字段 | 含义 | 类型 |\n| --- | --- | --- |\n| warningIconCode | 警示灯 | String |\n| | | |\n| | | |\n| | | |\n| | | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_394", + "content": "> 更新: 2025-02-25 13:55:59 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "检测单接口参数.md", + "kb_name": "" + } + }, + { + "id": "chunk_395", + "content": "# 结算单(指定内容)接口文档", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_396", + "content": "# 结算单(指定内容)接口文档", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_397", + "content": "**接口: /blazer/maintenance/pr****int/file/dispatchCondition**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_398", + "content": "**方法: post**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_399", + "content": "**支持场景:打印 维保单/洗车单/维修单/贴膜单/理赔单/零售单,支持指定(项目/材料/附加费)打印**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_400", + "content": "**支持打印模块(**PrintModuleEnum**):****工时费、材料费、附加费、其他费用、服务费用**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_401", + "content": "```plaintext\n{\n \"rowId\": \"10329\",\n \"rowCode\": \"partialSettlementStatement\",\n \"pkId\": \"16126085167868551253\",\n \"serviceList\": [\n {\n \"pkId\": 16126085168250232896,\n \"module\": 1\n },\n {\n \"pkId\": 16155904656688554043,\n \"module\": 4\n }\n ],\n \"partList\": [\n {\n \"pkId\": 11004336,\n \"module\": 2\n },\n {\n \"pkId\": 11004811,\n \"module\": 5\n }\n ],\n \"extraList\": [\n {\n \"type\": 4,\n \"module\": 3\n },\n {\n \"type\": 6,\n \"module\": 4\n }\n ]\n}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_402", + "content": "```plaintext\n{\n \"preScanUrl\": \"https://f.f6yc.com/printserver/pdfprint.html?url=https://f.f6yc.com/print-server/test/2024-10/default/49be06dc15444e2793a21fc8c16d3b5c.pdf?Expires=1729152323&OSSAccessKeyId=LTAI4Fcf2C1U99o3e3UQ2bHV&Signature=L86HWRF2ilyXU4BbzKhwXad%2BwXg%3D\",\n \"url\": \"https://f.f6yc.com/print-server/test/2024-10/default/49be06dc15444e2793a21fc8c16d3b5c.pdf?Expires=1729152323&OSSAccessKeyId=LTAI4Fcf2C1U99o3e3UQ2bHV&Signature=L86HWRF2ilyXU4BbzKhwXad%2BwXg%3D\"\n}\n```", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_403", + "content": "# jasper取参说明", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_404", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| billNo | 工单号 | 是 | String |\n| maintainType | 工单类型 | 是 | String |\n| businessTypeName | 业务类别 | 是 | String |\n| balanceStatus | 结算状态 | 是 | String |\n| billStatus | 单据状态 | 是 | String |\n| creatorName | 创建人名称 | 是 | String |\n| naEmployee | 服务顾问 | 否 | String |\n| employeePhone | 服务顾问手机号 | 否 | String |\n| naInsurer | 理赔公司名称 | 否 | String |\n| insurancepolicyNo | 理赔保险单号 | 否 | Double |\n| serviceSubtotalVip | 套餐卡项目工时费小计 | 是 | Double |\n| serviceFavourableCommonTotal | 普通项目优惠金额合计 | 是 | Double |\n| totalStuffNum | 材料数量合计 | 是 | String |\n| stuffSubtotalVip | 套餐卡项目材料费小计 | 是 | Double |\n| stuffSubtotalAll | 材料费小计 | 是 | Double |\n| partFavourableCommonTotal | 普通材料优惠金额合计 | 是 | Double |\n| extraNumber | 附加费数量小计 | 是 | String |\n| extraCostTotal | 附加费小计 | 是 | Double |\n| favourableTotalList | 优惠明细小计 | 否 | List |\n| naCustomer | 客户姓名 | 是 | String |\n| cellPhone | 客户联系电话 | 是 | String |\n| repairPerson | 送修人 | 否 | String |\n| repairPersonContact | 送修人联系方式 | 否 | String |\n| carNoWhole | 车牌号 | 是 | String |\n| vin | 车辆VIN码 | 否 | String |\n| carBrandName | 品牌名称 | 否 | String |\n| carSeriesName | 车系名称 | 否 | String |\n| carModelShort | 车型简称 | 否 | String |\n| carModel | 车型 | 否 | String |\n| transmissionNo | 变速箱号 | 否 | String |\n| carFuelTypeName | 燃料类型 | 否 | String |\n| carColor | 车身颜色 | 否 | String |\n| billDate | 进厂日期 | 是 | String |\n| estimatedDeliveryTime | 预计交车时间 | 是 | String |\n| deliveryTime | 交车时间(出厂时间) | 是 | String |\n| mileage | 进厂里程 | 是 | Double |\n| nextMaintainDateRemind | 下次服务时间(服务提醒数据源) | 否 | Date |\n| nextMileageRemind | 下次服务里程(服务提醒数据源) | 否 | Double |\n| serviceList | 项目列表 | 否 | List |\n| partList | 材料列表 | 否 | List |\n| extraChargeList | 附加费列表 | 否 | List |\n| extendedModuleList | 扩展模块列表 | 否 | List |\n| memo | 车主备注 | 否 | String |\n| signaturePhotoUrl | 签名图片 | 否 | String |\n| orgName | 维修厂名称 | 是 | String |\n| orgContacts | 维修厂联系人 | 是 | String |\n| orgDetailAddress | 维修厂地址 | 是 | String |\n| orgContactMobile | 联系电话(维修厂) | 否 | String |\n| storeLogo | logo | 否 | String |\n| printOrgName | 打印抬头 | 否 | String |\n| printContent | 免责条款 | 是 | String |\n| printCount | 打印次数 | 是 | String |\n| printTime | 打印时间 | 是 | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_405", + "content": "**PartialServicePrintAttribute**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_406", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| serviceName | 项目名称 | 是 | String |\n| labelName | 业务分类名称 | 是 | String |\n| isMember | 当前项目是否使用会员 | 是 | String |\n| idService | 服务项目id | 是 | BigInteger |\n| idInfo | 本地项目id | 是 | String |\n| price | 工时单价 | 是 | Double |\n| workHour | 工时 | 是 | Double |\n| subtotal | 金额 | 是 | Double |\n| singleFavourable | 优惠金额 | 是 | Double |\n| discountedSubtotal | 折后金额 | 是 | Double |\n| serviceMemo | 附加信息备注 | 否 | String |\n| discount | 折扣 | 是 | Double |\n| empNameStr | 服务项目明细对应修理工名称组装字符串 | 否 | String |\n| favourableVoList | 优惠明细 | 否 | List |", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_407", + "content": "**PartialPartPrintAttribute**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_408", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| partName | 材料名称 | 是 | String |\n| partShowName | 材料名称(全) | 是 | String |\n| partBrand | 配件品牌 | 是 | String |\n| unit | 单位 | 是 | String |\n| number | 数量 | 是 | Double |\n| isMember | 当前项目是否使用会员 | 是 | Integer |\n| price | 价格(单价) | 是 | Double |\n| subtotal | 金额(材料金额) | 是 | Double |\n| discount | 折扣 | 是 | Double |\n| singleFavourable | 优惠金额 | 是 | Double |\n| discountedSubtotal | 折后金额 | 是 | Double |\n| partMemo | 备注 | 否 | String |\n| isBring | 是否自带 | 是 | String |\n| empNameStr | 明细对应修理工名称组装字符串 | 否 | String |\n| outStockEmployeeName | 领料人 | 否 | String |\n| labelName | 业务分类名称 | 是 | String |\n| idPart | 配件材料pk | 是 | BigInteger |\n| idInfo | 本地材料id | 是 | String |\n| favourableVoList | 优惠明细 | 否 | List |", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_409", + "content": "**ExtraChargePrintAttribute**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_410", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| extraName | 附加费名称 | 是 | String |\n| subtotal | 金额 | 是 | Double |\n| memo | 备注 | 否 | String |", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_411", + "content": "**FavourableDetailPrintAttribute**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_412", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| discountType | 优惠类型 | 是 | Integer |\n| discountTypeName | 优惠类型名称 | 是 | Double |\n| amount | 优惠金额 | 是 | Double |", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_413", + "content": "**ExtendedModulePrintAttribute**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_414", + "content": "| 字段 | 含义 | 是否必有 | 类型 |\n| --- | --- | --- | --- |\n| module | 打印模块,PrintModuleEnum.code | 是 | Integer |\n| name | 项目/材料/附加费名称 | 是 | String |\n| number | 项目对应工时,材料对应数量,附加费为“-” | 是 | Double |\n| price | 项目对应工时单价,材料对应材料单价,,附加费为“-” | 是 | Double |\n| subtotal | 项目对应工时费,材料对应材料费,附加费对应为金额 | 是 | Double |\n| discount | 项目对应折扣,材料对应折扣,附加费为“1.00” | 是 | Double |\n| discountedSubtotal | 项目对应折后金额,材料对应材料费折后金额,,附加费对应为金额 | 是 | Double |\n| favourableVoList | 优惠明细 | 否 | List |", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_415", + "content": "**PrintModuleEnum 打印模块枚举**", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_416", + "content": "| **key** | **code** | **name** |\n| --- | --- | --- |\n| MAN\\_HOUR\\_COST | 1 | 工时费模块 |\n| MATERIAL\\_COST | 2 | 材料费模块 |\n| EXTRA\\_COST | 3 | 附加费模块 |\n| OTHER\\_COST | 4 | 其他费用模块 |\n| SERVICE\\_COST | 5 | 服务费用模块 |", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_417", + "content": "# 工具类jar包附件下载", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_418", + "content": "[附件: print-core-1.0.7.jar](./attachments/JUhN4OhWjosFCdDg/print-core-1.0.7.jar)", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_419", + "content": "### 数字金额转中文方法调用示例:", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_420", + "content": "**数字金额**:$P{amount}==null?BigDecimal.ZERO:$P{amount} **转中文**:com.f6car.printserver.core.CharacterUtil.chinese($P{amount}==null?BigDecimal.ZERO:$P{amount})", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_421", + "content": "> 更新: 2024-10-17 15:07:46 原文: ", + "metadata": { + "chunk_type": "md_section", + "source_file": "结算单(指定内容)接口文档.md", + "kb_name": "" + } + }, + { + "id": "chunk_422", + "content": "# 采购单模版打印说明", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_423", + "content": "* 前端调用接口", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_424", + "content": "/stock/allot/print?idAllot=", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_425", + "content": "* 打印使用模版", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_426", + "content": "模版编码=allotInPrint", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_427", + "content": "", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_428", + "content": "* 打印模版参数", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_429", + "content": "HashMap resultMap", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_430", + "content": "| 字段 | 说明 | 备注 |\n| --- | --- | --- |\n| printFlag | 均价门店 false批次门店 true | |\n| showPrice | 参配-打印调拨价格及金额勾选 true未勾选 false | |\n| orgName | 打印抬头调入门店打印:XXX调入单调出门店打印:XXX调出单 | |\n| billNo | 调拨单号调入门店打印:DRDXXX调出门店打印:DCDXXX | |\n| idOwnOrg | 门店ID调入门店打印:调入门店ID调出门店打印:调出门店ID | |\n| naOrgIn | 调入门店名称 | |\n| naOrgOut | 调出门店名称 | |\n| detailAddress | 供应商详细地址 | |\n| statusName | 调拨单状态(制单/待发货/待收货/已完成) | |\n| billDate | 单据日期(yyyy-MM-dd) | |\n| creatorName | 创建单名称 | |\n| nowDateTime | 打印时间(yyyy-MM-dd HH:mm) | |\n| remark | 备注信息 | |\n| showRemark | 是否显示备注备注为空 false备注不为空 true | |\n| sumNumber | 总数量 | |\n| sumAmount | 总金额价格脱敏时显示 \\*\\*\\*\\* | |\n| printCount | 打印次数 | |\n| allotDetailVoList | 调拨单明细行 | |\n| sortNumber | 序号 | |\n| partShowName | 材料组合名称 | |\n| customCode | 材料自定义编码 | |\n| partName | 材料名称 | 20250731追加 |\n| partBrand | 材料品牌 | 20250731追加 |\n| supplierCode | 材料零件号 | 20250731追加 |\n| standard | 材料规格型号 | 20250731追加 |\n| carNo | 车牌 | 20250731追加 |\n| defSeat | 货位调入门店打印:调入门店货位调出门店打印:调出门店货位 | |\n| unit | 单位 | |\n| price | 单价价格脱敏时显示 \\*\\*\\*\\* | |\n| numCus | 均价门店 调拨个数批次门店&制单&未选择批次 调拨个数批次门店 选择或使用的批次个数 | |\n| amount | 均价门店 调拨明细行金额批次门店&制单&未选择批次 调拨明细行金额批次门店 选择或使用的批次个数\\*调拨单单价备注:价格脱敏时显示 \\*\\*\\*\\* | |\n| orderNo | 批次号 | |\n| productDate | 批次生成日期 | |\n| 明细合计行 | | |\n| sortNumber | 合计行 | |\n| partShowName | \"\" | |\n| unit | \"\" | |\n| numCus | 总数量 | |\n| amount | 总金额价格脱敏时显示 \\*\\*\\*\\* | |\n| defSeat | \"\" | |\n| stockNumber | \"\" | |", + "metadata": { + "chunk_type": "md_section", + "source_file": "调拨单打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_431", + "content": "# 采购单/采购退模版打印", + "metadata": { + "chunk_type": "md_section", + "source_file": "采购单_采购退模版打印.md", + "kb_name": "" + } + }, + { + "id": "chunk_432", + "content": "[《采购单/采购退打印》](https://alidocs.dingtalk.com/i/nodes/7NkDwLng8ZMajY9YijOwlz4bJKMEvZBY)", + "metadata": { + "chunk_type": "md_section", + "source_file": "采购单_采购退模版打印.md", + "kb_name": "" + } + } +] \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/meta.json b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/meta.json new file mode 100644 index 0000000..d609265 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/meta.json @@ -0,0 +1,4001 @@ +{ + "kb_id": "5a1ba1acd39344d79602df3e38ff52a8", + "user_id": "d198ae3b32cd49f09736c4290dd1223a", + "name": "F6-汽车维修打印默认知识库", + "description": "预置的汽车维修打印单模板与接口文档知识库", + "created_at": "2026-05-23T12:19:43.791930+00:00", + "updated_at": "2026-05-23T12:21:19.786581+00:00", + "fields": [ + { + "name": "orgName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "detailAddress", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "contactNumber", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "fax", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "bankAccount", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "email", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "accountNumber", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "naCustomer", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "contactName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "contactCellphone", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "billNo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "billDate", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "mileage", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "carNoWhole", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "carModelShort", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "deliveryTime", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "serviceSubtotalAll", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "stuffSubtotalAll", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "extraCostTotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "amountAll", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "totalWorkHour", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "numberCount", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "serviceList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "partList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "businessTypeName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "creatorName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "carModel", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "vin", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "printCount", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "serviceNum", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "serviceDisCountSubTotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "totalStuffNum", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "couponFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "pointFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "partinfoDiscountFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "naEmployee", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "memo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "repairPerson", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cellPhone", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "carBrandName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "orgContactMobile", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "orgDetailAddress", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "selfPartList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "payItemList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "extraChargeList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "stuffDisCountTotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "selfTotalStuffNum", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "czkExpense", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "disCountAll", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "packageFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "serviceFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "partinfoFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "gatheringFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "discountFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "oweAmount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "amountReal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "printTime", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "creationtime", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "extraNumber", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "carSeriesName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "qRCodeStr", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "vipExpense", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "storeLogo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "partFavourableTotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "serviceFavourableTotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "partFavourableCommonTotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "serviceFavourableCommonTotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "serviceSubtotalVip", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "stuffSubtotalVip", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "nextMileage", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "printContent", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "repairPersonContact", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "payItemTogether", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "payItemTogetherChinese", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "printOrgName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "orgContactNumber", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "maintainType", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "naInsurer", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "insurancepolicyNo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "balanceStatus", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "czkDetailInfo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "paymentTypeDetails", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "signaturePhotoUrl", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "czkDiscountFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "isCustomerLevelFavourable", + "description": "", + "type": "java.lang.Integer", + "required": false + }, + { + "name": "nextMileageRemind", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "claimInsuranceList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "serviceName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "workHour", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "price", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "subtotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "serviceMemo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "discountedSubtotal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "extraPrintVo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "singleFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "isMember", + "description": "", + "type": "java.lang.Integer", + "required": false + }, + { + "name": "discount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "customCode", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "partName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "unit", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "number", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "partBrand", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "standard", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "supplierCode", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "partMemo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "isBring", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "payWay", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "payAmount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "chinesePayAmount", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "extraName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "receivedAmount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "fromMaintainType", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "customerName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "fullCarNo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "employeeName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "customerCellPhone", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "settleAmountReal", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "serviceVipExpense", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "partVipExpense", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "czkExpenseFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "customerLevelFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "centerMemberFavourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "settleOweAmount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "title", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "serviceDetailVOList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "index", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cooperationServiceName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cooperationOrgName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "auditStatus", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cooperationCost", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "billNO", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "carNo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "settlePerson", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "contactMobile", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "gatheringList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "transactionDate", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "naServicePerson", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "relationServices", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "relationParts", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "paymentType", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "amount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "infoName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "labelName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "abbreviation", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "modifiedtime", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cars", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "endDate", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "memberCardNo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cardName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "billType", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "num", + "description": "", + "type": "java.lang.Integer", + "required": false + }, + { + "name": "favourable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "receivable", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "printOrg", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "printDate", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "signUrl", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "packageList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "cardType", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "checkoutStr", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "permanent", + "description": "", + "type": "java.lang.Integer", + "required": false + }, + { + "name": "cardAmount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "realAmount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "seq", + "description": "", + "type": "java.lang.Integer", + "required": false + }, + { + "name": "name", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "infiniteFlag", + "description": "", + "type": "java.lang.Integer", + "required": false + }, + { + "name": "gatheringTime", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "rowList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "column1", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column2", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column3", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column4", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column5", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column6", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column7", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column8", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column9", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column10", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column11", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column12", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "column13", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row1", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row2", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row3", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row4", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row5", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row6", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row7", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row8", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row9", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row10", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row11", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row12", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row13", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "row14", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "maintainBillNo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "oilCapacity", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "nextMaintainDate", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "customerMemo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "merchantAddress", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "merchantPhone", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "qrCode", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "icon", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "sign", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "warningLightItemList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "personalCheckInfoList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "computerCheckInfoList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "showWarningLightItem", + "description": "", + "type": "java.lang.Boolean", + "required": false + }, + { + "name": "showComputerCheckInfo", + "description": "", + "type": "java.lang.Boolean", + "required": false + }, + { + "name": "showPersonalCheckInfo", + "description": "", + "type": "java.lang.Boolean", + "required": false + }, + { + "name": "stuffDetailVOList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "numberSub", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "warningLightBrightItemUrls", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "itemComponent", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "childList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "itemName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "itemResults", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "optionNameS", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "optionNameE", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "optionNameU", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "errorCode", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "warningIconCode", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "workHourPrice", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "partStanardName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "settleReceivedAmoutChinese", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "settleOweAmoutChinese", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "empNameStr", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "unusedNumber", + "description": "", + "type": "java.lang.Integer", + "required": false + }, + { + "name": "receiptAmount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "stubPrintFlag", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "stubServiceList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "leftCount", + "description": "", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "spec", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "tradingOrgName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "tradingDate", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cardEndDate", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "tradingAmount", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "remark", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "orgOfPrinting", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "dateOfPrinting", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "tradingStoreName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "tradingTime", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "idSource", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "memberNo", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "noCar", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "paymentTypeAndAmount", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "sortNumber", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "wayName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "billStatus", + "description": "单据状态", + "type": "java.lang.String", + "required": false + }, + { + "name": "storageName", + "description": "仓库名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "sumNumber", + "description": "总数量", + "type": "java.lang.String", + "required": false + }, + { + "name": "saleReturnPartList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "fromMaintainNo", + "description": "源单号", + "type": "java.lang.String", + "required": false + }, + { + "name": "saleReturnServiceList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "saleReturnExtraList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "saleReturnWayList", + "description": "", + "type": "net.sf.jasperreports.engine.data.JRMapCollectionDataSource", + "required": false + }, + { + "name": "returnWayTotal", + "description": "退款方式小计", + "type": "java.math.BigDecimal", + "required": false + }, + { + "name": "serviceMobile", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "Field_1", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "partCustomCode", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cargoSpace", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "outStockEmployeeName", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "standa", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "firstSettlementTime", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "打印单后台", + "description": "http://print.f6yc.com/print-server/ui/index.html#/template/classification", + "type": "java.lang.String", + "required": false + }, + { + "name": "打印单模板样式", + "description": "https://xcz.yuque.com/ombipo/rpc7ms/fbd6ay?singleDoc#", + "type": "java.lang.String", + "required": false + }, + { + "name": "打印单参数表", + "description": "https://xcz.yuque.com/ombipo/rpc7ms/ro5fs1?singleDoc#", + "type": "java.lang.String", + "required": false + }, + { + "name": "简易开发教程", + "description": "https://alidocs.dingtalk.com/i/nodes/dQPGYqjpJYgZGbvbCdEKGDGZWakx1Z5N", + "type": "java.lang.String", + "required": false + }, + { + "name": "项目", + "description": "说明", + "type": "java.lang.String", + "required": false + }, + { + "name": "编辑工具", + "description": "TIBCO Jaspersoft Studio", + "type": "java.lang.String", + "required": false + }, + { + "name": "默认版本", + "description": "Jaspersoft 6.3.1 + JDK 1.6", + "type": "java.lang.String", + "required": false + }, + { + "name": "可选版本", + "description": "Jaspersoft 6.8 + JDK 1.8(用户可指定)", + "type": "java.lang.String", + "required": false + }, + { + "name": "WIN 下载", + "description": "钉钉附件《Jaspersoft Studio-6.3.1.final.rar》", + "type": "java.lang.String", + "required": false + }, + { + "name": "MAC 下载", + "description": "钉钉附件《TIBCOJaspersoftStudio-6.3.1.final-mac-x86_64.zip》", + "type": "java.lang.String", + "required": false + }, + { + "name": "工具类 JAR", + "description": "print-core-1.0.7.jar(金额转大写、日期转换)", + "type": "java.lang.String", + "required": false + }, + { + "name": "用途", + "description": "语法", + "type": "java.lang.String", + "required": false + }, + { + "name": "文本拼接参数", + "description": "`$P{参数}+\"文本\"`", + "type": "java.lang.String", + "required": false + }, + { + "name": "保留小数", + "description": "`$P{参数}.setScale(位数, BigDecimal.ROUND_DOWN)`", + "type": "java.lang.String", + "required": false + }, + { + "name": "字符串截取", + "description": "`$P{参数}.substring(起始,长度)`", + "type": "java.lang.String", + "required": false + }, + { + "name": "IF 判断", + "description": "`(条件) ? 值1 : 值2`", + "type": "java.lang.String", + "required": false + }, + { + "name": "相等判断", + "description": "`==` 或 `.equals(\"文本\")`", + "type": "java.lang.String", + "required": false + }, + { + "name": "运算", + "description": "语法", + "type": "java.lang.String", + "required": false + }, + { + "name": "加", + "description": "`$P{参数1}.add($P{参数2})`", + "type": "java.lang.String", + "required": false + }, + { + "name": "减", + "description": "`$P{参数1}.subtract($P{参数2})`", + "type": "java.lang.String", + "required": false + }, + { + "name": "乘", + "description": "`$P{参数1}.multiply($P{参数2})` 或 `$P{参数1}.multiply(new BigDecimal(1.13))`", + "type": "java.lang.String", + "required": false + }, + { + "name": "除", + "description": "`$P{参数1}.divide($P{参数2}, 2, BigDecimal.ROUND_HALF_UP)`", + "type": "java.lang.String", + "required": false + }, + { + "name": "类型", + "description": "模板名称", + "type": "模板备注", + "required": false + }, + { + "name": "简单调整", + "description": "基础表+特殊修改需求", + "type": "各修改点", + "required": false + }, + { + "name": "定制调整", + "description": "门店名称+定制", + "type": "各修改点", + "required": false + }, + { + "name": "打印单分类", + "description": "对应系统打印模块", + "type": "模板编码", + "required": false + }, + { + "name": "新结算单打印", + "description": "维保单", + "type": "newSettleFirst", + "required": false + }, + { + "name": "结算单-新", + "description": "除维保单的其他单据", + "type": "无", + "required": false + }, + { + "name": "附表-新", + "description": "新附表", + "type": "无", + "required": false + }, + { + "name": "销售单", + "description": "销售单", + "type": "xiaoshodanriqiban", + "required": false + }, + { + "name": "洗车单", + "description": "洗车单", + "type": "wash01", + "required": false + }, + { + "name": "报价单打印", + "description": "报价单", + "type": "quotationPrint", + "required": false + }, + { + "name": "新库存入库单打印", + "description": "入库单", + "type": "9001", + "required": false + }, + { + "name": "新库存出库单打印", + "description": "出库单", + "type": "9002", + "required": false + }, + { + "name": "接口类型", + "description": "地址", + "type": "java.lang.String", + "required": false + }, + { + "name": "maintain 接口", + "description": "`/print/dispatchPrint/genUrl`", + "type": "java.lang.String", + "required": false + }, + { + "name": "erp 接口", + "description": "`/print/getPrintPDFPath.do?templateId=&templateType=newSettlePrint&idSourceBill=`", + "type": "java.lang.String", + "required": false + }, + { + "name": "字段", + "description": "类型", + "type": "java.lang.String", + "required": false + }, + { + "name": "基础信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "mergePackageContent", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "engineNumber", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "transmissionNo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "金额信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "chineseAmount", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "托修方信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "承修方信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "二期新增", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "points", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "taxRateOutput", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "partShowName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "applyModel", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "fromBillNo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "amountAllChinese", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "key", + "description": "code", + "type": "java.lang.String", + "required": false + }, + { + "name": "MAN_HOUR_COST", + "description": "1", + "type": "java.lang.String", + "required": false + }, + { + "name": "MATERIAL_COST", + "description": "2", + "type": "java.lang.String", + "required": false + }, + { + "name": "EXTRA_COST", + "description": "3", + "type": "java.lang.String", + "required": false + }, + { + "name": "OTHER_COST", + "description": "4", + "type": "java.lang.String", + "required": false + }, + { + "name": "SERVICE_COST", + "description": "5", + "type": "java.lang.String", + "required": false + }, + { + "name": "module", + "description": "打印模块(PrintModuleEnum.code)", + "type": "java.lang.String", + "required": false + }, + { + "name": "employeePhone", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "printContentEntrust", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "sourceBillNo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "arrivalTime", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "carColor", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "engineCode", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "merchantTel", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "workHourPriceSubtotal", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "amountSubtotal", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "attachedServiceVoList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "attachedStuffVoList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "nameMember", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "companyTitle", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "insureDate", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "preferentialAmount", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "receiveAmount", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "commissionAmountTotal", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "companyRefundAmount", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "customerRefundAmount", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "insuranceCompanyName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "contacts", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "channelName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "startDate", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "renewal", + "description": "Integer", + "type": "java.lang.String", + "required": false + }, + { + "name": "tsInsuranceDetailList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "policyNo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "insuranceType", + "description": "Integer", + "type": "java.lang.String", + "required": false + }, + { + "name": "concessionary", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "commissionRate", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "commissionAmount", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "paid", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "preRefundBalance", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "advancesReceivedBalance", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "businessDate", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "relationCars", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "partDetailVoList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "serviceDetailVoList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "amountChinese", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "realAmountWithoutCardChinese", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "pkId", + "description": "BigInteger", + "type": "java.lang.String", + "required": false + }, + { + "name": "realSubtotal", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "brand", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "carCheckPackageName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "qrCodeToB", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "qrCodeToC", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "sortedPersonalCheckInfoList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "optionPersonalCheckInfoList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "normalPersonalCheckInfoList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "iconMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "iconResult", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "warningLightResult", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "场景", + "description": "入口", + "type": "底层接口", + "required": false + }, + { + "name": "库存出库单", + "description": "出入库单据-出库单", + "type": "PrintServiceImpl#getStockOutPrintUrl", + "required": false + }, + { + "name": "库存入库单", + "description": "出入库单据-入库单", + "type": "PrintServiceImpl#getStockInPrintUrl", + "required": false + }, + { + "name": "手工出入库", + "description": "手工出入库", + "type": "PrintService#getManualStorageStockInPrintUrl", + "required": false + }, + { + "name": "领料单", + "description": "领料详情", + "type": "PrintServiceImpl#getMaintainPrintUrl", + "required": false + }, + { + "name": "showSourceBillNo", + "description": "显示来源单号(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "inOutDate", + "description": "出库日期", + "type": "java.lang.String", + "required": false + }, + { + "name": "showInOutDate", + "description": "是否显示出库日期(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "objectName", + "description": "出入库对象", + "type": "java.lang.String", + "required": false + }, + { + "name": "objectNameGD", + "description": "出入库对象工单", + "type": "java.lang.String", + "required": false + }, + { + "name": "sumAmount", + "description": "总金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "nowDateTime", + "description": "打印当前时间(yyyy-MM-dd HH:mm)", + "type": "java.lang.String", + "required": false + }, + { + "name": "idOwnOrg", + "description": "门店ID", + "type": "java.lang.String", + "required": false + }, + { + "name": "showRemark", + "description": "是否显示备注(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "isGdType", + "description": "是否工单类型(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "saName", + "description": "服务顾问", + "type": "java.lang.String", + "required": false + }, + { + "name": "showCustomCode", + "description": "是否显示材料编码(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "showBusinessLabel", + "description": "是否显示业务分类(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "showApplyModel", + "description": "是否显示适用车型(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "showStorageName", + "description": "是否显示仓库(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "showDefSeat", + "description": "是否显示货位(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "showChineseAmount", + "description": "是否显示大写金额(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "showChineseSubtotal", + "description": "是否显示大写行合计(boolean)", + "type": "java.lang.String", + "required": false + }, + { + "name": "columnCount", + "description": "显示几列", + "type": "java.lang.String", + "required": false + }, + { + "name": "batchPrintConfig", + "description": "批次成本展示设置", + "type": "java.lang.String", + "required": false + }, + { + "name": "defSeat", + "description": "货位", + "type": "java.lang.String", + "required": false + }, + { + "name": "salesEmployeeNameList", + "description": "材料行销售人员(20250925新增)", + "type": "java.lang.String", + "required": false + }, + { + "name": "orderBatchList", + "description": "批次成本信息(List)", + "type": "java.lang.String", + "required": false + }, + { + "name": "noTaxSumAmount", + "description": "除税总金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "chineseNoTaxSumAmount", + "description": "除税总金额(大写)", + "type": "java.lang.String", + "required": false + }, + { + "name": "noTaxPrice", + "description": "除税单价(材料行)", + "type": "java.lang.String", + "required": false + }, + { + "name": "noTaxSubtotal", + "description": "除税金额(材料行)", + "type": "java.lang.String", + "required": false + }, + { + "name": "sumSubtotal", + "description": "入库总金额(工单退才有)", + "type": "java.lang.String", + "required": false + }, + { + "name": "chineseSubtotal", + "description": "大写入库总金额(工单退才有)", + "type": "java.lang.String", + "required": false + }, + { + "name": "showReturnIn", + "description": "显示退料入库一行(工单退才有)", + "type": "java.lang.String", + "required": false + }, + { + "name": "showSign", + "description": "仓管签字位置(工单退=2,其它=1)", + "type": "java.lang.String", + "required": false + }, + { + "name": "stockInType", + "description": "退料入库(工单退才有)", + "type": "java.lang.String", + "required": false + }, + { + "name": "printTimes", + "description": "打印次数", + "type": "java.lang.String", + "required": false + }, + { + "name": "printFlag", + "description": "均价门店false/批次门店true", + "type": "java.lang.String", + "required": false + }, + { + "name": "showPrice", + "description": "参配-打印调拨价格及金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "naOrgIn", + "description": "调入门店名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "naOrgOut", + "description": "调出门店名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "statusName", + "description": "调拨单状态", + "type": "java.lang.String", + "required": false + }, + { + "name": "allotDetailVoList", + "description": "调拨单明细行", + "type": "java.lang.String", + "required": false + }, + { + "name": "numCus", + "description": "个数(均价/批次逻辑不同)", + "type": "java.lang.String", + "required": false + }, + { + "name": "orderNo", + "description": "批次号", + "type": "java.lang.String", + "required": false + }, + { + "name": "productDate", + "description": "批次生成日期", + "type": "java.lang.String", + "required": false + }, + { + "name": "labelList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "sellPrice", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "date", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "barCode", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "supplierName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "partInfoDetailMapList", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "orderBatchList--List>", + "description": "材料行成本相关", + "type": "java.lang.String", + "required": false + }, + { + "name": "count", + "description": "批次出库几个\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 均价模式下,显示 \"\"**\\-- 通用模版追加一行合计,追加行,显示总数**", + "type": "java.lang.String", + "required": false + }, + { + "name": "priceNoTax", + "description": "批次单位除税成本\\-- batchPrintConfig = 1 场景下,显示 \"\"\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价单位成本**\\-- 通用模版追加一行合计,追加行,显示 \"\"", + "type": "java.lang.String", + "required": false + }, + { + "name": "totalPrice", + "description": "批次总成本\\-- batchPrintConfig = 1 场景下,显示合计总成本\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价总成本**\\-- 通用模版追加一行合计,追加行,显示总成本", + "type": "java.lang.String", + "required": false + }, + { + "name": "totalPriceNoTax", + "description": "批次除税总成本\\-- batchPrintConfig = 1 场景下,显示合计总成本\\-- 脱敏场景显示 **\\*\\*\\*\\*****\\-- 均价模式下,显示均价除税总成本**\\-- 通用模版追加一行合计,追加行,显示总成本", + "type": "java.lang.String", + "required": false + }, + { + "name": "taxRate", + "description": "税率", + "type": "java.lang.String", + "required": false + }, + { + "name": "defSeatList", + "description": "货位", + "type": "java.lang.String", + "required": false + }, + { + "name": "L paymentType", + "description": "支付方式", + "type": "java.lang.String", + "required": false + }, + { + "name": "L amount", + "description": "金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "L infoId", + "description": "项目id", + "type": "java.lang.String", + "required": false + }, + { + "name": "L infoName", + "description": "项目名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "L labelName", + "description": "业务分类", + "type": "java.lang.String", + "required": false + }, + { + "name": "L idCar", + "description": "车辆信息id", + "type": "java.lang.String", + "required": false + }, + { + "name": "L carNo", + "description": "车牌号", + "type": "java.lang.String", + "required": false + }, + { + "name": "L vin", + "description": "vin码", + "type": "java.lang.String", + "required": false + }, + { + "name": "------基础信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "spreadRate", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "carCategoryName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "printMaintainGuaZi", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "vipExpenseFavourable", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "czkSettleFavourable", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "accountAmount", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "totalOweAmount", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "customerLevelName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "customerDetailAddress", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "receiptMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "customerSourceName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "carSourceName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "-----托修方信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "carMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "carFuelTypeNameOriginal", + "description": "carFuelTypeNameOriginal", + "type": "java.lang.String", + "required": false + }, + { + "name": "contractNumber", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "certificateNumber", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "------承修方信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "businessLicenseCode", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "------项目信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "#### orderNumber", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintext taxRateOutput ```", + "description": "BigDecimal", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintext singleFavourable ```", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintextfavourableVoList ```", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintextdiscountType ```", + "description": "Integer", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintextdiscountTypeName ```", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintextsourceId ```", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "qualityCheckEmployeeName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "qualityCheckEmployeeCode", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "cooperationMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "-------材料信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "cost", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintextcargoSpace ```", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "defSeats", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintextamount ```", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "-------自带材料(新版维修/贴膜)信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "bringPartList", + "description": "array", + "type": "java.lang.String", + "required": false + }, + { + "name": "photoList", + "description": "List", + "type": "java.lang.String", + "required": false + }, + { + "name": "managementCost", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "------附加费用信息", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "-----维修结算费用集合(江苏结算单)", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "mainCostList", + "description": "array", + "type": "java.lang.String", + "required": false + }, + { + "name": "costName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "----_其他结算费用集合(江苏结算单)_", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "otherCostList", + "description": "array", + "type": "java.lang.String", + "required": false + }, + { + "name": "allOtherCost", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "favourableExtraCost", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "receiptAmountChinese", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "payItemTogetherExcludeAccountAmountChinese", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "settleOweAmout", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "-----结算付款方式及优惠保存信息", + "description": "array", + "type": "java.lang.String", + "required": false + }, + { + "name": "settlementPayItemList", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "accountAgreementName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "-----付款方式信息", + "description": "array", + "type": "java.lang.String", + "required": false + }, + { + "name": "-----附加项目(江苏结算单)", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "commissionCustomName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "commissionCost", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "commissionMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "diagnosisCustomName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "diagnosisCost", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "diagnosisItemName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "diagnosisMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "checkCustomName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "checkCost", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "checkMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "processCustomName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "processCost", + "description": "Double", + "type": "java.lang.String", + "required": false + }, + { + "name": "processMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "processItemName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "managementCustomName", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "managementMemo", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "-----二期新增字段", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "nextMaintainDateRemind", + "description": "Long", + "type": "java.lang.String", + "required": false + }, + { + "name": "czkList", + "description": "array", + "type": "java.lang.String", + "required": false + }, + { + "name": "```plaintext cardOwner ```", + "description": "String", + "type": "java.lang.String", + "required": false + }, + { + "name": "cardList", + "description": "array", + "type": "java.lang.String", + "required": false + }, + { + "name": "combineServiceAndPartList", + "description": "array", + "type": "java.lang.String", + "required": false + }, + { + "name": "servicePrintVo", + "description": "参见serviceList", + "type": "java.lang.String", + "required": false + }, + { + "name": "partPrintVo", + "description": "参见partList", + "type": "java.lang.String", + "required": false + }, + { + "name": "常见打印单分类", + "description": "对应系统上的打印模块", + "type": "模板编码", + "required": false + }, + { + "name": "注:采购单和采购退货单走打印平台定制,先向赵亚妮提供门店编码、门店名称,开通后再上传配置门店生效", + "description": "", + "type": "java.lang.String", + "required": false + }, + { + "name": "idQuotation", + "description": "报价单id", + "type": "BigInteger", + "required": true + }, + { + "name": "idPart", + "description": "材料id", + "type": "BigInteger", + "required": false + }, + { + "name": "idMdmPart", + "description": "云材料ID", + "type": "String", + "required": false + }, + { + "name": "labelId", + "description": "业务分类id", + "type": "BigInteger", + "required": false + }, + { + "name": "idEmployee", + "description": "服务员工id", + "type": "String", + "required": false + }, + { + "name": "stockNumber", + "description": "门店库存数量", + "type": "BigDecimal", + "required": false + }, + { + "name": "groupId", + "description": "公司id", + "type": "BigInteger", + "required": true + }, + { + "name": "brandId", + "description": "品牌id", + "type": "String", + "required": false + }, + { + "name": "registerDate", + "description": "车辆注册日期", + "type": "java.lang.String", + "required": false + }, + { + "name": "cardDate", + "description": "车辆发证日期", + "type": "java.lang.String", + "required": false + }, + { + "name": "carNatureOfUseName", + "description": "车辆使用性质", + "type": "java.lang.String", + "required": false + }, + { + "name": "carFuelTypeName", + "description": "车辆燃料(能源)类型", + "type": "java.lang.String", + "required": false + }, + { + "name": "carOwnerName", + "description": "车辆所有人姓名", + "type": "java.lang.String", + "required": false + }, + { + "name": "completeDate", + "description": "完工日期", + "type": "java.lang.String", + "required": false + }, + { + "name": "firstGatheringTime", + "description": "初次收款时间", + "type": "java.lang.String", + "required": false + }, + { + "name": "estimatedDeliveryTime", + "description": "预计交车时间", + "type": "java.lang.String", + "required": false + }, + { + "name": "printContentJs", + "description": "免责条款江苏", + "type": "java.lang.String", + "required": false + }, + { + "name": "orgMemo", + "description": "门店备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "orgContacts", + "description": "联系人(维修厂)", + "type": "java.lang.String", + "required": false + }, + { + "name": "disCountAllBak", + "description": "项目优惠+材料优惠+收银优惠,等同于disCountAll", + "type": "java.lang.String", + "required": false + }, + { + "name": "remainAmount", + "description": "结算金额tsf 附表:应收-项目优惠-材料优惠", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ sortNumber", + "description": "序号", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ orderNumber", + "description": "序号(全部)", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ name", + "description": "名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ serviceName", + "description": "项目名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ labelName", + "description": "业务分类名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ price", + "description": "工时单价", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ workHour", + "description": "工时", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ subtotal", + "description": "金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ singleFavourable", + "description": "优惠金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ discountedSubtotal", + "description": "折后金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ serviceMemo", + "description": "附加信息备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ discount", + "description": "折扣", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ empNameStr", + "description": "服务项目明细对应修理工名称组装字符串", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ infiniteFlag", + "description": "是否无限,0:否,1:是", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ customCode", + "description": "自定义编码", + "type": "java.lang.String", + "required": false + }, + { + "name": "totalWorkHourVip", + "description": "VIP项目工时合计(附表为0)", + "type": "java.lang.String", + "required": false + }, + { + "name": "serviceDiscountFavourable", + "description": "项目优惠", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ partName", + "description": "材料名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ partShowName", + "description": "材料名称(全)", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ partBrand", + "description": "配件品牌", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ standard", + "description": "配件名称规格型号品牌", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ spec", + "description": "规格型号", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ supplierCode", + "description": "供应商编码", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ unit", + "description": "单位", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ number", + "description": "数量", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ partMemo", + "description": "备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ employeeName", + "description": "员工名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ outStockEmployeeName", + "description": "领料人", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ idPart", + "description": "配件材料pk", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ idInfo", + "description": "本地材料id(长码)", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ applyModel", + "description": "适用车型", + "type": "java.lang.String", + "required": false + }, + { + "name": "stuffNum", + "description": "材料数目合计", + "type": "java.lang.String", + "required": false + }, + { + "name": "totalStuffNumVip", + "description": "Vip材料数量合计(附表为0)", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ extraName", + "description": "附加费名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ memo", + "description": "备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ commissionCustomName", + "description": "代办费自定义名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ commissionCost", + "description": "代办费金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ commissionMemo", + "description": "代办费备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ diagnosisCustomName", + "description": "诊断费自定义名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ diagnosisCost", + "description": "诊断费金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ diagnosisItemName", + "description": "诊断详细名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ diagnosisMemo", + "description": "诊断费备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ checkCustomName", + "description": "检查费自定义名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ checkItemName", + "description": "诊断详细名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ checkCost", + "description": "检查费金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ checkMemo", + "description": "检查费备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ processCustomName", + "description": "加工费自定义名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ processCost", + "description": "加工费金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ processMemo", + "description": "加工费备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ processItemName", + "description": "加工详细名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ managementCustomName", + "description": "管理费自定义名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ managementCost", + "description": "管理费金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ managementMemo", + "description": "管理费备注", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ fuelName", + "description": "加油费", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ fuelAmount", + "description": "加油费金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ trailName", + "description": "拖车费", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ trailAmount", + "description": "拖车费金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ payWay", + "description": "付款方式", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ payAmount", + "description": "付款金额", + "type": "java.lang.String", + "required": false + }, + { + "name": "└─ chinesePayAmount", + "description": "付款金额中文大写", + "type": "java.lang.String", + "required": false + }, + { + "name": "settleReceivedAmout", + "description": "结算单中用的实付金额(实收)", + "type": "java.lang.String", + "required": false + }, + { + "name": "realPayAmountChinese", + "description": "客户实付大写(应收-所有优惠)", + "type": "java.lang.String", + "required": false + }, + { + "name": "insuranceCompany", + "description": "保险公司名称", + "type": "java.lang.String", + "required": false + }, + { + "name": "insuranceNo", + "description": "商业险单号", + "type": "java.lang.String", + "required": false + }, + { + "name": "insuranceNoTCI", + "description": "交强险单号", + "type": "java.lang.String", + "required": false + }, + { + "name": "insuranceExpiryDate", + "description": "商业险到期日", + "type": "java.lang.String", + "required": false + }, + { + "name": "insuranceExpiryDateTCI", + "description": "交强险到期日", + "type": "java.lang.String", + "required": false + }, + { + "name": "printEmployeeName", + "description": "打印人姓名", + "type": "java.lang.String", + "required": false + }, + { + "name": "warningLightMemo", + "description": "警示灯备注", + "type": "String", + "required": false + }, + { + "name": "favourableTotalList", + "description": "优惠明细小计", + "type": "List", + "required": false + }, + { + "name": "carNoWhole ", + "description": "车牌号", + "type": "String", + "required": true + }, + { + "name": "vin", + "description": "车辆VIN码", + "type": "String", + "required": false + }, + { + "name": "carBrandName", + "description": "品牌名称", + "type": "String", + "required": false + }, + { + "name": "carSeriesName", + "description": "车系名称", + "type": "String", + "required": false + }, + { + "name": "carModelShort", + "description": "车型简称", + "type": "String", + "required": false + }, + { + "name": "carModel", + "description": "车型", + "type": "String", + "required": false + }, + { + "name": "carColor", + "description": "车身颜色", + "type": "String", + "required": false + }, + { + "name": "billDate", + "description": "进厂日期", + "type": "String", + "required": true + }, + { + "name": "estimatedDeliveryTime", + "description": "预计交车时间", + "type": "String", + "required": true + }, + { + "name": "deliveryTime", + "description": "交车时间(出厂时间)", + "type": "String", + "required": true + }, + { + "name": "mileage", + "description": "进厂里程", + "type": "Double", + "required": true + }, + { + "name": "extendedModuleList", + "description": "扩展模块列表", + "type": "List", + "required": false + }, + { + "name": "memo", + "description": "车主备注", + "type": "String", + "required": false + }, + { + "name": "signaturePhotoUrl", + "description": "签名图片", + "type": "String", + "required": false + }, + { + "name": "orgName", + "description": "维修厂名称", + "type": "String", + "required": true + }, + { + "name": "orgContacts", + "description": "维修厂联系人", + "type": "String", + "required": true + }, + { + "name": "orgDetailAddress", + "description": "维修厂地址", + "type": "String", + "required": true + }, + { + "name": "orgContactMobile", + "description": "联系电话(维修厂)", + "type": "String", + "required": false + }, + { + "name": "storeLogo", + "description": "logo", + "type": "String", + "required": false + }, + { + "name": "printOrgName", + "description": "打印抬头", + "type": "String", + "required": false + }, + { + "name": "printContent", + "description": "免责条款", + "type": "String", + "required": true + }, + { + "name": "printCount", + "description": "打印次数", + "type": "String", + "required": true + }, + { + "name": "printTime", + "description": "打印时间", + "type": "String", + "required": true + }, + { + "name": "idService", + "description": "服务项目id", + "type": "BigInteger", + "required": true + }, + { + "name": "idInfo", + "description": "本地项目id", + "type": "String", + "required": true + }, + { + "name": "favourableVoList", + "description": "优惠明细", + "type": "List", + "required": false + }, + { + "name": "discountedSubtotal", + "description": "折后金额", + "type": "Double", + "required": true + }, + { + "name": "partMemo", + "description": "备注", + "type": "String", + "required": false + }, + { + "name": "isBring", + "description": "是否自带", + "type": "String", + "required": true + }, + { + "name": "empNameStr", + "description": "明细对应修理工名称组装字符串", + "type": "String", + "required": false + }, + { + "name": "outStockEmployeeName", + "description": "领料人", + "type": "String", + "required": false + }, + { + "name": "labelName", + "description": "业务分类名称", + "type": "String", + "required": true + }, + { + "name": "idPart", + "description": "配件材料pk", + "type": "BigInteger", + "required": true + }, + { + "name": "idInfo", + "description": "本地材料id", + "type": "String", + "required": true + }, + { + "name": "discountType", + "description": "优惠类型", + "type": "Integer", + "required": true + }, + { + "name": "discountTypeName", + "description": "优惠类型名称", + "type": "Double", + "required": true + }, + { + "name": "明细合计行", + "description": "", + "type": "java.lang.String", + "required": false + } + ], + "templates": [ + { + "name": "jiesuandan", + "file": "F6标准结算单(壹).jrxml" + }, + { + "name": "jiesuandan", + "file": "F6标准结算单(壹)维保单.jrxml" + }, + { + "name": "jiesuandan", + "file": "F6标准结算单(壹)附表.jrxml" + }, + { + "name": "jiesuandan", + "file": "F6标准结算单-维保单.jrxml" + }, + { + "name": "Blank_A4", + "file": "协作单.jrxml" + }, + { + "name": "dingjin", + "file": "定金收款单.jrxml" + }, + { + "name": "Blank_A4", + "file": "定金收款小票.jrxml" + }, + { + "name": "tkd", + "file": "开卡单.jrxml" + }, + { + "name": "jiesuandan", + "file": "收款日报表打印.jrxml" + }, + { + "name": "checkedQuotation", + "file": "检测估算单.jrxml" + }, + { + "name": "jiesuandan", + "file": "洗车单.jrxml" + }, + { + "name": "carWash", + "file": "洗车单小票.jrxml" + }, + { + "name": "Blank_A4", + "file": "消费单.jrxml" + }, + { + "name": "Blank_A4", + "file": "退卡单.jrxml" + }, + { + "name": "stockInPrint", + "file": "退货单.jrxml" + }, + { + "name": "jiesuandan", + "file": "销售单.jrxml" + }, + { + "name": "Blank_A4", + "file": "销售单小票.jrxml" + } + ], + "file_count": 33, + "chunk_count": 433, + "parse_status": "ready" +} \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6打印单说明知识库.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6打印单说明知识库.md new file mode 100644 index 0000000..f5e7968 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6打印单说明知识库.md @@ -0,0 +1,1059 @@ +# F6 打印单说明知识库 + +> 来源:`C:\Users\hp_z66\Desktop\Jaspersoft Studio\workbuddy-jaspersoft` 目录下 15 个 md 文件整合 +> 整合日期:2026-04-22 + +--- + +## 目录 + +1. [打印单定制介绍](#1-打印单定制介绍) +2. [工具与环境](#2-工具与环境) +3. [模板修改流程](#3-模板修改流程) +4. [常见编辑操作](#4-常见编辑操作) +5. [语法介绍](#5-语法介绍) +6. [高级语法与工具类](#6-高级语法与工具类) +7. [保存与输出](#7-保存与输出) +8. [后台配置与命名规范](#8-后台配置与命名规范) +9. [常见打印分类及通用模板](#9-常见打印分类及通用模板) +10. [各打印单接口参数文档](#10-各打印单接口参数文档) + - 10.1 工单结算单 + - 10.2 新版附表 + - 10.3 结算单(指定内容) + - 10.4 委托单 + - 10.5 协作单 + - 10.6 增项单 + - 10.7 保险单 + - 10.8 定金单 + - 10.9 报价单 + - 10.10 检测单 + - 10.11 出/入库单据 + - 10.12 调拨单 + - 10.13 材料标签 + - 10.14 采购单/采购退货单 + +--- + +## 1. 打印单定制介绍 + +F6 系统的打印单基于 **TIBCO Jaspersoft Studio** 模板引擎,使用 `.jrxml`(源码)和 `.jasper`(编译后)文件。打印数据由后端接口传入模板参数,模板通过 `$P{}` / `$F{}` 表达式渲染。 + +### 常用链接 + +| 名称 | 地址 | +|------|------| +| 打印单后台 | http://print.f6yc.com/print-server/ui/index.html#/template/classification | +| 打印单模板样式 | https://xcz.yuque.com/ombipo/rpc7ms/fbd6ay?singleDoc# | +| 打印单参数表 | https://xcz.yuque.com/ombipo/rpc7ms/ro5fs1?singleDoc# | +| 简易开发教程 | https://alidocs.dingtalk.com/i/nodes/dQPGYqjpJYgZGbvbCdEKGDGZWakx1Z5N | + +--- + +## 2. 工具与环境 + +| 项目 | 说明 | +|------|------| +| 编辑工具 | TIBCO Jaspersoft Studio | +| **默认版本** | Jaspersoft 6.3.1 + JDK 1.6 | +| **可选版本** | Jaspersoft 6.8 + JDK 1.8(用户可指定) | +| WIN 下载 | 钉钉附件《Jaspersoft Studio-6.3.1.final.rar》 | +| MAC 下载 | 钉钉附件《TIBCOJaspersoftStudio-6.3.1.final-mac-x86_64.zip》 | +| 工具类 JAR | print-core-1.0.7.jar(金额转大写、日期转换) | + +> **版本说明**:默认使用 Jaspersoft 6.3.1 + JDK 1.6。如需使用 JDK 1.8 语法(如 stream API 从 List 中取特定值),需指定使用 Jaspersoft 6.8 + JDK 1.8 版本。 + +--- + +## 3. 模板修改流程 + +1. **下载模板**:在打印单后台通过模板名称查询并下载 `.jrxml` 文件 +2. **打开编辑**:Jaspersoft Studio → File → Open File → 选择模板 +3. **编辑模板**:增减组件、调整参数、修改样式 +4. **格式预览**:工具内只能预览样式,参数判断需上传到门店后实际打印预览 +5. **保存输出**:保存 `.jrxml` → Compile Report 生成 `.jasper` → Export 到桌面 +6. **后台配置**:上传模板、配置门店生效 + +--- + +## 4. 常见编辑操作 + +### 4.1 新增静态文本 + +1. 从 Palette 拖拽 Static Text 组件到模板 +2. 双击编辑显示文本 +3. 调整组件大小和位置参数 + +### 4.2 新增动态字段(如展示工单号) + +1. 在参数表中搜索参数名称和类型(如 `billNo`,类型 `java.lang.String`) +2. 拖拽 Text Field 组件到模板 +3. 双击写入公式:`$P{参数名称}` +4. 若提示 "The current expression is not valid": + - 说明参数未预设,需手动创建 + - Outline → Parameters(右键)→ Create Parameter + - 设置 Name(参数名)和 Class(数字:`java.math.BigDecimal`,文本:`java.lang.String`) + +### 4.3 列表中增减字段(如项目列表、材料列表) + +1. 确认参数所属列表(如 `partName` 属于 `partList`) +2. 双击列表进入编辑页面 +3. 列表内参数固定写法:`$F{参数名称}`(注意不是 `$P{}`) +4. 列表内只能使用所属列表下的参数,不可跨列表引用 +5. 未预设参数需在列表编辑页面内新增 Field + +### 4.4 新增边框和样式 + +- 选择组件 → Properties → Borders 编辑 + +--- + +## 5. 语法介绍 + +### 5.1 基础语法 + +| 用途 | 语法 | 示例 | +|------|------|------| +| 文本拼接参数 | `$P{参数}+"文本"` | `$P{printOrgName}+"结算单"` | +| 保留小数 | `$P{参数}.setScale(位数, BigDecimal.ROUND_DOWN)` | `$P{stuffSubtotalAll}.setScale(2, BigDecimal.ROUND_DOWN)` | +| 字符串截取 | `$P{参数}.substring(起始,长度)` | `$P{billDate}.substring(0,10)` | +| IF 判断 | `(条件) ? 值1 : 值2` | `($P{printOrgName}==null?$P{orgName}:$P{printOrgName})+"结算单"` | +| 相等判断 | `==` 或 `.equals("文本")` | `$P{balanceStatus}.equals("7100")` | + +### 5.2 运算语法 + +| 运算 | 语法 | +|------|------| +| 加 | `$P{参数1}.add($P{参数2})` | +| 减 | `$P{参数1}.subtract($P{参数2})` | +| 乘 | `$P{参数1}.multiply($P{参数2})` 或 `$P{参数1}.multiply(new BigDecimal(1.13))` | +| 除 | `$P{参数1}.divide($P{参数2}, 2, BigDecimal.ROUND_HALF_UP)` | + +--- + +## 6. 高级语法与工具类 + +### 6.1 JAR 包导入(金额转大写等) + +1. 项目右键 → Properties → Java Build Path → Add External JARs → 选择 `print-core-1.0.7.jar` +2. 启用成功后按语法调用 + +### 6.2 数字金额转中文大写 + +``` +com.f6car.printserver.core.CharacterUtil.chinese($P{amount}==null?BigDecimal.ZERO:$P{amount}) +``` + +### 6.3 日期时间戳转日期 + +参数类型选 `java.lang.Long`: + +``` +$P{nextMaintainDateRemind} == null ? "" : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date($P{nextMaintainDateRemind})) +``` + +### 6.4 从 List 中取特定值写入外层表格(JDK 1.8 语法) + +从支付方式列表 `payItemList` 中找到支付方式等于"记账"的第一个支付金额: + +```java +$P{payItemList}.getData().stream() + .filter(map -> "记账".equals(map.get("payWay"))) + .map(map -> { + Object amt = map.get("payAmount"); + return amt == null ? BigDecimal.ZERO : new BigDecimal(amt.toString()); + }) + .findFirst() + .orElse(BigDecimal.ZERO) +``` + +--- + +## 7. 保存与输出 + +1. **保存** `.jrxml` 源文件 +2. 右键 `.jrxml` → **Compile Report** → 生成 `.jasper` 编译文件 +3. 右键 `.jasper` → **Export Files to...** → 另存到桌面 +4. 上传 `.jasper` 到打印单后台 + +--- + +## 8. 后台配置与命名规范 + +### 8.1 注意事项 + +- **不要随意删除模板**,删除不可恢复 +- **结算单模板名称必须包含"结算单"三个字**,否则收款后无法显示 +- **洗车单定制模板名称必须包含"洗车单"三个字** + +### 8.2 命名规范 + +| 类型 | 模板名称 | 模板编码 | 模板备注 | +|------|----------|----------|----------| +| 简单调整 | 基础表+特殊修改需求 | 修改人姓名首字母+模板分类+日期 | 各修改点 | +| 定制调整 | 门店名称+定制 | 修改人姓名首字母+模板分类+日期 | 各修改点 | + +--- + +## 9. 常见打印分类及通用模板 + +| 打印单分类 | 对应系统打印模块 | 通用模板名称 | 模板编码 | +|------------|------------------|--------------|----------| +| 新结算单打印 | 维保单 | F6标准结算单(壹) | newSettleFirst | +| 结算单-新 | 除维保单的其他单据 | 无 | 无 | +| 附表-新 | 新附表 | 无 | 无 | +| 销售单 | 销售单 | 销售单(日期版) | xiaoshodanriqiban | +| 洗车单 | 洗车单 | 洗车单 | wash01 | +| 报价单打印 | 报价单 | 报价单打印 | quotationPrint | +| 新库存入库单打印 | 入库单 | 新库存入库单打印 | 9001 | +| 新库存出库单打印 | 出库单 | 新库存出库单打印 | 9002 | + +> **注意**:采购单和采购退货单走打印平台定制,需先向赵亚妮提供门店编码、门店名称开通后再上传配置 + +--- + +## 10. 各打印单接口参数文档 + +### 10.1 工单结算单 + +**打印平台模版分类**:新结算单打印 / 结算单-新 + +#### 接口信息 + +| 接口类型 | 地址 | 方法 | +|----------|------|------| +| maintain 接口 | `/print/dispatchPrint/genUrl` | POST | +| erp 接口 | `/print/getPrintPDFPath.do?templateId=&templateType=newSettlePrint&idSourceBill=` | GET | + +**maintain 入参**:`{ "pkId": "工单ID", "rowCode": "costSettlePrint", "rowId": "12" }` + +#### 主单参数 + +| 字段 | 类型 | 说明 | +|------|------|------| +| **基础信息** | | | +| billNo | String | 工单号 | +| maintainType | String | 工单类型 | +| balanceStatus | String | 结算状态:"7000"未结算 / "7100"已结算 / "7200"部分结算 | +| creatorName | String | 创建人名称 | +| naEmployee | String | 服务顾问 | +| creationtime | String | 创建时间 | +| memo | String | 工单备注 | +| printCount | String | 打印次数 | +| printTime | String | 打印时间 | +| deliveryTime | String | 交车时间 | +| mergePackageContent | String | 套餐合并标识 | +| printContent | String | 免责条款 | +| engineNumber | String | 发动机号 | +| transmissionNo | String | 变速箱号 | +| **金额信息** | | | +| amountAll | Double | 应收总计 | +| disCountAll | Double | 总优惠合计 | +| oweAmount | Double | 未收金额 | +| receiptAmount | Double | 实收金额 | +| chineseAmount | String | 实收金额(大写) | +| vipExpense | Double | 会员卡消费金额 | +| czkExpense | Double | 储值卡消费金额 | +| serviceSubtotalAll | Double | 工时费小计 | +| stuffSubtotalAll | Double | 材料费小计 | +| serviceDisCountSubTotal | Double | 项目折后金额合计 | +| stuffDisCountTotal | Double | 材料折后金额合计 | +| partFavourableTotal | Double | 材料优惠金额合计 | +| serviceFavourableTotal | Double | 项目优惠金额合计 | +| extraCostTotal | Double | 附加费小计 | +| **托修方信息** | | | +| naCustomer | String | 单位名称/托修方 | +| repairPerson | String | 送修人 | +| carNoWhole | String | 车牌号整体 | +| carBrandName | String | 品牌名称 | +| carSeriesName | String | 车系名称 | +| businessTypeName | String | 维修类别 | +| vin | String | 车辆VIN码 | +| billDate | String | 进厂日期 | +| mileage | BigDecimal | 出厂里程 | +| cellPhone | String | 联系电话 | +| **承修方信息** | | | +| orgName | String | 单位名称 | +| abbreviation | String | 门店简称 | +| orgContactNumber | String | 联系电话 | +| orgDetailAddress | String | 联系地址 | +| orgContactMobile | String | 联系电话 | +| bankAccount | String | 开户银行 | +| accountNumber | String | 账号 | +| **二期新增** | | | +| oilCapacity | String | 油量 | +| nextMileage | Double | 下次保养里程 | +| nextMaintainDate | String | 下次保养日期 | +| memberCardNo | String | 会员号 | +| points | String | 积分 | + +#### serviceList(项目列表) + +| 字段 | 类型 | 说明 | +|------|------|------| +| sortNumber | String | 序号 | +| customCode | String | 项目编码 | +| serviceName | String | 项目名称 | +| labelName | String | 业务分类名称 | +| price | Double | 工时单价 | +| workHour | Double | 工时 | +| subtotal | Double | 金额 | +| discount | Double | 折扣 | +| discountedSubtotal | Double | 折后金额 | +| singleFavourable | Double | 优惠金额 | +| taxRateOutput | BigDecimal | 销项税率 | +| isMember | Integer | 是否会员卡项目 | +| empNameStr | String | 修理工 | + +#### partList(材料列表) + +| 字段 | 类型 | 说明 | +|------|------|------| +| sortNumber | String | 序号 | +| customCode | String | 材料编码 | +| partName | String | 材料名称 | +| partBrand | String | 配件品牌 | +| spec | String | 规格型号 | +| partShowName | String | 配件名称规格型号品牌 | +| supplierCode | String | 供应商编码(零件号) | +| unit | String | 单位 | +| number | Double | 数量 | +| price | Double | 价格 | +| subtotal | Double | 金额 | +| discount | Double | 折扣 | +| discountedSubtotal | Double | 折后金额 | +| singleFavourable | Double | 优惠金额 | +| isBring | Integer | 是否自带(1自带) | +| taxRateOutput | BigDecimal | 销项税率 | +| cargoSpace | String | 货位 | +| applyModel | String | 适用车型 | +| employeeName | String | 员工名称 | +| outStockEmployeeName | String | 领料人 | + +#### payItemList(付款方式) + +| 字段 | 类型 | 说明 | +|------|------|------| +| payWay | String | 付款方式 | +| payAmount | Double | 付款金额 | +| chinesePayAmount | String | 大写付款方式 | + +#### 常用案例 + +**结算前待付/结算后实付(根据 balanceStatus 判断)**: + +``` +$P{balanceStatus}.equals("7100") ? 实付逻辑 : 待付逻辑 +``` + +**对应大写**: +``` +$P{balanceStatus}.equals("7100") ? $P{payItemTogetherChinese} : $P{settleOweAmoutChinese} +``` + +--- + +### 10.2 新版附表 + +**打印平台模版分类**:附表-新 + +#### 重要备注 + +1. **新版附表没有 `billStatus`、`balanceStatus` 字段**,切勿使用做判断。用 `payItemList` 判空替代: + - 收银金额:`$P{payItemList}.getRecordCount()==0?$P{receivedAmount}:$P{receivedAmount}.setScale(2,BigDecimal.ROUND_HALF_EVEN).toString()+"("+$P{paymentTypeDetails}+")"` + - 合计金额:`$P{payItemList}.getRecordCount()==0?($P{settleOweAmout}).setScale(2,BigDecimal.ROUND_HALF_EVEN):($P{settleReceivedAmout}).setScale(2,BigDecimal.ROUND_HALF_EVEN)` + +2. **新版附表没有 `maintainType` 字段**,用 `fromMaintainType` 替代判断。如判断理赔:`fromMaintainType.equals('LPD')` + +#### 主单参数 + +| 字段 | 类型 | 说明 | +|------|------|------| +| billNo | String | 附表单号 | +| fromBillNo | String | 附表源工单号 | +| fromMaintainType | String | 来源单据类型 | +| billDate | String | 进厂日期 | +| naEmployee | String | 服务顾问 | +| businessTypeName | String | 业务类型 | +| naCustomer | String | 客户姓名 | +| cellPhone | String | 联系电话 | +| carNoWhole | String | 车牌号 | +| vin | String | 车辆VIN码 | +| carModel | String | 品牌车型全称 | +| carModelShort | String | 车型简称 | +| mileage | Double | 出厂里程 | +| amountAll | Double | 应收总计 | +| amountAllChinese | String | 应收总计中文大写 | +| disCountAll | Double | 总优惠合计 | +| amountReal | Double | 实收金额 | +| oweAmount | Double | 未收金额 | +| receiptAmount | Double | 收据金额 | +| serviceSubtotalAll | Double | 工时费小计 | +| stuffSubtotalAll | Double | 材料费小计 | +| extraCostTotal | Double | 附加费小计 | +| payItemList | List | 付款方式集合 | +| serviceList | List | 项目集合 | +| partList | List | 材料集合 | +| extraChargeList | List | 附加费用集合 | +| extraPrintVo | Object | 附加项目 | +| printContent | String | 免责条款 | +| orgName | String | 门店名称 | +| printOrgName | String | 打印抬头 | + +--- + +### 10.3 结算单(指定内容) + +**打印平台模版分类**:结算单-新 + +#### 接口信息 + +- **接口**:`/blazer/maintenance/print/file/dispatchCondition` +- **方法**:POST +- **支持场景**:维保单/洗车单/维修单/贴膜单/理赔单/零售单,支持指定项目/材料/附加费打印 + +#### 入参结构 + +```json +{ + "rowId": "10329", + "rowCode": "partialSettlementStatement", + "pkId": "工单ID", + "serviceList": [{ "pkId": 项目ID, "module": 1 }], + "partList": [{ "pkId": 材料ID, "module": 2 }], + "extraList": [{ "type": 附加费类型, "module": 3 }] +} +``` + +#### PrintModuleEnum 打印模块枚举 + +| key | code | name | +|-----|------|------| +| MAN_HOUR_COST | 1 | 工时费模块 | +| MATERIAL_COST | 2 | 材料费模块 | +| EXTRA_COST | 3 | 附加费模块 | +| OTHER_COST | 4 | 其他费用模块 | +| SERVICE_COST | 5 | 服务费用模块 | + +#### 主单参数 + +与结算单类似,额外包含 `signaturePhotoUrl`(签名图片)、`storeLogo`(logo)等字段。 + +#### 扩展模块列表 extendedModuleList + +| 字段 | 说明 | +|------|------| +| module | 打印模块(PrintModuleEnum.code) | +| name | 项目/材料/附加费名称 | +| number | 工时/数量/"-" | +| price | 单价/"-" | +| subtotal | 金额 | +| discount | 折扣(附加费为1.00) | +| discountedSubtotal | 折后金额 | + +--- + +### 10.4 委托单 + +**打印平台模版分类**:委托单 + +| 字段 | 类型 | 说明 | +|------|------|------| +| printOrgName | String | 打印抬头 | +| orgName | String | 维修厂名称 | +| billNo | String | 工单号 | +| naEmployee | String | 服务顾问 | +| employeePhone | String | 服务顾问手机号 | +| naCustomer | String | 单位名称(客户姓名) | +| carNoWhole | String | 车牌号整体 | +| cellPhone | String | 联系电话 | +| repairPerson | String | 送修人 | +| repairPersonContact | String | 送修人联系方式 | +| billDate | String | 进厂日期 | +| deliveryTime | String | 交车时间 | +| mileage | BigDecimal | 出厂里程 | +| oilCapacity | String | 当前油量 | +| vin | String | 车辆VIN码 | +| carModelShort | String | 车型简称 | +| signaturePhotoUrl | String | 签名图片 | +| orgContactNumber | String | 联系电话(维修厂) | +| orgDetailAddress | String | 联系地址(维修厂) | +| printContentEntrust | String | 委托单免责条款 | +| serviceSubtotalVip | BigDecimal | 服务项目明细小计(会员项目) | +| stuffSubtotalVip | BigDecimal | 材料收入小计(会员项目) | +| serviceSubtotalAll | BigDecimal | 工时费小计 | +| stuffSubtotalAll | BigDecimal | 材料费小计 | +| serviceList | List | 工单对应项目集合 | + +**ServicePrintAttribute**: + +| 字段 | 类型 | 说明 | +|------|------|------| +| serviceName | String | 项目名称 | +| price | BigInteger | 工时单价 | +| workHour | BigInteger | 工时 | +| subtotal | BigInteger | 金额 | +| serviceMemo | String | 附加信息备注 | +| isMember | Integer | 当前项目是否使用会员 | +| empNameStr | String | 修理工名称 | + +--- + +### 10.5 协作单 + +**打印平台模版分类**:协作单 + +| 字段 | 类型 | 说明 | +|------|------|------| +| title | String | 打印抬头(门店简称) | +| billNo | String | 工单号 | +| creatorName | String | 制单人 | +| printTime | String | 打印时间 | +| naEmployee | String | 服务顾问 | +| billDate | String | 进厂日期 | +| deliveryTime | String | 交车时间 | +| naCustomer | String | 车主姓名 | +| cellPhone | String | 车主电话 | +| carModel | String | 车型 | +| carNoWhole | String | 车牌号 | +| vin | String | 车辆VIN码 | +| amountAll | BigDecimal | 小计 | +| serviceDetailVOList | List | 协作项目集合 | + +**CooperationServicePrintAttribute**: + +| 字段 | 类型 | 说明 | +|------|------|------| +| serviceName | String | 工单项目名称 | +| cooperationServiceName | String | 协作项目名称 | +| cooperationOrgName | String | 协作门店 | +| auditStatus | String | 审核状态 | +| cooperationCost | BigDecimal | 协作成本 | + +--- + +### 10.6 增项单 + +**打印平台模版分类**:增项单 + +| 字段 | 类型 | 说明 | +|------|------|------| +| title | String | 打印抬头(门店名称+"新增项目确认单") | +| sourceBillNo | String | 关联工单号 | +| printTime | String | 打印时间 | +| naEmployee | String | 服务顾问 | +| arrivalTime | String | 进厂日期 | +| deliveryTime | String | 交车时间 | +| naCustomer | String | 车主姓名 | +| cellPhone | String | 车主电话 | +| repairPerson | String | 送修人 | +| repairPersonContact | String | 送修人联系方式 | +| carModel | String | 车型 | +| carNoWhole | String | 车牌号 | +| carColor | String | 车身颜色 | +| engineCode | String | 发动机号 | +| vin | String | 车辆VIN码 | +| mileage | String | 进厂里程 | +| oilCapacity | String | 进厂油量 | +| merchantAddress | String | 商家联系地址 | +| merchantTel | String | 商家联系方式(固定电话) | +| merchantPhone | String | 商家联系方式(手机) | +| workHourPriceSubtotal | String | 工时费(小计) | +| amountSubtotal | String | 材料费(小计) | +| attachedServiceVoList | List | 增项服务项目集合 | +| attachedStuffVoList | List | 增项配件材料集合 | + +**ServicePrintAttribute**(增项服务): + +| 字段 | 类型 | 说明 | +|------|------|------| +| serviceName | String | 项目名称 | +| labelName | String | 业务分类 | +| customCode | String | 项目编码 | +| price | Double | 工时单价 | +| workHour | Double | 工时 | +| number | Integer | 项目数量 | +| discount | Double | 折扣 | +| discountedSubtotal | Double | 折后金额 | +| subtotal | Double | 金额 | +| serviceMemo | String | 项目备注 | +| isMember | Integer | 是否使用会员 | +| nameMember | String | 会员项目来源名 | +| empNameStr | String | 修理工名称 | + +**PartPrintAttribute**(增项材料): + +| 字段 | 类型 | 说明 | +|------|------|------| +| partName | String | 材料名称 | +| labelName | String | 业务分类 | +| partBrand | String | 配件品牌 | +| customCode | String | 材料编码 | +| price | Double | 单价 | +| number | Integer | 材料数量 | +| unit | String | 单位 | +| discount | Double | 折扣 | +| discountedSubtotal | Double | 折后金额 | +| subtotal | Double | 金额 | +| partMemo | String | 材料备注 | +| isMember | Integer | 是否使用会员 | +| nameMember | String | 会员项目来源名 | +| employeeName | String | 员工名称 | +| empNameStr | String | 修理工名称 | + +--- + +### 10.7 保险单 + +**打印平台模版分类**:保险单 + +| 字段 | 类型 | 说明 | +|------|------|------| +| companyTitle | String | 打印title | +| customerName | String | 客户姓名 | +| carNo | String | 车牌号 | +| vin | String | vin码 | +| carModel | String | 车型 | +| cellPhone | String | 手机号 | +| insureDate | String | 起保日期(yyyy-MM-dd) | +| receivable | BigDecimal | 应收金额 | +| preferentialAmount | BigDecimal | 优惠金额 | +| receiveAmount | BigDecimal | 实收金额 | +| oweAmount | BigDecimal | 未收金额 | +| commissionAmountTotal | BigDecimal | 手续费 | +| companyRefundAmount | BigDecimal | 保险公司返点 | +| customerRefundAmount | BigDecimal | 客户返点 | +| insuranceCompanyName | String | 承保公司 | +| memo | String | 备注 | +| employeeName | String | 服务顾问 | +| contacts | String | 保险公司联系人 | +| contactMobile | String | 保险公司联系人手机号 | +| channelName | String | 来店途径 | +| startDate | String | 开始日期(yyyy-MM-dd) | +| endDate | String | 结束日期(yyyy-MM-dd) | +| renewal | Integer | 是否续保(0否/1是) | +| tsInsuranceDetailList | List | 保险单明细 | + +**TsInsuranceDetailPrintVo**: + +| 字段 | 类型 | 说明 | +|------|------|------| +| policyNo | String | 保单号 | +| insuranceType | Integer | 保险类型(0交强险/1商业险) | +| name | String | 险种名称 | +| amount | BigDecimal | 保额 | +| receivable | BigDecimal | 应收金额 | +| discount | BigDecimal | 折扣 | +| concessionary | BigDecimal | 优惠金额 | +| commissionRate | BigDecimal | 手续费率 | +| commissionAmount | BigDecimal | 手续费 | +| paid | BigDecimal | 实收金额 | +| memo | String | 备注 | +| companyRefundAmount | BigDecimal | 保险公司返点 | +| customerRefundAmount | BigDecimal | 客户返点 | + +--- + +### 10.8 定金单 + +**打印平台模版分类**:定金单 + +| 字段 | 类型 | 说明 | +|------|------|------| +| title | String | 标题(门店名称) | +| abbreviation | String | 门店简称 | +| billNO | String | 定金单号 | +| printTime | String | 打印时间 | +| customerName | String | 客户姓名 | +| cellPhone | String | 手机号码 | +| carNo | String | 适用车辆(顿号隔开) | +| orgName | String | 适用门店(顿号隔开) | +| balanceStatus | String | 结算状态 | +| receivedAmount | Double | 已收金额 | +| amount | Double | 收款交易金额 | +| amountAll | Double | 定金单收款小计 | +| preRefundBalance | Double | 定金单退款前余额 | +| advancesReceivedBalance | Double | 定金单收款后剩余面额 | +| memo | String | 定金备注 | +| settlePerson | String | 结算人 | +| employeeName | String | 收款人 | +| businessDate | String | 收款时间 | +| billDate | String | 交易时间 | +| transactionDate | String | 交易时间 | +| detailAddress | String | 联系地址 | +| contactMobile | String | 联系方式 | +| naServicePerson | String | 服务顾问 | +| gatheringList | List | 收款方式列表 | +| relationServices | List | 适用项目列表 | +| relationParts | List | 适用材料列表 | +| relationCars | List | 适用车辆列表 | + +**gatheringList** 项:paymentType(支付方式), amount(金额-BigDecimal) + +**relationServices** 项:infoId(项目id), infoName(项目名称), labelName(业务分类) + +**relationParts** 项:infoId(材料id), infoName(材料名称), labelName(业务分类) + +**relationCars** 项:idCar(车辆信息id), carNo(车牌号), vin(vin码) + +--- + +### 10.9 报价单 + +**打印平台模版分类**:报价单打印 + +#### 主单信息 + +| 字段 | 类型 | 说明 | +|------|------|------| +| partDetailVoList | List | 材料列表 | +| serviceDetailVoList | List | 项目列表 | +| amountChinese | String | 商品金额中文大写 | +| realAmountWithoutCardChinese | String | 待付金额中文大写 | + +#### QuotationPartDetailPrintVo(报价单材料) + +| 字段 | 类型 | 说明 | +|------|------|------| +| pkId | BigInteger | 无意义主键 | +| partName | String | 材料名称 | +| partShowName | String | 材料显示名称 | +| number | BigDecimal | 数量 | +| price | BigDecimal | 单价 | +| subtotal | BigDecimal | 总价 | +| discount | BigDecimal | 折扣 | +| realSubtotal | BigDecimal | 折后总计 | +| unit | String | 单位 | +| spec | String | 规格型号 | +| brand | String | 品牌名称 | +| supplierCode | String | 零件号 | +| customCode | String | 材料编码 | +| employeeName | String | 服务员工姓名 | +| memo | String | 备注 | + +#### QuotationServiceDetailPrintVo(报价单项目) + +| 字段 | 类型 | 说明 | +|------|------|------| +| pkId | BigInteger | 无意义主键 | +| customCode | String | 项目编码 | +| serviceName | String | 项目名称 | +| workHour | BigDecimal | 工时 | +| price | BigDecimal | 单价 | +| subtotal | BigDecimal | 工时费 | +| discount | BigDecimal | 折扣 | +| realSubtotal | BigDecimal | 折后金额 | +| memo | String | 备注 | + +--- + +### 10.10 检测单 + +**打印平台模版分类**:检测单 + +#### 主单信息 + +| 字段 | 类型 | 说明 | +|------|------|------| +| carCheckPackageName | String | 模板名称 | +| title | String | 标题 | +| billNo | String | 检测单号 | +| printTime | String | 打印时间 | +| naEmployee | String | 服务顾问 | +| billDate | String | 进厂时间 | +| deliveryTime | String | 预计交车 | +| naCustomer | String | 车主 | +| carModel | String | 车型 | +| cellPhone | String | 车主电话 | +| carNoWhole | String | 车牌号 | +| vin | String | vin码 | +| repairPerson | String | 送修人 | +| repairPersonContact | String | 送修人联系方式 | +| mileage | String | 进厂里程 | +| oilCapacity | String | 进厂油量 | +| nextMileage | String | 下次保养里程 | +| nextMaintainDate | String | 下次保养日期 | +| customerMemo | String | 车主描述 | +| merchantAddress | String | 联系地址 | +| merchantPhone | String | 联系方式 | +| qrCode | String | 二维码 | +| qrCodeToB | String | B端二维码 | +| qrCodeToC | String | C端二维码 | +| icon | String | 车辆环视图 | +| maintainBillNo | String | 结算单号 | +| showComputerCheckInfo | Boolean | 是否展示电脑检测 | +| computerCheckInfoList | List | 电脑检测 | +| personalCheckInfoList | List | 人工检测项(正常+异常) | +| sortedPersonalCheckInfoList | List | 人工检测项(问题排序靠前) | +| optionPersonalCheckInfoList | List | 异常人工检测项 | +| normalPersonalCheckInfoList | List | 正常人工检测项 | +| iconMemo | String | 环视图备注 | +| iconResult | String | 环视图结论 | +| warningLightResult | String | 警示灯结论 | +| showWarningLightItem | Boolean | 是否展示警示灯 | +| warningLightItemList | List | 警示灯 | +| employeeName | String | 服务技师 | + +#### ComputerPrintItem(电脑检测项) + +| 字段 | 类型 | 说明 | +|------|------|------| +| index | String | 序号 | +| errorCode | String | 故障码 | +| itemName | String | 检测项目 | +| optionNameS | String | 建议处理(Y) | +| optionNameE | String | 择期处理(Y) | +| optionNameU | String | 急需处理(Y) | +| memo | String | 备注 | + +#### PersonalPrintItem(人工检测小类) + +| 字段 | 类型 | 说明 | +|------|------|------| +| index | BigInteger | 序号 | +| itemComponent | String | 检测部件 | +| memo | String | 备注 | +| childList | List | 子项目列表 | + +#### PrintTinyItem(检测项目) + +| 字段 | 类型 | 说明 | +|------|------|------| +| itemName | String | 检测项目 | +| itemResults | String | 检测结果 | +| optionNameS | String | 建议处理(Y) | +| optionNameE | String | 择期处理(Y) | +| optionNameU | String | 急需处理(Y) | +| memo | String | 备注 | + +--- + +### 10.11 出/入库单据 + +#### 场景总览 + +| 场景 | 入口 | REST 接口 | 底层接口 | +|------|------|-----------|----------| +| 库存出库单 | 出入库单据-出库单 | `/stock/stockInAndOutBill/stockOutPrint?idStock=XXX&isNew=true` | PrintServiceImpl#getStockOutPrintUrl | +| 库存入库单 | 出入库单据-入库单 | `/stock/stockInAndOutBill/stockInPrint?idStock=XXX&isNew=true` | PrintServiceImpl#getStockInPrintUrl | +| 手工出入库 | 手工出入库 | `/stock/manual/print?pkId=XXX&billType=0&isNew=true` | PrintService#getManualStorageStockInPrintUrl | +| 领料单 | 领料详情 | `/stock/maintain/print?idSourceBill=XXX&hasPreview=true` | PrintServiceImpl#getMaintainPrintUrl | + +> 日志关键字:出库单→"出库单打印参数",入库单→"入库单打印参数",手工→"手工出入库单据打印入参是",领料→"领料单打印参数" + +#### 出库单参数 + +**定制类模版分类**:`newStockOutMaintainCustomPrint`(20250925新增) + +| 字段 | 说明 | 备注 | +|------|------|------| +| title | 门店名称+"出库单" | | +| billNo | 出库单号 | | +| sourceBillNo | 来源单号 | | +| showSourceBillNo | 显示来源单号(boolean) | | +| billStatus | 单据状态(制单/完成) | | +| inOutDate | 出库日期 | | +| showInOutDate | 是否显示出库日期(boolean) | | +| objectName | 出入库对象 | | +| objectNameGD | 出入库对象工单 | 客户姓名+车牌+VIN+品牌车系车型(前80字符) | +| creatorName | 制单人 | | +| billDate | 制单日期(yyyy-MM-dd) | | +| sumNumber | 材料总数量 | | +| sumAmount | 总金额 | 脱敏显示**** | +| chineseAmount | 总金额(中文大写) | 脱敏显示**** | +| nowDateTime | 打印当前时间(yyyy-MM-dd HH:mm) | | +| idOwnOrg | 门店ID | | +| remark | 备注信息 | | +| showRemark | 是否显示备注(boolean) | | +| isGdType | 是否工单类型(boolean) | | +| saName | 服务顾问 | 工单出库场景 | +| printCount | 打印次数 | | +| showCustomCode | 是否显示材料编码(boolean) | | +| showBusinessLabel | 是否显示业务分类(boolean) | | +| showApplyModel | 是否显示适用车型(boolean) | | +| showStorageName | 是否显示仓库(boolean) | | +| showDefSeat | 是否显示货位(boolean) | | +| showChineseAmount | 是否显示大写金额(boolean) | | +| showChineseSubtotal | 是否显示大写行合计(boolean) | | +| columnCount | 显示几列 | | +| batchPrintConfig | 批次成本展示设置 | 0不展示/1总成本/2和3展示批次 | +| memo | 车主描述 | 20250925新增 | + +**partInfoDetailMapList** 材料行: + +| 字段 | 说明 | +|------|------| +| sortNumber | 序号(合计行显示"合计") | +| partShowName | 材料组合名称 | +| partName | 材料名称 | +| partBrand | 材料品牌(2025.02.27新增) | +| supplierCode | 零件号 | +| labelName | 业务分类 | +| applyModel | 适用车型 | +| customCode | 材料编码 | +| storageName | 仓库名称 | +| defSeat | 货位 | +| number | 数量 | +| unit | 单位 | +| price | 单价 | +| subtotal | 金额 | +| employeeName | 出库人 | +| salesEmployeeNameList | 材料行销售人员(20250925新增) | +| orderBatchList | 批次成本信息(List) | + +**orderBatchList** 项:orderNo(批次号), count(数量), price(单位成本), priceNoTax(除税单位成本), totalPrice(总成本), totalPriceNoTax(除税总成本) + +#### 入库单参数 + +**定制类模版分类**:`newStockInMaintainCustomPrint`(20250925新增) + +与出库单类似,额外字段: + +| 字段 | 说明 | +|------|------| +| noTaxSumAmount | 除税总金额 | +| chineseNoTaxSumAmount | 除税总金额(大写) | +| noTaxPrice | 除税单价(材料行) | +| noTaxSubtotal | 除税金额(材料行) | +| sumSubtotal | 入库总金额(工单退才有) | +| chineseSubtotal | 大写入库总金额(工单退才有) | +| showReturnIn | 显示退料入库一行(工单退才有) | +| showSign | 仓管签字位置(工单退=2,其它=1) | +| stockInType | 退料入库(工单退才有) | + +#### 领料单参数 + +| 字段 | 说明 | +|------|------| +| idOwnOrg | 门店ID | +| title | 门店名称+"领料单" | +| billNo | 工单号 | +| nowDateTime | 打印当前时间 | +| employeeName | 服务顾问 | +| carModel | 车型 | +| carNoWhole | 车牌号 | +| memo | 车主描述(2025.08.14新增) | +| printTimes | 打印次数 | +| columnCount | 显示几列 | +| batchPrintConfig | 批次成本设置 | +| stuffDetailVOList | 材料列表 | + +--- + +### 10.12 调拨单 + +**前端调用接口**:`/stock/allot/print?idAllot=` +**模版编码**:`allotInPrint` + +| 字段 | 说明 | 备注 | +|------|------|------| +| printFlag | 均价门店false/批次门店true | | +| showPrice | 参配-打印调拨价格及金额 | 勾选true | +| orgName | 打印抬头 | 调入:XXX调入单/调出:XXX调出单 | +| billNo | 调拨单号 | 调入:DRD/调出:DCD前缀 | +| idOwnOrg | 门店ID | | +| naOrgIn | 调入门店名称 | | +| naOrgOut | 调出门店名称 | | +| detailAddress | 供应商详细地址 | | +| statusName | 调拨单状态 | 制单/待发货/待收货/已完成 | +| billDate | 单据日期(yyyy-MM-dd) | | +| creatorName | 创建人 | | +| nowDateTime | 打印时间 | | +| remark | 备注信息 | | +| showRemark | 是否显示备注 | | +| sumNumber | 总数量 | | +| sumAmount | 总金额 | 脱敏显示**** | +| printCount | 打印次数 | | +| allotDetailVoList | 调拨单明细行 | | + +**allotDetailVoList** 明细行: + +| 字段 | 说明 | +|------|------| +| sortNumber | 序号 | +| partShowName | 材料组合名称 | +| customCode | 材料自定义编码 | +| partName | 材料名称(20250731追加) | +| partBrand | 材料品牌(20250731追加) | +| supplierCode | 材料零件号(20250731追加) | +| standard | 材料规格型号(20250731追加) | +| carNo | 车牌(20250731追加) | +| defSeat | 货位(调入/调出门店货位) | +| unit | 单位 | +| price | 单价 | +| numCus | 个数(均价/批次逻辑不同) | +| amount | 金额(均价/批次逻辑不同) | +| orderNo | 批次号 | +| productDate | 批次生成日期 | + +--- + +### 10.13 材料标签 + +**打印平台模版分类**:材料价格通用标签打印 + +材料标签支持一次打多张,与 `labelList` 集合元素个数匹配。 + +#### 通用材料标签 + +| 字段 | 类型 | 说明 | +|------|------|------| +| labelList | List | 材料标签列表 | + +**Label**: + +| 字段 | 类型 | 说明 | +|------|------|------| +| name | String | 材料名称 | +| supplierCode | String | 零件号 | +| customCode | String | 材料编码 | +| sellPrice | BigDecimal | 销售价格 | +| date | String | 打印日期(yyyy/MM/dd) | + +#### 采购库存材料标签 + +- 不带供应商:**采购库存通用标签打印-新** +- 带供应商:**采购库存通用标签打印-包含供应商-新** + +| 字段 | 类型 | 说明 | +|------|------|------| +| labelList | List | 材料标签列表 | + +**Object**: + +| 字段 | 类型 | 说明 | +|------|------|------| +| partName | String | 材料名称 | +| partBrand | String | 材料品牌 | +| customCode | String | 材料编码 | +| partShowName | String | 组合名称 | +| supplierCode | String | 材料供应商编码 | +| spec | String | 材料规格型号 | +| unit | String | 材料单位 | +| barCode | String | 材料编码 | +| billDate | String | 单据日期(yyyy-MM-dd) | +| supplierName | String | 供应商名称 | +| storageName | String | 材料仓库名称 | +| defSeat | String | 材料货位 | +| date | String | 打印日期(yyyy/MM/dd) | + +--- + +### 10.14 采购单/采购退货单 + +走打印平台定制,需先向赵亚妮提供门店编码、门店名称开通后再上传配置。 + +参考文档:[采购单/采购退打印](https://alidocs.dingtalk.com/i/nodes/7NkDwLng8ZMajY9YijOwlz4bJKMEvZBY) + +--- + +## 附录:关键注意事项 + +1. **结算单**模板名称必须包含"结算单"三个字 +2. **洗车单**定制模板名称必须包含"洗车单"三个字 +3. **新版附表**不能用 `billStatus`、`balanceStatus`、`maintainType` 做判断 +4. 列表内参数用 `$F{}`,外层参数用 `$P{}` +5. 数字类型参数用 `java.math.BigDecimal`,文本用 `java.lang.String` +6. 未预设参数需先创建 Parameter(外层)或 Field(列表内) +7. **删除模板不可恢复**,操作前务必确认 +8. 价格脱敏场景显示 `****` +9. 工具类 JAR:`print-core-1.0.7.jar`,提供金额转大写和日期转换功能 diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹).jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹).jrxml new file mode 100644 index 0000000..2010fa3 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹).jrxml @@ -0,0 +1,2382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹)维保单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹)维保单.jrxml new file mode 100644 index 0000000..f14a2a2 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹)维保单.jrxml @@ -0,0 +1,2381 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹)附表.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹)附表.jrxml new file mode 100644 index 0000000..8cc5f2e --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单(壹)附表.jrxml @@ -0,0 +1,2381 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单-维保单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单-维保单.jrxml new file mode 100644 index 0000000..b309fff --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/F6标准结算单-维保单.jrxml @@ -0,0 +1,2289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/保险单接口文档.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/保险单接口文档.md new file mode 100644 index 0000000..bdd3fc3 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/保险单接口文档.md @@ -0,0 +1,67 @@ +# 保险单接口文档 + +# 保险单接口文档 + +打印平台模版分类:保险单 + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| companyTitle | 打印title | | String | +| customerName | 客户姓名 | | String | +| carNo | 车牌号 | | String | +| vin | vin码 | | String | +| carModel | 车型 | | String | +| cellPhone | 手机号 | | String | +| insureDate | 起保日期 | | String yyyy-MM-dd | +| receivable | 应收金额 | | BigDecimal | +| preferentialAmount | 优惠金额 | | BigDecimal | +| receiveAmount | 实收金额 | | BigDecimal | +| oweAmount | 未收金额 | | BigDecimal | +| commissionAmountTotal | 手续费 | | BigDecimal | +| companyRefundAmount | 保险公司返点 | | BigDecimal | +| customerRefundAmount | 客户返点 | | BigDecimal | +| insuranceCompanyName | 承保公司 | | String | +| memo | 备注 | | String | +| employeeName | 服务顾问 | | String | +| contacts | 保险公司联系人 | | String | +| contactMobile | 保险公司联系人手机号 | | String | +| channelName | 来店途径 | | String | +| startDate | 开始日期 | | String yyyy-MM-dd | +| endDate | 结束日期 | | String yyyy-MM-dd | +| renewal | 是否续保 0否/1是 | | Integer | +| tsInsuranceDetailList | 保险单明细 | | List | +| | | | | +| | | | | + +TsInsuranceDetailPrintVo: + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| policyNo | 保单号 | | String | +| insuranceType | 保险类型(0交强险/1商业险) | | Integer | +| name | 险种名称 | | String | +| amount | 保额 | | BigDecimal | +| receivable | 应收金额(元) | | BigDecimal | +| discount | 折扣 | | BigDecimal | +| concessionary | 优惠金额(元) | | BigDecimal | +| commissionRate | 手续费率 | | BigDecimal | +| commissionAmount | 手续费 | | BigDecimal | +| paid | 实收金额(元) | | BigDecimal | +| memo | 备注 | | String | +| companyRefundAmount | 保险公司返点 | | BigDecimal | +| customerRefundAmount | 客户返点 | | BigDecimal | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | + +> 更新: 2023-09-20 11:32:29 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/出_入库单据打印.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/出_入库单据打印.md new file mode 100644 index 0000000..d905009 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/出_入库单据打印.md @@ -0,0 +1,420 @@ +# 出/入库单据打印 + +# 现状梳理 + +| **场景** | | 入口 | 打印效果 | **底层模版** | 接口 | +| --- | --- | --- | --- | --- | --- | +| 库存 | 出入库单据-出库单 |  |  |  | REST:/stock/stockInAndOutBill/stockOutPrint?idStock=XXX&isNew=true底层接口:com.f6car.stock.service.impl.print.PrintServiceImpl#getStockOutPrintUrl日志关键字:+"出库单打印参数:" (有 apollo 开关 log.stockInout.print.switch 默认true) | +| | 领料出库(工单领料)-出库单 |  |  | +| | 出入库单据-入库单 |  |  |  | REST:/stock/stockInAndOutBill/stockInPrint?idStock=XXX&isNew=true底层接口:com.f6car.stock.service.impl.print.PrintServiceImpl#getStockInPrintUrl日志关键字:+"入库单打印参数:" (有 apollo 开关 log.stockInout.print.switch 默认true) | +| | 领料出库(工单领料)-退料单 |  |  | +| | 手工出入库-出库单 |  |  |  | REST:/stock/manual/print?pkId=XXX&billType=0&isNew=true (type=0 表示入库单 type=1 表示出库单)底层接口:com.f6car.stock.service.print.PrintService#getManualStorageStockInPrintUrl日志关键字:+"手工出入库单据打印入参是:" | +| | 手工出入库-入库单 |  |  |  | +| | 领料详情-打印领料单 |  |  |  | REST:/stock/maintain/print?idSourceBill=XXX&hasPreview=true底层接口:com.f6car.stock.service.impl.print.PrintServiceImpl#getMaintainPrintUrl日志关键字:+"领料单打印参数:" (有 apollo 开关 log.stock.maintain.print.switch 默认false) | + +# 出入库单据-出库单 && 领料出库-出库单打印模版参数说明 + +出库单据定制类需求模版分类(newStockOutMaintainCustomPrint)--20250925新增 + +打印模版参数 + +HashMap resultMap + +| **字段** | **说明** | 备注 | +| --- | --- | --- | +| title | 门店名称+ "出库单" | | +| billNo | 出库单号 | | +| sourceBillNo | 来源单号 | | +| showSourceBillNo | 显示来源单号 (boolean) | | +| billStatus | 单据状态(制单、完成) | | +| inOutDate | 出库日期 | | +| showInOutDate | 是否显示出库日期(boolean) | | +| objectName | 出入库对象 | | +| objectNameGD | 出入库对象工单工单出库单:客户姓名+车牌号整体+车辆VIN码+车辆品牌车系车型全称 (拼接后取前 80 个字符)非工单出库单:"" | | +| creatorName | 制单人 | | +| billDate | 制单日期 (yyyy-MM-dd) | | +| sumNumber | 材料总数量 | | +| sumAmount | 总金额 \--脱敏场景显示 _\*_\*_\*\*_ | | +| chineseAmount | 总金额(中文大写)\--脱敏场景显示 _\*_\*\*\* | | +| nowDateTime | 打印当前时间 (yyyy-MM-dd HH:mm) | | +| idOwnOrg | 门店ID | | +| remark | 备注信息 | | +| showRemark | 是否显示备注(boolean)\-- 备注不为空时是 true | | +| isGdType | 是否是工单类型单据出库(boolean)\-- 工单出库单是 true | | +| saName | 服务顾问姓名\-- 工单出库单场景 | | +| printCount | 打印次数 | | +| showCustomCode | 配置出入库打印参数-是否显示材料编码(boolean) | | +| showBusinessLabel | 配置出入库打印参数-是否显示材料业务分类(boolean) | | +| showApplyModel | 配置出入库打印参数-是否显示材料适用车型(boolean) | | +| showStorageName | 配置出入库打印参数-是否显示出库仓库(boolean) | | +| showDefSeat | 配置出入库打印参数-是否显示出库货位(boolean) | | +| showChineseAmount | 配置出入库打印参数-是否显示大写金额(boolean) | | +| showChineseSubtotal | 配置出入库打印参数-是否显示大写行合计(boolean) | | +| columnCount | 显示几列 | | +| batchPrintConfig | 配置出入库打印参数-查询批次成本展示设置 0:都不展示,1:总成本(将批次成本合并),2和3:展示批次成本 | | +| memo | 车主描述 | \--20250925 新增 | +| partInfoDetailMapList | | | +| sortNumber | 序号**通用模版追加一行合计行,显示 合计** | | +| partShowName | 材料组合名称 | | +| partName | 材料名称 | | +| partBrand | 材料品牌 | \-- 2025.02.27 新增 | +| supplierCode | 零件号 | | +| labelName | 业务分类 | | +| applyModel | 适用车型 | | +| customCode | 材料编码 | | +| storageName | 仓库名称 | | +| defSeat | 货位 | | +| number | 数量**\-- 通用模版追加一行合计行,显示 材料出库总数** | | +| unit | 单位 | | +| price | 单价\--脱敏场景显示 _\*_\*\*\* | | +| subtotal | 金额\--脱敏场景显示 _\*_\*\*\* | | +| employeeName | 出库人 | | +| salesEmployeeNameList | 材料行销售人员 | \--20250925 新增 | +| orderBatchList\--List> | 材料行成本相关 | | +| orderNo | 批次号\-- batchPrintConfig = 1 场景下,显示 ""\-- 均价模式下,显示 ""**\-- 通用模版追加一行合计,追加行,显示 ""** | | +| count | 批次出库几个\-- batchPrintConfig = 1 场景下,显示 ""\-- 均价模式下,显示 ""**\-- 通用模版追加一行合计,追加行,显示总数** | | +| price | 批次单位成本\-- batchPrintConfig = 1 场景下,显示 ""\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价单位成本**\-- 通用模版追加一行合计,追加行,显示 "" | | +| priceNoTax | 批次单位除税成本\-- batchPrintConfig = 1 场景下,显示 ""\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价单位成本**\-- 通用模版追加一行合计,追加行,显示 "" | 2025.08.14 新增 | +| totalPrice | 批次总成本\-- batchPrintConfig = 1 场景下,显示合计总成本\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价总成本**\-- 通用模版追加一行合计,追加行,显示总成本 | | +| totalPriceNoTax | 批次除税总成本\-- batchPrintConfig = 1 场景下,显示合计总成本\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价除税总成本**\-- 通用模版追加一行合计,追加行,显示总成本 | 2025.08.14 新增 | + +样列: + + + +```plaintext +{ + "saName":"xuetting", + "objectNameGD":"18551638685【苏ABF358】 LFV2A21K6A3092399 大众 速腾 1.4T 双离合变速器(DSG) 2011 速腾", + "creatorName":"cltest", + "showStorageName":true, + "remark":"", + "title":"流程配置ES出库单", + "showSourceBillNo":true, + "sumAmount":"860.0", + "showChineseAmount":true, + "billStatus":"完成", + "sumNumber":"1.0", + "isGdType":true, + "printCount":"3", + "billNo":"CKD20250116001", + "showDefSeat":true, + "idOwnOrg":"15870306745529549109", + "showApplyModel":true, + "memo":"", + "partInfoDetailMapList":[ + { + "employeeName":"cltest", + "sortNumber":"1", + "partShowName":" 3M 燃油宝1号 PN6868 3M (PN6868)", + "defSeat":"A", + "orderBatchList":[ + { + "orderNo":"20211213000001", + "totalPrice":"0.0", + "price":"0.0", + "count":"1.0" + } + ], + "supplierCode":"PN6868", + "partName":"3M 燃油宝1号 PN6868", + "applyModel":"", + "customCode":"CL0000015", + "storageName":"主仓库", + "number":"1.0", + "unit":"瓶", + "price":"860.0", + "subtotal":"860.0", + "labelName":"保养", + "salesEmployeeNameList": "B2C一店新员工,B2C一店采购员" + + }, + { + "number":"1.0", + "subtotal":"860.0", + "sortNumber":"合计", + "orderBatchList":[ + { + "orderNo":"", + "totalPrice":"0.0", + "price":"", + "count":"1.0" + } + ] + }], + "sourceBillNo":"WXD20250103001", + "billDate":"2025-01-16", + "chineseAmount":"捌佰陆拾元整", + "columnCount":"5", + "showCustomCode":true, + "showBusinessLabel":true, + "batchPrintConfig":"3", + "nowDateTime":"2025-02-18 10:04", + "showInOutDate":true, + "showChineseSubtotal":true, + "objectName":"18551638685【苏ABF358】大众 速腾", + "inOutDate":"2025-01-16", + "showRemark":false +} +``` + +# 出入库单据-入库单 && 退料入库-入库单打印模版参数说明 + +入库单据定制类需求模版分类(newStockInMaintainCustomPrint)--20250925新增 + +打印模版参数 + +HashMap resultMap + +| **字段** | **说明** | 备注 | +| --- | --- | --- | +| title | 门店名称+ "入库单" | | +| billNo | 入库单号 | | +| sourceBillNo | 来源单号 | | +| showSourceBillNo | 显示来源单号 (boolean)默认:true | | +| billStatus | 单据状态(制单、完成) | | +| inOutDate | 入库日期\-- yyyy-MM-dd | | +| showInOutDate | 是否显示入库日期(boolean)\-制单是 false\-完成是 true | | +| objectName | 出入库对象 | | +| creatorName | 制单人 | | +| billDate | 制单日期 (yyyy-MM-dd) | | +| sumNumber | 材料总数量 | | +| sumAmount | 总金额 \--脱敏场景显示 _\*_\*_\*\*_ | | +| noTaxSumAmount | 除税总金额 \--脱敏场景显示 _\*_\*_\*\*_ | | +| chineseAmount | 总金额(中文大写)\--脱敏场景显示 _\*_\*\*\* | | +| chineseNoTaxSumAmount | 除税总金额(中文大写)\--脱敏场景显示 _\*_\*\*\* | | +| nowDateTime | 打印当前时间 (yyyy-MM-dd HH:mm) | | +| idOwnOrg | 门店ID | | +| remark | 备注信息 | | +| showRemark | 是否显示备注(boolean)\-- 备注不为空时是 true | | +| isGdType | 是否是工单类型单据出库(boolean)\-- 工单出库单是 true | | +| saName | 服务顾问姓名\-- 工单出库单场景 | | +| printCount | 打印次数 | | +| showCustomCode | 配置出入库打印参数-是否显示材料编码(boolean) | | +| showBusinessLabel | 配置出入库打印参数-是否显示材料业务分类(boolean) | | +| showApplyModel | 配置出入库打印参数-是否显示材料适用车型(boolean) | | +| showStorageName | 配置出入库打印参数-是否显示出库仓库(boolean) | | +| showDefSeat | 配置出入库打印参数-是否显示出库货位(boolean) | | +| showChineseAmount | 配置出入库打印参数-是否显示大写金额(boolean) | | +| showChineseSubtotal | 配置出入库打印参数-是否显示大写行合计(boolean) | | +| sumSubtotal | 入库总金额\-- 脱敏场景显示 \*\*\*\*\-- 工单退-才有 | | +| chineseSubtotal | 大写入库总金额\-- 脱敏场景显示 \*\*\*\*\-- 工单退-才有 | | +| showReturnIn | 显示退料入库一行\-- 工单退-true | | +| showSign | 【仓管签字】显示的位置工单退-2;其它场景1 | | +| stockInType | 退料入库\-- 工单退-才有 | | +| columnCount | 显示几列 | | +| memo | 车主描述 | \--20250925 新增 | +| partInfoDetailMapList | | | +| sortNumber | 序号 | | +| partShowName | 材料组合名称 | | +| partName | 材料名称 | | +| partBrand | 材料品牌 | | +| labelName | 业务分类 | | +| applyModel | 适用车型 | | +| customCode | 材料编码 | | +| storageName | 仓库名称 | | +| defSeat | 货位 | | +| number | 数量**\-- 通用模版追加一行合计行,显示 材料出库总数** | | +| unit | 单位 | | +| price | 单价\--脱敏场景显示 _\*_\*\*\* | | +| noTaxPrice | 除税单价\--脱敏场景显示 _\*_\*\*\* | | +| subtotal | 金额\--脱敏场景显示 _\*_\*\*\* | | +| noTaxSubtotal | 除税金额\--脱敏场景显示 _\*_\*\*\* | | +| employeeName | 入库人 | | +| salesEmployeeNameList | 材料行销售人员 | \--20250925 新增 | + +# 手工出入库-出/入库单 + +打印模版参数 + +HashMap resultMap + +| **字段** | **说明** | **备注** | +| --- | --- | --- | +| title | 出库单:门店名称+ "出库单"入库单:门店名称+ "入库单" | | +| billNo | 出库单号/入库单号 | | +| sourceBillNo | 来源单号 空 | | +| showSourceBillNo | 显示来源单号 (boolean)false | | +| billStatus | 单据状态(制单、完成) | | +| inOutDate | 出库日期 (yyyy-MM-dd) | | +| showInOutDate | 是否显示出库日期(boolean) | | +| objectName | 出入库对象 | | +| objectNameGD | 出入库对象 | | +| creatorName | 制单人 | | +| billDate | 制单日期 (yyyy-MM-dd) | | +| sumNumber | 材料总数量 | | +| sumAmount | 总金额 \--脱敏场景显示 _\*_\*\*\* | | +| chineseAmount | 总金额(中文大写)\--脱敏场景显示 _\*_\*\*\* | | +| nowDateTime | 打印当前时间 (yyyy-MM-dd HH:mm) | | +| idOwnOrg | 门店ID | | +| remark | 备注信息 | | +| showRemark | 是否显示备注(boolean)-- 备注不为空时是 true | | +| printCount | 打印次数 | | +| showCustomCode | 配置出入库打印参数-是否显示材料编码(boolean) | | +| showBusinessLabel | 配置出入库打印参数-是否显示材料业务分类(boolean) | | +| showApplyModel | 配置出入库打印参数-是否显示材料适用车型(boolean) | | +| showStorageName | 配置出入库打印参数-是否显示出库仓库(boolean) | | +| showDefSeat | 配置出入库打印参数-是否显示出库货位(boolean) | | +| showChineseAmount | 配置出入库打印参数-是否显示大写金额(boolean) | | +| showChineseSubtotal | 配置出入库打印参数-是否显示大写行合计(boolean) | | +| columnCount | 显示几列 | | +| batchPrintConfig | 配置出入库打印参数-查询批次成本展示设置 0:都不展示,1:总成本(将批次成本合并),2和3:展示批次成本 | | +| partInfoDetailMapList | | | +| sortNumber | 序号**\-- 通用模版追加一行合计行,显示 合计** | | +| partShowName | 材料组合名称 (材料名称 规格型号 材料品牌 零件号) | | +| partName | 材料名称 | | +| partBrand | 材料品牌 -- 2025.02.27 新增 | | +| supplierCode | 零件号 | | +| labelName | 业务分类 | | +| applyModel | 适用车型 | | +| customCode | 材料编码 | | +| storageName | 仓库名称 | | +| defSeat | 货位 | | +| number | 数量**\-- 通用模版追加一行合计行,显示 材料出库总数** | | +| unit | 单位 | | +| price | 单价\--脱敏场景显示 _\*_\*\*\* | | +| subtotal | 金额\--脱敏场景显示 _\*_\*\*\* | | +| employeeName | 出库人 | | +| taxRate | 税率 | | +| orderBatchList\--List> | 材料行成本相关 | | +| orderNo | 批次号\- batchPrintConfig = 1 场景下,显示 ""\-- 均价模式下,显示 ""**\-- 通用模版追加一行合计,追加行,显示 ""** | | +| count | 批次出库几个\-- batchPrintConfig = 1 场景下,显示 ""\-- 均价模式下,显示出库/入库个数**\-- 通用模版追加一行合计,追加行,显示总数** | | +| price | 批次单位成本\-- batchPrintConfig = 1 场景下,显示 ""\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价单位成本**\-- 通用模版追加一行合计,追加行,显示 ""\*\* | | +| priceNoTax | 批次除税单位成本\-- batchPrintConfig = 1 场景下,显示 ""\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价单位成本**\-- 通用模版追加一行合计,追加行,显示 ""\*\* | 2025.08.14 追加 | +| totalPrice | 批次总成本\-- batchPrintConfig = 1 场景下,显示合计总成本\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价总成本**\-- 通用模版追加一行合计,追加行,显示总成本\*\*\*\* | | +| totalPriceNoTax | 批次除税总成本\-- batchPrintConfig = 1 场景下,显示合计总成本\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价总成本**\-- 通用模版追加一行合计,追加行,显示总成本\*\*\*\* | 2025.08.14 追加 | + +样列: + + + +日志关键字:+"手工出入库单据打印入参是" + +```plaintext +{ + "objectNameGD":"", + "creatorName":"王◇龙", + "showStorageName":true, + "remark":"", + "title":"ISC总店出库单", + "showSourceBillNo":false, + "sumAmount":"410.0", + "showChineseAmount":true, + "billStatus":"完成", + "sumNumber":"2.0", + "printCount":"5", + "billNo":"SGC20240515001", + "showDefSeat":true, + "idOwnOrg":"4060685614490690260", + "showApplyModel":true, + "partInfoDetailMapList":[ + { + "employeeName":"XN", + "sortNumber":"1", + "partShowName":" 材料09080112 123456 米其林 (1240)", + "defSeat":"A-14-02", + "orderBatchList":[ + { + "orderNo":"20210909000128", + "totalPrice":"400.0", + "price":"400.0", + "count":"1.0" + } + ], + "supplierCode":"1240", + "partName":"材料09080112", + "applyModel":"大众 途安", + "customCode":"CL090800112", + "storageName":"主仓库", + "number":"1.0", + "unit":"条", + "price":"400.0", + "subtotal":"400.0", + "labelName":"轮胎" + }, + { + "employeeName":"XN", + "sortNumber":"2", + "partShowName":" fnst=>1 AC德科 (FNST>=1)", + "defSeat":"", + "orderBatchList":[ + { + "orderNo":"20201104000002", + "totalPrice":"4.0", + "price":"4.0", + "count":"1.0" + } + ], + "supplierCode":"FNST>=1", + "partName":"fnst=>1", + "applyModel":"江淮瑞风S52....", + "customCode":"fnst>=1", + "storageName":"总2仓", + "number":"1.0", + "unit":"个", + "price":"10.0", + "subtotal":"10.0", + "labelName":"保养" + }, + { + "number":"2.0", + "subtotal":"410.0", + "sortNumber":"合计", + "orderBatchList":[ + { + "orderNo":"", + "totalPrice":"404.0", + "price":"", + "count":"2.0" + } + ] + } + ], + "sourceBillNo":"", + "billDate":"2024-05-15", + "chineseAmount":"肆佰壹拾元整", + "columnCount":"5", + "showCustomCode":true, + "showBusinessLabel":true, + "batchPrintConfig":"3", + "nowDateTime":"2025-02-18 09:33", + "showInOutDate":true, + "showChineseSubtotal":true, + "objectName":"", + "inOutDate":"2024-05-15", + "showRemark":false +} +``` + +# 领料详情-打印领料单 + +打印模版参数 + +HashMap resultMap + +| **字段** | **说明** | **备注** | +| --- | --- | --- | +| idOwnOrg | 门店ID | | +| title | 门店名称+ "领料单" | | +| billNo | 工单号 | | +| nowDateTime | 打印当前时间 (yyyy-MM-dd HH:mm) | | +| employeeName | 服务顾问 | | +| carModel | 车型 | | +| carNoWhole | 车牌号 | | +| memo | 车主描述 | 2025.08.14 新增 | +| printTimes | 打印次数 | | +| columnCount | 显示几列 | | +| batchPrintConfig | 配置出入库打印参数-查询批次成本展示设置 0:都不展示,1:总成本(将批次成本合并),2和3:展示批次成本 | | +| stuffDetailVOList | | | +| index | 序号**\-- 通用模版追加一行合计行,显示 合计** | | +| partName | 材料组合名称 (材料名称 规格型号 材料品牌 零件号) | | +| unit | 单位 | | +| defSeatList | 货位 | | +| salesEmployeeNameList | 销售人员List | 8.14新增 | +| orderBatchList\--List> | 材料行成本相关 | | +| orderNo | 批次号\- batchPrintConfig = 1 场景下,显示 ""\-- 均价模式下,显示 ""**\-- 通用模版追加一行合计,追加行,显示 ""** | | +| count | 批次出库几个\-- batchPrintConfig = 1 场景下,显示 ""\-- 均价模式下,显示出库/入库个数**\-- 通用模版追加一行合计,追加行,显示总数** | | +| price | 批次单位成本\-- batchPrintConfig = 1 场景下,显示 ""\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价单位成本**\-- 通用模版追加一行合计,追加行,显示 ""\*\* | | +| priceNoTax | 批次除税单位成本\-- batchPrintConfig = 1 场景下,显示 ""\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价单位成本**\-- 通用模版追加一行合计,追加行,显示 ""\*\* | 2025.08.14 追加 | +| totalPrice | 批次总成本\-- batchPrintConfig = 1 场景下,显示合计总成本\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价总成本**\-- 通用模版追加一行合计,追加行,显示总成本\*\*\*\* | | +| totalPriceNoTax | 批次除税总成本\-- batchPrintConfig = 1 场景下,显示合计总成本\-- 脱敏场景显示 **\*\*\*\*****\-- 均价模式下,显示均价总成本**\-- 通用模版追加一行合计,追加行,显示总成本\*\*\*\* | 2025.08.14 追加 | \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/协作单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/协作单.jrxml new file mode 100644 index 0000000..8804522 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/协作单.jrxml @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/协作单接口文档.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/协作单接口文档.md new file mode 100644 index 0000000..a872dbc --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/协作单接口文档.md @@ -0,0 +1,32 @@ +# 协作单接口文档 + +# 协作单接口文档 + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| title | 打印抬头(门店简称) | | String | +| billNo | 工单号 | | String | +| creatorName | 制单人 | | String | +| printTime | 打印时间 | | String | +| naEmployee | 服务顾问 | | String | +| billDate | 进厂日期 | | String | +| deliveryTime | 交车时间(出厂时间) | | String | +| naCustomer | 车主姓名 | | String | +| cellPhone | 车主电话 | | String | +| carModel | 车型 | | String | +| carNoWhole | 车牌号 | | String | +| vin | 车辆VIN码 | | String | +| amountAll | 小计 | | BigDecimal | +| serviceDetailVOList | 协作项目集合 | | List | + +## CooperationServicePrintAttribute + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| serviceName | 工单项目名称 | | String | +| cooperationServiceName | 协作项目名称 | | String | +| cooperationOrgName | 协作门店 | | String | +| auditStatus | 审核状态 | | String | +| cooperationCost | 协作成本 | | BigDecimal | + +> 更新: 2023-08-28 16:06:07 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/增项单接口文档.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/增项单接口文档.md new file mode 100644 index 0000000..bcb22d8 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/增项单接口文档.md @@ -0,0 +1,72 @@ +# 增项单接口文档 + +# 增项单接口文档 + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| title | 打印抬头(门店名称+"新增项目确认单") | | String | +| sourceBillNo | 关联工单号 | | String | +| printTime | 打印时间 | | String | +| naEmployee | 服务顾问 | | String | +| arrivalTime | 进厂日期 | | String | +| deliveryTime | 交车时间 | | String | +| naCustomer | 车主姓名 | | String | +| cellPhone | 车主电话 | | String | +| repairPerson | 送修人 | | String | +| repairPersonContact | 送修人联系方式 | | String | +| carModel | 车型 | | String | +| carNoWhole | 车牌号 | | String | +| carColor | 车身颜色 | | String | +| engineCode | 发动机号 | | String | +| vin | 车辆VIN码 | | String | +| mileage | 进厂里程 | | String | +| oilCapacity | 进厂油量 | | String | +| merchantAddress | 商家联系地址 | | String | +| merchantTel | 商家联系方式(固定电话) | | String | +| merchantPhone | 商家联系方式(手机) | | String | +| workHourPriceSubtotal | 工时费(小计) | | String | +| amountSubtotal | 材料费(小计) | | String | +| attachedServiceVoList | 增项服务项目集合 | | List | +| attachedStuffVoList | 增项配件材料集合 | | List | + +**ServicePrintAttribute** + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| serviceName | 工单项目名称 | | String | +| labelName | 业务分类名称 | | String | +| customCode | 项目编码 | | String | +| price | 工时单价 | | Double | +| workHour | 工时 | | Double | +| number | 项目数量 | | Integer | +| discount | 折扣 | | Double | +| discountedSubtotal | 折后金额 | | Double | +| subtotal | 金额 | | Double | +| serviceMemo | 项目备注 | | String | +| isMember | 当前项目是否使用会员 | | Integer | +| nameMember | 会员项目的来源名(如套餐代码) | | String | +| empNameStr | 服务项目明细对应修理工名称组装字符串 | | String | + +If you get gains,please give a like + +**PartPrintAttribute** + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| partName | 材料名称 | | String | +| labelName | 业务分类名称 | | String | +| partBrand | 配件品牌 | | String | +| customCode | 材料编码 | | String | +| price | 单价 | | Double | +| number | 材料数量 | | Integer | +| unit | 单位 | | String | +| discount | 折扣 | | Double | +| discountedSubtotal | 折后金额 | | Double | +| subtotal | 金额 | | Double | +| partMemo | 材料备注 | | String | +| isMember | 当前项目是否使用会员 | | Integer | +| nameMember | 会员项目的来源名(如套餐代码) | | String | +| employeeName | 员工名称 | | String | +| empNameStr | 材料明细对应修理工名称组装字符串 | | String | + +> 更新: 2023-09-05 10:34:22 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/委托单接口文档.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/委托单接口文档.md new file mode 100644 index 0000000..90eb54c --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/委托单接口文档.md @@ -0,0 +1,53 @@ +# 委托单接口文档 + +# 委托单接口文档 + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| printOrgName | 打印抬头 | | String | +| orgName | 维修厂名称 | | String | +| billNo | 工单号 | | String | +| naEmployee | 服务顾问 | | String | +| employeePhone | 服务顾问手机号 | | String | +| naCustomer | 单位名称(客户姓名) | | String | +| carNoWhole | 车牌号整体 = carPrefix + carNo | | String | +| cellPhone | 联系电话(客户) | | String | +| repairPerson | 送修人 | | String | +| repairPersonContact | 送修人联系方式 | | String | +| billDate | 进厂日期 | | String | +| deliveryTime | 交车时间(出厂时间) | | String | +| mileage | 出厂里程(进厂里程) | | BigDecimal | +| oilCapacity | 当前油量 | | String | +| vin | 车辆VIN码 | | String | +| carModelShort | 车型简称 | | String | +| signaturePhotoUrl | 签名图片 | | String | +| orgContactNumber | 联系电话(维修厂) | | String | +| orgDetailAddress | 联系地址(维修厂) | | String | +| orgContactMobile | 联系电话(维修厂) | | String | +| printContentEntrust | 委托单免责条款 | | String | +| serviceSubtotalVip | 服务项目明细小计(会员项目) | | BigDecimal | +| stuffSubtotalVip | 材料收入小计(会员项目) | | BigDecimal | +| serviceSubtotalAll | 工时费小计 | | BigDecimal | +| stuffSubtotalAll | 材料费小计 | | BigDecimal | +| serviceList | 工单对应项目集合 | | List | +| | | | | +| | | | | +| | | | | +| | | | | +| | | | | + +## ServicePrintAttribute + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| serviceName | 项目名称 | | String | +| price | 工时单价 | | BigInteger | +| workHour | 工时 | | BigInteger | +| subtotal | 金额 | | BigInteger | +| serviceMemo | 附加信息备注 | | String | +| isMember | 当前项目是否使用会员 | | Integer | +| empNameStr | 服务项目明细对应修理工名称组装字符串 | | String | +| | | | | +| | | | | + +> 更新: 2022-11-30 15:56:54 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金单打印接口文档.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金单打印接口文档.md new file mode 100644 index 0000000..0eb1ba4 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金单打印接口文档.md @@ -0,0 +1,121 @@ +# 定金单打印接口文档 + +# 定金单打印接口文档 + +# 接口出参 + +| 字段 | 含义 | 类型 | +| --- | --- | --- | +| title | 标题(门店名称) | String | +| abbreviation | 门店简称 | String | +| billNO | 定金单号 | String | +| printTime | 打印时间 | String | +| customerName | 客户姓名 | String | +| cellPhone | 手机号码 | String | +| carNo | 适用车辆(顿号、隔开) | String | +| orgName | 适用门店(顿号、隔开) | String | +| balanceStatus | 结算状态 | String | +| receivedAmount | 已收金额 | Double | +| amount | 收款交易金额 | Double | +| amountAll | 定金单收款小计 | Double | +| preRefundBalance | 定金单退款前余额 | Double | +| advancesReceivedBalance | 定金单收款后剩余面额 | Double | +| memo | 定金备注 | String | +| settlePerson | 结算人 | String | +| employeeName | 收款人 | String | +| businessDate | 收款时间 | String | +| billDate | 交易时间 | String | +| transactionDate | 交易时间 | String | +| detailAddress | 联系地址 | String | +| contactMobile | 联系方式(手机+固定电话) | String | +| naServicePerson | 服务顾问 | String | +| gatheringList | 收款方式 | List | +| L paymentType | 支付方式 | String | +| L amount | 金额 | BigDecimal | +| relationServices | 适用项目列表 | List | +| L infoId | 项目id | BigInteger | +| L infoName | 项目名称 | String | +| L labelName | 业务分类 | String | +| relationParts | 适用材料列表 | List | +| L infoId | 材料id | BigInteger | +| L infoName | 材料名称 | String | +| L labelName | 业务分类 | String | +| relationCars | 适用车辆列表 | List | +| L idCar | 车辆信息id | BigInteger | +| L carNo | 车牌号 | String | +| L vin | vin码 | String | + +# 范例 + +```plaintext +收款收款{ + "data": { + "preRefundBalance": 20000, + "memo": "我是备注。", + "title": "演示主店", + "carNo": "藏AVB2131", + "naServicePerson": "唐铭远", + "contactMobile": "15051779785", + "employeeName": "刘思杰", + "amount": 10000, + "orgName": "演示主店测试、第一分店", + "advancesReceivedBalance": 10000, + "amountAll": 10000, + "balanceStatus": "7100", + "billDate": "2024-07-11 16:27:49", + "businessDate": "2024-07-24 14:49:01", + "receivedAmount": 10000, + "abbreviation": "演示主店测试", + "transactionDate": "2024-07-11 16:27:49", + "relationServices": [ + { + "infoName": "龙膜全车贴膜(不含撕膜)", + "infoId": "10545055918005551735", + "infoType": 1, + "id": "239", + "labelName": "其他", + "idSubscription": "11159" + } + ], + "customerName": "牛洋", + "gatheringList": [ + { + "amount": 4000, + "paymentType": "支付宝" + }, + { + "amount": 3000, + "paymentType": "现金" + }, + { + "amount": 3000, + "paymentType": "挂账" + } + ], + "detailAddress": "西藏自治区那曲市班戈县西藏自治区那曲市班戈县北拉镇邮政所", + "billNO": "DJD20240711001", + "cellPhone": "17625046227", + "printTime": "2024-07-11 17:28:08", + "relationParts": [ + { + "infoName": "奔腾CI-4 15W40 4*4L 胜牌 (706650)", + "infoId": "10545055918005692400", + "infoType": 2, + "id": "240", + "labelName": "业务分类测试", + "idSubscription": "11159" + } + ], + "relationCars": [ + { + "carNo": "AV616E", + "vin": "LSVAA49J132047371", + "idCar": 15809106713748983890 + } + ], + }, + "storeId": 4060685614487994527, + "tempId": 41 +} +``` +> 更新: 2024-07-25 20:54:41 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金收款单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金收款单.jrxml new file mode 100644 index 0000000..800dbb7 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金收款单.jrxml @@ -0,0 +1,942 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金收款小票.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金收款小票.jrxml new file mode 100644 index 0000000..15df5d5 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/定金收款小票.jrxml @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/工单结算单接口文档.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/工单结算单接口文档.md new file mode 100644 index 0000000..1ee5b97 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/工单结算单接口文档.md @@ -0,0 +1,510 @@ +# 工单结算单接口文档 + +# 打印单最新接口参数 + +#### maintain接口 + +**接口:/print/dispatchPrint/genUrl** + +**方法:post** + +支持场景: + +各类结算单 + +不支持:上海结算单 + +**入参:** + +```plaintext +{ + "pkId": "14581820313319918809", + "rowCode": "costSettlePrint", + "rowId": "12" +} +``` +```plaintext +{ + "code": 200, + "data": { + "url": "http://s1.f6yc.com/printserver/test/printFile/201912/191213154046701.pdf" + }, + "message": "SUCCESS" +} +``` + +#### erp接口 + +**/print/getPrintPDFPath.do** + +templateId=56&templateType=newSettlePrint&idSourceBill=10546443563897503197 + +**rest get** + +**支持各种新版打印类型** + +```plaintext +{ + "code": 200, + "data": "http://s1.f6yc.com/printserver/test/printFile/201912/191213154046701.pdf", + "message": "SUCCESS" +} +``` + +#### jasper取参对照 + +```plaintext +{ + "data": { + "cellPhone": "15421562365", //联系电话 + "naCustomer": "0322新", //单位名称 + "repairPerson": "", //送修人 + "carOwnerName":"", // 车辆所有人 + "accountNumber": "", //账号 + "billNo": "GD20190517001", //工单号 + "carNoWhole": "苏1542", //车牌号 + "" + "carColor":"" //车身颜色 + "orgDetailAddress": "江苏省盐城市阜宁县豆豆",//联系地址 + "vin": "11111111111111111", //车辆VIN码 + "naEmployee": "员工1(旧1)", //服务顾问 + "billDate": "2019-05-17 11:49",//进厂日期 + "businessTypeName": "维修", //维修类别 + "deliveryTime": "2019-05-17 12:49",//交车时间(出厂时间) + "email": "126544@qq.com", //组织邮件 + "maintainType": "GD", //工单类型 + "billStatus":"6300", //单据状态 + "orgContactMobile": "15315256232", //联系电话 + "memo": "", //工单备注 + "orgMemo":"", // 门店备注 + "carMemo":"", // 车辆备注 + "printCount": "1", //打印次数 + "orgContactNumber": "", //联系电话-承修方信息 + "carSeriesName": "商用车", //车系名称 + "carBrandName": "商用车", //品牌名称 + "balanceStatus": "7000", //结算状态 + "printTime": "2019-07-26 11:43:48",//打印时间 + "firstSettlementTime":"2019-07-26 11:43:48",//结算时间(第一次收款时间) + "orgName": "新公司测试", //单位名称-承修方信息 + "abbreviation": "门店简称", //门店简称 + "engineNumber": "123", //发动机号 + "transmissionNo": "123", //变速箱号 + "creationtime": "2019-05-17 11:50:46.0",//创建时间 + "creatorName": "员工1(旧1)", //创建人名称 + "employeePhone":"18734033191", //服务顾问手机号 + "paymentTypeDetails":"记账", //支付方式(记账公司)汇总 + "bankAccount": "", //开户银行 + "naInsurer":"", //理赔公司名称 + "insurancepolicyNo":"", //理赔单理赔保险单号 + "mergePackageContent": "1", //套餐合并标识 + "totalStuffNum": 1.0, //材料数量合计 + "selfTotalStuffNum": 0.0, //自带材料数量合计 + "serviceNum": "1", //维修项目小计 + "spreadRate": 0.0, //进销差价率 + "managementCost": 0.0, //进销差价合计 + "amountAll": 160.0, //应收总计 + "serviceDisCountSubTotal": 100.0, //项目折后金额合计 + "stuffSubtotalAll": 60.0, //材料费小计 + "serviceSubtotalAll": 100.0, //工时费小计 + "receiptAmount": 160.0, //实收金额 + "chineseAmount": "壹佰陆拾元整", //实收金额(大写) + "oweAmount": 160.0, //未收金额 + "remainAmount":1.0, //结算金额tsf + "receivedAmount":1.0, //收款金额tsf + "settleOweAmout":1.0, //结算单中用的待付金额(未收) + "settleOweAmoutChinese":"壹", //待付金额大写 + "settleReceivedAmout":1.0, //实付金额 + "settleReceivedAmoutChinese":1.0, //实付金额大写 + "totalWorkHour": 1.0, //项目工时合计 + "serviceFavourableTotal": 52.0, //项目优惠金额合计 + "serviceFavourableCommonTotal": 52.0,//普通项目优惠金额合计 + "stuffSubtotalAll": 532.0, //材料费小计 + "partFavourableTotal": 102.0, //材料优惠金额合计 + "partFavourableCommonTotal": 92.0, //普通材料优惠金额合计 + "stuffDisCountTotal": 60.0, //材料折后金额合计 + "extraCostTotal": 0.0, //附加费小计 + "allOtherCost": 0.0, //附加费合计应收 + "packageFavourable": 0.0, //套餐优惠 + "czkExpense": 0.0, //储值卡消费金额 + "vipExpense": 0.0, //会员卡消费金额 + "czkExpenseFavourable": 0.0, //储值卡优惠金额 + "czkDiscountFavourable": 0.0, //储值卡办卡优惠金额 + "vipExpenseFavourable": 0.0, //计次卡/套餐卡优惠金额 + "partinfoDiscountFavourable": 0.0, //材料折扣优惠 + "partinfoFavourable": 0.0, //材料项目(非会员项目)客户等级优惠 + "couponFavourable": 0.0, //优惠券优惠 + "pointFavourable": 0.0, //积分优惠 + "discountFavourable": 0.0, //结算时设置的结清优惠 + "gatheringFavourable": 0.0, //收银时设置的收银优惠 + "customerLevelFavourable": 0.0, //客户级别优惠金额 + "serviceFavourable": 0.0, //服务项目(非会员项目)客户等级优惠 + "disCountAll": 0.0, //总优惠合计 + "disCountAllBak":0.0, //总优惠合计bak + "printContent": "", //免责条款 + "printContentEntrust":"", //委托单免责条款 + "mainCostList": [ //维修结算费用集合 + { + "subtotal": 60.0, //价格 + "sortNumber": "1", //序号 + "costName": "材料费" //名称 + }, + { + "subtotal": 100.0, + "sortNumber": "2", + "costName": "工时费" + }, + { + "subtotal": 160.0, + "sortNumber": "3", + "costName": "合计" + } + ], + "partList": [ //工单对应配件材料集合 + { + "unit": "个", //单位 + "isBring": 0, //是否自带,1表示自带,0表示非自带 + "discountedSubtotal": 60.0, //折后金额 + "price": 60.0, //价格 + "partName": "分全", //材料名称 + "number": 1.0, //数量 + "subtotal": 60.0, //金额 + "taxRateOutput": 0.13, //销项税率 + "singleFavourable":0.0, //优惠金额 + "partBrand":"", //配件品牌 + "spec":"", //规格型号 + "supplierCode":"", //供应商编码(零件号) + "customCode":"", //材料编码 + "isMember":0, //是否是会员卡材料 1是 + "discount":0.5, //折扣 + "partMemo":"", //备注 + "employeeName":"", //员工名称(维修技师) + "cargoSpace":"", //货位 + "outStockEmployeeName":"", //领料人 + "sortNumber": "1" //序号 + } + ], + "serviceList": [ //工单对应项目集合 + { + "discountedSubtotal": 100.0,//折后金额 + "price": 100.0, //工时单价 + "workHour": 1.0, //工时 + "subtotal": 100.0, //金额 + "taxRateOutput": 0.13, //销项税率 + "sortNumber": "1", //序号 + "discount":1, //折扣 + "singleFavourable":0.0, //优惠金额 + "isMember":1, //是否是会员卡项目 1是 0否 + "empNameStr":"", //修理工 + "unusedNumber":1, //会员卡项目-未使用次数 + "number":2, //会员卡项目-总次数 + "infiniteFlag":1, //是否无限,0:否,1:是 + "serviceName": "0322新" //项目名称 + } + ], + "cardList": [ //会员卡列表 + { + "favourable": 20, //优惠 + "amount": 2019799, //余额 + "consumeAmount":10, //本次消费金额 + "memberCardNo": "123232rg",//卡号 + "name": "测试洗车卡项目2" //卡名称 + } + ], + "czkList": [ //储值卡列表 + { + "favourable": 20, //优惠 + "amount": 2019799, //余额 + "consumeAmount":10, //本次消费金额 + "memberCardNo": "123232rg",//卡号 + "name": "测试洗车卡项目2" //卡名称 + } + ], + "extraPrintVo": { //附加项目 + "processItemName": "加工", //加工条目名称 + "checkCustomName": "检测费", //检测费名称 + "diagnosisCustomName": "诊断费", //诊断费名称 + "diagnosisItemName": "维修诊断", //维修诊断项目 + "diagnosisMemo": "", //诊断费备注 + "diagnosisCost": 0.0, //诊断费 + "commissionCustomName": "代办费", //代办费名称 + "managementCustomName": "管理费", //管理费名称 + "commissionMemo": "", //代办费备注 + "processMemo": "", //加工费 + "commissionCost": 0.0, //代办费 + "checkCost": 0.0, //检测费 + "managementCost": 0.0, //管理费 + "processCustomName": "加工费", //加工费名称 + "processCost": 0.0, //加工费 + "managementMemo": "", //管理费备注 + "checkMemo": "" //检测费备注 + } + }, + "storeId": 25965086392720693, + "tempId": 123 +} +``` + +#### 参数说明(完整) + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| \------基础信息 | | | +| **billNo** | String | _工单号_ | +| **maintainType** | String | _工单类型_ | +| **balanceStatus** | String | _结算状态__"7000" -- 未结算(即存在待付金额)__"7100" -- 已结算__"7200" -- 部分结算_ | +| **creatorName** | String | _创建人名称_ | +| **naEmployee** | String | _服务顾问_ | +| **spreadRate** | Double | _进销差价率_ | +| carCategoryName | String | _客户车辆分类名称_ | +| **creationtime** | String | _创建时间_ | +| **memo** | String | _工单备注_ | +| **printCount** | String | _打印次数_ | +| **printTime** | String | _打印时间_ | +| **deliveryTime** | String | _交车时间(出厂时间),收款取收款时间,未收款完工的取完工时间,未完工的取预计交车时间_ | +| **mergePackageContent** | String | _套餐合并标识_ | +| **printContent** | String | _免责条款_ | +| **engineNumber** | String | _发动机号_ | +| **transmissionNo** | String | 变速箱号 | +| **printMaintainGuaZi** | String | _guazi标识_ | +| **amountAll** | Double | _应收总计_ | +| **disCountAll** | Double | _总优惠合计_ | +| **oweAmount** | Double | _未收金额_ | +| **vipExpense** | Double | _会员卡消费金额_ | +| **vipExpenseFavourable** | Double | _计次卡/套餐卡优惠金额_ | +| **czkExpense** | Double | _储值卡消费金额_ | +| **czkExpenseFavourable** | Double | _储值卡优惠金额_ | +| **czkSettleFavourable** | Double | _储值卡结算优惠金额(仅未收款返回)_ | +| **accountAmount** | Double | 记账金额 | +| **totalOweAmount** | Double | _未付金额_ | +| **serviceFavourable** | Double | _服务项目(非会员项目)客户等级优惠_ | +| **partinfoFavourable** | Double | _材料项目(非会员项目)客户等级优惠_ | +| **partinfoDiscountFavourable** | Double | _材料折扣优惠_ | +| **pointFavourable** | Double | _积分优惠_ | +| **packageFavourable** | Double | _套餐优惠_ | +| **discountFavourable** | Double | _结算时设置的结清优惠_ | +| **gatheringFavourable** | Double | _收银时设置的收银优惠_ | +| **couponFavourable** | Double | _优惠券优惠_ | +| **customerLevelFavourable** | Double | _客户级别优惠金额_ | +| **customerLevelName** | String | _客户级别_ | +| **customerDetailAddress** | String | 客户详细地址 | +| **channelName** | String | 来店途径名称 | +| **receiptMemo** | String | 收银备注 | +| **customerSourceName** | String | _客户来源名称_ | +| **carSourceName** | String | _车辆来源名称_ | +| \-----托修方信息 | | | +| **naCustomer** | String | _单位名称/托修方_ | +| **repairPerson** | String | _送修人_ | +| **carNoWhole** | String | _车牌号整体_ | +| **carBrandName** | String | _品牌名称_ | +| **carSeriesName** | String | _车系名称_ | +| carMemo | String | 车辆备注 | +| **businessTypeName** | String | _维修类别_ | +| **vin** | String | _车辆VIN码_ | +| carFuelTypeNameOriginal | carFuelTypeNameOriginal | 燃料类型 | +| **billDate** | String | _进厂日期_ | +| **mileage** | java.math.BigDecimal | _出厂里程_ | +| **contractNumber** | | _合同编号(空)_ | +| **certificateNumber** | | _合格证号(空)_ | +| **cellPhone** | String | _联系电话_ | +| **email** | String | _组织邮件_ | +| \------承修方信息 | | | +| **orgName** | String | _单位名称_ | +| **abbreviation** | String | 门店简称 | +| **orgContactNumber** | String | _联系电话_ | +| **orgDetailAddress** | String | _联系地址_ | +| **orgContactMobile** | String | _联系电话_ | +| **bankAccount** | String | _开户银行_ | +| **accountNumber** | String | _账号_ | +| **businessLicenseCode** | String | 营业执照编码 | +| \------项目信息 | | | +| serviceList | array | 项目条目 | +| #### orderNumber | String | 序号(验证可用) | +| sortNumber | String | _序号_ | +| customCode | String | 项目编码 | +| serviceName | String | _项目名称_ | +| **labelName** | String | _业务分类名称_ | +| **nameMember** | String | _会员项目的来源名_ | +| **labelName** | String | 业务分类 | +| price | Double | _工时单价_ | +| workHour | Double | _工时_ | +| subtotal | Double | _金额_ | +| ```plaintext taxRateOutput ``` | BigDecimal | _销项税率_ | +| ```plaintext singleFavourable ``` | Double | 优惠金额 | +| discountedSubtotal | Double | _折后金额_ | +| **serviceMemo** | String | _单据服务项目备注_ | +| discount | Double | 折扣 | +| unusedNumber | Integer | 会员卡项目-未使用次数 | +| number | Integer | 会员卡项目-总次数 | +| ```plaintextfavourableVoList ``` | List | 优惠明细 | +| ```plaintextdiscountType ``` | Integer | 优惠类型(编码) | +| ```plaintextdiscountTypeName ``` | String | 优惠类型名称 | +| amount | Double | 优惠金额 | +| ```plaintextsourceId ``` | String | 优惠项目的主键,如:如果优惠项是优惠券,那么该字段为优惠券的id | +| **memo** | String | 项目说明 | +| **qualityCheckEmployeeName** | String | 质检人姓名 | +| **qualityCheckEmployeeCode** | String | 质检人工号 | +| **cooperationMemo** | String | 协作备注 | +| **totalWorkHour** | Double | _项目工时合计_ | +| **serviceSubtotalAll** | Double | _工时费小计_ | +| **serviceNum** | Double | _维修项目小计_ | +| **serviceDisCountSubTotal** | Double | _项目折后金额合计_ | +| \-------材料信息 | | | +| partList | array | 材料条目 | +| #### orderNumber | String | 序号(验证可用) | +| sortNumber | String | _序号_ | +| customCode | String | 材料编码 | +| partName | String | _材料名称_ | +| **partBrand** | String | _配件品牌_ | +| spec | String | 规格型号 | +| standard | String | 规格型号(旧) | +| **partShowName** | String | _配件名称规格型号品牌_ | +| **supplierCode** | String | _供应商编码(零件号)_ | +| unit | String | _单位_ | +| number | Double | _数量_ | +| **nameMember** | String | _会员项目的来源名_ | +| price | Double | _价格_ | +| cost | Double | _材料成本_ | +| subtotal | Double | _退货金额_ | +| taxRateOutput | BigDecimal | _销项税率_ | +| singleFavourable | Double | 优惠金额 | +| discountedSubtotal | Double | _折后金额_ | +| **partMemo** | String | _单据服务材料备注_ | +| discount | Double | 折扣 | +| **applyModel** | String | 适用车型 | +| ```plaintextcargoSpace ``` | String | 材料货位 | +| **defSeats** | List | 材料货位列表 | +| ```plaintextfavourableVoList ``` | List | 优惠明细 | +| ```plaintextdiscountType ``` | Integer | 优惠类型(编码) | +| ```plaintextdiscountTypeName ``` | String | 优惠类型名称 | +| ```plaintextamount ``` | Double | 优惠金额 | +| ```plaintextsourceId ``` | String | 优惠项目的主键,如:如果优惠项是优惠券,那么该字段为优惠券的id | +| \-------自带材料(新版维修/贴膜)信息 | | | +| **bringPartList** | array | 自带材料条目 | +| **partShowName** | String | 自带材料名称(文本) | +| **photoList** | List | 自带图片路径(url) | +| empNameStr | String | 技师 | +| outStockEmployeeName | String | 领料人 | +| **isBring** | String | _是否自带_ | +| **selfPartList** | array | _工单对应配件自带材料集合(内容同上面材料)_ | +| **totalStuffNum** | String | _材料数量合计_ | +| **selfTotalStuffNum** | String | _自带材料数量合计_ | +| **stuffSubtotalAll** | Double | _材料费小计_ | +| **partFavourableTotal** | Double | _材料优惠金额合计_ | +| **partFavourableCommonTotal** | Double | _普通材料优惠金额合计_ | +| **stuffDisCountTotal** | Double | _材料折后金额合计_ | +| **managementCost** | Double | _进销差价合计_ | +| \------附加费用信息 | | | +| **extraChargeList** | | | +| **sortNumber** | String | _序号_ | +| **extraName** | String | _附加费名称_ | +| **subtotal** | Double | _金额_ | +| **memo** | String | _备注_ | +| \-----维修结算费用集合(江苏结算单) | | | +| **mainCostList** | array | | +| **sortNumber** | String | _序号_ | +| **costName** | String | _名称_ | +| **memo** | String | _备注_ | +| **subtotal** | Double | _金额_ | +| \----_其他结算费用集合(江苏结算单)_ | | | +| **otherCostList** | array | 内容同上 维修结算费用集合 | +| **extraCostTotal** | Double | _附加费小计_ | +| **allOtherCost** | Double | _附加费合计应收_ | +| **favourableExtraCost** | Double | _附加费优惠金额_ | +| **receiptAmount** | Double | _实收金额(已收金额-储值卡金额,如未收款,则还加入了欠款金额+客户等级优惠-积分优惠-结清优惠)_ | +| **receiptAmountChinese** | String | _实收金额大写(逻辑同上)_ | +| **amountReal** | Double | 工单收款后真正的实收 | +| **chineseAmount** | String | _实收金额(大写)(逻辑同上)_ | +| **payItemTogetherChinese** | String | _付款方式总额大写_ | +| **payItemTogetherExcludeAccountAmountChinese** | String | 付款总额(排除记账金额)大写 | +| **settleOweAmout** | Double | 结算单中用的待付金额(未收),使用后台逻辑算好 | +| **settleOweAmoutChinese** | String | 待付金额大写 | +| \-----结算付款方式及优惠保存信息 | array | | +| **settlementPayItemList** | | | +| **payWay** | String | _付款方式_ | +| **payAmount** | Double | _付款金额_ | +| **chinesePayAmount** | String | _大写付款方式_ | +| **accountAgreementName** | String | _记账客户名称_ | +| \-----付款方式信息 | array | | +| **payItemList** | | | +| **payWay** | String | _付款方式_ | +| **payAmount** | Double | _付款金额_ | +| **chinesePayAmount** | String | _大写付款方式_ | +| \-----附加项目(江苏结算单) | | | +| **extraPrintVo** | obj | | +| **commissionCustomName** | String | _代办费自定义名称_ | +| **commissionCost** | Double | _代办费成本_ | +| **commissionMemo** | String | _代办费备注_ | +| **diagnosisCustomName** | String | _诊断费自定义名称_ | +| **diagnosisCost** | Double | _诊断费成本_ | +| **diagnosisItemName** | String | _诊断详细名称_ | +| **diagnosisMemo** | String | _诊断费备注_ | +| **checkCustomName** | String | _检查费自定义名称_ | +| **checkCost** | Double | _检查费成本_ | +| **checkMemo** | String | _检查费备注_ | +| **processCustomName** | String | _加工费自定义名称_ | +| **processCost** | Double | _加工费成本_ | +| **processMemo** | String | _加工费备注_ | +| **processItemName** | String | _加工详细名称_ | +| **managementCustomName** | String | _管理费自定义名称_ | +| **managementCost** | Double | _管理费成本_ | +| **managementMemo** | String | _管理费备注_ | +| \-----二期新增字段 | | | +| **oilCapacity** | String | 油量 | +| **nextMileage** | Double | _下次保养里程(工单数据源,目前维保、洗车单读取)_ | +| **nextMaintainDate** | String | _下次保养日期(工单数据源,目前维保、洗车单读取)_ | +| **nextMileageRemind** | Double | _下次服务里程(服务提醒数据源,目前维修、贴膜单读取)_ | +| **nextMaintainDateRemind** | Long | _下次服务时间(服务提醒数据源,目前维修、贴膜单读取)_ | +| **repairPersonContact** | String | _送修人联系方式_ | +| **memberCardNo** | String | _会员号_ | +| **points** | String | _积分_ | +| **czkList** | array | 储值卡列表 | +| **name** | String | 名称 | +| **memberCardNo** | String | 卡号 | +| ```plaintext **cardOwner** ``` | String | 持卡人 | +| **amount** | Double | 金额 | +| **cardList** | array | 套餐卡列表 | +| **name** | String | 名称 | +| **memberCardNo** | String | 卡号 | +| ```plaintext **cardOwner** ``` | String | 持卡人 | +| **amount** | Double | 金额 | +| **combineServiceAndPartList** | array | 项目材料组合列表 | +| **servicePrintVo** | 参见serviceList | | +| **partPrintVo** | 参见partList | | + +# 案例记录: + +#### 1.结算前 待付 结算后实付(跟进结算状态判断,7100 为已结算) + +```plaintext +$P{balanceStatus}.equals("7100")?($P{amountAll}.subtract($P{vipExpense}).subtract($P{czkExpense}).subtract($P{serviceFavourable}.add($P{partFavourableCommonTotal}==null?BigDecimal.ZERO:$P{partFavourableCommonTotal}).add($P{serviceFavourableCommonTotal}==null?BigDecimal.ZERO:$P{serviceFavourableCommonTotal}).add($P{partinfoFavourable}).add($P{discountFavourable}).add($P{couponFavourable}).add($P{pointFavourable}).add($P{gatheringFavourable})).setScale( 2, BigDecimal.ROUND_HALF_EVEN ).toString()+($P{payItemTogether}==null?"":"("+$P{payItemTogether}+")")):($P{amountAll}.subtract($P{vipExpense}).subtract($P{czkExpense}).subtract($P{serviceFavourable}.add($P{partFavourableCommonTotal}==null?BigDecimal.ZERO:$P{partFavourableCommonTotal}).add($P{serviceFavourableCommonTotal}==null?BigDecimal.ZERO:$P{serviceFavourableCommonTotal}).add($P{partinfoFavourable}).add($P{discountFavourable}).add($P{couponFavourable}).add($P{pointFavourable}).add($P{gatheringFavourable})).setScale( 2, BigDecimal.ROUND_HALF_EVEN )) +``` + +* 对应的汉字 + + +```plaintext +$P{balanceStatus}.equals("7100")?$P{payItemTogetherChinese}:$P{settleOweAmoutChinese} +``` + +# 工具类jar包附件下载: + +[请至钉钉文档查看附件《print-core-1.0.7.jar》](https://alidocs.dingtalk.com/i/nodes/vy20BglGWOexYpophlEGoZvGJA7depqY?iframeQuery=anchorId%3DX02mjljl3qzo6fk6o7712b) + +### 数字金额转中文方法调用示例: + +**数字金额**:$P{amount}==null?BigDecimal.ZERO:$P{amount} +**转中文**:**com.f6car.printserver.core.CharacterUtil.chinese(**$P{amount}==null?BigDecimal.ZERO:$P{amount}) + +### 日期时间戳转日期示例: + +**日期格式选择:**java.lang.Long + +**日期时间戳**:$P{nextMaintainDateRemind} **转为目标格式**:$P{nextMaintainDateRemind} == null ? "" : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date($P{nextMaintainDateRemind})) + +其中,"yyyy-MM-dd HH:mm:ss" 根据实际需求指定,比如到日则选择 "yyyy-MM-dd" + +### 洗车单 + +洗车单小票不支持定制,定制洗车单的模板名称必须包含“洗车单”三个字 ,否则无法显示对应模板 + +> 更新: 2025-02-24 17:08:50 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/开卡单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/开卡单.jrxml new file mode 100644 index 0000000..8467b1f --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/开卡单.jrxml @@ -0,0 +1,1034 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/打印单定制介绍.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/打印单定制介绍.md new file mode 100644 index 0000000..41337a5 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/打印单定制介绍.md @@ -0,0 +1,262 @@ +# 打印单定制介绍 + +# 打印单定制介绍 + +| **最常用的基础操作** | +| --- | +| [1、新增静态文本](#jwTdk) | +| [2、新增动态字段(例如想要展示结算单中的工单号)](#fKwpz) | +| [3、列表中增减字段(例如结算单中的项目列表和材料列表)](#IUyOs) | +| [4、新增边框和样式设置](#RKqIf) | +| [6、保存+输出](#M31IF) | +| [7、打印单后台配置](#gr6xz) | + +## 常用链接地址: + +###### 打印单后台地址 + +[http://print.f6yc.com/print-server/ui/index.html#/template/classification](http://print.f6yc.com/print-server/ui/index.html#/template/classification) + +###### 打印单模板样式 + +[https://xcz.yuque.com/ombipo/rpc7ms/fbd6ay?singleDoc#](https://xcz.yuque.com/ombipo/rpc7ms/fbd6ay?singleDoc#) 《打印单各类模板样式》 + +###### 打印单参数表 + +[https://xcz.yuque.com/ombipo/rpc7ms/ro5fs1?singleDoc#](https://xcz.yuque.com/ombipo/rpc7ms/ro5fs1?singleDoc#) 《打印单最新接口参数》 + +###### 打印单工具简易开发教程(附带案例) + +[《打印单定制简易开发教程》](https://alidocs.dingtalk.com/i/nodes/dQPGYqjpJYgZGbvbCdEKGDGZWakx1Z5N?utm_scene=team_space) + +## 工具下载 + +jdk1.8 使用 jaspersoft6.8版本 + +[请至钉钉文档查看附件《Jaspersoft Studio-6.8.0.zip》](https://alidocs.dingtalk.com/i/nodes/20eMKjyp81R0ndXdsdYe4BaDWxAZB1Gv?corpId=&iframeQuery=anchorId%3DX02mgkgykvfbfbiqcbc8b4) + +WIN: + +[请至钉钉文档查看附件《Jaspersoft Studio-6.3.1.final.rar》](https://alidocs.dingtalk.com/i/nodes/20eMKjyp81R0ndXdsdYe4BaDWxAZB1Gv?corpId=&iframeQuery=anchorId%3DX02mki20wvdslzwftp0ao) + +MAC: + +[请至钉钉文档查看附件《TIBCOJaspersoftStudio-6.3.1.final-mac-x86\_64.zip》](https://alidocs.dingtalk.com/i/nodes/20eMKjyp81R0ndXdsdYe4BaDWxAZB1Gv?corpId=&iframeQuery=anchorId%3DX02mki26xyvtjfkmi00ki) + +## 打印单模板修改流程 + +#### 1、下载需要的模板 + +###### 通过模板名称,直接到模板管理中通过模板名称查询并下载 + + + +#### 2、打开编辑工具 TIBCO Jaspersoft Studio + +###### 打开文件夹,双击Jaspersoft Studio.exe 运行工具 + + + +###### 点击File-->Open File-->选择下载的模板文件 + +###### 进入编辑模板的页面 + + + +#### 3、常见编辑操作 + +##### 1.新增静态文本 + +###### 新增组件到模板中 + + + +###### 双击组件编辑显示文本 + + + +###### 调整组件大小和位置参数 + + + +##### 2.新增动态字段(例如想要展示结算单中的工单号) + +###### 在参数表中搜索想要的参数名称和类型:名称是:billNo 类型是文本信息=java.lang.String + + + +###### 拖拽一个 Text Field 组件到模板中 + + + +###### 双击组件写入公式固定写法$P{参数名称} + +######  + +###### 遇到提示:The current expression is not valid. Please verify it!;表明这个参数在模板中没有预先创建,需要手动创建参数信息 + + + +###### 模板中预设参数信息:Outline-->Parameters(右键单击)-->Create Parameter + + + +###### 编辑参数信息:Name(填写参数名称);Class(数字就选择:java.math.BigDecimal 文本就选择java.lang.String) + + + +##### 3.列表中增减字段(例如结算单中的项目列表和材料列表) + +###### 例如查找材料名称,可以发现参数名是partName,是在一个名字叫partList 的列表里面的,在材料信息的列表中能使用到的参数就只有partList下的这个参数,其他参数无法在列表中直接使用(例如工单号在材料列表中展示不了) + + + +###### 双击需要编辑的列表,进入列表编辑页面 + + + +###### 编辑方式与新增动态字段相同,但是固定写法从$P{参数名称} 改为 $F{参数名称} + + + +###### 提示The current expression is not valid. Please verify it! 参数没有预设时,在列表编辑页面中新增,逻辑与上面相同 + +##### 4.新增边框和样式设置 + +###### 选择需要编辑的组件,选择Boeders 进行编辑 + + + +#### 4、常见语法介绍 + +###### 文本拼接参数:$P{参数名称}+"特定文本内容" —— 例如打印单标题:$P{printOrgName}+"结算单" + +###### 小数保留2位小数或多位:$P{参数名称}.setScale( 保留几位小数, BigDecimal.ROUND\_DOWN ) ——例如折后金额小计,保留2位小数:$P{stuffSubtotalAll}.setScale( 2, BigDecimal.ROUND\_DOWN ) + +###### 字符串截取:$P{参数名称}.substring(起始位置,截取长度)——例如进厂日期,保留前10位:$P{billDate}.substring(0,10) + +###### 三元运算-IF判断:(关系表达式) ? 表达式1 : 表达式2 ——例如打印单标题:($P{printOrgName}==null?$P{orgName}:($P{printOrgName}.isEmpty()?$P{orgName}:$P{printOrgName}))+"结算单" + +###### 常见运算: + +是否相等:”==“ 或者 $P{参数名称}.equals("文本内容") + +加:$P{参数名称1}.add($P{参数名称2}) + +减:$P{参数名称1}.subtract($P{参数名称2}) + +乘:$P{参数名称1}.multiply($P{参数名称2}) ;$P{参数名称1}.multiply(new BigDecimal(1.13)) + +除:$P{参数名称1}.divide($P{参数名称2}, 2, BigDecimal.ROUND_HALF_UP) + +#### 4.1、高级语法介绍 + +###### jar包导入:例如金额转大写,研发通过编写一个jar工具包实现特定功能,下面是导入jar包步骤 + + + + + + + +启用成功后按照研发语法实现具体功能,比如 + +###### 从list中取特定的值写入外层表格中:该公式使用jdk1.8语法,jaspersoft6.8可用 + +下面表达式的意思是,从支付方式列表(payItemList) 中找到 + +支付方式(payWay) + +等于“记账”的 + +第一个支付金额(payAmount) + +```java +$P{payItemList}.getData().stream() + .filter(map -> "记账".equals(map.get("payWay"))) + .map(map -> { + Object amt = map.get("payAmount"); + return amt == null ? BigDecimal.ZERO : new BigDecimal(amt.toString()); + }) + .findFirst() + .orElse(BigDecimal.ZERO) +``` + +#### 5、格式预览 + +###### 工具中只能预览模板的样式,涉及到参数判断的需要将模板上传到门店后在F6系统工单中打印预览 + + + + + + + +#### 6、保存+输出 + +###### 保存 + + + +###### 选择.jrxml的文件,右键选择Compile Report 进行编译 + + + +###### 选择.jasper的文件,右键选择Export Files to... + + + +###### 另存到桌面 + + + +#### 7、打印单后台配置 + +###### 新增/编辑模板 + +注意:不要随便删除模板,删除一定要再三确认清楚,避免出现误操作的情况(删除不可恢复) 预计5.16号后 对删除的功能二次确认进行优化。 + + + +###### 模板名称命名规范 + +* **简单调整**\*\***\*\*模板名称:基础表+特殊修改需求** + + +**模板编码:修改人姓名首字母英文大写+模板分类+日期** + +**模板备注:模板各修改点** + + + +* **定制调整**\*\***\*\*模板名称:门店名称+定制** + + +**模板编码:修改人姓名首字母英文大写+模板分类+日期** + +**模板备注:模板各修改点** + + + +###### 给指定门店配置打印单 + + + +#### 8、常见打印分类及对应的通用模板 + +| 常见打印单分类 | 对应系统上的打印模块 | 通用模板名称 | 模板编码 | +| --- | --- | --- | --- | +| 新结算单打印 | 维保单 | F6标准结算单(壹) | newSettleFirst | +| 结算单-新 | 除维保单的其他单据(维修单、贴膜单......) | 无 | 无 | +| 附表-新 | 新附表 | 无 | 无 | +| 销售单 | 销售单 | 销售单(日期版) | xiaoshodanriqiban | +| 洗车单 | 洗车单 | 洗车单 | wash01 | +| 报价单打印 | 报价单 | 报价单打印 | quotationPrint | +| 新库存入库单打印 | 入库单 | 新库存入库单打印 | 9001 | +| 新库存出库单打印 | 出库单 | 新库存出库单打印 | 9002 | +| | | | | +| **注:采购单和采购退货单走打印平台定制,先向赵亚妮提供门店编码、门店名称,开通后再上传配置门店生效** | | | | + +**注意:结算单要在收款后页面打印,请确保模板名称中包含“结算单”三个字** + +> 更新: 2025-05-16 13:54:24 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/报价单接口参数.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/报价单接口参数.md new file mode 100644 index 0000000..7cd7f37 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/报价单接口参数.md @@ -0,0 +1,60 @@ +# 报价单接口参数 + +# 报价单接口参数 + +# 参数说明 + +## 主单信息 + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| partDetailVoList | 材料列表 | | List | +| serviceDetailVoList | 项目列表 | | List | +| amountChinese | 商品金额中文大写 | | | +| realAmountWithoutCardChinese | 待付金额中文大写 | | | + +## QuotationPartDetailPrintVo + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| pkId | 无意义主键 | 是 | BigInteger | +| idOwnOrg | 门店id | 是 | BigInteger | +| idQuotation | 报价单id | 是 | BigInteger | +| idPart | 材料id | 否 | BigInteger | +| partName | 材料名称(非组合,对应材料名称字段) | 是 | String | +| partShowName | 材料在界面上显示的名称(组合供应商编码等信息) | 是 | String | +| idMdmPart | 云材料ID | 否 | String | +| labelId | 业务分类id | 否 | BigInteger | +| labelName | 荣誉的业务分类名称 | 否 | String | +| number | 数量 | 是 | BigDecimal | +| price | 单价 | 是 | BigDecimal | +| subtotal | 总价 | 是 | BigDecimal | +| idEmployee | 服务员工id | 否 | String | +| employeeName | 服务员工姓名 | 否 | String | +| isMember | 套餐2,套餐卡1,普通0 | 是 | byte | +| memo | 备注 | 否 | String | +| discount | 折扣 | 是 | BigDecimal | +| realSubtotal | 折后总计 | 是 | BigDecimal | +| stockNumber | 门店库存数量 | 否 | BigDecimal | +| groupId | 公司id | 是 | BigInteger | +| unit | 单位 | 否 | String | +| spec | 规格型号 | 否 | String | +| brand | 品牌名称 | 否 | String | +| brandId | 品牌id | 否 | String | +| supplierCode | 零件号 | 否 | String | + +## QuotationServiceDetailPrintVo + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| pkId | 无意义主键 | 是 | BigInteger | +| customCode | 项目编码 | 否 | String | +| serviceName | 项目名称 | 是 | String | +| workHour | 工时 | 否 | BigDecimal | +| price | 单价 | 是 | BigDecimal | +| subtotal | 工时费 | 是 | BigDecimal | +| discount | 折扣 | 是 | BigDecimal | +| realSubtotal | 折后金额 | 是 | BigDecimal | +| memo | 备注 | 否 | String | + +> 更新: 2025-05-26 14:19:50 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/收款日报表打印.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/收款日报表打印.jrxml new file mode 100644 index 0000000..a07ae26 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/收款日报表打印.jrxml @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/新版附表打印接口文档.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/新版附表打印接口文档.md new file mode 100644 index 0000000..1ef1678 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/新版附表打印接口文档.md @@ -0,0 +1,243 @@ +# 新版附表打印接口文档 + +# 新版附表打印接口文档 + +# 接口出参 + +| 字段 | 含义 | 类型 | +| --- | --- | --- | +| billNo | 附表单号 | String | +| fromBillNo | 附表源工单号 | String | +| fromMaintainType | 来源单据类型 | String | +| billDate | 进厂日期 | String | +| creatorName | 创建人名称 | String | +| creationtime | 创建时间 | String | +| naEmployee | 服务顾问 | String | +| employeePhone | 服务顾问手机号 | String | +| businessTypeName | 业务类型 | String | +| nextMaintainDate | 下次保养日期 | String | +| oilCapacity | 当前油量 | String | +| mileage | 出厂里程(进厂里程) | Double | +| nextMileage | 下次保养里程 | Double | +| vin | 车辆VIN码 | String | +| carNoWhole | 车牌号 | String | +| carModel | 品牌车型全称 | String | +| carModelShort | 车型简称 | String | +| carColor | 车身颜色 | String | +| carCategoryName | 车辆分类名称 | String | +| carBrandName | 车辆品牌名称 | String | +| carSeriesName | 车系名称 | String | +| engineNumber | 发动机号 | String | +| transmissionNo | 变速箱号 | String | +| registerDate | 车辆注册日期 | String | +| cardDate | 车辆发证日期 | String | +| carNatureOfUseName | 车辆使用性质 | String | +| carFuelTypeName | 车辆燃料(能源)类型 | String | +| carSourceName | 车辆来源 | String | +| carOwnerName | 车辆所有人姓名 | String | +| naCustomer | 客户姓名 | String | +| customerSourceName | 客户来源名称 | String | +| customerDetailAddress | 客户详细地址 | String | +| cellPhone | 联系电话(客户) | String | +| memberCardNo | 会员卡号 | String | +| points | 客户积分 | String | +| customerLevelName | 客户等级名称 | String | +| repairPerson | 送修人 | String | +| repairPersonContact | 送修人联系方式 | String | +| memo | 备注 | String | +| completeDate | 完工日期 | String | +| firstGatheringTime | 初次收款时间 | String | +| estimatedDeliveryTime | 预计交车时间 | String | +| deliveryTime | 交车时间 | String | +| printContent | 免责条款 | String | +| printContentJs | 免责条款江苏 | printContentJs | +| storeLogo | 门店logo | String | +| orgName | 门店名称 | String | +| orgMemo | 门店备注 | String | +| orgContacts | 联系人(维修厂) | String | +| orgContactNumber | 联系电话(维修厂) | String | +| orgDetailAddress | 联系地址(维修厂) | String | +| orgContactMobile | 联系电话(维修厂) | String | +| fax | 传真 | String | +| email | 组织邮件 | String | +| bankAccount | 开户银行 | String | +| accountNumber | 账号 | String | +| businessLicenseCode | 企业执照号 | String | +| channelName | 来店途径名称 | String | +| printOrgName | 打印抬头(需读取配置) | String | +| amountAll | 应收总计(合计金额) | Double | +| amountAllChinese | 应收总计(合计金额)中文大写 | String | +| disCountAll | 总优惠合计(附表:项目优惠+材料优惠+收银优惠) | Double | +| disCountAllBak | 项目优惠+材料优惠+收银优惠,等同于disCountAll | Double | +| amountReal | 实收金额 | Double | +| chineseAmount | 实收金额(中文大写) | Double | +| oweAmount | 未收金额 | Double | +| vipExpense | 套餐卡消费金额(附表为0) | Double | +| vipExpenseFavourable | 套餐卡优惠金额(附表为0) | Double | +| czkExpense | 储值卡消费金额(附表为0) | Double | +| czkExpenseFavourable | 储值卡优惠金额(附表为0) | Double | +| remainAmount | 结算金额tsf附表:应收-项目优惠-材料优惠 | Double | +| receivedAmount | 收款金额tsf附表:等同于已收金额 | Double | +| serviceList | 项目集合 | List | +| └─ sortNumber | 序号 | String | +| └─ orderNumber | 序号(全部) | String | +| └─ name | 名称 | String | +| └─ serviceName | 项目名称 | String | +| └─ labelName | 业务分类名称 | String | +| └─ price | 工时单价 | Double | +| └─ workHour | 工时 | Double | +| └─ subtotal | 金额 | Double | +| └─ singleFavourable | 优惠金额 | Double | +| └─ discountedSubtotal | 折后金额 | Double | +| └─ serviceMemo | 附加信息备注 | String | +| └─ discount | 折扣 | Double | +| └─ empNameStr | 服务项目明细对应修理工名称组装字符串 | String | +| └─ infiniteFlag | 是否无限,0:否,1:是 | Integer | +| └─ customCode | 自定义编码 | String | +| totalWorkHour | 项目工时合计 | Double | +| totalWorkHourVip | VIP项目工时合计(附表为0) | Double | +| serviceSubtotalAll | 工时费小计 | Double | +| serviceSubtotalVip | 服务项目明细小计(会员项目,附表为0) | Double | +| serviceNum | 维修项目小计 | String | +| serviceFavourable | 服务项目(非会员项目)客户等级优惠(附表为0) | Double | +| serviceDiscountFavourable | 项目优惠 | Double | +| serviceFavourableTotal | 项目优惠金额合计 | Double | +| serviceFavourableCommonTotal | 普通项目优惠金额合计 | Double | +| serviceDisCountSubTotal | 项目折后金额合计 | Double | +| partList | 工单对应配件材料集合 | List | +| └─ sortNumber | 序号 | String | +| └─ orderNumber | 序号(全部) | String | +| └─ name | 名称 | String | +| └─ partName | 材料名称 | String | +| └─ partShowName | 材料名称(全) | String | +| └─ partBrand | 配件品牌 | String | +| └─ standard | 配件名称规格型号品牌 | String | +| └─ spec | 规格型号 | String | +| └─ supplierCode | 供应商编码 | String | +| └─ unit | 单位 | String | +| └─ number | 数量 | Double | +| └─ price | 价格(单价) | Double | +| └─ subtotal | 金额(材料金额) | Double | +| └─ discount | 折扣 | Double | +| └─ singleFavourable | 优惠金额 | Double | +| └─ discountedSubtotal | 折后金额 | Double | +| └─ partMemo | 备注 | String | +| └─ customCode | 自定义编码 | String | +| └─ employeeName | 员工名称 | String | +| └─ outStockEmployeeName | 领料人 | String | +| └─ empNameStr | 明细对应修理工名称组装字符串 | String | +| └─ labelName | 业务分类名称 | String | +| └─ idPart | 配件材料pk | BigInteger | +| └─ idInfo | 本地材料id(长码) | String | +| └─ applyModel | 适用车型 | String | +| stuffNum | 材料数目合计 | String | +| totalStuffNum | 材料数量合计 | String | +| totalStuffNumVip | Vip材料数量合计(附表为0) | String | +| stuffSubtotalAll | 材料费小计 | Double | +| stuffSubtotalVip | 材料收入小计(会员项目,附表为0) | Double | +| partinfoFavourable | 材料项目(非会员项目)客户等级优惠(附表为0) | Double | +| partinfoDiscountFavourable | 材料折扣优惠 | Double | +| partFavourableTotal | 材料优惠金额合计 | Double | +| partFavourableCommonTotal | 普通材料优惠金额合计 | Double | +| stuffDisCountTotal | 材料折后金额合计 | Double | +| pointFavourable | 积分优惠(附表为0) | Double | +| packageFavourable | 套餐优惠(附表为0) | Double | +| discountFavourable | 结清优惠(附表为0) | Double | +| gatheringFavourable | 收银优惠 | Double | +| couponFavourable | 优惠券优惠(附表为0) | Double | +| czkDiscountFavourable | 储值卡折扣优惠(附表为0) | Double | +| customerLevelFavourable | 客户级别优惠金额(附表为0) | Double | +| extraChargeList | 附加费用集合 | List | +| └─ sortNumber | 序号 | String | +| └─ extraName | 附加费名称 | String | +| └─ subtotal | 金额 | Double | +| └─ memo | 备注 | String | +| extraCostTotal | 附加费小计 | Double | +| extraNumber | 附加费数量小计 | String | +| managementCost | 管理费 | Double | +| extraPrintVo | 附加项目 | ExtraPrintAttribute | +| └─ commissionCustomName | 代办费自定义名称 | String | +| └─ commissionCost | 代办费金额 | Double | +| └─ commissionMemo | 代办费备注 | String | +| └─ diagnosisCustomName | 诊断费自定义名称 | String | +| └─ diagnosisCost | 诊断费金额 | Double | +| └─ diagnosisItemName | 诊断详细名称 | String | +| └─ diagnosisMemo | 诊断费备注 | String | +| └─ checkCustomName | 检查费自定义名称 | String | +| └─ checkItemName | 诊断详细名称 | String | +| └─ checkCost | 检查费金额 | Double | +| └─ checkMemo | 检查费备注 | String | +| └─ processCustomName | 加工费自定义名称 | String | +| └─ processCost | 加工费金额 | Double | +| └─ processMemo | 加工费备注 | String | +| └─ processItemName | 加工详细名称 | String | +| └─ managementCustomName | 管理费自定义名称 | String | +| └─ managementCost | 管理费金额 | Double | +| └─ managementMemo | 管理费备注 | String | +| └─ fuelName | 加油费 | String | +| └─ fuelAmount | 加油费金额 | Double | +| └─ trailName | 拖车费 | String | +| └─ trailAmount | 拖车费金额 | Double | +| allOtherCost | 附加费合计应收 | Double | +| receiptAmount | 收据金额(附表:应收-项目优惠-材料优惠-收银优惠) | Double | +| receiptAmountChinese | 收据金额中文大写 | String | +| payItemList | 付款方式集合 | List | +| └─ payWay | 付款方式 | String | +| └─ payAmount | 付款金额 | Double | +| └─ chinesePayAmount | 付款金额中文大写 | String | +| payItemTogether | 付款方式拼接 | String | +| payItemTogetherChinese | 付款方式总额中文大写 | String | +| paymentTypeDetails | 支付方式汇总 | String | +| settleOweAmout | 结算单中用的待付金额(未收) | Double | +| settleOweAmoutChinese | 结算单中用的待付金额大写(未收) | String | +| settleReceivedAmout | 结算单中用的实付金额(实收) | Double | +| settleReceivedAmoutChinese | 结算单中用的实付金额大写(未收) | String | +| realPayAmountChinese | 客户实付大写(应收-所有优惠) | String | +| naInsurer | 理赔公司名称 | String | +| insurancepolicyNo | 理赔单理赔保险单号 | String | +| insuranceCompany | 保险公司名称 | String | +| contactName | 联系人姓名 | String | +| contactCellphone | 联系人电话 | String | +| insuranceNo | 商业险单号 | String | +| insuranceNoTCI | 交强险单号 | String | +| insuranceExpiryDate | 商业险到期日 | String | +| insuranceExpiryDateTCI | 交强险到期日 | String | +| printEmployeeName | 打印人姓名 | String | +| printTime | 打印时间 | String | +| printCount | 打印次数 | String | + +# 备注1 + +1. ++新版附表没有“状态”字段,所有模板中切勿使用 billStatus【单据状态】、balanceStatus【结算状态】来进行判断输出;采用直接取值方式填值++ + + 1. ++没有了balanceStatus,采用收款方式列表payItemList判空的方式来验证是否有收款信息++ + + 1. ++收银金额可写作:++$P{payItemList}.getRecordCount()==0?$P{receivedAmount}:$P{receivedAmount}.setScale( 2, BigDecimal.ROUND\_HALF\_EVEN ).toString()+"("+$P{paymentTypeDetails}+")" + + 2. ++待付金额可写作:$P{oweAmount}++ + + 3. ++实付金额可写作:$P{amountReal}++ + + 4. ++合计金额可写作:++$P{payItemList}.getRecordCount()==0?($P{settleOweAmout}).setScale( 2, BigDecimal.ROUND_HALF_EVEN ):($P{settleReceivedAmout}).setScale( 2, BigDecimal.ROUND_HALF_EVEN ) + + 5. ++大写可写作:++$P{payItemList}.getRecordCount()==0?$P{settleOweAmoutChinese}:$P{chineseAmount} + +2. ++新版附表没有“单据类型”字段(原附表的maintainType为"GDFB"、"LPDFB"两种附表类型),所有模板中切勿使用 maintainType【单据类型】字段作为判断条件。根据情况可以取 fromMaintainType【来源单据类型】进行判断。如:++ + + 1. ++是否展示理赔公司、理赔单等理赔相关信息栏,老附表判断逻辑为 maintainType.equals('LPDFB')。可更换为 fromMaintainType.equals('LPD')++ + + +# 备注2 + +1. 出参标注颜色为 **绿 色** 的字段,为 ++**附表本身内容**++(如车牌号、VIN码等) 或 ++**无法变更内容**++(如门店信息等) + + 1. 客户在附表页面直接变更信息,会直观反映在打印内容中。 + +2. 出参标注颜色为 **橙 色** 的字段,为 ++**通过客户ID、车辆ID、项目ID、材料ID**++ 等,++**反查**++ 基础数据获得内容, + + 1. 若客户通过 ++**附表页面选择组件方式**++ 修改附表信息,因ID发生变化,该部分打印内容会随之变化,变更信息将 ++**会体现在打印内容中**++。 + + 2. 若客户通过 ++**手动填写文本内容方式**++ 修改附表信息,因ID未发生变化,该部分打印内容不会变化,变更信息将 ++**不会体现在打印内容中**++,若客户不满意结果,请客户直接将 ++**基础数据进行变更**++ 后,通过页面组件选择后再进行打印。 + + +> 更新: 2024-01-11 12:11:34 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/材料标签接口参数.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/材料标签接口参数.md new file mode 100644 index 0000000..936b0bf --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/材料标签接口参数.md @@ -0,0 +1,61 @@ +# 材料标签接口参数 + +# 材料标签接口参数 + +打印平台模版分类:材料价格通用标签打印 + +材料标签支持一次打多张,与labelList集合里的元素个数相匹配: + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| labelList | 材料标签列表 | | List | +| | | | | + +Label: + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| name | 材料名称 | | String | +| supplierCode | 零件号 | | String | +| customCode | 材料编码 | | String | +| sellPrice | 销售价格 | | BigDecimal | +| date | 打印日期 | | String yyyy/MM/dd | +| | | | | + +# 采购库存材料标签打印 + +### 打印平台模版分类: + +不带供应商信息:采购库存通用标签打印-新 + +带供应商信息:采购库存通用标签打印-包含供应商-新 + + + +### 打印数据体 + +材料标签支持一次打多张,于labelList集合里的元素个数相匹配: + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| labelList | 材料名称 | | List | + +Object: + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| partName | 材料名称 | | String | +| partBrand | 材料品牌 | | String | +| customCode | 材料编码 | | String | +| partShowName | 组合名称(材料品牌,名称,规格型号组合) | | String | +| supplierCode | 材料供应商编码 | | String | +| spec | 材料规格型号 | | String | +| unit | 材料单位 | | String | +| barCode | 材料编码 | | String | +| billDate | 单据日期 | | String yyyy-MM-dd | +| supplierName | 供应商名称 | | String | +| storageName | 材料仓库名称 | | String | +| defSeat | 材料货位 | | String | +| date | 打印的当前日期 | | String yyyy/MM/dd | + +> 更新: 2023-09-14 14:27:45 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/检测估算单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/检测估算单.jrxml new file mode 100644 index 0000000..4885f84 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/检测估算单.jrxml @@ -0,0 +1,3125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 26 ? $P{carModel}.substring( 0,26 )+"..." :$P{carModel}]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 26 ? $P{customerMemo}.substring( 0,26 )+"..." :$P{customerMemo}]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7]]> + + + + + + + + + + 7]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7]]> + + + + + + + + + + 7]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7]]> + + + + + + + + + + 7]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13*$F{childList}.getData().size() ? $F{memo}.substring( 0,13*$F{childList}.getData().size() )+"..." :$F{memo}]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14 ? $F{memo}.substring( 0,14 )+"..." :$F{memo}]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/检测单接口参数.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/检测单接口参数.md new file mode 100644 index 0000000..fd833b1 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/检测单接口参数.md @@ -0,0 +1,100 @@ +# 检测单接口参数 + +# 检测单接口参数 + +# 参数说明 + +## 主单信息 + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| carCheckPackageName | 模板名称 | | String | +| title | 标题 | | String | +| billNo | 检测单号 | | String | +| printTime | 打印时间 | | String | +| naEmployee | 服务顾问 | | String | +| billDate | 进厂时间 | | String | +| deliveryTime | 预计交车 | | String | +| naCustomer | 车主 | | String | +| carModel | 车型 | | String | +| cellPhone | 车主电话 | | String | +| carNoWhole | 车牌号 | | String | +| vin | vin码 | | String | +| repairPerson | 送修人 | | String | +| repairPersonContact | 送修人联系方式 | | String | +| mileage | 进厂里程 | | String | +| oilCapacity | 进厂油量 | | String | +| nextMileage | 下次保养里程 | | String | +| nextMaintainDate | 下次保养日期 | | String | +| customerMemo | 车主描述 | | String | +| merchantAddress | 联系地址 | | String | +| merchantPhone | 联系方式(手机 + 固定电话) | | String | +| qrCode | 二维码 | | String | +| qrCodeToB | 新版检测单B端二维码 | | String | +| qrCodeToC | 新版检测单C端二维码 | | String | +| icon | 车辆环视图 | | String | +| maintainBillNo | 结算单号 | | String | +| showComputerCheckInfo | 是否展示电脑检测 | | Boolean | +| computerCheckInfoList | 电脑检测 | | List | +| personalCheckInfoList | 包含正常和异常人工检测项 | | List | +| sortedPersonalCheckInfoList | 包含正常和异常人工检测项,问题项目排序靠前 | | List | +| optionPersonalCheckInfoList | 异常人工检测项 | | List | +| normalPersonalCheckInfoList | 正常人工检测项 | | List | +| iconMemo | 环视图备注 | | String | +| iconResult | 环视图结论 | | String | +| warningLightResult | 警示灯结论 | | String | +| warningLightMemo | 警示灯备注 | | String | +| showWarningLightItem | 是否展示警示灯 | | Boolean | +| warningLightItemList | 警示灯 | | List | +| warningLightBrightItemUrls | 警示灯列表字符串 | | String | +| employeeName | 服务技师 | | String | +| | | | | + +## ComputerPrintItem + +| 字段 | 含义 | 类型 | +| --- | --- | --- | +| index | 序号 | String | +| errorCode | 故障码 | String | +| itemName | 检测项目 | String | +| optionNameS | 建议处理(Y) | String | +| optionNameE | 择期处理(Y) | String | +| optionNameU | 急需处理(Y) | String | +| memo | 备注 | String | +| | | | +| | | | +| | | | +| | | | +| | | | + +## PersonalPrintItem(检测小类) + +| 字段 | 含义 | 类型 | +| --- | --- | --- | +| index | 序号 | BigInteger | +| itemComponent | 检测部件(小类名称) | String | +| memo | 备注 | String | +| childList | 子项目列表 | List | + +## PrintTinyItem(检测项目) + +| 字段 | 含义 | 类型 | +| --- | --- | --- | +| itemName | 检测项目 | String | +| itemResults | 检测结果 | String | +| optionNameS | 建议处理 Y | String | +| optionNameE | 择期处理 Y | String | +| optionNameU | 急需处理 Y | String | +| memo | 备注 | String | + +## ComputerPrintItem + +| 字段 | 含义 | 类型 | +| --- | --- | --- | +| warningIconCode | 警示灯 | String | +| | | | +| | | | +| | | | +| | | | + +> 更新: 2025-02-25 13:55:59 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/洗车单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/洗车单.jrxml new file mode 100644 index 0000000..62e59e9 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/洗车单.jrxml @@ -0,0 +1,1135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/洗车单小票.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/洗车单小票.jrxml new file mode 100644 index 0000000..5ab5b00 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/洗车单小票.jrxml @@ -0,0 +1,842 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 ? 10 : $P{naCustomer}.length(), $P{naCustomer}.length())]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 ? 7 : $P{cellPhone}.length(), $P{cellPhone}.length())]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 ? $F{serviceName}.replaceAll("卡消费",$F{empNameStr}): $F{serviceName}+"("+$F{empNameStr}+")"]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/消费单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/消费单.jrxml new file mode 100644 index 0000000..76ebdfc --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/消费单.jrxml @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/结算单(指定内容)接口文档.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/结算单(指定内容)接口文档.md new file mode 100644 index 0000000..aff8dd9 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/结算单(指定内容)接口文档.md @@ -0,0 +1,215 @@ +# 结算单(指定内容)接口文档 + +# 结算单(指定内容)接口文档 + +# 接口 + +**接口: /blazer/maintenance/pr****int/file/dispatchCondition** + +**方法: post** + +**支持场景:打印 维保单/洗车单/维修单/贴膜单/理赔单/零售单,支持指定(项目/材料/附加费)打印** + +**支持打印模块(**PrintModuleEnum**):****工时费、材料费、附加费、其他费用、服务费用** + +**入参:** + +```plaintext +{ + "rowId": "10329", + "rowCode": "partialSettlementStatement", + "pkId": "16126085167868551253", + "serviceList": [ + { + "pkId": 16126085168250232896, + "module": 1 + }, + { + "pkId": 16155904656688554043, + "module": 4 + } + ], + "partList": [ + { + "pkId": 11004336, + "module": 2 + }, + { + "pkId": 11004811, + "module": 5 + } + ], + "extraList": [ + { + "type": 4, + "module": 3 + }, + { + "type": 6, + "module": 4 + } + ] +} +``` + +**出参:** + +```plaintext +{ + "preScanUrl": "https://f.f6yc.com/printserver/pdfprint.html?url=https://f.f6yc.com/print-server/test/2024-10/default/49be06dc15444e2793a21fc8c16d3b5c.pdf?Expires=1729152323&OSSAccessKeyId=LTAI4Fcf2C1U99o3e3UQ2bHV&Signature=L86HWRF2ilyXU4BbzKhwXad%2BwXg%3D", + "url": "https://f.f6yc.com/print-server/test/2024-10/default/49be06dc15444e2793a21fc8c16d3b5c.pdf?Expires=1729152323&OSSAccessKeyId=LTAI4Fcf2C1U99o3e3UQ2bHV&Signature=L86HWRF2ilyXU4BbzKhwXad%2BwXg%3D" +} +``` + +# jasper取参说明 + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| billNo | 工单号 | 是 | String | +| maintainType | 工单类型 | 是 | String | +| businessTypeName | 业务类别 | 是 | String | +| balanceStatus | 结算状态 | 是 | String | +| billStatus | 单据状态 | 是 | String | +| creatorName | 创建人名称 | 是 | String | +| naEmployee | 服务顾问 | 否 | String | +| employeePhone | 服务顾问手机号 | 否 | String | +| naInsurer | 理赔公司名称 | 否 | String | +| insurancepolicyNo | 理赔保险单号 | 否 | Double | +| serviceSubtotalVip | 套餐卡项目工时费小计 | 是 | Double | +| serviceFavourableCommonTotal | 普通项目优惠金额合计 | 是 | Double | +| totalStuffNum | 材料数量合计 | 是 | String | +| stuffSubtotalVip | 套餐卡项目材料费小计 | 是 | Double | +| stuffSubtotalAll | 材料费小计 | 是 | Double | +| partFavourableCommonTotal | 普通材料优惠金额合计 | 是 | Double | +| extraNumber | 附加费数量小计 | 是 | String | +| extraCostTotal | 附加费小计 | 是 | Double | +| favourableTotalList | 优惠明细小计 | 否 | List | +| naCustomer | 客户姓名 | 是 | String | +| cellPhone | 客户联系电话 | 是 | String | +| repairPerson | 送修人 | 否 | String | +| repairPersonContact | 送修人联系方式 | 否 | String | +| carNoWhole | 车牌号 | 是 | String | +| vin | 车辆VIN码 | 否 | String | +| carBrandName | 品牌名称 | 否 | String | +| carSeriesName | 车系名称 | 否 | String | +| carModelShort | 车型简称 | 否 | String | +| carModel | 车型 | 否 | String | +| transmissionNo | 变速箱号 | 否 | String | +| carFuelTypeName | 燃料类型 | 否 | String | +| carColor | 车身颜色 | 否 | String | +| billDate | 进厂日期 | 是 | String | +| estimatedDeliveryTime | 预计交车时间 | 是 | String | +| deliveryTime | 交车时间(出厂时间) | 是 | String | +| mileage | 进厂里程 | 是 | Double | +| nextMaintainDateRemind | 下次服务时间(服务提醒数据源) | 否 | Date | +| nextMileageRemind | 下次服务里程(服务提醒数据源) | 否 | Double | +| serviceList | 项目列表 | 否 | List | +| partList | 材料列表 | 否 | List | +| extraChargeList | 附加费列表 | 否 | List | +| extendedModuleList | 扩展模块列表 | 否 | List | +| memo | 车主备注 | 否 | String | +| signaturePhotoUrl | 签名图片 | 否 | String | +| orgName | 维修厂名称 | 是 | String | +| orgContacts | 维修厂联系人 | 是 | String | +| orgDetailAddress | 维修厂地址 | 是 | String | +| orgContactMobile | 联系电话(维修厂) | 否 | String | +| storeLogo | logo | 否 | String | +| printOrgName | 打印抬头 | 否 | String | +| printContent | 免责条款 | 是 | String | +| printCount | 打印次数 | 是 | String | +| printTime | 打印时间 | 是 | String | + +**PartialServicePrintAttribute** + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| serviceName | 项目名称 | 是 | String | +| labelName | 业务分类名称 | 是 | String | +| isMember | 当前项目是否使用会员 | 是 | String | +| idService | 服务项目id | 是 | BigInteger | +| idInfo | 本地项目id | 是 | String | +| price | 工时单价 | 是 | Double | +| workHour | 工时 | 是 | Double | +| subtotal | 金额 | 是 | Double | +| singleFavourable | 优惠金额 | 是 | Double | +| discountedSubtotal | 折后金额 | 是 | Double | +| serviceMemo | 附加信息备注 | 否 | String | +| discount | 折扣 | 是 | Double | +| empNameStr | 服务项目明细对应修理工名称组装字符串 | 否 | String | +| favourableVoList | 优惠明细 | 否 | List | + +**PartialPartPrintAttribute** + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| partName | 材料名称 | 是 | String | +| partShowName | 材料名称(全) | 是 | String | +| partBrand | 配件品牌 | 是 | String | +| unit | 单位 | 是 | String | +| number | 数量 | 是 | Double | +| isMember | 当前项目是否使用会员 | 是 | Integer | +| price | 价格(单价) | 是 | Double | +| subtotal | 金额(材料金额) | 是 | Double | +| discount | 折扣 | 是 | Double | +| singleFavourable | 优惠金额 | 是 | Double | +| discountedSubtotal | 折后金额 | 是 | Double | +| partMemo | 备注 | 否 | String | +| isBring | 是否自带 | 是 | String | +| empNameStr | 明细对应修理工名称组装字符串 | 否 | String | +| outStockEmployeeName | 领料人 | 否 | String | +| labelName | 业务分类名称 | 是 | String | +| idPart | 配件材料pk | 是 | BigInteger | +| idInfo | 本地材料id | 是 | String | +| favourableVoList | 优惠明细 | 否 | List | + +**ExtraChargePrintAttribute** + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| extraName | 附加费名称 | 是 | String | +| subtotal | 金额 | 是 | Double | +| memo | 备注 | 否 | String | + + +**FavourableDetailPrintAttribute** + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| discountType | 优惠类型 | 是 | Integer | +| discountTypeName | 优惠类型名称 | 是 | Double | +| amount | 优惠金额 | 是 | Double | + + + +**ExtendedModulePrintAttribute** + +| 字段 | 含义 | 是否必有 | 类型 | +| --- | --- | --- | --- | +| module | 打印模块,PrintModuleEnum.code | 是 | Integer | +| name | 项目/材料/附加费名称 | 是 | String | +| number | 项目对应工时,材料对应数量,附加费为“-” | 是 | Double | +| price | 项目对应工时单价,材料对应材料单价,,附加费为“-” | 是 | Double | +| subtotal | 项目对应工时费,材料对应材料费,附加费对应为金额 | 是 | Double | +| discount | 项目对应折扣,材料对应折扣,附加费为“1.00” | 是 | Double | +| discountedSubtotal | 项目对应折后金额,材料对应材料费折后金额,,附加费对应为金额 | 是 | Double | +| favourableVoList | 优惠明细 | 否 | List | + +**PrintModuleEnum 打印模块枚举** + +| **key** | **code** | **name** | +| --- | --- | --- | +| MAN\_HOUR\_COST | 1 | 工时费模块 | +| MATERIAL\_COST | 2 | 材料费模块 | +| EXTRA\_COST | 3 | 附加费模块 | +| OTHER\_COST | 4 | 其他费用模块 | +| SERVICE\_COST | 5 | 服务费用模块 | + +# 工具类jar包附件下载 + +[附件: print-core-1.0.7.jar](./attachments/JUhN4OhWjosFCdDg/print-core-1.0.7.jar) + +### 数字金额转中文方法调用示例: + +**数字金额**:$P{amount}==null?BigDecimal.ZERO:$P{amount} **转中文**:com.f6car.printserver.core.CharacterUtil.chinese($P{amount}==null?BigDecimal.ZERO:$P{amount}) + +> 更新: 2024-10-17 15:07:46 原文: \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/调拨单打印.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/调拨单打印.md new file mode 100644 index 0000000..f8f7848 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/调拨单打印.md @@ -0,0 +1,64 @@ +# 调拨单打印 + +# 采购单模版打印说明 + +* 前端调用接口 + + +/stock/allot/print?idAllot= + +* 打印使用模版 + + +模版编码=allotInPrint + + + +* 打印模版参数 + + +HashMap resultMap + +| 字段 | 说明 | 备注 | +| --- | --- | --- | +| printFlag | 均价门店 false批次门店 true | | +| showPrice | 参配-打印调拨价格及金额勾选 true未勾选 false | | +| orgName | 打印抬头调入门店打印:XXX调入单调出门店打印:XXX调出单 | | +| billNo | 调拨单号调入门店打印:DRDXXX调出门店打印:DCDXXX | | +| idOwnOrg | 门店ID调入门店打印:调入门店ID调出门店打印:调出门店ID | | +| naOrgIn | 调入门店名称 | | +| naOrgOut | 调出门店名称 | | +| detailAddress | 供应商详细地址 | | +| statusName | 调拨单状态(制单/待发货/待收货/已完成) | | +| billDate | 单据日期(yyyy-MM-dd) | | +| creatorName | 创建单名称 | | +| nowDateTime | 打印时间(yyyy-MM-dd HH:mm) | | +| remark | 备注信息 | | +| showRemark | 是否显示备注备注为空 false备注不为空 true | | +| sumNumber | 总数量 | | +| sumAmount | 总金额价格脱敏时显示 \*\*\*\* | | +| printCount | 打印次数 | | +| allotDetailVoList | 调拨单明细行 | | +| sortNumber | 序号 | | +| partShowName | 材料组合名称 | | +| customCode | 材料自定义编码 | | +| partName | 材料名称 | 20250731追加 | +| partBrand | 材料品牌 | 20250731追加 | +| supplierCode | 材料零件号 | 20250731追加 | +| standard | 材料规格型号 | 20250731追加 | +| carNo | 车牌 | 20250731追加 | +| defSeat | 货位调入门店打印:调入门店货位调出门店打印:调出门店货位 | | +| unit | 单位 | | +| price | 单价价格脱敏时显示 \*\*\*\* | | +| numCus | 均价门店 调拨个数批次门店&制单&未选择批次 调拨个数批次门店 选择或使用的批次个数 | | +| amount | 均价门店 调拨明细行金额批次门店&制单&未选择批次 调拨明细行金额批次门店 选择或使用的批次个数\*调拨单单价备注:价格脱敏时显示 \*\*\*\* | | +| orderNo | 批次号 | | +| productDate | 批次生成日期 | | +| 明细合计行 | | | +| sortNumber | 合计行 | | +| partShowName | "" | | +| unit | "" | | +| numCus | 总数量 | | +| amount | 总金额价格脱敏时显示 \*\*\*\* | | +| defSeat | "" | | +| stockNumber | "" | | \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/退卡单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/退卡单.jrxml new file mode 100644 index 0000000..d70e6df --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/退卡单.jrxml @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/退货单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/退货单.jrxml new file mode 100644 index 0000000..288991a --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/退货单.jrxml @@ -0,0 +1,1586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/采购单_采购退模版打印.md b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/采购单_采购退模版打印.md new file mode 100644 index 0000000..7f14a4e --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/采购单_采购退模版打印.md @@ -0,0 +1,3 @@ +# 采购单/采购退模版打印 + +[《采购单/采购退打印》](https://alidocs.dingtalk.com/i/nodes/7NkDwLng8ZMajY9YijOwlz4bJKMEvZBY) \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/销售单.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/销售单.jrxml new file mode 100644 index 0000000..b3fbffa --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/销售单.jrxml @@ -0,0 +1,1428 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/销售单小票.jrxml b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/销售单小票.jrxml new file mode 100644 index 0000000..a45d0ea --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/5a1ba1acd39344d79602df3e38ff52a8/raw/销售单小票.jrxml @@ -0,0 +1,922 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 ? 10 : $P{naCustomer}.length(), $P{naCustomer}.length())]]> + + + + + + + + + + + + 7 ? 7 : $P{cellPhone}.length(), $P{cellPhone}.length())]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/db5e3844c382439dba91c29f4f29eeca/meta.json b/kb_data/d198ae3b32cd49f09736c4290dd1223a/db5e3844c382439dba91c29f4f29eeca/meta.json new file mode 100644 index 0000000..4a70d58 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/db5e3844c382439dba91c29f4f29eeca/meta.json @@ -0,0 +1,13 @@ +{ + "kb_id": "db5e3844c382439dba91c29f4f29eeca", + "user_id": "d198ae3b32cd49f09736c4290dd1223a", + "name": "测试csv", + "description": "csv", + "created_at": "2026-05-23T15:31:44.119922+00:00", + "updated_at": "2026-05-23T15:31:44.119922+00:00", + "fields": [], + "templates": [], + "file_count": 0, + "chunk_count": 0, + "parse_status": "empty" +} \ No newline at end of file diff --git a/kb_data/d198ae3b32cd49f09736c4290dd1223a/profile.json b/kb_data/d198ae3b32cd49f09736c4290dd1223a/profile.json new file mode 100644 index 0000000..31949d2 --- /dev/null +++ b/kb_data/d198ae3b32cd49f09736c4290dd1223a/profile.json @@ -0,0 +1,5 @@ +{ + "user_id": "d198ae3b32cd49f09736c4290dd1223a", + "name": "默认用户", + "created_at": "2026-05-23T12:19:43.785929+00:00" +} \ No newline at end of file diff --git a/kb_data/users.json b/kb_data/users.json new file mode 100644 index 0000000..43378b6 --- /dev/null +++ b/kb_data/users.json @@ -0,0 +1,12 @@ +[ + { + "user_id": "d198ae3b32cd49f09736c4290dd1223a", + "name": "默认用户", + "created_at": "2026-05-23T12:19:43.785929+00:00" + }, + { + "user_id": "2db10c2ebbf6434aab28035026e196c3", + "name": "SmokeTest", + "created_at": "2026-05-23T12:21:32.399217+00:00" + } +] \ No newline at end of file diff --git a/prompts/correction.md b/prompts/correction.md index b7d2f84..262dca7 100644 --- a/prompts/correction.md +++ b/prompts/correction.md @@ -25,4 +25,6 @@ {fidelity_context} +{template_context} + 立即生成修正后的 JRXML: diff --git a/prompts/field_mapping.md b/prompts/field_mapping.md index 17f6fb4..1c0f707 100644 --- a/prompts/field_mapping.md +++ b/prompts/field_mapping.md @@ -1,16 +1,23 @@ 你是一位资深 JasperReports 工程师。当前有一个 JRXML 使用占位字段名($F{{field_1}}, $F{{field_2}}, ...),需要替换为从 OCR 提取的真实字段名。 +**你必须基于已有的 JRXML 进行修改,而不是重新生成。保留所有现有的元素,只替换字段名。** + 关键规则: - 只输出完整修改后的 JRXML 代码,不要解释,不要 markdown 标记。 +- **保留所有现有的 field、staticText、textField、band、reportElement 元素,一个都不能少。** +- **不要删除、简化、合并或重写任何元素。不要改动任何坐标值(x, y, width, height)。** - 将每个 $F{{field_N}} 占位符替换为 OCR 提取结果中对应的真实字段名。 - 替换规则:根据列的顺序映射——$F{{field_1}} 对应第 1 列的 OCR 字段名,$F{{field_2}} 对应第 2 列,以此类推。 -- 同时更新 声明和所有 $F{{...}} 表达式中的引用。 +- 同时更新 field name="..." 声明和所有 $F{{...}} 表达式中的引用。 - 如果 OCR 提取的字段数少于占位字段数,保留多余的占位字段。 - 不要修改 band 结构、元素位置或大小。 - 确保 JRXML 兼容 JasperReports 7.0.6。 +- **输出的 JRXML 字符数应与输入的 JRXML 大致相同(允许 ±15% 偏差),因为只替换字段名,不增删修改任何元素。** 当前 JRXML(含占位字段): {current_jrxml} +{template_context} + OCR 提取的结构化字段: {ocr_fields} diff --git a/prompts/initial_generation.md b/prompts/initial_generation.md index 48b43e1..a3b6a30 100644 --- a/prompts/initial_generation.md +++ b/prompts/initial_generation.md @@ -11,5 +11,7 @@ JRXML 必须兼容 JasperReports 7.0.6 schema。 参考模板和组件: {context} +{template_context} + 用户需求: {user_request} diff --git a/prompts/modification.md b/prompts/modification.md index 933cf1c..bc13761 100644 --- a/prompts/modification.md +++ b/prompts/modification.md @@ -10,6 +10,8 @@ {ocr_context} +{template_context} + 当前 JRXML: {current_jrxml} diff --git a/prompts/refine_layout.md b/prompts/refine_layout.md index d6277f3..c1ffa9f 100644 --- a/prompts/refine_layout.md +++ b/prompts/refine_layout.md @@ -1,17 +1,23 @@ -你是一位资深 JasperReports 工程师。当前有一个骨架 JRXML,需要根据精确的像素坐标调整每个元素的位置。 +你是一位 JRXML 坐标调整器。你的唯一任务是修改 标签内的 x, y, width, height 属性值。 -关键规则: -- 只输出完整修改后的 JRXML 代码,不要解释,不要 markdown 标记。 -- 根据提供的采样坐标,精确调整每个 textField/staticText 的 x, y, width, height。 -- 表头行的坐标直接使用采样坐标中 header_row 对应列的 x, y, width, height。 -- 数据行:根据 first_data_row 的坐标模式,向下插值生成剩余数据行(每行 y 递增行高)。 -- 标题行(如有)和表尾行:保持其在骨架中的 y 位置大致不变,但调整 x 和 width 与列的采样坐标对齐。 -- 不要修改字段名(保持 $F{{field_N}} 占位名不变)。 -- 不要修改 band 结构。 -- 确保 JRXML 兼容 JasperReports 7.0.6。 +**这是 Band "{band_name}"(高度 {band_height}px)的第 {window_index}/{total_windows} 个窗口。你只看到该 band 的一个片段,不要尝试生成完整报表。** -当前骨架 JRXML: -{current_jrxml} +严格规则: +- 只修改 x, y, width, height。不改任何其他内容。 +- 不添加、删除、重命名任何元素。 +- 不修改文本内容(CDATA)、表达式(textFieldExpression)、样式属性。 +- 只输出修改后的 XML 片段,不要解释,不要 markdown,不要代码块标记。 +- 输出的字符数应与输入片段大致相同。 -采样坐标(表头行 + 第一行数据行,像素位置): +坐标调整规则: +- 表头行:直接使用 header_row 对应列的 x, y, width, height +- 数据行:根据 first_data_row 的坐标模式,向下插值(每行 y 递增行高) +- 标题行和表尾行:保持 y 位置大致不变,但调整 x 和 width 与列的采样坐标对齐 + +{template_context} + +采样坐标参考: {sampled_coordinates} + +请调整以下片段的坐标: +{xml_fragment} diff --git a/prompts/skeleton_generation.md b/prompts/skeleton_generation.md index 4110c2a..2551a1f 100644 --- a/prompts/skeleton_generation.md +++ b/prompts/skeleton_generation.md @@ -15,5 +15,7 @@ 参考模板和组件: {context} +{template_context} + 用户需求: {user_request} diff --git a/scripts/init_default_kb.py b/scripts/init_default_kb.py new file mode 100644 index 0000000..ac823ae --- /dev/null +++ b/scripts/init_default_kb.py @@ -0,0 +1,134 @@ +"""初始化默认用户和预置知识库。 + +解析 rag/jrxml_source/ 下的全部 JRXML 模板 + 接口文档, +创建默认用户 "默认用户" 和知识库 "F6-汽车维修打印默认知识库", +执行完整的 parse -> chunk -> embed 管线。 + +用法: + python scripts/init_default_kb.py + python scripts/init_default_kb.py --force # 强制重建 +""" + +import os +import sys +import argparse +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(PROJECT_ROOT)) + +from dotenv import load_dotenv +load_dotenv() + +from backend.logger import get_logger + +_log = get_logger("init_kb") + +DEFAULT_USER_NAME = "默认用户" +DEFAULT_KB_NAME = "F6-汽车维修打印默认知识库" +DEFAULT_KB_DESC = "预置的汽车维修打印单模板与接口文档知识库" + + +def find_source_files(source_dir: Path) -> list[str]: + """收集源目录下的所有 .jrxml 和 .md 文件。""" + files = [] + if not source_dir.exists(): + _log.warning("源目录不存在: %s", source_dir) + return files + + for pattern in ("*.jrxml", "*.md", "**/*.jrxml", "**/*.md"): + for fp in source_dir.glob(pattern): + if fp.is_file(): + files.append(str(fp)) + + return list(dict.fromkeys(files)) + + +def init_default_kb(force: bool = False) -> dict: + """初始化默认 KB,返回结果摘要。""" + from backend.kb_manager import create_user, list_users, create_kb, list_kbs + from backend.kb_parser import build_kb_from_files + + # 1. 查找或创建默认用户 + users = list_users() + default_user = None + for u in users: + if u.get("name") == DEFAULT_USER_NAME: + default_user = u + break + + if default_user is None: + default_user = create_user(DEFAULT_USER_NAME) + _log.info("创建默认用户: %s", default_user["user_id"]) + else: + _log.info("默认用户已存在: %s", default_user["user_id"]) + + user_id = default_user["user_id"] + + # 2. 查找或创建默认 KB + user_kbs = list_kbs(user_id) + default_kb = None + for kb in user_kbs: + if kb.get("name") == DEFAULT_KB_NAME: + default_kb = kb + break + + if default_kb is not None and force: + from backend.kb_manager import delete_kb + delete_kb(default_kb["kb_id"]) + default_kb = None + _log.info("强制重建: 已删除旧 KB") + + if default_kb is None: + default_kb = create_kb(user_id, DEFAULT_KB_NAME, DEFAULT_KB_DESC) + _log.info("创建默认知识库: %s", default_kb["kb_id"]) + elif default_kb.get("parse_status") == "ready": + _log.info("默认知识库已就绪: chunks=%s", default_kb.get("chunk_count", 0)) + return {"status": "already_ready", "kb_id": default_kb["kb_id"], + "user_id": user_id, "chunk_count": default_kb.get("chunk_count", 0)} + + kb_id = default_kb["kb_id"] + + # 3. 收集源文件 + source_dir = PROJECT_ROOT / "rag" / "jrxml_source" + files = find_source_files(source_dir) + if not files: + _log.warning("未找到源文件,跳过构建") + return {"status": "no_files", "kb_id": kb_id, "user_id": user_id} + + _log.info("找到 %d 个源文件", len(files)) + + # 4. 构建 KB + result = build_kb_from_files(kb_id, files) + _log.info("KB 构建完成: %s", result) + + return {**result, "kb_id": kb_id, "user_id": user_id, "file_count": len(files)} + + +def main(): + parser = argparse.ArgumentParser(description="初始化默认知识库") + parser.add_argument("--force", action="store_true", help="强制重建(删除已有 KB)") + args = parser.parse_args() + + print("=" * 60) + print("JRXML Agent - 默认知识库初始化") + print("=" * 60) + + result = init_default_kb(force=args.force) + + print(f"\n用户: {DEFAULT_USER_NAME}") + print(f"知识库: {DEFAULT_KB_NAME}") + print(f"状态: {result.get('status', 'unknown')}") + print(f"字段数: {result.get('field_count', 0)}") + print(f"模板数: {result.get('template_count', 0)}") + print(f"Chunk数: {result.get('chunk_count', 0)}") + if result.get("errors"): + print(f"错误: {len(result['errors'])} 条") + for e in result["errors"]: + print(f" - {e.get('file', '')}: {e.get('error', '')}") + + print("\n初始化完成!") + + +if __name__ == "__main__": + main() diff --git a/start.py b/start.py index cd6bed9..7da3775 100644 --- a/start.py +++ b/start.py @@ -104,9 +104,10 @@ def main(): subprocess.run(["npm", "install"], cwd=str(FRONTEND_DIR), check=True) subprocess.Popen( - ["npm", "run", "dev"], + "npm run dev", cwd=str(FRONTEND_DIR), creationflags=subprocess.CREATE_NO_WINDOW, + shell=True, ) if not wait_port(5173): print("[FAIL] Frontend did not start in time.") diff --git a/tests/test_api_integration.py b/tests/test_api_integration.py index b85f559..411d287 100644 --- a/tests/test_api_integration.py +++ b/tests/test_api_integration.py @@ -265,3 +265,249 @@ class TestBoundaries: json={"text": large_text, "file_ids": []}, ) as resp: assert resp.status_code == 200 + + +# ── 用户 CRUD API ─────────────────────────────────────────────── + +class TestUserAPI: + @pytest.fixture(autouse=True) + def temp_kb_data(self, monkeypatch, tmp_path): + kb_data = tmp_path / "kb_data" + monkeypatch.setattr("backend.kb_manager.KB_DATA_DIR", kb_data) + monkeypatch.setattr("backend.kb_manager._USERS_FILE", kb_data / "users.json") + yield kb_data + + def test_create_user(self, client): + resp = client.post("/api/users", json={"name": "测试用户"}) + assert resp.status_code == 200 + data = resp.json() + assert data["name"] == "测试用户" + assert len(data["user_id"]) >= 12 + + def test_create_user_empty_name_rejected(self, client): + resp = client.post("/api/users", json={"name": ""}) + assert resp.status_code == 400 + + def test_list_users(self, client): + client.post("/api/users", json={"name": "A"}) + client.post("/api/users", json={"name": "B"}) + resp = client.get("/api/users") + assert resp.status_code == 200 + assert len(resp.json()["users"]) == 2 + + def test_get_user(self, client): + uid = client.post("/api/users", json={"name": "张三"}).json()["user_id"] + resp = client.get(f"/api/users/{uid}") + assert resp.status_code == 200 + assert resp.json()["name"] == "张三" + + def test_get_user_not_found(self, client): + resp = client.get("/api/users/deadbeef1234567890abcd") + assert resp.status_code == 404 + + def test_delete_user(self, client): + uid = client.post("/api/users", json={"name": "待删除"}).json()["user_id"] + resp = client.delete(f"/api/users/{uid}") + assert resp.status_code == 200 + assert resp.json()["status"] == "deleted" + assert client.get(f"/api/users/{uid}").status_code == 404 + + def test_delete_nonexistent_user(self, client): + resp = client.delete("/api/users/deadbeef1234567890abcd") + assert resp.status_code == 404 + + +# ── 知识库 CRUD API ───────────────────────────────────────────── + +class TestKbAPI: + @pytest.fixture(autouse=True) + def setup_kb(self, monkeypatch, tmp_path): + kb_data = tmp_path / "kb_data" + monkeypatch.setattr("backend.kb_manager.KB_DATA_DIR", kb_data) + monkeypatch.setattr("backend.kb_manager._USERS_FILE", kb_data / "users.json") + # 使用 raw TestClient 来创建前置用户 + from fastapi.testclient import TestClient as TC + tc = TC(app) + resp = tc.post("/api/users", json={"name": "KB测试用户"}) + self.uid = resp.json()["user_id"] + + def test_create_kb(self, client): + resp = client.post(f"/api/users/{self.uid}/kbs", json={"name": "测试库", "description": "描述"}) + assert resp.status_code == 200 + data = resp.json() + assert data["name"] == "测试库" + assert data["parse_status"] == "empty" + + def test_create_kb_empty_name_rejected(self, client): + resp = client.post(f"/api/users/{self.uid}/kbs", json={"name": ""}) + assert resp.status_code == 400 + + def test_list_kbs(self, client): + client.post(f"/api/users/{self.uid}/kbs", json={"name": "KB1"}) + client.post(f"/api/users/{self.uid}/kbs", json={"name": "KB2"}) + resp = client.get(f"/api/users/{self.uid}/kbs") + assert resp.status_code == 200 + assert len(resp.json()["kbs"]) == 2 + + def test_get_kb(self, client): + kid = client.post(f"/api/users/{self.uid}/kbs", json={"name": "查询库"}).json()["kb_id"] + resp = client.get(f"/api/kbs/{kid}") + assert resp.status_code == 200 + assert resp.json()["name"] == "查询库" + + def test_get_kb_not_found(self, client): + resp = client.get("/api/kbs/deadbeef1234567890abcd") + assert resp.status_code == 404 + + def test_delete_kb(self, client): + kid = client.post(f"/api/users/{self.uid}/kbs", json={"name": "待删库"}).json()["kb_id"] + resp = client.delete(f"/api/kbs/{kid}") + assert resp.status_code == 200 + assert resp.json()["status"] == "deleted" + + def test_kb_status(self, client): + kid = client.post(f"/api/users/{self.uid}/kbs", json={"name": "状态库"}).json()["kb_id"] + resp = client.get(f"/api/kbs/{kid}/status") + assert resp.status_code == 200 + assert resp.json()["parse_status"] == "empty" + assert resp.json()["file_count"] == 0 + + def test_kb_fields(self, client): + kid = client.post(f"/api/users/{self.uid}/kbs", json={"name": "字段库"}).json()["kb_id"] + resp = client.get(f"/api/kbs/{kid}/fields") + assert resp.status_code == 200 + assert resp.json()["fields"] == [] + assert resp.json()["templates"] == [] + + +# ── KB 文件上传 & 构建 API ────────────────────────────────────── + +class TestKbUploadBuild: + @pytest.fixture(autouse=True) + def setup_up(self, monkeypatch, tmp_path): + kb_data = tmp_path / "kb_data" + kb_data.mkdir(parents=True, exist_ok=True) + monkeypatch.setattr("backend.kb_manager.KB_DATA_DIR", kb_data) + monkeypatch.setattr("backend.kb_manager._USERS_FILE", kb_data / "users.json") + # Mock process_file_for_kb to avoid SameFileError (API already writes to raw_dir) + monkeypatch.setattr( + "backend.kb_parser.process_file_for_kb", + lambda kb_id, file_path, source_name="": { + "filename": source_name, "type": "txt", "error": None}) + from fastapi.testclient import TestClient as TC + tc = TC(app) + resp = tc.post("/api/users", json={"name": "上传测试用户"}) + self.uid = resp.json()["user_id"] + + def test_upload_to_kb(self, client): + kid = client.post(f"/api/users/{self.uid}/kbs", json={"name": "上传库"}).json()["kb_id"] + resp = client.post( + f"/api/kbs/{kid}/upload", + files={"file": ("readme.md", io.BytesIO(b"# test"), "text/markdown")}, + ) + assert resp.status_code == 200 + assert resp.json()["filename"] == "readme.md" + + def test_upload_to_nonexistent_kb(self, client): + resp = client.post( + "/api/kbs/deadbeef1234567890abcd/upload", + files={"file": ("x.txt", io.BytesIO(b"x"), "text/plain")}, + ) + assert resp.status_code == 404 + + def test_build_empty_kb_fails(self, client): + kid = client.post(f"/api/users/{self.uid}/kbs", json={"name": "空库"}).json()["kb_id"] + resp = client.post(f"/api/kbs/{kid}/build") + assert resp.status_code == 400 + + def test_search_kb_empty_query_rejected(self, client): + kid = client.post(f"/api/users/{self.uid}/kbs", json={"name": "搜索库"}).json()["kb_id"] + resp = client.get(f"/api/kbs/{kid}/search") + assert resp.status_code == 400 + + +# ── 会话-KB 绑定 API ──────────────────────────────────────────── + +class TestSessionKbBinding: + @pytest.fixture(autouse=True) + def setup_bind(self, monkeypatch, tmp_path): + kb_data = tmp_path / "kb_data" + kb_data.mkdir(parents=True, exist_ok=True) + sessions_dir = tmp_path / "sessions" + monkeypatch.setattr("backend.kb_manager.KB_DATA_DIR", kb_data) + monkeypatch.setattr("backend.kb_manager._USERS_FILE", kb_data / "users.json") + monkeypatch.setattr("backend.session.SESSIONS_DIR", sessions_dir) + monkeypatch.setattr("api_server.UPLOADS_DIR", tmp_path / "uploads") + + def test_bind_kb_to_session(self, client): + uid = client.post("/api/users", json={"name": "绑定用户"}).json()["user_id"] + kid = client.post(f"/api/users/{uid}/kbs", json={"name": "绑定库"}).json()["kb_id"] + sid = client.post("/api/sessions").json()["session_id"] + resp = client.put(f"/api/sessions/{sid}/kb", json={"kb_id": kid}) + assert resp.status_code == 200 + assert resp.json()["kb_id"] == kid + + def test_get_session_kb(self, client): + uid = client.post("/api/users", json={"name": "查询用户"}).json()["user_id"] + kid = client.post(f"/api/users/{uid}/kbs", json={"name": "查询KB"}).json()["kb_id"] + sid = client.post("/api/sessions").json()["session_id"] + client.put(f"/api/sessions/{sid}/kb", json={"kb_id": kid}) + resp = client.get(f"/api/sessions/{sid}/kb") + assert resp.status_code == 200 + assert resp.json()["kb_id"] == kid + assert resp.json()["kb_name"] == "查询KB" + + def test_unbind_kb(self, client): + sid = client.post("/api/sessions").json()["session_id"] + resp = client.put(f"/api/sessions/{sid}/kb", json={"kb_id": ""}) + assert resp.status_code == 200 + assert resp.json()["kb_id"] is None + + def test_bind_nonexistent_kb(self, client): + sid = client.post("/api/sessions").json()["session_id"] + resp = client.put(f"/api/sessions/{sid}/kb", json={"kb_id": "deadbeef1234567890abcd"}) + assert resp.status_code == 404 + + def test_bind_to_nonexistent_session(self, client): + resp = client.put("/api/sessions/deadbeef1234567890abcd/kb", json={"kb_id": ""}) + assert resp.status_code == 404 + + +# ── 用户-KB 端到端流程 ────────────────────────────────────────── + +class TestUserKbE2E: + @pytest.fixture(autouse=True) + def setup_e2e(self, monkeypatch, tmp_path): + kb_data = tmp_path / "kb_data" + kb_data.mkdir(parents=True, exist_ok=True) + sessions_dir = tmp_path / "sessions" + monkeypatch.setattr("backend.kb_manager.KB_DATA_DIR", kb_data) + monkeypatch.setattr("backend.kb_manager._USERS_FILE", kb_data / "users.json") + monkeypatch.setattr("backend.session.SESSIONS_DIR", sessions_dir) + monkeypatch.setattr("api_server.UPLOADS_DIR", tmp_path / "uploads") + # Mock process_file_for_kb to avoid SameFileError + monkeypatch.setattr( + "backend.kb_parser.process_file_for_kb", + lambda kb_id, file_path, source_name="": { + "filename": source_name, "type": "txt", "error": None}) + + def test_full_flow(self, client): + # 1. 创建用户 + uid = client.post("/api/users", json={"name": "E2E用户"}).json()["user_id"] + # 2. 创建 KB + kid = client.post(f"/api/users/{uid}/kbs", json={"name": "E2E库"}).json()["kb_id"] + # 3. 上传文件 + resp = client.post( + f"/api/kbs/{kid}/upload", + files={"file": ("readme.md", io.BytesIO(b"# E2E test"), "text/markdown")}, + ) + assert resp.status_code == 200 + # 4. 创建会话 + sid = client.post("/api/sessions").json()["session_id"] + # 5. 绑定 KB 到会话 + bind = client.put(f"/api/sessions/{sid}/kb", json={"kb_id": kid}) + assert bind.status_code == 200 + assert bind.json()["kb_id"] == kid + # 6. 查询会话 KB + info = client.get(f"/api/sessions/{sid}/kb") + assert info.json()["kb_name"] == "E2E库" diff --git a/tests/test_datasource.py b/tests/test_datasource.py new file mode 100644 index 0000000..93a45ff --- /dev/null +++ b/tests/test_datasource.py @@ -0,0 +1,161 @@ +"""datasource.py 测试 — 数据源模式解析, JDBC 检测, 上下文构建。""" + +import sys +from pathlib import Path +from unittest.mock import MagicMock + +import pytest + +sys.path.insert(0, str(Path(__file__).parent.parent)) + +from agent.datasource import ( + resolve_datasource_mode, _detect_jdbc_intent, + build_datasource_context, configure_jdbc, ask_db_config, +) + + +def _make_state(**overrides): + s = { + "user_input": "", + "conversation_history": [], + "current_jrxml": "", + "status": "", + "error_msg": "", + "natural_explanation": "", + "retry_count": 0, + "user_modification_request": "", + "final_jrxml": "", + "stage": "", + "retrieved_context": "", + **overrides, + } + return s + + +# ── JDBC 意图检测 ─────────────────────────────────────────────── + +class TestDetectJdbcIntent: + def test_direct_connect_keywords(self): + assert _detect_jdbc_intent("我想从数据库直连查询") is True + assert _detect_jdbc_intent("直连数据库获取数据") is True + + def test_db_name_mentions(self): + assert _detect_jdbc_intent("从MySQL数据库查询用户表") is True + assert _detect_jdbc_intent("在PostgreSQL中执行查询") is True + assert _detect_jdbc_intent("从Oracle读取数据") is True + + def test_jdbc_explicit_mention(self): + assert _detect_jdbc_intent("使用JDBC连接") is True + + def test_sql_keywords(self): + assert _detect_jdbc_intent("SELECT * FROM users") is True + assert _detect_jdbc_intent("从数据库查询用户表") is True + assert _detect_jdbc_intent("先查询 数据库") is True + + def test_normal_request_is_not_jdbc(self): + assert _detect_jdbc_intent("生成一个员工报表") is False + assert _detect_jdbc_intent("修改标题为XX公司") is False + + def test_empty_input(self): + assert _detect_jdbc_intent("") is False + + +# ── 模式解析 ──────────────────────────────────────────────────── + +class TestResolveDatasourceMode: + def test_defaults_to_parameter_mode(self): + state = _make_state(user_input="生成报表") + assert resolve_datasource_mode(state) == "parameter" + + def test_detects_jdbc_from_input(self): + state = _make_state(user_input="从数据库直连查询") + assert resolve_datasource_mode(state) == "jdbc" + + def test_respects_existing_mode_in_state(self): + state = _make_state(datasource_mode="jdbc", user_input="生成报表") + assert resolve_datasource_mode(state) == "jdbc" + + def test_existing_parameter_overrides_jdbc_input(self): + state = _make_state(datasource_mode="parameter", user_input="从数据库直连") + assert resolve_datasource_mode(state) == "parameter" + + def test_ignores_invalid_mode_in_state(self): + state = _make_state(datasource_mode="unknown", user_input="从数据库直连") + assert resolve_datasource_mode(state) == "jdbc" + + +# ── 上下文构建 ────────────────────────────────────────────────── + +class TestBuildDatasourceContext: + def test_parameter_mode_with_fields(self): + fields = [ + {"name": "billNo", "description": "工单号", "type": "java.lang.String"}, + {"name": "amount", "description": "金额", "type": "java.math.BigDecimal"}, + ] + ctx = build_datasource_context("parameter", fields) + assert "[数据源模式: 参数]" in ctx + assert "$P{xxx}" in ctx + assert "billNo" in ctx + assert "amount" in ctx + + def test_parameter_mode_without_fields(self): + ctx = build_datasource_context("parameter", []) + assert "[数据源模式: 参数]" in ctx + assert "$P{xxx}" in ctx + + def test_jdbc_mode_with_config(self): + db_config = {"url": "jdbc:mysql://localhost:3306/mydb", + "driver": "com.mysql.cj.jdbc.Driver"} + ctx = build_datasource_context("jdbc", [], db_config) + assert "[数据源模式: JDBC]" in ctx + assert "jdbc:mysql://" in ctx + assert "CDATA" in ctx + + def test_jdbc_mode_without_config_shows_warning(self): + ctx = build_datasource_context("jdbc", []) + assert "尚未配置数据库连接" in ctx + assert "P{xxx}" in ctx + + +# ── JDBC 配置 ─────────────────────────────────────────────────── + +class TestConfigureJdbc: + def test_configure_returns_update_dict(self): + state = _make_state() + update = configure_jdbc( + state, url="jdbc:mysql://localhost/db", + driver="com.mysql.cj.jdbc.Driver", + username="root", password="pass") + assert update["datasource_mode"] == "jdbc" + assert update["db_config"]["url"] == "jdbc:mysql://localhost/db" + assert update["db_config"]["username"] == "root" + + def test_default_driver_is_mysql(self): + update = configure_jdbc(_make_state(), url="jdbc:postgresql://localhost/db") + assert "mysql" in update["db_config"]["driver"] + + +# ── ask_db_config ─────────────────────────────────────────────── + +class TestAskDbConfig: + def test_returns_none_for_parameter_mode(self): + state = _make_state(datasource_mode="parameter") + assert ask_db_config(state) is None + + def test_returns_none_when_jdbc_configured(self): + state = _make_state(datasource_mode="jdbc", + db_config={"url": "jdbc:mysql://localhost/db"}) + assert ask_db_config(state) is None + + def test_returns_prompt_when_jdbc_missing_config(self): + state = _make_state(datasource_mode="jdbc") + msg = ask_db_config(state) + assert msg is not None + assert "JDBC URL" in msg + assert "用户名" in msg + assert "密码" in msg + + def test_returns_none_when_db_config_empty(self): + state = _make_state(datasource_mode="jdbc", db_config={}) + msg = ask_db_config(state) + assert msg is not None diff --git a/tests/test_field_matcher.py b/tests/test_field_matcher.py new file mode 100644 index 0000000..6f8ff7b --- /dev/null +++ b/tests/test_field_matcher.py @@ -0,0 +1,157 @@ +"""field_matcher.py 测试 — OCR 字段 → KB 字段匹配, embedding + LLM。""" + +import sys +from pathlib import Path +from unittest.mock import patch, MagicMock + +import pytest + +sys.path.insert(0, str(Path(__file__).parent.parent)) + +from backend.field_matcher import ( + _cosine_similarity, match_ocr_to_kb, _match_via_llm, + format_field_mapping_context, +) + + +# ── 余弦相似度 ────────────────────────────────────────────────── + +class TestCosineSimilarity: + def test_identical_vectors(self): + assert _cosine_similarity([1, 0, 0], [1, 0, 0]) == 1.0 + + def test_orthogonal_vectors(self): + assert _cosine_similarity([1, 0, 0], [0, 1, 0]) == 0.0 + + def test_opposite_vectors(self): + assert _cosine_similarity([1, 0], [-1, 0]) == -1.0 + + def test_normalized_vectors_range(self): + sim = _cosine_similarity([0.6, 0.8], [0.8, 0.6]) + assert -1.0 <= sim <= 1.0 + + +# ── LLM 匹配 ──────────────────────────────────────────────────── + +class TestMatchViaLlm: + def test_returns_json_mapping(self): + mock_llm = MagicMock() + mock_response = MagicMock() + mock_response.content = '{"工单号": "billNo", "客户": "customerName"}' + mock_llm.invoke.return_value = mock_response + + kb_fields = [ + {"name": "billNo", "description": "工单号", "type": "String"}, + {"name": "customerName", "description": "客户名称", "type": "String"}, + ] + result = _match_via_llm(["工单号", "客户"], kb_fields, mock_llm) + assert result == {"工单号": "billNo", "客户": "customerName"} + + def test_includes_candidates_hint_when_provided(self): + mock_llm = MagicMock() + mock_response = MagicMock() + mock_response.content = '{"工单号": "billNo"}' + mock_llm.invoke.return_value = mock_response + candidates = {"工单号": [("billNo", 0.85), ("orderId", 0.62)]} + result = _match_via_llm( + ["工单号"], + [{"name": "billNo", "description": "工单号", "type": "String"}], + mock_llm, candidates=candidates) + call_args = mock_llm.invoke.call_args[0][0] + assert "候选" in call_args + assert "billNo" in call_args + + def test_llm_error_returns_empty_dict(self): + mock_llm = MagicMock() + mock_llm.invoke.side_effect = RuntimeError("LLM crash") + result = _match_via_llm(["x"], [{"name": "y", "description": "", "type": "String"}], mock_llm) + assert result == {} + + def test_llm_returns_invalid_json_returns_empty(self): + mock_llm = MagicMock() + mock_response = MagicMock() + mock_response.content = "not json at all" + mock_llm.invoke.return_value = mock_response + result = _match_via_llm(["x"], [{"name": "y", "description": "", "type": "String"}], mock_llm) + assert result == {} + + +# ── 完整匹配流程 ──────────────────────────────────────────────── + +class TestMatchOcrToKb: + @pytest.fixture(autouse=True) + def mock_embed(self): + with patch("backend.field_matcher._embed") as mock_embed: + def _fake_embed(text): + if "billNo" in text or "工单" in text: + return [1.0, 0.0, 0.0] + if "customerName" in text or "客户" in text: + return [0.0, 1.0, 0.0] + if "amount" in text or "金额" in text: + return [0.0, 0.0, 1.0] + return [0.0, 0.0, 0.0] + mock_embed.side_effect = _fake_embed + yield mock_embed + + def test_matches_without_llm(self): + kb_fields = [ + {"name": "billNo", "description": "工单号", "type": "String"}, + {"name": "customerName", "description": "客户名称", "type": "String"}, + {"name": "amount", "description": "金额", "type": "BigDecimal"}, + ] + mapping = match_ocr_to_kb( + ["工单号", "客户名称", "金额"], kb_fields, llm=None) + assert mapping["工单号"] == "billNo" + assert mapping["客户名称"] == "customerName" + assert mapping["金额"] == "amount" + + def test_empty_inputs_return_empty(self): + assert match_ocr_to_kb([], [], llm=None) == {} + assert match_ocr_to_kb(["x"], [], llm=None) == {} + assert match_ocr_to_kb([], [{"name": "y", "description": "", "type": "String"}], llm=None) == {} + + def test_low_similarity_not_matched(self): + kb_fields = [{"name": "far", "description": "不相关字段", "type": "String"}] + mapping = match_ocr_to_kb(["无关"], kb_fields, llm=None) + assert "无关" not in mapping or mapping == {} + + def test_uses_llm_when_provided(self): + mock_llm = MagicMock() + mock_response = MagicMock() + mock_response.content = '{"工单号": "billNo", "客户名称": "customerName"}' + mock_llm.invoke.return_value = mock_response + kb_fields = [ + {"name": "billNo", "description": "工单号", "type": "String"}, + {"name": "customerName", "description": "客户", "type": "String"}, + ] + mapping = match_ocr_to_kb(["工单号", "客户名称"], kb_fields, llm=mock_llm) + assert mapping["工单号"] == "billNo" + + def test_embedding_failure_falls_back_to_llm(self): + mock_llm = MagicMock() + mock_response = MagicMock() + mock_response.content = '{"工单号": "billNo"}' + mock_llm.invoke.return_value = mock_response + with patch("backend.field_matcher._embed", side_effect=RuntimeError("model error")): + kb_fields = [{"name": "billNo", "description": "工单号", "type": "String"}] + mapping = match_ocr_to_kb(["工单号"], kb_fields, llm=mock_llm) + assert mapping["工单号"] == "billNo" + + +# ── 格式化上下文 ──────────────────────────────────────────────── + +class TestFormatFieldMappingContext: + def test_formats_mapping_as_table(self): + ctx = format_field_mapping_context({"工单号": "billNo", "客户": "customerName"}) + assert "[字段映射" in ctx + assert "$P{billNo}" in ctx + assert "$P{customerName}" in ctx + assert "工单号" in ctx + assert "客户" in ctx + + def test_empty_mapping_returns_empty_string(self): + assert format_field_mapping_context({}) == "" + + def test_single_entry(self): + ctx = format_field_mapping_context({"发票号码": "invoiceNo"}) + assert "$P{invoiceNo}" in ctx diff --git a/tests/test_jrxml_windower.py b/tests/test_jrxml_windower.py new file mode 100644 index 0000000..a717886 --- /dev/null +++ b/tests/test_jrxml_windower.py @@ -0,0 +1,325 @@ +"""JRXML 窗口化模块单元测试。 + +测试 decompose → split → reassemble 往返链路, +以及元素计数和校验逻辑。 +""" + +from __future__ import annotations + +import pytest +from agent.jrxml_windower import ( + decompose_jrxml, reassemble_jrxml, + split_band_into_windows, reassemble_band_windows, + count_elements, validate_element_count, + BandInfo, +) + +# ── 最小 JRXML 测试夹具 ────────────────────────────────────────────── + +MINIMAL_JRXML = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +""" + + +# ── Decompose 测试 ──────────────────────────────────────────────────── + +class TestDecompose: + def test_parses_minimal_jrxml(self): + parts = decompose_jrxml(MINIMAL_JRXML) + assert parts is not None + assert parts.band_count == 4 # title, columnHeader, detail, pageFooter + assert parts.total_elements == 6 # 2 + 1 + 2 + 1 + + def test_declaration_preserved(self): + parts = decompose_jrxml(MINIMAL_JRXML) + assert '') + + def test_returns_none_for_non_jrxml(self): + parts = decompose_jrxml("") + assert parts is None + + def test_returns_none_for_malformed_xml(self): + parts = decompose_jrxml("not xml at all <<<") + assert parts is None + + +# ── Roundtrip 测试 ──────────────────────────────────────────────────── + +class TestRoundtrip: + def test_decompose_reassemble_element_count_unchanged(self): + parts = decompose_jrxml(MINIMAL_JRXML) + band_map = {b.label: b.band_xml for b in parts.bands} + result = reassemble_jrxml(parts, band_map) + + orig = count_elements(MINIMAL_JRXML) + reassembled = count_elements(result) + assert orig == reassembled, f"Elements: {orig} -> {reassembled}" + + def test_roundtrip_preserves_text_content(self): + parts = decompose_jrxml(MINIMAL_JRXML) + band_map = {b.label: b.band_xml for b in parts.bands} + result = reassemble_jrxml(parts, band_map) + + assert 'Title' in result + assert 'Header' in result + assert '$F{name}' in result + assert '$F{amount}' in result + + def test_empty_bands_preserved(self): + """空 band(无元素)在 roundtrip 中不丢失。""" + jrxml = """ + + + + + + + + + + + + + +""" + parts = decompose_jrxml(jrxml) + assert parts.band_count == 2 + band_map = {b.label: b.band_xml for b in parts.bands} + result = reassemble_jrxml(parts, band_map) + assert count_elements(jrxml) == count_elements(result) + + +# ── Window Split 测试 ───────────────────────────────────────────────── + +class TestWindowSplit: + def test_small_band_not_split(self): + """小 band 不会被切分。""" + band = BandInfo( + section_name="title", band_index=0, + band_xml='', + element_count=1, char_length=150, + ) + windows = split_band_into_windows(band, max_chars=4000) + assert len(windows) == 1 + + def test_large_band_split_at_element_boundaries(self): + """超过字符阈值的 band 在元素边界切分。""" + inner = "\n" * 80 + band_xml = f'{inner}' + band = BandInfo( + section_name="detail", band_index=0, + band_xml=band_xml, + element_count=80, char_length=len(band_xml), + ) + windows = split_band_into_windows(band, max_chars=4000) + assert len(windows) > 1, f"Expected multiple windows, got {len(windows)}" + + def test_split_preserves_element_count(self): + """切分后重组元素数不变。""" + inner = "\n" * 80 + band_xml = f'{inner}' + band = BandInfo( + section_name="detail", band_index=0, + band_xml=band_xml, + element_count=80, char_length=len(band_xml), + ) + windows = split_band_into_windows(band, max_chars=4000) + reassembled = reassemble_band_windows(windows) + assert count_elements(band_xml) == count_elements(reassembled) + + def test_no_empty_windows(self): + """所有窗口非空。""" + inner = "\n" * 80 + band_xml = f'{inner}' + band = BandInfo( + section_name="detail", band_index=0, + band_xml=band_xml, + element_count=80, char_length=len(band_xml), + ) + windows = split_band_into_windows(band, max_chars=4000) + for i, w in enumerate(windows): + assert len(w.strip()) > 0, f"Window {i} is empty" + assert '" + + def test_namespaced_band_split(self): + """命名空间前缀的 band 也能正确切分。""" + inner = "\n" * 80 + band_xml = f'{inner}' + band = BandInfo( + section_name="detail", band_index=0, + band_xml=band_xml, + element_count=80, char_length=len(band_xml), + ) + windows = split_band_into_windows(band, max_chars=4000) + assert len(windows) > 1, f"Expected multiple, got {len(windows)}" + for w in windows: + assert '' in w or w.startswith('', '') + r = validate_element_count(MINIMAL_JRXML, xml2, "test") + # 0% change since comments don't count as elements + assert r["ok"] is True + + def test_large_change_not_ok(self): + """> 10% 变化返回 ok=False。""" + short = MINIMAL_JRXML[:500] # 大幅截断 + r = validate_element_count(MINIMAL_JRXML, short, "test") + if r["original"] > 0 and r["change_pct"] > 0.10: + assert r["ok"] is False + + def test_zero_original_always_ok(self): + r = validate_element_count("", MINIMAL_JRXML, "test") + assert r["ok"] is True + + +# ── 多 section 多 band 测试 ────────────────────────────────────────── + +MULTI_BAND_JRXML = """ + + + + + + + + + + + + + + + + + + + + + + + + + +""" + + +class TestMultiBand: + def test_multiple_bands_same_section(self): + """同一 section 内的多个 band 分别处理。""" + parts = decompose_jrxml(MULTI_BAND_JRXML) + assert parts.band_count == 3 # detail_band0, detail_band1, summary + labels = [b.label for b in parts.bands] + assert labels == ["detail", "detail_band1", "summary"] + + def test_multi_band_roundtrip(self): + parts = decompose_jrxml(MULTI_BAND_JRXML) + band_map = {b.label: b.band_xml for b in parts.bands} + result = reassemble_jrxml(parts, band_map) + assert count_elements(MULTI_BAND_JRXML) == count_elements(result) + + def test_reassemble_opens_closes_sections(self): + parts = decompose_jrxml(MULTI_BAND_JRXML) + band_map = {b.label: b.band_xml for b in parts.bands} + result = reassemble_jrxml(parts, band_map) + assert result.count('') == 1 + assert result.count('') == 1 + assert result.count('') == 1 + assert result.count('') == 1 diff --git a/tests/test_kb_manager.py b/tests/test_kb_manager.py new file mode 100644 index 0000000..6ff659f --- /dev/null +++ b/tests/test_kb_manager.py @@ -0,0 +1,265 @@ +"""kb_manager.py 测试 — 用户 + KB CRUD, 原子写入, ID 验证。""" + +import json +import os +import sys +import tempfile +from pathlib import Path +from unittest.mock import patch + +import pytest + +sys.path.insert(0, str(Path(__file__).parent.parent)) + +from backend.kb_manager import ( + _validate_id, _now_iso, _ensure_dir, _read_json, _write_json_atomic, + _load_users, _save_users, + create_user, list_users, get_user, delete_user, + create_kb, list_kbs, get_kb, update_kb_meta, delete_kb, + get_kb_raw_dir, get_kb_chunks_path, get_kb_chroma_path, + KB_DATA_DIR, _USERS_FILE, +) + + +@pytest.fixture +def temp_kb_data(monkeypatch): + with tempfile.TemporaryDirectory(prefix="test_kb_") as tmpdir: + monkeypatch.setattr("backend.kb_manager.KB_DATA_DIR", Path(tmpdir)) + monkeypatch.setattr("backend.kb_manager._USERS_FILE", Path(tmpdir) / "users.json") + yield Path(tmpdir) + + +@pytest.fixture +def user(temp_kb_data): + return create_user("测试用户") + + +@pytest.fixture +def kb(temp_kb_data, user): + return create_kb(user["user_id"], "测试知识库", "测试描述") + + +# ── ID 验证 ───────────────────────────────────────────────────── + +class TestIDValidation: + def test_valid_hex_id_passes(self): + _validate_id("aabbccddeeff0011223344", "test_id") + + def test_short_id_raises(self): + with pytest.raises(ValueError, match="Invalid"): + _validate_id("abc", "test_id") + + def test_non_hex_id_raises(self): + with pytest.raises(ValueError, match="Invalid"): + _validate_id("not_valid!!!", "test_id") + + def test_empty_id_raises(self): + with pytest.raises(ValueError, match="Invalid"): + _validate_id("", "test_id") + + +# ── 原子写入 ──────────────────────────────────────────────────── + +class TestAtomicWrite: + def test_write_json_atomic_creates_file(self, temp_kb_data): + fp = temp_kb_data / "test.json" + _write_json_atomic(fp, {"key": "value"}) + assert fp.exists() + assert json.loads(fp.read_text(encoding="utf-8")) == {"key": "value"} + + def test_write_json_atomic_overwrites(self, temp_kb_data): + fp = temp_kb_data / "test.json" + _write_json_atomic(fp, {"a": 1}) + _write_json_atomic(fp, {"b": 2}) + assert json.loads(fp.read_text(encoding="utf-8")) == {"b": 2} + + def test_write_json_atomic_creates_parent_dir(self, temp_kb_data): + fp = temp_kb_data / "deep" / "nested" / "test.json" + _write_json_atomic(fp, {"ok": True}) + assert fp.exists() + + def test_write_json_atomic_no_partial_file_on_error(self, temp_kb_data): + fp = temp_kb_data / "fail.json" + with patch("json.dump", side_effect=RuntimeError("boom")): + with pytest.raises(RuntimeError): + _write_json_atomic(fp, {"x": 1}) + assert not fp.exists() + tmps = list(temp_kb_data.glob("*.json*")) + assert len(tmps) == 0 or all(not f.name.endswith(".tmp") for f in tmps) + + +# ── 用户 CRUD ─────────────────────────────────────────────────── + +class TestUserCRUD: + def test_create_user_returns_dict(self, temp_kb_data): + u = create_user("张三") + assert u["name"] == "张三" + assert len(u["user_id"]) >= 12 + assert "created_at" in u + + def test_create_user_persists_to_disk(self, temp_kb_data): + u = create_user("李四") + loaded = list_users() + assert any(x["user_id"] == u["user_id"] for x in loaded) + + def test_create_user_with_custom_id(self, temp_kb_data): + uid = "abcdef1234567890abcdef" + u = create_user("王五", user_id=uid) + assert u["user_id"] == uid + + def test_create_duplicate_user_id_raises(self, temp_kb_data): + uid = "deadbeef1234567890abcd" + create_user("用户1", user_id=uid) + with pytest.raises(ValueError, match="already exists"): + create_user("用户2", user_id=uid) + + def test_list_users_empty(self, temp_kb_data): + assert list_users() == [] + + def test_list_users_returns_all(self, temp_kb_data): + create_user("A") + create_user("B") + assert len(list_users()) == 2 + + def test_get_user_found(self, user): + u = get_user(user["user_id"]) + assert u is not None + assert u["name"] == user["name"] + + def test_get_user_not_found(self, temp_kb_data): + assert get_user("deadbeef1234567890abcd") is None + + def test_get_user_invalid_id_raises(self, temp_kb_data): + with pytest.raises(ValueError): + get_user("invalid") + + def test_delete_user_returns_true(self, user): + assert delete_user(user["user_id"]) is True + + def test_delete_user_removes_from_list(self, user): + delete_user(user["user_id"]) + assert get_user(user["user_id"]) is None + + def test_delete_user_removes_dir(self, temp_kb_data, user): + user_dir = temp_kb_data / user["user_id"] + assert user_dir.exists() + delete_user(user["user_id"]) + assert not user_dir.exists() + + def test_delete_user_not_found_returns_false(self, temp_kb_data): + assert delete_user("deadbeef1234567890abcd") is False + + def test_delete_user_invalid_id_raises(self, temp_kb_data): + with pytest.raises(ValueError): + delete_user("bad_id") + + +# ── KB CRUD ───────────────────────────────────────────────────── + +class TestKbCRUD: + def test_create_kb_returns_meta(self, kb): + assert kb["name"] == "测试知识库" + assert len(kb["kb_id"]) >= 12 + assert kb["parse_status"] == "empty" + assert kb["file_count"] == 0 + + def test_create_kb_creates_dir_structure(self, temp_kb_data, user, kb): + kb_dir = temp_kb_data / user["user_id"] / kb["kb_id"] + assert kb_dir.is_dir() + assert (kb_dir / "raw").is_dir() + assert (kb_dir / "meta.json").exists() + + def test_create_kb_with_custom_id(self, user): + kid = "cafebabe1234567890feed" + kb = create_kb(user["user_id"], "自定义ID库", kb_id=kid) + assert kb["kb_id"] == kid + + def test_list_kbs_empty(self, user): + assert list_kbs(user["user_id"]) == [] + + def test_list_kbs_returns_all(self, user): + create_kb(user["user_id"], "B库") + create_kb(user["user_id"], "A库") + assert len(list_kbs(user["user_id"])) == 2 + + def test_list_kbs_summary_format(self, user, kb): + kbs = list_kbs(user["user_id"]) + s = kbs[0] + for key in ("kb_id", "name", "field_count", "template_count", "parse_status"): + assert key in s + + def test_get_kb_found(self, kb): + k = get_kb(kb["kb_id"]) + assert k is not None + assert k["name"] == kb["name"] + + def test_get_kb_not_found(self, temp_kb_data): + assert get_kb("deadbeef1234567890abcd") is None + + def test_get_kb_invalid_id_raises(self, temp_kb_data): + with pytest.raises(ValueError): + get_kb("bad") + + def test_update_kb_meta_changes_fields(self, kb): + updated = update_kb_meta(kb["kb_id"], {"parse_status": "ready", "file_count": 5}) + assert updated is not None + assert updated["parse_status"] == "ready" + assert updated["file_count"] == 5 + assert "updated_at" in updated + + def test_update_kb_meta_not_found(self, temp_kb_data): + assert update_kb_meta("deadbeef1234567890abcd", {"x": 1}) is None + + def test_delete_kb_returns_true(self, kb): + assert delete_kb(kb["kb_id"]) is True + + def test_delete_kb_removes_dir(self, temp_kb_data, user, kb): + kb_dir = temp_kb_data / user["user_id"] / kb["kb_id"] + assert kb_dir.exists() + delete_kb(kb["kb_id"]) + assert not kb_dir.exists() + + def test_delete_kb_not_found_returns_false(self, temp_kb_data): + assert delete_kb("deadbeef1234567890abcd") is False + + +# ── 工具函数 ──────────────────────────────────────────────────── + +class TestHelpers: + def test_get_kb_raw_dir(self, kb): + d = get_kb_raw_dir(kb["kb_id"]) + assert d is not None + assert d.name == "raw" + + def test_get_kb_raw_dir_not_found(self, temp_kb_data): + assert get_kb_raw_dir("deadbeef1234567890abcd") is None + + def test_get_kb_chunks_path(self, kb): + p = get_kb_chunks_path(kb["kb_id"]) + assert p is not None + assert p.name == "chunks.json" + + def test_get_kb_chroma_path_creates_dir(self, kb): + p = get_kb_chroma_path(kb["kb_id"]) + assert p is not None + assert p.name == "chroma" + assert p.exists() + + def test_user_can_own_multiple_kbs(self, user): + create_kb(user["user_id"], "KB1") + create_kb(user["user_id"], "KB2") + create_kb(user["user_id"], "KB3") + assert len(list_kbs(user["user_id"])) == 3 + + def test_different_users_have_isolated_kbs(self, temp_kb_data): + u1 = create_user("用户A") + u2 = create_user("用户B") + create_kb(u1["user_id"], "A的库") + create_kb(u2["user_id"], "B的库") + assert len(list_kbs(u1["user_id"])) == 1 + assert len(list_kbs(u2["user_id"])) == 1 + + def test_delete_user_cascades_to_kbs(self, temp_kb_data, user): + create_kb(user["user_id"], "要被删除的库") + delete_user(user["user_id"]) + assert not (temp_kb_data / user["user_id"]).exists() diff --git a/tests/test_kb_parser.py b/tests/test_kb_parser.py new file mode 100644 index 0000000..c10ec78 --- /dev/null +++ b/tests/test_kb_parser.py @@ -0,0 +1,311 @@ +"""kb_parser.py 测试 — JRXML 解析, 文件处理, 分块, 字段提取。""" + +import json +import os +import sys +import tempfile +from pathlib import Path +from unittest.mock import patch, MagicMock + +import pytest + +sys.path.insert(0, str(Path(__file__).parent.parent)) + +from backend.kb_parser import ( + parse_jrxml_fields, _extract_archive, process_file_for_kb, + chunk_file_results, extract_fields_with_llm, _extract_fields_from_table, + _find_tag, _find_all_tags, _collect_from_result, build_kb_from_files, +) + +SAMPLE_JRXML = """ + + + 工单号 + + + + + +""" + +SAMPLE_JRXML_NO_NS = """ + + + +""" + +INVALID_XML = """ + + """ + + +@pytest.fixture +def jrxml_file(): + with tempfile.NamedTemporaryFile(mode="w", suffix=".jrxml", + delete=False, encoding="utf-8") as f: + f.write(SAMPLE_JRXML) + path = f.name + yield path + os.unlink(path) + + +@pytest.fixture +def temp_kb(monkeypatch): + with tempfile.TemporaryDirectory(prefix="test_kb_parser_") as tmpdir: + kb_data = Path(tmpdir) + user_dir = kb_data / "default" + kb_dir = user_dir / "abcdef1234567890abcd" + raw_dir = kb_dir / "raw" + raw_dir.mkdir(parents=True) + monkeypatch.setattr( + "backend.kb_manager.get_kb_raw_dir", + lambda kb_id: raw_dir if kb_id == "abcdef1234567890abcd" else None) + monkeypatch.setattr( + "backend.kb_manager.get_kb_chunks_path", + lambda kb_id: kb_dir / "chunks.json" if kb_id == "abcdef1234567890abcd" else None) + monkeypatch.setattr( + "backend.kb_manager.update_kb_meta", + lambda kb_id, updates: None) + yield {"kb_id": "abcdef1234567890abcd", "kb_dir": kb_dir, "raw_dir": raw_dir, + "data_dir": kb_data} + + +# ── JRXML 解析 ────────────────────────────────────────────────── + +class TestParseJrxmlFields: + def test_parses_parameters(self, jrxml_file): + result = parse_jrxml_fields(jrxml_file) + assert result["error"] is None + assert len(result["parameters"]) == 2 + assert result["parameters"][0]["name"] == "billNo" + assert result["parameters"][0]["type"] == "java.lang.String" + assert result["parameters"][0]["description"] == "工单号" + + def test_parses_fields(self, jrxml_file): + result = parse_jrxml_fields(jrxml_file) + assert len(result["fields"]) == 2 + field_names = [f["name"] for f in result["fields"]] + assert "amount" in field_names + assert "createDate" in field_names + + def test_parses_query(self, jrxml_file): + result = parse_jrxml_fields(jrxml_file) + assert "SELECT * FROM orders" in result["query"] + + def test_parses_report_metadata(self, jrxml_file): + result = parse_jrxml_fields(jrxml_file) + assert result["report_name"] == "TestReport" + assert result["page_width"] == "595" + assert result["page_height"] == "842" + + def test_parses_jrxml_without_namespace(self, tmp_path): + fp = tmp_path / "simple.jrxml" + fp.write_text(SAMPLE_JRXML_NO_NS, encoding="utf-8") + result = parse_jrxml_fields(str(fp)) + assert result["report_name"] == "SimpleReport" + assert len(result["parameters"]) == 1 + + def test_invalid_xml_returns_error(self, tmp_path): + fp = tmp_path / "bad.jrxml" + fp.write_text(INVALID_XML, encoding="utf-8") + result = parse_jrxml_fields(str(fp)) + assert result["error"] is not None + assert "解析失败" in result["error"] + + def test_empty_jrxml_has_no_fields(self, tmp_path): + fp = tmp_path / "empty.jrxml" + fp.write_text( + '' + '', + encoding="utf-8") + result = parse_jrxml_fields(str(fp)) + assert result["parameters"] == [] + assert result["fields"] == [] + + def test_nonexistent_file_raises(self): + with pytest.raises(FileNotFoundError): + parse_jrxml_fields("/nonexistent/path.jrxml") + + +# ── 表格字段提取 ──────────────────────────────────────────────── + +class TestExtractFieldsFromTable: + def test_extracts_from_markdown_table(self): + text = """| 字段名 | 含义 | 必填 | 类型 | +|--------|------|------|------| +| billNo | 工单号 | 是 | String | +| amount | 金额 | 否 | BigDecimal |""" + fields = _extract_fields_from_table(text) + assert len(fields) == 2 + assert fields[0]["name"] == "billNo" + assert fields[0]["description"] == "工单号" + assert fields[0]["required"] is True + assert fields[1]["name"] == "amount" + + def test_skips_separator_rows(self): + text = """| 字段 | 说明 | +|------|------| +|------|------| +| name | 名称 |""" + fields = _extract_fields_from_table(text) + assert len(fields) == 1 + assert fields[0]["name"] == "name" + + def test_returns_empty_for_plain_text(self): + fields = _extract_fields_from_table("这是一段普通文本,没有表格。") + assert fields == [] + + def test_cells_with_bold_markers_stripped(self): + text = """| 名称 | 含义 | +|------|------| +| **billNo** | 单号 |""" + fields = _extract_fields_from_table(text) + assert fields[0]["name"] == "billNo" + + +# ── LLM 字段提取 ──────────────────────────────────────────────── + +class TestExtractFieldsWithLlm: + def test_falls_back_to_table_when_no_llm(self): + text = "| 字段 | 说明 |\n|------|------|\n| code | 编码 |" + fields = extract_fields_with_llm(text, llm=None) + assert len(fields) >= 1 + assert any(f["name"] == "code" for f in fields) + + def test_uses_llm_when_provided(self): + mock_llm = MagicMock() + mock_response = MagicMock() + mock_response.content = '[{"name": "id", "description": "ID", "type": "Long", "required": true}]' + mock_llm.invoke.return_value = mock_response + fields = extract_fields_with_llm("some text", llm=mock_llm) + assert len(fields) == 1 + assert fields[0]["name"] == "id" + + def test_llm_failure_falls_back_to_table(self): + mock_llm = MagicMock() + mock_llm.invoke.side_effect = RuntimeError("LLM down") + text = "| 字段 | 说明 |\n|------|------|\n| code | 编码 |" + fields = extract_fields_with_llm(text, llm=mock_llm) + assert any(f["name"] == "code" for f in fields) + + +# ── 文件处理 ──────────────────────────────────────────────────── + +class TestProcessFileForKb: + def test_process_jrxml_copies_and_parses(self, jrxml_file, temp_kb): + result = process_file_for_kb(temp_kb["kb_id"], jrxml_file) + assert result["type"] == "jrxml" + assert result["jrxml_info"]["report_name"] == "TestReport" + assert result["error"] is None + copied = list(temp_kb["raw_dir"].glob("*.jrxml")) + assert len(copied) == 1 + + def test_process_nonexistent_kb_returns_error(self, jrxml_file): + result = process_file_for_kb("deadbeef1234567890abcd", jrxml_file) + assert result["error"] is not None + + def test_process_text_file(self, tmp_path, temp_kb): + fp = tmp_path / "readme.md" + fp.write_text("# 标题\n\n这是一段内容。\n\n另一段内容。", encoding="utf-8") + with patch("backend.kb_parser.parse_file") as mock_parse: + mock_parse.return_value = {"text": "parsed content", "error": None} + result = process_file_for_kb(temp_kb["kb_id"], str(fp)) + assert result["filename"] is not None + assert result["error"] is None + + +# ── 分块 ──────────────────────────────────────────────────────── + +class TestChunkFileResults: + def test_jrxml_result_produces_template_chunk(self, jrxml_file): + info = parse_jrxml_fields(jrxml_file) + raw = Path(jrxml_file).read_text(encoding="utf-8") + results = [{ + "filename": "test.jrxml", "type": "jrxml", + "text": "text content", "raw_xml": raw, + "jrxml_info": info, "error": None, + }] + chunks = chunk_file_results(results, kb_name="测试库") + assert len(chunks) >= 1 + tmpl = [c for c in chunks if c["metadata"]["chunk_type"] == "jrxml_template"] + assert len(tmpl) == 1 + assert tmpl[0]["metadata"]["report_name"] == "TestReport" + assert "TestReport" in tmpl[0]["content"] + + def test_archive_result_recurses(self): + results = [{ + "filename": "bundle.zip", "type": "archive", "text": "", + "archive_contents": [ + {"filename": "inner.jrxml", "type": "jrxml", + "text": "inner text", "raw_xml": "", + "jrxml_info": {"report_name": "Inner", "parameters": [], "fields": []}, + "error": None}, + ], "error": None, + }] + chunks = chunk_file_results(results) + assert any(c["metadata"]["report_name"] == "Inner" for c in chunks) + + def test_empty_text_skipped(self): + results = [{"filename": "empty.md", "type": "md", "text": "", "error": None}] + assert chunk_file_results(results) == [] + + def test_short_paragraphs_skipped(self): + results = [{"filename": "short.txt", "type": "txt", "text": "hi", "error": None}] + assert chunk_file_results(results) == [] + + def test_text_split_into_paragraphs(self): + long_para = "A" * 50 + results = [ + {"filename": "doc.txt", "type": "txt", + "text": f"{long_para}\n\n{long_para}\n\n{long_para}", "error": None}, + ] + chunks = chunk_file_results(results) + assert len(chunks) == 3 + + +# ── _collect_from_result ──────────────────────────────────────── + +class TestCollectFromResult: + def test_collects_jrxml_parameters_as_fields(self): + fields = [] + templates = [] + _collect_from_result({ + "jrxml_info": { + "report_name": "R1", + "parameters": [{"name": "p1", "type": "String", "description": "参数1"}], + "fields": [], + }, + "filename": "r1.jrxml", + }, fields, templates) + assert len(templates) == 1 + assert any(f["name"] == "p1" for f in fields) + + def test_collects_jrxml_fields(self): + fields = [] + templates = [] + _collect_from_result({ + "jrxml_info": { + "report_name": "R2", + "parameters": [], + "fields": [{"name": "f1", "type": "Double", "description": ""}], + }, + "filename": "r2.jrxml", + }, fields, templates) + assert any(f["name"] == "f1" for f in fields) + + def test_skips_non_jrxml(self): + fields = [] + templates = [] + _collect_from_result({"type": "csv", "filename": "data.csv"}, fields, templates) + assert templates == [] + assert fields == [] + + def test_deduplicates_fields(self): + fields = [] + templates = [] + info = {"report_name": "R", "parameters": [{"name": "dup", "type": "String", "description": ""}], "fields": []} + _collect_from_result({"jrxml_info": info, "filename": "a.jrxml"}, fields, templates) + _collect_from_result({"jrxml_info": info, "filename": "b.jrxml"}, fields, templates) + assert sum(1 for f in fields if f["name"] == "dup") == 1 diff --git a/tests/test_kb_searcher.py b/tests/test_kb_searcher.py new file mode 100644 index 0000000..cef62df --- /dev/null +++ b/tests/test_kb_searcher.py @@ -0,0 +1,214 @@ +"""kb_searcher.py 测试 — KBChromaSearcher 创建, 搜索, 模板检索。""" + +import sys +import tempfile +from pathlib import Path +from unittest.mock import patch, MagicMock + +import pytest + +sys.path.insert(0, str(Path(__file__).parent.parent)) + +from backend.kb_searcher import ( + KBChromaSearcher, get_kb_searcher, search_kb, search_templates_in_kb, +) + + +@pytest.fixture +def mock_chromadb(monkeypatch): + mock_client = MagicMock() + mock_collection = MagicMock() + mock_client.get_collection.return_value = mock_collection + mock_client.create_collection.return_value = mock_collection + monkeypatch.setattr( + "chromadb.PersistentClient", + lambda path: mock_client) + mock_st = MagicMock() + mock_st_model = MagicMock() + mock_st_model.encode.return_value = MagicMock() + mock_st_model.encode.return_value.tolist.return_value = [0.1, 0.2, 0.3] + mock_st.return_value = mock_st_model + monkeypatch.setattr("sentence_transformers.SentenceTransformer", mock_st) + yield {"client": mock_client, "collection": mock_collection, + "st_model": mock_st_model, "st": mock_st} + + +@pytest.fixture +def searcher(mock_chromadb): + with tempfile.TemporaryDirectory(prefix="test_chroma_") as tmpdir: + s = KBChromaSearcher(chroma_path=tmpdir, collection_name="test_kb") + s._model = mock_chromadb["st_model"] + s._client = mock_chromadb["client"] + s._collection = mock_chromadb["collection"] + yield s + + +# ── 创建 & 就绪检查 ───────────────────────────────────────────── + +class TestKBChromaSearcherInit: + def test_creates_with_defaults(self, mock_chromadb): + with tempfile.TemporaryDirectory(prefix="test_chroma_") as tmpdir: + s = KBChromaSearcher(chroma_path=tmpdir) + assert s.collection_name == "kb_chunks" + assert s.chroma_path == str(tmpdir) + + def test_custom_collection_name(self, mock_chromadb): + with tempfile.TemporaryDirectory(prefix="test_chroma_") as tmpdir: + s = KBChromaSearcher(chroma_path=tmpdir, collection_name="custom") + assert s.collection_name == "custom" + + def test_model_lazy_loaded(self, mock_chromadb): + with tempfile.TemporaryDirectory(prefix="test_chroma_") as tmpdir: + s = KBChromaSearcher(chroma_path=tmpdir) + assert s._model is None + + def test_is_ready_true(self, searcher): + assert searcher.is_ready() is True + + def test_is_ready_false(self, searcher, mock_chromadb): + mock_chromadb["client"].get_collection.side_effect = Exception("no collection") + assert searcher.is_ready() is False + + +# ── 搜索 ──────────────────────────────────────────────────────── + +class TestSearch: + def test_search_returns_empty_when_not_ready(self, searcher, mock_chromadb): + mock_chromadb["client"].get_collection.side_effect = Exception("no collection") + results = searcher.search("test query") + assert results == [] + + def test_search_calls_collection_query(self, searcher, mock_chromadb): + mock_chromadb["collection"].query.return_value = { + "ids": [["chunk_0", "chunk_1"]], + "documents": [["doc1", "doc2"]], + "metadatas": [[{"chunk_type": "md"}, {"chunk_type": "txt"}]], + "distances": [[0.1, 0.3]], + } + results = searcher.search("query", k=5) + assert len(results) == 2 + assert results[0]["id"] == "chunk_0" + assert results[0]["content"] == "doc1" + assert results[0]["metadata"]["chunk_type"] == "md" + assert results[0]["distance"] == 0.1 + + def test_search_respects_threshold(self, searcher, mock_chromadb): + mock_chromadb["collection"].query.return_value = { + "ids": [["chunk_0", "chunk_1"]], + "documents": [["doc1", "doc2"]], + "metadatas": [[{}, {}]], + "distances": [[0.2, 0.8]], + } + results = searcher.search("query", threshold=0.5) + assert len(results) == 1 + assert results[0]["id"] == "chunk_0" + + def test_search_empty_results(self, searcher, mock_chromadb): + mock_chromadb["collection"].query.return_value = { + "ids": [[]], "documents": [[]], "metadatas": [[]], "distances": [[]], + } + assert searcher.search("query") == [] + + +# ── 模板搜索 ──────────────────────────────────────────────────── + +class TestSearchTemplates: + def test_filters_jrxml_chunks(self, searcher, mock_chromadb): + mock_chromadb["collection"].query.return_value = { + "ids": [["c0", "c1", "c2"]], + "documents": [["t1", "t2", "t3"]], + "metadatas": [[ + {"chunk_type": "jrxml_template", "report_name": "R1"}, + {"chunk_type": "md_section"}, + {"chunk_type": "jrxml_template", "report_name": "R2"}, + ]], + "distances": [[0.1, 0.2, 0.3]], + } + templates = searcher.search_templates("query", k=3) + assert len(templates) >= 1 + for t in templates: + meta = t["metadata"] + assert "jrxml" in meta.get("chunk_type", "").lower() or meta.get("report_name") + + def test_no_jrxml_chunks_returns_empty(self, searcher, mock_chromadb): + mock_chromadb["collection"].query.return_value = { + "ids": [["c0"]], + "documents": [["text"]], + "metadatas": [[{"chunk_type": "md_section"}]], + "distances": [[0.1]], + } + templates = searcher.search_templates("query") + assert templates == [] + + +# ── search_as_context ─────────────────────────────────────────── + +class TestSearchAsContext: + def test_returns_formatted_context(self, searcher, mock_chromadb): + mock_chromadb["collection"].query.return_value = { + "ids": [["c0", "c1"]], + "documents": [["内容1", "内容2"]], + "metadatas": [[ + {"chunk_type": "md", "report_name": "R1"}, + {"chunk_type": "txt"}, + ]], + "distances": [[0.1, 0.2]], + } + ctx = searcher.search_as_context("q", k=2) + assert "内容1" in ctx + assert "内容2" in ctx + assert "类型" in ctx + assert "报表" in ctx + assert "---" in ctx + + def test_empty_returns_empty_string(self, searcher, mock_chromadb): + mock_chromadb["collection"].query.return_value = { + "ids": [[]], "documents": [[]], "metadatas": [[]], "distances": [[]], + } + assert searcher.search_as_context("q") == "" + + +# ── add_chunks ────────────────────────────────────────────────── + +class TestAddChunks: + def test_add_chunks_calls_upsert(self, searcher, mock_chromadb): + chunks = [{"id": "c0", "content": "test content", "metadata": {"chunk_type": "md"}}] + searcher.add_chunks(chunks) + mock_chromadb["collection"].upsert.assert_called_once() + kwargs = mock_chromadb["collection"].upsert.call_args[1] + assert kwargs["ids"] == ["c0"] + assert kwargs["documents"] == ["test content"] + + def test_empty_chunks_noop(self, searcher, mock_chromadb): + searcher.add_chunks([]) + mock_chromadb["collection"].upsert.assert_not_called() + + +# ── 工厂函数 ──────────────────────────────────────────────────── + +class TestGetKbSearcher: + def test_returns_cached_instance(self, monkeypatch, mock_chromadb): + with tempfile.TemporaryDirectory(prefix="test_chroma_") as tmpdir: + monkeypatch.setattr( + "backend.kb_manager.get_kb_chroma_path", + lambda kb_id: Path(tmpdir) if kb_id == "abcdef1234567890abcd" else None) + s1 = get_kb_searcher("abcdef1234567890abcd") + s2 = get_kb_searcher("abcdef1234567890abcd") + assert s1 is s2 + + def test_returns_none_for_invalid_kb(self, monkeypatch): + monkeypatch.setattr( + "backend.kb_manager.get_kb_chroma_path", lambda kb_id: None) + assert get_kb_searcher("deadbeef1234567890abcd") is None + + +class TestSearchKbFunction: + def test_returns_empty_for_invalid_kb(self, monkeypatch): + monkeypatch.setattr( + "backend.kb_manager.get_kb_chroma_path", lambda kb_id: None) + assert search_kb("deadbeef1234567890abcd", "query") == "" + + def test_returns_empty_for_invalid_template_search(self, monkeypatch): + monkeypatch.setattr( + "backend.kb_manager.get_kb_chroma_path", lambda kb_id: None) + assert search_templates_in_kb("deadbeef1234567890abcd", "query") == [] diff --git a/tests/test_programmatic_map_fields.py b/tests/test_programmatic_map_fields.py new file mode 100644 index 0000000..535ffeb --- /dev/null +++ b/tests/test_programmatic_map_fields.py @@ -0,0 +1,200 @@ +"""程序化字段映射单元测试。 + +测试 _programmatic_map_fields 和 _sanitize_field_name +的确定性替换行为,以及 validate_element_count 校验。 +""" + +from __future__ import annotations + +import pytest +from agent.nodes import _programmatic_map_fields, _sanitize_field_name +from agent.jrxml_windower import count_elements, validate_element_count + +# ── 最小 JRXML 模板(含占位字段)──────────────────────────────────── + +JRXML_WITH_PLACEHOLDERS = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +""" + + +# ── _sanitize_field_name 测试 ──────────────────────────────────────── + +class TestSanitizeFieldName: + def test_ascii_name_passes_through(self): + assert _sanitize_field_name("customer_name") == "customer_name" + + def test_uppercase_lowered(self): + assert _sanitize_field_name("CustomerName") == "customername" + + def test_spaces_replaced(self): + assert _sanitize_field_name("customer name") == "customer_name" + + def test_chinese_characters_escaped(self): + result = _sanitize_field_name("发票代码") + assert "发票" not in result + assert "u53d1_" in result + assert "u7968_" in result + + def test_mixed_ascii_chinese(self): + result = _sanitize_field_name("发票_code") + assert "_code" in result + assert "u53d1_" in result + + def test_empty_returns_unnamed(self): + assert _sanitize_field_name("") == "unnamed_field" + + def test_all_special_chars_returns_unnamed(self): + assert _sanitize_field_name("!!!") == "unnamed_field" + + def test_leading_digit_prefixed(self): + result = _sanitize_field_name("123abc") + assert result == "f_123abc" + + def test_consecutive_underscores_collapsed(self): + result = _sanitize_field_name("a__b___c") + assert result == "a_b_c" + + def test_japanese_characters_escaped(self): + result = _sanitize_field_name("請求書") + assert "請求" not in result + + +# ── _programmatic_map_fields 测试 ──────────────────────────────────── + +class TestProgrammaticMapFields: + def test_replaces_field_declarations(self): + ocr = [ + {"field_name": "customer_name"}, + {"field_name": "total_amount"}, + {"field_name": "invoice_date"}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + assert 'field name="customer_name"' in result + assert 'field name="total_amount"' in result + assert 'field name="invoice_date"' in result + assert 'field name="field_1"' not in result + + def test_replaces_field_references(self): + ocr = [ + {"field_name": "customer_name"}, + {"field_name": "total_amount"}, + {"field_name": "invoice_date"}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + assert "$F{field_1}" not in result + assert "$F{customer_name}" in result + assert "$F{total_amount}" in result + assert "$F{invoice_date}" in result + + def test_preserves_element_count(self): + ocr = [ + {"field_name": "customer_name"}, + {"field_name": "total_amount"}, + {"field_name": "invoice_date"}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + orig = count_elements(JRXML_WITH_PLACEHOLDERS) + mod = count_elements(result) + assert orig == mod, f"Elements: {orig} -> {mod}" + + def test_preserves_coordinates(self): + ocr = [ + {"field_name": "customer_name"}, + {"field_name": "total_amount"}, + {"field_name": "invoice_date"}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + assert 'x="0"' in result + assert 'x="100"' in result + assert 'x="200"' in result + assert 'y="0"' in result + assert 'width="100"' in result + assert 'height="20"' in result + + def test_partial_fields_preserved(self): + """当 OCR 字段少于占位字段时,多余占位字段保留。""" + ocr = [ + {"field_name": "customer_name"}, + {"field_name": "total_amount"}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + assert 'field name="field_3"' in result + assert "$F{field_3}" in result + + def test_empty_field_name_skipped(self): + """空 field_name 的 OCR 字段不触发替换。""" + ocr = [ + {"field_name": ""}, + {"field_name": "total_amount"}, + {"field_name": ""}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + assert '$F{field_1}' in result + assert '$F{total_amount}' in result + assert '$F{field_3}' in result + + def test_no_ocr_fields_no_change(self): + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, []) + assert result == JRXML_WITH_PLACEHOLDERS + + def test_chinese_field_names_sanitized(self): + ocr = [ + {"field_name": "发票代码"}, + {"field_name": "发票号码"}, + {"field_name": "金额"}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + assert "发票代码" not in result + + def test_validate_element_count_passes(self): + ocr = [ + {"field_name": "customer_name"}, + {"field_name": "total_amount"}, + {"field_name": "invoice_date"}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + validation = validate_element_count( + JRXML_WITH_PLACEHOLDERS, result, "map_fields" + ) + assert validation["ok"] is True + assert validation["modified"] == validation["original"] + + def test_expression_with_multiple_fields(self): + """包含多个 $F{} 的表达式正确替换。""" + ocr = [ + {"field_name": "unit_price"}, + {"field_name": "quantity"}, + ] + result = _programmatic_map_fields(JRXML_WITH_PLACEHOLDERS, ocr) + assert '$F{unit_price}' in result + assert '$F{quantity}' in result + assert '$F{field_1}' not in result + assert '$F{field_2}' not in result