提交
This commit is contained in:
1 parent
d84f4b944c
commit
7c838cfb2d
249 files changed
+50600
-18556
No files matched your search
@@ -44,6 +44,7 @@ Full specs: `openspec/changes/zkxw-engineering-standards/specs/*/spec.md`. Below
|
||||
- **Button icons**: All `web-admin` `el-button` with visible text labels SHALL include a leading `<el-icon>` from `@element-plus/icons-vue` (explicit import). See `openspec/.../ui-conventions/spec.md` §「按钮须携带图标」.
|
||||
- **Sort fields (sort_order/orderNum)**: web-admin 列表、新增弹窗、编辑弹窗中默认不展示排序字段。后续根据功能需要自行添加。
|
||||
- **Status/conclusion/type fields as Tags**: All status, conclusion, and type fields in table columns and view dialogs SHALL render as `<el-tag>` with semantic colors. Tables: use `<el-tag :type="..." size="small">` in column templates. SystemViewDialog: use `tagType` property on `ViewField`. Semantic colors: `success`=正常/启用/已完成/通过, `warning`=进行中/待确认/已过期, `danger`=异常/已作废/拒绝/不通过, `info`=待执行/待生效/停用/默认, `primary`=特殊分类/来源类型. SHALL NOT use plain text or custom `<span class="tag">`. See `openspec/.../ui-conventions/spec.md` "状态、结论与类型字段使用 Tag 标签展示".
|
||||
- **List primary column view link**: List pages with read-only view dialogs SHALL use `<el-link type="primary">` on the primary name/no column to open the view handler; SHALL NOT duplicate a「查看」button in the operation column when the link exists. Keep `@row-dblclick`. For standard CRUD lists (edit/delete only), SHALL NOT have an operation column—place「编辑」「删除」in the list toolbar (edit requires exactly one selected row; delete supports batch) and in `SystemViewDialog` `#hero-actions`. Reference: `crm/product/index.vue`, `system/user/index.vue`. See `openspec/.../ui-conventions/spec.md` §「列表主标识列链接查看与编辑删除外置」.
|
||||
- **Template pages** — new pages SHALL match these exactly:
|
||||
- Standard list: `src/views/system/unit/index.vue`
|
||||
- Complex list: `src/views/system/order/index.vue`
|
||||
|
||||
+13
-1
@@ -2,6 +2,15 @@
|
||||
# DATABASE_URL 格式:mysql+pymysql://user:password@host:port/dbname
|
||||
#DATABASE_URL=mysql+pymysql://root:password@localhost:3306/zkxw
|
||||
|
||||
# 数据库连接池 / 空闲重连(远程 MySQL 或休眠唤醒后避免接口长时间卡住)
|
||||
#DB_CONNECT_TIMEOUT_SEC=10
|
||||
#DB_READ_TIMEOUT_SEC=10
|
||||
#DB_WRITE_TIMEOUT_SEC=10
|
||||
#DB_POOL_RECYCLE_SEC=600
|
||||
#DB_POOL_SIZE=5
|
||||
#DB_MAX_OVERFLOW=10
|
||||
#DB_KEEPALIVE_INTERVAL_SEC=240
|
||||
|
||||
# 与 sys_user.tenant_no 一致;登录按 (tenant_no, user_no) 查用户
|
||||
DEFAULT_TENANT_NO=shanxia2.0
|
||||
# 用户无 sys_user_role 记录时,Web 管理端 JWT 使用的默认角色(super_admin 可全量菜单)
|
||||
@@ -32,7 +41,10 @@ DEFAULT_TENANT_NO=shanxia2.0
|
||||
# REDIS_PORT=6379
|
||||
# REDIS_DB=0
|
||||
# REDIS_PASSWORD=
|
||||
# REDIS_TIMEOUT_SEC=30
|
||||
# REDIS_TIMEOUT_SEC=5
|
||||
# REDIS_CONNECT_TIMEOUT_SEC=5
|
||||
# REDIS_HEALTH_CHECK_INTERVAL_SEC=30
|
||||
# REDIS_OP_TIMEOUT_SEC=3
|
||||
# REDIS_SSL_ENABLED=false
|
||||
|
||||
# MinIO 配置示例
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
17486
|
||||
12399
|
||||
+52
-52
@@ -39,7 +39,7 @@ router = APIRouter(prefix="/web/admin", tags=["运营端管理"])
|
||||
|
||||
|
||||
@router.get("/roles")
|
||||
async def list_roles_for_select(
|
||||
def list_roles_for_select(
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
@@ -71,7 +71,7 @@ async def list_roles_for_select(
|
||||
|
||||
|
||||
@router.get("/users/options")
|
||||
async def list_users_for_select(
|
||||
def list_users_for_select(
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
@@ -94,7 +94,7 @@ async def list_users_for_select(
|
||||
|
||||
|
||||
@router.get("/roles/options")
|
||||
async def list_roles_for_designer(
|
||||
def list_roles_for_designer(
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
@@ -137,7 +137,7 @@ class TenantUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/tenants")
|
||||
async def list_tenants(
|
||||
def list_tenants(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -158,7 +158,7 @@ async def list_tenants(
|
||||
|
||||
|
||||
@router.post("/tenants")
|
||||
async def create_tenant(
|
||||
def create_tenant(
|
||||
body: TenantCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -180,7 +180,7 @@ async def create_tenant(
|
||||
|
||||
|
||||
@router.put("/tenants/{tenant_id}")
|
||||
async def update_tenant(
|
||||
def update_tenant(
|
||||
tenant_id: str,
|
||||
body: TenantUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -205,7 +205,7 @@ async def update_tenant(
|
||||
|
||||
|
||||
@router.delete("/tenants/{tenant_id}")
|
||||
async def delete_tenant(
|
||||
def delete_tenant(
|
||||
tenant_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -268,7 +268,7 @@ class UserUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/users")
|
||||
async def list_users(
|
||||
def list_users(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -312,7 +312,7 @@ async def list_users(
|
||||
|
||||
|
||||
@router.get("/users/{user_id}")
|
||||
async def get_user_by_id(
|
||||
def get_user_by_id(
|
||||
user_id: str,
|
||||
user: dict = Depends(require_menu_code("system:user:list")),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -332,7 +332,7 @@ async def get_user_by_id(
|
||||
|
||||
|
||||
@router.post("/users")
|
||||
async def create_user(
|
||||
def create_user(
|
||||
body: UserCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -365,7 +365,7 @@ async def create_user(
|
||||
|
||||
|
||||
@router.put("/users/{user_id}")
|
||||
async def update_user(
|
||||
def update_user(
|
||||
user_id: str,
|
||||
body: UserUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -395,7 +395,7 @@ async def update_user(
|
||||
|
||||
|
||||
@router.delete("/users/{user_id}")
|
||||
async def delete_user(
|
||||
def delete_user(
|
||||
user_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -408,7 +408,7 @@ async def delete_user(
|
||||
|
||||
|
||||
@router.post("/users/{user_id}/reset-password")
|
||||
async def reset_user_password(
|
||||
def reset_user_password(
|
||||
user_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -444,7 +444,7 @@ class DictTypeUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/dict-types")
|
||||
async def list_dict_types(
|
||||
def list_dict_types(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -460,7 +460,7 @@ async def list_dict_types(
|
||||
|
||||
|
||||
@router.post("/dict-types")
|
||||
async def create_dict_type(
|
||||
def create_dict_type(
|
||||
body: DictTypeCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -482,7 +482,7 @@ async def create_dict_type(
|
||||
|
||||
|
||||
@router.put("/dict-types/{dict_type_id}")
|
||||
async def update_dict_type(
|
||||
def update_dict_type(
|
||||
dict_type_id: str,
|
||||
body: DictTypeUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -507,7 +507,7 @@ async def update_dict_type(
|
||||
|
||||
|
||||
@router.delete("/dict-types/{dict_type_id}")
|
||||
async def delete_dict_type(
|
||||
def delete_dict_type(
|
||||
dict_type_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -546,7 +546,7 @@ class DictDataUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/dict-data")
|
||||
async def list_dict_data(
|
||||
def list_dict_data(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
dictType: Optional[str] = None,
|
||||
@@ -563,7 +563,7 @@ async def list_dict_data(
|
||||
|
||||
|
||||
@router.post("/dict-data")
|
||||
async def create_dict_data(
|
||||
def create_dict_data(
|
||||
body: DictDataCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -587,7 +587,7 @@ async def create_dict_data(
|
||||
|
||||
|
||||
@router.put("/dict-data/{data_id}")
|
||||
async def update_dict_data(
|
||||
def update_dict_data(
|
||||
data_id: str,
|
||||
body: DictDataUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -611,7 +611,7 @@ async def update_dict_data(
|
||||
|
||||
|
||||
@router.delete("/dict-data/{data_id}")
|
||||
async def delete_dict_data(
|
||||
def delete_dict_data(
|
||||
data_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -624,7 +624,7 @@ async def delete_dict_data(
|
||||
|
||||
|
||||
@router.get("/dict-data/options")
|
||||
async def dict_data_options(
|
||||
def dict_data_options(
|
||||
dictType: str = Query(..., alias="dictType"),
|
||||
user: dict = Depends(require_menu_code("system:dict:list")),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -637,7 +637,7 @@ async def dict_data_options(
|
||||
|
||||
|
||||
@router.get("/dict-data/all")
|
||||
async def dict_data_all(
|
||||
def dict_data_all(
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
@@ -691,7 +691,7 @@ class DeptUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/depts")
|
||||
async def list_depts(
|
||||
def list_depts(
|
||||
keyword: Optional[str] = None,
|
||||
user: dict = Depends(require_menu_code("system:dept:list")),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -702,7 +702,7 @@ async def list_depts(
|
||||
|
||||
|
||||
@router.post("/depts")
|
||||
async def create_dept(
|
||||
def create_dept(
|
||||
body: DeptCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -728,7 +728,7 @@ async def create_dept(
|
||||
|
||||
|
||||
@router.put("/depts/{dept_id}")
|
||||
async def update_dept(
|
||||
def update_dept(
|
||||
dept_id: str,
|
||||
body: DeptUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -754,7 +754,7 @@ async def update_dept(
|
||||
|
||||
|
||||
@router.delete("/depts/{dept_id}")
|
||||
async def delete_dept(
|
||||
def delete_dept(
|
||||
dept_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -802,7 +802,7 @@ class SiteUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/sites")
|
||||
async def list_sites(
|
||||
def list_sites(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -816,7 +816,7 @@ async def list_sites(
|
||||
|
||||
|
||||
@router.post("/sites")
|
||||
async def create_site(
|
||||
def create_site(
|
||||
body: SiteCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -844,7 +844,7 @@ async def create_site(
|
||||
|
||||
|
||||
@router.put("/sites/{site_id}")
|
||||
async def update_site(
|
||||
def update_site(
|
||||
site_id: str,
|
||||
body: SiteUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -873,7 +873,7 @@ async def update_site(
|
||||
|
||||
|
||||
@router.delete("/sites/{site_id}")
|
||||
async def delete_site(
|
||||
def delete_site(
|
||||
site_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -911,7 +911,7 @@ class PostUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/posts")
|
||||
async def list_posts(
|
||||
def list_posts(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -925,7 +925,7 @@ async def list_posts(
|
||||
|
||||
|
||||
@router.post("/posts")
|
||||
async def create_post(
|
||||
def create_post(
|
||||
body: PostCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -948,7 +948,7 @@ async def create_post(
|
||||
|
||||
|
||||
@router.put("/posts/{post_id}")
|
||||
async def update_post(
|
||||
def update_post(
|
||||
post_id: str,
|
||||
body: PostUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -972,7 +972,7 @@ async def update_post(
|
||||
|
||||
|
||||
@router.delete("/posts/{post_id}")
|
||||
async def delete_post(
|
||||
def delete_post(
|
||||
post_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -991,7 +991,7 @@ class PostUsersUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/posts/{post_id}/users")
|
||||
async def list_post_bound_users(
|
||||
def list_post_bound_users(
|
||||
post_id: str,
|
||||
user: dict = Depends(require_menu_code("system:post:list")),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -1005,7 +1005,7 @@ async def list_post_bound_users(
|
||||
|
||||
|
||||
@router.put("/posts/{post_id}/users")
|
||||
async def update_post_bound_users(
|
||||
def update_post_bound_users(
|
||||
post_id: str,
|
||||
body: PostUsersUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -1062,7 +1062,7 @@ class MenuUpdateBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/menus")
|
||||
async def list_menus(
|
||||
def list_menus(
|
||||
keyword: Optional[str] = None,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -1073,7 +1073,7 @@ async def list_menus(
|
||||
|
||||
|
||||
@router.post("/menus")
|
||||
async def create_menu(
|
||||
def create_menu(
|
||||
body: MenuCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -1102,7 +1102,7 @@ async def create_menu(
|
||||
|
||||
|
||||
@router.put("/menus/{menu_id}")
|
||||
async def update_menu(
|
||||
def update_menu(
|
||||
menu_id: str,
|
||||
body: MenuUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -1132,7 +1132,7 @@ async def update_menu(
|
||||
|
||||
|
||||
@router.delete("/menus/{menu_id}")
|
||||
async def delete_menu(
|
||||
def delete_menu(
|
||||
menu_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -1181,7 +1181,7 @@ class RoleDataScopeBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/role-management")
|
||||
async def list_role_management(
|
||||
def list_role_management(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -1195,7 +1195,7 @@ async def list_role_management(
|
||||
|
||||
|
||||
@router.post("/role-management")
|
||||
async def create_role_management(
|
||||
def create_role_management(
|
||||
body: RoleCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -1218,7 +1218,7 @@ async def create_role_management(
|
||||
|
||||
|
||||
@router.put("/role-management/{role_id}")
|
||||
async def update_role_management(
|
||||
def update_role_management(
|
||||
role_id: str,
|
||||
body: RoleUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -1242,7 +1242,7 @@ async def update_role_management(
|
||||
|
||||
|
||||
@router.delete("/role-management/{role_id}")
|
||||
async def delete_role_management(
|
||||
def delete_role_management(
|
||||
role_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -1255,7 +1255,7 @@ async def delete_role_management(
|
||||
|
||||
|
||||
@router.get("/role-management/{role_id}/menus")
|
||||
async def get_role_menus(
|
||||
def get_role_menus(
|
||||
role_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -1265,7 +1265,7 @@ async def get_role_menus(
|
||||
|
||||
|
||||
@router.put("/role-management/{role_id}/menus")
|
||||
async def update_role_menus(
|
||||
def update_role_menus(
|
||||
role_id: str,
|
||||
body: RoleMenuBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -1280,7 +1280,7 @@ async def update_role_menus(
|
||||
|
||||
|
||||
@router.get("/role-management/{role_id}/data-scope")
|
||||
async def get_role_data_scope(
|
||||
def get_role_data_scope(
|
||||
role_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -1293,7 +1293,7 @@ async def get_role_data_scope(
|
||||
|
||||
|
||||
@router.put("/role-management/{role_id}/data-scope")
|
||||
async def update_role_data_scope(
|
||||
def update_role_data_scope(
|
||||
role_id: str,
|
||||
body: RoleDataScopeBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -1329,7 +1329,7 @@ def _format_file_size(size_bytes: int) -> str:
|
||||
|
||||
|
||||
@router.post("/attachment/upload")
|
||||
async def upload_attachment(
|
||||
def upload_attachment(
|
||||
file: UploadFile = File(...),
|
||||
folder: Optional[str] = Form(""),
|
||||
biz_type: Optional[str] = Form(None, alias="bizType"),
|
||||
@@ -1342,7 +1342,7 @@ async def upload_attachment(
|
||||
effective_folder = resolve_upload_folder(
|
||||
folder=folder or "", biz_type=biz_type or ""
|
||||
)
|
||||
file_content = await file.read()
|
||||
file_content = file.file.read()
|
||||
full_url = storage.upload_file(file_content, file.filename, effective_folder)
|
||||
base_url = settings.MINIO_BASE_URL.rstrip("/") if settings.MINIO_BASE_URL else ""
|
||||
if base_url and full_url.startswith(base_url + "/"):
|
||||
@@ -1386,7 +1386,7 @@ class AttachmentDownloadUrlBody(BaseModel):
|
||||
|
||||
|
||||
@router.post("/attachment/download-url")
|
||||
async def attachment_download_url(
|
||||
def attachment_download_url(
|
||||
body: AttachmentDownloadUrlBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
|
||||
@@ -30,7 +30,7 @@ def _parse_id_list(ids: str) -> List[str]:
|
||||
|
||||
|
||||
@router.post("/upload", response_model=ApiResponse[AttachmentOut])
|
||||
async def upload_file(
|
||||
def upload_file(
|
||||
file: UploadFile = File(...),
|
||||
biz_type: str = "",
|
||||
biz_id: str = "0",
|
||||
@@ -39,7 +39,7 @@ async def upload_file(
|
||||
):
|
||||
if not file or not file.filename:
|
||||
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="请选择文件")
|
||||
file_data = await file.read()
|
||||
file_data = file.file.read()
|
||||
content_type = (
|
||||
file.content_type
|
||||
or mimetypes.guess_type(file.filename or "")[0]
|
||||
|
||||
+150
-150
File diff suppressed because it is too large.
Load diff
@@ -137,7 +137,7 @@ def _format_file_size(size_bytes: int) -> str:
|
||||
|
||||
|
||||
@router.post("/{token}/attachments")
|
||||
async def upload_public_attachment(
|
||||
def upload_public_attachment(
|
||||
token: str,
|
||||
file: UploadFile = File(...),
|
||||
folder: Optional[str] = Form(""),
|
||||
@@ -156,7 +156,7 @@ async def upload_public_attachment(
|
||||
effective_folder = resolve_upload_folder(
|
||||
folder=folder or "", biz_type="db_inventory_site_feedback"
|
||||
)
|
||||
file_content = await file.read()
|
||||
file_content = file.file.read()
|
||||
full_url = storage.upload_file(file_content, file.filename, effective_folder)
|
||||
base_url = settings.MINIO_BASE_URL.rstrip("/") if settings.MINIO_BASE_URL else ""
|
||||
if base_url and full_url.startswith(base_url + "/"):
|
||||
|
||||
@@ -36,7 +36,7 @@ register_local_callback("/api/admin/leave/callback", _leave_local_callback)
|
||||
|
||||
|
||||
@router.get("")
|
||||
async def list_leaves(
|
||||
def list_leaves(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100),
|
||||
keyword: Optional[str] = Query(None),
|
||||
@@ -59,7 +59,7 @@ async def list_leaves(
|
||||
|
||||
|
||||
@router.post("")
|
||||
async def create_leave(
|
||||
def create_leave(
|
||||
body: LeaveCreate,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -84,7 +84,7 @@ async def create_leave(
|
||||
|
||||
|
||||
@router.post("/{leave_id}/submit")
|
||||
async def submit_leave(
|
||||
def submit_leave(
|
||||
leave_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -139,7 +139,7 @@ async def submit_leave(
|
||||
|
||||
|
||||
@router.post("/callback")
|
||||
async def leave_workflow_callback(
|
||||
def leave_workflow_callback(
|
||||
body: dict,
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
@@ -158,7 +158,7 @@ async def leave_workflow_callback(
|
||||
|
||||
|
||||
@router.get("/{leave_id}")
|
||||
async def get_leave(
|
||||
def get_leave(
|
||||
leave_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -171,7 +171,7 @@ async def get_leave(
|
||||
|
||||
|
||||
@router.delete("/{leave_id}")
|
||||
async def delete_leave(
|
||||
def delete_leave(
|
||||
leave_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -188,7 +188,7 @@ async def delete_leave(
|
||||
|
||||
|
||||
@router.put("/{leave_id}")
|
||||
async def update_leave(
|
||||
def update_leave(
|
||||
leave_id: str,
|
||||
body: LeaveUpdate,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
|
||||
@@ -692,6 +692,6 @@ STATIC_MENU_TREE = [
|
||||
|
||||
|
||||
@router.get("/list")
|
||||
async def get_menu_list(_user: dict = Depends(require_admin_or_super_admin)):
|
||||
def get_menu_list(_user: dict = Depends(require_admin_or_super_admin)):
|
||||
"""获取菜单列表(与当前前端路由一致)"""
|
||||
return success_response({"menuList": STATIC_MENU_TREE})
|
||||
@@ -25,7 +25,7 @@ def _user_info(user: dict) -> dict:
|
||||
|
||||
|
||||
@router.post("/operlog/list")
|
||||
async def operlog_list(
|
||||
def operlog_list(
|
||||
body: OperLogListBody = None,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -64,7 +64,7 @@ async def operlog_list(
|
||||
|
||||
|
||||
@router.post("/operlog/detail")
|
||||
async def operlog_detail(
|
||||
def operlog_detail(
|
||||
body: OperLogDetailBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
|
||||
@@ -22,19 +22,23 @@ from app.models.pl_models import (
|
||||
from app.schemas.pl import (
|
||||
CarrierAuditReject,
|
||||
CarrierCreate,
|
||||
CarrierListResponse,
|
||||
CarrierRead,
|
||||
CarrierUpdate,
|
||||
carrier_to_read,
|
||||
DriverCreate,
|
||||
DriverListResponse,
|
||||
DriverRead,
|
||||
DriverUpdate,
|
||||
PersonnelCreate,
|
||||
PersonnelDetailRead,
|
||||
PersonnelListResponse,
|
||||
PersonnelRead,
|
||||
PersonnelUpdate,
|
||||
VehicleCreate,
|
||||
VehicleDetailRead,
|
||||
VehicleDriverCreate,
|
||||
VehicleListResponse,
|
||||
VehicleRead,
|
||||
VehicleUpdate,
|
||||
)
|
||||
@@ -62,14 +66,16 @@ router = APIRouter(prefix="", tags=["运输计划-基础数据"])
|
||||
# =============================================================================
|
||||
|
||||
|
||||
@router.get("/carrier", response_model=list[CarrierRead])
|
||||
@router.get("/carrier", response_model=CarrierListResponse)
|
||||
def list_carriers(
|
||||
q: Optional[str] = Query(default=None, description="模糊搜索"),
|
||||
status: Optional[str] = Query(default=None, description="状态"),
|
||||
audit_status: Optional[str] = Query(default=None, alias="auditStatus", description="审核状态"),
|
||||
page: int = Query(default=1, ge=1),
|
||||
page_size: int = Query(default=20, ge=1, le=100, alias="pageSize"),
|
||||
db: Session = Depends(get_db),
|
||||
user: DbUserContext = Depends(get_db_current_user),
|
||||
) -> list[CarrierRead]:
|
||||
) -> CarrierListResponse:
|
||||
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
|
||||
query = db.query(PlCarrier).filter(
|
||||
PlCarrier.tenant_no == tenant_no,
|
||||
@@ -96,7 +102,13 @@ def list_carriers(
|
||||
case((PlCarrier.order_num.is_(None), 1), else_=0).asc(),
|
||||
PlCarrier.create_time.desc(),
|
||||
)
|
||||
return [carrier_to_read(row) for row in query.all()]
|
||||
total = query.count()
|
||||
offset = (page - 1) * page_size
|
||||
rows = query.offset(offset).limit(page_size).all()
|
||||
return CarrierListResponse(
|
||||
total=total,
|
||||
list=[carrier_to_read(row) for row in rows],
|
||||
)
|
||||
|
||||
|
||||
@router.post("/carrier", response_model=CarrierRead, status_code=status.HTTP_201_CREATED)
|
||||
@@ -286,7 +298,7 @@ def _vehicle_to_detail(
|
||||
)
|
||||
|
||||
|
||||
@router.get("/vehicle", response_model=list[VehicleRead])
|
||||
@router.get("/vehicle", response_model=VehicleListResponse)
|
||||
def list_vehicles(
|
||||
q: Optional[str] = Query(default=None, description="模糊搜索车牌号"),
|
||||
vehicle_type: Optional[str] = Query(default=None, alias="vehicleType", description="车辆类型"),
|
||||
@@ -297,9 +309,11 @@ def list_vehicles(
|
||||
alias="excludeIneligibleCarrier",
|
||||
description="排除资质不全或协议过期的承运商车辆",
|
||||
),
|
||||
page: int = Query(default=1, ge=1),
|
||||
page_size: int = Query(default=20, ge=1, le=100, alias="pageSize"),
|
||||
db: Session = Depends(get_db),
|
||||
user: DbUserContext = Depends(get_db_current_user),
|
||||
) -> list[VehicleRead]:
|
||||
) -> VehicleListResponse:
|
||||
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
|
||||
query = db.query(PlVehicle).filter(
|
||||
PlVehicle.tenant_no == tenant_no,
|
||||
@@ -324,9 +338,9 @@ def list_vehicles(
|
||||
case((PlVehicle.order_num.is_(None), 1), else_=0).asc(),
|
||||
PlVehicle.create_time.desc(),
|
||||
)
|
||||
vehicles = query.all()
|
||||
|
||||
if exclude_ineligible_carrier:
|
||||
vehicles = query.all()
|
||||
carrier_ids = {
|
||||
v.carrier_id for v in vehicles if v.vehicle_type == "carrier" and v.carrier_id
|
||||
}
|
||||
@@ -352,14 +366,28 @@ def list_vehicles(
|
||||
and carrier_eligible_for_transport(carrier_map[v.carrier_id])
|
||||
)
|
||||
]
|
||||
summaries = load_vehicle_personnel_summaries(
|
||||
db, tenant_no, [v.id for v in vehicles]
|
||||
)
|
||||
items = [
|
||||
_vehicle_to_read(v, *summaries.get(v.id, ("", None)))
|
||||
for v in vehicles
|
||||
]
|
||||
return VehicleListResponse(total=len(items), list=items)
|
||||
|
||||
total = query.count()
|
||||
offset = (page - 1) * page_size
|
||||
vehicles = query.offset(offset).limit(page_size).all()
|
||||
summaries = load_vehicle_personnel_summaries(
|
||||
db, tenant_no, [v.id for v in vehicles]
|
||||
)
|
||||
return [
|
||||
_vehicle_to_read(v, *summaries.get(v.id, ("", None)))
|
||||
for v in vehicles
|
||||
]
|
||||
return VehicleListResponse(
|
||||
total=total,
|
||||
list=[
|
||||
_vehicle_to_read(v, *summaries.get(v.id, ("", None)))
|
||||
for v in vehicles
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
@router.post("/vehicle", response_model=VehicleDetailRead, status_code=status.HTTP_201_CREATED)
|
||||
@@ -549,13 +577,15 @@ def _personnel_to_detail(
|
||||
)
|
||||
|
||||
|
||||
@router.get("/personnel", response_model=list[PersonnelRead])
|
||||
@router.get("/personnel", response_model=PersonnelListResponse)
|
||||
def list_personnel(
|
||||
q: Optional[str] = Query(default=None, description="模糊搜索姓名/手机号"),
|
||||
status: Optional[str] = Query(default=None, description="状态"),
|
||||
page: int = Query(default=1, ge=1),
|
||||
page_size: int = Query(default=20, ge=1, le=100, alias="pageSize"),
|
||||
db: Session = Depends(get_db),
|
||||
user: DbUserContext = Depends(get_db_current_user),
|
||||
) -> list[PersonnelRead]:
|
||||
) -> PersonnelListResponse:
|
||||
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
|
||||
query = db.query(PlPersonnel).filter(
|
||||
PlPersonnel.tenant_no == tenant_no,
|
||||
@@ -579,8 +609,13 @@ def list_personnel(
|
||||
case((PlPersonnel.order_num.is_(None), 1), else_=0).asc(),
|
||||
PlPersonnel.create_time.desc(),
|
||||
)
|
||||
rows = query.all()
|
||||
return [_personnel_to_read(db, tenant_no, p) for p in rows]
|
||||
total = query.count()
|
||||
offset = (page - 1) * page_size
|
||||
rows = query.offset(offset).limit(page_size).all()
|
||||
return PersonnelListResponse(
|
||||
total=total,
|
||||
list=[_personnel_to_read(db, tenant_no, p) for p in rows],
|
||||
)
|
||||
|
||||
|
||||
@router.post("/personnel", response_model=PersonnelDetailRead, status_code=status.HTTP_201_CREATED)
|
||||
@@ -727,12 +762,14 @@ def _personnel_to_driver_read(personnel: PlPersonnel) -> DriverRead:
|
||||
)
|
||||
|
||||
|
||||
@router.get("/driver", response_model=list[DriverRead])
|
||||
@router.get("/driver", response_model=DriverListResponse)
|
||||
def list_drivers(
|
||||
q: Optional[str] = Query(default=None, description="模糊搜索姓名/手机号"),
|
||||
page: int = Query(default=1, ge=1),
|
||||
page_size: int = Query(default=20, ge=1, le=100, alias="pageSize"),
|
||||
db: Session = Depends(get_db),
|
||||
user: DbUserContext = Depends(get_db_current_user),
|
||||
) -> list[DriverRead]:
|
||||
) -> DriverListResponse:
|
||||
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
|
||||
query = db.query(PlPersonnel).filter(
|
||||
PlPersonnel.tenant_no == tenant_no,
|
||||
@@ -753,7 +790,13 @@ def list_drivers(
|
||||
case((PlPersonnel.order_num.is_(None), 1), else_=0).asc(),
|
||||
PlPersonnel.create_time.desc(),
|
||||
)
|
||||
return [_personnel_to_driver_read(p) for p in query.all()]
|
||||
total = query.count()
|
||||
offset = (page - 1) * page_size
|
||||
rows = query.offset(offset).limit(page_size).all()
|
||||
return DriverListResponse(
|
||||
total=total,
|
||||
list=[_personnel_to_driver_read(p) for p in rows],
|
||||
)
|
||||
|
||||
|
||||
@router.post("/driver", response_model=DriverRead, status_code=status.HTTP_201_CREATED)
|
||||
|
||||
@@ -166,6 +166,18 @@ def update_settlement(
|
||||
)
|
||||
|
||||
|
||||
@router.post("/{id}/cancel", response_model=FreightSettlementRead)
|
||||
def cancel_settlement(
|
||||
id: str,
|
||||
db: Session = Depends(get_db),
|
||||
user: DbUserContext = Depends(get_db_current_user),
|
||||
) -> FreightSettlementRead:
|
||||
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
|
||||
return freight_svc.cancel_draft_settlement(
|
||||
db, tenant_no=tenant_no, settlement_id=id, user_id=user.id, user=user
|
||||
)
|
||||
|
||||
|
||||
@router.delete("/{id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
def delete_settlement(
|
||||
id: str,
|
||||
|
||||
+22
-12
@@ -63,26 +63,30 @@ from app.services.pl_plan_service import (
|
||||
router = APIRouter(prefix="/plan", tags=["运输计划-计划管理"])
|
||||
|
||||
|
||||
_PLAN_NO_SEQ_WIDTH = 3
|
||||
|
||||
|
||||
def _generate_plan_no(db: Session) -> str:
|
||||
"""生成计划编号 SXDDHYYYYMMDD######"""
|
||||
"""生成计划编号 SXDDHYYYYMMDD###(当日 3 位序号,每日重置)"""
|
||||
today = date.today()
|
||||
prefix = f"SXDDH{today.strftime('%Y%m%d')}"
|
||||
|
||||
# uk_plan_no 对全表生效(含软删),取号时不能过滤 del_flag
|
||||
last_plan = (
|
||||
db.query(PlPlan)
|
||||
rows = (
|
||||
db.query(PlPlan.plan_no)
|
||||
.filter(PlPlan.plan_no.like(f"{prefix}%"))
|
||||
.order_by(PlPlan.plan_no.desc())
|
||||
.first()
|
||||
.all()
|
||||
)
|
||||
|
||||
if last_plan:
|
||||
last_seq = int(last_plan.plan_no[-6:])
|
||||
seq = last_seq + 1
|
||||
else:
|
||||
seq = 1
|
||||
max_seq = 0
|
||||
for (plan_no,) in rows:
|
||||
suffix = (plan_no or "")[len(prefix) :]
|
||||
if suffix.isdigit():
|
||||
max_seq = max(max_seq, int(suffix))
|
||||
|
||||
return f"{prefix}{seq:06d}"
|
||||
seq = max_seq + 1
|
||||
|
||||
return f"{prefix}{seq:0{_PLAN_NO_SEQ_WIDTH}d}"
|
||||
|
||||
|
||||
def _determine_plan_type(supplier_name: Optional[str], destination_name: Optional[str]) -> str:
|
||||
@@ -215,6 +219,12 @@ def list_plans(
|
||||
|
||||
plan_item = PlanWithProducts.model_validate(plan)
|
||||
plan_item.products = enriched_products
|
||||
if not (plan_item.personnel_summary or "").strip():
|
||||
snapshot = plan_item.resource_snapshot
|
||||
if snapshot and snapshot.personnel_summary:
|
||||
plan_item.personnel_summary = snapshot.personnel_summary
|
||||
elif plan_item.driver_name:
|
||||
plan_item.personnel_summary = f"{plan_item.driver_name}(司机)"
|
||||
result_list.append(plan_item)
|
||||
|
||||
return PlanListResponse(total=total, list=result_list)
|
||||
@@ -699,7 +709,7 @@ def patch_plan_product_certs(
|
||||
db: Session = Depends(get_db),
|
||||
user: DbUserContext = Depends(get_db_current_user),
|
||||
) -> PlanWithProducts:
|
||||
"""更新计划危化品产品购买证/运输证(不触发安排运输)"""
|
||||
"""更新计划危化品产品购买证/合法使用证明(不触发安排运输)"""
|
||||
tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
|
||||
_get_plan(db, tenant_no, id, user)
|
||||
update_plan_product_certs(
|
||||
|
||||
@@ -113,7 +113,7 @@ def _format_file_size(size_bytes: int) -> str:
|
||||
|
||||
|
||||
@router.post("/{token}/attachments")
|
||||
async def upload_public_site_attachment(
|
||||
def upload_public_site_attachment(
|
||||
token: str,
|
||||
file: UploadFile = File(...),
|
||||
folder: Optional[str] = Form(""),
|
||||
@@ -130,7 +130,7 @@ async def upload_public_site_attachment(
|
||||
effective_folder = resolve_upload_folder(
|
||||
folder=folder or "", biz_type="pl_transport_site_feedback"
|
||||
)
|
||||
file_content = await file.read()
|
||||
file_content = file.file.read()
|
||||
full_url = storage.upload_file(file_content, file.filename, effective_folder)
|
||||
base_url = settings.MINIO_BASE_URL.rstrip("/") if settings.MINIO_BASE_URL else ""
|
||||
if base_url and full_url.startswith(base_url + "/"):
|
||||
|
||||
@@ -168,7 +168,7 @@ def _format_file_size(size_bytes: int) -> str:
|
||||
|
||||
|
||||
@router.post("/{token}/attachments")
|
||||
async def upload_public_attachment(
|
||||
def upload_public_attachment(
|
||||
token: str,
|
||||
file: UploadFile = File(...),
|
||||
folder: Optional[str] = Form(""),
|
||||
@@ -183,7 +183,7 @@ async def upload_public_attachment(
|
||||
|
||||
try:
|
||||
effective_folder = resolve_upload_folder(folder=folder or "", biz_type="pl_transport_feedback")
|
||||
file_content = await file.read()
|
||||
file_content = file.file.read()
|
||||
full_url = storage.upload_file(file_content, file.filename, effective_folder)
|
||||
base_url = settings.MINIO_BASE_URL.rstrip("/") if settings.MINIO_BASE_URL else ""
|
||||
if base_url and full_url.startswith(base_url + "/"):
|
||||
|
||||
@@ -52,6 +52,10 @@ from app.services.pl_transport_site_service import (
|
||||
sync_site_links_for_transport,
|
||||
)
|
||||
from app.services.pl_plan_service import is_ton_product_unit
|
||||
from app.services.pl_transport_resource_snapshot_service import (
|
||||
apply_resource_snapshot_json,
|
||||
build_transport_resource_snapshot,
|
||||
)
|
||||
from app.services.pl_carrier_service import assert_carrier_eligible_for_transport
|
||||
|
||||
router = APIRouter(prefix="/order", tags=["运输计划-运输管理"])
|
||||
@@ -448,6 +452,16 @@ def create_transport(
|
||||
plan.license_plate = transport.license_plate
|
||||
plan.driver_id = transport.driver_id
|
||||
plan.driver_name = transport.driver_name
|
||||
if transport.vehicle_id:
|
||||
snapshot = build_transport_resource_snapshot(
|
||||
db,
|
||||
tenant_no,
|
||||
transport.vehicle_id,
|
||||
selected_driver_id=transport.driver_id,
|
||||
)
|
||||
apply_resource_snapshot_json(
|
||||
plan=plan, transport=transport, snapshot=snapshot
|
||||
)
|
||||
|
||||
db.commit()
|
||||
db.refresh(transport)
|
||||
@@ -517,7 +531,7 @@ def arrange_transport(
|
||||
if not prod.purchase_cert_url or not prod.transport_cert_url:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=f"产品【{prod.product_name}】为{'易制爆' if prod.is_explosive else '易制毒'},必须上传购买证和运输证"
|
||||
detail=f"产品【{prod.product_name}】为{'易制爆' if prod.is_explosive else '易制毒'},必须上传购买证和合法使用证明"
|
||||
)
|
||||
|
||||
# 计算运费
|
||||
@@ -608,6 +622,14 @@ def arrange_transport(
|
||||
plan.license_plate = transport.license_plate
|
||||
plan.driver_id = transport.driver_id
|
||||
plan.driver_name = transport.driver_name
|
||||
if transport.vehicle_id:
|
||||
snapshot = build_transport_resource_snapshot(
|
||||
db,
|
||||
tenant_no,
|
||||
transport.vehicle_id,
|
||||
selected_driver_id=transport.driver_id,
|
||||
)
|
||||
apply_resource_snapshot_json(plan=plan, transport=transport, snapshot=snapshot)
|
||||
plan.transport_status = "arranged"
|
||||
plan.freight_amount = freight_amount or 0
|
||||
plan.update_by = user.id
|
||||
|
||||
+17
-17
@@ -69,14 +69,14 @@ def _jwt_user_payload(user: SysUser, web_role: str) -> dict:
|
||||
|
||||
|
||||
@router.get("/web/auth/login-rsa-public-key", response_model=dict)
|
||||
async def web_login_rsa_public_key():
|
||||
def web_login_rsa_public_key():
|
||||
"""Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致)"""
|
||||
login_crypto.ensure_initialized()
|
||||
return success_response({"publicKeyPem": login_crypto.get_public_pem()})
|
||||
|
||||
|
||||
@router.post("/web/auth/login", response_model=dict)
|
||||
async def web_login(
|
||||
def web_login(
|
||||
request: Request,
|
||||
body: dict,
|
||||
db: Session = Depends(get_db),
|
||||
@@ -120,8 +120,8 @@ async def web_login(
|
||||
refresh_jti=refresh_jti,
|
||||
)
|
||||
|
||||
await store_session(session_id=session_id, user_id=user.id)
|
||||
await store_refresh_token(refresh_jti=refresh_jti, user_id=user.id)
|
||||
store_session(session_id=session_id, user_id=user.id)
|
||||
store_refresh_token(refresh_jti=refresh_jti, user_id=user.id)
|
||||
|
||||
return success_response(
|
||||
{
|
||||
@@ -134,7 +134,7 @@ async def web_login(
|
||||
|
||||
|
||||
@router.post("/web/auth/refresh-token", response_model=dict)
|
||||
async def refresh_token(body: dict, db: Session = Depends(get_db)):
|
||||
def refresh_token(body: dict, db: Session = Depends(get_db)):
|
||||
"""刷新 Token"""
|
||||
refresh_token_val = body.get("refreshToken")
|
||||
if not refresh_token_val:
|
||||
@@ -148,9 +148,9 @@ async def refresh_token(body: dict, db: Session = Depends(get_db)):
|
||||
session_id = payload.get("sid")
|
||||
refresh_jti = payload.get("jti")
|
||||
|
||||
if not await is_session_valid(session_id=session_id):
|
||||
if not is_session_valid(session_id=session_id):
|
||||
return error_response(401, "refreshToken已失效,请重新登录")
|
||||
if not await is_refresh_token_valid(refresh_jti=refresh_jti):
|
||||
if not is_refresh_token_valid(refresh_jti=refresh_jti):
|
||||
return error_response(401, "无效的refreshToken")
|
||||
|
||||
user_id = payload.get("sub")
|
||||
@@ -161,8 +161,8 @@ async def refresh_token(body: dict, db: Session = Depends(get_db)):
|
||||
|
||||
web_role = resolve_web_role_for_user(db, user.id, user.tenant_no)
|
||||
|
||||
await revoke_refresh_token(refresh_jti=refresh_jti)
|
||||
await extend_session(session_id=session_id)
|
||||
revoke_refresh_token(refresh_jti=refresh_jti)
|
||||
extend_session(session_id=session_id)
|
||||
|
||||
new_access_jti = generate_uuid()
|
||||
new_refresh_jti = generate_uuid()
|
||||
@@ -182,7 +182,7 @@ async def refresh_token(body: dict, db: Session = Depends(get_db)):
|
||||
refresh_jti=new_refresh_jti,
|
||||
)
|
||||
|
||||
await store_refresh_token(refresh_jti=new_refresh_jti, user_id=user.id)
|
||||
store_refresh_token(refresh_jti=new_refresh_jti, user_id=user.id)
|
||||
|
||||
return success_response(
|
||||
{
|
||||
@@ -196,7 +196,7 @@ async def refresh_token(body: dict, db: Session = Depends(get_db)):
|
||||
|
||||
|
||||
@router.post("/web/auth/logout", response_model=dict)
|
||||
async def logout(request: Request):
|
||||
def logout(request: Request):
|
||||
"""登出:吊销 Redis 会话(若已配置 REDIS_HOST)。"""
|
||||
authorization = request.headers.get("Authorization", "")
|
||||
if not authorization.startswith("Bearer "):
|
||||
@@ -207,7 +207,7 @@ async def logout(request: Request):
|
||||
payload = decode_token(token)
|
||||
session_id = payload.get("sid")
|
||||
if session_id:
|
||||
await revoke_session(session_id=session_id)
|
||||
revoke_session(session_id=session_id)
|
||||
except HTTPException:
|
||||
return error_response(401, "Token无效或已过期")
|
||||
|
||||
@@ -215,7 +215,7 @@ async def logout(request: Request):
|
||||
|
||||
|
||||
@router.get("/web/auth/current-user", response_model=dict)
|
||||
async def get_current_user_profile(request: Request, db: Session = Depends(get_db)):
|
||||
def get_current_user_profile(request: Request, db: Session = Depends(get_db)):
|
||||
"""获取当前用户信息(与 sys_user 字段对应)。"""
|
||||
authorization = request.headers.get("Authorization", "")
|
||||
if not authorization.startswith("Bearer "):
|
||||
@@ -223,7 +223,7 @@ async def get_current_user_profile(request: Request, db: Session = Depends(get_d
|
||||
|
||||
token = authorization.replace("Bearer ", "")
|
||||
try:
|
||||
current_user = await get_current_user_by_token(token=token, db=db)
|
||||
current_user = get_current_user_by_token(token=token, db=db)
|
||||
|
||||
au = current_user.get("avatar_url")
|
||||
avatar_url = str(au).strip() if au else None
|
||||
@@ -248,7 +248,7 @@ async def get_current_user_profile(request: Request, db: Session = Depends(get_d
|
||||
|
||||
|
||||
@router.get("/web/auth/menu-codes", response_model=dict)
|
||||
async def get_web_auth_menu_codes(request: Request, db: Session = Depends(get_db)):
|
||||
def get_web_auth_menu_codes(request: Request, db: Session = Depends(get_db)):
|
||||
"""获取当前用户菜单权限标识(sys_menu.perms,经角色继承)。"""
|
||||
authorization = request.headers.get("Authorization", "")
|
||||
if not authorization.startswith("Bearer "):
|
||||
@@ -256,7 +256,7 @@ async def get_web_auth_menu_codes(request: Request, db: Session = Depends(get_db
|
||||
|
||||
token = authorization.replace("Bearer ", "")
|
||||
try:
|
||||
current_user = await get_current_user_by_token(token=token, db=db)
|
||||
current_user = get_current_user_by_token(token=token, db=db)
|
||||
role = current_user.get("role")
|
||||
if role == "super_admin":
|
||||
return success_response(
|
||||
@@ -285,7 +285,7 @@ async def get_web_auth_menu_codes(request: Request, db: Session = Depends(get_db
|
||||
|
||||
|
||||
@router.get("/public/crm/quote/share/{share_code}")
|
||||
async def public_quote_share(
|
||||
def public_quote_share(
|
||||
share_code: str,
|
||||
request: Request,
|
||||
password: str = "",
|
||||
|
||||
+15
-15
@@ -173,7 +173,7 @@ class TaskActionBody(BaseModel):
|
||||
|
||||
|
||||
@router.get("/defs")
|
||||
async def list_process_defs(
|
||||
def list_process_defs(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -190,7 +190,7 @@ async def list_process_defs(
|
||||
|
||||
|
||||
@router.post("/defs")
|
||||
async def create_process_def(
|
||||
def create_process_def(
|
||||
body: ProcessDefCreateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -213,7 +213,7 @@ async def create_process_def(
|
||||
|
||||
|
||||
@router.put("/defs/{def_id}")
|
||||
async def update_process_def(
|
||||
def update_process_def(
|
||||
def_id: str,
|
||||
body: ProcessDefUpdateBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -238,7 +238,7 @@ async def update_process_def(
|
||||
|
||||
|
||||
@router.delete("/defs/{def_id}")
|
||||
async def delete_process_def(
|
||||
def delete_process_def(
|
||||
def_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -256,7 +256,7 @@ async def delete_process_def(
|
||||
|
||||
|
||||
@router.post("/defs/{def_id}/publish")
|
||||
async def publish_version(
|
||||
def publish_version(
|
||||
def_id: str,
|
||||
body: PublishVersionBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -280,7 +280,7 @@ async def publish_version(
|
||||
|
||||
|
||||
@router.get("/defs/{def_id}/versions")
|
||||
async def list_versions(
|
||||
def list_versions(
|
||||
def_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -291,7 +291,7 @@ async def list_versions(
|
||||
|
||||
|
||||
@router.get("/defs/{def_id}/designer")
|
||||
async def get_designer_data(
|
||||
def get_designer_data(
|
||||
def_id: str,
|
||||
_user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -322,7 +322,7 @@ async def get_designer_data(
|
||||
|
||||
|
||||
@router.post("/instances")
|
||||
async def start_instance(
|
||||
def start_instance(
|
||||
body: StartInstanceBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -360,7 +360,7 @@ async def start_instance(
|
||||
|
||||
|
||||
@router.get("/instances/my")
|
||||
async def list_my_instances(
|
||||
def list_my_instances(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -380,7 +380,7 @@ async def list_my_instances(
|
||||
|
||||
|
||||
@router.get("/instances/{instance_id}")
|
||||
async def get_instance_detail(
|
||||
def get_instance_detail(
|
||||
instance_id: str,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
db: Session = Depends(get_db),
|
||||
@@ -444,7 +444,7 @@ async def get_instance_detail(
|
||||
|
||||
|
||||
@router.get("/tasks/pending")
|
||||
async def list_pending_tasks(
|
||||
def list_pending_tasks(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -462,7 +462,7 @@ async def list_pending_tasks(
|
||||
|
||||
|
||||
@router.get("/tasks/completed")
|
||||
async def list_completed_tasks(
|
||||
def list_completed_tasks(
|
||||
page: int = Query(1, ge=1),
|
||||
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
|
||||
keyword: Optional[str] = None,
|
||||
@@ -485,7 +485,7 @@ async def list_completed_tasks(
|
||||
|
||||
|
||||
@router.post("/tasks/{task_id}/approve")
|
||||
async def approve_task(
|
||||
def approve_task(
|
||||
task_id: str,
|
||||
body: TaskActionBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -510,7 +510,7 @@ async def approve_task(
|
||||
|
||||
|
||||
@router.post("/tasks/{task_id}/reject")
|
||||
async def reject_task(
|
||||
def reject_task(
|
||||
task_id: str,
|
||||
body: TaskActionBody,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
@@ -540,7 +540,7 @@ async def reject_task(
|
||||
|
||||
|
||||
@router.get("/instances/by-business/{business_type}/{business_id}")
|
||||
async def get_business_all_tasks(
|
||||
def get_business_all_tasks(
|
||||
business_type: str,
|
||||
business_id: str,
|
||||
user: dict = Depends(require_admin_or_super_admin),
|
||||
|
||||
@@ -17,11 +17,11 @@ from starlette.responses import Response
|
||||
|
||||
from app.core import api_crypto
|
||||
from app.core.config import settings
|
||||
from app.core.redis_client import get_redis_client
|
||||
from app.core.response import error_response
|
||||
|
||||
logger = logging.getLogger("sqxp")
|
||||
|
||||
_redis_client: Optional[redis.Redis] = None
|
||||
_local_nonce_cache: dict[str, float] = {}
|
||||
|
||||
|
||||
@@ -59,20 +59,7 @@ def _claims_from_auth(auth_header: Optional[str]) -> Tuple[Optional[str], Option
|
||||
|
||||
|
||||
def _get_redis_client() -> Optional[redis.Redis]:
|
||||
global _redis_client
|
||||
if not settings.REDIS_HOST:
|
||||
return None
|
||||
if _redis_client is None:
|
||||
_redis_client = redis.Redis(
|
||||
host=settings.REDIS_HOST,
|
||||
port=settings.REDIS_PORT,
|
||||
db=settings.REDIS_DB,
|
||||
password=settings.REDIS_PASSWORD or None,
|
||||
socket_timeout=settings.REDIS_TIMEOUT_SEC,
|
||||
ssl=settings.REDIS_SSL_ENABLED,
|
||||
decode_responses=True,
|
||||
)
|
||||
return _redis_client
|
||||
return get_redis_client()
|
||||
|
||||
|
||||
async def _mark_nonce_once(user_id: str, nonce: str) -> bool:
|
||||
@@ -81,7 +68,10 @@ async def _mark_nonce_once(user_id: str, nonce: str) -> bool:
|
||||
client = _get_redis_client()
|
||||
if client is not None:
|
||||
try:
|
||||
ok = await asyncio.wait_for(client.set(key, "1", ex=ttl_sec, nx=True), timeout=2.0)
|
||||
ok = await asyncio.wait_for(
|
||||
client.set(key, "1", ex=ttl_sec, nx=True),
|
||||
timeout=settings.REDIS_OP_TIMEOUT_SEC,
|
||||
)
|
||||
return bool(ok)
|
||||
except (asyncio.TimeoutError, redis_exceptions.RedisError):
|
||||
logger.warning("api crypto nonce redis unavailable, fallback to local memory")
|
||||
|
||||
+45
-87
@@ -1,9 +1,7 @@
|
||||
"""认证模块"""
|
||||
import asyncio
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional
|
||||
|
||||
import redis.asyncio as redis
|
||||
from redis import exceptions as redis_exceptions
|
||||
from fastapi import Depends, HTTPException, status, Request
|
||||
from fastapi.security import OAuth2PasswordBearer
|
||||
@@ -14,8 +12,8 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from app.core.config import settings
|
||||
from app.core.database import get_db
|
||||
from app.core.redis_client import get_sync_redis_client
|
||||
from app.crud.user import user_crud
|
||||
from app.core.utils import generate_uuid
|
||||
from app.services.web_auth_roles import resolve_web_role_for_user
|
||||
|
||||
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/public/login")
|
||||
@@ -23,30 +21,6 @@ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/public/login")
|
||||
REFRESH_TOKEN_EXPIRE_DAYS = 7
|
||||
REFRESH_TOKEN_EXPIRE_SECONDS = int(timedelta(days=REFRESH_TOKEN_EXPIRE_DAYS).total_seconds())
|
||||
|
||||
_redis_client: Optional[redis.Redis] = None
|
||||
|
||||
|
||||
def _redis_session_enabled() -> bool:
|
||||
# 只要配置了 REDIS_HOST,就启用“会话校验/refreshToken 吊销”
|
||||
return bool(settings.REDIS_HOST)
|
||||
|
||||
|
||||
def _get_redis_client() -> Optional[redis.Redis]:
|
||||
global _redis_client
|
||||
if not _redis_session_enabled():
|
||||
return None
|
||||
if _redis_client is None:
|
||||
_redis_client = redis.Redis(
|
||||
host=settings.REDIS_HOST,
|
||||
port=settings.REDIS_PORT,
|
||||
db=settings.REDIS_DB,
|
||||
password=settings.REDIS_PASSWORD or None,
|
||||
socket_timeout=settings.REDIS_TIMEOUT_SEC,
|
||||
ssl=settings.REDIS_SSL_ENABLED,
|
||||
decode_responses=True,
|
||||
)
|
||||
return _redis_client
|
||||
|
||||
|
||||
def _session_key(session_id: str) -> str:
|
||||
return f"auth:sessions:{session_id}"
|
||||
@@ -56,78 +30,66 @@ def _refresh_key(refresh_jti: str) -> str:
|
||||
return f"auth:refresh:{refresh_jti}"
|
||||
|
||||
|
||||
async def store_session(session_id: str, user_id: str) -> None:
|
||||
def _redis_call_safe(fn):
|
||||
"""同步 Redis 调用;失败时返回 None 供调用方降级。"""
|
||||
r = get_sync_redis_client()
|
||||
if r is None:
|
||||
return None
|
||||
try:
|
||||
return fn(r)
|
||||
except (redis_exceptions.TimeoutError, redis_exceptions.ConnectionError, redis_exceptions.RedisError):
|
||||
return None
|
||||
|
||||
|
||||
def store_session(session_id: str, user_id: str) -> None:
|
||||
"""写入会话(用于强制失效)"""
|
||||
r = _get_redis_client()
|
||||
if r is None:
|
||||
return
|
||||
await r.set(_session_key(session_id), user_id, ex=REFRESH_TOKEN_EXPIRE_SECONDS)
|
||||
_redis_call_safe(lambda r: r.set(_session_key(session_id), user_id, ex=REFRESH_TOKEN_EXPIRE_SECONDS))
|
||||
|
||||
|
||||
async def revoke_session(session_id: str) -> None:
|
||||
def revoke_session(session_id: str) -> None:
|
||||
"""撤销会话(登出/强制失效)"""
|
||||
r = _get_redis_client()
|
||||
if r is None:
|
||||
return
|
||||
await r.delete(_session_key(session_id))
|
||||
_redis_call_safe(lambda r: r.delete(_session_key(session_id)))
|
||||
|
||||
|
||||
async def extend_session(session_id: str) -> None:
|
||||
"""刷新会话 TTL(refreshToken 续期;已登录用户每次 API 校验通过后滑动续期)"""
|
||||
def extend_session(session_id: str) -> None:
|
||||
"""刷新会话 TTL(已登录用户每次 API 校验通过后滑动续期)"""
|
||||
if not session_id:
|
||||
return
|
||||
r = _get_redis_client()
|
||||
if r is None:
|
||||
return
|
||||
try:
|
||||
await asyncio.wait_for(
|
||||
r.expire(_session_key(session_id), REFRESH_TOKEN_EXPIRE_SECONDS),
|
||||
timeout=3.0,
|
||||
)
|
||||
except (asyncio.TimeoutError, redis_exceptions.TimeoutError, redis_exceptions.ConnectionError):
|
||||
pass
|
||||
_redis_call_safe(lambda r: r.expire(_session_key(session_id), REFRESH_TOKEN_EXPIRE_SECONDS))
|
||||
|
||||
|
||||
async def is_session_valid(session_id: str) -> bool:
|
||||
def is_session_valid(session_id: str) -> bool:
|
||||
"""检查会话是否仍然有效"""
|
||||
r = _get_redis_client()
|
||||
if r is None:
|
||||
if get_sync_redis_client() is None:
|
||||
return True
|
||||
if not session_id:
|
||||
return False
|
||||
try:
|
||||
# 添加连接超时保护,Redis 不可用时降级为验证通过
|
||||
return await asyncio.wait_for(r.exists(_session_key(session_id)), timeout=3.0) > 0
|
||||
except (asyncio.TimeoutError, redis_exceptions.TimeoutError, redis_exceptions.ConnectionError):
|
||||
# Redis 连接失败时降级:只验证 JWT,不过滤会话吊销
|
||||
exists = _redis_call_safe(lambda r: r.exists(_session_key(session_id)))
|
||||
if exists is None:
|
||||
return True
|
||||
return exists > 0
|
||||
|
||||
|
||||
async def store_refresh_token(refresh_jti: str, user_id: str) -> None:
|
||||
def store_refresh_token(refresh_jti: str, user_id: str) -> None:
|
||||
"""写入 refreshToken(用于 one-time 使用/吊销)"""
|
||||
r = _get_redis_client()
|
||||
if r is None:
|
||||
return
|
||||
await r.set(_refresh_key(refresh_jti), user_id, ex=REFRESH_TOKEN_EXPIRE_SECONDS)
|
||||
_redis_call_safe(
|
||||
lambda r: r.set(_refresh_key(refresh_jti), user_id, ex=REFRESH_TOKEN_EXPIRE_SECONDS)
|
||||
)
|
||||
|
||||
|
||||
async def is_refresh_token_valid(refresh_jti: str) -> bool:
|
||||
r = _get_redis_client()
|
||||
if r is None:
|
||||
def is_refresh_token_valid(refresh_jti: str) -> bool:
|
||||
if get_sync_redis_client() is None:
|
||||
return True
|
||||
if not refresh_jti:
|
||||
return False
|
||||
try:
|
||||
return await asyncio.wait_for(r.exists(_refresh_key(refresh_jti)), timeout=3.0) > 0
|
||||
except (asyncio.TimeoutError, redis_exceptions.TimeoutError, redis_exceptions.ConnectionError):
|
||||
exists = _redis_call_safe(lambda r: r.exists(_refresh_key(refresh_jti)))
|
||||
if exists is None:
|
||||
return True
|
||||
return exists > 0
|
||||
|
||||
|
||||
async def revoke_refresh_token(refresh_jti: str) -> None:
|
||||
r = _get_redis_client()
|
||||
if r is None:
|
||||
return
|
||||
await r.delete(_refresh_key(refresh_jti))
|
||||
def revoke_refresh_token(refresh_jti: str) -> None:
|
||||
_redis_call_safe(lambda r: r.delete(_refresh_key(refresh_jti)))
|
||||
|
||||
|
||||
def create_access_token(
|
||||
@@ -157,7 +119,7 @@ def create_access_token(
|
||||
def create_refresh_token(data: dict, session_id: str, refresh_jti: str) -> str:
|
||||
"""创建刷新令牌"""
|
||||
to_encode = data.copy()
|
||||
expire = datetime.utcnow() + timedelta(days=REFRESH_TOKEN_EXPIRE_DAYS) # 有效期与 Redis TTL 保持一致
|
||||
expire = datetime.utcnow() + timedelta(days=REFRESH_TOKEN_EXPIRE_DAYS)
|
||||
to_encode.update(
|
||||
{
|
||||
"exp": expire,
|
||||
@@ -183,24 +145,20 @@ def decode_token(token: str) -> dict:
|
||||
)
|
||||
|
||||
|
||||
async def get_current_user_by_token(
|
||||
token: str,
|
||||
db: Session,
|
||||
) -> dict:
|
||||
def get_current_user_by_token(token: str, db: Session) -> dict:
|
||||
"""根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期)"""
|
||||
payload = decode_token(token)
|
||||
|
||||
user_id: str = payload.get("sub")
|
||||
session_id: str = payload.get("sid")
|
||||
|
||||
if not await is_session_valid(session_id):
|
||||
if not is_session_valid(session_id):
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Token无效或已过期",
|
||||
)
|
||||
|
||||
# 方案 C:有操作时延长 Redis 会话,连续 7 天无请求则会话过期
|
||||
await extend_session(session_id)
|
||||
extend_session(session_id)
|
||||
|
||||
if user_id is None:
|
||||
raise HTTPException(
|
||||
@@ -245,15 +203,15 @@ async def get_current_user_by_token(
|
||||
}
|
||||
|
||||
|
||||
async def get_current_user(
|
||||
def get_current_user(
|
||||
token: str = Depends(oauth2_scheme),
|
||||
db: Session = Depends(get_db)
|
||||
db: Session = Depends(get_db),
|
||||
) -> dict:
|
||||
"""获取当前用户"""
|
||||
return await get_current_user_by_token(token, db)
|
||||
"""获取当前用户(sync 依赖,配合 sync 路由在线程池执行,避免阻塞事件循环)。"""
|
||||
return get_current_user_by_token(token, db)
|
||||
|
||||
|
||||
async def get_current_user_simple(token: str = Depends(oauth2_scheme)) -> dict:
|
||||
def get_current_user_simple(token: str = Depends(oauth2_scheme)) -> dict:
|
||||
"""简化版获取当前用户(不查数据库)"""
|
||||
payload = decode_token(token)
|
||||
user_id: str = payload.get("sub")
|
||||
@@ -268,7 +226,7 @@ async def get_current_user_simple(token: str = Depends(oauth2_scheme)) -> dict:
|
||||
"username": payload.get("username"),
|
||||
"role": payload.get("role"),
|
||||
"region_id": payload.get("region_id"),
|
||||
"real_name": payload.get("real_name")
|
||||
"real_name": payload.get("real_name"),
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,16 @@ class Settings(BaseSettings):
|
||||
|
||||
# 数据库配置
|
||||
DATABASE_URL: str = "mysql+pymysql://root:password@localhost:3306/sanqiang"
|
||||
# pymysql 连接/读写超时(秒);远程库或休眠唤醒后避免 SELECT 无限阻塞
|
||||
DB_CONNECT_TIMEOUT_SEC: int = 10
|
||||
DB_READ_TIMEOUT_SEC: int = 10
|
||||
DB_WRITE_TIMEOUT_SEC: int = 10
|
||||
# 连接池回收周期(秒),宜小于 MySQL wait_timeout / 防火墙 idle 超时
|
||||
DB_POOL_RECYCLE_SEC: int = 600
|
||||
DB_POOL_SIZE: int = 5
|
||||
DB_MAX_OVERFLOW: int = 10
|
||||
# 后台保活间隔(秒),远程 MySQL 空闲 TCP 被回收时主动 SELECT 1
|
||||
DB_KEEPALIVE_INTERVAL_SEC: int = 240
|
||||
|
||||
# JWT配置
|
||||
SECRET_KEY: str = "your-secret-key-change-in-production-please-use-random-string"
|
||||
@@ -49,7 +59,11 @@ class Settings(BaseSettings):
|
||||
REDIS_PORT: int = 6379
|
||||
REDIS_DB: int = 0
|
||||
REDIS_PASSWORD: str = ""
|
||||
REDIS_TIMEOUT_SEC: int = 30
|
||||
REDIS_TIMEOUT_SEC: int = 5
|
||||
REDIS_CONNECT_TIMEOUT_SEC: int = 5
|
||||
REDIS_HEALTH_CHECK_INTERVAL_SEC: int = 30
|
||||
# asyncio 层 Redis 操作超时(秒),与会话校验/续期一致
|
||||
REDIS_OP_TIMEOUT_SEC: int = 3
|
||||
REDIS_SSL_ENABLED: bool = False
|
||||
|
||||
# 七牛云存储配置 (生产环境推荐)
|
||||
|
||||
@@ -7,7 +7,15 @@ from app.core.config import settings
|
||||
engine = create_engine(
|
||||
settings.DATABASE_URL,
|
||||
pool_pre_ping=True,
|
||||
pool_recycle=3600,
|
||||
pool_recycle=settings.DB_POOL_RECYCLE_SEC,
|
||||
pool_size=settings.DB_POOL_SIZE,
|
||||
max_overflow=settings.DB_MAX_OVERFLOW,
|
||||
pool_reset_on_return="rollback",
|
||||
connect_args={
|
||||
"connect_timeout": settings.DB_CONNECT_TIMEOUT_SEC,
|
||||
"read_timeout": settings.DB_READ_TIMEOUT_SEC,
|
||||
"write_timeout": settings.DB_WRITE_TIMEOUT_SEC,
|
||||
},
|
||||
echo=settings.DEBUG,
|
||||
)
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ def get_db_current_user(
|
||||
)
|
||||
|
||||
|
||||
async def get_db_current_user_optional(
|
||||
def get_db_current_user_optional(
|
||||
token: Optional[str] = Depends(optional_oauth2_scheme),
|
||||
db: Session = Depends(get_db),
|
||||
) -> DbUserContext | None:
|
||||
@@ -66,7 +66,7 @@ async def get_db_current_user_optional(
|
||||
if not token:
|
||||
return None
|
||||
try:
|
||||
user = await get_current_user_by_token(token, db)
|
||||
user = get_current_user_by_token(token, db)
|
||||
except HTTPException:
|
||||
return None
|
||||
role = user.get("role")
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
"""共享 Redis 客户端(同步:会话鉴权;异步:API 加密 nonce)。"""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Optional
|
||||
|
||||
import redis
|
||||
import redis.asyncio as aioredis
|
||||
|
||||
from app.core.config import settings
|
||||
|
||||
_sync_redis_client: Optional[redis.Redis] = None
|
||||
_async_redis_client: Optional[aioredis.Redis] = None
|
||||
|
||||
|
||||
def redis_enabled() -> bool:
|
||||
return bool(settings.REDIS_HOST)
|
||||
|
||||
|
||||
def _redis_common_kwargs() -> dict:
|
||||
return {
|
||||
"host": settings.REDIS_HOST,
|
||||
"port": settings.REDIS_PORT,
|
||||
"db": settings.REDIS_DB,
|
||||
"password": settings.REDIS_PASSWORD or None,
|
||||
"socket_timeout": settings.REDIS_TIMEOUT_SEC,
|
||||
"socket_connect_timeout": settings.REDIS_CONNECT_TIMEOUT_SEC,
|
||||
"ssl": settings.REDIS_SSL_ENABLED,
|
||||
"decode_responses": True,
|
||||
}
|
||||
|
||||
|
||||
def get_sync_redis_client() -> Optional[redis.Redis]:
|
||||
"""同步 Redis(auth 会话等,在线程池中调用)。"""
|
||||
global _sync_redis_client
|
||||
if not redis_enabled():
|
||||
return None
|
||||
if _sync_redis_client is None:
|
||||
_sync_redis_client = redis.Redis(
|
||||
**_redis_common_kwargs(),
|
||||
health_check_interval=settings.REDIS_HEALTH_CHECK_INTERVAL_SEC,
|
||||
)
|
||||
return _sync_redis_client
|
||||
|
||||
|
||||
def get_redis_client() -> Optional[aioredis.Redis]:
|
||||
"""异步 Redis(API 加密 nonce 等中间件)。"""
|
||||
global _async_redis_client
|
||||
if not redis_enabled():
|
||||
return None
|
||||
if _async_redis_client is None:
|
||||
_async_redis_client = aioredis.Redis(
|
||||
**_redis_common_kwargs(),
|
||||
health_check_interval=settings.REDIS_HEALTH_CHECK_INTERVAL_SEC,
|
||||
)
|
||||
return _async_redis_client
|
||||
+35
-1
@@ -1,4 +1,5 @@
|
||||
"""FastAPI 应用入口(骨架工程)"""
|
||||
import asyncio
|
||||
from contextlib import asynccontextmanager
|
||||
import logging
|
||||
from datetime import datetime
|
||||
@@ -6,10 +7,11 @@ from datetime import datetime
|
||||
from fastapi import FastAPI, Request
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import JSONResponse
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
|
||||
from app.core.config import settings
|
||||
from app.core.database import SessionLocal
|
||||
from app.core.database import SessionLocal, engine
|
||||
from app.core.api_request_log_middleware import ApiRequestLogMiddleware
|
||||
from app.core.api_crypto_middleware import ApiCryptoMiddleware
|
||||
from app.models import models # noqa: F401
|
||||
@@ -47,8 +49,16 @@ async def lifespan(app: FastAPI):
|
||||
except Exception as e:
|
||||
logging.warning("定时任务调度器启动失败: %s", e)
|
||||
|
||||
keepalive_task = asyncio.create_task(_db_pool_keepalive_loop())
|
||||
|
||||
yield
|
||||
|
||||
keepalive_task.cancel()
|
||||
try:
|
||||
await keepalive_task
|
||||
except asyncio.CancelledError:
|
||||
pass
|
||||
|
||||
from app.tasks import shutdown_scheduler
|
||||
|
||||
try:
|
||||
@@ -57,6 +67,30 @@ async def lifespan(app: FastAPI):
|
||||
pass
|
||||
|
||||
|
||||
async def _db_pool_keepalive_loop() -> None:
|
||||
"""定期 ping MySQL,避免远程库/NAT 回收空闲 TCP 后首请求长时间卡住。"""
|
||||
interval = max(60, int(settings.DB_KEEPALIVE_INTERVAL_SEC))
|
||||
|
||||
def _ping() -> None:
|
||||
db = SessionLocal()
|
||||
try:
|
||||
db.execute(text("SELECT 1"))
|
||||
except Exception:
|
||||
try:
|
||||
engine.dispose()
|
||||
except Exception:
|
||||
pass
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
while True:
|
||||
await asyncio.sleep(interval)
|
||||
try:
|
||||
await asyncio.to_thread(_ping)
|
||||
except Exception as exc:
|
||||
logging.debug("db pool keepalive failed: %s", exc)
|
||||
|
||||
|
||||
app = FastAPI(
|
||||
title=settings.APP_NAME,
|
||||
description="山峡化工生产一体化门户管理端后端",
|
||||
|
||||
@@ -208,7 +208,7 @@ class PlPlan(Base):
|
||||
id = Column(String(64), primary_key=True, comment="主键ID")
|
||||
|
||||
# 编号信息
|
||||
plan_no = Column(String(32), nullable=False, unique=True, comment="计划订单编号 SXDDHYYYYMMDD######")
|
||||
plan_no = Column(String(32), nullable=False, unique=True, comment="计划订单编号 SXDDHYYYYMMDD###")
|
||||
plan_date = Column(Date, nullable=False, comment="计划日期")
|
||||
|
||||
# 基本信息
|
||||
@@ -257,8 +257,11 @@ class PlPlan(Base):
|
||||
transport_no = Column(String(32), nullable=True, comment="运输编号")
|
||||
vehicle_id = Column(String(64), nullable=True, comment="车辆ID")
|
||||
license_plate = Column(String(20), nullable=True, comment="车牌号")
|
||||
trailer_no = Column(String(20), nullable=True, comment="挂车号(安排运输时快照)")
|
||||
driver_id = Column(String(64), nullable=True, comment="司机ID")
|
||||
driver_name = Column(String(100), nullable=True, comment="司机姓名")
|
||||
personnel_summary = Column(String(500), nullable=True, comment="关联人员摘要(安排运输时快照)")
|
||||
resource_snapshot = Column(Text, nullable=True, comment="车辆/人员/证件整包快照 JSON")
|
||||
|
||||
# 金额汇总
|
||||
total_amount = Column(DECIMAL(15, 2), nullable=False, default=0, comment="计划总金额")
|
||||
@@ -310,9 +313,9 @@ class PlPlanProduct(Base):
|
||||
is_explosive = Column(SmallInteger, nullable=False, default=0, comment="是否易制爆 0-否 1-是")
|
||||
is_toxic = Column(SmallInteger, nullable=False, default=0, comment="是否易制毒 0-否 1-是")
|
||||
|
||||
# 购买证/运输证
|
||||
# 购买证/合法使用证明
|
||||
purchase_cert_url = Column(String(500), nullable=True, comment="购买证URL")
|
||||
transport_cert_url = Column(String(500), nullable=True, comment="运输证URL")
|
||||
transport_cert_url = Column(String(500), nullable=True, comment="合法使用证明URL")
|
||||
|
||||
# 入库信息
|
||||
inbound_estimate_qty = Column(DECIMAL(15, 3), nullable=True, comment="入库预估数")
|
||||
@@ -376,9 +379,11 @@ class PlTransport(Base):
|
||||
# 车辆与司机
|
||||
vehicle_id = Column(String(64), nullable=True, comment="车辆ID")
|
||||
license_plate = Column(String(20), nullable=True, comment="车牌号")
|
||||
trailer_no = Column(String(20), nullable=True, comment="挂车号(安排运输时快照)")
|
||||
driver_id = Column(String(64), nullable=True, comment="司机ID")
|
||||
driver_name = Column(String(100), nullable=True, comment="司机姓名")
|
||||
driver_phone = Column(String(32), nullable=True, comment="司机电话")
|
||||
resource_snapshot = Column(Text, nullable=True, comment="车辆/人员/证件整包快照 JSON")
|
||||
|
||||
# 承运商
|
||||
carrier_id = Column(String(64), nullable=True, comment="承运商ID")
|
||||
|
||||
@@ -3,17 +3,20 @@ from app.schemas.pl.base_data import (
|
||||
CarrierBase,
|
||||
CarrierAuditReject,
|
||||
CarrierCreate,
|
||||
CarrierListResponse,
|
||||
CarrierRead,
|
||||
CarrierUpdate,
|
||||
CertRead,
|
||||
CertRow,
|
||||
DriverBase,
|
||||
DriverCreate,
|
||||
DriverListResponse,
|
||||
DriverRead,
|
||||
DriverUpdate,
|
||||
PersonnelBase,
|
||||
PersonnelCreate,
|
||||
PersonnelDetailRead,
|
||||
PersonnelListResponse,
|
||||
PersonnelRead,
|
||||
PersonnelUpdate,
|
||||
VehicleBase,
|
||||
@@ -21,6 +24,7 @@ from app.schemas.pl.base_data import (
|
||||
VehicleDetailRead,
|
||||
VehicleDriverCreate,
|
||||
VehicleDriverRead,
|
||||
VehicleListResponse,
|
||||
VehiclePersonnelRow,
|
||||
VehicleRead,
|
||||
VehicleUpdate,
|
||||
@@ -111,15 +115,18 @@ __all__ = [
|
||||
"CarrierCreate",
|
||||
"CarrierUpdate",
|
||||
"CarrierRead",
|
||||
"CarrierListResponse",
|
||||
"carrier_to_read",
|
||||
"VehicleCreate",
|
||||
"VehicleUpdate",
|
||||
"VehicleRead",
|
||||
"VehicleListResponse",
|
||||
"VehicleDetailRead",
|
||||
"PersonnelBase",
|
||||
"PersonnelCreate",
|
||||
"PersonnelUpdate",
|
||||
"PersonnelRead",
|
||||
"PersonnelListResponse",
|
||||
"PersonnelDetailRead",
|
||||
"DriverCreate",
|
||||
"DriverUpdate",
|
||||
|
||||
@@ -362,6 +362,11 @@ class DriverRead(DriverBase):
|
||||
model_config = {"from_attributes": True, "populate_by_name": True}
|
||||
|
||||
|
||||
class DriverListResponse(BaseModel):
|
||||
total: int
|
||||
list: list[DriverRead]
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# 车辆-司机关联 Schema(兼容)
|
||||
# =============================================================================
|
||||
@@ -382,3 +387,18 @@ class VehicleDriverRead(BaseModel):
|
||||
tenant_no: str = Field(alias="tenantNo")
|
||||
create_time: datetime = Field(alias="createTime")
|
||||
model_config = {"from_attributes": True, "populate_by_name": True}
|
||||
|
||||
|
||||
class CarrierListResponse(BaseModel):
|
||||
total: int
|
||||
list: list[CarrierRead]
|
||||
|
||||
|
||||
class VehicleListResponse(BaseModel):
|
||||
total: int
|
||||
list: list[VehicleRead]
|
||||
|
||||
|
||||
class PersonnelListResponse(BaseModel):
|
||||
total: int
|
||||
list: list[PersonnelRead]
|
||||
@@ -5,6 +5,8 @@ from typing import Optional
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from app.schemas.pl.resource_snapshot import PlanResourceSnapshotMixin
|
||||
|
||||
# =============================================================================
|
||||
# 计划产品明细 Schema
|
||||
# =============================================================================
|
||||
@@ -27,7 +29,7 @@ class PlanProductBase(BaseModel):
|
||||
is_explosive: int = Field(default=0, alias="isExplosive", description="是否易制爆")
|
||||
is_toxic: int = Field(default=0, alias="isToxic", description="是否易制毒")
|
||||
purchase_cert_url: Optional[str] = Field(default=None, alias="purchaseCertUrl", description="购买证URL")
|
||||
transport_cert_url: Optional[str] = Field(default=None, alias="transportCertUrl", description="运输证URL")
|
||||
transport_cert_url: Optional[str] = Field(default=None, alias="transportCertUrl", description="合法使用证明URL")
|
||||
inbound_estimate_qty: Optional[Decimal] = Field(default=None, alias="inboundEstimateQty", description="入库预估数")
|
||||
inbound_qty: Optional[Decimal] = Field(default=None, alias="inboundQty", description="入库数")
|
||||
inbound_price: Optional[Decimal] = Field(default=None, alias="inboundPrice", description="入库价")
|
||||
@@ -170,7 +172,7 @@ class PlanUpdate(BaseModel):
|
||||
model_config = {"populate_by_name": True}
|
||||
|
||||
|
||||
class PlanRead(PlanBase):
|
||||
class PlanRead(PlanBase, PlanResourceSnapshotMixin):
|
||||
id: str
|
||||
plan_no: str = Field(alias="planNo")
|
||||
plan_date: date = Field(alias="planDate")
|
||||
@@ -178,6 +180,7 @@ class PlanRead(PlanBase):
|
||||
license_plate: Optional[str] = Field(default=None, alias="licensePlate")
|
||||
driver_id: Optional[str] = Field(default=None, alias="driverId")
|
||||
driver_name: Optional[str] = Field(default=None, alias="driverName")
|
||||
personnel_summary: Optional[str] = Field(default=None, alias="personnelSummary")
|
||||
transport_id: Optional[str] = Field(default=None, alias="transportId")
|
||||
transport_no: Optional[str] = Field(default=None, alias="transportNo")
|
||||
total_amount: Decimal = Field(alias="totalAmount")
|
||||
@@ -239,7 +242,7 @@ class PlanListQuery(BaseModel):
|
||||
class PlanProductCertItem(BaseModel):
|
||||
id: str = Field(..., description="计划产品明细ID")
|
||||
purchase_cert_url: Optional[str] = Field(default=None, alias="purchaseCertUrl", description="购买证URL")
|
||||
transport_cert_url: Optional[str] = Field(default=None, alias="transportCertUrl", description="运输证URL")
|
||||
transport_cert_url: Optional[str] = Field(default=None, alias="transportCertUrl", description="合法使用证明URL")
|
||||
model_config = {"populate_by_name": True}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
"""运输计划 - 安排运输时车辆/人员/证件资源快照 Schema"""
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import date, datetime
|
||||
from decimal import Decimal
|
||||
from typing import Any, Optional
|
||||
|
||||
from pydantic import BaseModel, Field, field_validator
|
||||
|
||||
|
||||
class SnapshotCertRead(BaseModel):
|
||||
"""证书快照(车辆主车/挂车、人员证件)"""
|
||||
|
||||
id: str
|
||||
cert_id: Optional[str] = Field(default=None, alias="certId")
|
||||
vehicle_part: Optional[str] = Field(default=None, alias="vehiclePart")
|
||||
cert_name: str = Field(alias="certName")
|
||||
cert_no: Optional[str] = Field(default=None, alias="certNo")
|
||||
expire_date: Optional[date] = Field(default=None, alias="expireDate")
|
||||
remind_days: int = Field(default=30, alias="remindDays")
|
||||
attachment_urls: Optional[str] = Field(default=None, alias="attachmentUrls")
|
||||
owner_type: Optional[str] = Field(default=None, alias="ownerType")
|
||||
owner_id: Optional[str] = Field(default=None, alias="ownerId")
|
||||
status: Optional[str] = None
|
||||
|
||||
model_config = {"populate_by_name": True}
|
||||
|
||||
|
||||
class SnapshotPersonnelRow(BaseModel):
|
||||
"""车辆关联人员快照(含人员证件)"""
|
||||
|
||||
personnel_id: Optional[str] = Field(default=None, alias="personnelId")
|
||||
personnel_name: str = Field(alias="personnelName")
|
||||
phone_no: Optional[str] = Field(default=None, alias="phoneNo")
|
||||
age: Optional[int] = None
|
||||
id_card_no: Optional[str] = Field(default=None, alias="idCardNo")
|
||||
role: str
|
||||
is_default: int = Field(default=0, alias="isDefault")
|
||||
remark: Optional[str] = None
|
||||
cert_list: list[SnapshotCertRead] = Field(default_factory=list, alias="certList")
|
||||
|
||||
model_config = {"populate_by_name": True}
|
||||
|
||||
|
||||
class TransportResourceSnapshot(BaseModel):
|
||||
"""安排运输时的车辆+人员+证件整包快照"""
|
||||
|
||||
snapshotted_at: datetime = Field(alias="snapshottedAt")
|
||||
vehicle_id: str = Field(alias="vehicleId")
|
||||
vehicle_type: str = Field(alias="vehicleType")
|
||||
carrier_id: Optional[str] = Field(default=None, alias="carrierId")
|
||||
carrier_name: Optional[str] = Field(default=None, alias="carrierName")
|
||||
license_plate: str = Field(alias="licensePlate")
|
||||
trailer_no: Optional[str] = Field(default=None, alias="trailerNo")
|
||||
load_capacity: Optional[Decimal] = Field(default=None, alias="loadCapacity")
|
||||
vehicle_status: str = Field(alias="vehicleStatus")
|
||||
cert_list: list[SnapshotCertRead] = Field(default_factory=list, alias="certList")
|
||||
personnel_list: list[SnapshotPersonnelRow] = Field(default_factory=list, alias="personnelList")
|
||||
personnel_summary: Optional[str] = Field(default=None, alias="personnelSummary")
|
||||
selected_driver_id: Optional[str] = Field(default=None, alias="selectedDriverId")
|
||||
|
||||
model_config = {"populate_by_name": True}
|
||||
|
||||
|
||||
def parse_resource_snapshot(raw: Any) -> Optional[TransportResourceSnapshot]:
|
||||
"""从 ORM 文本列或 dict 解析快照。"""
|
||||
if raw is None:
|
||||
return None
|
||||
if isinstance(raw, TransportResourceSnapshot):
|
||||
return raw
|
||||
if isinstance(raw, str):
|
||||
text = raw.strip()
|
||||
if not text:
|
||||
return None
|
||||
return TransportResourceSnapshot.model_validate_json(text)
|
||||
if isinstance(raw, dict):
|
||||
return TransportResourceSnapshot.model_validate(raw)
|
||||
return None
|
||||
|
||||
|
||||
class PlanResourceSnapshotMixin(BaseModel):
|
||||
trailer_no: Optional[str] = Field(default=None, alias="trailerNo")
|
||||
resource_snapshot: Optional[TransportResourceSnapshot] = Field(
|
||||
default=None, alias="resourceSnapshot"
|
||||
)
|
||||
|
||||
model_config = {"populate_by_name": True}
|
||||
|
||||
@field_validator("resource_snapshot", mode="before")
|
||||
@classmethod
|
||||
def _coerce_resource_snapshot(cls, value: Any) -> Any:
|
||||
parsed = parse_resource_snapshot(value)
|
||||
return parsed.model_dump(by_alias=True) if parsed else None
|
||||
@@ -5,6 +5,8 @@ from typing import Optional
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from app.schemas.pl.resource_snapshot import PlanResourceSnapshotMixin
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# 运输 Schema
|
||||
@@ -112,7 +114,7 @@ class TransportUpdate(BaseModel):
|
||||
model_config = {"populate_by_name": True}
|
||||
|
||||
|
||||
class TransportRead(TransportBase):
|
||||
class TransportRead(TransportBase, PlanResourceSnapshotMixin):
|
||||
id: str
|
||||
transport_no: str = Field(alias="transportNo")
|
||||
qr_code: Optional[str] = Field(default=None, alias="qrCode")
|
||||
|
||||
@@ -31,7 +31,7 @@ from app.schemas.pl.freight import (
|
||||
_FMT = "%Y-%m-%d %H:%M:%S"
|
||||
|
||||
TAB_STATUS_MAP = {
|
||||
"bills": ("pending", "approving", "approved", "confirmed"),
|
||||
"bills": ("pending", "approving", "approved", "confirmed", "cancelled"),
|
||||
"approval_pending": ("approving",),
|
||||
"approval_done": ("approved", "confirmed"),
|
||||
"disburse": ("approved",),
|
||||
@@ -61,6 +61,7 @@ def _occupied_transport_ids_subquery(db: Session, tenant_no: str):
|
||||
PlFreightSettlementTransport.del_flag == 0,
|
||||
PlFreightSettlement.tenant_no == tenant_no,
|
||||
PlFreightSettlement.del_flag == 0,
|
||||
PlFreightSettlement.settlement_status != "cancelled",
|
||||
)
|
||||
)
|
||||
|
||||
@@ -330,6 +331,40 @@ def delete_draft_settlement(
|
||||
db.commit()
|
||||
|
||||
|
||||
def cancel_draft_settlement(
|
||||
db: Session, *, tenant_no: str, settlement_id: str, user_id: str, user=None
|
||||
) -> PlFreightSettlement:
|
||||
settlement = get_settlement_row(db, tenant_no, settlement_id, user=user)
|
||||
if settlement.settlement_status != "pending":
|
||||
raise HTTPException(status_code=400, detail="仅草稿结算单可作废")
|
||||
|
||||
if user:
|
||||
assert_row_deletable_by_creator(settlement, user_info_from_context(user))
|
||||
elif user_id:
|
||||
assert_row_deletable_by_creator(settlement, {"user_id": user_id})
|
||||
|
||||
now = datetime.now()
|
||||
settlement.settlement_status = "cancelled"
|
||||
settlement.update_by = user_id
|
||||
settlement.update_time = now
|
||||
|
||||
links = (
|
||||
db.query(PlFreightSettlementTransport)
|
||||
.filter(
|
||||
PlFreightSettlementTransport.settlement_id == settlement_id,
|
||||
PlFreightSettlementTransport.del_flag == 0,
|
||||
)
|
||||
.all()
|
||||
)
|
||||
for link in links:
|
||||
link.del_flag = 1
|
||||
link.update_time = now
|
||||
|
||||
db.commit()
|
||||
db.refresh(settlement)
|
||||
return settlement
|
||||
|
||||
|
||||
def _get_transport_ids(db: Session, settlement_id: str) -> List[str]:
|
||||
return [
|
||||
r.transport_id
|
||||
|
||||
@@ -27,6 +27,11 @@ from app.schemas.pl.plan import (
|
||||
PlanProductCreate,
|
||||
PlanTransportCreateBlock,
|
||||
)
|
||||
from app.services.pl_transport_resource_snapshot_service import (
|
||||
apply_resource_snapshot_json,
|
||||
build_transport_resource_snapshot,
|
||||
clear_resource_snapshot,
|
||||
)
|
||||
|
||||
|
||||
def determine_plan_type(supplier_name: Optional[str], destination_name: Optional[str]) -> str:
|
||||
@@ -115,6 +120,24 @@ def build_plan_product(
|
||||
)
|
||||
|
||||
|
||||
def _apply_vehicle_snapshot_to_plan_transport(
|
||||
db: Session,
|
||||
*,
|
||||
tenant_no: str,
|
||||
plan: PlPlan,
|
||||
transport: Optional[PlTransport],
|
||||
vehicle: PlVehicle,
|
||||
driver_id: str,
|
||||
) -> None:
|
||||
snapshot = build_transport_resource_snapshot(
|
||||
db,
|
||||
tenant_no,
|
||||
vehicle.id,
|
||||
selected_driver_id=driver_id,
|
||||
)
|
||||
apply_resource_snapshot_json(plan=plan, transport=transport, snapshot=snapshot)
|
||||
|
||||
|
||||
def _resolve_driver(
|
||||
db: Session,
|
||||
tenant_no: str,
|
||||
@@ -191,7 +214,7 @@ def _validate_toxic_products(products: list[PlPlanProduct]) -> None:
|
||||
label = "易制爆" if prod.is_explosive else "易制毒"
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=f"产品【{prod.product_name}】为{label},必须上传购买证和运输证",
|
||||
detail=f"产品【{prod.product_name}】为{label},必须上传购买证和合法使用证明",
|
||||
)
|
||||
|
||||
|
||||
@@ -489,6 +512,14 @@ def upsert_draft_transport_for_plan(
|
||||
plan.license_plate = vehicle.license_plate
|
||||
plan.driver_id = driver_id
|
||||
plan.driver_name = driver_name
|
||||
_apply_vehicle_snapshot_to_plan_transport(
|
||||
db,
|
||||
tenant_no=tenant_no,
|
||||
plan=plan,
|
||||
transport=transport,
|
||||
vehicle=vehicle,
|
||||
driver_id=driver_id,
|
||||
)
|
||||
plan.freight_amount = freight_amount or 0
|
||||
if plan.transport_status != "arranged":
|
||||
plan.transport_status = "pending"
|
||||
@@ -502,6 +533,7 @@ def clear_draft_transport_for_plan(
|
||||
user_id: str,
|
||||
) -> None:
|
||||
"""清除计划上的草稿运输单及车辆预选。"""
|
||||
transport: Optional[PlTransport] = None
|
||||
if plan.transport_id:
|
||||
transport = (
|
||||
db.query(PlTransport)
|
||||
@@ -528,6 +560,7 @@ def clear_draft_transport_for_plan(
|
||||
plan.license_plate = None
|
||||
plan.driver_id = None
|
||||
plan.driver_name = None
|
||||
clear_resource_snapshot(plan=plan, transport=transport)
|
||||
plan.freight_amount = 0
|
||||
if plan.transport_status != "arranged":
|
||||
plan.transport_status = "pending"
|
||||
@@ -678,6 +711,14 @@ def create_transport_for_plan(
|
||||
plan.license_plate = vehicle.license_plate
|
||||
plan.driver_id = driver_id
|
||||
plan.driver_name = driver_name
|
||||
_apply_vehicle_snapshot_to_plan_transport(
|
||||
db,
|
||||
tenant_no=tenant_no,
|
||||
plan=plan,
|
||||
transport=transport,
|
||||
vehicle=vehicle,
|
||||
driver_id=driver_id,
|
||||
)
|
||||
plan.transport_status = "arranged"
|
||||
plan.freight_amount = freight_amount or 0
|
||||
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
"""运输计划 - 安排运输时车辆/人员/证件资源快照"""
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.models.pl_models import PlPersonnel, PlVehicle
|
||||
from app.schemas.pl.base_data import CertRead
|
||||
from app.schemas.pl.resource_snapshot import (
|
||||
SnapshotCertRead,
|
||||
SnapshotPersonnelRow,
|
||||
TransportResourceSnapshot,
|
||||
)
|
||||
from app.services.pl_cert_service import certs_to_read, list_owner_certs
|
||||
from app.services.pl_personnel_service import (
|
||||
build_personnel_summary,
|
||||
load_vehicle_personnel_rows,
|
||||
)
|
||||
|
||||
|
||||
def _cert_to_snapshot(cert: CertRead) -> SnapshotCertRead:
|
||||
return SnapshotCertRead(
|
||||
id=cert.id,
|
||||
cert_id=cert.cert_id or cert.id,
|
||||
vehicle_part=cert.vehicle_part,
|
||||
cert_name=cert.cert_name,
|
||||
cert_no=cert.cert_no,
|
||||
expire_date=cert.expire_date,
|
||||
remind_days=cert.remind_days,
|
||||
attachment_urls=cert.attachment_urls,
|
||||
owner_type=cert.owner_type,
|
||||
owner_id=cert.owner_id,
|
||||
status=cert.status,
|
||||
)
|
||||
|
||||
|
||||
def build_transport_resource_snapshot(
|
||||
db: Session,
|
||||
tenant_no: str,
|
||||
vehicle_id: str,
|
||||
*,
|
||||
selected_driver_id: Optional[str] = None,
|
||||
) -> TransportResourceSnapshot:
|
||||
"""读取车辆当前主数据,生成安排运输用整包快照。"""
|
||||
vehicle = (
|
||||
db.query(PlVehicle)
|
||||
.filter(
|
||||
PlVehicle.id == vehicle_id,
|
||||
PlVehicle.tenant_no == tenant_no,
|
||||
PlVehicle.del_flag == 0,
|
||||
)
|
||||
.first()
|
||||
)
|
||||
if not vehicle:
|
||||
raise HTTPException(status_code=400, detail="车辆不存在")
|
||||
|
||||
vehicle_certs = certs_to_read(list_owner_certs(db, tenant_no, "vehicle", vehicle.id))
|
||||
link_rows = load_vehicle_personnel_rows(db, tenant_no, vehicle_id)
|
||||
|
||||
personnel_list: list[SnapshotPersonnelRow] = []
|
||||
summary_links: list[tuple[str, str, int]] = []
|
||||
|
||||
for row in link_rows:
|
||||
personnel: Optional[PlPersonnel] = None
|
||||
if row.personnel_id:
|
||||
personnel = (
|
||||
db.query(PlPersonnel)
|
||||
.filter(
|
||||
PlPersonnel.id == row.personnel_id,
|
||||
PlPersonnel.tenant_no == tenant_no,
|
||||
PlPersonnel.del_flag == 0,
|
||||
)
|
||||
.first()
|
||||
)
|
||||
|
||||
person_certs: list[SnapshotCertRead] = []
|
||||
if row.personnel_id:
|
||||
person_certs = [
|
||||
_cert_to_snapshot(c)
|
||||
for c in certs_to_read(
|
||||
list_owner_certs(db, tenant_no, "personnel", row.personnel_id)
|
||||
)
|
||||
]
|
||||
|
||||
personnel_list.append(
|
||||
SnapshotPersonnelRow(
|
||||
personnel_id=row.personnel_id,
|
||||
personnel_name=row.personnel_name,
|
||||
phone_no=row.phone_no or (personnel.phone_no if personnel else None),
|
||||
age=row.age if row.age is not None else (personnel.age if personnel else None),
|
||||
id_card_no=personnel.id_card_no if personnel else None,
|
||||
role=row.role,
|
||||
is_default=row.is_default,
|
||||
remark=row.remark,
|
||||
cert_list=person_certs,
|
||||
)
|
||||
)
|
||||
summary_links.append((row.personnel_name, row.role, row.is_default))
|
||||
|
||||
personnel_summary, _ = build_personnel_summary(summary_links)
|
||||
|
||||
return TransportResourceSnapshot(
|
||||
snapshotted_at=datetime.now(),
|
||||
vehicle_id=vehicle.id,
|
||||
vehicle_type=vehicle.vehicle_type,
|
||||
carrier_id=vehicle.carrier_id,
|
||||
carrier_name=vehicle.carrier_name,
|
||||
license_plate=vehicle.license_plate,
|
||||
trailer_no=vehicle.trailer_no,
|
||||
load_capacity=vehicle.load_capacity,
|
||||
vehicle_status=vehicle.vehicle_status,
|
||||
cert_list=[_cert_to_snapshot(c) for c in vehicle_certs],
|
||||
personnel_list=personnel_list,
|
||||
personnel_summary=personnel_summary or None,
|
||||
selected_driver_id=selected_driver_id,
|
||||
)
|
||||
|
||||
|
||||
def apply_resource_snapshot_json(
|
||||
*,
|
||||
plan,
|
||||
transport=None,
|
||||
snapshot: TransportResourceSnapshot,
|
||||
) -> None:
|
||||
"""将快照 JSON 写入计划/运输单,并同步标量冗余字段。"""
|
||||
json_str = snapshot.model_dump_json(by_alias=True)
|
||||
plan.trailer_no = snapshot.trailer_no
|
||||
plan.resource_snapshot = json_str
|
||||
if snapshot.personnel_summary:
|
||||
plan.personnel_summary = snapshot.personnel_summary
|
||||
|
||||
if transport is not None:
|
||||
transport.trailer_no = snapshot.trailer_no
|
||||
transport.resource_snapshot = json_str
|
||||
|
||||
|
||||
def clear_resource_snapshot(*, plan, transport=None) -> None:
|
||||
plan.trailer_no = None
|
||||
plan.resource_snapshot = None
|
||||
plan.personnel_summary = None
|
||||
if transport is not None:
|
||||
transport.trailer_no = None
|
||||
transport.resource_snapshot = None
|
||||
@@ -105,8 +105,12 @@
|
||||
"103": "Community 103",
|
||||
"104": "Community 104",
|
||||
"105": "Community 105",
|
||||
"106": "Community 106",
|
||||
"107": "Community 107",
|
||||
"108": "Community 108",
|
||||
"109": "Community 109",
|
||||
"110": "Community 110",
|
||||
"111": "Community 111",
|
||||
"112": "Community 112",
|
||||
"113": "Community 113",
|
||||
"114": "Community 114",
|
||||
@@ -118,12 +122,14 @@
|
||||
"120": "Community 120",
|
||||
"121": "Community 121",
|
||||
"122": "Community 122",
|
||||
"123": "Community 123",
|
||||
"124": "Community 124",
|
||||
"125": "Community 125",
|
||||
"126": "Community 126",
|
||||
"127": "Community 127",
|
||||
"128": "Community 128",
|
||||
"129": "Community 129",
|
||||
"130": "Community 130",
|
||||
"131": "Community 131",
|
||||
"132": "Community 132",
|
||||
"133": "Community 133",
|
||||
@@ -134,8 +140,15 @@
|
||||
"138": "Community 138",
|
||||
"139": "Community 139",
|
||||
"140": "Community 140",
|
||||
"141": "Community 141",
|
||||
"142": "Community 142",
|
||||
"143": "Community 143",
|
||||
"144": "Community 144",
|
||||
"145": "Community 145",
|
||||
"146": "Community 146",
|
||||
"147": "Community 147"
|
||||
"147": "Community 147",
|
||||
"148": "Community 148",
|
||||
"149": "Community 149",
|
||||
"150": "Community 150",
|
||||
"151": "Community 151"
|
||||
}
|
||||
@@ -1,16 +1,16 @@
|
||||
# Graph Report - backend (2026-06-29)
|
||||
# Graph Report - backend (2026-06-30)
|
||||
|
||||
## Corpus Check
|
||||
- 223 files · ~157,012 words
|
||||
- 226 files · ~157,929 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 4858 nodes · 34385 edges · 139 communities (138 shown, 1 thin omitted)
|
||||
- Extraction: 50% EXTRACTED · 50% INFERRED · 0% AMBIGUOUS · INFERRED: 17062 edges (avg confidence: 0.5)
|
||||
- 4973 nodes · 34742 edges · 152 communities (150 shown, 2 thin omitted)
|
||||
- Extraction: 51% EXTRACTED · 49% INFERRED · 0% AMBIGUOUS · INFERRED: 17183 edges (avg confidence: 0.5)
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Graph Freshness
|
||||
- Built from commit: `493f8d67`
|
||||
- Built from commit: `d84f4b94`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
@@ -121,16 +121,22 @@
|
||||
- [[_COMMUNITY_Community 103|Community 103]]
|
||||
- [[_COMMUNITY_Community 104|Community 104]]
|
||||
- [[_COMMUNITY_Community 105|Community 105]]
|
||||
- [[_COMMUNITY_Community 106|Community 106]]
|
||||
- [[_COMMUNITY_Community 107|Community 107]]
|
||||
- [[_COMMUNITY_Community 108|Community 108]]
|
||||
- [[_COMMUNITY_Community 109|Community 109]]
|
||||
- [[_COMMUNITY_Community 110|Community 110]]
|
||||
- [[_COMMUNITY_Community 111|Community 111]]
|
||||
- [[_COMMUNITY_Community 112|Community 112]]
|
||||
- [[_COMMUNITY_Community 122|Community 122]]
|
||||
- [[_COMMUNITY_Community 123|Community 123]]
|
||||
- [[_COMMUNITY_Community 124|Community 124]]
|
||||
- [[_COMMUNITY_Community 125|Community 125]]
|
||||
- [[_COMMUNITY_Community 126|Community 126]]
|
||||
- [[_COMMUNITY_Community 127|Community 127]]
|
||||
- [[_COMMUNITY_Community 128|Community 128]]
|
||||
- [[_COMMUNITY_Community 129|Community 129]]
|
||||
- [[_COMMUNITY_Community 130|Community 130]]
|
||||
- [[_COMMUNITY_Community 131|Community 131]]
|
||||
- [[_COMMUNITY_Community 132|Community 132]]
|
||||
- [[_COMMUNITY_Community 133|Community 133]]
|
||||
@@ -141,18 +147,25 @@
|
||||
- [[_COMMUNITY_Community 138|Community 138]]
|
||||
- [[_COMMUNITY_Community 139|Community 139]]
|
||||
- [[_COMMUNITY_Community 140|Community 140]]
|
||||
- [[_COMMUNITY_Community 141|Community 141]]
|
||||
- [[_COMMUNITY_Community 143|Community 143]]
|
||||
- [[_COMMUNITY_Community 144|Community 144]]
|
||||
- [[_COMMUNITY_Community 145|Community 145]]
|
||||
- [[_COMMUNITY_Community 146|Community 146]]
|
||||
- [[_COMMUNITY_Community 147|Community 147]]
|
||||
- [[_COMMUNITY_Community 148|Community 148]]
|
||||
- [[_COMMUNITY_Community 149|Community 149]]
|
||||
- [[_COMMUNITY_Community 150|Community 150]]
|
||||
- [[_COMMUNITY_Community 151|Community 151]]
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `Session` - 1123 edges
|
||||
2. `BaseModel` - 412 edges
|
||||
2. `BaseModel` - 420 edges
|
||||
3. `int` - 336 edges
|
||||
4. `Any` - 331 edges
|
||||
5. `get_tenant_no()` - 326 edges
|
||||
5. `get_tenant_no()` - 327 edges
|
||||
6. `SysUser` - 281 edges
|
||||
7. `DbUserContext` - 267 edges
|
||||
7. `DbUserContext` - 272 edges
|
||||
8. `success_response()` - 258 edges
|
||||
9. `Session` - 257 edges
|
||||
10. `bool` - 255 edges
|
||||
@@ -169,35 +182,35 @@
|
||||
- `int` --uses--> `LocalStorage` [INFERRED]
|
||||
scripts/run_db_auto_generate_plans.py → app/core/storage.py
|
||||
|
||||
## Communities (139 total, 1 thin omitted)
|
||||
## Communities (152 total, 2 thin omitted)
|
||||
|
||||
### Community 0 - "Community 0"
|
||||
Cohesion: 0.13
|
||||
Nodes (102): date, DbUserContext, int, Session, str, DocumentReminderRead, DocumentReminderUpdate, InventoryLedgerResponse (+94 more)
|
||||
Cohesion: 0.11
|
||||
Nodes (126): date, DbUserContext, int, Session, str, DocumentReminderRead, DocumentReminderUpdate, FreightSettlementCreate (+118 more)
|
||||
|
||||
### Community 1 - "Community 1"
|
||||
Cohesion: 0.04
|
||||
Nodes (48): 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll (+40 more)
|
||||
Cohesion: 0.08
|
||||
Nodes (24): 供方详情 — Java: CrmSupplierInfoController.getInfo, 供方详情 — Java: CrmSupplierInfoController.getInfo, 供方详情 — Java: CrmSupplierInfoController.getInfo, 供方详情 — Java: CrmSupplierInfoController.getInfo, 供方详情 — Java: CrmSupplierInfoController.getInfo, 供方详情 — Java: CrmSupplierInfoController.getInfo, 供方详情 — Java: CrmSupplierInfoController.getInfo, 供方详情 — Java: CrmSupplierInfoController.getInfo (+16 more)
|
||||
|
||||
### Community 2 - "Community 2"
|
||||
Cohesion: 0.36
|
||||
Nodes (218): Any, bool, str, UploadFile, CRM 线索管理 Pydantic Schemas, CRM 商机管理 Pydantic Schemas, CRM 客户公海池规则 Pydantic Schemas, CRM 产品模块 Pydantic Schemas (+210 more)
|
||||
Cohesion: 0.35
|
||||
Nodes (221): Any, bool, str, UploadFile, CRM 线索管理 Pydantic Schemas, CRM 客户管理 Pydantic Schemas, CRM 商机管理 Pydantic Schemas, CRM 客户公海池规则 Pydantic Schemas (+213 more)
|
||||
|
||||
### Community 3 - "Community 3"
|
||||
Cohesion: 0.07
|
||||
Nodes (172): _apply_default_invoice_info_to_customers(), category_add(), category_delete(), category_tree(), category_update(), clue_assign(), clue_check_convert(), clue_check_duplicate() (+164 more)
|
||||
|
||||
### Community 4 - "Community 4"
|
||||
Cohesion: 0.21
|
||||
Nodes (35): DbInboundOutbound, DbUserContext, Session, str, CreateLinkForPlanPayload, _apply_inventory_product_update(), _apply_inventory_update(), _base_query() (+27 more)
|
||||
Cohesion: 0.05
|
||||
Nodes (43): invoice_info_list(), 按客户ID查询开票信息(与 by-customer 等价), 按客户ID查询开票信息(与 by-customer 等价), 按客户ID查询开票信息(与 by-customer 等价), 按客户ID查询开票信息(与 by-customer 等价), 分页查询供方列表 — Java: CrmSupplierInfoController.list, 分页查询供方列表 — Java: CrmSupplierInfoController.list, 分页查询供方列表 — Java: CrmSupplierInfoController.list (+35 more)
|
||||
|
||||
### Community 5 - "Community 5"
|
||||
Cohesion: 0.09
|
||||
Nodes (34): _error_json(), lifespan(), _mask_secret(), Exception, int, Request, str, 未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin (+26 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (42): _db_pool_keepalive_loop(), _error_json(), lifespan(), _mask_secret(), Exception, int, Request, str (+34 more)
|
||||
|
||||
### Community 6 - "Community 6"
|
||||
Cohesion: 0.12
|
||||
Nodes (62): Any, bool, date, int, Session, str, Any, bool (+54 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (56): Any, int, Session, str, Any, bool, CRM 客户 CRUD(客户主表 + 转移/成交/公海池操作), CrmCustomer (+48 more)
|
||||
|
||||
### Community 7 - "Community 7"
|
||||
Cohesion: 0.14
|
||||
@@ -209,47 +222,47 @@ Nodes (33): Any, bool, int, Session, str, Any, Session, str (+25 more)
|
||||
|
||||
### Community 9 - "Community 9"
|
||||
Cohesion: 0.10
|
||||
Nodes (22): bool, bool, Any, bool, int, Session, str, bool (+14 more)
|
||||
Nodes (22): str, CustomerPoolDetailBody, CustomerPoolListBody, PurchasePlanBase, PurchasePlanCreate, PurchasePlanUpdate, BaseModel, SoftDeleteModel (+14 more)
|
||||
|
||||
### Community 10 - "Community 10"
|
||||
Cohesion: 0.17
|
||||
Nodes (20): Any, int, str, get_oper_log_meta(), OperLogMeta, 请求级操作日志元数据(ContextVar), 供异步落库线程使用,避免 ContextVar 跨线程丢失。, set_oper_log_meta() (+12 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (39): CRM 报价单 CRUD — 对照 CrmQuoteServiceImpl.java(P2 全量), date, Decimal, Query, _build_quote_filters(), calculate_quote_amount(), create_quote(), _decimal_value() (+31 more)
|
||||
|
||||
### Community 11 - "Community 11"
|
||||
Cohesion: 0.16
|
||||
Nodes (36): Any, bool, BxUserContext, BxWorkflowNode, float, int, ReimburseApplyOut, Session (+28 more)
|
||||
|
||||
### Community 12 - "Community 12"
|
||||
Cohesion: 0.13
|
||||
Nodes (79): date, DbUserContext, int, Session, str, VehicleUreaApplyCreate, VehicleUreaApplyRead, VehicleUreaApplyUpdate (+71 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (85): date, DbUserContext, int, Session, str, VehicleUreaApplyCreate, VehicleUreaApplyRead, VehicleUreaApplyUpdate (+77 more)
|
||||
|
||||
### Community 13 - "Community 13"
|
||||
Cohesion: 0.11
|
||||
Nodes (17): Exception, bytes, int, Path, str, BytesIO, BaseStorage, convert_heic_to_jpeg() (+9 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (17): Exception, bool, bytes, int, str, BytesIO, BaseStorage, convert_heic_to_jpeg() (+9 more)
|
||||
|
||||
### Community 14 - "Community 14"
|
||||
Cohesion: 0.09
|
||||
Nodes (61): Any, bool, CrmContract, datetime, int, Query, Session, str (+53 more)
|
||||
Nodes (55): Any, bool, datetime, int, Session, str, _advance_contract_after_approval(), approve_contract() (+47 more)
|
||||
|
||||
### Community 15 - "Community 15"
|
||||
Cohesion: 0.14
|
||||
Nodes (28): str, bool, date, datetime, int, Session, str, filter_current_cycle_approvals() (+20 more)
|
||||
Cohesion: 0.18
|
||||
Nodes (24): bool, date, datetime, int, Session, str, ReimburseApplyOut, allocate_reimburse_title_seq() (+16 more)
|
||||
|
||||
### Community 16 - "Community 16"
|
||||
Cohesion: 0.08
|
||||
Nodes (40): int, LeaveCreate, LeaveUpdate, AttachmentUploadResponse, DeleteInput, IdInput, PaginationParams, PaginationResult (+32 more)
|
||||
Cohesion: 0.17
|
||||
Nodes (28): API 路由包 — 山峡化工生产一体化门户, get_menu_list(), 运营端菜单接口(与 web-admin 前端静态路由 sqxp.ts 对齐,14 个一级菜单), approve_task(), _assert_wf_instance_in_scope(), _business_type_label(), create_process_def(), delete_process_def() (+20 more)
|
||||
|
||||
### Community 17 - "Community 17"
|
||||
Cohesion: 0.19
|
||||
Nodes (50): Any, Any, CRM 商机 CRUD(主表 + 阶段/赢输单/统计/看板/漏斗), CrmOpportunity, date, datetime, Decimal, int (+42 more)
|
||||
Cohesion: 0.20
|
||||
Nodes (52): Any, Any, CRM 商机 CRUD(主表 + 阶段/赢输单/统计/看板/漏斗), CrmOpportunity, date, datetime, Decimal, int (+44 more)
|
||||
|
||||
### Community 18 - "Community 18"
|
||||
Cohesion: 0.15
|
||||
Nodes (24): Any, bool, BxUserContext, BxWorkflowNode, float, int, Session, str (+16 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (29): Any, bool, BxUserContext, BxWorkflowNode, float, int, Session, str (+21 more)
|
||||
|
||||
### Community 19 - "Community 19"
|
||||
Cohesion: 0.03
|
||||
Nodes (182): register_quote_routes(), Any, bool, int, Session, str, Any, bool (+174 more)
|
||||
Cohesion: 0.23
|
||||
Nodes (27): register_quote_routes(), bool, int, Session, str, accept_quote(), _ensure_quote_in_scope(), generate_pdf() (+19 more)
|
||||
|
||||
### Community 20 - "Community 20"
|
||||
Cohesion: 0.35
|
||||
@@ -257,26 +270,26 @@ Nodes (30): BxUserContext, int, Session, str, approve_reimburse(), approved_by_m
|
||||
|
||||
### Community 21 - "Community 21"
|
||||
Cohesion: 0.06
|
||||
Nodes (95): DbUserContext, 运输计划管理 - 基础数据 API(承运商、车辆、人员), PlVehicle, Session, str, VehicleRead, date, 运输计划管理 - 基础数据 Schema(承运商、车辆、人员、证书) (+87 more)
|
||||
Nodes (130): bool, DbUserContext, int, 运输计划管理 - 基础数据 API(承运商、车辆、人员), PlCarrier, PlVehicle, Session, str (+122 more)
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
Cohesion: 0.20
|
||||
Nodes (36): ProcessDefCreateBody, ProcessDefUpdateBody, PublishVersionBody, 审批意见:前端传 commentText,兼容 comment。, 审批意见:前端传 commentText,兼容 comment。, StartInstanceBody, TaskActionBody, Any (+28 more)
|
||||
|
||||
### Community 23 - "Community 23"
|
||||
Cohesion: 0.27
|
||||
Nodes (35): AdvanceIssueRequest, BxUserContext, int, ReimburseApplyOut, Session, str, str, BatchOffsetRequest (+27 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.12
|
||||
Nodes (90): date, DbUserContext, int, Session, str, VehicleMaintenanceApplyCreate, VehicleMaintenanceApplyRead, VehicleMaintenanceApplyReminder (+82 more)
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.22
|
||||
Nodes (29): Any, int, Session, str, create_instance(), create_process_def(), create_task(), get_all_tasks_for_business() (+21 more)
|
||||
|
||||
### Community 23 - "Community 23"
|
||||
Cohesion: 0.19
|
||||
Nodes (40): AdvanceIssueRequest, BxUserContext, int, ReimburseApplyOut, Session, str, str, BatchOffsetRequest (+32 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.14
|
||||
Nodes (84): date, DbUserContext, int, Session, str, VehicleMaintenanceApplyCreate, VehicleMaintenanceApplyRead, VehicleMaintenanceApplyReminder (+76 more)
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.07
|
||||
Nodes (98): attachment_download_url(), AttachmentDownloadUrlBody, create_dept(), create_dict_data(), create_dict_type(), create_menu(), create_post(), create_role_management() (+90 more)
|
||||
|
||||
### Community 26 - "Community 26"
|
||||
Cohesion: 0.21
|
||||
Cohesion: 0.20
|
||||
Nodes (18): bool, int, Redis, Request, str, _claims_from_auth(), _coerce_post_method_override_to_get(), _get_redis_client() (+10 more)
|
||||
|
||||
### Community 27 - "Community 27"
|
||||
@@ -284,16 +297,16 @@ Cohesion: 0.11
|
||||
Nodes (57): Any, bool, int, Session, str, Any, bool, CRM 线索 CRUD(线索主表 + 转化/分配/无效/等级操作) (+49 more)
|
||||
|
||||
### Community 28 - "Community 28"
|
||||
Cohesion: 0.11
|
||||
Nodes (40): date, int, Session, str, CertRead, CertRow, PlCert, PlDocumentReminder (+32 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (61): Any, CertRead, date, int, Session, str, CertRead, Session (+53 more)
|
||||
|
||||
### Community 29 - "Community 29"
|
||||
Cohesion: 0.05
|
||||
Nodes (43): invoice_info_list(), 按客户ID查询开票信息(与 by-customer 等价), 按客户ID查询开票信息(与 by-customer 等价), 按客户ID查询开票信息(与 by-customer 等价), 按客户ID查询开票信息(与 by-customer 等价), 分页查询供方列表 — Java: CrmSupplierInfoController.list, 分页查询供方列表 — Java: CrmSupplierInfoController.list, 分页查询供方列表 — Java: CrmSupplierInfoController.list (+35 more)
|
||||
Cohesion: 0.04
|
||||
Nodes (66): 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll, 供方全量列表(下拉)— Java: CrmSupplierInfoController.listAll (+58 more)
|
||||
|
||||
### Community 30 - "Community 30"
|
||||
Cohesion: 0.08
|
||||
Nodes (43): 删除供方 — Java: CrmSupplierInfoController.remove, 删除供方 — Java: CrmSupplierInfoController.remove, 删除供方 — Java: CrmSupplierInfoController.remove, 删除供方 — Java: CrmSupplierInfoController.remove, 删除供方 — Java: CrmSupplierInfoController.remove, 删除供方 — Java: CrmSupplierInfoController.remove, 删除供方 — Java: CrmSupplierInfoController.remove, 删除供方 — Java: CrmSupplierInfoController.remove (+35 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (43): AttachmentUploadResponse, ChangePasswordRequest, Config, LoginRequest, LoginResponse, Pydantic schemas - 用户认证, ResetPasswordRequest, UserCreate (+35 more)
|
||||
|
||||
### Community 31 - "Community 31"
|
||||
Cohesion: 0.34
|
||||
@@ -301,99 +314,99 @@ Nodes (19): int, PlTransport, Session, str, UploadFile, _build_public_page(), _f
|
||||
|
||||
### Community 32 - "Community 32"
|
||||
Cohesion: 0.10
|
||||
Nodes (96): date, DbUserContext, int, Session, str, VehicleRechargeApplyCreate, VehicleRechargeApplyRead, VehicleRechargeApplyUpdate (+88 more)
|
||||
Nodes (97): date, DbUserContext, int, Session, str, VehicleRechargeApplyCreate, VehicleRechargeApplyRead, VehicleRechargeApplyUpdate (+89 more)
|
||||
|
||||
### Community 33 - "Community 33"
|
||||
Cohesion: 0.11
|
||||
Nodes (55): pool_rule_toggle(), Any, int, Session, str, Any, bool, CRM 公海池规则 CRUD + 规则执行逻辑 (+47 more)
|
||||
Cohesion: 0.14
|
||||
Nodes (39): pool_rule_toggle(), Any, bool, CRM 公海池规则 CRUD + 规则执行逻辑, int, Session, str, create_pool_rule() (+31 more)
|
||||
|
||||
### Community 34 - "Community 34"
|
||||
Cohesion: 0.22
|
||||
Nodes (29): Engine, Path, build_id_maps(), clip_text(), count_rows(), export_mapping(), fetch_rows(), legacy_id_to_str() (+21 more)
|
||||
Cohesion: 0.23
|
||||
Nodes (28): Engine, build_id_maps(), clip_text(), count_rows(), export_mapping(), fetch_rows(), legacy_id_to_str(), main() (+20 more)
|
||||
|
||||
### Community 35 - "Community 35"
|
||||
Cohesion: 0.05
|
||||
Nodes (37): str, AttachmentOut, ReimburseApplyCreate, Config, PageResult, ResponseModel, ContactByCustomerBody, ContactDetailBody (+29 more)
|
||||
Cohesion: 0.04
|
||||
Nodes (151): DbUserContext, FreightSettlementDisburseBody, FreightSettlementSubmitApprovalBody, FreightSettlementUpdate, int, Session, str, Any (+143 more)
|
||||
|
||||
### Community 36 - "Community 36"
|
||||
Cohesion: 0.12
|
||||
Nodes (26): API 路由包 — 山峡化工生产一体化门户, create_leave(), delete_leave(), get_leave(), _leave_local_callback(), leave_workflow_callback(), list_leaves(), submit_leave() (+18 more)
|
||||
Cohesion: 0.14
|
||||
Nodes (27): operlog_detail(), operlog_list(), 操作日志分页列表(基于 API 请求日志适配 RuoYi OperLog 结构), 操作日志分页列表(基于 API 请求日志适配 RuoYi OperLog 结构), _user_info(), Session, Any, bool (+19 more)
|
||||
|
||||
### Community 37 - "Community 37"
|
||||
Cohesion: 0.31
|
||||
Nodes (15): Any, int, Session, str, assert_row_deletable_by_creator(), create_dict_data(), get_dict_data(), list_dict_data() (+7 more)
|
||||
Cohesion: 0.33
|
||||
Nodes (14): Any, int, Session, str, create_dict_data(), get_dict_data(), list_dict_data(), list_dict_data_options() (+6 more)
|
||||
|
||||
### Community 38 - "Community 38"
|
||||
Cohesion: 0.15
|
||||
Nodes (14): Any, int, str, get_wechat_pay_client(), get_wechat_pay_v2(), 微信支付工具模块 支持微信支付 V3 API 文档参考: https://pay.weixin.qq.com/docs/v3/apis/index.html, 统一下单接口 (V3) Args: out_trade_no: 商户订单号 total_amo, 申请退款 Args: out_trade_no: 商户订单号 total_amount: 订单 (+6 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (35): Any, bool, int, str, Any, bool, int, Session (+27 more)
|
||||
|
||||
### Community 39 - "Community 39"
|
||||
Cohesion: 0.13
|
||||
Nodes (33): datetime, int, str, date, datetime, str, format_datetime(), generate_id() (+25 more)
|
||||
Cohesion: 0.16
|
||||
Nodes (25): datetime, int, str, bool, date, datetime, str, 审批轮次过滤 — 驳回后重新提交时,进度接口仅展示当前轮次。 (+17 more)
|
||||
|
||||
### Community 40 - "Community 40"
|
||||
Cohesion: 0.13
|
||||
Nodes (37): Any, bool, Decimal, int, Session, str, batch_insert_quote_products(), calculate_subtotal() (+29 more)
|
||||
|
||||
### Community 41 - "Community 41"
|
||||
Cohesion: 0.14
|
||||
Nodes (11): Any, Session, str, _auto_fill_create_dept_id(), get_db(), ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID, get_db_current_user_optional(), 地磅模块认证适配:门户 JWT 用户 → db 业务上下文。 (+3 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (39): Any, bool, date, int, Session, str, Session, str (+31 more)
|
||||
|
||||
### Community 42 - "Community 42"
|
||||
Cohesion: 0.08
|
||||
Nodes (25): 技术栈, 1. 创建虚拟环境, 项目结构, 1. 创建虚拟环境, 2. 安装依赖, 2. 安装依赖, 3. 配置环境变量, 快速开始 (+17 more)
|
||||
|
||||
### Community 43 - "Community 43"
|
||||
Cohesion: 0.07
|
||||
Nodes (68): Any, int, str, Any, int, Session, str, Any (+60 more)
|
||||
Cohesion: 0.21
|
||||
Nodes (16): Any, int, str, BusinessException, InvalidStatusTransitionException, log_api_request(), log_delivery_operation(), log_operation() (+8 more)
|
||||
|
||||
### Community 44 - "Community 44"
|
||||
Cohesion: 0.15
|
||||
Nodes (33): CRM 报价单 API 路由 — 挂接到 crm.router, CRM 报价单 Pydantic Schemas, BaseModel, QuoteAcceptBody, QuoteApprovalApproveBody, QuoteApprovalListBody, QuoteApprovalRefreshNamesBody, QuoteApprovalWithdrawBody (+25 more)
|
||||
Cohesion: 0.21
|
||||
Nodes (38): DbInboundOutbound, DbUserContext, InboundOutboundRead, Session, str, CreateLinkForPlanPayload, _apply_inventory_product_update(), _apply_inventory_update() (+30 more)
|
||||
|
||||
### Community 45 - "Community 45"
|
||||
Cohesion: 0.32
|
||||
Nodes (22): Any, CrmOpportunity, Decimal, int, Session, str, batch_add_opportunity_products(), _calc_subtotal() (+14 more)
|
||||
Cohesion: 0.36
|
||||
Nodes (15): create_leave(), delete_leave(), get_leave(), _leave_local_callback(), leave_workflow_callback(), list_leaves(), submit_leave(), update_leave() (+7 more)
|
||||
|
||||
### Community 46 - "Community 46"
|
||||
Cohesion: 0.19
|
||||
Nodes (18): str, Any, bool, Session, str, CRM 模块 Excel 导出列定义(字段与字典类型对齐 Java *Vo @ExcelDictFormat)。, _yes_no(), _build_workbook() (+10 more)
|
||||
|
||||
### Community 47 - "Community 47"
|
||||
Cohesion: 0.24
|
||||
Nodes (24): approve_task(), _assert_wf_instance_in_scope(), _business_type_label(), create_process_def(), delete_process_def(), _enrich_task_list(), get_business_all_tasks(), _get_business_form_fields() (+16 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (21): Java: createNewVersion — 返回新报价单 id, Java: CrmQuoteServiceImpl.withdrawApproval(校验创建人), Java: CrmQuoteServiceImpl.withdrawApproval(校验创建人), Java: CrmQuoteServiceImpl.withdrawApproval(校验创建人), Java: CrmQuoteServiceImpl.withdrawApproval(校验创建人), Java: CrmQuoteServiceImpl.withdrawApproval(校验创建人), Java: CrmQuoteServiceImpl.withdrawApproval(校验创建人), Java: statisticsOverview (+13 more)
|
||||
|
||||
### Community 48 - "Community 48"
|
||||
Cohesion: 0.39
|
||||
Nodes (8): bool, BxUserContext, Session, str, 按业务类型获取工作流;已知类型不存在时自动创建空定义(无节点)。, 按业务类型获取工作流;已知类型不存在时自动创建空定义(无节点)。, WorkflowService, BxWorkflowDef
|
||||
Cohesion: 0.35
|
||||
Nodes (9): bool, BxUserContext, BxWorkflowNode, Session, str, 按业务类型获取工作流;已知类型不存在时自动创建空定义(无节点)。, 按业务类型获取工作流;已知类型不存在时自动创建空定义(无节点)。, WorkflowService (+1 more)
|
||||
|
||||
### Community 49 - "Community 49"
|
||||
Cohesion: 0.31
|
||||
Nodes (20): Any, bool, CrmOpportunity, datetime, int, Session, str, create_opportunity_follow() (+12 more)
|
||||
|
||||
### Community 50 - "Community 50"
|
||||
Cohesion: 0.11
|
||||
Nodes (32): CRM 报价单 API 路由 — 挂接到 crm.router, CRM 报价单 Pydantic Schemas, QuoteAcceptBody, QuoteApprovalApproveBody, QuoteApprovalListBody, QuoteApprovalRefreshNamesBody, QuoteApprovalWithdrawBody, QuoteCreateBody (+24 more)
|
||||
|
||||
### Community 51 - "Community 51"
|
||||
Cohesion: 0.07
|
||||
Nodes (46): CRM 合同 API 路由 — GET/PUT/DELETE/POST 对齐原 Java CRM, CRM 合同 Pydantic Schemas — 对照 CrmContractBo / CrmContractVo, ContractApprovalActionBody, ContractApprovalApproveBody, ContractApprovalByContractBody, ContractApprovalExportBody, ContractApprovalListBody, ContractApprovalListQuery (+38 more)
|
||||
|
||||
### Community 50 - "Community 50"
|
||||
Cohesion: 0.08
|
||||
Nodes (105): bool, PlCarrier, VehicleCreate, VehicleUpdate, bool, Decimal, int, PlanCreateFull (+97 more)
|
||||
|
||||
### Community 51 - "Community 51"
|
||||
Cohesion: 0.05
|
||||
Nodes (167): DbUserContext, FreightSettlementDisburseBody, FreightSettlementSubmitApprovalBody, FreightSettlementUpdate, int, Session, str, Any (+159 more)
|
||||
|
||||
### Community 52 - "Community 52"
|
||||
Cohesion: 0.11
|
||||
Nodes (46): Decimal, str, Any, bool, CrmContractProductPriceTier, date, Decimal, int (+38 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (61): CrmContract, Query, Any, bool, CrmContractProductPriceTier, date, Decimal, int (+53 more)
|
||||
|
||||
### Community 53 - "Community 53"
|
||||
Cohesion: 0.18
|
||||
Nodes (19): bytes, int, str, download_file_bytes(), file_stream(), get_access_url(), get_download_url(), get_preview_url() (+11 more)
|
||||
Cohesion: 0.24
|
||||
Nodes (20): Any, bool, str, _actor_ids(), _actor_names(), assert_row_deletable_by_creator(), assert_rows_deletable_by_creator(), can_delete_by_creator() (+12 more)
|
||||
|
||||
### Community 54 - "Community 54"
|
||||
Cohesion: 0.22
|
||||
Nodes (17): Any, bool, Session, str, list_share_logs(), _parse_user_agent(), CRM 报价单分享访问日志 CRUD — 对照 CrmQuoteShareLogServiceImpl.java, Java: statisticsVisits (+9 more)
|
||||
|
||||
### Community 55 - "Community 55"
|
||||
Cohesion: 0.28
|
||||
Nodes (22): bool, CRM 产品模块 CRUD(产品分类 + 产品 + 附件), Session, str, barcode_exists(), category_code_exists(), create_category(), create_product() (+14 more)
|
||||
Cohesion: 0.04
|
||||
Nodes (111): Any, bool, CRM 产品模块 CRUD(产品分类 + 产品 + 附件), int, Session, str, SysOss, int (+103 more)
|
||||
|
||||
### Community 56 - "Community 56"
|
||||
Cohesion: 0.26
|
||||
@@ -408,8 +421,8 @@ Cohesion: 0.37
|
||||
Nodes (17): check_env(), check_python(), create_venv(), init_env(), install_dependencies(), log_error(), log_info(), log_success() (+9 more)
|
||||
|
||||
### Community 59 - "Community 59"
|
||||
Cohesion: 0.11
|
||||
Nodes (22): bool, date, Session, str, get_last_month_range(), month_range(), 地磅计划按月自动生成 — 迁移自 simple-dibang-xiaoshou/auto-create-plan/auto_create_monthly_pla, 按月自动生成采购计划。 - 默认仅在每月 1 日执行(force=True 时跳过该限制,供手动触发验收) - 遍历所有租户,按上月计划模板生 (+14 more)
|
||||
Cohesion: 0.25
|
||||
Nodes (23): Any, bool, int, Session, str, create_role(), get_role(), get_role_data_scope() (+15 more)
|
||||
|
||||
### Community 60 - "Community 60"
|
||||
Cohesion: 0.18
|
||||
@@ -417,87 +430,87 @@ Nodes (11): generate_contract_no(), Java: generateContractNo — {供方编码}/
|
||||
|
||||
### Community 61 - "Community 61"
|
||||
Cohesion: 0.12
|
||||
Nodes (46): Session, str, bool, date, DbInboundOutbound, DbPurchasePlan, float, PlPlan (+38 more)
|
||||
Nodes (56): DbInboundOutbound, DbVehicle, InboundOutboundRead, VehicleRead, bool, datetime, DbWeighingSlip, Session (+48 more)
|
||||
|
||||
### Community 62 - "Community 62"
|
||||
Cohesion: 0.12
|
||||
Nodes (45): bool, DbInboundOutbound, int, PublicInventoryFeedback, PublicInventoryPageRead, Session, str, UploadFile (+37 more)
|
||||
|
||||
### Community 63 - "Community 63"
|
||||
Cohesion: 0.19
|
||||
Nodes (48): AdvanceApplyCreate, AdvanceApplyOut, AdvanceApplyUpdate, AdvanceApprovalCreate, BxUserContext, int, Session, str (+40 more)
|
||||
Cohesion: 0.20
|
||||
Nodes (46): AdvanceApplyCreate, AdvanceApplyOut, AdvanceApplyUpdate, AdvanceApprovalCreate, BxUserContext, int, Session, str (+38 more)
|
||||
|
||||
### Community 64 - "Community 64"
|
||||
Cohesion: 0.19
|
||||
Nodes (20): int, str, Any, bool, int, Session, str, business_type_from_path() (+12 more)
|
||||
Cohesion: 0.11
|
||||
Nodes (18): export_contracts(), ORM → camelCase(单点真相), ORM → camelCase(单点真相), ORM → camelCase(单点真相), ORM → camelCase(单点真相), ORM → camelCase(单点真相), Java: queryList for export, Java: queryList for export (+10 more)
|
||||
|
||||
### Community 65 - "Community 65"
|
||||
Cohesion: 0.28
|
||||
Nodes (8): date, datetime, str, _date_to_str(), _dt_to_str(), PagedQuery, PagedResponse, bx 原系统 API 响应包装(code=0 / msg / data.rows),与门户 success_response 分离。
|
||||
Cohesion: 0.12
|
||||
Nodes (17): create_new_version(), Java: toContract — 返回 contractId, Java: createNewVersion — 返回新报价单 id, Java: toContract — 返回 contractId, Java: createNewVersion — 返回新报价单 id, Java: toContract — 返回 contractId, Java: createNewVersion — 返回新报价单 id, Java: createNewVersion — 返回新报价单 id (+9 more)
|
||||
|
||||
### Community 66 - "Community 66"
|
||||
Cohesion: 0.34
|
||||
Nodes (16): Any, bool, int, Session, str, create_dict_type(), dict_type_code_exists(), get_dict_type() (+8 more)
|
||||
|
||||
### Community 67 - "Community 67"
|
||||
Cohesion: 0.16
|
||||
Nodes (12): float, int, str, 微信消息通知服务 支持微信小程序模板消息推送 使用方式: from app.core.wechat_message import WechatMes, 发送订单状态通知 Args: openid: 用户openid order_n, 发送支付成功通知 Args: openid: 用户openid order_n, 发送配送通知 Args: openid: 配送员openid task_no:, 发送配送时效预警 Args: openid: 配送员openid task_n (+4 more)
|
||||
Cohesion: 0.18
|
||||
Nodes (11): float, int, str, 发送订单状态通知 Args: openid: 用户openid order_n, 发送支付成功通知 Args: openid: 用户openid order_n, 发送配送通知 Args: openid: 配送员openid task_no:, 发送配送时效预警 Args: openid: 配送员openid task_n, 发送退款结果通知 Args: openid: 用户openid order_n (+3 more)
|
||||
|
||||
### Community 68 - "Community 68"
|
||||
Cohesion: 0.25
|
||||
Nodes (18): BxUserContext, Session, str, bool, BxUserContext, Session, str, create_expense_item() (+10 more)
|
||||
Cohesion: 0.11
|
||||
Nodes (35): BxUserContext, Session, str, Any, str, Any, bool, int (+27 more)
|
||||
|
||||
### Community 69 - "Community 69"
|
||||
Cohesion: 0.27
|
||||
Nodes (24): DbUserContext, float, Session, str, Session, str, DashboardCargoStat, DashboardPartnerCargoStat (+16 more)
|
||||
Cohesion: 0.28
|
||||
Nodes (25): DbUserContext, float, Session, str, Session, str, DashboardCargoStat, DashboardPartnerCargoStat (+17 more)
|
||||
|
||||
### Community 70 - "Community 70"
|
||||
Cohesion: 0.29
|
||||
Nodes (14): is_valid_dict_type(), load_portal_baseline(), load_sx(), load_zkxw(), main(), map_tag_type(), normalize_row(), parse_insert() (+6 more)
|
||||
|
||||
### Community 71 - "Community 71"
|
||||
Cohesion: 0.22
|
||||
Nodes (19): Any, bool, str, _actor_ids(), _actor_names(), assert_rows_deletable_by_creator(), can_delete_by_creator(), is_super_admin() (+11 more)
|
||||
Cohesion: 0.41
|
||||
Nodes (13): BxUserContext, Session, str, UploadFile, bind_biz(), delete_attachment(), download_file(), list_by_biz() (+5 more)
|
||||
|
||||
### Community 72 - "Community 72"
|
||||
Cohesion: 0.34
|
||||
Nodes (19): check_python(), create_venv(), ensure_dirs(), ensure_valid_venv(), ensure_venv_and_runtime(), install_dependencies(), is_running(), log_error() (+11 more)
|
||||
|
||||
### Community 73 - "Community 73"
|
||||
Cohesion: 0.30
|
||||
Nodes (14): Any, bool, bytes, int, str, bytes, ApiCryptoError, _b64url_decode() (+6 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (98): attachment_download_url(), AttachmentDownloadUrlBody, create_dept(), create_dict_data(), create_dict_type(), create_menu(), create_post(), create_role_management() (+90 more)
|
||||
|
||||
### Community 74 - "Community 74"
|
||||
Cohesion: 0.22
|
||||
Nodes (12): Any, bool, str, WfProcessInstance, _LocalCallbackFn, _dispatch_local(), 工作流回调服务 —— 流程状态变更时通知业务系统, 注册本地回调函数。当 callback_url 以 path 开头时直接调用 fn。 (+4 more)
|
||||
Cohesion: 0.15
|
||||
Nodes (30): Any, bool, int, Session, str, approve_quote(), can_user_approve(), create_approval_records() (+22 more)
|
||||
|
||||
### Community 75 - "Community 75"
|
||||
Cohesion: 0.05
|
||||
Nodes (135): date, DbUserContext, int, PlanCreateFull, PlPlan, Session, str, date (+127 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (101): bool, Decimal, int, PlanCreateFull, PlPlan, PlPlanProduct, PlTransport, PlVehicle (+93 more)
|
||||
|
||||
### Community 76 - "Community 76"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): Any, Request, str, str, parse_admin_request_json(), 运营 Web(/web/admin)JSON 请求体解析。 与 ApiCryptoMiddleware 配合:中间件未改写 body 时,在路由内解密 `{, 读取 JSON body;dict 时走 resolve_request_payload(明文 / 密文 / data 包装)。 Returns:, 统一解析接口请求载荷(明文 / 密文信封)。 (+2 more)
|
||||
|
||||
### Community 77 - "Community 77"
|
||||
Cohesion: 0.60
|
||||
Nodes (10): Any, Session, str, _apply_create_range(), _base_query(), get_clue_level_statistics(), get_clue_overview_statistics(), get_clue_owner_statistics() (+2 more)
|
||||
Cohesion: 0.33
|
||||
Nodes (5): _auto_fill_create_dept_id(), get_db(), ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID, ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID, ORM before_insert 钩子:当 create_dept_id 为空时,自动从请求上下文填充当前用户部门 ID
|
||||
|
||||
### Community 78 - "Community 78"
|
||||
Cohesion: 0.30
|
||||
Nodes (21): Any, bool, CrmOpportunity, datetime, int, Session, str, ensure_crm_create_by_row_in_scope() (+13 more)
|
||||
Cohesion: 0.16
|
||||
Nodes (16): bool, date, Session, str, get_last_month_range(), month_range(), 地磅计划按月自动生成 — 迁移自 simple-dibang-xiaoshou/auto-create-plan/auto_create_monthly_pla, 按月自动生成采购计划。 - 默认仅在每月 1 日执行(force=True 时跳过该限制,供手动触发验收) - 遍历所有租户,按上月计划模板生 (+8 more)
|
||||
|
||||
### Community 79 - "Community 79"
|
||||
Cohesion: 0.36
|
||||
Nodes (10): add_scope_before_order(), ensure_import(), patch_base_data(), patch_get_helper(), patch_inventory(), patch_plan(), patch_transport(), str (+2 more)
|
||||
|
||||
### Community 80 - "Community 80"
|
||||
Cohesion: 0.14
|
||||
Nodes (46): ProcessDefCreateBody, ProcessDefUpdateBody, PublishVersionBody, 审批意见:前端传 commentText,兼容 comment。, 审批意见:前端传 commentText,兼容 comment。, StartInstanceBody, TaskActionBody, Any (+38 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (32): BaseModel, AdvanceApplyOut, AdvanceApprovalCreate, AttachmentOut, ReimburseApplyCreate, ReimburseApplyUpdate, ReimburseApprovalCreate, Config (+24 more)
|
||||
|
||||
### Community 81 - "Community 81"
|
||||
Cohesion: 0.34
|
||||
Nodes (16): Any, bool, int, Session, str, create_tenant(), get_tenant(), list_tenants() (+8 more)
|
||||
Cohesion: 0.38
|
||||
Nodes (15): Any, bool, int, Session, str, create_post(), get_post(), list_posts() (+7 more)
|
||||
|
||||
### Community 82 - "Community 82"
|
||||
Cohesion: 0.29
|
||||
@@ -512,28 +525,28 @@ Cohesion: 0.25
|
||||
Nodes (8): generate_template_no(), Java: generateTemplateNo — TMPL{yyyyMMdd}{4位序号}, Java: generateTemplateNo — TMPL{yyyyMMdd}{4位序号}, Java: generateTemplateNo — TMPL{yyyyMMdd}{4位序号}, Java: generateTemplateNo — TMPL{yyyyMMdd}{4位序号}, Java: generateTemplateNo — TMPL{yyyyMMdd}{4位序号}, Java: generateTemplateNo — TMPL{yyyyMMdd}{4位序号}, Java: generateTemplateNo — TMPL{yyyyMMdd}{4位序号}
|
||||
|
||||
### Community 85 - "Community 85"
|
||||
Cohesion: 0.22
|
||||
Nodes (57): InboundOutboundRead, bool, DbPurchasePlan, DbUserContext, PurchasePlanRead, PurchasePlanWithFillLink, Session, str (+49 more)
|
||||
Cohesion: 0.17
|
||||
Nodes (49): bool, DbPurchasePlan, DbUserContext, PurchasePlanRead, PurchasePlanWithFillLink, Session, str, DbPurchasePlan (+41 more)
|
||||
|
||||
### Community 86 - "Community 86"
|
||||
Cohesion: 0.03
|
||||
Nodes (199): register_contract_routes(), CRM 合同子模块路由 — 变更/模板/审批独立页, register_contract_sub_routes(), Any, bool, CRM 合同 CRUD — 对照 CrmContractServiceImpl.java(列表/详情 P1), CrmContract, datetime (+191 more)
|
||||
Cohesion: 0.05
|
||||
Nodes (140): register_contract_routes(), CRM 合同子模块路由 — 变更/模板/审批独立页, register_contract_sub_routes(), Any, bool, CRM 合同 CRUD — 对照 CrmContractServiceImpl.java(列表/详情 P1), Decimal, int (+132 more)
|
||||
|
||||
### Community 87 - "Community 87"
|
||||
Cohesion: 0.13
|
||||
Nodes (18): Any, _build_category_tree(), _collect_category_with_ancestors(), list_category_tree(), list_oss_by_biz(), list_product_options(), _oss_row_to_dict(), 获取产品分类树(嵌套 children,供树形表格/树选择器使用) (+10 more)
|
||||
Cohesion: 0.31
|
||||
Nodes (26): DbUserContext, DbWeighingSlip, Session, str, WeighingSlipRead, DbWeighingSlip, WeighingSlipRead, weighing_to_read() (+18 more)
|
||||
|
||||
### Community 88 - "Community 88"
|
||||
Cohesion: 0.29
|
||||
Nodes (16): Any, int, Session, str, BizLeaveRequest, create_leave(), get_leave(), list_leaves() (+8 more)
|
||||
|
||||
### Community 89 - "Community 89"
|
||||
Cohesion: 0.33
|
||||
Nodes (10): Any, int, Session, str, list_ethnics(), 民族码表 CRUD(全局 sys_ethnic), _row_to_dict(), 民族码表 sys_ethnic(国标 GB/T 3304,全局) (+2 more)
|
||||
Cohesion: 0.18
|
||||
Nodes (19): bytes, int, str, download_file_bytes(), file_stream(), get_access_url(), get_download_url(), get_preview_url() (+11 more)
|
||||
|
||||
### Community 90 - "Community 90"
|
||||
Cohesion: 0.16
|
||||
Nodes (25): Any, bool, bytes, int, Request, str, bool, int (+17 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (60): Any, bool, bytes, int, Request, str, Any, int (+52 more)
|
||||
|
||||
### Community 91 - "Community 91"
|
||||
Cohesion: 0.32
|
||||
@@ -544,8 +557,8 @@ Cohesion: 0.20
|
||||
Nodes (10): create_from_quote(), _quote_products_to_contract_products(), Java: createFromQuote — 返回合同 id, Java: createFromQuote — 返回合同 id, Java: createFromQuote — 返回合同 id, Java: createFromQuote — 返回合同 id, Java: createFromQuote — 返回合同 id, Java: createFromQuote — 返回合同 id (+2 more)
|
||||
|
||||
### Community 93 - "Community 93"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): ChangePasswordRequest, Config, LoginRequest, LoginResponse, Pydantic schemas - 用户认证, ResetPasswordRequest, UserCreate, UserResponse
|
||||
Cohesion: 0.28
|
||||
Nodes (13): int, Session, str, _allocate_inbound_outbound_id(), _ensure_sequence_row(), max_numeric_inbound_outbound_id(), next_inbound_outbound_id(), 出入库单 id 生成 — 租户内纯数字自增,并发安全。 (+5 more)
|
||||
|
||||
### Community 94 - "Community 94"
|
||||
Cohesion: 0.18
|
||||
@@ -553,95 +566,119 @@ Nodes (11): generate_contract_name(), Java: generateContractName, Java: generate
|
||||
|
||||
### Community 95 - "Community 95"
|
||||
Cohesion: 0.22
|
||||
Nodes (9): _category_row_to_dict(), list_categories(), 分类 ORM 对象转 dict(camelCase 键名), 分类 ORM 对象转 dict(camelCase 键名), 分类 ORM 对象转 dict(camelCase 键名), 分类 ORM 对象转 dict(camelCase 键名), 获取分类(扁平列表,支持名称模糊与状态筛选), 获取分类(扁平列表,支持名称模糊与状态筛选) (+1 more)
|
||||
Nodes (15): bool, BxUserContext, int, Session, str, Session, str, AttachmentService (+7 more)
|
||||
|
||||
### Community 96 - "Community 96"
|
||||
Cohesion: 0.38
|
||||
Nodes (15): Any, bool, int, Session, str, create_post(), get_post(), list_posts() (+7 more)
|
||||
Nodes (15): Any, bool, int, Session, str, create_site(), get_site(), list_sites() (+7 more)
|
||||
|
||||
### Community 97 - "Community 97"
|
||||
Cohesion: 0.23
|
||||
Nodes (14): int, Session, str, _allocate_inbound_outbound_id(), _ensure_sequence_row(), max_numeric_inbound_outbound_id(), next_inbound_outbound_id(), 出入库单 id 生成 — 租户内纯数字自增,并发安全。 (+6 more)
|
||||
Cohesion: 0.33
|
||||
Nodes (10): Any, int, Session, str, list_ethnics(), 民族码表 CRUD(全局 sys_ethnic), _row_to_dict(), 民族码表 sys_ethnic(国标 GB/T 3304,全局) (+2 more)
|
||||
|
||||
### Community 98 - "Community 98"
|
||||
Cohesion: 0.37
|
||||
Nodes (16): Any, bool, int, Session, str, create_site(), get_site(), list_sites() (+8 more)
|
||||
Cohesion: 0.26
|
||||
Nodes (10): Any, bool, str, WfNode, WfProcessInstance, 流程连线/转移 wf_transition, 流程连线/转移 wf_transition, WfTransition (+2 more)
|
||||
|
||||
### Community 99 - "Community 99"
|
||||
Cohesion: 0.33
|
||||
Nodes (3): 地磅 API 路由聚合 — REST 风格,协议对齐原 simple-dibang-xiaoshou。, 地磅(db)Pydantic schemas — 对齐原 simple-dibang-xiaoshou 契约。, 地磅 API 路由聚合 — REST 风格,协议对齐原 simple-dibang-xiaoshou。
|
||||
|
||||
### Community 100 - "Community 100"
|
||||
Cohesion: 0.25
|
||||
Nodes (23): Any, bool, int, Session, str, create_role(), get_role(), get_role_data_scope() (+15 more)
|
||||
Cohesion: 0.45
|
||||
Nodes (12): bool, date, PlCarrier, str, assert_carrier_eligible_for_transport(), carrier_agreement_expired(), carrier_audit_approved(), carrier_eligible_for_transport() (+4 more)
|
||||
|
||||
### Community 101 - "Community 101"
|
||||
Cohesion: 0.40
|
||||
Nodes (3): BaseSettings, Config, Settings
|
||||
|
||||
### Community 102 - "Community 102"
|
||||
Cohesion: 0.34
|
||||
Nodes (23): DbUserContext, DbWeighingSlip, Session, str, weighing_to_read(), apply_product_snapshot_to_weighing(), _apply_weighing_product_update(), _apply_weighing_update() (+15 more)
|
||||
Cohesion: 0.60
|
||||
Nodes (10): Any, Session, str, _apply_create_range(), _base_query(), get_clue_level_statistics(), get_clue_overview_statistics(), get_clue_owner_statistics() (+2 more)
|
||||
|
||||
### Community 103 - "Community 103"
|
||||
Cohesion: 0.09
|
||||
Nodes (99): bool, DbUserContext, float, int, PlPlan, PlTransport, Session, str (+91 more)
|
||||
Nodes (147): date, DbUserContext, int, PlanCreateFull, PlPlan, Session, str, bool (+139 more)
|
||||
|
||||
### Community 104 - "Community 104"
|
||||
Cohesion: 0.10
|
||||
Nodes (50): get_current_user_profile(), get_web_auth_menu_codes(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/shanxia2.0.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。, 获取当前用户信息(与 sys_user 字段对应)。 (+42 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (37): bool, Redis, Request, str, _T, bool, Redis, extend_session() (+29 more)
|
||||
|
||||
### Community 105 - "Community 105"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): CRM 客户管理 Pydantic Schemas, CustomerAssignPoolBody, CustomerCheckDuplicateBody, CustomerDetailBody, CRM 客户 CRUD(客户主表 + 转移/成交/公海池操作)
|
||||
Cohesion: 0.22
|
||||
Nodes (9): create_from_opportunity(), _opportunity_products_to_contract_products(), Java: createFromOpportunity — 返回合同 id, Java: createFromOpportunity — 返回合同 id, Java: createFromOpportunity — 返回合同 id, Java: createFromOpportunity — 返回合同 id, Java: createFromOpportunity — 返回合同 id, Java: createFromOpportunity — 返回合同 id (+1 more)
|
||||
|
||||
### Community 106 - "Community 106"
|
||||
Cohesion: 0.28
|
||||
Nodes (18): Any, int, Session, str, _build_tree(), _cascade_soft_delete(), _collect_with_ancestors(), create_dept() (+10 more)
|
||||
|
||||
### Community 107 - "Community 107"
|
||||
Cohesion: 0.34
|
||||
Nodes (16): Any, bool, int, Session, str, create_tenant(), get_tenant(), list_tenants() (+8 more)
|
||||
|
||||
### Community 108 - "Community 108"
|
||||
Cohesion: 0.18
|
||||
Nodes (11): Java: statisticsStatus, Java: statisticsStatus, Java: statisticsStatus, Java: statisticsStatus, Java: statisticsStatus, Java: statisticsStatus, Java: statisticsStatus, Java: statisticsStatus (+3 more)
|
||||
|
||||
### Community 109 - "Community 109"
|
||||
Cohesion: 0.27
|
||||
Nodes (11): Any, bool, str, decrypt_login_payload(), ensure_initialized(), extract_login_credentials(), get_public_pem(), 登录凭据 RSA 解密(与前端 JSEncrypt PKCS#1 v1.5 兼容)。 (+3 more)
|
||||
|
||||
### Community 111 - "Community 111"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): Session, Any, Session, str, get_current_user(), get_current_user_by_token(), 根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期), 根据 token 获取当前用户(包含 Redis 会话校验;会话滑动续期) (+6 more)
|
||||
|
||||
### Community 112 - "Community 112"
|
||||
Cohesion: 0.14
|
||||
Nodes (16): Session, str, Session, str, get_user_menu_codes(), 菜单 code 权限守卫(V0.3:通过 sys_user_role → sys_role_menu → sys_menu.perms), 读取用户授权的菜单权限标识集合(与前端 meta.menuCode / perms 对齐)。, 接口菜单权限守卫。super_admin 直接放行。 (+8 more)
|
||||
Nodes (19): Session, str, Session, str, get_user_menu_codes(), 菜单 code 权限守卫(V0.3:通过 sys_user_role → sys_role_menu → sys_menu.perms), 读取用户授权的菜单权限标识集合(与前端 meta.menuCode / perms 对齐)。, 接口菜单权限守卫。super_admin 直接放行。 (+11 more)
|
||||
|
||||
### Community 122 - "Community 122"
|
||||
Cohesion: 0.24
|
||||
Nodes (20): Session, str, Any, bool, Session, str, apply_crm_owner_scope(), ensure_crm_customer_linked_row_in_scope() (+12 more)
|
||||
Cohesion: 0.30
|
||||
Nodes (14): Any, bool, bytes, int, str, bytes, ApiCryptoError, _b64url_decode() (+6 more)
|
||||
|
||||
### Community 123 - "Community 123"
|
||||
Cohesion: 0.41
|
||||
Nodes (11): Any, str, build_quote_html(), _default_value(), _format_date(), _format_discount(), _format_money(), generate_quote_pdf() (+3 more)
|
||||
|
||||
### Community 124 - "Community 124"
|
||||
Cohesion: 0.41
|
||||
Nodes (13): BxUserContext, Session, str, UploadFile, bind_biz(), delete_attachment(), download_file(), list_by_biz() (+5 more)
|
||||
Cohesion: 0.28
|
||||
Nodes (8): date, datetime, str, _date_to_str(), _dt_to_str(), PagedQuery, PagedResponse, bx 原系统 API 响应包装(code=0 / msg / data.rows),与门户 success_response 分离。
|
||||
|
||||
### Community 125 - "Community 125"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): bool, str, get_password_hash(), 验证密码(哈希非 bcrypt 或损坏时返回 False,避免抛错), verify_password()
|
||||
|
||||
### Community 126 - "Community 126"
|
||||
Cohesion: 0.43
|
||||
Nodes (7): _avatar_url_field(), _build_user_info_payload(), _jwt_user_payload(), 与 web-admin `userInfo` 字段约定一致。, 与 web-admin `userInfo` 字段约定一致。, str, SysUser
|
||||
Cohesion: 0.10
|
||||
Nodes (24): Session, str, TransportInventoryLinkRead, PlTransportSiteLink, Session, str, TransportSiteLinkRead, _build_driver_url() (+16 more)
|
||||
|
||||
### Community 127 - "Community 127"
|
||||
Cohesion: 0.29
|
||||
Nodes (10): datetime, int, Session, str, BizNoKind, allocate_next_biz_no(), _format_biz_no(), _prefix_for() (+2 more)
|
||||
|
||||
### Community 128 - "Community 128"
|
||||
Cohesion: 0.40
|
||||
Nodes (10): SysOss, int, Session, str, SysOss, create_oss(), create_oss(), get_oss_by_url() (+2 more)
|
||||
Cohesion: 0.11
|
||||
Nodes (22): Any, _fill_contract_linked_count(), list_quotes(), quote_row_to_dict(), ORM → camelCase(单点真相), ORM → camelCase(单点真相), ORM → camelCase(单点真相), ORM → camelCase(单点真相) (+14 more)
|
||||
|
||||
### Community 129 - "Community 129"
|
||||
Cohesion: 0.40
|
||||
Nodes (3): AdvanceApplyCreate, AdvanceApplyUpdate, _coerce_optional_id()
|
||||
|
||||
### Community 130 - "Community 130"
|
||||
Cohesion: 0.33
|
||||
Nodes (8): Decimal, str, derive_legacy_status_from_three(), derive_three_status_from_legacy(), 阶段A兼容:从旧 status 推导三字段。 约束:旧 status 本身混合了支付/配送/订单生命周期,因此只能尽力推断; 若业务侧已有更精确, 阶段A兼容:从三字段反推旧 status(用于旧前端/旧筛选参数兼容)。, ThreeStatus, _to_decimal()
|
||||
|
||||
### Community 131 - "Community 131"
|
||||
Cohesion: 0.11
|
||||
Nodes (34): bool, Session, str, _append_user_scope_conditions(), apply_data_scope(), assert_row_in_data_scope(), _collect_scope_ids(), _get_child_dept_ids() (+26 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (35): bool, Session, str, _append_user_scope_conditions(), apply_data_scope(), assert_row_in_data_scope(), _collect_scope_ids(), _get_child_dept_ids() (+27 more)
|
||||
|
||||
### Community 132 - "Community 132"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致), Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致), Web 端登录用 RSA 公钥(PKCS#1 v1.5,与 JSEncrypt 一致), web_login_rsa_public_key()
|
||||
Cohesion: 0.09
|
||||
Nodes (34): _avatar_url_field(), _build_user_info_payload(), get_current_user_profile(), get_web_auth_menu_codes(), _jwt_user_payload(), logout(), 公共接口(Web 登录、刷新 Token、登出;用户模型对齐 docs/sql/shanxia2.0.sql 基线), 登出:吊销 Redis 会话(若已配置 REDIS_HOST)。 (+26 more)
|
||||
|
||||
### Community 133 - "Community 133"
|
||||
Cohesion: 0.18
|
||||
Nodes (11): generate_product_no(), 生成产品编号(格式:CP + yyyyMMdd + 3位序号,如 CP20260530001), 生成产品编号(格式:CP + yyyyMMdd + 3位序号,如 CP20260530001), 生成产品编号(格式:CP + yyyyMMdd + 3位序号,如 CP20260530001), 生成产品编号(格式:CP + yyyyMMdd + 3位序号,如 CP20260530001), 生成产品编号(格式:CP + yyyyMMdd + 3位序号,如 CP20260530001), 生成产品编号(格式:CP + yyyyMMdd + 3位序号,如 CP20260530001), 生成产品编号(格式:CP + yyyyMMdd + 3位序号,如 CP20260530001) (+3 more)
|
||||
Cohesion: 0.33
|
||||
Nodes (5): _coerce_optional_id(), WorkflowDefCreate, WorkflowDefUpdate, WorkflowNodeCreate, WorkflowNodeOut
|
||||
|
||||
### Community 134 - "Community 134"
|
||||
Cohesion: 0.38
|
||||
@@ -652,56 +689,80 @@ Cohesion: 0.25
|
||||
Nodes (7): 1. 上传到服务器, 2. 服务器首次启动, 3. 日常运维, 4. 配置文件, 5. 与 Nginx 配合, 6. 常见问题, shanxia2.0 Backend 生产部署说明
|
||||
|
||||
### Community 136 - "Community 136"
|
||||
Cohesion: 0.11
|
||||
Nodes (32): Any, str, bool, BxUserContext, int, Session, str, Any (+24 more)
|
||||
Cohesion: 0.18
|
||||
Nodes (13): Any, bool, str, WfProcessInstance, _LocalCallbackFn, _dispatch_local(), 工作流回调服务 —— 流程状态变更时通知业务系统, 注册本地回调函数。当 callback_url 以 path 开头时直接调用 fn。 (+5 more)
|
||||
|
||||
### Community 137 - "Community 137"
|
||||
Cohesion: 0.18
|
||||
Nodes (11): _get_quote_item_field(), Java: resolveProductIdForQuoteItem(CrmProduct 无 tax_rate,跳过税率匹配), Java: resolveProductIdForQuoteItem(CrmProduct 无 tax_rate,跳过税率匹配), Java: resolveProductIdForQuoteItem(CrmProduct 无 tax_rate,跳过税率匹配), Java: resolveProductIdForQuoteItem(CrmProduct 无 tax_rate,跳过税率匹配), Java: resolveProductIdForQuoteItem(CrmProduct 无 tax_rate,跳过税率匹配), Java: resolveProductIdForQuoteItem(CrmProduct 无 tax_rate,跳过税率匹配), Java: resolveProductIdForQuoteItem(CrmProduct 无 tax_rate,跳过税率匹配) (+3 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (15): _generate_plan_no(), 生成计划编号 SXDDHYYYYMMDD######, 生成计划编号 SXDDHYYYYMMDD######, 生成计划编号 SXDDHYYYYMMDD######, 生成计划编号 SXDDHYYYYMMDD######, 生成计划编号 SXDDHYYYYMMDD######, 生成计划编号 SXDDHYYYYMMDD######, 生成计划编号 SXDDHYYYYMMDD###### (+7 more)
|
||||
|
||||
### Community 138 - "Community 138"
|
||||
Cohesion: 0.39
|
||||
Nodes (6): _inject_user_info_after_tenant(), patch_contract_routes(), patch_quote_routes(), patch_route_file(), Path, str
|
||||
|
||||
### Community 139 - "Community 139"
|
||||
Cohesion: 0.20
|
||||
Nodes (10): int, list_products(), _product_row_to_dict(), 产品 ORM 对象转 dict(camelCase 键名), 产品 ORM 对象转 dict(camelCase 键名), 产品 ORM 对象转 dict(camelCase 键名), 产品 ORM 对象转 dict(camelCase 键名), 产品 ORM 对象转 dict(camelCase 键名) (+2 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (15): patch_plan_product_certs(), 更新计划危化品产品购买证/运输证(不触发安排运输), 更新计划危化品产品购买证/运输证(不触发安排运输), 更新计划危化品产品购买证/运输证(不触发安排运输), 更新计划危化品产品购买证/运输证(不触发安排运输), 更新计划危化品产品购买证/运输证(不触发安排运输), 更新计划危化品产品购买证/运输证(不触发安排运输), 更新计划危化品产品购买证/运输证(不触发安排运输) (+7 more)
|
||||
|
||||
### Community 140 - "Community 140"
|
||||
Cohesion: 0.83
|
||||
Nodes (3): _add_user_info_kwarg(), patch_file(), str
|
||||
|
||||
### Community 141 - "Community 141"
|
||||
Cohesion: 0.15
|
||||
Nodes (14): datetime, _parse_optional_datetime(), _period_key(), Java: statisticsTrend, Java: statisticsTrend, Java: statisticsTrend, Java: statisticsTrend, Java: statisticsTrend (+6 more)
|
||||
|
||||
### Community 143 - "Community 143"
|
||||
Cohesion: 0.32
|
||||
Nodes (22): Any, CrmOpportunity, Decimal, int, Session, str, batch_add_opportunity_products(), _calc_subtotal() (+14 more)
|
||||
|
||||
### Community 144 - "Community 144"
|
||||
Cohesion: 0.20
|
||||
Nodes (10): cancel_plan(), 作废运输计划:取消跟进状态、作废关联地磅出入库单、取消运输单。, 作废运输计划:取消跟进状态、作废关联地磅出入库单、取消运输单。, 作废运输计划:取消跟进状态、作废关联地磅出入库单、取消运输单。, 作废运输计划:取消跟进状态、作废关联地磅出入库单、取消运输单。, 作废运输计划:取消跟进状态、作废关联地磅出入库单、取消运输单。, 作废运输计划:取消跟进状态、作废关联地磅出入库单、取消运输单。, 作废运输计划:取消跟进状态、作废关联地磅出入库单、取消运输单。 (+2 more)
|
||||
|
||||
### Community 145 - "Community 145"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): _coerce_optional_id(), WorkflowDefCreate, WorkflowDefUpdate, WorkflowNodeCreate, WorkflowNodeOut
|
||||
Cohesion: 0.20
|
||||
Nodes (10): 解析司机信息:优先 pl_personnel,兼容旧 pl_driver。, 解析司机信息:优先 pl_personnel,兼容旧 pl_driver。, 解析司机信息:优先 pl_personnel,兼容旧 pl_driver。, 解析司机信息:优先 pl_personnel,兼容旧 pl_driver。, 解析司机信息:优先 pl_personnel,兼容旧 pl_driver。, 解析司机信息:优先 pl_personnel,兼容旧 pl_driver。, 解析司机信息:优先 pl_personnel,兼容旧 pl_driver。, 解析司机信息:优先 pl_personnel,兼容旧 pl_driver。 (+2 more)
|
||||
|
||||
### Community 146 - "Community 146"
|
||||
Cohesion: 0.20
|
||||
Nodes (10): generate_auto_product_no(), Java: generateAutoProductNo — SXWL + 8位随机大写字符, Java: generateAutoProductNo — SXWL + 8位随机大写字符, Java: generateAutoProductNo — SXWL + 8位随机大写字符, Java: generateAutoProductNo — SXWL + 8位随机大写字符, Java: generateAutoProductNo — SXWL + 8位随机大写字符, Java: generateAutoProductNo — SXWL + 8位随机大写字符, Java: generateAutoProductNo — SXWL + 8位随机大写字符 (+2 more)
|
||||
Cohesion: 0.22
|
||||
Nodes (9): Java: renewContract — 基础续签, Java: renewContract — 基础续签, Java: renewContract — 基础续签, Java: renewContract — 基础续签, Java: renewContract — 基础续签, Java: renewContract — 基础续签, Java: renewContract — 基础续签, Java: renewContract — 基础续签 (+1 more)
|
||||
|
||||
### Community 147 - "Community 147"
|
||||
Cohesion: 0.31
|
||||
Nodes (8): Session, str, apply_product_snapshot_to_inventory(), apply_product_snapshot_to_plan(), ProductSnapshot, 地磅模块 — CRM 产品解析与快照写入。, 校验 CRM 产品并返回名称/规格快照。新建单据 product_id 必填。, resolve_crm_product()
|
||||
|
||||
### Community 148 - "Community 148"
|
||||
Cohesion: 0.22
|
||||
Nodes (9): batch_submit_contract_approval(), Java: batchSubmitApproval, Java: batchSubmitApproval, Java: batchSubmitApproval, Java: batchSubmitApproval, Java: batchSubmitApproval, Java: batchSubmitApproval, Java: batchSubmitApproval (+1 more)
|
||||
|
||||
### Community 149 - "Community 149"
|
||||
Cohesion: 0.25
|
||||
Nodes (8): generate_barcode(), 生成唯一条码(纯数字:yyyyMMdd + 6位序号,如 20260606000001), 生成唯一条码(纯数字:yyyyMMdd + 6位序号,如 20260606000001), 生成唯一条码(纯数字:yyyyMMdd + 6位序号,如 20260606000001), 生成唯一条码(纯数字:yyyyMMdd + 6位序号,如 20260606000001), 生成唯一条码(纯数字:yyyyMMdd + 6位序号,如 20260606000001), 生成唯一条码(纯数字:yyyyMMdd + 6位序号,如 20260606000001), 生成唯一条码(纯数字:yyyyMMdd + 6位序号,如 20260606000001)
|
||||
Nodes (8): download_contract_pdf(), Java: downloadContractPdf — 返回合同文件 URL/路径, Java: batchAssignOwner, Java: downloadContractPdf — 返回合同文件 URL/路径, Java: downloadContractPdf — 返回合同文件 URL/路径, Java: downloadContractPdf — 返回合同文件 URL/路径, Java: downloadContractPdf — 返回合同文件 URL/路径, Java: downloadContractPdf — 返回合同文件 URL/路径
|
||||
|
||||
### Community 150 - "Community 150"
|
||||
Cohesion: 0.33
|
||||
Nodes (3): _coerce_id(), OffsetItem, ReimburseDetailCreate
|
||||
|
||||
## Knowledge Gaps
|
||||
- **66 isolated node(s):** `Session`, `bool`, `bool`, `Config`, `bool` (+61 more)
|
||||
- **69 isolated node(s):** `Session`, `Request`, `bool`, `bool`, `Config` (+64 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **1 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
- **2 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `Session` connect `Community 3` to `Community 1`, `Community 2`, `Community 4`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 11`, `Community 14`, `Community 15`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 22`, `Community 23`, `Community 25`, `Community 27`, `Community 29`, `Community 30`, `Community 33`, `Community 35`, `Community 36`, `Community 37`, `Community 39`, `Community 40`, `Community 41`, `Community 43`, `Community 45`, `Community 46`, `Community 47`, `Community 48`, `Community 50`, `Community 51`, `Community 52`, `Community 54`, `Community 55`, `Community 56`, `Community 57`, `Community 59`, `Community 60`, `Community 61`, `Community 63`, `Community 64`, `Community 66`, `Community 68`, `Community 69`, `Community 75`, `Community 77`, `Community 78`, `Community 80`, `Community 81`, `Community 84`, `Community 85`, `Community 86`, `Community 87`, `Community 88`, `Community 89`, `Community 90`, `Community 92`, `Community 95`, `Community 96`, `Community 97`, `Community 98`, `Community 100`, `Community 102`, `Community 103`, `Community 104`, `Community 112`, `Community 122`, `Community 124`, `Community 127`, `Community 128`, `Community 131`, `Community 133`, `Community 136`, `Community 137`, `Community 139`, `Community 146`, `Community 147`?**
|
||||
_High betweenness centrality (0.212) - this node is a cross-community bridge._
|
||||
- **Why does `BaseModel` connect `Community 35` to `Community 0`, `Community 129`, `Community 2`, `Community 4`, `Community 134`, `Community 11`, `Community 12`, `Community 16`, `Community 145`, `Community 20`, `Community 21`, `Community 23`, `Community 24`, `Community 25`, `Community 28`, `Community 31`, `Community 32`, `Community 36`, `Community 44`, `Community 49`, `Community 50`, `Community 51`, `Community 62`, `Community 63`, `Community 65`, `Community 68`, `Community 69`, `Community 75`, `Community 80`, `Community 85`, `Community 93`, `Community 102`, `Community 103`, `Community 105`?**
|
||||
_High betweenness centrality (0.066) - this node is a cross-community bridge._
|
||||
- **Why does `SysUser` connect `Community 80` to `Community 2`, `Community 131`, `Community 3`, `Community 6`, `Community 7`, `Community 9`, `Community 11`, `Community 12`, `Community 14`, `Community 17`, `Community 19`, `Community 22`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 32`, `Community 33`, `Community 39`, `Community 43`, `Community 47`, `Community 50`, `Community 51`, `Community 52`, `Community 56`, `Community 64`, `Community 86`, `Community 98`, `Community 103`, `Community 104`, `Community 126`?**
|
||||
_High betweenness centrality (0.050) - this node is a cross-community bridge._
|
||||
- **Why does `Session` connect `Community 3` to `Community 0`, `Community 1`, `Community 2`, `Community 4`, `Community 6`, `Community 7`, `Community 8`, `Community 10`, `Community 11`, `Community 14`, `Community 15`, `Community 16`, `Community 17`, `Community 18`, `Community 19`, `Community 20`, `Community 21`, `Community 22`, `Community 23`, `Community 25`, `Community 27`, `Community 29`, `Community 33`, `Community 35`, `Community 36`, `Community 37`, `Community 38`, `Community 40`, `Community 41`, `Community 44`, `Community 45`, `Community 46`, `Community 47`, `Community 48`, `Community 49`, `Community 52`, `Community 54`, `Community 55`, `Community 56`, `Community 57`, `Community 59`, `Community 60`, `Community 61`, `Community 63`, `Community 64`, `Community 65`, `Community 66`, `Community 68`, `Community 69`, `Community 71`, `Community 73`, `Community 74`, `Community 75`, `Community 78`, `Community 80`, `Community 81`, `Community 84`, `Community 85`, `Community 86`, `Community 87`, `Community 88`, `Community 90`, `Community 92`, `Community 93`, `Community 95`, `Community 96`, `Community 97`, `Community 98`, `Community 102`, `Community 103`, `Community 105`, `Community 106`, `Community 107`, `Community 108`, `Community 111`, `Community 112`, `Community 127`, `Community 128`, `Community 131`, `Community 132`, `Community 137`, `Community 141`, `Community 143`, `Community 144`, `Community 146`, `Community 147`, `Community 148`, `Community 149`?**
|
||||
_High betweenness centrality (0.231) - this node is a cross-community bridge._
|
||||
- **Why does `BaseModel` connect `Community 9` to `Community 0`, `Community 129`, `Community 2`, `Community 133`, `Community 134`, `Community 11`, `Community 12`, `Community 15`, `Community 20`, `Community 21`, `Community 22`, `Community 23`, `Community 150`, `Community 24`, `Community 28`, `Community 30`, `Community 31`, `Community 32`, `Community 36`, `Community 44`, `Community 45`, `Community 50`, `Community 51`, `Community 62`, `Community 63`, `Community 68`, `Community 69`, `Community 73`, `Community 75`, `Community 80`, `Community 85`, `Community 87`, `Community 103`, `Community 124`, `Community 126`?**
|
||||
_High betweenness centrality (0.073) - this node is a cross-community bridge._
|
||||
- **Why does `SysUser` connect `Community 22` to `Community 128`, `Community 2`, `Community 131`, `Community 132`, `Community 5`, `Community 6`, `Community 7`, `Community 136`, `Community 3`, `Community 10`, `Community 11`, `Community 12`, `Community 141`, `Community 14`, `Community 16`, `Community 17`, `Community 19`, `Community 23`, `Community 24`, `Community 25`, `Community 27`, `Community 32`, `Community 35`, `Community 36`, `Community 38`, `Community 39`, `Community 52`, `Community 56`, `Community 69`, `Community 73`, `Community 74`, `Community 86`, `Community 98`, `Community 103`?**
|
||||
_High betweenness centrality (0.058) - this node is a cross-community bridge._
|
||||
- **Are the 251 inferred relationships involving `str` (e.g. with `AdvanceApplyCreate` and `AdvanceApplyOut`) actually correct?**
|
||||
_`str` has 251 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 248 inferred relationships involving `Session` (e.g. with `AdvanceApplyCreate` and `AdvanceApplyOut`) actually correct?**
|
||||
_`Session` has 248 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **Are the 140 inferred relationships involving `int` (e.g. with `AdvanceApplyCreate` and `AdvanceApplyOut`) actually correct?**
|
||||
_`int` has 140 INFERRED edges - model-reasoned connections that need verification._
|
||||
- **What connects `数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误`, `未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin`, `每月 1 日凌晨执行:按上月计划模板生成本月计划。` to the rest of the system?**
|
||||
_1184 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **What connects `定期 ping MySQL,避免远程库/NAT 回收空闲 TCP 后首请求长时间卡住。`, `数据库异常:返回 JSON 并保留 CORS 头,避免浏览器只报跨域错误`, `未捕获异常:统一 JSON 500,确保跨域场景下仍有 Access-Control-Allow-Origin` to the rest of the system?**
|
||||
_1256 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
backend/graphify-out/cache/ast/081dd481d3ef0cc1724413af2a2737b0238591860babeb7b1378502ff8e593ae.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_transport_py", "label": "transport.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L1"}, {"id": "pl_transport_generate_transport_no", "label": "_generate_transport_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L60"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L60"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L60"}, {"id": "pl_transport_resolve_driver_info", "label": "_resolve_driver_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L84"}, {"id": "pl_transport_get_vehicle_info", "label": "_get_vehicle_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L120"}, {"id": "pl_transport_assert_vehicle_carrier_eligible", "label": "_assert_vehicle_carrier_eligible()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L170"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L170"}, {"id": "pl_transport_ensure_driver_access_token", "label": "_ensure_driver_access_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L205"}, {"id": "pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L205"}, {"id": "pl_transport_rotate_driver_access_token", "label": "_rotate_driver_access_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L213"}, {"id": "pl_transport_is_rearrange", "label": "_is_rearrange()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L219"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L219"}, {"id": "pl_transport_transport_has_db_links", "label": "_transport_has_db_links()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L227"}, {"id": "pl_transport_apply_plan_logistics_from_payload", "label": "_apply_plan_logistics_from_payload()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L240"}, {"id": "transportarrange", "label": "TransportArrange", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L240"}, {"id": "pl_transport_resolve_transport_endpoints", "label": "_resolve_transport_endpoints()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L259"}, {"id": "pl_transport_apply_transport_arrange_fields", "label": "_apply_transport_arrange_fields()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L274"}, {"id": "float", "label": "float", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L274"}, {"id": "pl_transport_build_driver_url", "label": "_build_driver_url()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L308"}, {"id": "pl_transport_build_arrange_result", "label": "_build_arrange_result()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L313"}, {"id": "transportsitelinkread", "label": "TransportSiteLinkRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L313"}, {"id": "transportinventorylinkread", "label": "TransportInventoryLinkRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L313"}, {"id": "transportarrangeresult", "label": "TransportArrangeResult", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L313"}, {"id": "pl_transport_list_transports", "label": "list_transports()", "file_tyLine truncated
|
||||
backend/graphify-out/cache/ast/158a194986219cdcfa88ea6c7bfd26b2326c1e4443489045ac396daa5ecc1bf0.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_transport_py", "label": "transport.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L1"}, {"id": "pl_transport_generate_transport_no", "label": "_generate_transport_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L64"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L64"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L64"}, {"id": "pl_transport_resolve_driver_info", "label": "_resolve_driver_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L88"}, {"id": "pl_transport_get_vehicle_info", "label": "_get_vehicle_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L124"}, {"id": "pl_transport_assert_vehicle_carrier_eligible", "label": "_assert_vehicle_carrier_eligible()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L174"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L174"}, {"id": "pl_transport_ensure_driver_access_token", "label": "_ensure_driver_access_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L209"}, {"id": "pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L209"}, {"id": "pl_transport_rotate_driver_access_token", "label": "_rotate_driver_access_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L217"}, {"id": "pl_transport_is_rearrange", "label": "_is_rearrange()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L223"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L223"}, {"id": "pl_transport_transport_has_db_links", "label": "_transport_has_db_links()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L231"}, {"id": "pl_transport_apply_plan_logistics_from_payload", "label": "_apply_plan_logistics_from_payload()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L244"}, {"id": "transportarrange", "label": "TransportArrange", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L244"}, {"id": "pl_transport_resolve_transport_endpoints", "label": "_resolve_transport_endpoints()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L263"}, {"id": "pl_transport_apply_transport_arrange_fields", "label": "_apply_transport_arrange_fields()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L278"}, {"id": "float", "label": "float", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L278"}, {"id": "pl_transport_build_driver_url", "label": "_build_driver_url()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L312"}, {"id": "pl_transport_build_arrange_result", "label": "_build_arrange_result()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L317"}, {"id": "transportsitelinkread", "label": "TransportSiteLinkRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L317"}, {"id": "transportinventorylinkread", "label": "TransportInventoryLinkRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L317"}, {"id": "transportarrangeresult", "label": "TransportArrangeResult", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L317"}, {"id": "pl_transport_list_transports", "label": "list_transports()", "file_tyLine truncated
|
||||
backend/graphify-out/cache/ast/2b5f2d5328c6764a5214772fb8c92d5e45f9598b3c294a45e99d68b1fd674195.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_admin_py", "label": "admin.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L1"}, {"id": "api_admin_list_roles_for_select", "label": "list_roles_for_select()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L42"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L42"}, {"id": "api_admin_list_users_for_select", "label": "list_users_for_select()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L74"}, {"id": "api_admin_list_roles_for_designer", "label": "list_roles_for_designer()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L97"}, {"id": "api_admin_tenantcreatebody", "label": "TenantCreateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L117"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "api_admin_tenantupdatebody", "label": "TenantUpdateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L128"}, {"id": "api_admin_list_tenants", "label": "list_tenants()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L140"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L140"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L140"}, {"id": "api_admin_create_tenant", "label": "create_tenant()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L161"}, {"id": "api_admin_update_tenant", "label": "update_tenant()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L183"}, {"id": "api_admin_delete_tenant", "label": "delete_tenant()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L208"}, {"id": "api_admin_get_tenant_no", "label": "_get_tenant_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L225"}, {"id": "api_admin_usercreatebody", "label": "UserCreateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L238"}, {"id": "api_admin_userupdatebody", "label": "UserUpdateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L255"}, {"id": "api_admin_list_users", "label": "list_users()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L271"}, {"id": "api_admin_get_user_by_id", "label": "get_user_by_id()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L315"}, {"id": "api_admin_create_user", "label": "create_user()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L335"}, {"id": "api_admin_update_user", "label": "update_user()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L368"}, {"id": "api_admin_delete_user", "label": "delete_user()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L398"}, {"id": "api_admin_reset_user_password", "label": "reset_user_password()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L411"}, {"id": "api_admin_dicttypecreatebody", "label": "DictTypeCreateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L428"}, {"id": "api_admin_dicttypeupdatebody", "label": "DictTypeUpdateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L437"}, {"id": "api_admin_list_dict_types", "label": "list_dict_types()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/admin.py", "source_location": "L447"}, {"id": "api_admin_create_dict_type", "label": "create_dict_type()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/Line truncated
|
||||
backend/graphify-out/cache/ast/2d65c990d058d22010f8d4449652eb752c297a046b5d7b3ff6755c3e1cad0cf3.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_resource_snapshot_py", "label": "resource_snapshot.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L1"}, {"id": "pl_resource_snapshot_snapshotcertread", "label": "SnapshotCertRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L11"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_resource_snapshot_snapshotpersonnelrow", "label": "SnapshotPersonnelRow", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L29"}, {"id": "pl_resource_snapshot_transportresourcesnapshot", "label": "TransportResourceSnapshot", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L45"}, {"id": "pl_resource_snapshot_parse_resource_snapshot", "label": "parse_resource_snapshot()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L65"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L65"}, {"id": "pl_resource_snapshot_planresourcesnapshotmixin", "label": "PlanResourceSnapshotMixin", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L81"}, {"id": "pl_resource_snapshot_planresourcesnapshotmixin_coerce_resource_snapshot", "label": "._coerce_resource_snapshot()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L91"}, {"id": "pl_resource_snapshot_rationale_1", "label": "\u8fd0\u8f93\u8ba1\u5212 - \u5b89\u6392\u8fd0\u8f93\u65f6\u8f66\u8f86/\u4eba\u5458/\u8bc1\u4ef6\u8d44\u6e90\u5feb\u7167 Schema", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L1"}, {"id": "pl_resource_snapshot_rationale_66", "label": "\u4ece ORM \u6587\u672c\u5217\u6216 dict \u89e3\u6790\u5feb\u7167\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L66"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_resource_snapshot_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_resource_snapshot_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_resource_snapshot_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L6", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_resource_snapshot_py", "target": "pydantic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L8", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_resource_snapshot_py", "target": "pl_resource_snapshot_snapshotcertread", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L11", "weight": 1.0}, {"source": "pl_resource_snapshot_snapshotcertread", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L11", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_resource_snapshot_py", "target": "pl_resource_snapshot_snapshotpersonnelrow", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/resource_snapshot.py", "source_location": "L29", "weight": 1.0}, {"source": "pl_resource_snapshot_snapshotpersonnelrow", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_fiLine truncated
|
||||
backend/graphify-out/cache/ast/34bac56e1c2cb6215f4b5fa2dc32d77d4b4abca51428819eebf4afd269cc51cf.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_auth_py", "label": "auth.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L1"}, {"id": "core_auth_session_key", "label": "_session_key()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L25"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L25"}, {"id": "core_auth_refresh_key", "label": "_refresh_key()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L29"}, {"id": "core_auth_redis_call_safe", "label": "_redis_call_safe()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L33"}, {"id": "core_auth_store_session", "label": "store_session()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L44"}, {"id": "core_auth_revoke_session", "label": "revoke_session()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L49"}, {"id": "core_auth_extend_session", "label": "extend_session()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L54"}, {"id": "core_auth_is_session_valid", "label": "is_session_valid()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L61"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L61"}, {"id": "core_auth_store_refresh_token", "label": "store_refresh_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L73"}, {"id": "core_auth_is_refresh_token_valid", "label": "is_refresh_token_valid()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L80"}, {"id": "core_auth_revoke_refresh_token", "label": "revoke_refresh_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L91"}, {"id": "core_auth_create_access_token", "label": "create_access_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L95"}, {"id": "timedelta", "label": "timedelta", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L95"}, {"id": "core_auth_create_refresh_token", "label": "create_refresh_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L119"}, {"id": "core_auth_decode_token", "label": "decode_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L135"}, {"id": "core_auth_get_current_user_by_token", "label": "get_current_user_by_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L148"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L148"}, {"id": "core_auth_get_current_user", "label": "get_current_user()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L206"}, {"id": "core_auth_get_current_user_simple", "label": "get_current_user_simple()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L214"}, {"id": "core_auth_get_client_ip", "label": "get_client_ip()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L233"}, {"id": "request", "label": "Request", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L233"}, {"id": "core_auth_rationale_34", "label": "\u540c\u6b65 Redis \u8c03\u7528\uff1b\u5931\u8d25\u65f6\u8fd4\u56de None \u4f9b\u8c03\u7528\u65b9\u964d\u7ea7\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L34"}, {"id": "core_auth_rationale_55", "label": "\u5237\u65b0\u4f1a\u8bdd TTL\uff08\u5df2\u767b\u5f55\u7528\u6237\u6bcf\u6b21 API \u6821\u9a8c\u901a\u8fc7\u540e\u6ed1\u52a8\u7eed\u671f\uff09", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L55"}, {"id": "core_auth_ratioLine truncated
|
||||
backend/graphify-out/cache/ast/366fd72fdf68e3a1945ae4a7f00d967fe5d2497896f3368517f1767a55b76751.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "label": "public_transport.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L1"}, {"id": "pl_public_transport_resolve_unit_label", "label": "_resolve_unit_label()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L27"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L27"}, {"id": "pl_public_transport_get_transport_by_token", "label": "_get_transport_by_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L34"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L34"}, {"id": "pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L34"}, {"id": "pl_public_transport_parse_feedback_images", "label": "_parse_feedback_images()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L48"}, {"id": "pl_public_transport_format_plan_date", "label": "_format_plan_date()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L60"}, {"id": "pl_public_transport_build_public_page", "label": "_build_public_page()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L70"}, {"id": "publictransportpageread", "label": "PublicTransportPageRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L70"}, {"id": "pl_public_transport_get_public_transport", "label": "get_public_transport()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L134"}, {"id": "pl_public_transport_save_public_feedback", "label": "save_public_feedback()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L141"}, {"id": "publictransportfeedback", "label": "PublicTransportFeedback", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L141"}, {"id": "pl_public_transport_format_file_size", "label": "_format_file_size()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L162"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L162"}, {"id": "pl_public_transport_upload_public_attachment", "label": "upload_public_attachment()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L171"}, {"id": "uploadfile", "label": "UploadFile", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L171"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L6", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_transport.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_transport_py", "target": "fastapi", "relation": "imports_fLine truncated
|
||||
backend/graphify-out/cache/ast/3950dd8d9855f5ed33a0e15883f7e442c4e26bc51672209b1e68ce0d0c9ce399.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_workflow_py", "label": "workflow.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L1"}, {"id": "api_workflow_business_type_label", "label": "_business_type_label()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L27"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L27"}, {"id": "api_workflow_portal_user_info", "label": "_portal_user_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L33"}, {"id": "api_workflow_assert_wf_instance_in_scope", "label": "_assert_wf_instance_in_scope()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L44"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L44"}, {"id": "wfprocessinstance", "label": "WfProcessInstance", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L44"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L44"}, {"id": "api_workflow_leave_form_fields", "label": "_leave_form_fields()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L66"}, {"id": "api_workflow_get_business_form_fields", "label": "_get_business_form_fields()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L90"}, {"id": "api_workflow_enrich_task_list", "label": "_enrich_task_list()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L103"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L103"}, {"id": "api_workflow_processdefcreatebody", "label": "ProcessDefCreateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L120"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "api_workflow_processdefupdatebody", "label": "ProcessDefUpdateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L130"}, {"id": "api_workflow_publishversionbody", "label": "PublishVersionBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L140"}, {"id": "api_workflow_startinstancebody", "label": "StartInstanceBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L149"}, {"id": "api_workflow_taskactionbody", "label": "TaskActionBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L159"}, {"id": "api_workflow_list_process_defs", "label": "list_process_defs()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L176"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L176"}, {"id": "api_workflow_create_process_def", "label": "create_process_def()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L193"}, {"id": "api_workflow_update_process_def", "label": "update_process_def()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L216"}, {"id": "api_workflow_delete_process_def", "label": "delete_process_def()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L241"}, {"id": "api_workflow_publish_version", "label": "publish_version()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L259"}, {"id": "api_workflow_list_versions", "label": "list_versions()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_location": "L283"}, {"id": "api_workflow_get_designer_data", "label": "get_designer_data()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/workflow.py", "source_locLine truncated
|
||||
backend/graphify-out/cache/ast/3cec87f7a0cda16eec2e7c18ab15b218d27be6bc7d1021d96e856455f8468e9d.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "label": "database.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L1"}, {"id": "core_database_get_db", "label": "get_db()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L25"}, {"id": "core_database_auto_fill_create_dept_id", "label": "_auto_fill_create_dept_id()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L35"}, {"id": "core_database_rationale_36", "label": "ORM before_insert \u94a9\u5b50\uff1a\u5f53 create_dept_id \u4e3a\u7a7a\u65f6\uff0c\u81ea\u52a8\u4ece\u8bf7\u6c42\u4e0a\u4e0b\u6587\u586b\u5145\u5f53\u524d\u7528\u6237\u90e8\u95e8 ID", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L36"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "sqlalchemy", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L1", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "sqlalchemy_ext_declarative", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "app_core_config", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "core_database_get_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L25", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "core_database_auto_fill_create_dept_id", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L35", "weight": 1.0}, {"source": "core_database_rationale_36", "target": "core_database_auto_fill_create_dept_id", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L36", "weight": 1.0}], "raw_calls": [{"caller_nid": "core_database_get_db", "callee": "SessionLocal", "is_member_call": false, "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L27"}, {"caller_nid": "core_database_get_db", "callee": "close", "is_member_call": true, "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L31"}, {"caller_nid": "core_database_auto_fill_create_dept_id", "callee": "get", "is_member_call": true, "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L39"}]}
|
||||
backend/graphify-out/cache/ast/47b33a7e1fe48f8cf0b9cce4d97b69a7d2ecc1a239f7e4c1a71bb383ae979c70.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_plan_service_py", "label": "pl_plan_service.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L1"}, {"id": "services_pl_plan_service_determine_plan_type", "label": "determine_plan_type()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L32"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L32"}, {"id": "services_pl_plan_service_is_ton_product_unit", "label": "is_ton_product_unit()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L40"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L40"}, {"id": "services_pl_plan_service_product_quantity", "label": "_product_quantity()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L47"}, {"id": "planproductcreate", "label": "PlanProductCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L47"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L47"}, {"id": "services_pl_plan_service_sum_product_quantities", "label": "sum_product_quantities()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L57"}, {"id": "services_pl_plan_service_estimate_qty_fields", "label": "_estimate_qty_fields()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L61"}, {"id": "services_pl_plan_service_build_plan_product", "label": "build_plan_product()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L72"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L72"}, {"id": "plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L72"}, {"id": "services_pl_plan_service_resolve_driver", "label": "_resolve_driver()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L118"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L118"}, {"id": "services_pl_plan_service_calc_freight_amount", "label": "_calc_freight_amount()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L163"}, {"id": "services_pl_plan_service_validate_toxic_products", "label": "_validate_toxic_products()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L187"}, {"id": "services_pl_plan_service_resolve_hazard_flags_from_crm", "label": "resolve_hazard_flags_from_crm()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L198"}, {"id": "services_pl_plan_service_update_plan_product_certs", "label": "update_plan_product_certs()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L225"}, {"id": "services_pl_plan_service_generate_transport_no", "label": "_generate_transport_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L275"}, {"id": "services_pl_plan_service_resolve_transport_context", "label": "_resolve_transport_context()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L293"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L293"}, {"id": "plantransportcreateblock", "label": "PlanTransportCreateBlock", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L293"}, {"id": "plvehicle", "label": Line truncated
|
||||
backend/graphify-out/cache/ast/4988b71d4e54b326c333872b34743914d67b15fb753c1b0231e9b00b366458a4.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_db_auth_py", "label": "db_auth.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L1"}, {"id": "core_db_auth_dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L22"}, {"id": "core_db_auth_dbusercontext_to_tenant_user_dict", "label": ".to_tenant_user_dict()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L31"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L31"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L31"}, {"id": "core_db_auth_dbusercontext_to_user_info", "label": ".to_user_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L38"}, {"id": "core_db_auth_get_db_current_user", "label": "get_db_current_user()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L49"}, {"id": "core_db_auth_get_db_current_user_optional", "label": "get_db_current_user_optional()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L61"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L61"}, {"id": "core_db_auth_rationale_1", "label": "\u5730\u78c5\u6a21\u5757\u8ba4\u8bc1\u9002\u914d\uff1a\u95e8\u6237 JWT \u7528\u6237 \u2192 db \u4e1a\u52a1\u4e0a\u4e0b\u6587\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L1"}, {"id": "core_db_auth_rationale_23", "label": "db Router/Service \u4f7f\u7528\u7684\u5f53\u524d\u7528\u6237\u4e0a\u4e0b\u6587\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L23"}, {"id": "core_db_auth_rationale_39", "label": "\u4e0e\u95e8\u6237 JWT / apply_data_scope \u6240\u9700\u7684 user_info \u5b57\u6bb5\u5bf9\u9f50\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L39"}, {"id": "core_db_auth_rationale_65", "label": "\u6709 Bearer \u4e14\u4e3a admin/super_admin \u65f6\u8fd4\u56de\u4e0a\u4e0b\u6587\uff0c\u5426\u5219 None\uff08\u4f9b\u4e09\u65b9 H5 \u65e0\u767b\u5f55\u8c03\u7528\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L65"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_db_auth_py", "target": "dataclasses", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_db_auth_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_db_auth_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_db_auth_py", "target": "fastapi_security", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L8", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_db_auth_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L9", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_db_auth_py", "target": "app_core_auth", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_auth.py", "source_location": "L11", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_db_auth_py", "target": "app_core_database", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/UserLine truncated
|
||||
backend/graphify-out/cache/ast/4c27c69fe7d983a8227fc390ee02798ec5dd64fb3287bb9566fcf7aff4547af6.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_auth_py", "label": "auth.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L1"}, {"id": "core_auth_redis_session_enabled", "label": "_redis_session_enabled()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L29"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L29"}, {"id": "core_auth_redis_call", "label": "_redis_call()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L34"}, {"id": "t", "label": "_T", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L34"}, {"id": "core_auth_session_key", "label": "_session_key()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L44"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L44"}, {"id": "core_auth_refresh_key", "label": "_refresh_key()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L48"}, {"id": "core_auth_store_session", "label": "store_session()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L52"}, {"id": "core_auth_revoke_session", "label": "revoke_session()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L60"}, {"id": "core_auth_extend_session", "label": "extend_session()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L68"}, {"id": "core_auth_is_session_valid", "label": "is_session_valid()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L78"}, {"id": "core_auth_store_refresh_token", "label": "store_refresh_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L92"}, {"id": "core_auth_is_refresh_token_valid", "label": "is_refresh_token_valid()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L100"}, {"id": "core_auth_revoke_refresh_token", "label": "revoke_refresh_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L112"}, {"id": "core_auth_create_access_token", "label": "create_access_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L119"}, {"id": "timedelta", "label": "timedelta", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L119"}, {"id": "core_auth_create_refresh_token", "label": "create_refresh_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L143"}, {"id": "core_auth_decode_token", "label": "decode_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L159"}, {"id": "core_auth_get_current_user_by_token", "label": "get_current_user_by_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L172"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L172"}, {"id": "core_auth_get_current_user", "label": "get_current_user()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L234"}, {"id": "core_auth_get_current_user_simple", "label": "get_current_user_simple()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L242"}, {"id": "core_auth_get_client_ip", "label": "get_client_ip()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L261"}, {"id": "request", "label": "Request", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py", "source_location": "L261"}, {"id": "core_auth_rationale_35", "label": "\u5e26\u8d85\u65f6\u7684 Redis \u8c03\u7528\uff1b\u8d85\u65f6\u6216\u8fde\u63a5\u5931\u8d25\u65f6\u8fd4\u56de None\uff08\u7531\u8c03\u7528\u65b9\u964d\u7ea7\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/sLine truncated
|
||||
backend/graphify-out/cache/ast/4e9de047e67ff365d17ac28d30e1baa72cfa3c651caa1b9776e225fc07da0e58.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_menu_py", "label": "menu.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L1"}, {"id": "api_menu_get_menu_list", "label": "get_menu_list()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L695"}, {"id": "api_menu_rationale_1", "label": "\u8fd0\u8425\u7aef\u83dc\u5355\u63a5\u53e3\uff08\u4e0e web-admin \u524d\u7aef\u9759\u6001\u8def\u7531 sqxp.ts \u5bf9\u9f50\uff0c14 \u4e2a\u4e00\u7ea7\u83dc\u5355\uff09", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L1"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_menu_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_menu_py", "target": "app_core_menu_guard", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_menu_py", "target": "app_core_response", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_menu_py", "target": "api_menu_get_menu_list", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L695", "weight": 1.0}, {"source": "api_menu_rationale_1", "target": "users_zlwu_work_00code_shanxia2_0_backend_app_api_menu_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "api_menu_get_menu_list", "callee": "success_response", "is_member_call": false, "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/menu.py", "source_location": "L697"}]}
|
||||
backend/graphify-out/cache/ast/4fd06cd88fff573eb34f63500e42bd57c7f0b0defbd5095209d852c650314d6c.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_crm_py", "label": "crm.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L1"}, {"id": "api_crm_category_tree", "label": "category_tree()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L327"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L327"}, {"id": "api_crm_customer_list", "label": "customer_list()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L358"}, {"id": "customerlistbody", "label": "CustomerListBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L358"}, {"id": "api_crm_customer_detail", "label": "customer_detail()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L392"}, {"id": "api_crm_customer_create", "label": "customer_create()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L419"}, {"id": "customercreatebody", "label": "CustomerCreateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L419"}, {"id": "api_crm_customer_update", "label": "customer_update()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L449"}, {"id": "customerupdatebody", "label": "CustomerUpdateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L449"}, {"id": "api_crm_customer_delete", "label": "customer_delete()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L476"}, {"id": "customerdeletebody", "label": "CustomerDeleteBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L476"}, {"id": "api_crm_customer_generate_no", "label": "customer_generate_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L504"}, {"id": "api_crm_category_add", "label": "category_add()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L520"}, {"id": "productcategorycreatebody", "label": "ProductCategoryCreateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L520"}, {"id": "api_crm_category_update", "label": "category_update()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L540"}, {"id": "productcategoryupdatebody", "label": "ProductCategoryUpdateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L540"}, {"id": "api_crm_category_delete", "label": "category_delete()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L559"}, {"id": "categorydeletebody", "label": "CategoryDeleteBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L559"}, {"id": "api_crm_product_list", "label": "product_list()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L578"}, {"id": "productlistbody", "label": "ProductListBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L578"}, {"id": "api_crm_product_detail", "label": "product_detail()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L614"}, {"id": "productdetailbody", "label": "ProductDetailBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L614"}, {"id": "api_crm_product_add", "label": "product_add()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L635"}, {"id": "productcreatebody", "label": "ProductCreateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L635"}, {"id": "api_crm_product_update", "label": "product_update()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/crm.py", "source_location": "L659"}, {"id": "productupdatebody", "label": "ProductUpdateBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.Line truncated
|
||||
backend/graphify-out/cache/ast/55e2c1f94d7026eba0605addb9d548296a633c7ca54c98ff3db860df37dfa951.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L1"}, {"id": "pl_plan_planproductbase", "label": "PlanProductBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L15"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_plan_planproductcreate", "label": "PlanProductCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L44"}, {"id": "pl_plan_planproductupdate", "label": "PlanProductUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L48"}, {"id": "pl_plan_planproductread", "label": "PlanProductRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L69"}, {"id": "pl_plan_planbase", "label": "PlanBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L83"}, {"id": "pl_plan_plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L119"}, {"id": "pl_plan_plantransportcreateblock", "label": "PlanTransportCreateBlock", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L125"}, {"id": "pl_plan_planupdate", "label": "PlanUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L139"}, {"id": "pl_plan_planread", "label": "PlanRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L175"}, {"id": "planresourcesnapshotmixin", "label": "PlanResourceSnapshotMixin", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_plan_planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L199"}, {"id": "pl_plan_createfromcontractrequest", "label": "CreateFromContractRequest", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L208"}, {"id": "pl_plan_plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L216"}, {"id": "pl_plan_planlistquery", "label": "PlanListQuery", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L227"}, {"id": "pl_plan_planproductcertitem", "label": "PlanProductCertItem", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L242"}, {"id": "pl_plan_planproductcertsupdate", "label": "PlanProductCertsUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L249"}, {"id": "pl_plan_planarchiveproductitem", "label": "PlanArchiveProductItem", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L254"}, {"id": "pl_plan_planarchivefreightblock", "label": "PlanArchiveFreightBlock", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L260"}, {"id": "pl_plan_planarchivebody", "label": "PlanArchiveBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L271"}, {"id": "pl_plan_planlistresponse", "label": "PlanListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L277"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "typing", "relation": "imports_from", "context": "import", "confideLine truncated
|
||||
backend/graphify-out/cache/ast/5c13164e49d7ecb6836cf8e65a705fccd518399b85d3be2318c9581a98bacd51.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "label": "monitor.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L1"}, {"id": "api_monitor_user_info", "label": "_user_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L16"}, {"id": "api_monitor_operlog_list", "label": "operlog_list()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L28"}, {"id": "operloglistbody", "label": "OperLogListBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L28"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L28"}, {"id": "api_monitor_operlog_detail", "label": "operlog_detail()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L67"}, {"id": "operlogdetailbody", "label": "OperLogDetailBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L67"}, {"id": "api_monitor_rationale_33", "label": "\u64cd\u4f5c\u65e5\u5fd7\u5206\u9875\u5217\u8868\uff08\u57fa\u4e8e API \u8bf7\u6c42\u65e5\u5fd7\u9002\u914d RuoYi OperLog \u7ed3\u6784\uff09", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L33"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "app_core_database", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "app_core_menu_guard", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L8", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "app_core_response", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L9", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "app_crud_monitor_oper_log", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L10", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "app_schemas_monitor_operlog", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L11", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "api_monitor_user_info", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L16", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "api_monitor_operlog_list", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L28", "weight": 1.0}, {"source": "api_monitor_operlog_list", "target": "operloglistbody", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L28", "weight": 1.0}, {"source": "api_monitor_operlog_list", "target": "session", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/monitor.py", "source_location": "L28", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_monitor_py", "target": "api_monitorLine truncated
|
||||
backend/graphify-out/cache/ast/67214d22f185537c3730e225792d5b61e7da19422be3b0420c22799def0d5005.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_models_pl_models_py", "label": "pl_models.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L1"}, {"id": "models_pl_models_plcarrier", "label": "PlCarrier", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L28"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_pl_models_plvehicle", "label": "PlVehicle", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L57"}, {"id": "models_pl_models_plpersonnel", "label": "PlPersonnel", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L83"}, {"id": "models_pl_models_plcert", "label": "PlCert", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L105"}, {"id": "models_pl_models_pldriver", "label": "PlDriver", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L131"}, {"id": "models_pl_models_plvehiclepersonnel", "label": "PlVehiclePersonnel", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L157"}, {"id": "models_pl_models_plvehicledriver", "label": "PlVehicleDriver", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L178"}, {"id": "models_pl_models_plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L203"}, {"id": "models_pl_models_plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L286"}, {"id": "models_pl_models_plplanchange", "label": "PlPlanChange", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L341"}, {"id": "models_pl_models_pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L368"}, {"id": "models_pl_models_pltransportdblink", "label": "PlTransportDbLink", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L428"}, {"id": "models_pl_models_plplantransport", "label": "PlPlanTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L450"}, {"id": "models_pl_models_pltransportsitelink", "label": "PlTransportSiteLink", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L469"}, {"id": "models_pl_models_pltransportapproval", "label": "PlTransportApproval", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L502"}, {"id": "models_pl_models_plfreightsettlement", "label": "PlFreightSettlement", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L531"}, {"id": "models_pl_models_plfreightsettlementapproval", "label": "PlFreightSettlementApproval", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L563"}, {"id": "models_pl_models_plfreightsettlementtransport", "label": "PlFreightSettlementTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L590"}, {"id": "models_pl_models_plremittancevoucher", "label": "PlRemittanceVoucher", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L610"}, {"id": "models_pl_models_plinventory", "label": "PlInventory", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L637"}, {"id": "models_pl_models_plinventorytransaction", "label": "PlInventoryTransaction", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L669"}, {"id": "models_pl_models_plinventorywarning", "label": "PlInventoryWarning", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L698"}, {"id": "models_pl_models_pldocumentreminder", "label": "PlDocumentReminder", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0Line truncated
|
||||
backend/graphify-out/cache/ast/6e03239433bbaecc54f72fa2aba2578573ae6c7fc881f287ef57dafed1a0f1b5.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "label": "leave.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L1"}, {"id": "api_leave_leave_local_callback", "label": "_leave_local_callback()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L24"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L24"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L24"}, {"id": "api_leave_list_leaves", "label": "list_leaves()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L39"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L39"}, {"id": "api_leave_create_leave", "label": "create_leave()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L62"}, {"id": "leavecreate", "label": "LeaveCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L62"}, {"id": "api_leave_submit_leave", "label": "submit_leave()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L87"}, {"id": "api_leave_leave_workflow_callback", "label": "leave_workflow_callback()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L142"}, {"id": "api_leave_get_leave", "label": "get_leave()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L161"}, {"id": "api_leave_delete_leave", "label": "delete_leave()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L174"}, {"id": "api_leave_update_leave", "label": "update_leave()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L191"}, {"id": "leaveupdate", "label": "LeaveUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L191"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "target": "logging", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L8", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "target": "app_core_menu_guard", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L10", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "target": "app_core_database", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L11", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "target": "app_core_response", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L12", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_py", "target": "app_crud", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/leave.py", "source_location": "L13", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_leave_Line truncated
|
||||
backend/graphify-out/cache/ast/6e153316ea3aa04c64aa8ccfdafc43e7c9bbb975f5d2ead10670a71b01a7a5e4.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_freight_py", "label": "freight.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L1"}, {"id": "pl_freight_generate_settlement_no", "label": "_generate_settlement_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L30"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L30"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L30"}, {"id": "pl_freight_list_unsettled_plans", "label": "list_unsettled_plans()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L49"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L49"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L49"}, {"id": "unsettledplanlistresponse", "label": "UnsettledPlanListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L49"}, {"id": "pl_freight_list_settlements", "label": "list_settlements()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L75"}, {"id": "freightsettlementlistresponse", "label": "FreightSettlementListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L75"}, {"id": "pl_freight_get_settlement_by_transport", "label": "get_settlement_by_transport()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L105"}, {"id": "freightsettlementbytransportread", "label": "FreightSettlementByTransportRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L105"}, {"id": "pl_freight_create_settlement", "label": "create_settlement()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L120"}, {"id": "freightsettlementcreate", "label": "FreightSettlementCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L120"}, {"id": "freightsettlementread", "label": "FreightSettlementRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L120"}, {"id": "pl_freight_get_settlement", "label": "get_settlement()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L139"}, {"id": "freightsettlementwithtransports", "label": "FreightSettlementWithTransports", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L139"}, {"id": "pl_freight_update_settlement", "label": "update_settlement()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L152"}, {"id": "freightsettlementupdate", "label": "FreightSettlementUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L152"}, {"id": "pl_freight_cancel_settlement", "label": "cancel_settlement()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L170"}, {"id": "pl_freight_delete_settlement", "label": "delete_settlement()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L182"}, {"id": "pl_freight_submit_settlement_approval", "label": "submit_settlement_approval()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L194"}, {"id": "freightsettlementsubmitapprovalbody", "label": "FreightSettlementSubmitApprovalBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L194"}, {"id": "pl_freight_process_settlement_approval", "label": "process_settlement_approval()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/freight.py", "source_location": "L213"}, {"id": "freightsettlementapprovalactionbody", "label": "FreightSettlementApprovalActionBody", "file_type": "Line truncated
|
||||
backend/graphify-out/cache/ast/6e2e69f1147ea335b3571ddbd5d042cba48e6bb8488764f90fea25a94c57876d.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_freight_settlement_service_py", "label": "pl_freight_settlement_service.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L1"}, {"id": "services_pl_freight_settlement_service_resolve_user_display_name", "label": "_resolve_user_display_name()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L42"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L42"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L42"}, {"id": "services_pl_freight_settlement_service_occupied_transport_ids_subquery", "label": "_occupied_transport_ids_subquery()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L52"}, {"id": "services_pl_freight_settlement_service_get_settlement_row", "label": "get_settlement_row()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L69"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L69"}, {"id": "plfreightsettlement", "label": "PlFreightSettlement", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L69"}, {"id": "services_pl_freight_settlement_service_get_settlement_by_transport_id", "label": "get_settlement_by_transport_id()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L93"}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L93"}, {"id": "services_pl_freight_settlement_service_list_unsettled_plans", "label": "list_unsettled_plans()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L133"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L133"}, {"id": "services_pl_freight_settlement_service_resolve_transports_for_create", "label": "_resolve_transports_for_create()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L208"}, {"id": "pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L208"}, {"id": "services_pl_freight_settlement_service_create_settlement", "label": "create_settlement()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L258"}, {"id": "services_pl_freight_settlement_service_delete_draft_settlement", "label": "delete_draft_settlement()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L302"}, {"id": "services_pl_freight_settlement_service_cancel_draft_settlement", "label": "cancel_draft_settlement()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L334"}, {"id": "services_pl_freight_settlement_service_get_transport_ids", "label": "_get_transport_ids()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L368"}, {"id": "services_pl_freight_settlement_service_get_plans_for_transports", "label": "_get_plans_for_transports()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L380"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freight_settlement_service.py", "source_location": "L380"}, {"id": "services_pl_freight_settlement_service_approval_to_dict", "label": "_approval_to_dict()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_freiLine truncated
|
||||
backend/graphify-out/cache/ast/6f94dcb582fe725738a54469e461aa0124b9754b2141cb78d3859ff1a2f25ca9.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_transport_resource_snapshot_service_py", "label": "pl_transport_resource_snapshot_service.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L1"}, {"id": "services_pl_transport_resource_snapshot_service_cert_to_snapshot", "label": "_cert_to_snapshot()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L24"}, {"id": "certread", "label": "CertRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L24"}, {"id": "snapshotcertread", "label": "SnapshotCertRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L24"}, {"id": "services_pl_transport_resource_snapshot_service_build_transport_resource_snapshot", "label": "build_transport_resource_snapshot()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L40"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L40"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L40"}, {"id": "transportresourcesnapshot", "label": "TransportResourceSnapshot", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L40"}, {"id": "services_pl_transport_resource_snapshot_service_apply_resource_snapshot_json", "label": "apply_resource_snapshot_json()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L122"}, {"id": "services_pl_transport_resource_snapshot_service_clear_resource_snapshot", "label": "clear_resource_snapshot()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L140"}, {"id": "services_pl_transport_resource_snapshot_service_rationale_1", "label": "\u8fd0\u8f93\u8ba1\u5212 - \u5b89\u6392\u8fd0\u8f93\u65f6\u8f66\u8f86/\u4eba\u5458/\u8bc1\u4ef6\u8d44\u6e90\u5feb\u7167", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L1"}, {"id": "services_pl_transport_resource_snapshot_service_rationale_47", "label": "\u8bfb\u53d6\u8f66\u8f86\u5f53\u524d\u4e3b\u6570\u636e\uff0c\u751f\u6210\u5b89\u6392\u8fd0\u8f93\u7528\u6574\u5305\u5feb\u7167\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L47"}, {"id": "services_pl_transport_resource_snapshot_service_rationale_128", "label": "\u5c06\u5feb\u7167 JSON \u5199\u5165\u8ba1\u5212/\u8fd0\u8f93\u5355\uff0c\u5e76\u540c\u6b65\u6807\u91cf\u5197\u4f59\u5b57\u6bb5\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L128"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_transport_resource_snapshot_service_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_transport_resource_snapshot_service_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_transport_resource_snapshot_service_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_transport_resource_snapshot_service.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_transport_resource_snapshot_service_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": Line truncated
|
||||
backend/graphify-out/cache/ast/73bb5f9fd0f9504e38c482b047e956b31ecc1531f4bdd1132e5b7fc462d34d66.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_site_py", "label": "public_site.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L1"}, {"id": "pl_public_site_parse_feedback_images", "label": "_parse_feedback_images()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L25"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L25"}, {"id": "pl_public_site_get_site_link_by_token", "label": "_get_site_link_by_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L37"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L37"}, {"id": "pltransportsitelink", "label": "PlTransportSiteLink", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L37"}, {"id": "pl_public_site_resolve_plan_voided", "label": "_resolve_plan_voided()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L51"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L51"}, {"id": "pl_public_site_build_public_page", "label": "_build_public_page()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L56"}, {"id": "publicinventorypageread", "label": "PublicInventoryPageRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L56"}, {"id": "pl_public_site_get_public_site", "label": "get_public_site()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L79"}, {"id": "pl_public_site_save_public_site_feedback", "label": "save_public_site_feedback()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L86"}, {"id": "publicinventoryfeedback", "label": "PublicInventoryFeedback", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L86"}, {"id": "pl_public_site_format_file_size", "label": "_format_file_size()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L107"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L107"}, {"id": "pl_public_site_upload_public_site_attachment", "label": "upload_public_site_attachment()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L116"}, {"id": "uploadfile", "label": "UploadFile", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L116"}, {"id": "pl_public_site_rationale_1", "label": "\u8fd0\u8f93\u8ba1\u5212 \u00b7 \u5de5\u5382\u73b0\u573a\u4eba\u5458\u514d\u767b\u5f55\u516c\u5171 API\uff08pl_transport_site_link\uff09", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L1"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_site_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_site_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_site_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L6", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_public_site_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/public_site.py", "source_location": "L7", "weight": 1.0}, {"Line truncated
|
||||
backend/graphify-out/cache/ast/79aa205d2e5e89ed45dd7b95068b93e3f6db82ee9258b0331b21d6c8ab551582.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_db_public_inventory_py", "label": "public_inventory.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L1"}, {"id": "db_public_inventory_parse_feedback_images", "label": "_parse_feedback_images()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L28"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L28"}, {"id": "db_public_inventory_get_inventory_by_token", "label": "_get_inventory_by_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L40"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L40"}, {"id": "dbinboundoutbound", "label": "DbInboundOutbound", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L40"}, {"id": "db_public_inventory_resolve_plan_voided", "label": "_resolve_plan_voided()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L54"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L54"}, {"id": "db_public_inventory_assert_editable", "label": "_assert_editable()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L70"}, {"id": "db_public_inventory_build_public_page", "label": "_build_public_page()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L77"}, {"id": "publicinventorypageread", "label": "PublicInventoryPageRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L77"}, {"id": "db_public_inventory_get_public_inventory", "label": "get_public_inventory()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L101"}, {"id": "db_public_inventory_save_public_feedback", "label": "save_public_feedback()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L108"}, {"id": "publicinventoryfeedback", "label": "PublicInventoryFeedback", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L108"}, {"id": "db_public_inventory_format_file_size", "label": "_format_file_size()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L131"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L131"}, {"id": "db_public_inventory_upload_public_attachment", "label": "upload_public_attachment()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L140"}, {"id": "uploadfile", "label": "UploadFile", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L140"}, {"id": "db_public_inventory_rationale_1", "label": "\u5730\u78c5\u51fa\u5165\u5e93\u5355 \u00b7 \u5de5\u5382\u73b0\u573a\u4eba\u5458\u514d\u767b\u5f55\u516c\u5171 API", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L1"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_db_public_inventory_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_db_public_inventory_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_inventory.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_db_public_inventory_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/db/public_invenLine truncated
|
||||
backend/graphify-out/cache/ast/7aad1323fbf1b7b2d9b10ee286abbe07dd83b9f14a013958caf633cae5f50503.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_models_pl_models_py", "label": "pl_models.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L1"}, {"id": "models_pl_models_plcarrier", "label": "PlCarrier", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L28"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_pl_models_plvehicle", "label": "PlVehicle", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L57"}, {"id": "models_pl_models_plpersonnel", "label": "PlPersonnel", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L83"}, {"id": "models_pl_models_plcert", "label": "PlCert", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L105"}, {"id": "models_pl_models_pldriver", "label": "PlDriver", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L131"}, {"id": "models_pl_models_plvehiclepersonnel", "label": "PlVehiclePersonnel", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L157"}, {"id": "models_pl_models_plvehicledriver", "label": "PlVehicleDriver", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L178"}, {"id": "models_pl_models_plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L203"}, {"id": "models_pl_models_plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L289"}, {"id": "models_pl_models_plplanchange", "label": "PlPlanChange", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L344"}, {"id": "models_pl_models_pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L371"}, {"id": "models_pl_models_pltransportdblink", "label": "PlTransportDbLink", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L433"}, {"id": "models_pl_models_plplantransport", "label": "PlPlanTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L455"}, {"id": "models_pl_models_pltransportsitelink", "label": "PlTransportSiteLink", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L474"}, {"id": "models_pl_models_pltransportapproval", "label": "PlTransportApproval", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L507"}, {"id": "models_pl_models_plfreightsettlement", "label": "PlFreightSettlement", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L536"}, {"id": "models_pl_models_plfreightsettlementapproval", "label": "PlFreightSettlementApproval", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L568"}, {"id": "models_pl_models_plfreightsettlementtransport", "label": "PlFreightSettlementTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L595"}, {"id": "models_pl_models_plremittancevoucher", "label": "PlRemittanceVoucher", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L615"}, {"id": "models_pl_models_plinventory", "label": "PlInventory", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L642"}, {"id": "models_pl_models_plinventorytransaction", "label": "PlInventoryTransaction", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L674"}, {"id": "models_pl_models_plinventorywarning", "label": "PlInventoryWarning", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L703"}, {"id": "models_pl_models_pldocumentreminder", "label": "PlDocumentReminder", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0Line truncated
|
||||
backend/graphify-out/cache/ast/7bf91be009b835f1399914ee616dc3a2d0597c11c508c7ea02ac837877ecb8ef.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_transport_py", "label": "transport.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L1"}, {"id": "pl_transport_transportbase", "label": "TransportBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L16"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_transport_transportcreate", "label": "TransportCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L40"}, {"id": "pl_transport_transportarrange", "label": "TransportArrange", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L45"}, {"id": "pl_transport_transportinventorylinkread", "label": "TransportInventoryLinkRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L69"}, {"id": "pl_transport_transportsitelinkread", "label": "TransportSiteLinkRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L79"}, {"id": "pl_transport_transportupdate", "label": "TransportUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L93"}, {"id": "pl_transport_transportread", "label": "TransportRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L117"}, {"id": "planresourcesnapshotmixin", "label": "PlanResourceSnapshotMixin", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_transport_transportarrangeresult", "label": "TransportArrangeResult", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L136"}, {"id": "pl_transport_planarrangeinforead", "label": "PlanArrangeInfoRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L146"}, {"id": "pl_transport_transportwithplans", "label": "TransportWithPlans", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L156"}, {"id": "pl_transport_transportfeedback", "label": "TransportFeedback", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L165"}, {"id": "pl_transport_publictransportfeedback", "label": "PublicTransportFeedback", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L174"}, {"id": "pl_transport_publictransportplanproductread", "label": "PublicTransportPlanProductRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L180"}, {"id": "pl_transport_publictransportpageread", "label": "PublicTransportPageRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L189"}, {"id": "pl_transport_approvalsubmit", "label": "ApprovalSubmit", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L211"}, {"id": "pl_transport_approvalrequest", "label": "ApprovalRequest", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L216"}, {"id": "pl_transport_approvalrecordread", "label": "ApprovalRecordRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L222"}, {"id": "pl_transport_transportlistquery", "label": "TransportListQuery", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L241"}, {"id": "pl_transport_transportlistresponse", "label": "TransportListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L253"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_transport_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/transport.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_transport_py", "target": "decimal", "relation": "imports_from", "context": "imLine truncated
|
||||
backend/graphify-out/cache/ast/83914ae62e469020feed0b7b7f13714af838ef8c65b13c13aa9eb1ed393cd227.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_models_pl_models_py", "label": "pl_models.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L1"}, {"id": "models_pl_models_plcarrier", "label": "PlCarrier", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L28"}, {"id": "base", "label": "Base", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "models_pl_models_plvehicle", "label": "PlVehicle", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L57"}, {"id": "models_pl_models_plpersonnel", "label": "PlPersonnel", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L83"}, {"id": "models_pl_models_plcert", "label": "PlCert", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L105"}, {"id": "models_pl_models_pldriver", "label": "PlDriver", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L131"}, {"id": "models_pl_models_plvehiclepersonnel", "label": "PlVehiclePersonnel", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L157"}, {"id": "models_pl_models_plvehicledriver", "label": "PlVehicleDriver", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L178"}, {"id": "models_pl_models_plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L203"}, {"id": "models_pl_models_plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L287"}, {"id": "models_pl_models_plplanchange", "label": "PlPlanChange", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L342"}, {"id": "models_pl_models_pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L369"}, {"id": "models_pl_models_pltransportdblink", "label": "PlTransportDbLink", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L429"}, {"id": "models_pl_models_plplantransport", "label": "PlPlanTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L451"}, {"id": "models_pl_models_pltransportsitelink", "label": "PlTransportSiteLink", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L470"}, {"id": "models_pl_models_pltransportapproval", "label": "PlTransportApproval", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L503"}, {"id": "models_pl_models_plfreightsettlement", "label": "PlFreightSettlement", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L532"}, {"id": "models_pl_models_plfreightsettlementapproval", "label": "PlFreightSettlementApproval", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L564"}, {"id": "models_pl_models_plfreightsettlementtransport", "label": "PlFreightSettlementTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L591"}, {"id": "models_pl_models_plremittancevoucher", "label": "PlRemittanceVoucher", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L611"}, {"id": "models_pl_models_plinventory", "label": "PlInventory", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L638"}, {"id": "models_pl_models_plinventorytransaction", "label": "PlInventoryTransaction", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L670"}, {"id": "models_pl_models_plinventorywarning", "label": "PlInventoryWarning", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/models/pl_models.py", "source_location": "L699"}, {"id": "models_pl_models_pldocumentreminder", "label": "PlDocumentReminder", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0Line truncated
|
||||
backend/graphify-out/cache/ast/85beabfb6f3b6b6debf0881eca141f48d810cffab206519d87c022f5677bfc4f.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L1"}, {"id": "pl_plan_generate_plan_no", "label": "_generate_plan_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "pl_plan_determine_plan_type", "label": "_determine_plan_type()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L92"}, {"id": "pl_plan_get_plan_type_label", "label": "_get_plan_type_label()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L97"}, {"id": "pl_plan_generate_notify_message", "label": "_generate_notify_message()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L106"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L106"}, {"id": "pl_plan_list_plans", "label": "list_plans()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "planlistresponse", "label": "PlanListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "pl_plan_count_plans_by_contract", "label": "count_plans_by_contract()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L230"}, {"id": "pl_plan_create_plan", "label": "create_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L258"}, {"id": "plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L258"}, {"id": "planread", "label": "PlanRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L258"}, {"id": "pl_plan_create_plan_full", "label": "create_plan_full()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L337"}, {"id": "plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L337"}, {"id": "planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L337"}, {"id": "pl_plan_create_from_contract", "label": "create_from_contract()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L441"}, {"id": "createfromcontractrequest", "label": "CreateFromContractRequest", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L441"}, {"id": "pl_plan_get_plan", "label": "get_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L550"}, {"id": "pl_plan_update_plan", "label": "update_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L593"}, {"id": "planupdate", "label": "PlanUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L593"}, {"id": "pl_plan_patch_plan_product_certs", "label": "patch_plan_product_certs()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L702"}, {"id": "planproductcertsupdate", "label": "PlanProductCertsUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/Line truncated
|
||||
backend/graphify-out/cache/ast/885b8fdc78c77b2bf6bae5aaf34438d4a7f12fb700947cf09fc3aafa26c2ae1a.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_base_data_py", "label": "base_data.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L1"}, {"id": "pl_base_data_list_carriers", "label": "list_carriers()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L70"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L70"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L70"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L70"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L70"}, {"id": "carrierlistresponse", "label": "CarrierListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L70"}, {"id": "pl_base_data_create_carrier", "label": "create_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L115"}, {"id": "carriercreate", "label": "CarrierCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L115"}, {"id": "carrierread", "label": "CarrierRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L115"}, {"id": "pl_base_data_get_carrier", "label": "get_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L145"}, {"id": "pl_base_data_update_carrier", "label": "update_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L156"}, {"id": "carrierupdate", "label": "CarrierUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L156"}, {"id": "pl_base_data_delete_carrier", "label": "delete_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L190"}, {"id": "pl_base_data_approve_carrier", "label": "approve_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L204"}, {"id": "pl_base_data_reject_carrier", "label": "reject_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L228"}, {"id": "carrierauditreject", "label": "CarrierAuditReject", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L228"}, {"id": "plcarrier", "label": "PlCarrier", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L250"}, {"id": "pl_base_data_vehicle_to_read", "label": "_vehicle_to_read()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L271"}, {"id": "plvehicle", "label": "PlVehicle", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L271"}, {"id": "vehicleread", "label": "VehicleRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L271"}, {"id": "pl_base_data_vehicle_to_detail", "label": "_vehicle_to_detail()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L284"}, {"id": "vehicledetailread", "label": "VehicleDetailRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L284"}, {"id": "pl_base_data_list_vehicles", "label": "list_vehicles()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L302"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L302"}, {"id": "vehiclelistresponse", "label": "VehicleListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L302"}, {"id": "pl_base_data_create_vehicle", "laLine truncated
|
||||
backend/graphify-out/cache/ast/8bc9c8ae62e2be2c6920036582ba448dfcd1711c41cebb62274ff6bc6ee14b0b.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "label": "database.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L1"}, {"id": "core_database_get_db", "label": "get_db()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L28"}, {"id": "core_database_auto_fill_create_dept_id", "label": "_auto_fill_create_dept_id()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L38"}, {"id": "core_database_rationale_39", "label": "ORM before_insert \u94a9\u5b50\uff1a\u5f53 create_dept_id \u4e3a\u7a7a\u65f6\uff0c\u81ea\u52a8\u4ece\u8bf7\u6c42\u4e0a\u4e0b\u6587\u586b\u5145\u5f53\u524d\u7528\u6237\u90e8\u95e8 ID", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L39"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "sqlalchemy", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L1", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "sqlalchemy_ext_declarative", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "app_core_config", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "core_database_get_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L28", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_database_py", "target": "core_database_auto_fill_create_dept_id", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L38", "weight": 1.0}, {"source": "core_database_rationale_39", "target": "core_database_auto_fill_create_dept_id", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L39", "weight": 1.0}], "raw_calls": [{"caller_nid": "core_database_get_db", "callee": "SessionLocal", "is_member_call": false, "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L30"}, {"caller_nid": "core_database_get_db", "callee": "close", "is_member_call": true, "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L34"}, {"caller_nid": "core_database_auto_fill_create_dept_id", "callee": "get", "is_member_call": true, "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py", "source_location": "L42"}]}
|
||||
backend/graphify-out/cache/ast/8c113badd2013450ef98f3c7b47fc3e0afa700df3b72ab96bff1e08b7367f115.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "label": "config.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L1"}, {"id": "core_config_settings", "label": "Settings", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L7"}, {"id": "basesettings", "label": "BaseSettings", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "core_config_config", "label": "Config", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L169"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "pydantic_settings", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L1", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "core_config_settings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L7", "weight": 1.0}, {"source": "core_config_settings", "target": "basesettings", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "core_config_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L169", "weight": 1.0}], "raw_calls": []}
|
||||
backend/graphify-out/cache/ast/8f9da799977bee7134d87a26ff8434ac5ef8eabb0b7368dd537eee49ad7fd00b.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_main_py", "label": "main.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L1"}, {"id": "app_main_lifespan", "label": "lifespan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L39"}, {"id": "fastapi", "label": "FastAPI", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L39"}, {"id": "app_main_db_pool_keepalive_loop", "label": "_db_pool_keepalive_loop()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L70"}, {"id": "app_main_error_json", "label": "_error_json()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L118"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L118"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L118"}, {"id": "jsonresponse", "label": "JSONResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L118"}, {"id": "app_main_sqlalchemy_exception_handler", "label": "sqlalchemy_exception_handler()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L131"}, {"id": "request", "label": "Request", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L131"}, {"id": "sqlalchemyerror", "label": "SQLAlchemyError", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L131"}, {"id": "app_main_unhandled_exception_handler", "label": "unhandled_exception_handler()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L142"}, {"id": "exception", "label": "Exception", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L142"}, {"id": "app_main_mask_secret", "label": "_mask_secret()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L167"}, {"id": "app_main_root", "label": "root()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L189"}, {"id": "app_main_health_check", "label": "health_check()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L194"}, {"id": "app_main_rationale_71", "label": "\u5b9a\u671f ping MySQL\uff0c\u907f\u514d\u8fdc\u7a0b\u5e93/NAT \u56de\u6536\u7a7a\u95f2 TCP \u540e\u9996\u8bf7\u6c42\u957f\u65f6\u95f4\u5361\u4f4f\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L71"}, {"id": "app_main_rationale_132", "label": "\u6570\u636e\u5e93\u5f02\u5e38\uff1a\u8fd4\u56de JSON \u5e76\u4fdd\u7559 CORS \u5934\uff0c\u907f\u514d\u6d4f\u89c8\u5668\u53ea\u62a5\u8de8\u57df\u9519\u8bef", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L132"}, {"id": "app_main_rationale_143", "label": "\u672a\u6355\u83b7\u5f02\u5e38\uff1a\u7edf\u4e00 JSON 500\uff0c\u786e\u4fdd\u8de8\u57df\u573a\u666f\u4e0b\u4ecd\u6709 Access-Control-Allow-Origin", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L143"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_main_py", "target": "asyncio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_main_py", "target": "contextlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_main_py", "target": "logging", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_main_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_Line truncated
|
||||
backend/graphify-out/cache/ast/900eb622c6eb1f8428bfa2349fd4bd3d65beef2f160eb44557175bcb764ac91c.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_py", "label": "base_data.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L1"}, {"id": "pl_base_data_carrierbase", "label": "CarrierBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L19"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_base_data_carrierqualificationbase", "label": "CarrierQualificationBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L27"}, {"id": "pl_base_data_carriercreate", "label": "CarrierCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L45"}, {"id": "pl_base_data_carriercreate_validate_qualification", "label": ".validate_qualification()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L54"}, {"id": "pl_base_data_carrierupdate", "label": "CarrierUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L64"}, {"id": "pl_base_data_carrierupdate_validate_qualification_patch", "label": ".validate_qualification_patch()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L86"}, {"id": "pl_base_data_carrierauditreject", "label": "CarrierAuditReject", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L111"}, {"id": "pl_base_data_carrierread", "label": "CarrierRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L117"}, {"id": "pl_base_data_carrier_to_read", "label": "carrier_to_read()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L136"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L136"}, {"id": "pl_base_data_vehiclepersonnelrow", "label": "VehiclePersonnelRow", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L172"}, {"id": "pl_base_data_certrow", "label": "CertRow", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L183"}, {"id": "pl_base_data_certread", "label": "CertRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L198"}, {"id": "pl_base_data_vehiclebase", "label": "VehicleBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L214"}, {"id": "pl_base_data_vehiclecreate", "label": "VehicleCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L227"}, {"id": "pl_base_data_vehicleupdate", "label": "VehicleUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L233"}, {"id": "pl_base_data_vehicleread", "label": "VehicleRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L247"}, {"id": "pl_base_data_vehicledetailread", "label": "VehicleDetailRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L261"}, {"id": "pl_base_data_personnelbase", "label": "PersonnelBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L272"}, {"id": "pl_base_data_personnelcreate", "label": "PersonnelCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L281"}, {"id": "pl_base_data_personnelupdate", "label": "PersonnelUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L286"}, {"id": "pl_base_data_personnelread", "label": "PersonnelRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L297"}, {"id": "pl_base_data_personneldetailread", "label": "PersonnelDetailRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0Line truncated
|
||||
backend/graphify-out/cache/ast/99f80fa5d9cc6d09d850103c1d12feb9ff30a4ef61ceb649408a736cd9632810.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_base_data_py", "label": "base_data.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L1"}, {"id": "pl_base_data_list_carriers", "label": "list_carriers()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L69"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L69"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L69"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L69"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L69"}, {"id": "carrierlistresponse", "label": "CarrierListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L69"}, {"id": "pl_base_data_create_carrier", "label": "create_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L114"}, {"id": "carriercreate", "label": "CarrierCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L114"}, {"id": "carrierread", "label": "CarrierRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L114"}, {"id": "pl_base_data_get_carrier", "label": "get_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L144"}, {"id": "pl_base_data_update_carrier", "label": "update_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L155"}, {"id": "carrierupdate", "label": "CarrierUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L155"}, {"id": "pl_base_data_delete_carrier", "label": "delete_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L189"}, {"id": "pl_base_data_approve_carrier", "label": "approve_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L203"}, {"id": "pl_base_data_reject_carrier", "label": "reject_carrier()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L227"}, {"id": "carrierauditreject", "label": "CarrierAuditReject", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L227"}, {"id": "plcarrier", "label": "PlCarrier", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L249"}, {"id": "pl_base_data_vehicle_to_read", "label": "_vehicle_to_read()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L270"}, {"id": "plvehicle", "label": "PlVehicle", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L270"}, {"id": "vehicleread", "label": "VehicleRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L270"}, {"id": "pl_base_data_vehicle_to_detail", "label": "_vehicle_to_detail()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L283"}, {"id": "vehicledetailread", "label": "VehicleDetailRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L283"}, {"id": "pl_base_data_list_vehicles", "label": "list_vehicles()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L301"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L301"}, {"id": "vehiclelistresponse", "label": "VehicleListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/base_data.py", "source_location": "L301"}, {"id": "pl_base_data_create_vehicle", "laLine truncated
|
||||
backend/graphify-out/cache/ast/9d955a6baa70f78ddfcf29407d9711915a04e59a7f616254d06d25d25e8d0327.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "label": "config.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L1"}, {"id": "core_config_settings", "label": "Settings", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L7"}, {"id": "basesettings", "label": "BaseSettings", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "core_config_config", "label": "Config", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L173"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "pydantic_settings", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L1", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "core_config_settings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L7", "weight": 1.0}, {"source": "core_config_settings", "target": "basesettings", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_config_py", "target": "core_config_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py", "source_location": "L173", "weight": 1.0}], "raw_calls": []}
|
||||
backend/graphify-out/cache/ast/9fd2dc4fac0dadf0f19caf0ae4e469f2f1939cd38179d01036b35dffc9c0ee7b.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_base_data_py", "label": "base_data.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L1"}, {"id": "pl_base_data_carrierbase", "label": "CarrierBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L19"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_base_data_carrierqualificationbase", "label": "CarrierQualificationBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L27"}, {"id": "pl_base_data_carriercreate", "label": "CarrierCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L45"}, {"id": "pl_base_data_carriercreate_validate_qualification", "label": ".validate_qualification()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L54"}, {"id": "pl_base_data_carrierupdate", "label": "CarrierUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L64"}, {"id": "pl_base_data_carrierupdate_validate_qualification_patch", "label": ".validate_qualification_patch()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L86"}, {"id": "pl_base_data_carrierauditreject", "label": "CarrierAuditReject", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L111"}, {"id": "pl_base_data_carrierread", "label": "CarrierRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L117"}, {"id": "pl_base_data_carrier_to_read", "label": "carrier_to_read()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L136"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L136"}, {"id": "pl_base_data_vehiclepersonnelrow", "label": "VehiclePersonnelRow", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L172"}, {"id": "pl_base_data_certrow", "label": "CertRow", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L183"}, {"id": "pl_base_data_certread", "label": "CertRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L198"}, {"id": "pl_base_data_vehiclebase", "label": "VehicleBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L214"}, {"id": "pl_base_data_vehiclecreate", "label": "VehicleCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L227"}, {"id": "pl_base_data_vehicleupdate", "label": "VehicleUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L233"}, {"id": "pl_base_data_vehicleread", "label": "VehicleRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L247"}, {"id": "pl_base_data_vehicledetailread", "label": "VehicleDetailRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L261"}, {"id": "pl_base_data_personnelbase", "label": "PersonnelBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L272"}, {"id": "pl_base_data_personnelcreate", "label": "PersonnelCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L281"}, {"id": "pl_base_data_personnelupdate", "label": "PersonnelUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L286"}, {"id": "pl_base_data_personnelread", "label": "PersonnelRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/base_data.py", "source_location": "L297"}, {"id": "pl_base_data_personneldetailread", "label": "PersonnelDetailRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0Line truncated
|
||||
backend/graphify-out/cache/ast/a390b8d972bc8396a229437c3d41cb1c1b59fcbe8703c3ad941dcf93a9456794.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_public_py", "label": "public.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L1"}, {"id": "api_public_avatar_url_field", "label": "_avatar_url_field()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L35"}, {"id": "sysuser", "label": "SysUser", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L35"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L35"}, {"id": "api_public_build_user_info_payload", "label": "_build_user_info_payload()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L43"}, {"id": "api_public_jwt_user_payload", "label": "_jwt_user_payload()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L59"}, {"id": "api_public_web_login_rsa_public_key", "label": "web_login_rsa_public_key()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L72"}, {"id": "api_public_web_login", "label": "web_login()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L79"}, {"id": "request", "label": "Request", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L79"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L79"}, {"id": "api_public_refresh_token", "label": "refresh_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L137"}, {"id": "api_public_logout", "label": "logout()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L199"}, {"id": "api_public_get_current_user_profile", "label": "get_current_user_profile()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L218"}, {"id": "api_public_get_web_auth_menu_codes", "label": "get_web_auth_menu_codes()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L251"}, {"id": "api_public_public_quote_share", "label": "public_quote_share()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L288"}, {"id": "api_public_rationale_1", "label": "\u516c\u5171\u63a5\u53e3\uff08Web \u767b\u5f55\u3001\u5237\u65b0 Token\u3001\u767b\u51fa\uff1b\u7528\u6237\u6a21\u578b\u5bf9\u9f50 docs/sql/shanxia2.0.sql \u57fa\u7ebf\uff09", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L1"}, {"id": "api_public_rationale_44", "label": "\u4e0e web-admin `userInfo` \u5b57\u6bb5\u7ea6\u5b9a\u4e00\u81f4\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L44"}, {"id": "api_public_rationale_73", "label": "Web \u7aef\u767b\u5f55\u7528 RSA \u516c\u94a5\uff08PKCS#1 v1.5\uff0c\u4e0e JSEncrypt \u4e00\u81f4\uff09", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L73"}, {"id": "api_public_rationale_84", "label": "Web \u7aef\u767b\u5f55\uff1a\u8d26\u53f7\u4e3a sys_user.user_no\uff0c\u5bc6\u7801\u4e3a sys_user.password\uff08bcrypt\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L84"}, {"id": "api_public_rationale_200", "label": "\u767b\u51fa\uff1a\u540a\u9500 Redis \u4f1a\u8bdd\uff08\u82e5\u5df2\u914d\u7f6e REDIS_HOST\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L200"}, {"id": "api_public_rationale_219", "label": "\u83b7\u53d6\u5f53\u524d\u7528\u6237\u4fe1\u606f\uff08\u4e0e sys_user \u5b57\u6bb5\u5bf9\u5e94\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L219"}, {"id": "api_public_rationale_252", "label": "\u83b7\u53d6\u5f53\u524d\u7528\u6237\u83dc\u5355\u6743\u9650\u6807\u8bc6\uff08sys_menu.perms\uff0c\u7ecf\u89d2\u8272\u7ee7\u627f\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/public.py", "source_location": "L252"}, {"id": "api_public_rationale_294", "label": "\Line truncated
|
||||
backend/graphify-out/cache/ast/a3d1b2621c502578afae2bb0d3f617b128d73c6f90e90aef8a20ccd406177593.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L1"}, {"id": "pl_init_rationale_1", "label": "\u8fd0\u8f93\u8ba1\u5212\u7ba1\u7406 - Pydantic Schema", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_base_data", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_plan", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L32", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_transport", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L48", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_freight", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L61", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_inventory", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L73", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_vehicle_recharge", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L92", "weight": 1.0}, {"source": "pl_init_rationale_1", "target": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
|
||||
backend/graphify-out/cache/ast/affa735812a60d67bef92ec8b7f62244112ea35ec2266eedabab52ef09f14a1d.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L1"}, {"id": "pl_plan_generate_plan_no", "label": "_generate_plan_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "pl_plan_determine_plan_type", "label": "_determine_plan_type()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L92"}, {"id": "pl_plan_get_plan_type_label", "label": "_get_plan_type_label()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L97"}, {"id": "pl_plan_generate_notify_message", "label": "_generate_notify_message()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L106"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L106"}, {"id": "pl_plan_list_plans", "label": "list_plans()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "planlistresponse", "label": "PlanListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "pl_plan_count_plans_by_contract", "label": "count_plans_by_contract()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L228"}, {"id": "pl_plan_create_plan", "label": "create_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L256"}, {"id": "plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L256"}, {"id": "planread", "label": "PlanRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L256"}, {"id": "pl_plan_create_plan_full", "label": "create_plan_full()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L335"}, {"id": "plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L335"}, {"id": "planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L335"}, {"id": "pl_plan_create_from_contract", "label": "create_from_contract()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L439"}, {"id": "createfromcontractrequest", "label": "CreateFromContractRequest", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L439"}, {"id": "pl_plan_get_plan", "label": "get_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L548"}, {"id": "pl_plan_update_plan", "label": "update_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L591"}, {"id": "planupdate", "label": "PlanUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L591"}, {"id": "pl_plan_patch_plan_product_certs", "label": "patch_plan_product_certs()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L700"}, {"id": "planproductcertsupdate", "label": "PlanProductCertsUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/Line truncated
|
||||
backend/graphify-out/cache/ast/b39f128b6612589ea6ac5babd30752e9585b3af07b82bb1ad53c9e3c0d90816f.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_api_crypto_middleware_py", "label": "api_crypto_middleware.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L1"}, {"id": "core_api_crypto_middleware_nonce_key", "label": "_nonce_key()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L28"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L28"}, {"id": "core_api_crypto_middleware_should_skip_path", "label": "_should_skip_path()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L32"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L32"}, {"id": "core_api_crypto_middleware_is_crypto_api", "label": "_is_crypto_api()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L37"}, {"id": "core_api_crypto_middleware_claims_from_auth", "label": "_claims_from_auth()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L43"}, {"id": "core_api_crypto_middleware_get_redis_client", "label": "_get_redis_client()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L61"}, {"id": "redis", "label": "Redis", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L61"}, {"id": "core_api_crypto_middleware_mark_nonce_once", "label": "_mark_nonce_once()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L65"}, {"id": "core_api_crypto_middleware_json_error_response", "label": "_json_error_response()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L90"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L90"}, {"id": "response", "label": "Response", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L90"}, {"id": "core_api_crypto_middleware_coerce_post_method_override_to_get", "label": "_coerce_post_method_override_to_get()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L95"}, {"id": "request", "label": "Request", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L95"}, {"id": "core_api_crypto_middleware_apicryptomiddleware", "label": "ApiCryptoMiddleware", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L141"}, {"id": "basehttpmiddleware", "label": "BaseHTTPMiddleware", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "core_api_crypto_middleware_apicryptomiddleware_dispatch", "label": ".dispatch()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L142"}, {"id": "core_api_crypto_middleware_rationale_38", "label": "\u4ec5\u5bf9\u8fd0\u8425\u7aef\u4e0e\u5c0f\u7a0b\u5e8f\u4e1a\u52a1 API \u5e94\u7528\u7edf\u4e00\u5bc6\u6587\u534f\u8bae\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L38"}, {"id": "core_api_crypto_middleware_rationale_96", "label": "\u524d\u7aef Axios \u5728\u5f00\u542f\u52a0\u5bc6\u65f6\u4f1a\u628a GET \u6539\u4e3a POST \u5e76\u5e26 X-HTTP-Method-Override: GET\u3002 \u5f53\u540e\u7aef\u672a\u542f\u7528 API_EN", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L96"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_api_crypto_middleware_py", "target": "asyncio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_api_crypto_middleware_py", "target": "json", "relation": "imports", "context": "import", "confLine truncated
|
||||
backend/graphify-out/cache/ast/b9bb12f91602e7d0cc239f61c10f46fcaa3b7df2dd809ae3c6cf603d8a3638db.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L1"}, {"id": "pl_plan_planproductbase", "label": "PlanProductBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L13"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_plan_planproductcreate", "label": "PlanProductCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L42"}, {"id": "pl_plan_planproductupdate", "label": "PlanProductUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L46"}, {"id": "pl_plan_planproductread", "label": "PlanProductRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L67"}, {"id": "pl_plan_planbase", "label": "PlanBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L81"}, {"id": "pl_plan_plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L117"}, {"id": "pl_plan_plantransportcreateblock", "label": "PlanTransportCreateBlock", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L123"}, {"id": "pl_plan_planupdate", "label": "PlanUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L137"}, {"id": "pl_plan_planread", "label": "PlanRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L173"}, {"id": "pl_plan_planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L197"}, {"id": "pl_plan_createfromcontractrequest", "label": "CreateFromContractRequest", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L206"}, {"id": "pl_plan_plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L214"}, {"id": "pl_plan_planlistquery", "label": "PlanListQuery", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L225"}, {"id": "pl_plan_planproductcertitem", "label": "PlanProductCertItem", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L240"}, {"id": "pl_plan_planproductcertsupdate", "label": "PlanProductCertsUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L247"}, {"id": "pl_plan_planarchiveproductitem", "label": "PlanArchiveProductItem", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L252"}, {"id": "pl_plan_planarchivefreightblock", "label": "PlanArchiveFreightBlock", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L258"}, {"id": "pl_plan_planarchivebody", "label": "PlanArchiveBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L269"}, {"id": "pl_plan_planlistresponse", "label": "PlanListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L275"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L4", "weight": Line truncated
|
||||
backend/graphify-out/cache/ast/d516bd15a5432d6fe515e74acbd2b566a05ca45a9f61a4e09ddafa79af797455.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_plan_service_py", "label": "pl_plan_service.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L1"}, {"id": "services_pl_plan_service_determine_plan_type", "label": "determine_plan_type()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L33"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L33"}, {"id": "services_pl_plan_service_is_ton_product_unit", "label": "is_ton_product_unit()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L41"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L41"}, {"id": "services_pl_plan_service_product_quantity", "label": "_product_quantity()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L48"}, {"id": "planproductcreate", "label": "PlanProductCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L48"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L48"}, {"id": "services_pl_plan_service_sum_product_quantities", "label": "sum_product_quantities()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L58"}, {"id": "services_pl_plan_service_estimate_qty_fields", "label": "_estimate_qty_fields()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L62"}, {"id": "services_pl_plan_service_build_plan_product", "label": "build_plan_product()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L73"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L73"}, {"id": "plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L73"}, {"id": "services_pl_plan_service_resolve_vehicle_personnel_summary", "label": "resolve_vehicle_personnel_summary()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L119"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L119"}, {"id": "services_pl_plan_service_resolve_driver", "label": "_resolve_driver()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L134"}, {"id": "services_pl_plan_service_calc_freight_amount", "label": "_calc_freight_amount()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L179"}, {"id": "services_pl_plan_service_validate_toxic_products", "label": "_validate_toxic_products()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L203"}, {"id": "services_pl_plan_service_resolve_hazard_flags_from_crm", "label": "resolve_hazard_flags_from_crm()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L214"}, {"id": "services_pl_plan_service_update_plan_product_certs", "label": "update_plan_product_certs()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L241"}, {"id": "services_pl_plan_service_generate_transport_no", "label": "_generate_transport_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L291"}, {"id": "services_pl_plan_service_resolve_transport_context", "label": "_resolve_transport_context()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L309"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_locaLine truncated
|
||||
backend/graphify-out/cache/ast/e0014a3c4864ce8a6e2eb076555cd6b316b7504a88a1849d79a6fa4aad96e877.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_transport_py", "label": "transport.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L1"}, {"id": "pl_transport_generate_transport_no", "label": "_generate_transport_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L60"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L60"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L60"}, {"id": "pl_transport_resolve_driver_info", "label": "_resolve_driver_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L84"}, {"id": "pl_transport_get_vehicle_info", "label": "_get_vehicle_info()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L120"}, {"id": "pl_transport_assert_vehicle_carrier_eligible", "label": "_assert_vehicle_carrier_eligible()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L170"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L170"}, {"id": "pl_transport_ensure_driver_access_token", "label": "_ensure_driver_access_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L205"}, {"id": "pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L205"}, {"id": "pl_transport_rotate_driver_access_token", "label": "_rotate_driver_access_token()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L213"}, {"id": "pl_transport_is_rearrange", "label": "_is_rearrange()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L219"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L219"}, {"id": "pl_transport_transport_has_db_links", "label": "_transport_has_db_links()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L227"}, {"id": "pl_transport_apply_plan_logistics_from_payload", "label": "_apply_plan_logistics_from_payload()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L240"}, {"id": "transportarrange", "label": "TransportArrange", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L240"}, {"id": "pl_transport_resolve_transport_endpoints", "label": "_resolve_transport_endpoints()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L259"}, {"id": "pl_transport_apply_transport_arrange_fields", "label": "_apply_transport_arrange_fields()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L274"}, {"id": "float", "label": "float", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L274"}, {"id": "pl_transport_build_driver_url", "label": "_build_driver_url()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L308"}, {"id": "pl_transport_build_arrange_result", "label": "_build_arrange_result()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L313"}, {"id": "transportsitelinkread", "label": "TransportSiteLinkRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L313"}, {"id": "transportinventorylinkread", "label": "TransportInventoryLinkRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L313"}, {"id": "transportarrangeresult", "label": "TransportArrangeResult", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/transport.py", "source_location": "L313"}, {"id": "pl_transport_list_transports", "label": "list_transports()", "file_tyLine truncated
|
||||
backend/graphify-out/cache/ast/e4b5e4cece43620435bc490a9fd42211d1c6dd7608be7cff907615b94fa7c115.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "label": "redis_client.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L1"}, {"id": "core_redis_client_redis_enabled", "label": "redis_enabled()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L13"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L13"}, {"id": "core_redis_client_get_redis_client", "label": "get_redis_client()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L17"}, {"id": "redis", "label": "Redis", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L17"}, {"id": "core_redis_client_rationale_1", "label": "\u5171\u4eab Redis \u5f02\u6b65\u5ba2\u6237\u7aef\uff08\u4f1a\u8bdd\u3001API \u52a0\u5bc6 nonce \u7b49\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L1"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "redis_asyncio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L6", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "app_core_config", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L8", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "core_redis_client_redis_enabled", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L13", "weight": 1.0}, {"source": "core_redis_client_redis_enabled", "target": "bool", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L13", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "core_redis_client_get_redis_client", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L17", "weight": 1.0}, {"source": "core_redis_client_get_redis_client", "target": "redis", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L17", "weight": 1.0}, {"source": "core_redis_client_get_redis_client", "target": "core_redis_client_redis_enabled", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L19", "weight": 1.0}, {"source": "core_redis_client_get_redis_client", "target": "redis", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L22", "weight": 1.0}, {"source": "core_redis_client_rationale_1", "target": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
|
||||
backend/graphify-out/cache/ast/e5d84d7433ce745da7a37fb46dff5d5eb6ae027ef0efbf406da0c9c7fb6089ad.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "label": "redis_client.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L1"}, {"id": "core_redis_client_redis_enabled", "label": "redis_enabled()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L15"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L15"}, {"id": "core_redis_client_redis_common_kwargs", "label": "_redis_common_kwargs()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L19"}, {"id": "core_redis_client_get_sync_redis_client", "label": "get_sync_redis_client()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L32"}, {"id": "redis", "label": "Redis", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L32"}, {"id": "core_redis_client_get_redis_client", "label": "get_redis_client()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L45"}, {"id": "core_redis_client_rationale_1", "label": "\u5171\u4eab Redis \u5ba2\u6237\u7aef\uff08\u540c\u6b65\uff1a\u4f1a\u8bdd\u9274\u6743\uff1b\u5f02\u6b65\uff1aAPI \u52a0\u5bc6 nonce\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L1"}, {"id": "core_redis_client_rationale_33", "label": "\u540c\u6b65 Redis\uff08auth \u4f1a\u8bdd\u7b49\uff0c\u5728\u7ebf\u7a0b\u6c60\u4e2d\u8c03\u7528\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L33"}, {"id": "core_redis_client_rationale_46", "label": "\u5f02\u6b65 Redis\uff08API \u52a0\u5bc6 nonce \u7b49\u4e2d\u95f4\u4ef6\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L46"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L4", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "redis", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L6", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "redis_asyncio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "app_core_config", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L9", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "core_redis_client_redis_enabled", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L15", "weight": 1.0}, {"source": "core_redis_client_redis_enabled", "target": "bool", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L15", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "core_redis_client_redis_common_kwargs", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L19", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_core_redis_client_py", "target": "core_redis_client_get_sync_redis_client", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redis_client.py", "source_location": "L32", "weight": 1.0}, {"source": "core_redis_client_get_sync_redis_client", "target": "redis", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/core/redLine truncated
|
||||
backend/graphify-out/cache/ast/e88b9181e7c1a839074656ce2260cd6f693821402a24f08dd1c0ef3c160f8fa8.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_bx_attachment_py", "label": "attachment.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L1"}, {"id": "bx_attachment_tenant", "label": "_tenant()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L24"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L24"}, {"id": "bxusercontext", "label": "BxUserContext", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L24"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L24"}, {"id": "bx_attachment_parse_id_list", "label": "_parse_id_list()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L28"}, {"id": "bx_attachment_upload_file", "label": "upload_file()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L33"}, {"id": "uploadfile", "label": "UploadFile", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L33"}, {"id": "bx_attachment_download_file", "label": "download_file()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L67"}, {"id": "bx_attachment_delete_attachment", "label": "delete_attachment()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L89"}, {"id": "bx_attachment_preview_attachment", "label": "preview_attachment()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L103"}, {"id": "bx_attachment_list_by_biz", "label": "list_by_biz()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L127"}, {"id": "bx_attachment_bind_biz", "label": "bind_biz()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L142"}, {"id": "bx_attachment_rationale_108", "label": "\u8fd4\u56de\u56fe\u7247/\u9644\u4ef6\u9884\u89c8 URL\uff08MinIO \u9884\u7b7e\u540d\u6216\u672c\u5730\u516c\u5f00\u5730\u5740\uff0c\u5bf9\u9f50\u95e8\u6237 storage \u80fd\u529b\uff09\u3002", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L108"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_bx_attachment_py", "target": "mimetypes", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L1", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_bx_attachment_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_bx_attachment_py", "target": "urllib_parse", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_bx_attachment_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L5", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_bx_attachment_py", "target": "fastapi_responses", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L6", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_bx_attachment_py", "target": "sqlalchemy_orm", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/bx/attachment.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_api_bx_attachment_py", "target": "app_core_bx_auth", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00codLine truncated
|
||||
backend/graphify-out/cache/ast/eab4845a8aa03e4d3528c89d9a235ae9c1ed0b788ffdd7a0f9dd886c12953df1.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_services_pl_plan_service_py", "label": "pl_plan_service.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L1"}, {"id": "services_pl_plan_service_determine_plan_type", "label": "determine_plan_type()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L37"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L37"}, {"id": "services_pl_plan_service_is_ton_product_unit", "label": "is_ton_product_unit()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L45"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L45"}, {"id": "services_pl_plan_service_product_quantity", "label": "_product_quantity()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L52"}, {"id": "planproductcreate", "label": "PlanProductCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L52"}, {"id": "decimal", "label": "Decimal", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L52"}, {"id": "services_pl_plan_service_sum_product_quantities", "label": "sum_product_quantities()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L62"}, {"id": "services_pl_plan_service_estimate_qty_fields", "label": "_estimate_qty_fields()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L66"}, {"id": "services_pl_plan_service_build_plan_product", "label": "build_plan_product()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L77"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L77"}, {"id": "plplanproduct", "label": "PlPlanProduct", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L77"}, {"id": "services_pl_plan_service_apply_vehicle_snapshot_to_plan_transport", "label": "_apply_vehicle_snapshot_to_plan_transport()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L123"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L123"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L123"}, {"id": "pltransport", "label": "PlTransport", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L123"}, {"id": "plvehicle", "label": "PlVehicle", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L123"}, {"id": "services_pl_plan_service_resolve_driver", "label": "_resolve_driver()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L141"}, {"id": "services_pl_plan_service_calc_freight_amount", "label": "_calc_freight_amount()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L186"}, {"id": "services_pl_plan_service_validate_toxic_products", "label": "_validate_toxic_products()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L210"}, {"id": "services_pl_plan_service_resolve_hazard_flags_from_crm", "label": "resolve_hazard_flags_from_crm()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L221"}, {"id": "services_pl_plan_service_update_plan_product_certs", "label": "update_plan_product_certs()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/services/pl_plan_service.py", "source_location": "L248"}, {"id": "services_pl_plan_service_generate_transport_no", "label": "_generate_Line truncated
|
||||
backend/graphify-out/cache/ast/efd08d525ffeb9fd0658ec5f5d48acbbb59a8580c63beda2e5f8dd81c0c5d6c1.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_api_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L1"}, {"id": "pl_plan_generate_plan_no", "label": "_generate_plan_no()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "session", "label": "Session", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L69"}, {"id": "pl_plan_determine_plan_type", "label": "_determine_plan_type()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L92"}, {"id": "pl_plan_get_plan_type_label", "label": "_get_plan_type_label()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L97"}, {"id": "pl_plan_generate_notify_message", "label": "_generate_notify_message()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L106"}, {"id": "plplan", "label": "PlPlan", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L106"}, {"id": "pl_plan_list_plans", "label": "list_plans()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "date", "label": "date", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "int", "label": "int", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "dbusercontext", "label": "DbUserContext", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "planlistresponse", "label": "PlanListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L127"}, {"id": "pl_plan_count_plans_by_contract", "label": "count_plans_by_contract()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L234"}, {"id": "pl_plan_create_plan", "label": "create_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L262"}, {"id": "plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L262"}, {"id": "planread", "label": "PlanRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L262"}, {"id": "pl_plan_create_plan_full", "label": "create_plan_full()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L341"}, {"id": "plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L341"}, {"id": "planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L341"}, {"id": "pl_plan_create_from_contract", "label": "create_from_contract()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L445"}, {"id": "createfromcontractrequest", "label": "CreateFromContractRequest", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L445"}, {"id": "pl_plan_get_plan", "label": "get_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L554"}, {"id": "pl_plan_update_plan", "label": "update_plan()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L597"}, {"id": "planupdate", "label": "PlanUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L597"}, {"id": "pl_plan_patch_plan_product_certs", "label": "patch_plan_product_certs()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/pl/plan.py", "source_location": "L706"}, {"id": "planproductcertsupdate", "label": "PlanProductCertsUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/api/Line truncated
|
||||
backend/graphify-out/cache/ast/f93af54f86cff3b3978e255d215dae56b6c3143fef2dee10372d75218627a9ac.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L1"}, {"id": "pl_init_rationale_1", "label": "\u8fd0\u8f93\u8ba1\u5212\u7ba1\u7406 - Pydantic Schema", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_base_data", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_plan", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L33", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_transport", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L49", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_freight", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L62", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_inventory", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L74", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "target": "app_schemas_pl_vehicle_recharge", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L93", "weight": 1.0}, {"source": "pl_init_rationale_1", "target": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_init_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
|
||||
backend/graphify-out/cache/ast/feb22a19a00aac9f50f1163b1e13dd82c63ed48725a338609d99a791aa207225.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "label": "plan.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L1"}, {"id": "pl_plan_planproductbase", "label": "PlanProductBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L13"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "pl_plan_planproductcreate", "label": "PlanProductCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L42"}, {"id": "pl_plan_planproductupdate", "label": "PlanProductUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L46"}, {"id": "pl_plan_planproductread", "label": "PlanProductRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L67"}, {"id": "pl_plan_planbase", "label": "PlanBase", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L81"}, {"id": "pl_plan_plancreate", "label": "PlanCreate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L117"}, {"id": "pl_plan_plantransportcreateblock", "label": "PlanTransportCreateBlock", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L123"}, {"id": "pl_plan_planupdate", "label": "PlanUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L137"}, {"id": "pl_plan_planread", "label": "PlanRead", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L173"}, {"id": "pl_plan_planwithproducts", "label": "PlanWithProducts", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L196"}, {"id": "pl_plan_createfromcontractrequest", "label": "CreateFromContractRequest", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L205"}, {"id": "pl_plan_plancreatefull", "label": "PlanCreateFull", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L213"}, {"id": "pl_plan_planlistquery", "label": "PlanListQuery", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L224"}, {"id": "pl_plan_planproductcertitem", "label": "PlanProductCertItem", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L239"}, {"id": "pl_plan_planproductcertsupdate", "label": "PlanProductCertsUpdate", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L246"}, {"id": "pl_plan_planarchiveproductitem", "label": "PlanArchiveProductItem", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L251"}, {"id": "pl_plan_planarchivefreightblock", "label": "PlanArchiveFreightBlock", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L257"}, {"id": "pl_plan_planarchivebody", "label": "PlanArchiveBody", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L268"}, {"id": "pl_plan_planlistresponse", "label": "PlanListResponse", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L274"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L2", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "decimal", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L3", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_backend_app_schemas_pl_plan_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/backend/app/schemas/pl/plan.py", "source_location": "L4", "weight": Line truncated
|
||||
+1
-1
@@ -1 +1 @@
|
||||
{"/Users/zlwu/work/00code/shanxia2.0/backend/start-prod.sh":{"size":7357,"mtime_ns":1782639355476060453,"hash":"ca89869446be74a2bf2367b3b28f448580220859a39a84ad9613ac5fe35a8433"},"/Users/zlwu/work/00code/shanxia2.0/backend/start.sh":{"size":9548,"mtime_ns":1780114661446983244,"hash":"4d632863e8a0cd81194b491d83a0218a4157435ae812dec76a6f6197b4d48e57"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/__init__.py":{"size":21,"mtime_ns":1780113982281973984,"hash":"60a04ff08fd97084e83ea809fd13feda6d2848be20ebf309e31fc1dad7523230"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py":{"size":5354,"mtime_ns":1782225346624994084,"hash":"8b3d7c4c4488acc6afcfb1a01ea5c6a406ac9d865048233d7e7c6dfdbe793f9c"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/tasks/__init__.py":{"size":1953,"mtime_ns":1780805101147405418,"hash":"d2a416ff9daedad88780cbe3f14ea75e8299044f8787afb60e731f43963dc405"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py":{"size":8744,"mtime_ns":1780201410112435240,"hash":"df84858ae3cea547e5ae0174a2ee76cd4df8835f4b75827843369e74ea91098b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto.py":{"size":1870,"mtime_ns":1780108930724444498,"hash":"c04b748aea86890a5971f749523c7b17dbad1ddd6f9f7f07a5679d159c984e33"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/login_crypto.py":{"size":3858,"mtime_ns":1780108930725155710,"hash":"b82d51afabf2293a9cb1fb2e5f994c383948e7f47ea95fe674686b4f3f3342b1"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py":{"size":5986,"mtime_ns":1782699344763599646,"hash":"668f03c045389bfc6a59f72192d8d77b2097dddc6ba6a65e1bc42610d88cc976"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/wechat_pay.py":{"size":23585,"mtime_ns":1780108930725768130,"hash":"3d52265ce65d21e7103f94afa1e8547aee0823b5ea6d65c50317436ac81fb4fc"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_request_log_middleware.py":{"size":11971,"mtime_ns":1782701669198208175,"hash":"0b84c32828939e6102bb3647691fa8f04b1f68e0e0e9f28127374cc44e19a11c"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py":{"size":1173,"mtime_ns":1780108930724965209,"hash":"8c45b5a56110164f2488c9c8db27db62fe77f0997cf22c53991c0bd1dde2043a"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/security.py":{"size":728,"mtime_ns":1780108930725470004,"hash":"df0f01115064f7b8de1c81dbe9a6db39360c236610b68c33b3234a51d7f0025b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/request_payload.py":{"size":2842,"mtime_ns":1780108930725350836,"hash":"e9937151530ab1417ef297aef59111977725cf90be2a8fa76c00a0618789aba0"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/__init__.py":{"size":61,"mtime_ns":1780108930724312414,"hash":"3dd1842ee59b0c804176b03b4b8a323bd4a252b7feb1bbc32db64f3a8928570e"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/response.py":{"size":1824,"mtime_ns":1780108930725412462,"hash":"f1739352d65ea8287d76e282a59553aa8d63c97e35764c64ac378aa5bd9c347e"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/menu_guard.py":{"size":1611,"mtime_ns":1780108930725223002,"hash":"3e26077288c3620a4780038b891a326206b45bffe00aca545bdae30172487235"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_collation.py":{"size":548,"mtime_ns":1780108930725025043,"hash":"0c680e25a18244ca839a7de6ed1f4313b33bc8da118d89c463aee1b6af00c6f9"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/context.py":{"size":421,"mtime_ns":1780108930724824458,"hash":"83a10aee67162374993c10a30bf8bb8bd9c4b35cf48f42c832415ccebd91660f"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/utils.py":{"size":1498,"mtime_ns":1780108930725607296,"hash":"09323693661c1d4560458b86a954128ccff82bbaf6522da0b44f24da99ddf9ea"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/storage.py":{"size":13209,"mtime_ns":1780108930725541087,"hash":"c3138253eb34f65b09f4436e037fb3179d947f84d3b5fef007ed9a8e3bb135ee"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/order_status_compat.py":{"size":2828,"mtime_ns":1780108930725284669,"hash":"5349e5a0745ee6734c4a995337779307adefc46f453906171988a77de2081540"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/exceptions.py":{"size":4946,"mtime_ns":1780108930725084335,"hash":"79c997d964bca1a4f12f2b92fb1f181fdb9e2b3cf72eae39f4cc164d23794fd7"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/data_scope.py":{"size":8043,"mtime_ns":1782648925694296304,"hash":"626dff86937e5cacec634ecbc61cd53d3763d760223a1d4ec7cd11f64e59a220"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/admin_request_json.py":{"size":2669,"mtime_ns":1780108930724378914,"hash":"4f68b3cf84291e7bddad6ecf4bb4d29ca5e1ec246a9f7f9c4cf5909d0ec1174a"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py":{"size":11243,"mtime_ns":1780108930724537332,"hash":"0c2045d182138ec8e333356d36d418004a53948e2eda494cd419a36365ebbfae"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/wechat_message.py":{"size":11194,"mtime_ns":1780108930725684255,"hash":"5086070deb14d99d1a69e419b2299ec4Line truncated
|
||||
{"/Users/zlwu/work/00code/shanxia2.0/backend/start-prod.sh":{"size":7357,"mtime_ns":1782639355476060453,"hash":"ca89869446be74a2bf2367b3b28f448580220859a39a84ad9613ac5fe35a8433"},"/Users/zlwu/work/00code/shanxia2.0/backend/start.sh":{"size":9548,"mtime_ns":1780114661446983244,"hash":"4d632863e8a0cd81194b491d83a0218a4157435ae812dec76a6f6197b4d48e57"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/__init__.py":{"size":21,"mtime_ns":1780113982281973984,"hash":"60a04ff08fd97084e83ea809fd13feda6d2848be20ebf309e31fc1dad7523230"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/main.py":{"size":6280,"mtime_ns":1782790852770448643,"hash":"8f9da799977bee7134d87a26ff8434ac5ef8eabb0b7368dd537eee49ad7fd00b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/tasks/__init__.py":{"size":1953,"mtime_ns":1780805101147405418,"hash":"d2a416ff9daedad88780cbe3f14ea75e8299044f8787afb60e731f43963dc405"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/auth.py":{"size":7457,"mtime_ns":1782790841500516545,"hash":"34bac56e1c2cb6215f4b5fa2dc32d77d4b4abca51428819eebf4afd269cc51cf"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto.py":{"size":1870,"mtime_ns":1780108930724444498,"hash":"c04b748aea86890a5971f749523c7b17dbad1ddd6f9f7f07a5679d159c984e33"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/login_crypto.py":{"size":3858,"mtime_ns":1780108930725155710,"hash":"b82d51afabf2293a9cb1fb2e5f994c383948e7f47ea95fe674686b4f3f3342b1"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/config.py":{"size":6698,"mtime_ns":1782790876685112837,"hash":"9d955a6baa70f78ddfcf29407d9711915a04e59a7f616254d06d25d25e8d0327"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/wechat_pay.py":{"size":23585,"mtime_ns":1780108930725768130,"hash":"3d52265ce65d21e7103f94afa1e8547aee0823b5ea6d65c50317436ac81fb4fc"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_request_log_middleware.py":{"size":11971,"mtime_ns":1782701669198208175,"hash":"0b84c32828939e6102bb3647691fa8f04b1f68e0e0e9f28127374cc44e19a11c"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/database.py":{"size":1510,"mtime_ns":1782790847265601586,"hash":"8bc9c8ae62e2be2c6920036582ba448dfcd1711c41cebb62274ff6bc6ee14b0b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/security.py":{"size":728,"mtime_ns":1780108930725470004,"hash":"df0f01115064f7b8de1c81dbe9a6db39360c236610b68c33b3234a51d7f0025b"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/request_payload.py":{"size":2842,"mtime_ns":1780108930725350836,"hash":"e9937151530ab1417ef297aef59111977725cf90be2a8fa76c00a0618789aba0"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/__init__.py":{"size":61,"mtime_ns":1780108930724312414,"hash":"3dd1842ee59b0c804176b03b4b8a323bd4a252b7feb1bbc32db64f3a8928570e"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/response.py":{"size":1824,"mtime_ns":1780108930725412462,"hash":"f1739352d65ea8287d76e282a59553aa8d63c97e35764c64ac378aa5bd9c347e"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/menu_guard.py":{"size":1611,"mtime_ns":1780108930725223002,"hash":"3e26077288c3620a4780038b891a326206b45bffe00aca545bdae30172487235"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/db_collation.py":{"size":548,"mtime_ns":1780108930725025043,"hash":"0c680e25a18244ca839a7de6ed1f4313b33bc8da118d89c463aee1b6af00c6f9"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/context.py":{"size":421,"mtime_ns":1780108930724824458,"hash":"83a10aee67162374993c10a30bf8bb8bd9c4b35cf48f42c832415ccebd91660f"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/utils.py":{"size":1498,"mtime_ns":1780108930725607296,"hash":"09323693661c1d4560458b86a954128ccff82bbaf6522da0b44f24da99ddf9ea"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/storage.py":{"size":13209,"mtime_ns":1780108930725541087,"hash":"c3138253eb34f65b09f4436e037fb3179d947f84d3b5fef007ed9a8e3bb135ee"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/order_status_compat.py":{"size":2828,"mtime_ns":1780108930725284669,"hash":"5349e5a0745ee6734c4a995337779307adefc46f453906171988a77de2081540"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/exceptions.py":{"size":4946,"mtime_ns":1780108930725084335,"hash":"79c997d964bca1a4f12f2b92fb1f181fdb9e2b3cf72eae39f4cc164d23794fd7"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/data_scope.py":{"size":8043,"mtime_ns":1782648925694296304,"hash":"626dff86937e5cacec634ecbc61cd53d3763d760223a1d4ec7cd11f64e59a220"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/admin_request_json.py":{"size":2669,"mtime_ns":1780108930724378914,"hash":"4f68b3cf84291e7bddad6ecf4bb4d29ca5e1ec246a9f7f9c4cf5909d0ec1174a"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/api_crypto_middleware.py":{"size":10876,"mtime_ns":1782790001926627098,"hash":"b39f128b6612589ea6ac5babd30752e9585b3af07b82bb1ad53c9e3c0d90816f"},"/Users/zlwu/work/00code/shanxia2.0/backend/app/core/wechat_message.py":{"size":11194,"mtime_ns":1780108930725684255,"hash":"5086070deb14d99d1a69e419b2299ec4Line truncated
|
||||
@@ -63,12 +63,12 @@
|
||||
</div>
|
||||
<div id="legend"></div>
|
||||
</div>
|
||||
<div id="stats">4858 nodes · 34385 edges · 139 communities</div>
|
||||
<div id="stats">4973 nodes · 34742 edges · 152 communities</div>
|
||||
</div>
|
||||
<script>
|
||||
const RAW_NODES = [{"id": "start_prod_sh", "label": "start-prod.sh", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "start-prod.sh", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 19}, {"id": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "label": "start-prod.sh script", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "start-prod.sh script", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 10}, {"id": "backend_start_prod_log_info", "label": "log_info()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "log_info()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 8}, {"id": "backend_start_prod_log_warn", "label": "log_warn()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "log_warn()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 10}, {"id": "backend_start_prod_log_error", "label": "log_error()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "log_error()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 8}, {"id": "backend_start_prod_show_help", "label": "show_help()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "show_help()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 2}, {"id": "backend_start_prod_ensure_dirs", "label": "ensure_dirs()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "ensure_dirs()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 3}, {"id": "backend_start_prod_check_python", "label": "check_python()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "check_python()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 6}, {"id": "backend_start_prod_venv_is_usable", "label": "venv_is_usable()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "venv_is_usable()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 3}, {"id": "backend_start_prod_reset_venv", "label": "reset_venv()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "reset_venv()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 4}, {"id": "backend_start_prod_create_venv", "label": "create_venv()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "create_venv()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 5}, {"id": "backend_start_prod_ensure_valid_venv", "label": "ensure_valid_venv()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "ensure_valid_venv()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 7}, {"id": "backend_start_prod_install_dependencies", "label": "install_dependencies()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "install_dependencies()", "community": 72, "community_name": "Community 72",Line truncated
|
||||
const RAW_EDGES = [{"from": "start_prod_sh", "to": "backend_start_prod_check_python", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_create_venv", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_ensure_dirs", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_ensure_valid_venv", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_ensure_venv_and_runtime", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_install_dependencies", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_is_running", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_log_error", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_log_info", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_log_warn", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_reset_venv", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_show_help", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_show_logs", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_start_server", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_status_server", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_stop_server", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_venv_is_usable", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_verify_health", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_start_prod_install_dependencies", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_start_prod_log_error", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_start_prod_log_info", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_start_prod_reset_venv", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_startLine truncated
|
||||
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 106}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 48}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 229}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 173}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 36}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 38}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 64}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 42}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 35}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 41}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 22}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 66}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 85}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 42}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 62}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 31}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 47}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 51}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 50}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 184}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 31}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 101}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 30}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 45}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 88}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 99}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 20}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 59}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 41}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 43}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 44}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 20}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 102}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 59}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 30}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 50}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 31}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 16}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 32}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 35}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 38}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 15}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 26}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 81}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 35}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 23}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 23}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 25}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 17}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 48}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 108}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 171}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 49}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 23}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 18}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 23}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 23}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 21}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 18}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 26}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 11}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 48}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 49}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 51}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 22}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 9}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 17}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 22}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 27}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 26}, {"cid": 70, "color": "#4E7Line truncated
|
||||
const RAW_NODES = [{"id": "start_prod_sh", "label": "start-prod.sh", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "start-prod.sh", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 19}, {"id": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "label": "start-prod.sh script", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "start-prod.sh script", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 10}, {"id": "backend_start_prod_log_info", "label": "log_info()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "log_info()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 8}, {"id": "backend_start_prod_log_warn", "label": "log_warn()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "log_warn()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 10}, {"id": "backend_start_prod_log_error", "label": "log_error()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "log_error()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 8}, {"id": "backend_start_prod_show_help", "label": "show_help()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "show_help()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 2}, {"id": "backend_start_prod_ensure_dirs", "label": "ensure_dirs()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "ensure_dirs()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 3}, {"id": "backend_start_prod_check_python", "label": "check_python()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "check_python()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 6}, {"id": "backend_start_prod_venv_is_usable", "label": "venv_is_usable()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "venv_is_usable()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 3}, {"id": "backend_start_prod_reset_venv", "label": "reset_venv()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "reset_venv()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 4}, {"id": "backend_start_prod_create_venv", "label": "create_venv()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "create_venv()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 5}, {"id": "backend_start_prod_ensure_valid_venv", "label": "ensure_valid_venv()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "ensure_valid_venv()", "community": 72, "community_name": "Community 72", "source_file": "start-prod.sh", "file_type": "code", "degree": 7}, {"id": "backend_start_prod_install_dependencies", "label": "install_dependencies()", "color": {"background": "#E15759", "border": "#E15759", "highlight": {"background": "#ffffff", "border": "#E15759"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "install_dependencies()", "community": 72, "community_name": "Community 72",Line truncated
|
||||
const RAW_EDGES = [{"from": "start_prod_sh", "to": "backend_start_prod_check_python", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_create_venv", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_ensure_dirs", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_ensure_valid_venv", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_ensure_venv_and_runtime", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_install_dependencies", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_is_running", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_log_error", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_log_info", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_log_warn", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_reset_venv", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_show_help", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_show_logs", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_start_server", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_status_server", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_stop_server", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_venv_is_usable", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "backend_start_prod_verify_health", "label": "defines", "title": "defines [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "start_prod_sh", "to": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_start_prod_install_dependencies", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_start_prod_log_error", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_start_prod_log_info", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_start_prod_reset_venv", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "users_zlwu_work_00code_shanxia2_0_backend_start_prod_sh__entry", "to": "backend_startLine truncated
|
||||
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 131}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 24}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 234}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 173}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 43}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 46}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 58}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 42}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 35}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 31}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 40}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 67}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 91}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 45}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 56}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 26}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 31}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 53}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 55}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 27}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 31}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 136}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 38}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 38}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 94}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 30}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 20}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 59}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 65}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 67}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 51}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 20}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 103}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 42}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 29}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 153}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 30}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 15}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 57}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 29}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 38}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 41}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 26}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 24}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 39}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 16}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 23}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 21}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 18}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 21}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 34}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 48}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 63}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 22}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 18}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 113}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 23}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 21}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 18}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 24}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 11}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 59}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 49}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 48}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 18}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 17}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 17}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 20}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 53}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 27}, {"cid": 70, "color": "#4E7Line truncated
|
||||
|
||||
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
|
||||
function esc(s) {
|
||||
|
||||
+7958
-3206
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,25 @@
|
||||
-- =============================================================================
|
||||
-- 运输计划:车辆/人员/证件整包快照字段
|
||||
-- 用途:安排运输时将挂车号、人员摘要及 resource_snapshot JSON 写入计划与运输单
|
||||
-- 适用:MySQL 5.7+,库名以实际环境为准(如 shanxia2.0 门户库)
|
||||
-- 说明:若某列已存在,对应 ALTER 会报 Duplicate column,跳过该条即可
|
||||
-- =============================================================================
|
||||
|
||||
USE `shanxia2.0`;
|
||||
|
||||
-- pl_plan:挂车号、人员摘要、整包快照 JSON
|
||||
ALTER TABLE `pl_plan`
|
||||
ADD COLUMN `trailer_no` varchar(20) DEFAULT NULL COMMENT '挂车号(安排运输时快照)' AFTER `license_plate`;
|
||||
|
||||
ALTER TABLE `pl_plan`
|
||||
ADD COLUMN `personnel_summary` varchar(500) DEFAULT NULL COMMENT '关联人员摘要(安排运输时快照)' AFTER `driver_name`;
|
||||
|
||||
ALTER TABLE `pl_plan`
|
||||
ADD COLUMN `resource_snapshot` text COMMENT '车辆/人员/证件整包快照 JSON' AFTER `personnel_summary`;
|
||||
|
||||
-- pl_transport:挂车号、整包快照 JSON
|
||||
ALTER TABLE `pl_transport`
|
||||
ADD COLUMN `trailer_no` varchar(20) DEFAULT NULL COMMENT '挂车号(安排运输时快照)' AFTER `license_plate`;
|
||||
|
||||
ALTER TABLE `pl_transport`
|
||||
ADD COLUMN `resource_snapshot` text COMMENT '车辆/人员/证件整包快照 JSON' AFTER `driver_phone`;
|
||||
+15
-1
@@ -192,8 +192,11 @@ CREATE TABLE `pl_plan` (
|
||||
`transport_no` varchar(32) DEFAULT NULL COMMENT '运输编号',
|
||||
`vehicle_id` varchar(64) DEFAULT NULL COMMENT '车辆ID',
|
||||
`license_plate` varchar(20) DEFAULT NULL COMMENT '车牌号',
|
||||
`trailer_no` varchar(20) DEFAULT NULL COMMENT '挂车号(安排运输时快照)',
|
||||
`driver_id` varchar(64) DEFAULT NULL COMMENT '司机ID',
|
||||
`driver_name` varchar(100) DEFAULT NULL COMMENT '司机姓名',
|
||||
`personnel_summary` varchar(500) DEFAULT NULL COMMENT '关联人员摘要(安排运输时快照)',
|
||||
`resource_snapshot` text COMMENT '车辆/人员/证件整包快照 JSON',
|
||||
`total_amount` decimal(15,2) NOT NULL DEFAULT 0.00 COMMENT '计划总金额',
|
||||
`freight_amount` decimal(15,2) NOT NULL DEFAULT 0.00 COMMENT '运费合计',
|
||||
`notify_message` text COMMENT '通知信息(标准模板)',
|
||||
@@ -232,7 +235,7 @@ CREATE TABLE `pl_plan_product` (
|
||||
`is_explosive` smallint(6) NOT NULL DEFAULT 0 COMMENT '是否易制爆 0-否 1-是',
|
||||
`is_toxic` smallint(6) NOT NULL DEFAULT 0 COMMENT '是否易制毒 0-否 1-是',
|
||||
`purchase_cert_url` varchar(500) DEFAULT NULL COMMENT '购买证URL',
|
||||
`transport_cert_url` varchar(500) DEFAULT NULL COMMENT '运输证URL',
|
||||
`transport_cert_url` varchar(500) DEFAULT NULL COMMENT '合法使用证明URL',
|
||||
`inbound_estimate_qty` decimal(15,3) DEFAULT NULL COMMENT '入库预估数',
|
||||
`inbound_qty` decimal(15,3) DEFAULT NULL COMMENT '入库数',
|
||||
`inbound_price` decimal(15,4) DEFAULT NULL COMMENT '入库价',
|
||||
@@ -294,9 +297,11 @@ CREATE TABLE `pl_transport` (
|
||||
`transport_no` varchar(32) NOT NULL COMMENT '运输编号 SXYS######',
|
||||
`vehicle_id` varchar(64) DEFAULT NULL COMMENT '车辆ID',
|
||||
`license_plate` varchar(20) DEFAULT NULL COMMENT '车牌号',
|
||||
`trailer_no` varchar(20) DEFAULT NULL COMMENT '挂车号(安排运输时快照)',
|
||||
`driver_id` varchar(64) DEFAULT NULL COMMENT '司机ID',
|
||||
`driver_name` varchar(100) DEFAULT NULL COMMENT '司机姓名',
|
||||
`driver_phone` varchar(32) DEFAULT NULL COMMENT '司机电话',
|
||||
`resource_snapshot` text COMMENT '车辆/人员/证件整包快照 JSON',
|
||||
`carrier_id` varchar(64) DEFAULT NULL COMMENT '承运商ID',
|
||||
`carrier_name` varchar(200) DEFAULT NULL COMMENT '承运商名称',
|
||||
`transport_medium` varchar(100) DEFAULT NULL COMMENT '运输介质',
|
||||
@@ -845,6 +850,15 @@ CREATE TABLE `pl_vehicle_urea_disburse` (
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- =============================================================================
|
||||
-- 增量迁移(已有库执行)
|
||||
-- ALTER TABLE `pl_plan` ADD COLUMN `personnel_summary` varchar(500) DEFAULT NULL COMMENT '关联人员摘要(安排运输时快照)' AFTER `driver_name`;
|
||||
-- ALTER TABLE `pl_plan` ADD COLUMN `trailer_no` varchar(20) DEFAULT NULL COMMENT '挂车号(安排运输时快照)' AFTER `license_plate`;
|
||||
-- ALTER TABLE `pl_plan` ADD COLUMN `resource_snapshot` text COMMENT '车辆/人员/证件整包快照 JSON' AFTER `personnel_summary`;
|
||||
-- ALTER TABLE `pl_transport` ADD COLUMN `trailer_no` varchar(20) DEFAULT NULL COMMENT '挂车号(安排运输时快照)' AFTER `license_plate`;
|
||||
-- ALTER TABLE `pl_transport` ADD COLUMN `resource_snapshot` text COMMENT '车辆/人员/证件整包快照 JSON' AFTER `driver_phone`;
|
||||
-- =============================================================================
|
||||
|
||||
-- =============================================================================
|
||||
-- DDL 完成
|
||||
-- 共计 22 张表(含 pl_cert;pl_driver 已由 pl_personnel 替代)
|
||||
|
||||
@@ -2887,7 +2887,7 @@ CREATE TABLE `pl_plan_product` (
|
||||
`is_explosive` smallint(6) NOT NULL DEFAULT '0' COMMENT '是否易制爆 0-否 1-是',
|
||||
`is_toxic` smallint(6) NOT NULL DEFAULT '0' COMMENT '是否易制毒 0-否 1-是',
|
||||
`purchase_cert_url` varchar(500) DEFAULT NULL COMMENT '购买证URL',
|
||||
`transport_cert_url` varchar(500) DEFAULT NULL COMMENT '运输证URL',
|
||||
`transport_cert_url` varchar(500) DEFAULT NULL COMMENT '合法使用证明URL',
|
||||
`inbound_estimate_qty` decimal(15,3) DEFAULT NULL COMMENT '入库预估数',
|
||||
`inbound_qty` decimal(15,3) DEFAULT NULL COMMENT '入库数',
|
||||
`inbound_price` decimal(15,4) DEFAULT NULL COMMENT '入库价',
|
||||
@@ -9062,7 +9062,7 @@ INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `co
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('PL_PLAN_ARCHIVE_A', '归档', 'PL_PLAN_ARCHIVE', 'F', '', '', 'pl:plan-archive:archive', 1, '1', '1', 'shanxia2.0', 3, NULL, 'system', '', '2026-06-25 06:14:17', NULL, '2026-06-25 06:14:17', 0);
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('PL_PLAN_ARCHIVE_E', '编辑', 'PL_PLAN_ARCHIVE', 'F', '', '', 'pl:plan-archive:edit', 1, '1', '1', 'shanxia2.0', 2, NULL, 'system', '', '2026-06-25 06:14:17', NULL, '2026-06-25 06:14:17', 0);
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('PL_PLAN_ARCHIVE_Q', '查询', 'PL_PLAN_ARCHIVE', 'F', '', '', 'pl:plan-archive:query', 1, '1', '1', 'shanxia2.0', 1, NULL, 'system', '', '2026-06-25 06:14:17', NULL, '2026-06-25 06:14:17', 0);
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('PL_PLAN_CERT', '危化品证上传', 'PL_MENU_ROOT', 'C', 'plan-cert', 'pl/plan-cert/index', 'pl:plan-cert:list', 1, '1', '1', 'shanxia2.0', 12, '危化品购买证/运输证上传', 'system', '', '2026-06-20 18:18:10', NULL, '2026-06-25 06:14:17', 0);
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('PL_PLAN_CERT', '危化品证上传', 'PL_MENU_ROOT', 'C', 'plan-cert', 'pl/plan-cert/index', 'pl:plan-cert:list', 1, '1', '1', 'shanxia2.0', 12, '危化品购买证/合法使用证明上传', 'system', '', '2026-06-20 18:18:10', NULL, '2026-06-25 06:14:17', 0);
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('PL_SELF_VEHICLE', '山峡自有车辆', 'PL_MENU_ROOT', 'C', 'self-vehicle', 'pl/self-vehicle/index', 'pl:self-vehicle:list', 1, '1', '1', 'shanxia2.0', 2, '展示全部自有类型车辆', 'system', '', '2026-06-20 08:07:00', NULL, '2026-06-28 16:01:18', 0);
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('PL_TRANSPORT', '运输管理', 'PL_MENU_ROOT', 'C', 'transport', 'pl/transport/index', 'pl:transport:list', 1, '0', '1', 'shanxia2.0', 20, NULL, 'system', '', '2026-06-11 05:17:13', NULL, '2026-06-20 21:42:04', 0);
|
||||
INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`, `is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES ('PL_VEH_MAINT_APPLY', '车辆维保申请', 'PL_MENU_ROOT', 'C', 'vehicle-maintenance-apply', 'pl/vehicle-maintenance-apply/index', 'pl:vehicle-maintenance-apply:list', 1, '1', '1', 'shanxia2.0', 33, NULL, 'system', '', '2026-06-29 09:02:16', NULL, '2026-06-29 09:13:01', 0);
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
# Fresh Mint 内容区 UI 对齐(Step 0 + Step 1)
|
||||
|
||||
> 基准项目:zkxw/web-admin(中科兴皖)
|
||||
> 目标项目:shanxia2.0/web-admin(山峡化工)
|
||||
> 日期:2026-06-29
|
||||
|
||||
## 改造边界(硬约束)
|
||||
|
||||
| 允许 | 禁止 |
|
||||
|------|------|
|
||||
| `src/assets/styles/core/*.scss` 内容区相关段落 | 修改 `views/**/*.vue` 的 `<script>` |
|
||||
| 可选 `main.ts` 一行全局表格 border 默认值 | 修改 API、路由、权限、校验逻辑 |
|
||||
| 文档与验收清单 | 替换 Portal 布局壳层、侧栏结构 |
|
||||
| 保留 shanxia 四列 ViewKvGrid、Portal 顶栏 | 整文件覆盖 `app.scss`(避免 bx/db/Portal 冲突) |
|
||||
|
||||
**客户要求**:只影响 UI 样式,不影响功能。
|
||||
|
||||
## 对照页(Step 0 基线)
|
||||
|
||||
| 模块 | 路径 | Hash 示例 |
|
||||
|------|------|-----------|
|
||||
| 系统 | `views/system/user/index.vue` | 用户管理 |
|
||||
| CRM | `views/crm/customer/index.vue` | 客户管理 |
|
||||
| PL | `views/pl/plan/index.vue` | 运输计划 |
|
||||
| 报销 | `views/bx/reimburse/apply/index.vue` | 报销申请 |
|
||||
| 地磅 | `views/db/weighing/index.vue` | 过磅记录 |
|
||||
|
||||
## 功能回归清单(每模块抽 1 页)
|
||||
|
||||
- [ ] 列表:查询、重置、分页、排序、多选
|
||||
- [ ] 新增/编辑:弹窗打开、校验、保存、关闭
|
||||
- [ ] 删除/批量:确认框、成功提示
|
||||
- [ ] 查看详情:字段完整、附件预览/下载
|
||||
- [ ] 权限:无权限按钮仍隐藏/禁用
|
||||
|
||||
## Step 1 改动范围
|
||||
|
||||
| 文件 | 改动说明 |
|
||||
|------|----------|
|
||||
| `fresh-mint-tokens.scss` | 补 `--mint-success-*`、`--primary` 别名;保留 `--mint-text-placeholder` |
|
||||
| `el-ui.scss` | 恢复 secondary/表头 muted 层次;同步 primary light 色阶 |
|
||||
| `el-light.scss` | success base 与 zkxw 对齐 `#059669` |
|
||||
| `app.scss` | 移除「消除 muted 灰字」;补筛选 label 11px;补弹窗遮罩顶对齐兜底 |
|
||||
| `main.ts` | **不改**(两项目均为 `ElTable border: true`,避免额外变量) |
|
||||
|
||||
## Step 1b:Portal 顶栏 / 侧栏 / WorkTab(2026-06-29 补充)
|
||||
|
||||
| 文件 | 改动说明 |
|
||||
|------|----------|
|
||||
| `views/index/style.portal.scss` | 顶栏高度 72px → **56px**(与 zkxw 一致) |
|
||||
| `art-portal-header/index.vue` | 56px、品牌区分隔线、标题 16px/700 |
|
||||
| `art-portal-top-nav/index.vue` | 一级模块卡片对齐 `ArtMixedMenu`(48px 高、实心绿选中) |
|
||||
| `art-sidebar-menu/theme.scss` | 与 zkxw 同步:muted 菜单字、选中实心绿底白字、子菜单竖线 |
|
||||
| `art-sidebar-menu/style.scss` | 侧栏右边框 Mint、长菜单名省略 |
|
||||
| `art-work-tab/index.vue` | WorkTab 底 padding 与 zkxw 对齐(4px) |
|
||||
| `app.scss` | Portal 顶栏 / 侧栏 / WorkTab 全局兜底 |
|
||||
|
||||
## Step 1 验收(视觉)
|
||||
|
||||
- 筛选区 label 为 11px 次要色(muted)
|
||||
- 表头文字为 muted,正文为主色,层次清晰
|
||||
- 弹窗 `dialog-form-layout` 顶对齐留白、无 backdrop blur
|
||||
- Portal 顶栏/侧栏外观与改前一致
|
||||
|
||||
## 后续(Step 2+,本次不做)
|
||||
|
||||
- 页面级 `title-bar-heading`、`:loading` 补齐
|
||||
- bx/db 模块样式收敛
|
||||
- Demo 模板页从 zkxw 拷贝
|
||||
@@ -0,0 +1,295 @@
|
||||
# shanxia2.0 Fresh Mint UI 对齐 — 总改造计划
|
||||
|
||||
> **基准**:zkxw/web-admin(中科兴皖)
|
||||
> **目标**:shanxia2.0/web-admin(山峡化工)
|
||||
> **日期**:2026-06-29
|
||||
> **客户要求**:只改 UI,不影响功能;Portal 顶栏一级 + 左侧二三级菜单结构不变
|
||||
|
||||
---
|
||||
|
||||
## 一、背景与目标
|
||||
|
||||
两项目同源(Fresh Mint + Art Design Pro),shanxia 使用 **Portal 布局**(`MenuTypeEnum.PORTAL`),zkxw 使用 **TOP_LEFT + ArtMixedMenu**。交互与视觉应对齐 zkxw,壳层组件不同但 Token、内容区骨架一致。
|
||||
|
||||
**视觉权威**:`docs/web-admin-ui-spec-fresh-mint.md`
|
||||
**模式选型**:`docs/web-admin-ui-pattern-index.md`(P01–P27)
|
||||
|
||||
---
|
||||
|
||||
## 二、改造边界(硬约束)
|
||||
|
||||
| 允许 | 禁止 |
|
||||
|------|------|
|
||||
| 全局 SCSS(`assets/styles/core/*.scss`) | 修改业务 `<script>` 逻辑 |
|
||||
| Vue template 的 class / 属性 / 结构骨架 | 改 API、路由、权限、校验 |
|
||||
| Portal 壳层样式微调(高度、颜色、WorkTab) | 替换 Portal 布局架构 |
|
||||
| 从 zkxw 拷贝 Demo 模板页 | 整文件覆盖 `app.scss` |
|
||||
| 文档与验收清单 | 跨端混色(web 勿用 `#0a9f6d`) |
|
||||
|
||||
**shanxia 保留项**(优于 zkxw,勿回退):
|
||||
- `SystemViewDialog` 四列 `ViewKvGrid`
|
||||
- Portal 顶栏 + 侧栏交互结构
|
||||
|
||||
---
|
||||
|
||||
## 三、进度总览
|
||||
|
||||
```
|
||||
Step 0 基线文档与对照页 ✅ 已完成
|
||||
Step 1 全局 SCSS + Portal 壳层 ✅ 已完成
|
||||
Step 1b WorkTab 最多 10 个标签 ✅ 已完成
|
||||
Step 2 分模块 class 补齐 ✅ 已完成
|
||||
Step 3 bx/db 模块样式收敛 ✅ 2026-06-29
|
||||
Step 4 Demo 模板页 + 路由 ✅ 已完成
|
||||
Step 5 CRM 旧布局整页改造 ✅ 已完成
|
||||
Step 6 详情/统计/看板页查漏 ✅ 2026-06-29
|
||||
Step 7 全量回归与收尾 ✅ 2026-06-29
|
||||
```
|
||||
|
||||
**关联文档**:
|
||||
|
||||
| 文档 | 用途 |
|
||||
|------|------|
|
||||
| `2026-06-29-fresh-mint-content-ui-step0-1.md` | Step 0/1 改动明细与回归清单 |
|
||||
| `2026-06-29-fresh-mint-step2-module-plan.md` | Step 2 逐页勾选表(执行中更新) |
|
||||
|
||||
---
|
||||
|
||||
## 四、各 Step 详细说明
|
||||
|
||||
### Step 0 — 基线文档 ✅
|
||||
|
||||
**产出**:对照页、功能回归清单、改造边界
|
||||
**对照页**(每模块抽 1 页视觉 + 功能基准):
|
||||
|
||||
| 模块 | 路径 |
|
||||
|------|------|
|
||||
| 系统 | `views/system/user/index.vue` |
|
||||
| CRM | `views/crm/customer/index.vue` |
|
||||
| PL | `views/pl/plan/index.vue` |
|
||||
| 报销 | `views/bx/reimburse/apply/index.vue` |
|
||||
| 地磅 | `views/db/weighing/index.vue` |
|
||||
|
||||
---
|
||||
|
||||
### Step 1 — 全局 SCSS + Portal 壳层 ✅
|
||||
|
||||
**已改文件**:
|
||||
|
||||
| 文件 | 要点 |
|
||||
|------|------|
|
||||
| `fresh-mint-tokens.scss` | `--primary` 别名、`--mint-success-*` |
|
||||
| `el-light.scss` / `el-ui.scss` | success `#059669`、表头 muted、primary 色阶 |
|
||||
| `app.scss` | 筛选 label 11px、弹窗顶对齐、Portal 兜底 |
|
||||
| `style.portal.scss` | 顶栏 56px |
|
||||
| `art-portal-header` / `art-portal-top-nav` | 一级模块卡片样式 |
|
||||
| `art-sidebar-menu/theme.scss` | 选中绿底白字 |
|
||||
| `art-work-tab/index.vue` | padding 对齐 |
|
||||
|
||||
**未改**:`main.ts` 的 `ElTable border: true`(与 zkxw 一致)
|
||||
|
||||
---
|
||||
|
||||
### Step 1b — WorkTab 上限 ✅
|
||||
|
||||
**文件**:`store/modules/worktab.ts`
|
||||
**规则**:`MAX_OPEN_TABS = 10`;新开前淘汰最早**未固定** tab;全固定且满 10 则拒绝新开。
|
||||
|
||||
---
|
||||
|
||||
### Step 2 — 分模块 class 补齐 ✅(基本完成)
|
||||
|
||||
**原则**:只改 template;不改 script。
|
||||
|
||||
**单页检查清单**(每改一页勾选):
|
||||
|
||||
- [ ] `h2.title-bar-heading`(列表主标题竖条)
|
||||
- [ ] 筛选搜索/重置 `:loading="loading"`
|
||||
- [ ] 工具栏「已选 N 项」置前;批量操作带 `<el-icon>`
|
||||
- [ ] 状态/类型列 `<el-tag size="small">`
|
||||
- [ ] 弹窗 `dialog-form-layout` + `label-position="top"`
|
||||
- [ ] 操作列 `fixed="right"`,min-width ≥ 260px
|
||||
- [ ] 表格列用 `min-width` 而非 `width`
|
||||
|
||||
**模块完成情况**:
|
||||
|
||||
| 模块 | 页面数 | 状态 | 备注 |
|
||||
|------|--------|------|------|
|
||||
| system | 14 | ✅ | tenant~workflow 全部完成 |
|
||||
| CRM 列表 | 10 | ✅ | 见 Step 5 遗留 3 页 |
|
||||
| bx | 12 | ✅ | 此前已对齐 |
|
||||
| db | 4 | ✅ | plans/inventory/weighing/dashboard |
|
||||
| PL | 17+ | ✅ | 含 freight 子 Panel |
|
||||
|
||||
**Step 2 遗留**(转入 Step 5/6):
|
||||
|
||||
| 路径 | 原因 |
|
||||
|------|------|
|
||||
| `crm/contract/template/index.vue` | 旧 RuoYi `app-container` + `el-card` |
|
||||
| `crm/contract/change/index.vue` | 同上 |
|
||||
| `crm/contract/approval/index.vue` | 同上 |
|
||||
| `crm/opportunity/kanban.vue` | 旧布局 |
|
||||
| `crm/opportunity/funnel.vue` | 旧布局 |
|
||||
| `crm/opportunity/statistics.vue` | 旧布局 |
|
||||
| `crm/contract/detail.vue` / `form.vue` | 详情/表单页待抽查 |
|
||||
|
||||
---
|
||||
|
||||
### Step 3 — bx / db 模块样式收敛 ✅(2026-06-29)
|
||||
|
||||
**目标**:减少页面私有 SCSS,统一走全局 Token + 模块入口。
|
||||
|
||||
| 序号 | 任务 | 文件 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 3.1 | bx 样式审计 | `src/styles/bx/index.scss` | ✅ 删除 :root/独立 layout/与 app 重复规则,1936→955 行 |
|
||||
| 3.2 | bx 附件样式 | `src/styles/bx/attachment.scss` | ✅ 硬编码色值改 `--primary`/`--text` 等 Token |
|
||||
| 3.3 | db 样式审计 | `src/styles/db-module.scss` | ✅ 统一 `--border`/`--text`/`--surface` |
|
||||
| 3.4 | 页面 scoped 清理 | `views/bx/**/*.vue` | ✅ reimburse/apply、payment、reimburse/approve |
|
||||
| 3.5 | 页面 scoped 清理 | `views/db/**/*.vue` | ✅ 无 scoped/硬编码色(已确认) |
|
||||
|
||||
**附带**:`fresh-mint-tokens.scss` 补充 `--text`/`--border`/`--danger` 等 bx/db 语义别名,修复 bx 原 `--text-muted: #1e293b` 错误。
|
||||
|
||||
---
|
||||
|
||||
## Step 4 — Demo 模板页 + 路由 ✅(2026-06-29)
|
||||
|
||||
| 序号 | 项 | 状态 |
|
||||
|------|-----|------|
|
||||
| 4.1 | 工作台 `/#/demo/console` | ✅ |
|
||||
| 4.2 | 标准列表 `views/demo/unit/index.vue` | ✅ |
|
||||
| 4.3 | 复杂列表 `views/demo/order/index.vue` | ✅ |
|
||||
| 4.4 | 商品 `views/demo/product/index.vue` | ✅ |
|
||||
| 4.5 | 树形分类 `views/demo/category/index.vue` | ✅ |
|
||||
| 4.6 | 用户 CRUD → `/demo/user`(复用 `system/user`) | ✅ |
|
||||
| 4.7 | `product-view-dialog` 组件 | ✅ |
|
||||
| 4.8 | 路由 `router/modules/demo.ts` | ✅ |
|
||||
| 4.9 | Mock API `api/demo/*`(无后端) | ✅ |
|
||||
|
||||
**说明**:Demo 数据走 `src/api/demo/mock-api.ts` 内存 Mock;侧栏「Demo」菜单在 `VITE_ACCESS_MODE=frontend` 下自动可见。
|
||||
|
||||
---
|
||||
|
||||
### Step 5 — CRM 旧布局整页改造 ✅(2026-06-29)
|
||||
|
||||
| 页面 | 路径 | 状态 |
|
||||
|------|------|------|
|
||||
| 合同模板 | `views/crm/contract/template/index.vue` | ✅ |
|
||||
| 合同审批记录 | `views/crm/contract/approval/index.vue` | ✅ |
|
||||
| 合同变更 | `views/crm/contract/change/index.vue` | ✅ |
|
||||
|
||||
**改造要点**:`page-container` 骨架、Fresh Mint 筛选/工具栏/表格/分页、弹窗 `dialog-form-layout`、状态 `el-tag`、按钮带图标与 loading;业务逻辑与权限保持不变。
|
||||
|
||||
---
|
||||
|
||||
### Step 6 — 详情 / 统计 / 看板页查漏 ✅(2026-06-29)
|
||||
|
||||
| 类型 | 页面 | 状态 |
|
||||
|------|------|------|
|
||||
| 看板 | `crm/opportunity/kanban.vue` | ✅ Fresh Mint 筛选 + 看板 Token |
|
||||
| 漏斗 | `crm/opportunity/funnel.vue` | ✅ stat-grid + chart-panel + 薄荷色 ECharts |
|
||||
| 统计 | `crm/opportunity/statistics.vue` | ✅ 对齐 `clue/statistics` 骨架 |
|
||||
| 详情 | `crm/contract/detail.vue` | ✅ panel-top + detail-toolbar 外壳 |
|
||||
| 表单 | `crm/contract/form.vue` | ✅ panel-top 外壳 |
|
||||
| 报价 | `crm/quote/detail.vue`、`form.vue` | ✅ 已是 Mint(Step 2 前已改造) |
|
||||
| PL | `pl/plan/detail.vue`、`form.vue` | ✅ 已是 Mint(无需改动) |
|
||||
|
||||
---
|
||||
|
||||
### Step 7 — 全量回归与收尾 ✅(2026-06-29)
|
||||
|
||||
| 序号 | 任务 | 状态 |
|
||||
|------|------|------|
|
||||
| 7.1 | 功能回归清单(见第六节) | ✅ 代码审查 + 模块抽测路径已列 |
|
||||
| 7.2 | 浏览器抽测 1366 / 1920 / 窄屏 | ⬜ 需人工在浏览器完成(见下表) |
|
||||
| 7.3 | `pnpm build` | ✅ 通过(修复 `category-path-display` → `@/api/demo` 导入) |
|
||||
| 7.4 | `step2-module-plan.md` | ✅ 各模块均已 ✅ |
|
||||
| 7.5 | `./scripts/update-graph.sh all` | ✅ |
|
||||
| 7.6 | OpenSpec 归档 | ⬜ 可选,未执行 |
|
||||
|
||||
**构建修复**:`utils/category-path-display.ts` 原从 `@/api/admin` 导入 Demo 专用 `fetchCategoryList`(Step 4 已迁至 `api/demo`),导致 Vite build 失败;已改为 `@/api/demo`。
|
||||
|
||||
**ESLint**:`pnpm lint` 仍有大量历史 Prettier/未使用变量告警(非本次 Fresh Mint 引入);`pnpm build` 为发布门禁,已通过。
|
||||
|
||||
**建议浏览器抽测路径(每模块 1 页)**:
|
||||
|
||||
| 模块 | Hash 路由 | 验证点 |
|
||||
|------|-----------|--------|
|
||||
| Demo | `/#/demo/unit` | 列表 CRUD、弹窗两列、分页 |
|
||||
| system | `/#/demo/user` | 多选、批量删除、权限按钮 |
|
||||
| CRM | `/#/crm/customer` | 筛选 loading、Tag 状态 |
|
||||
| CRM 看板 | `/#/crm/opportunity/kanban` | 看板滚动、卡片操作 |
|
||||
| bx | `/#/bx/expense-item` | stats + 列表 + 弹窗 |
|
||||
| db | `/#/db/weighing` | 日期快捷、表格 |
|
||||
| PL | `/#/pl/plan` | 工具栏、操作列 fixed |
|
||||
| WorkTab | 任意模块连开 11 页 | 最早未固定 tab 自动关闭 |
|
||||
|
||||
---
|
||||
|
||||
## 五、推荐执行顺序(给后续会话)
|
||||
|
||||
按**风险低 → 价值高**排列,每次会话完成 1~2 个 Step 或一个批次:
|
||||
|
||||
```
|
||||
已完成 Step 0 → Step 1 → Step 1b → Step 2(列表页)
|
||||
下一步 Step 4(Demo 模板,利于后续新页开发)
|
||||
然后 Step 5.1 → 5.2 → 5.3(CRM 三页)
|
||||
并行 Step 3(bx/db SCSS,可与 Step 5 交错)
|
||||
随后 Step 6(看板/统计/详情)
|
||||
最后 Step 7(全量回归)
|
||||
```
|
||||
|
||||
**单次会话建议粒度**:
|
||||
- 小:1 个 index.vue 的 Step 2 清单项
|
||||
- 中:Step 5 中 1 个整页改造 + 回归
|
||||
- 大:Step 4 全部 Demo 页(建议拆 2 次)
|
||||
|
||||
---
|
||||
|
||||
## 六、功能回归清单(每模块至少 1 页)
|
||||
|
||||
改造后必测(Step 7 代码审查已覆盖结构;浏览器勾选由人工完成):
|
||||
|
||||
- [x] 列表:查询、重置、分页、排序、多选(各模块模板页已对齐)
|
||||
- [x] 新增/编辑:弹窗 `dialog-form-layout`、按钮图标(Step 2/5/6)
|
||||
- [x] 删除/批量:确认框 + 创建人限制工具(`creator-delete` 已接入)
|
||||
- [x] 查看详情:Tag 语义色(OpenSpec ui-conventions)
|
||||
- [x] 权限:`hasPermi` / `hasContractPerm` 等业务守卫保留
|
||||
- [x] WorkTab:`MAX_OPEN_TABS = 10`(`store/modules/worktab.ts`)
|
||||
- [ ] 浏览器实机:1366 / 1920 / 窄屏弹窗单列降级
|
||||
|
||||
---
|
||||
|
||||
## 七、风险与注意事项
|
||||
|
||||
1. **勿整文件覆盖 `app.scss`**:shanxia 含 bx/db/Portal 专用段落,仅 cherry-pick。
|
||||
2. **creator-delete 合并**:批量删除注意 `handleDelete` 函数体 `{` 勿漏(曾出现语法错误)。
|
||||
3. **双 loading 变量**:bx 部分页用 `searchLoading` / `pendingLoading`,保持一致即可。
|
||||
4. **CRM 合同子页**:改造时保留 `hasContractPerm` 权限判断。
|
||||
5. **graphify**:改 Vue/SCSS 后执行 `./scripts/update-graph.sh frontend`。
|
||||
|
||||
---
|
||||
|
||||
## 八、快速命令
|
||||
|
||||
```bash
|
||||
# 前端开发
|
||||
cd web-admin && pnpm dev
|
||||
|
||||
# 构建验证
|
||||
cd web-admin && pnpm build
|
||||
|
||||
# 更新知识图谱
|
||||
cd /Users/zlwu/work/00code/shanxia2.0 && ./scripts/update-graph.sh frontend
|
||||
|
||||
# 对照 zkxw 同路径文件
|
||||
diff web-admin/src/views/pl/plan/index.vue ../zkxw/web-admin/src/views/pl/plan/index.vue
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 九、变更记录
|
||||
|
||||
| 日期 | 内容 |
|
||||
|------|------|
|
||||
| 2026-06-29 | Step 7:`pnpm build` 通过;graphify all;修复 category-path-display 导入 |
|
||||
| 2026-06-29 | Step 2 system/CRM/bx/db/PL 列表页 class 补齐 |
|
||||
@@ -0,0 +1,95 @@
|
||||
# Fresh Mint Step 2 — 分模块页面 class 补齐计划
|
||||
|
||||
> 前置:Step 0 + Step 1 已完成(全局 SCSS + Portal 壳层 + WorkTab 上限)
|
||||
> **总计划**:见 [`2026-06-29-fresh-mint-master-plan.md`](./2026-06-29-fresh-mint-master-plan.md)
|
||||
|
||||
## 改造原则
|
||||
|
||||
- **只改 template 中的 class / 属性**,不改 `<script>` 业务逻辑
|
||||
- 对齐 zkxw 模板页(如 `pl/plan/index.vue`)与 Demo 结构
|
||||
- 每完成一个子模块,在本文档勾选并抽测功能回归
|
||||
|
||||
## 单页检查清单
|
||||
|
||||
- [ ] `h2.title-bar-heading`(列表主标题竖条)
|
||||
- [ ] 筛选区搜索/重置 `:loading="loading"`
|
||||
- [ ] 工具栏「已选 N 项」置前;批量删除等带 `<el-icon>`
|
||||
- [ ] 状态列 `el-tag`(如有 status 字段)
|
||||
- [ ] 弹窗已有 `dialog-form-layout`(多数已有,缺则补)
|
||||
- [ ] 操作列 `fixed="right"`
|
||||
|
||||
---
|
||||
|
||||
## 模块 1:system(系统管理)— ✅ 已完成
|
||||
|
||||
| 序号 | 页面 | 路径 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 1.1 | 租户 | `views/system/tenant/index.vue` | ✅ |
|
||||
| 1.2 | 用户 | `views/system/user/index.vue` | ✅ |
|
||||
| 1.3 | 组织 | `views/system/dept/index.vue` | ✅ |
|
||||
| 1.4 | 角色 | `views/system/role/index.vue` | ✅ |
|
||||
| 1.5 | 菜单 | `views/system/menu/index.vue` | ✅ |
|
||||
| 1.6 | 职位 | `views/system/post/index.vue` | ✅ |
|
||||
| 1.7 | 站点 | `views/system/site/index.vue` | ✅ |
|
||||
| 1.8 | 字典 | `views/system/dict/index.vue` | ✅ |
|
||||
| 1.9 | 请假 | `views/system/leave/index.vue` | ✅ |
|
||||
| 1.10 | 操作日志 | `views/system/operlog/index.vue` | ✅ |
|
||||
| 1.11 | 流程定义 | `views/system/workflow/process/index.vue` | ✅ |
|
||||
| 1.12 | 待办 | `views/system/workflow/task-pending/index.vue` | ✅ |
|
||||
| 1.13 | 已办 | `views/system/workflow/task-completed/index.vue` | ✅ |
|
||||
| 1.14 | 我的申请 | `views/system/workflow/my-applications/index.vue` | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 模块 2:CRM — ✅ 已完成
|
||||
|
||||
| 序号 | 页面 | 路径 | 状态 |
|
||||
|------|------|------|------|
|
||||
| 2.1 | 客户 | `views/crm/customer/index.vue` | ✅ |
|
||||
| 2.2 | 线索 | `views/crm/clue/index.vue` | ✅ |
|
||||
| 2.3 | 商机 | `views/crm/opportunity/index.vue` | ✅(此前已有) |
|
||||
| 2.4 | 合同 | `views/crm/contract/index.vue` | ✅(此前已有) |
|
||||
| 2.5 | 报价 | `views/crm/quote/index.vue` | ✅(此前已有) |
|
||||
| 2.6 | 产品 | `views/crm/product/index.vue` | ✅ |
|
||||
| 2.7 | 产品分类 | `views/crm/product-category/index.vue` | ✅ |
|
||||
| 2.8 | 公海池 | `views/crm/customer/pool/index.vue` | ✅ |
|
||||
| 2.9 | 公海规则 | `views/crm/customer/pool/RuleIndex.vue` | ✅ |
|
||||
| 2.10 | 线索统计 | `views/crm/clue/statistics/index.vue` | ✅ |
|
||||
| 2.11 | 合同模板 | `views/crm/contract/template/index.vue` | ✅ Step 5 |
|
||||
| 2.12 | 合同变更 | `views/crm/contract/change/index.vue` | ✅ Step 5 |
|
||||
| 2.13 | 合同审批记录 | `views/crm/contract/approval/index.vue` | ✅ Step 5 |
|
||||
|
||||
---
|
||||
|
||||
## 模块 3:bx(报销)— ✅ 已完成(此前已对齐)
|
||||
|
||||
全部 12 个 `views/bx/**/index.vue` 已有 `title-bar-heading` 与搜索 loading。
|
||||
|
||||
---
|
||||
|
||||
## 模块 4:db(地磅)— ✅ 已完成(此前已对齐)
|
||||
|
||||
`plans` / `inventory` / `weighing` / `dashboard` 均已具备 Fresh Mint 列表骨架。
|
||||
|
||||
---
|
||||
|
||||
## 模块 5:PL — ✅ 已完成(此前已对齐)
|
||||
|
||||
管理端 PL 列表页均已具备 `title-bar-heading` 与 `:loading="loading"`。
|
||||
|
||||
---
|
||||
|
||||
## 模块 6:Step 4 Demo 模板页 — ✅ 已完成
|
||||
|
||||
见 `router/modules/demo.ts`、`views/demo/*`、`api/demo/mock-api.ts`
|
||||
|
||||
---
|
||||
|
||||
## Step 6 补充 — ✅ 已完成(2026-06-29)
|
||||
|
||||
| 页面 | 路径 |
|
||||
|------|------|
|
||||
| 商机看板 | `views/crm/opportunity/kanban.vue` |
|
||||
| 销售漏斗 | `views/crm/opportunity/funnel.vue` |
|
||||
| 商机统计 | `views/crm/opportunity/statistics.vue` |
|
||||
| 合同详情/表单外壳 | `views/crm/contract/detail.vue`、`form.vue` |
|
||||
+397
-307
File diff suppressed because it is too large.
Load diff
@@ -168,17 +168,26 @@ Web 管理端弹窗 SHALL 遵循规范:表单 `label-position="top"`;遮罩
|
||||
|
||||
### Requirement: 表格操作列固定在右侧
|
||||
|
||||
`web-admin` 中所有业务列表页(系统管理、业务模块等,不含 Demo 参考页)的 `el-table` 操作列 SHALL 使用 `fixed="right"` 固定在表格右侧。宽度规则:2 个按钮时 `min-width="260"`,3 个按钮时 `min-width="320"`,4 个及以上按钮时 `min-width="400"`。全局 CSS 通过 `.el-table-fixed-column--right` 选择器(注意:Element Plus 使用单短横线,非双下划线)提供固定列样式。
|
||||
`web-admin` 中**保留操作列**的业务列表页(系统管理、业务模块等,不含 Demo 参考页)的 `el-table` 操作列 SHALL 使用 `fixed="right"` 固定在表格右侧。宽度规则:2 个按钮时 `min-width="260"`,3 个按钮时 `min-width="320"`,4 个及以上按钮时 `min-width="400"`。全局 CSS 通过 `.el-table-fixed-column--right` 选择器(注意:Element Plus 使用单短横线,非双下划线)提供固定列样式。
|
||||
|
||||
**例外**:遵循下文「列表主标识列链接查看与编辑删除外置」、且列表动作仅为常规「编辑」「删除」的标准 CRUD 页 **SHALL NOT** 设置操作列,此时本规则不适用。
|
||||
|
||||
#### Scenario: 新增系统管理列表页
|
||||
|
||||
- **WHEN** 在系统管理模块下新增列表页面(如用户管理、角色管理等)
|
||||
- **WHEN** 在系统管理模块下新增列表页面(如用户管理、角色管理等),且页面保留操作列
|
||||
- **THEN** 表格操作列 SHALL 设置 `fixed="right"`,宽度按按钮数设置:≤ 2 按钮用 `min-width="260"`,3 按钮用 `min-width="320"`,≥ 4 按钮用 `min-width="400"`
|
||||
|
||||
#### Scenario: 标准 CRUD 列表无外置操作列
|
||||
|
||||
- **WHEN** 新增列表页仅含常规「编辑」「删除」,并采用工具栏 + 查看弹窗 Hero 外置模式
|
||||
- **THEN** 表格 **SHALL NOT** 包含 `label="操作"` 列
|
||||
- **THEN** 本「操作列固定右侧」规则 **SHALL NOT** 适用
|
||||
|
||||
#### Scenario: Code review 表格列
|
||||
|
||||
- **WHEN** PR 包含新增或修改的 `el-table-column` 且 `label="操作"`
|
||||
- **THEN** 审查者 SHALL 确认该列包含 `fixed="right"` 属性,且宽度与按钮数量匹配(2 按钮 260px,3+ 按钮 320px)
|
||||
- **THEN** 若页面属于标准 CRUD + 查看弹窗且仅编辑/删除,审查者 SHALL 要求移除外置至工具栏与 `#hero-actions`,而非保留操作列
|
||||
|
||||
### Requirement: 表格列宽使用 min-width 实现等比缩放
|
||||
|
||||
@@ -257,32 +266,57 @@ Web 管理端弹窗 SHALL 遵循规范:表单 `label-position="top"`;遮罩
|
||||
- **WHEN** 新增弹窗表单中的某字段需要辅助说明
|
||||
- **THEN** SHALL 使用 `<template #label>字段名<span class="form-label-tip">注释内容</span></template>` 格式,SHALL NOT 将注释放在输入控件旁
|
||||
|
||||
### Requirement: 列表行查看弹窗(按钮 + 双击)
|
||||
### Requirement: 列表主标识列链接查看与编辑删除外置
|
||||
|
||||
`web-admin` 中**所有** `el-table` 组件——包括主列表页(标准列表、树形列表)、弹窗内嵌列表(如编辑弹窗/查看弹窗/选择弹窗中的子表格)、侧栏面板内的列表——若操作列包含「查看」「查看详情」「查看确认信息」等只读查看类按钮,SHALL 同时提供行双击触发查看的能力,实现规则如下:
|
||||
`web-admin` 中带只读查看弹窗(或等价只读详情态)的 `el-table` 列表页 SHALL 遵循:
|
||||
|
||||
1. **操作列「查看」按钮**:操作列 SHALL 在首位包含一个「查看」按钮(`<el-icon><View /></el-icon>查看`),点击后弹出只读查看弹窗。
|
||||
2. **行双击触发**:`el-table` SHALL 监听 `@row-dblclick` 事件,双击任意行时触发与「查看」按钮相同的弹窗(即调用同一 `handleView(row)` 函数)。
|
||||
3. **条件按钮场景**:当操作列按钮随状态/Tab 变化(如待确认 Tab 显示「确认收款」,已确认 Tab 显示「查看确认信息」),`@row-dblclick` handler SHALL 仅在「查看」类按钮可见时触发对应查看函数,其余状态下可忽略或调用对应主操作函数。
|
||||
4. **弹窗组件**:查看弹窗 SHALL 优先使用 `SystemViewDialog`(`web-admin/src/components/business/system-view-dialog/index.vue`);样式对齐 Hero 渐变头图 + 分区 KV 信息区 + 底部「关闭」按钮(详见下文「查看弹窗 KV 布局与组件选型」)。KV 信息区 SHALL 使用 `ViewKvGrid`(上下堆叠栅格)或 `ViewKvTable`(多组多列表格);**SHALL NOT** 使用 `el-descriptions` 或历史 `.dlg-kv` 布局承载列表行查看详情。
|
||||
5. **字段内容**:查看弹窗 SHALL 展示该行记录的所有业务字段(含状态映射、字典翻译),不展示 `id`、`del_flag` 等技术字段;KV 跨列/换行规则见「查看弹窗 KV 布局与组件选型」。
|
||||
6. **区块标题样式**:查看弹窗中各区块标题(如 `SystemViewDialog` 的 section title、`bx` 模块 `.dlg-view-section-title`,渲染为 `h3`/`h4`)SHALL 与字段标签形成明显视觉区分。区块标题 SHALL 使用深色文字(`#1e293b`)配合左侧主色竖条装饰(`border-left: 3px solid #10b981`),字号 14px、`font-weight: 600`;字段标签 SHALL 为 13px、`#64748b`、`font-weight: 400`(由 `ViewKvGrid` 的 `dt` 或 `ViewKvTable` 的 `th` 统一渲染)。区块标题样式 SHALL NOT 与字段标签使用相同颜色或相近字重。
|
||||
1. **主标识列链接**:承载业务主标识的列(通常为「名称」「单号」「编号」「主题」等,如 `productName`、`customerName`、`orderNo`、`applyCode`、`planNo`)SHALL 使用 `<el-link type="primary">` 包裹展示文案,点击 SHALL 调用打开只读详情的同一函数(如 `handleView(row)`、`openView(row)`、`handleDetail(row)` 等,与 `@row-dblclick` 共用)。
|
||||
2. **操作列去重(查看)**:当主标识列已提供上述链接查看入口时,操作列 **SHALL NOT** 再包含仅用于打开同一只读详情/查看弹窗的「查看」「查看详情」等按钮。
|
||||
3. **编辑/删除外置(标准 CRUD)**:对于列表行级动作**仅含**常规「编辑」「删除」(及同类 CRUD,无审批、状态变更、安排运输等行内复合业务按钮)的标准列表页,表格 **SHALL NOT** 设置「操作」列;「编辑」「删除」SHALL 外置至以下两处:
|
||||
- **列表工具栏**:位于「已选 N 项」与「新增」主按钮(`type="primary"` / `btn-main`)之后;**编辑** SHALL 在 `selectedRows.length === 1` 时可用,点击 SHALL 对选中行调用与行内编辑相同的 handler(如 `handleUpdate(selectedRows[0])`);**删除** SHALL 支持批量删除,在 `selectedRows.length === 0` 时禁用,且 SHALL 复用既有创建人校验(如 `allRowsDeletableByCreator` / `canDeleteByCreator` + `CREATOR_DELETE_TIP`);两按钮 SHALL 使用 `btn-ghost` 描边样式,**SHALL NOT** 与「新增」同列使用主色实心。
|
||||
- **查看弹窗 Hero**:通过 `SystemViewDialog` 的 `#hero-actions` 插槽,在 Hero 区右侧展示「编辑」「删除」,对**当前查看行**执行与列表相同的 handler;删除成功后 SHALL 关闭查看弹窗并刷新列表;从详情进入编辑并保存成功后,若查看弹窗仍打开,SHALL 刷新当前详情数据。
|
||||
4. **操作列保留场景**:存在审批、状态变更、安排运输、复合主操作等**行级、状态依赖**业务按钮的列表页 **SHALL** 保留操作列,并仍遵循「表格操作列固定在右侧」;此类页面 MAY 在 `#hero-actions` 放置通用动作,但 SHOULD 避免与操作列完全重复同一入口。
|
||||
5. **行双击**:`el-table` SHALL 继续绑定 `@row-dblclick`,双击行 SHALL 触发与主标识列链接相同的查看函数。
|
||||
6. **条件按钮场景**:当操作列按钮随状态/Tab 变化(如待确认 Tab 显示「确认收款」,已确认 Tab 显示「查看确认信息」),`@row-dblclick` handler SHALL 仅在「查看」类按钮可见时触发对应查看函数,其余状态下可忽略或调用对应主操作函数。
|
||||
7. **复合主操作例外**:主操作本身为复合业务入口、不仅打开只读弹窗的按钮(如订单「查看/运营」、待办「审批」)SHALL NOT 因本规则被删除;此时仍 SHALL 在主标识列提供链接以打开只读查看/详情。
|
||||
8. **工具栏查看**:列表工具栏中的「查看」类按钮在表格主标识列已提供链接时 **SHALL NOT** 保留;单选后查看 SHALL 改由点击行内主标识链接或双击行触发。
|
||||
9. **弹窗组件与字段**:查看弹窗 SHALL 优先使用 `SystemViewDialog`(`web-admin/src/components/business/system-view-dialog/index.vue`);样式对齐 Hero 渐变头图 + 分区 KV 信息区 + 底部「关闭」按钮(详见下文「查看弹窗 KV 布局与组件选型」)。KV 信息区 SHALL 使用 `ViewKvGrid`(上下堆叠栅格)或 `ViewKvTable`(多组多列表格);**SHALL NOT** 使用 `el-descriptions` 或历史 `.dlg-kv` 布局承载列表行查看详情。查看弹窗 SHALL 展示该行记录的所有业务字段(含状态映射、字典翻译),不展示 `id`、`del_flag` 等技术字段。
|
||||
10. **区块标题样式**:查看弹窗中各区块标题 SHALL 与字段标签形成明显视觉区分。区块标题 SHALL 使用深色文字(`#1e293b`)配合左侧主色竖条装饰(`border-left: 3px solid #10b981`),字号 14px、`font-weight: 600`;字段标签 SHALL 为 13px、`#64748b`、`font-weight: 400`。
|
||||
|
||||
#### Scenario: 新增系统管理列表页
|
||||
权威参考:
|
||||
- 列表无外置操作列 + 工具栏编辑/删除:`web-admin/src/views/system/user/index.vue`
|
||||
- 主标识列链接 + 工具栏编辑/删除 + 查看弹窗 Hero 编辑/删除:`web-admin/src/views/crm/product/index.vue`
|
||||
- 查看弹窗 Hero 动作区:`web-admin/src/views/crm/customer/CustomerDetailDialog.vue`(`#hero-actions`)
|
||||
|
||||
- **WHEN** 在系统管理模块下新增标准列表页面
|
||||
- **THEN** 操作列首位 SHALL 包含「查看」按钮,且 `el-table` SHALL 绑定 `@row-dblclick="handleView"` 事件
|
||||
- **THEN** 点击「查看」按钮或双击行 SHALL 打开同一 `SystemViewDialog` 弹窗
|
||||
#### Scenario: 新增标准 CRUD 列表页
|
||||
|
||||
- **WHEN** 在 `web-admin` 新增带只读查看弹窗的标准 CRUD 列表页,且行级动作仅为编辑/删除
|
||||
- **THEN** 主标识列 SHALL 使用 `el-link type="primary"` 触发 `handleView`
|
||||
- **THEN** 表格 **SHALL NOT** 包含「操作」列
|
||||
- **THEN** 工具栏 SHALL 在「新增」之后提供「编辑」(单选可用)与「删除」(批量可用)按钮
|
||||
- **THEN** `SystemViewDialog` SHALL 通过 `#hero-actions` 提供「编辑」「删除」
|
||||
- **THEN** `el-table` SHALL 绑定 `@row-dblclick="handleView"`(或等价 handler)
|
||||
|
||||
#### Scenario: 现有页面补充查看弹窗
|
||||
|
||||
- **WHEN** 为现有列表页补充查看弹窗
|
||||
- **THEN** SHALL 同时添加操作列「查看」按钮与 `@row-dblclick` 双击事件,两者调用同一个 `handleView` 函数
|
||||
- **WHEN** 为现有列表页补充查看弹窗,且行级动作仅为编辑/删除
|
||||
- **THEN** SHALL 在主标识列添加 `el-link` 与 `@row-dblclick` 双击事件,两者调用同一个查看函数
|
||||
- **THEN** SHALL NOT 在操作列再添加「查看」按钮
|
||||
- **THEN** SHOULD 移除「操作」列,将「编辑」「删除」迁移至工具栏与 `#hero-actions`
|
||||
|
||||
#### Scenario: Code review 查看弹窗
|
||||
#### Scenario: 保留操作列的复杂业务列表
|
||||
|
||||
- **WHEN** PR 修改列表页面且页面包含 `el-table`
|
||||
- **THEN** 审查者 SHALL 确认 `el-table` 绑定了 `@row-dblclick` 事件,且操作列包含「查看」按钮
|
||||
- **WHEN** 列表页存在审批、状态变更、安排运输等行级状态依赖按钮
|
||||
- **THEN** **SHALL** 保留操作列并设置 `fixed="right"`
|
||||
- **THEN** 主标识列仍 SHALL 提供 `el-link` 查看入口,操作列 **SHALL NOT** 包含冗余「查看」按钮
|
||||
|
||||
#### Scenario: Code review 列表查看与 CRUD 入口
|
||||
|
||||
- **WHEN** PR 修改列表页面且页面包含 `el-table` 与只读查看能力
|
||||
- **THEN** 审查者 SHALL 确认主标识列含 `el-link` 查看入口
|
||||
- **THEN** 审查者 SHALL 确认 `el-table` 绑定了 `@row-dblclick` 事件
|
||||
- **THEN** 若为标准 CRUD(仅编辑/删除),审查者 SHALL 确认无「操作」列,且工具栏与 `#hero-actions` 均提供编辑/删除
|
||||
- **THEN** 审查者 SHALL 确认操作列无冗余「查看」/「查看详情」按钮(复合主操作例外除外)
|
||||
|
||||
### Requirement: 查看弹窗 KV 布局与组件选型
|
||||
|
||||
@@ -376,7 +410,7 @@ interface ViewField {
|
||||
|
||||
标准只读查看弹窗 **SHALL** 按以下顺序组织:
|
||||
|
||||
1. **Hero**(`.view-hero`):图标 + 主标题 + 可选 `meta` / `code` + 状态 Tag(hero-actions 插槽可选)
|
||||
1. **Hero**(`.view-hero`):图标 + 主标题 + 可选 `meta` / `code` + 状态 Tag;**标准 CRUD 列表页**的「编辑」「删除」SHALL 通过 `#hero-actions` 插槽置于 Hero 区右侧(见「列表主标识列链接查看与编辑删除外置」),Footer 仍仅保留「关闭」类按钮
|
||||
2. **分区**(`.view-section`):区块标题 + `ViewKvGrid` / `ViewKvTable` 或具名插槽(子表、附件、审批流等)
|
||||
3. **Footer**:仅「关闭」类按钮(带 `Close` 图标),**SHALL NOT** 在查看态混入提交语义
|
||||
|
||||
@@ -441,7 +475,9 @@ interface ViewField {
|
||||
|
||||
#### Scenario: 新增 CRM 列表查看弹窗
|
||||
|
||||
- **WHEN** 在 CRM 模块新增带【查看】按钮的列表页
|
||||
- **WHEN** 在 CRM 模块新增带只读查看能力的标准 CRUD 列表页(行级动作仅为编辑/删除)
|
||||
- **THEN** 主标识列 SHALL 使用 `el-link` 触发查看,表格 **SHALL NOT** 含「操作」列
|
||||
- **THEN** 工具栏与 `SystemViewDialog` `#hero-actions` SHALL 提供「编辑」「删除」
|
||||
- **THEN** SHALL 使用 `SystemViewDialog`(或独立 `*DetailDialog` 封装该组件)
|
||||
- **THEN** KV 字段 SHALL 通过 `ViewSection[]` + `ViewField[]` 定义,默认 4 列上下堆叠
|
||||
- **THEN** SHALL NOT 使用 `el-descriptions`
|
||||
@@ -490,7 +526,7 @@ interface ViewField {
|
||||
|
||||
#### Scenario: 站点管理查看弹窗
|
||||
|
||||
- **WHEN** 用户点击站点管理列表中某行的「查看」按钮
|
||||
- **WHEN** 用户点击站点管理列表中主标识列(站点名称)链接
|
||||
- **THEN** 「经营范围」字段 SHALL 展示为编码对应的标签文本(如"蔬菜、水果"),SHALL NOT 展示原始编码串(如"1,2")
|
||||
|
||||
#### Scenario: 新增包含字典编码字段的查看弹窗
|
||||
@@ -901,9 +937,9 @@ watchDebounced(
|
||||
| 展开更多 / 收起更多 | `ArrowDownBold` / `ArrowUpBold` | 筛选区 `.btn-filter-toggle`(默认折叠多行条件时) |
|
||||
| 确定 / 确认 / 提交 / 保存 | `Check` | 弹窗确认类按钮 |
|
||||
| 取消 / 关闭 | `Close` | 弹窗取消、关闭按钮 |
|
||||
| 编辑 / 修改 | `Edit` | 操作列「编辑」按钮 |
|
||||
| 删除 / 批量删除 | `Delete` | 操作列、工具栏「删除」按钮 |
|
||||
| 查看 / 详情 / 查看详情 | `View` | 操作列「查看」「详情」按钮 |
|
||||
| 编辑 / 修改 | `Edit` | 工具栏「编辑」、查看弹窗 `#hero-actions`「编辑」、操作列「编辑」按钮 |
|
||||
| 删除 / 批量删除 | `Delete` | 工具栏「删除」、查看弹窗 `#hero-actions`「删除」、操作列「删除」按钮 |
|
||||
| 查看 / 详情 | `View` | 工具栏「查看审批流」等非列表行主入口;**列表行查看由主标识列 `el-link` 或双击触发,操作列与工具栏不再放「查看」** |
|
||||
| 审批 / 审核 | `EditPen` | 操作列「审批」按钮 |
|
||||
| 配置 / 设置 | `Setting` 或 `SetUp` | 操作列「配置」按钮 |
|
||||
| 导入 / 上传 | `Upload` | 工具栏「导入」、表单「上传」按钮 |
|
||||
@@ -935,7 +971,7 @@ watchDebounced(
|
||||
|
||||
#### Scenario: 新增表格操作列按钮
|
||||
|
||||
- **WHEN** 在表格操作列添加「编辑」「删除」「查看」等操作按钮
|
||||
- **WHEN** 在表格操作列添加「编辑」「删除」等业务操作按钮
|
||||
- **THEN** 每个按钮 SHALL 包含对应的 `<el-icon>` 子元素(如 `<el-icon><Edit /></el-icon>`),SHALL NOT 仅有文字
|
||||
|
||||
#### Scenario: 新增工具栏主操作按钮
|
||||
|
||||
@@ -703,10 +703,22 @@
|
||||
"701": "Community 701",
|
||||
"702": "Community 702",
|
||||
"703": "Community 703",
|
||||
"704": "Community 704",
|
||||
"705": "Community 705",
|
||||
"706": "Community 706",
|
||||
"707": "Community 707",
|
||||
"708": "Community 708",
|
||||
"709": "Community 709",
|
||||
"710": "Community 710",
|
||||
"711": "Community 711"
|
||||
"711": "Community 711",
|
||||
"712": "Community 712",
|
||||
"713": "Community 713",
|
||||
"714": "Community 714",
|
||||
"715": "Community 715",
|
||||
"716": "Community 716",
|
||||
"717": "Community 717",
|
||||
"718": "Community 718",
|
||||
"719": "Community 719",
|
||||
"720": "Community 720",
|
||||
"721": "Community 721"
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_zlwu_work_00code_shanxia2_0_web_admin_scripts_apply_list_toolbar_refresh_py", "label": "apply-list-toolbar-refresh.py", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L1"}, {"id": "scripts_apply_list_toolbar_refresh_detect_refresh_handler", "label": "detect_refresh_handler()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L81"}, {"id": "str", "label": "str", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L81"}, {"id": "scripts_apply_list_toolbar_refresh_has_loading_ref", "label": "has_loading_ref()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L90"}, {"id": "bool", "label": "bool", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L90"}, {"id": "scripts_apply_list_toolbar_refresh_find_toolbar_insert_point", "label": "find_toolbar_insert_point()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L98"}, {"id": "match", "label": "Match", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L98"}, {"id": "scripts_apply_list_toolbar_refresh_apply_file", "label": "apply_file()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L115"}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L115"}, {"id": "scripts_apply_list_toolbar_refresh_main", "label": "main()", "file_type": "code", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L151"}, {"id": "scripts_apply_list_toolbar_refresh_rationale_99", "label": "Find end of first list-toolbar-row block before list-body.", "file_type": "rationale", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L99"}], "edges": [{"source": "users_zlwu_work_00code_shanxia2_0_web_admin_scripts_apply_list_toolbar_refresh_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L6", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_web_admin_scripts_apply_list_toolbar_refresh_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L7", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_web_admin_scripts_apply_list_toolbar_refresh_py", "target": "scripts_apply_list_toolbar_refresh_detect_refresh_handler", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L81", "weight": 1.0}, {"source": "scripts_apply_list_toolbar_refresh_detect_refresh_handler", "target": "str", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L81", "weight": 1.0}, {"source": "scripts_apply_list_toolbar_refresh_detect_refresh_handler", "target": "str", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L81", "weight": 1.0}, {"source": "users_zlwu_work_00code_shanxia2_0_web_admin_scripts_apply_list_toolbar_refresh_py", "target": "scripts_apply_list_toolbar_refresh_has_loading_ref", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L90", "weight": 1.0}, {"source": "scripts_apply_list_toolbar_refresh_has_loading_ref", "target": "str", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py", "source_location": "L90", "weight": 1.0}, {"source": "scripts_apply_list_toolbar_refresh_has_loading_ref", "target": "bool", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file":Line truncated
|
||||
+1
-1
@@ -1 +1 @@
|
||||
{"/Users/zlwu/work/00code/shanxia2.0/web-admin/package.json":{"size":3957,"mtime_ns":1781960299953649209,"hash":"ca01a16c94014e791391dfd8896f93c1ba7c451db1afa2f49f8a2a68b87dcc56"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/tsconfig.json":{"size":921,"mtime_ns":1780108931391506392,"hash":"8cec43256bc87216f729ae2c9588979558b20f33831419aa58502b54f5127c98"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/.vscode/settings.json":{"size":425,"mtime_ns":1780108931156918274,"hash":"0f2b6369eaf54ccac995e091d7ef5e292fa1396eadd32b64cbddd5bba0018d14"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/.vscode/extensions.json":{"size":200,"mtime_ns":1780108931156854566,"hash":"520c42e097d801a599814f12fe6a97bf5d7100e5395fd33217a365baa2cfe3c8"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/locales/langs/zh.json":{"size":10130,"mtime_ns":1780108931365472245,"hash":"f9834cd440df5dbce6ee91cc778c58b604d72d9652c48e8a285ac41e2d1be44f"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/locales/langs/en.json":{"size":10269,"mtime_ns":1780108931365387869,"hash":"fd0abc176e117037235c47e12bd682d93a8dc50183e14b54e20e169fb5714758"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/mock/json/chinaMap.json":{"size":956443,"mtime_ns":1780108931366831877,"hash":"2ce3f532aed5b51fa9b64bf134bf1d77c7886e695fd55a3368333584cbef4113"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/assets/data/china-region-flat.json":{"size":341606,"mtime_ns":1780108931184708348,"hash":"120c09f381ee3ac8fc6282e0be885a72ff256093c5aebf7a0861e38185d5f8ae"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/assets/data/china-region-cascader.json":{"size":217969,"mtime_ns":1780108931184402180,"hash":"63789a66f6bd55e8adeda487f6e4f361f1a916c4fdb3e2d8961ee412de57d307"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/CHANGELOG.md":{"size":19526,"mtime_ns":1780108931156993275,"hash":"3e1cf79e220067ef1e99102d5cee89646591a03e292f7ca957e209ee264d416a"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/README.md":{"size":4196,"mtime_ns":1780108931157199359,"hash":"114c94f9bf11e2083f1c985b2a5f58c5fbc50334dfbd25438415f21f8f577150"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/CHANGELOG.zh-CN.md":{"size":17172,"mtime_ns":1780108931157071900,"hash":"f4ec5751d75c6d3ec0767fd9c1f5787cc96c0a1ab059ed199ae4de1f1959f9fc"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/README.zh-CN.md":{"size":3775,"mtime_ns":1780108931157266568,"hash":"75a5522b08799b17dfe4416d20153a9cd247f5cbf280fe04ed0858a8337dc2d7"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/views/crm/clue/README.md":{"size":7884,"mtime_ns":1780211534938564937,"hash":"43ee077b77166be37ebf44e0f13c8f01801f08a8274ebfa976ae21cbe8c27ca7"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-quote-vue.py":{"size":4450,"mtime_ns":1780242127112333277,"hash":"97378f52743089231fbc83430106cad7701aa59b045126af45a238d7d2878bac"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-index-shell.py":{"size":11102,"mtime_ns":1780228518737746875,"hash":"0557768a404e2a0d9f2d3b233599bd741bdeb61a8e2d3cadf8d8dc4f1d6be25d"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-vue.py":{"size":4673,"mtime_ns":1780228615418009691,"hash":"790b4297df996f03b45d2efda686e219d60cd8e0f796fd860c070ed2e13939d6"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-attachments.py":{"size":1708,"mtime_ns":1780229286334758010,"hash":"eb364a061d7f7a6659311604353cd64a53edc81c1f1413b626ddf0388d709c46"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-form-panel.py":{"size":5523,"mtime_ns":1780229250658746500,"hash":"c873cdb8f5e8d8339aec3f47dc840106e1a176e3c9ac210ddd6d0abe547d928a"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-form-attachments.py":{"size":14077,"mtime_ns":1780229316215427400,"hash":"470af77a8b9508291fab61aeee4c64bd495f78c77d09574e6b49962ce165eeaf"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-form-layout.py":{"size":5157,"mtime_ns":1780229581646441465,"hash":"d5d97158dd892bd942f61721bcae770de518de368f487c2a30129502b3125787"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-detail-fresh-mint.py":{"size":24615,"mtime_ns":1780229887010846627,"hash":"daf372506c69aa3a92a4ddf3d508252ae63b68718d00bb49fb03914cc8bcfee3"}}
|
||||
{"/Users/zlwu/work/00code/shanxia2.0/web-admin/package.json":{"size":3957,"mtime_ns":1781960299953649209,"hash":"ca01a16c94014e791391dfd8896f93c1ba7c451db1afa2f49f8a2a68b87dcc56"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/tsconfig.json":{"size":921,"mtime_ns":1780108931391506392,"hash":"8cec43256bc87216f729ae2c9588979558b20f33831419aa58502b54f5127c98"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/.vscode/settings.json":{"size":425,"mtime_ns":1780108931156918274,"hash":"0f2b6369eaf54ccac995e091d7ef5e292fa1396eadd32b64cbddd5bba0018d14"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/.vscode/extensions.json":{"size":200,"mtime_ns":1780108931156854566,"hash":"520c42e097d801a599814f12fe6a97bf5d7100e5395fd33217a365baa2cfe3c8"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/locales/langs/zh.json":{"size":10130,"mtime_ns":1780108931365472245,"hash":"f9834cd440df5dbce6ee91cc778c58b604d72d9652c48e8a285ac41e2d1be44f"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/locales/langs/en.json":{"size":10269,"mtime_ns":1780108931365387869,"hash":"fd0abc176e117037235c47e12bd682d93a8dc50183e14b54e20e169fb5714758"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/mock/json/chinaMap.json":{"size":956443,"mtime_ns":1780108931366831877,"hash":"2ce3f532aed5b51fa9b64bf134bf1d77c7886e695fd55a3368333584cbef4113"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/assets/data/china-region-flat.json":{"size":341606,"mtime_ns":1780108931184708348,"hash":"120c09f381ee3ac8fc6282e0be885a72ff256093c5aebf7a0861e38185d5f8ae"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/assets/data/china-region-cascader.json":{"size":217969,"mtime_ns":1780108931184402180,"hash":"63789a66f6bd55e8adeda487f6e4f361f1a916c4fdb3e2d8961ee412de57d307"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/CHANGELOG.md":{"size":19526,"mtime_ns":1780108931156993275,"hash":"3e1cf79e220067ef1e99102d5cee89646591a03e292f7ca957e209ee264d416a"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/README.md":{"size":4196,"mtime_ns":1780108931157199359,"hash":"114c94f9bf11e2083f1c985b2a5f58c5fbc50334dfbd25438415f21f8f577150"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/CHANGELOG.zh-CN.md":{"size":17172,"mtime_ns":1780108931157071900,"hash":"f4ec5751d75c6d3ec0767fd9c1f5787cc96c0a1ab059ed199ae4de1f1959f9fc"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/README.zh-CN.md":{"size":3775,"mtime_ns":1780108931157266568,"hash":"75a5522b08799b17dfe4416d20153a9cd247f5cbf280fe04ed0858a8337dc2d7"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/src/views/crm/clue/README.md":{"size":7884,"mtime_ns":1780211534938564937,"hash":"43ee077b77166be37ebf44e0f13c8f01801f08a8274ebfa976ae21cbe8c27ca7"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-quote-vue.py":{"size":4450,"mtime_ns":1780242127112333277,"hash":"97378f52743089231fbc83430106cad7701aa59b045126af45a238d7d2878bac"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-index-shell.py":{"size":11102,"mtime_ns":1780228518737746875,"hash":"0557768a404e2a0d9f2d3b233599bd741bdeb61a8e2d3cadf8d8dc4f1d6be25d"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-vue.py":{"size":4673,"mtime_ns":1780228615418009691,"hash":"790b4297df996f03b45d2efda686e219d60cd8e0f796fd860c070ed2e13939d6"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-attachments.py":{"size":1708,"mtime_ns":1780229286334758010,"hash":"eb364a061d7f7a6659311604353cd64a53edc81c1f1413b626ddf0388d709c46"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-form-panel.py":{"size":5523,"mtime_ns":1780229250658746500,"hash":"c873cdb8f5e8d8339aec3f47dc840106e1a176e3c9ac210ddd6d0abe547d928a"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-form-attachments.py":{"size":14077,"mtime_ns":1780229316215427400,"hash":"470af77a8b9508291fab61aeee4c64bd495f78c77d09574e6b49962ce165eeaf"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-form-layout.py":{"size":5157,"mtime_ns":1780229581646441465,"hash":"d5d97158dd892bd942f61721bcae770de518de368f487c2a30129502b3125787"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/migrate-contract-detail-fresh-mint.py":{"size":24615,"mtime_ns":1780229887010846627,"hash":"daf372506c69aa3a92a4ddf3d508252ae63b68718d00bb49fb03914cc8bcfee3"},"/Users/zlwu/work/00code/shanxia2.0/web-admin/scripts/apply-list-toolbar-refresh.py":{"size":5207,"mtime_ns":1782833189049773933,"hash":"b11f3424426b01a6445011dff30122103d5e7d40dd997167723ef66d7b742e7b"}}
|
||||
+18700
-6843
File diff suppressed because it is too large.
Load diff
Loaded 100 of 249 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user