This commit is contained in:
zlwu committed 2026-09-01 13:51:32 +08:00
1 parent ba21c40058
commit 0e8f244bc3
16 files changed
+405027 -2098

No files matched your search

-1
View File
@@ -1 +0,0 @@
80580
@@ -554,6 +554,18 @@ def assert_delivery_products_in_selected_contract(
)
def assert_stop_contract_required(
customer_name: Optional[str],
contracts: Optional[list[PlanContractLink]],
side_label: str,
) -> None:
"""非内部客户装/送货段保存时必须至少选一份合同。"""
if is_internal_customer_name(customer_name):
return
if not _normalize_contract_links(contracts):
raise HTTPException(status_code=422, detail=f"请为{side_label}选择合同")
def _resolve_stop_contracts(
db: Session,
tenant_no: str,
@@ -602,6 +614,8 @@ def validate_plan_stops_write(
if products is not None and not products:
raise HTTPException(status_code=422, detail="请至少保留一条产品明细")
assert_stop_contract_required(load.customer_name, load.contracts, "装货客户")
load.contracts = _resolve_stop_contracts(
db,
tenant_no,
@@ -615,6 +629,7 @@ def validate_plan_stops_write(
for idx, delivery in enumerate(deliveries, start=1):
if not (delivery.customer_id or "").strip() or not (delivery.customer_name or "").strip():
raise HTTPException(status_code=422, detail=f"送货段#{idx}请选择客户")
assert_stop_contract_required(delivery.customer_name, delivery.contracts, f"送货段#{idx}")
delivery.contracts = _resolve_stop_contracts(
db,
tenant_no,
@@ -12,6 +12,7 @@ from app.services.pl_plan_stop_service import (
assert_at_most_one_contract,
assert_delivery_products_in_selected_contract,
assert_load_products_in_selected_contract,
assert_stop_contract_required,
)
@@ -217,3 +218,22 @@ def test_assert_delivery_products_skips_internal_customer():
],
)
assert_delivery_products_in_selected_contract(db, "shanxia2.0", delivery, 1)
def test_assert_stop_contract_required_rejects_external_without_contract():
with pytest.raises(HTTPException) as exc:
assert_stop_contract_required("外部客户A", [], "装货客户")
assert exc.value.status_code == 422
assert exc.value.detail == "请为装货客户选择合同"
def test_assert_stop_contract_required_allows_external_with_contract():
links = [PlanContractLink(contractId="c1", contractNo="N1")]
assert_stop_contract_required("外部客户A", links, "装货客户") is None
def test_assert_stop_contract_required_skips_internal_customer():
from app.services.pl_internal_customer import INTERNAL_CUSTOMER_NAMES
internal = next(iter(INTERNAL_CUSTOMER_NAMES))
assert_stop_contract_required(internal, [], "装货客户") is None
+16 -16
View File
@@ -1430,8 +1430,8 @@
"semantic_hash": ""
},
"src/components/business/pl-plan-delivery-section/index.vue": {
"mtime": 1788093746.73275,
"ast_hash": "e6e829e9c252352f28ea39f1e8b30e47",
"mtime": 1788171050.7485294,
"ast_hash": "4a252f5e5b88175e6297f023e2e758ef",
"semantic_hash": ""
},
"src/components/business/pl-plan-document-attachment-cell/index.vue": {
@@ -1450,8 +1450,8 @@
"semantic_hash": ""
},
"src/components/business/pl-plan-form-dialog/index.vue": {
"mtime": 1788093747.6141834,
"ast_hash": "e909c284ef4b23a61796b456c5dfb627",
"mtime": 1788171051.8256836,
"ast_hash": "cfeffd142c2f936b14f5a20647f4bd46",
"semantic_hash": ""
},
"src/components/business/pl-plan-hazard-cert-view-table/index.vue": {
@@ -1470,8 +1470,8 @@
"semantic_hash": ""
},
"src/components/business/pl-plan-load-section/index.vue": {
"mtime": 1788081368.0300012,
"ast_hash": "4bd291d01425f84d814f15d2a9c99f66",
"mtime": 1788171043.5409737,
"ast_hash": "4ccce56b07b57391f2438eee74fd5fd7",
"semantic_hash": ""
},
"src/components/business/pl-plan-pound-qrcode-pick-dialog/index.vue": {
@@ -1490,8 +1490,8 @@
"semantic_hash": ""
},
"src/components/business/pl-plan-stop-product-table/index.vue": {
"mtime": 1788083765.48548,
"ast_hash": "2bebc5e4901312469ae35f4acbf6aa01",
"mtime": 1788170821.9421327,
"ast_hash": "82b73f20cd39c5e0418d1344292d3cc5",
"semantic_hash": ""
},
"src/components/business/pl-plan-stops-split-shell/index.vue": {
@@ -2015,8 +2015,8 @@
"semantic_hash": ""
},
"src/components/core/layouts/art-page-content/index.vue": {
"mtime": 1785574166.2589664,
"ast_hash": "acb2c52fb67a465de38da3cccf949018",
"mtime": 1788181103.2136374,
"ast_hash": "27a31281a28736c01bbb0937939ed6fa",
"semantic_hash": ""
},
"src/components/core/layouts/art-portal-header/index.vue": {
@@ -2620,13 +2620,13 @@
"semantic_hash": ""
},
"src/router/modules/pl.ts": {
"mtime": 1787199071.7289624,
"ast_hash": "d17221d4726e34f1207420bf6b97b3d7",
"mtime": 1788181128.161052,
"ast_hash": "d9efaabd115d3530af15a6f693a1fbba",
"semantic_hash": ""
},
"src/router/modules/sqxp.ts": {
"mtime": 1786780828.210205,
"ast_hash": "483748ffa0479d49fd76f8dee5636622",
"mtime": 1788181128.1625063,
"ast_hash": "15bda25f5b1e7a739c225a71291141b5",
"semantic_hash": ""
},
"src/router/routes/asyncRoutes.ts": {
@@ -3010,8 +3010,8 @@
"semantic_hash": ""
},
"src/utils/navigation/preopen-favorites.ts": {
"mtime": 1786164383.405394,
"ast_hash": "4e22e56eb2836a49d2e948e92c72c6fd",
"mtime": 1788181132.2266092,
"ast_hash": "8bc93ef8de43e20299c3bef017b86c3b",
"semantic_hash": ""
},
"src/utils/navigation/route.ts": {
+4 -2
View File
@@ -262,14 +262,18 @@
"260": "Community 260",
"261": "Community 261",
"262": "index.js",
"263": "canPreview",
"264": "syncStatsColumnWidths",
"265": "Community 265",
"266": "crypto.ts",
"267": "fetchData",
"268": "index.vue",
"269": "Community 269",
"270": "Community 270",
"271": "SettingDrawer.vue",
"272": "index.vue",
"273": "canDeleteByCreator",
"274": "index.vue",
"275": "index.js",
"276": "tabs.ts",
"277": "handleKeyDown",
@@ -282,7 +286,6 @@
"284": "Community 284",
"285": "Community 285",
"286": "Community 286",
"287": "fastEnter.ts",
"288": "loadUserOptions",
"289": "handleEdit",
"290": "index.js",
@@ -336,7 +339,6 @@
"341": "Community 341",
"342": "error-handle.ts",
"344": "ArtException.vue",
"345": "loadUserOptions",
"346": "Community 346",
"347": "Community 347",
"349": "Community 349",
@@ -0,0 +1,837 @@
{
"0": "Community 0",
"1": "Community 1",
"2": "Community 2",
"3": "Community 3",
"4": "Community 4",
"5": "Community 5",
"6": "Community 6",
"7": "Community 7",
"8": "Community 8",
"9": "Community 9",
"10": "Community 10",
"11": "Community 11",
"12": "Community 12",
"13": "Community 13",
"14": "Community 14",
"15": "Community 15",
"16": "Community 16",
"17": "Ha",
"18": "Community 18",
"19": "Community 19",
"20": "Community 20",
"21": "Community 21",
"22": "Community 22",
"23": "Community 23",
"24": "Community 24",
"25": "Community 25",
"26": "theme.min.js",
"27": "Community 27",
"28": "useCommon",
"29": "Community 29",
"30": "loader.ts",
"31": "RenewDialog.vue",
"32": "index.vue",
"33": "Community 33",
"34": "main.ts",
"35": "Community 35",
"36": "VoidDialog.vue",
"37": "pl-batch-print.ts",
"38": "view-fields.ts",
"39": "Community 39",
"40": "Community 40",
"41": "colors.ts",
"42": "Community 42",
"43": "Community 43",
"44": "Community 44",
"45": "Community 45",
"46": "Community 46",
"47": "fetchCustomerDetail",
"48": "Community 48",
"49": "Community 49",
"50": "Community 50",
"51": "price-letter-template.ts",
"52": "Community 52",
"53": "Community 53",
"54": "Community 54",
"55": "Community 55",
"56": "Community 56",
"57": "Community 57",
"58": "Community 58",
"59": "fetchData",
"60": "index.vue",
"61": "Community 61",
"62": "highlight.ts",
"63": "price-letter.ts",
"64": "Community 64",
"65": "detail.vue",
"66": "Community 66",
"67": "index.vue",
"68": "Community 68",
"69": "Community 69",
"70": "Community 70",
"71": "Community 71",
"72": "Community 72",
"73": "Community 73",
"74": "Community 74",
"75": "openEdit",
"76": "handleSearch",
"77": "loadUserOptions",
"78": "customerPool.ts",
"79": "Community 79",
"80": "product.ts",
"81": "Community 81",
"82": "Community 82",
"83": "useDictStore",
"84": "Community 84",
"85": "index.vue",
"86": "Community 86",
"87": "canDeleteByCreator",
"88": "index.vue",
"89": "detail.vue",
"90": "theme.min.js",
"91": "Community 91",
"92": "Community 92",
"93": "ArtUserMenu.vue",
"94": "formatYmd",
"95": "Community 95",
"96": "Community 96",
"97": "stringifyBody",
"98": "index.vue",
"99": "stringifyBody",
"100": "v2.4.2.1 - 2025-06-16",
"101": "price-letter.ts",
"102": "price-letter-template.ts",
"103": "SettingDrawer.vue",
"104": "contractType.ts",
"105": "index.vue",
"106": "Community 106",
"107": "Community 107",
"108": "Community 108",
"109": "Community 109",
"110": "Community 110",
"111": "format.ts",
"112": "inventory.ts",
"113": "Community 113",
"114": "index.vue",
"115": "useDictStore",
"116": "Community 116",
"117": "Community 117",
"118": "zh_CN.js",
"119": "Community 119",
"120": "Community 120",
"121": "chart.ts",
"122": "handleDisburse",
"123": "detail.vue",
"124": "index.vue",
"125": "Community 125",
"126": "Community 126",
"127": "selectContractRow",
"128": "Community 128",
"129": "Community 129",
"130": "system.ts",
"131": "index.vue",
"132": "Community 132",
"133": "Community 133",
"134": "index.vue",
"135": "detail.vue",
"136": "Community 136",
"137": "Community 137",
"138": "FollowDialog.vue",
"139": "RenewDialog.vue",
"140": "Community 140",
"141": "Community 141",
"142": "Community 142",
"143": "index.js",
"144": "Community 144",
"145": "api",
"146": "price-letter-template.ts",
"147": "index.vue",
"148": "Community 148",
"149": "fetchCustomerDetail",
"150": "Community 150",
"151": "Community 151",
"152": "SettingDrawer.vue",
"153": "index.vue",
"154": "index.vue",
"155": "error.ts",
"156": "v2.4.2.1 - 2025-06-16",
"157": "form.vue",
"158": "removeProductsNotAllowedByHazard",
"159": "detail.vue",
"160": "index.vue",
"161": "Community 161",
"162": "Community 162",
"163": "system.ts",
"164": "Community 164",
"165": "handleDisburse",
"166": "Community 166",
"167": "Community 167",
"168": "crypto.ts",
"169": "Community 169",
"170": "Community 170",
"171": "index.vue",
"172": "index.js",
"173": "index.vue",
"174": "Community 174",
"175": "handleEdit",
"176": "fetchData",
"177": "fetchCustomerDetail",
"178": "Community 178",
"179": "Community 179",
"180": "index.vue",
"181": "Community 181",
"182": "Community 182",
"183": "Ha",
"184": "highlight.ts",
"185": "handleConfirmApproval",
"186": "StorageKeyManager",
"187": "Community 187",
"188": "Community 188",
"189": "Community 189",
"190": "error-handle.ts",
"191": "formatYmd",
"192": "prepareLineAliasAndBrandForSubmit",
"193": "crm-product-display.ts",
"194": "index.ts",
"195": "Community 195",
"196": "Community 196",
"197": "v2.4.2.1 - 2025-06-16",
"198": "fetchRoleOptions",
"199": "colors.ts",
"200": "index.js",
"201": "Ha",
"202": "Community 202",
"203": "customerPool.ts",
"204": "DbCrmCustomerSelect.vue",
"205": "loadDefaultCustomerOptions",
"206": "onDrop",
"207": "SettingDrawer.vue",
"208": "index.vue",
"209": "Community 209",
"210": "Community 210",
"211": "navigation.ts",
"212": "index.js",
"213": "Community 213",
"214": "Community 214",
"215": "index.vue",
"216": "VoidDialog.vue",
"217": "index.js",
"218": "price-letter.ts",
"219": "applyBrandSelectChange",
"220": "detail.vue",
"221": "index.js",
"222": "index.vue",
"223": "Community 223",
"224": "Community 224",
"225": "theme.min.js",
"226": "api",
"227": "Community 227",
"228": "Community 228",
"229": "useClientColumnFilters.ts",
"230": "customerPool.ts",
"231": "handlePublish",
"232": "handleConfirmApproval",
"233": "Community 233",
"234": "Community 234",
"235": "colors.ts",
"236": "handleEdit",
"237": "handleDisburse",
"238": "ViewKvTableCell.vue",
"239": "Community 239",
"240": "detail.vue",
"241": "handleExportPdf",
"242": "Community 242",
"243": "Community 243",
"244": "v2.4.2.3 - 2025-06-18",
"245": "index.js",
"246": "fetchData",
"247": "Community 247",
"248": "Community 248",
"249": "SettingItem.vue",
"250": "loadDefaultCustomerOptions",
"251": "handleDisburse",
"252": "index.js",
"253": "Community 253",
"254": "duty.ts",
"255": "Community 255",
"256": "navigation.ts",
"257": "loadDefaultCustomerOptions",
"258": "Ha",
"259": "Community 259",
"260": "Community 260",
"261": "Community 261",
"262": "index.js",
"264": "syncStatsColumnWidths",
"265": "Community 265",
"266": "crypto.ts",
"267": "fetchData",
"269": "Community 269",
"270": "Community 270",
"271": "SettingDrawer.vue",
"272": "index.vue",
"275": "index.js",
"276": "tabs.ts",
"277": "handleKeyDown",
"278": "index.vue",
"279": "fetchData",
"280": "Community 280",
"281": "index.js",
"282": "fetchData",
"283": "Community 283",
"284": "Community 284",
"285": "Community 285",
"286": "Community 286",
"287": "fastEnter.ts",
"288": "loadUserOptions",
"289": "handleEdit",
"290": "index.js",
"292": "Community 292",
"293": "index.vue",
"294": "menuFavorite.ts",
"295": "Community 295",
"296": "Community 296",
"298": "index.vue",
"299": "zh_CN.js",
"300": "form.vue",
"301": "ProcessStatusTag.vue",
"302": "Community 302",
"303": "Community 303",
"304": "Community 304",
"305": "isIoPlanFrozen",
"306": "handleArrange",
"307": "Community 307",
"308": "Community 308",
"309": "Community 309",
"310": "Community 310",
"311": "handleExportPdf",
"312": "index.vue",
"314": "assignmentMatchesFilter",
"315": "Community 315",
"316": "Community 316",
"317": "Community 317",
"318": "Community 318",
"319": "Community 319",
"320": "Community 320",
"321": "Community 321",
"322": "Community 322",
"323": "Community 323",
"324": "Community 324",
"325": "Community 325",
"326": "Community 326",
"327": "Community 327",
"328": "Community 328",
"329": "Community 329",
"330": "Community 330",
"331": "Community 331",
"332": "Community 332",
"333": "Community 333",
"334": "Community 334",
"335": "Community 335",
"336": "Community 336",
"337": "Community 337",
"338": "Community 338",
"339": "Community 339",
"340": "Community 340",
"341": "Community 341",
"342": "error-handle.ts",
"344": "ArtException.vue",
"345": "loadUserOptions",
"346": "Community 346",
"347": "Community 347",
"349": "Community 349",
"350": "Community 350",
"355": "Community 355",
"362": "Community 362",
"367": "Community 367",
"372": "detail.vue",
"377": "Community 377",
"379": "Community 379",
"380": "Community 380",
"381": "Community 381",
"391": "Community 391",
"392": "Community 392",
"393": "Community 393",
"406": "Community 406",
"408": "Community 408",
"410": "Community 410",
"412": "Community 412",
"416": "Community 416",
"417": "Community 417",
"422": "Community 422",
"423": "Community 423",
"424": "Community 424",
"425": "Community 425",
"426": "Community 426",
"427": "Community 427",
"435": "index.vue",
"443": "index.vue",
"444": "index.vue",
"445": "Community 445",
"459": "Community 459",
"460": "Community 460",
"471": "Community 471",
"472": "Community 472",
"474": "Community 474",
"475": "Community 475",
"476": "Community 476",
"487": "Community 487",
"488": "Community 488",
"496": "Community 496",
"499": "Community 499",
"521": "Community 521",
"522": "Community 522",
"528": "Community 528",
"534": "Community 534",
"535": "Community 535",
"536": "Community 536",
"537": "Community 537",
"539": "Community 539",
"540": "Community 540",
"550": "Community 550",
"551": "Community 551",
"552": "Community 552",
"553": "Community 553",
"555": "Community 555",
"556": "Community 556",
"557": "Community 557",
"559": "Community 559",
"560": "Community 560",
"561": "Community 561",
"562": "Community 562",
"571": "Community 571",
"572": "Community 572",
"573": "Community 573",
"574": "Community 574",
"575": "Community 575",
"576": "Community 576",
"580": "Community 580",
"581": "Community 581",
"582": "Community 582",
"583": "Community 583",
"584": "Community 584",
"585": "Community 585",
"586": "Community 586",
"597": "Community 597",
"598": "Community 598",
"599": "Community 599",
"600": "Community 600",
"601": "Community 601",
"602": "Community 602",
"603": "Community 603",
"604": "Community 604",
"607": "Community 607",
"608": "Community 608",
"609": "Community 609",
"610": "Community 610",
"611": "Community 611",
"612": "Community 612",
"613": "Community 613",
"614": "Community 614",
"615": "Community 615",
"630": "Community 630",
"631": "Community 631",
"632": "Community 632",
"633": "Community 633",
"634": "Community 634",
"635": "Community 635",
"636": "Community 636",
"637": "Community 637",
"638": "Community 638",
"639": "Community 639",
"640": "Community 640",
"641": "Community 641",
"642": "Community 642",
"643": "Community 643",
"644": "Community 644",
"645": "Community 645",
"650": "Community 650",
"651": "Community 651",
"652": "Community 652",
"654": "Community 654",
"655": "Community 655",
"658": "Community 658",
"659": "Community 659",
"660": "Community 660",
"662": "Community 662",
"663": "Community 663",
"664": "Community 664",
"665": "Community 665",
"666": "Community 666",
"667": "Community 667",
"668": "Community 668",
"669": "Community 669",
"670": "Community 670",
"671": "Community 671",
"700": "Community 700",
"701": "Fixed",
"702": "Community 702",
"703": "Community 703",
"704": "Community 704",
"705": "Community 705",
"706": "Community 706",
"707": "Community 707",
"710": "Community 710",
"711": "Community 711",
"713": "Community 713",
"715": "Community 715",
"716": "Community 716",
"717": "Community 717",
"718": "Community 718",
"720": "Community 720",
"722": "Community 722",
"723": "Community 723",
"724": "Community 724",
"725": "Community 725",
"726": "Community 726",
"727": "Community 727",
"729": "Community 729",
"730": "Community 730",
"731": "Community 731",
"732": "Community 732",
"733": "Community 733",
"734": "修复",
"766": "新增",
"772": "重构",
"779": "重构",
"785": "⚠️ 重要提示",
"786": "⚠️ 重要提示",
"788": "⚠️ 重要提示",
"796": "OpportunityForm.vue",
"836": "BxInvoiceFileSelect.vue",
"838": "CustomerSelector.vue",
"840": "index.vue",
"857": "index.ts",
"886": "index.vue",
"889": "QuoteSelector.vue",
"892": "index.vue",
"896": "MarkWonDialog.vue",
"950": "BatchUpdateStageDialog.vue",
"1010": "BxApprovalFlowTabs.vue",
"1015": "DealDialog.vue",
"1016": "TransferDialog.vue",
"1017": "BatchUpdateDateDialog.vue",
"1115": "v2.4.2.7 - 2025-06-25",
"1117": "v2.5.2 - 2025-07-13",
"1118": "v2.4.2.2 - 2025-06-16",
"1123": "v2.4.1.1 - 2025-06-07",
"1126": "v2.4.2.1 - 2025-06-16",
"1127": "v2.4.2.4 - 2025-06-18",
"1197": "icons.js",
"1198": "icons.min.js",
"1199": "index.js",
"1201": "index.js",
"1204": "plugin.js",
"1205": "plugin.min.js",
"1206": "index.js",
"1207": "plugin.js",
"1208": "plugin.min.js",
"1210": "plugin.js",
"1211": "plugin.min.js",
"1212": "index.js",
"1213": "plugin.js",
"1214": "plugin.min.js",
"1215": "index.js",
"1216": "index.js",
"1217": "plugin.js",
"1218": "plugin.min.js",
"1219": "index.js",
"1220": "index.js",
"1222": "emojiimages.js",
"1223": "emojiimages.min.js",
"1224": "emojis.js",
"1225": "emojis.min.js",
"1228": "ar.js",
"1229": "bg_BG.js",
"1230": "ca.js",
"1231": "cs.js",
"1232": "da.js",
"1233": "de.js",
"1234": "el.js",
"1235": "es.js",
"1236": "eu.js",
"1237": "fa.js",
"1238": "fi.js",
"1239": "fr_FR.js",
"1240": "he_IL.js",
"1241": "hi.js",
"1242": "hr.js",
"1243": "hu_HU.js",
"1244": "id.js",
"1245": "it.js",
"1246": "ja.js",
"1247": "kk.js",
"1248": "ko_KR.js",
"1249": "ms.js",
"1250": "nb_NO.js",
"1251": "nl.js",
"1252": "pl.js",
"1253": "pt_BR.js",
"1254": "pt_PT.js",
"1255": "ro.js",
"1256": "ru.js",
"1257": "sk.js",
"1258": "sl_SI.js",
"1259": "sv_SE.js",
"1260": "th_TH.js",
"1261": "tr.js",
"1262": "uk.js",
"1263": "vi.js",
"1265": "zh_TW.js",
"1266": "index.js",
"1267": "index.js",
"1268": "plugin.js",
"1269": "_",
"1271": "plugin.js",
"1272": "plugin.min.js",
"1277": "plugin.js",
"1278": "plugin.min.js",
"1280": "plugin.js",
"1281": "plugin.min.js",
"1283": "plugin.js",
"1284": "plugin.min.js",
"1287": "plugin.js",
"1288": "plugin.min.js",
"1292": "index.js",
"1293": "plugin.js",
"1294": "plugin.min.js",
"1297": "plugin.js",
"1298": "plugin.min.js",
"1299": "content.js",
"1300": "content.js",
"1301": "content.js",
"1302": "content.js",
"1303": "content.js",
"1304": "content.js",
"1305": "content.inline.js",
"1306": "content.js",
"1307": "skin.js",
"1308": "skin.shadowdom.js",
"1309": "content.inline.js",
"1310": "content.js",
"1311": "skin.js",
"1312": "skin.shadowdom.js",
"1313": "content.inline.js",
"1314": "content.js",
"1315": "skin.js",
"1316": "skin.shadowdom.js",
"1317": "content.inline.js",
"1318": "content.js",
"1319": "skin.js",
"1320": "skin.shadowdom.js",
"1324": "index.vue",
"1325": "index.vue",
"1326": "route-parent.vue",
"1327": "setupSubpackSlipEditorTypeCheckboxes",
"1328": "修复",
"1329": "优化",
"1330": "新增",
"1331": "⚠️ 重要提示",
"1332": "重构",
"1333": "优化",
"1334": "修复",
"1335": "新增",
"1336": "升级",
"1337": "⚠️ 重要提示",
"1338": "修复",
"1339": "优化",
"1340": "新增",
"1341": "优化",
"1342": "修复",
"1343": "⚠️ 重要提示",
"1344": "升级",
"1345": "修复",
"1346": "优化",
"1347": "⚠️ 重要提示",
"1348": "新增",
"1349": "修复",
"1350": "优化",
"1351": "新增",
"1352": "优化",
"1353": "修复",
"1354": "新增",
"1355": "重构",
"1356": "优化",
"1357": "修复",
"1358": "移除",
"1359": "新增",
"1360": "优化",
"1361": "修复",
"1362": "新增",
"1363": "重构",
"1364": "升级",
"1365": "优化",
"1366": "修复",
"1367": "新增",
"1368": "优化",
"1369": "修复",
"1370": "优化",
"1371": "修复",
"1372": "新增",
"1373": "重构",
"1374": "升级",
"1375": "移除",
"1376": "修复",
"1377": "⚠️ 重要提示",
"1378": "重构",
"1379": "优化",
"1380": "修复",
"1381": "修复",
"1382": "新增",
"1383": "优化",
"1384": "修复",
"1385": "重构",
"1386": "优化",
"1387": "新增",
"1388": "重构",
"1389": "重构",
"1390": "优化",
"1391": "重构",
"1392": "优化",
"1393": "重构",
"1394": "重构",
"1395": "修复",
"1396": "重构",
"1397": "新增",
"1398": "优化",
"1399": "修复",
"1400": "⚠️ 重要提示",
"1401": "优化",
"1402": "修复",
"1403": "新增",
"1404": "优化",
"1405": "修复",
"1406": "重构",
"1407": "新增",
"1408": "优化",
"1409": "⚠️ 重要提示",
"1410": "code:block1 (crm/clue/)",
"1411": "code:typescript ({)",
"1412": "code:block3 (crm:clue:list # 线索列表查询)",
"1413": "code:bash (mysql -u root -p your_database < crm/sql/crm/12-CRM字典数据汇总.md)",
"9890": "README.md",
"9959": "Fixed",
"9960": "Fixed",
"9961": "Fixed",
"9962": "Fixed",
"9963": "Fixed",
"9964": "Fixed",
"9965": "Fixed",
"9966": "Fixed",
"9967": "Fixed",
"9968": "Fixed",
"9969": "Fixed",
"9970": "Fixed",
"9971": "Fixed",
"9972": "Fixed",
"9973": "Fixed",
"9974": "⚠️ Important Notice",
"9975": "⚠️ Important Notice",
"9976": "⚠️ Important Notice",
"9977": "⚠️ Important Notice",
"9978": "⚠️ Important Notice",
"9979": "⚠️ Important Notice",
"9980": "⚠️ Important Notice",
"9981": "Optimized",
"9982": "Optimized",
"9983": "Optimized",
"9984": "Optimized",
"9985": "Optimized",
"9986": "Optimized",
"9987": "Optimized",
"9988": "Optimized",
"9989": "Optimized",
"9990": "Optimized",
"9991": "Optimized",
"9992": "Optimized",
"9993": "Optimized",
"9994": "Optimized",
"9995": "Optimized",
"9996": "Optimized",
"9997": "Optimized",
"9998": "Optimized",
"9999": "Optimized",
"10000": "Optimized",
"10001": "Refactored",
"10002": "Refactored",
"10003": "Refactored",
"10004": "Refactored",
"10005": "Refactored",
"10006": "Refactored",
"10007": "Refactored",
"10008": "Refactored",
"10009": "Refactored",
"10010": "Refactored",
"10011": "Refactored",
"10012": "Refactored",
"10013": "Removed",
"10014": "Removed",
"10015": "Upgraded",
"10016": "Upgraded",
"10017": "Upgraded",
"10018": "Upgraded",
"10019": "优化",
"10020": "修复",
"10021": "⚠️ 重要提示",
"10022": "修复",
"10023": "优化",
"10024": "优化",
"10025": "⚠️ 重要提示",
"10026": "修复",
"10027": "优化",
"10028": "优化",
"10029": "修复",
"10030": "重构",
"10031": "优化",
"10032": "修复",
"10033": "新增",
"10034": "移除",
"10035": "优化",
"10036": "修复",
"10037": "重构",
"10038": "升级",
"10039": "优化",
"10040": "修复",
"10041": "优化",
"10042": "修复",
"10043": "修复",
"10044": "重构",
"10045": "升级",
"10046": "移除",
"10047": "修复",
"10048": "⚠️ 重要提示",
"10049": "⚠️ 重要提示",
"10050": "优化",
"10051": "修复",
"10052": "优化",
"10053": "修复",
"10054": "优化",
"10055": "新增",
"10056": "重构",
"10057": "优化",
"10058": "优化",
"10059": "重构",
"10060": "修复",
"10061": "新增",
"10062": "优化",
"10063": "修复",
"10064": "优化",
"10065": "⚠️ 重要提示",
"10066": "优化",
"10067": "修复",
"10068": "优化",
"10069": "修复",
"10070": "新增",
"10071": "优化",
"10072": "⚠️ 重要提示",
"10073": "修复",
"10074": "新增",
"10075": "升级",
"10076": "⚠️ 重要提示",
"10077": "修复",
"10078": "优化",
"10079": "code:bash (# Install dependencies)",
"10080": "code:bash (pnpm clean:dev)",
"10081": "code:bash (# 安装依赖)",
"10082": "code:bash (pnpm clean:dev)"
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -1927,20 +1927,20 @@
return true
}
/** 安排运输前:非内部客户(山峡/云栋)的装/送货段必须至少选一份合同 */
function validateContractsForArrange() {
/** 非内部客户(山峡/云栋)的装/送货段必须至少选一份合同(保存与安排均校验) */
function validateStopContractsRequired() {
if (
!isPlInternalCustomerName(loadForm.value.customerName) &&
!stopHasSelectedContract(loadForm.value.contracts)
) {
ElMessage.warning('安排运输前请为装货客户选择合同')
ElMessage.warning('请为装货客户选择合同')
return false
}
for (let i = 0; i < deliveryForms.value.length; i += 1) {
const row = deliveryForms.value[i]
if (isPlInternalCustomerName(row.customerName)) continue
if (!stopHasSelectedContract(row.contracts)) {
ElMessage.warning(`安排运输前请为送货段#${i + 1}选择合同`)
ElMessage.warning(`请为送货段#${i + 1}选择合同`)
return false
}
}
@@ -1984,6 +1984,7 @@
const valid = await basicFormRef.value?.validate().catch(() => false)
if (!valid || !validateBusinessRules()) return
if (!validateSingleContractPerStop()) return
if (!validateStopContractsRequired()) return
if (mode === 'saveAndArrange' || mode === 'rearrange') {
const missing = getArrangePrerequisiteGaps()
@@ -1995,7 +1996,6 @@
ElMessage.warning('安排运输前请选择车辆')
return
}
if (!validateContractsForArrange()) return
if (!validateStopProductsForArrange()) return
}
@@ -64,7 +64,8 @@
const { pageTransition, containerWidth, refresh, showWorkTab } = storeToRefs(useSettingStore())
const { keepAliveExclude } = storeToRefs(useWorktabStore())
const keepAliveMax = computed(() => (showWorkTab.value ? 10 : 1))
// 多 Tab 常开场景下缓存过多会占满内存导致整机卡顿;上限压到 5
const keepAliveMax = computed(() => (showWorkTab.value ? 5 : 1))
const isRefresh = shallowRef(true)
const isOpenRouteInfo = import.meta.env.VITE_OPEN_ROUTE_INFO
+24 -24
View File
@@ -22,21 +22,21 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlPlan',
path: 'plan',
component: '/pl/plan/index',
meta: { title: '运输计划', keepAlive: true, menuCode: 'pl:plan:list' }
meta: { title: '运输计划', keepAlive: false, menuCode: 'pl:plan:list' }
},
{
id: 'PL00000000000000000000000000016',
name: 'PlPlanArchive',
path: 'plan-archive',
component: '/pl/plan-archive/index',
meta: { title: '运输计划归档', keepAlive: true, menuCode: 'pl:plan-archive:list' }
meta: { title: '运输计划归档', keepAlive: false, menuCode: 'pl:plan-archive:list' }
},
{
id: 'PL_PLAN_CONTRACT',
name: 'PlPlanContract',
path: 'plan-contract',
component: '/pl/plan-contract/index',
meta: { title: '运输计划合同完善', keepAlive: true, menuCode: 'pl:plan-contract:list' }
meta: { title: '运输计划合同完善', keepAlive: false, menuCode: 'pl:plan-contract:list' }
}
]
},
@@ -51,14 +51,14 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlInbound',
path: 'inbound',
component: '/pl/inbound/index',
meta: { title: '入库单', keepAlive: true, menuCode: 'pl:inbound:list' }
meta: { title: '入库单', keepAlive: false, menuCode: 'pl:inbound:list' }
},
{
id: 'PL_OUTBOUND',
name: 'PlOutbound',
path: 'outbound',
component: '/pl/outbound/index',
meta: { title: '出库单', keepAlive: true, menuCode: 'pl:outbound:list' }
meta: { title: '出库单', keepAlive: false, menuCode: 'pl:outbound:list' }
}
]
},
@@ -73,7 +73,7 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlPlanCert',
path: 'plan-cert',
component: '/pl/plan-cert/index',
meta: { title: '危化品证上传', keepAlive: true, menuCode: 'pl:plan-cert:list' }
meta: { title: '危化品证上传', keepAlive: false, menuCode: 'pl:plan-cert:list' }
}
]
},
@@ -88,21 +88,21 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlFreight',
path: 'freight',
component: '/pl/freight/index',
meta: { title: '运费结算', keepAlive: true, menuCode: 'pl:freight:list' }
meta: { title: '运费结算', keepAlive: false, menuCode: 'pl:freight:list' }
},
{
id: 'PL00000000000000000000000000031',
name: 'PlFreightApproval',
path: 'freight-approval',
component: '/pl/freight-approval/index',
meta: { title: '运费结算审批', keepAlive: true, menuCode: 'pl:freight-approval:list' }
meta: { title: '运费结算审批', keepAlive: false, menuCode: 'pl:freight-approval:list' }
},
{
id: 'PL00000000000000000000000000032',
name: 'PlFreightDisburse',
path: 'freight-disburse',
component: '/pl/freight-disburse/index',
meta: { title: '运费财务发放', keepAlive: true, menuCode: 'pl:freight-disburse:list' }
meta: { title: '运费财务发放', keepAlive: false, menuCode: 'pl:freight-disburse:list' }
}
]
},
@@ -117,28 +117,28 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlVehicleRechargeApply',
path: 'vehicle-recharge-apply',
component: '/pl/vehicle-recharge-apply/index',
meta: { title: 'ETC加油申请', keepAlive: true, menuCode: 'pl:vehicle-recharge-apply:list' }
meta: { title: 'ETC加油申请', keepAlive: false, menuCode: 'pl:vehicle-recharge-apply:list' }
},
{
id: 'PL_VEH_RECHARGE_RECORD',
name: 'PlVehicleRechargeRecord',
path: 'vehicle-recharge-record',
component: '/pl/vehicle-recharge-record/index',
meta: { title: 'ETC加油发放登记', keepAlive: true, menuCode: 'pl:vehicle-recharge-record:list' }
meta: { title: 'ETC加油发放登记', keepAlive: false, menuCode: 'pl:vehicle-recharge-record:list' }
},
{
id: 'PL_VEH_MAINT_APPLY',
name: 'PlVehicleMaintenanceApply',
path: 'vehicle-maintenance-apply',
component: '/pl/vehicle-maintenance-apply/index',
meta: { title: '车辆维保申请', keepAlive: true, menuCode: 'pl:vehicle-maintenance-apply:list' }
meta: { title: '车辆维保申请', keepAlive: false, menuCode: 'pl:vehicle-maintenance-apply:list' }
},
{
id: 'PL_VEH_MAINT_PROCESS',
name: 'PlVehicleMaintenanceProcess',
path: 'vehicle-maintenance-process',
component: '/pl/vehicle-maintenance-process/index',
meta: { title: '车辆维保处理登记', keepAlive: true, menuCode: 'pl:vehicle-maintenance-process:list' }
meta: { title: '车辆维保处理登记', keepAlive: false, menuCode: 'pl:vehicle-maintenance-process:list' }
},
{
id: 'PL_VEH_UREA_APPLY',
@@ -147,7 +147,7 @@ export const plRoutes: AppRouteRecord[] = [
component: '/pl/vehicle-urea-apply/index',
meta: {
title: '车辆尿素申请',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'pl:vehicle-urea-apply:list'
}
@@ -159,7 +159,7 @@ export const plRoutes: AppRouteRecord[] = [
component: '/pl/vehicle-urea-disburse/index',
meta: {
title: '车辆尿素发放登记',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'pl:vehicle-urea-disburse:list'
}
@@ -177,7 +177,7 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlDocumentReminder',
path: 'document-reminder',
component: '/pl/inventory/document-reminder',
meta: { title: '证件提醒', keepAlive: true, menuCode: 'pl:document:list' }
meta: { title: '证件提醒', keepAlive: false, menuCode: 'pl:document:list' }
}
]
},
@@ -192,7 +192,7 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlCarrier',
path: 'carrier',
component: '/pl/carrier/index',
meta: { title: '承运商信息', keepAlive: true, menuCode: 'pl:carrier:list' }
meta: { title: '承运商信息', keepAlive: false, menuCode: 'pl:carrier:list' }
},
{
id: 'PL00000000000000000000000000003',
@@ -201,7 +201,7 @@ export const plRoutes: AppRouteRecord[] = [
component: '/pl/vehicle/index',
meta: {
title: '三方车辆',
keepAlive: true,
keepAlive: false,
menuCode: 'pl:vehicle:list',
vehicleTypeLock: 'carrier'
}
@@ -213,7 +213,7 @@ export const plRoutes: AppRouteRecord[] = [
component: '/pl/personnel/index',
meta: {
title: '三方驾押人员',
keepAlive: true,
keepAlive: false,
menuCode: 'pl:personnel-carrier:list',
affiliationMode: 'carrier'
}
@@ -223,7 +223,7 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlSelfVehicle',
path: 'self-vehicle',
component: '/pl/self-vehicle/index',
meta: { title: '山峡自有车辆', keepAlive: true, menuCode: 'pl:self-vehicle:list' }
meta: { title: '山峡自有车辆', keepAlive: false, menuCode: 'pl:self-vehicle:list' }
},
{
id: 'PL00000000000000000000000000004',
@@ -232,7 +232,7 @@ export const plRoutes: AppRouteRecord[] = [
component: '/pl/personnel/index',
meta: {
title: '山峡驾押人员',
keepAlive: true,
keepAlive: false,
menuCode: 'pl:driver:list',
affiliationMode: 'self'
}
@@ -242,7 +242,7 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlTransportAddress',
path: 'transport-address',
component: '/pl/transport-address/index',
meta: { title: '运输地址库', keepAlive: true, menuCode: 'pl:transport-address:list' }
meta: { title: '运输地址库', keepAlive: false, menuCode: 'pl:transport-address:list' }
}
]
},
@@ -287,14 +287,14 @@ export const plRoutes: AppRouteRecord[] = [
name: 'PlTransport',
path: 'transport',
component: '/pl/transport/index',
meta: { title: '运输管理', keepAlive: true, isHide: true, menuCode: 'pl:transport:list' }
meta: { title: '运输管理', keepAlive: false, isHide: true, menuCode: 'pl:transport:list' }
},
{
id: 'PL00000000000000000000000000040',
name: 'PlInventory',
path: 'inventory',
component: '/pl/inventory/ledger',
meta: { title: '库存台账', keepAlive: true, isHide: true, menuCode: 'pl:inventory:list' }
meta: { title: '库存台账', keepAlive: false, isHide: true, menuCode: 'pl:inventory:list' }
},
{
id: 'PL_REDIRECT_PLAN',
+46 -46
View File
@@ -70,7 +70,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/expense-item/index',
meta: {
title: '费用项目管理',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:expenseItem:list'
}
},
@@ -81,7 +81,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/workflow/advance/index',
meta: {
title: '工作流配置(备用金)',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:workflowAdvance:list'
}
},
@@ -92,7 +92,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/workflow/reimburse/index',
meta: {
title: '工作流配置(报销单)',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:workflowReimburse:list'
}
}
@@ -114,7 +114,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/advance/apply/index',
meta: {
title: '备用金申请',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:advanceApply:list'
}
},
@@ -125,7 +125,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/advance/approve/index',
meta: {
title: '备用金审批',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:advanceApprove:list'
}
},
@@ -136,7 +136,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/advance/issue/index',
meta: {
title: '备用金发放',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:advanceIssue:list'
}
}
@@ -158,7 +158,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/reimburse/apply/index',
meta: {
title: '报销申请',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:reimburseApply:list'
}
},
@@ -169,7 +169,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/reimburse/approve/index',
meta: {
title: '报销审批',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:reimburseApprove:list'
}
},
@@ -180,7 +180,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/payment/index',
meta: {
title: '支付发放冲抵',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:payment:list'
}
},
@@ -191,7 +191,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/invoice-wallet/admin/index',
meta: {
title: '发票夹管理',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:invoiceWallet:admin'
}
},
@@ -202,7 +202,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/invoice-wallet/mine/index',
meta: {
title: '我的发票夹',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:invoiceWallet:mine'
}
}
@@ -224,7 +224,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/view/mine/index',
meta: {
title: '我的申请单',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:viewMine:list'
}
},
@@ -235,7 +235,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/view/todo/index',
meta: {
title: '待我审批',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:viewTodo:list'
}
},
@@ -246,7 +246,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/bx/view/all/index',
meta: {
title: '全部申请单(总经理)',
keepAlive: true,
keepAlive: false,
menuCode: 'bx:viewAll:list'
}
}
@@ -277,7 +277,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/product-category/index',
meta: {
title: '产品分类',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:productCategory:list'
}
@@ -287,21 +287,21 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
name: 'CrmProduct',
path: 'product',
component: '/crm/product/index',
meta: { title: '产品管理', keepAlive: true, menuCode: 'crm:product:list' }
meta: { title: '产品管理', keepAlive: false, menuCode: 'crm:product:list' }
},
{
id: 'CRM3000000000000000000000000010',
name: 'CrmQuote',
path: 'quote',
component: '/crm/quote/index',
meta: { title: '报价单管理', keepAlive: true, menuCode: 'crm:quote:list' }
meta: { title: '报价单管理', keepAlive: false, menuCode: 'crm:quote:list' }
},
{
id: 'CRM3000000000000000000000000016',
name: 'CrmQuoteApproval',
path: 'quote-approval',
component: '/crm/quote/approval/index',
meta: { title: '报价单审批', keepAlive: true, menuCode: 'crm:quote:approve' }
meta: { title: '报价单审批', keepAlive: false, menuCode: 'crm:quote:approve' }
},
{
id: 'CRM3000000000000000000000000015',
@@ -310,7 +310,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/quote/approver-setting/index',
meta: {
title: '报价单审批人设置',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:quote:approverSetting'
}
@@ -347,7 +347,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/quote/statistics',
meta: {
title: '报价单统计',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:quote:list'
}
@@ -357,14 +357,14 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
name: 'CrmContract',
path: 'contract',
component: '/crm/contract/index',
meta: { title: '合同管理', keepAlive: true, menuCode: 'crm:contract:list' }
meta: { title: '合同管理', keepAlive: false, menuCode: 'crm:contract:list' }
},
{
id: 'CRM3000000000000000000000000021',
name: 'CrmContractApproval',
path: 'contract-approval',
component: '/crm/contract/approval/index',
meta: { title: '合同审批', keepAlive: true, menuCode: 'crm:contract:approve' }
meta: { title: '合同审批', keepAlive: false, menuCode: 'crm:contract:approve' }
},
{
id: 'CRM3000000000000000000000000026',
@@ -373,7 +373,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/contract/approver-setting/index',
meta: {
title: '合同审批人设置',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:contract:approverSetting'
}
@@ -384,7 +384,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
name: 'CrmPriceLetter',
path: 'price-letter',
component: '/crm/price-letter/index',
meta: { title: '调价函管理', keepAlive: true, menuCode: 'crm:priceLetter:list' }
meta: { title: '调价函管理', keepAlive: false, menuCode: 'crm:priceLetter:list' }
},
{
id: 'CRM3000000000000000000000000027',
@@ -417,7 +417,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/contract/change/index',
meta: {
title: '合同变更',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:contract:change:list'
}
@@ -429,7 +429,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/contract/template/index',
meta: {
title: '合同模板',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:contract:template:list'
}
@@ -441,7 +441,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/contract/approval-record/index',
meta: {
title: '合同审批记录',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:contract:approval:list'
}
@@ -451,7 +451,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
name: 'CrmCustomer',
path: 'customer',
component: '/crm/customer/index',
meta: { title: '客户管理', keepAlive: true, menuCode: 'crm:customer:list' }
meta: { title: '客户管理', keepAlive: false, menuCode: 'crm:customer:list' }
}
]
},
@@ -478,7 +478,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/db/dashboard/index',
meta: {
title: '仪表盘',
keepAlive: true,
keepAlive: false,
menuCode: 'db:dashboard:list'
}
},
@@ -489,7 +489,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/db/plans/index',
meta: {
title: '地磅计划',
keepAlive: true,
keepAlive: false,
menuCode: 'db:plan:list'
}
},
@@ -500,7 +500,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/db/inventory/index',
meta: {
title: '地磅出入库',
keepAlive: true,
keepAlive: false,
menuCode: 'db:inventory:list'
}
},
@@ -511,7 +511,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/db/weighing/index',
meta: {
title: '地磅单管理',
keepAlive: true,
keepAlive: false,
menuCode: 'db:weighing:list'
}
},
@@ -569,7 +569,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/system/workflow/process/index',
meta: {
title: '流程配置',
keepAlive: true,
keepAlive: false,
icon: 'workflow',
menuCode: 'workflow:process'
}
@@ -581,7 +581,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/system/workflow/task-pending/index',
meta: {
title: '待办中心',
keepAlive: true,
keepAlive: false,
menuCode: 'workflow:pending'
}
},
@@ -592,7 +592,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/system/workflow/task-completed/index',
meta: {
title: '已办中心',
keepAlive: true,
keepAlive: false,
menuCode: 'workflow:completed'
}
},
@@ -603,7 +603,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/system/workflow/my-applications/index',
meta: {
title: '我的申请',
keepAlive: true,
keepAlive: false,
menuCode: 'workflow:myApplications'
}
},
@@ -614,7 +614,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/system/leave/index',
meta: {
title: '请假申请',
keepAlive: true,
keepAlive: false,
menuCode: 'workflow:leave'
}
}
@@ -769,7 +769,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/supplier-hazard/index',
meta: {
title: '主体危化品能力',
keepAlive: true,
keepAlive: false,
menuCode: 'crm:supplierHazard:list'
}
},
@@ -778,7 +778,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
name: 'CrmClue',
path: 'clue',
component: '/crm/clue/index',
meta: { title: '线索管理', keepAlive: true, menuCode: 'crm:clue:list' }
meta: { title: '线索管理', keepAlive: false, menuCode: 'crm:clue:list' }
},
{
id: 'CRM1000000000000000000000000011',
@@ -799,7 +799,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/clue/statistics/index',
meta: {
title: '线索统计',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:clue:statistics'
}
@@ -809,7 +809,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
name: 'CrmOpportunity',
path: 'opportunity',
component: '/crm/opportunity/index',
meta: { title: '商机管理', keepAlive: true, menuCode: 'crm:opportunity:list' }
meta: { title: '商机管理', keepAlive: false, menuCode: 'crm:opportunity:list' }
},
{
id: 'CRM2000000000000000000000000011',
@@ -830,7 +830,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/opportunity/kanban',
meta: {
title: '商机看板',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:opportunity:list'
}
@@ -842,7 +842,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/opportunity/funnel',
meta: {
title: '销售漏斗',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:opportunity:list'
}
@@ -854,7 +854,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/opportunity/statistics',
meta: {
title: '商机统计',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:opportunity:list'
}
@@ -864,7 +864,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
name: 'CrmCustomerPool',
path: 'customer-pool',
component: '/crm/customer/pool/index',
meta: { title: '公海池', keepAlive: true, menuCode: 'crm:customerPool:list' }
meta: { title: '公海池', keepAlive: false, menuCode: 'crm:customerPool:list' }
},
{
id: 'CRM1000000000000000000000000004',
@@ -873,7 +873,7 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/crm/customer/pool/RuleIndex',
meta: {
title: '公海池规则',
keepAlive: true,
keepAlive: false,
isHide: true,
menuCode: 'crm:poolRule:list'
}
@@ -67,13 +67,15 @@ export async function preopenFavoriteTabsIfNeeded(userId: string): Promise<strin
if (isFirst) {
firstFavPath = card.path
}
// 跟随路由 meta,避免重业务页被收藏预开强制缓存
const routeKeepAlive = Boolean(resolved.meta?.keepAlive)
worktab.openTab(
{
path: card.path,
title: card.title,
name: String(resolved.name || ''),
fixedTab: false,
keepAlive: true
keepAlive: routeKeepAlive
},
{ activate: isFirst }
)