运输类型/内件属性改为从API获取:删除field_mapping映射和默认值,界面新增运输类型下拉框(transmode数组填充),结果表格增加运输类型列

This commit is contained in:
2026-05-15 20:45:06 +08:00
parent 34ff957671
commit be6319f697
4 changed files with 38 additions and 50 deletions
-2
View File
@@ -23,8 +23,6 @@
"证件类型": "身份证",
"保价金额": "",
"代收货款": "",
"运输类型": "基本",
"内件属性": "其他",
"件数": "1",
"保价标志": "不保价",
"回单标志": "无回单",
+7 -1
View File
@@ -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 用短名
-45
View File
@@ -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",
},
+31 -2
View File
@@ -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