diff --git a/config.json b/config.json index 4103653..7b53a46 100644 --- a/config.json +++ b/config.json @@ -23,8 +23,6 @@ "证件类型": "身份证", "保价金额": "", "代收货款": "", - "运输类型": "基本", - "内件属性": "其他", "件数": "1", "保价标志": "不保价", "回单标志": "无回单", diff --git a/engine.py b/engine.py index b2476ce..932bef8 100644 --- a/engine.py +++ b/engine.py @@ -315,6 +315,8 @@ class PickupEngine: self._sender_realname: dict = {} # 地址匹配结果 self._address_match: dict = {} + # 运输类型(由 UI 下拉框选择,来自 transmode 数组的 propertyCode) + self._transport_type: str = "" def _ulog(self, msg: str) -> None: _lu(msg) @@ -490,7 +492,7 @@ class PickupEngine: start_time = datetime.now() result = {"status": "失败", "message": "", "postage": "", "time": "", "寄达地": "", "单号": row.get("单号", "").strip(), "重量": row.get("重量", "").strip(), - "产品": "", "客户": "", "寄达地区划代码": "", "寄件人姓名": "", "寄件地址": ""} + "产品": "", "客户": "", "运输类型": "", "寄达地区划代码": "", "寄件人姓名": "", "寄件地址": ""} try: await self._check_pause() @@ -550,6 +552,7 @@ class PickupEngine: result["寄达地区划代码"] = form_data.get("receiverDistrictNo", "") result["寄件人姓名"] = form_data.get("senderLinker", "") result["寄件地址"] = form_data.get("senderAddr", "") + result["运输类型"] = form_data.get("transferType", "") elapsed = (datetime.now() - start_time).total_seconds() if submit_result.get("success"): @@ -857,6 +860,9 @@ class PickupEngine: ipt = self._product_detail.get("innerpartsType", "") if ipt: form["contentsAttribute"] = str(ipt) + # 运输类型(UI 下拉框选择,来自 transmode 数组) + if self._transport_type: + form["transferType"] = self._transport_type if self._customer_choice: # senders 用全名(带前缀如 qxsm-穹诩商贸),sender 用短名 diff --git a/field_mapping.py b/field_mapping.py index 050a4ba..f3aff05 100644 --- a/field_mapping.py +++ b/field_mapping.py @@ -37,8 +37,6 @@ BUILTIN_FIELD_MAP: dict[str, str] = { "保价金额": "insuranceAmount", "代收货款": "codAmount", # ── 系统保留字段(通常不需要在 Excel 中填写,只用默认值)── - "运输类型": "transferType", - "内件属性": "contentsAttribute", "件数": "quantity", "保价标志": "insuranceFlag", "回单标志": "receiptFlag", @@ -129,49 +127,6 @@ CODE_MAP: dict[str, dict[str, str]] = { "证件类型": { "身份证": "01", }, - "运输类型": { - "基本": "1", - "陆运": "3", - }, - "内件属性": { - "其他": "00", - "身份证": "01", - "录取通知书": "02", - "法院专递": "03", - "护照": "04", - "通行证": "05", - "签证": "06", - "驾驶证": "07", - "保险文书": "08", - "银行票据": "09", - "行驶证": "10", - "交通违章通知书": "11", - "纳税申报": "12", - "到货通知书": "13", - "公证书": "14", - "学生档案": "15", - "准考证": "16", - "成绩单": "17", - "药监批件": "18", - "移动配送": "19", - "劳动仲裁": "20", - "合格证": "21", - "健康证": "22", - "火车票": "23", - "房证": "24", - "企业代码证": "25", - "教材": "26", - "福利彩票": "27", - "病历": "28", - "银企对账单": "29", - "学位证书": "30", - "车辆档案": "31", - "交房通知书": "32", - "车牌": "36", - "信用卡": "41", - "检察专递": "53", - "法院专递回执": "54", - }, "保价标志": { "不保价": "1", }, diff --git a/main.py b/main.py index 84f7917..2817d98 100644 --- a/main.py +++ b/main.py @@ -125,6 +125,7 @@ class App: self.fv_force_sender_name = BooleanVar() self.fv_sender_addr = StringVar() self.fv_force_sender_addr = BooleanVar() + self.fv_transport_type = StringVar() # 搜索基础设施(懒加载) self._search_bridge = None @@ -139,6 +140,7 @@ class App: self._customer_cached_choice = None self._customer_cached_detail = None self._sender_realname_cached = None + self._transmode_map = {} # {propertyName: propertyCode} self._build_ui() @@ -253,6 +255,15 @@ class App: Entry(r4, textvariable=self.fv_sender_addr, width=20).pack(side="left", padx=5) Checkbutton(r4, text="强制覆盖", variable=self.fv_force_sender_addr).pack(side="left", padx=5) + # Row 5: 运输类型 | 下拉框(产品选择后自动填充) + r5 = Frame(fixed_frame) + r5.pack(fill=X, pady=2) + Label(r5, text="运输类型:", width=12, anchor="e").pack(side="left") + self.fv_transport_combo = ttk.Combobox(r5, textvariable=self.fv_transport_type, + state="readonly", width=18) + self.fv_transport_combo.pack(side="left", padx=5) + Label(r5, text="(产品选择后自动填充)", fg="gray", font=("", 8)).pack(side="left") + # ── 进度条 ── progress_frame = Frame(self.root) progress_frame.pack(fill=X, padx=10, pady=2) @@ -267,9 +278,9 @@ class App: result_frame = LabelFrame(self.root, text="提交结果", padx=10, pady=5) result_frame.pack(fill="both", expand=True, padx=10, pady=5) - columns = ("单号", "处理状态", "重量", "产品", "客户", "寄达地区划代码", "寄件人姓名", "寄件地址") + columns = ("单号", "处理状态", "重量", "产品", "客户", "运输类型", "寄达地区划代码", "寄件人姓名", "寄件地址") self.result_tree = ttk.Treeview(result_frame, columns=columns, show="headings", height=8) - col_widths = [140, 80, 60, 110, 110, 110, 80, 160] + col_widths = [140, 80, 60, 100, 100, 70, 100, 80, 140] for col, width in zip(columns, col_widths): self.result_tree.heading(col, text=col) self.result_tree.column(col, width=width, anchor="center") @@ -411,6 +422,7 @@ class App: result.get("重量", ""), result.get("产品", ""), result.get("客户", ""), + result.get("运输类型", ""), result.get("寄达地区划代码", ""), result.get("寄件人姓名", ""), result.get("寄件地址", ""), @@ -577,6 +589,18 @@ class App: biz_no = choice.get("bizProductNo", "") if biz_id and biz_no and self._search_api: self._product_cached_detail = self._search_api.select_product(biz_id, biz_no) + # 从产品详情中提取运输类型选项(transmode 数组) + detail = self._product_cached_detail + if isinstance(detail, dict): + transmode = detail.get("transmode", []) + if isinstance(transmode, list) and transmode: + codes = [item["propertyCode"] for item in transmode if "propertyCode" in item] + names = [item["propertyName"] for item in transmode if "propertyName" in item] + self._transmode_map = dict(zip(names, codes)) + self.fv_transport_combo["values"] = names + # 默认选中最后一项 + if names: + self.fv_transport_type.set(names[-1]) except Exception as e: self._log(f"[error] 获取产品详情失败: {e}") self._product_cached_detail = {} @@ -757,6 +781,9 @@ class App: _engine._customer_detail = self._customer_cached_detail if self._sender_realname_cached is not None: _engine._sender_realname = self._sender_realname_cached + transport_name = self.fv_transport_type.get() + if transport_name and self._transmode_map: + _engine._transport_type = self._transmode_map.get(transport_name, "") self._update_status("启动中...") try: @@ -842,6 +869,8 @@ class App: self._customer_cached_choice = None self._customer_cached_detail = None self._sender_realname_cached = None + self.fv_transport_type.set("") + self._transmode_map = {} def _pause(self): global _engine