Jelajahi Sumber

refactor(facetoface): 按支付宝API文档修正代开通流程

- agent.create 传 account + contact_info (ContactModel)
- facetoface.sign 精简为 batch_no + sign_and_auth + rate
- agent.confirm 捕获 app_auth_token / app_refresh_token / order_no 等
- agent.order.query 修正状态映射为 MERCHANT_CONFIRM_SUCCESS / MERCHANT_APPLY_ORDER_CANCELED 等
- 前端表单简化为:商户账号 + 联系人信息 + 授权开关 + 费率
- 移除错误的店铺/营业执照/图片上传字段
alphah 6 hari lalu
induk
melakukan
83401ba395
100 mengubah file dengan 160 tambahan dan 202 penghapusan
  1. 17 29
      backend/app/plugin/module_payment/facetoface/controller.py
  2. 37 29
      backend/app/plugin/module_payment/facetoface/model.py
  3. 35 25
      backend/app/plugin/module_payment/facetoface/schema.py
  4. 63 109
      backend/app/plugin/module_payment/facetoface/service.py
  5. 0 0
      frontend/dist/css/index.inhIJ3yF.css
  6. 2 2
      frontend/dist/index.html
  7. 0 0
      frontend/dist/js/401.B_Okh4G1.js
  8. 0 0
      frontend/dist/js/404.BuhxiUex.js
  9. 0 0
      frontend/dist/js/AccountOverview.MUSWmnA_.js
  10. 0 0
      frontend/dist/js/ChatInput.Bva9mUo5.js
  11. 0 0
      frontend/dist/js/ChatMessages.DbE-PM3o.js
  12. 0 0
      frontend/dist/js/ChatNavbar.BCYTyUMV.js
  13. 1 1
      frontend/dist/js/ConfigInfoDrawer.BNhs8WrE.js
  14. 0 0
      frontend/dist/js/ConsumeDetail.2iJiiZV8.js
  15. 0 0
      frontend/dist/js/CreateTableDialog.C6QC3Y_G.js
  16. 0 0
      frontend/dist/js/DataDrawer.BhOhVBaK.js
  17. 0 0
      frontend/dist/js/DataDrawer.DWcqaGZz.js
  18. 0 0
      frontend/dist/js/DepartmentDetail.ADC878Qk.js
  19. 0 0
      frontend/dist/js/DepartmentForm.Ca_HHA31.js
  20. 0 0
      frontend/dist/js/DeptTree.CDLv66ow.js
  21. 0 0
      frontend/dist/js/EdgeConfigPanel.DVTNo_rg.js
  22. 0 0
      frontend/dist/js/EmployeeForm.DTAifFCq.js
  23. 1 1
      frontend/dist/js/ExternalLink.oMCLRW6e.js
  24. 0 0
      frontend/dist/js/GenBasicStep.Cf7NFvw5.js
  25. 0 0
      frontend/dist/js/GenCodeDrawer.Y-MtApRl.js
  26. 0 0
      frontend/dist/js/GenColumnsStep.D-vLt3q4.js
  27. 0 0
      frontend/dist/js/GenPreviewStep.CyPztHj5.js
  28. 0 0
      frontend/dist/js/GencodeHelpPanel.CrhhCk2p.js
  29. 0 0
      frontend/dist/js/ImportDbTableDialog.0vuwG-C0.js
  30. 0 0
      frontend/dist/js/InstitutionDetail.CZAlNueG.js
  31. 0 0
      frontend/dist/js/InstitutionDetail.DyJeeBod.js
  32. 0 0
      frontend/dist/js/InstitutionForm.C6l6uyCY.js
  33. 0 0
      frontend/dist/js/InviteDialog.DLlyXUBK.js
  34. 0 0
      frontend/dist/js/IssueBatchForm.tKTIH-nT.js
  35. 0 0
      frontend/dist/js/Login.BCSn0JPl.js
  36. 0 0
      frontend/dist/js/MessageItem.tFsC_ZmG.js
  37. 0 0
      frontend/dist/js/NodeConfigPanel.eVXhA8lc.js
  38. 0 0
      frontend/dist/js/PageContent.BbMtqJS6.js
  39. 0 0
      frontend/dist/js/QuotaList.Ca6sqg6C.js
  40. 0 0
      frontend/dist/js/QuotaList.yrxSEsFD.js
  41. 0 0
      frontend/dist/js/RuleForm.CfINdgJR.js
  42. 0 0
      frontend/dist/js/RuleList.CMwvOc5f.js
  43. 0 0
      frontend/dist/js/ScopeDialog.b4xVnEIo.js
  44. 0 0
      frontend/dist/js/Sidebar.Bjpi5nCT.js
  45. 0 0
      frontend/dist/js/TransferDetail.B6DdnL0u.js
  46. 0 0
      frontend/dist/js/UserTableSelect.CrH2H0OY.js
  47. 0 0
      frontend/dist/js/WelcomeScreen.DSXpY9kM.js
  48. 0 0
      frontend/dist/js/WorkflowDesignDrawer.CrBb6bAU.js
  49. 0 0
      frontend/dist/js/element-plus.DUy1TWHM.js
  50. 0 0
      frontend/dist/js/github.CQLrBYbE.js
  51. 0 1
      frontend/dist/js/index copy.B18dNqcj.js
  52. 0 0
      frontend/dist/js/index.4bnNbR0E.js
  53. 0 0
      frontend/dist/js/index.5n44_fRn.js
  54. 0 0
      frontend/dist/js/index.6W_xKRjb.js
  55. 0 0
      frontend/dist/js/index.AFRps8E_.js
  56. 0 0
      frontend/dist/js/index.BEM79XbV.js
  57. 0 0
      frontend/dist/js/index.BFDF0Oo-.js
  58. 0 1
      frontend/dist/js/index.BFyRIgJl.js
  59. 0 0
      frontend/dist/js/index.BGslBoqY.js
  60. 0 0
      frontend/dist/js/index.BL4xdu0l.js
  61. 0 0
      frontend/dist/js/index.BRVE3yma.js
  62. 0 0
      frontend/dist/js/index.B_dElfNO.js
  63. 1 1
      frontend/dist/js/index.BbjEWaMs.js
  64. 0 0
      frontend/dist/js/index.Be8Bawir.js
  65. 0 0
      frontend/dist/js/index.Biard4mi.js
  66. 0 0
      frontend/dist/js/index.BnIzSfCg.js
  67. 0 0
      frontend/dist/js/index.BqR4Tldw.js
  68. 0 0
      frontend/dist/js/index.BqZQ1U_9.js
  69. 1 0
      frontend/dist/js/index.BsULxyU3.js
  70. 0 0
      frontend/dist/js/index.C-wNWx2X.js
  71. 0 0
      frontend/dist/js/index.C1PTpZMw.js
  72. 0 0
      frontend/dist/js/index.C9vdlb95.js
  73. 0 0
      frontend/dist/js/index.CAPLxEOt.js
  74. 0 0
      frontend/dist/js/index.CO-zK6md.js
  75. 0 0
      frontend/dist/js/index.CS4qQIe1.js
  76. 0 0
      frontend/dist/js/index.CU87zUE7.js
  77. 0 0
      frontend/dist/js/index.CUPYftkF.js
  78. 0 0
      frontend/dist/js/index.Ce8F_9kJ.js
  79. 0 0
      frontend/dist/js/index.CnMaBBiw.js
  80. 1 1
      frontend/dist/js/index.CwRnxs-M.js
  81. 0 0
      frontend/dist/js/index.DA4qvbdk.js
  82. 0 0
      frontend/dist/js/index.DEzj8Q_r.js
  83. 0 1
      frontend/dist/js/index.DGLdFR_J.js
  84. 0 0
      frontend/dist/js/index.DITLLgVZ.js
  85. 0 0
      frontend/dist/js/index.DLMAguNA.js
  86. 0 0
      frontend/dist/js/index.DNUDVLkx.js
  87. 0 0
      frontend/dist/js/index.DNzbL0f8.js
  88. 0 0
      frontend/dist/js/index.DTITaP9Y.js
  89. 0 0
      frontend/dist/js/index.DgWivzY3.js
  90. 0 0
      frontend/dist/js/index.Dir43w02.js
  91. 0 0
      frontend/dist/js/index.DyS0bA__.js
  92. 0 0
      frontend/dist/js/index.DzsxLpTg.js
  93. 0 0
      frontend/dist/js/index.J3b3-jc3.js
  94. 0 0
      frontend/dist/js/index.JeWdgvjx.js
  95. 0 0
      frontend/dist/js/index.QsDPhaDr.js
  96. 0 0
      frontend/dist/js/index.Ut_HHvXm.js
  97. 0 0
      frontend/dist/js/index._ZqfbF60.js
  98. 1 1
      frontend/dist/js/index.fwuhDT_d.js
  99. 0 0
      frontend/dist/js/index.jdVFi9sq.js
  100. 0 0
      frontend/dist/js/index.o0EjCS4X.js

+ 17 - 29
backend/app/plugin/module_payment/facetoface/controller.py

@@ -1,8 +1,7 @@
-import json
 from typing import Annotated
 
 from apscheduler.schedulers.asyncio import AsyncIOScheduler
-from fastapi import APIRouter, Depends, Form, Path, Query, UploadFile
+from fastapi import APIRouter, Depends, Path, Query
 from fastapi.responses import JSONResponse
 
 from app.api.v1.module_system.auth.schema import AuthSchema
@@ -21,56 +20,46 @@ from .service import FacetofaceService
 FacetofaceRouter = APIRouter(
     route_class=OperationLogRoute,
     prefix="/facetoface",
-    tags=["当面付开通"],
+    tags=["当面付开通"],
 )
 
 
 @FacetofaceRouter.post(
     "/apply",
-    summary="提交当面付开通申请",
-    description="代商家提交当面付开通申请(自动完成 create → sign → confirm 三步),支持图片上传",
+    summary="提交当面付开通申请",
+    description="代商户提交当面付代开通申请(自动完成 create → sign → confirm 三步)",
     response_model=ResponseSchema[FacetofaceOrderOutSchema],
 )
 async def apply_controller(
     auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:facetoface:apply"]))],
-    data: Annotated[str, Form(description="申请数据 JSON")],
-    shop_scene_pic: Annotated[UploadFile | None, Form()] = None,
-    shop_sign_board_pic: Annotated[UploadFile | None, Form()] = None,
-    business_license_pic: Annotated[UploadFile | None, Form()] = None,
+    data: FacetofaceApplySchema,
 ) -> JSONResponse:
-    apply_data = FacetofaceApplySchema.model_validate_json(data)
-    result = await FacetofaceService.apply_service(
-        auth=auth,
-        data=apply_data,
-        shop_scene_pic=shop_scene_pic,
-        shop_sign_board_pic=shop_sign_board_pic,
-        business_license_pic=business_license_pic,
-    )
-    log.info(f"当面付开通申请已提交: batch_no={result.batch_no}, merchant={apply_data.merchant_name}")
-    return SuccessResponse(data=result, msg="当面付开通申请已提交")
+    result = await FacetofaceService.apply_service(auth=auth, data=data)
+    log.info(f"当面付代开通申请已提交: batch_no={result.batch_no}, account={data.account}")
+    return SuccessResponse(data=result, msg="当面付代开通申请已提交")
 
 
 @FacetofaceRouter.get(
     "",
     summary="查询申请单列表",
-    description="分页查询当面付开通申请单列表",
+    description="分页查询当面付代开通申请单列表",
     response_model=ResponseSchema[FacetofaceOrderListOutSchema],
 )
 async def list_controller(
     auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:facetoface:list"]))],
     page_no: Annotated[int, Query(description="页码")] = 1,
     page_size: Annotated[int, Query(description="每页数量")] = 20,
-    merchant_name: Annotated[str | None, Query(description="商户名称")] = None,
-    shop_name: Annotated[str | None, Query(description="店铺名称")] = None,
+    account: Annotated[str | None, Query(description="商户账号")] = None,
+    contact_name: Annotated[str | None, Query(description="联系人")] = None,
     order_status: Annotated[str | None, Query(description="申请单状态")] = None,
     start_time: Annotated[str | None, Query(description="开始时间")] = None,
     end_time: Annotated[str | None, Query(description="结束时间")] = None,
 ) -> JSONResponse:
     search = {}
-    if merchant_name:
-        search["merchant_name"] = merchant_name
-    if shop_name:
-        search["shop_name"] = shop_name
+    if account:
+        search["account"] = account
+    if contact_name:
+        search["contact_name"] = contact_name
     if order_status:
         search["order_status"] = order_status
     if start_time:
@@ -101,7 +90,7 @@ async def batch_status_controller(
 @FacetofaceRouter.get(
     "/enterprise/{enterprise_id}",
     summary="按企业ID查询当面付申请单",
-    description="查询某个企业的当面付开通申请单",
+    description="查询某个企业的当面付开通申请单",
     response_model=ResponseSchema[FacetofaceOrderOutSchema],
 )
 async def get_by_enterprise_controller(
@@ -115,7 +104,7 @@ async def get_by_enterprise_controller(
 @FacetofaceRouter.get(
     "/{order_id}",
     summary="查询申请单详情",
-    description="查询单个当面付开通申请单详情",
+    description="查询单个当面付开通申请单详情",
     response_model=ResponseSchema[FacetofaceOrderOutSchema],
 )
 async def detail_controller(
@@ -149,7 +138,6 @@ _poll_scheduler_started = False
 
 @FacetofaceRouter.on_event("startup")
 async def start_facetoface_poll_scheduler():
-    """启动时注册当面付申请单状态轮询任务"""
     global _poll_scheduler_started
     if _poll_scheduler_started:
         return

+ 37 - 29
backend/app/plugin/module_payment/facetoface/model.py

@@ -9,10 +9,10 @@ from .enums import FacetofaceOrderStatus
 
 
 class FacetofaceOrderModel(PaymentModelMixin, TenantMixin):
-    """当面付开通申请单"""
+    """当面付开通申请单"""
 
     __tablename__ = "pay_facetoface_order"
-    __table_args__ = {"comment": "当面付开通申请单"}
+    __table_args__ = {"comment": "当面付开通申请单"}
 
     enterprise_id: Mapped[str | None] = mapped_column(
         String(64), unique=True, index=True, comment="关联企业ID"
@@ -21,7 +21,7 @@ class FacetofaceOrderModel(PaymentModelMixin, TenantMixin):
         String(64), unique=True, index=True, comment="支付宝事务编号"
     )
     order_no: Mapped[str | None] = mapped_column(
-        String(64), index=True, comment="支付宝申请单号"
+        String(64), index=True, comment="签约单号"
     )
     order_status: Mapped[str] = mapped_column(
         String(32),
@@ -30,46 +30,54 @@ class FacetofaceOrderModel(PaymentModelMixin, TenantMixin):
         comment="申请单状态",
     )
 
-    merchant_name: Mapped[str | None] = mapped_column(
-        String(128), comment="商户名称"
+    account: Mapped[str | None] = mapped_column(
+        String(128), comment="商户支付宝账号/pid"
     )
-    shop_name: Mapped[str | None] = mapped_column(
-        String(128), comment="店铺名称"
+    contact_name: Mapped[str | None] = mapped_column(
+        String(32), comment="联系人名称"
     )
-    shop_address: Mapped[str | None] = mapped_column(
-        String(256), comment="店铺地址"
+    contact_mobile: Mapped[str | None] = mapped_column(
+        String(16), comment="联系人手机号"
     )
-    mcc_code: Mapped[str | None] = mapped_column(
-        String(32), comment="商户类别码"
+    contact_email: Mapped[str | None] = mapped_column(
+        String(64), comment="联系人邮箱"
     )
-    rate: Mapped[str | None] = mapped_column(
-        String(16), comment="费率"
-    )
-    business_license_no: Mapped[str | None] = mapped_column(
-        String(64), comment="营业执照号"
+    order_ticket: Mapped[str | None] = mapped_column(
+        String(40), comment="订单授权凭证(预授权模式)"
     )
-    business_license_mobile: Mapped[str | None] = mapped_column(
-        String(32), comment="联系手机号"
+    rate: Mapped[str | None] = mapped_column(
+        String(8), comment="费率(sign_and_auth=true时必填)"
     )
     sign_and_auth: Mapped[bool] = mapped_column(
-        Boolean, default=False, comment="是否同时获取授权"
+        Boolean, default=False, comment="是否签约且授权"
     )
 
-    shop_scene_pic_path: Mapped[str | None] = mapped_column(
-        String(256), comment="店铺场景照片路径"
+    merchant_pid: Mapped[str | None] = mapped_column(
+        String(32), comment="商户pid(query返回)"
     )
-    shop_sign_board_pic_path: Mapped[str | None] = mapped_column(
-        String(256), comment="店铺招牌照片路径"
-    )
-    business_license_pic_path: Mapped[str | None] = mapped_column(
-        String(256), comment="营业执照照片路径"
-    )
-
     confirm_url: Mapped[str | None] = mapped_column(
         Text, comment="商家确认链接"
     )
     app_auth_token: Mapped[str | None] = mapped_column(
-        String(128), comment="商家授权token"
+        String(128), comment="应用授权令牌"
+    )
+    app_refresh_token: Mapped[str | None] = mapped_column(
+        String(128), comment="刷新令牌"
+    )
+    auth_app_id: Mapped[str | None] = mapped_column(
+        String(32), comment="授权商户的appId"
+    )
+    user_id: Mapped[str | None] = mapped_column(
+        String(32), comment="授权商户的userId"
+    )
+    open_id: Mapped[str | None] = mapped_column(
+        String(128), comment="授权商户的openId"
+    )
+    expires_in: Mapped[str | None] = mapped_column(
+        String(16), comment="授权令牌过期秒数"
+    )
+    re_expires_in: Mapped[str | None] = mapped_column(
+        String(16), comment="刷新令牌过期秒数"
     )
     reject_reason: Mapped[str | None] = mapped_column(
         Text, comment="驳回原因"

+ 35 - 25
backend/app/plugin/module_payment/facetoface/schema.py

@@ -1,23 +1,28 @@
 from datetime import datetime
 from typing import Optional
 
-from pydantic import BaseModel, ConfigDict, Field
+from pydantic import BaseModel, ConfigDict, Field, model_validator
 
 
 class FacetofaceApplySchema(BaseModel):
-    """当面付开通申请请求"""
+    """当面付开通申请请求"""
 
     enterprise_id: str = Field(description="关联企业ID")
-    merchant_name: str = Field(description="商户名称")
-    shop_name: str = Field(description="店铺名称")
-    shop_address: str = Field(description="店铺地址")
-    mcc_code: str = Field(description="商户类别码")
-    rate: str = Field(description="费率,如 0.006")
-    business_license_no: str = Field(description="营业执照号")
-    business_license_mobile: Optional[str] = Field(default=None, description="联系手机号")
-    sign_and_auth: bool = Field(default=False, description="是否同时获取商家授权")
+    account: str = Field(description="商户支付宝账号或pid(2088开头)")
+    contact_name: str = Field(description="联系人名称")
+    contact_mobile: str = Field(description="联系人手机号")
+    contact_email: Optional[str] = Field(default=None, description="联系人邮箱")
+    order_ticket: Optional[str] = Field(default=None, description="订单授权凭证(预授权模式)")
+    sign_and_auth: bool = Field(default=False, description="是否签约且授权")
+    rate: Optional[str] = Field(default=None, description="费率(sign_and_auth=true时必填)")
     remark: Optional[str] = Field(default=None, description="备注")
 
+    @model_validator(mode="after")
+    def validate_rate(self):
+        if self.sign_and_auth and not self.rate:
+            raise ValueError("签约且授权时费率不能为空")
+        return self
+
 
 class FacetofaceOrderOutSchema(BaseModel):
     """当面付申请单详情响应"""
@@ -27,21 +32,26 @@ class FacetofaceOrderOutSchema(BaseModel):
     id: int = Field(description="主键ID")
     enterprise_id: Optional[str] = Field(default=None, description="关联企业ID")
     batch_no: Optional[str] = Field(default=None, description="事务编号")
-    order_no: Optional[str] = Field(default=None, description="申请单号")
+    order_no: Optional[str] = Field(default=None, description="签约单号")
     order_status: str = Field(description="申请单状态")
-    merchant_name: Optional[str] = Field(default=None, description="商户名称")
-    shop_name: Optional[str] = Field(default=None, description="店铺名称")
-    shop_address: Optional[str] = Field(default=None, description="店铺地址")
-    mcc_code: Optional[str] = Field(default=None, description="商户类别码")
+
+    account: Optional[str] = Field(default=None, description="商户支付宝账号/pid")
+    contact_name: Optional[str] = Field(default=None, description="联系人名称")
+    contact_mobile: Optional[str] = Field(default=None, description="联系人手机号")
+    contact_email: Optional[str] = Field(default=None, description="联系人邮箱")
+    order_ticket: Optional[str] = Field(default=None, description="订单授权凭证")
     rate: Optional[str] = Field(default=None, description="费率")
-    business_license_no: Optional[str] = Field(default=None, description="营业执照号")
-    business_license_mobile: Optional[str] = Field(default=None, description="联系手机号")
-    sign_and_auth: bool = Field(default=False, description="是否同时获取授权")
-    shop_scene_pic_path: Optional[str] = Field(default=None, description="店铺场景照片")
-    shop_sign_board_pic_path: Optional[str] = Field(default=None, description="店铺招牌照片")
-    business_license_pic_path: Optional[str] = Field(default=None, description="营业执照照片")
+    sign_and_auth: bool = Field(default=False, description="是否签约且授权")
+
+    merchant_pid: Optional[str] = Field(default=None, description="商户pid")
     confirm_url: Optional[str] = Field(default=None, description="商家确认链接")
-    app_auth_token: Optional[str] = Field(default=None, description="商家授权token")
+    app_auth_token: Optional[str] = Field(default=None, description="应用授权令牌")
+    app_refresh_token: Optional[str] = Field(default=None, description="刷新令牌")
+    auth_app_id: Optional[str] = Field(default=None, description="授权商户appId")
+    user_id: Optional[str] = Field(default=None, description="授权商户userId")
+    open_id: Optional[str] = Field(default=None, description="授权商户openId")
+    expires_in: Optional[str] = Field(default=None, description="授权令牌过期秒数")
+    re_expires_in: Optional[str] = Field(default=None, description="刷新令牌过期秒数")
     reject_reason: Optional[str] = Field(default=None, description="驳回原因")
     remark: Optional[str] = Field(default=None, description="备注")
     last_query_time: Optional[datetime] = Field(default=None, description="最后查询时间")
@@ -60,9 +70,9 @@ class FacetofaceOrderListOutSchema(BaseModel):
     enterprise_id: Optional[str] = Field(default=None, description="关联企业ID")
     batch_no: Optional[str] = Field(default=None, description="事务编号")
     order_status: str = Field(description="申请单状态")
-    merchant_name: Optional[str] = Field(default=None, description="商户名称")
-    shop_name: Optional[str] = Field(default=None, description="店铺名称")
-    rate: Optional[str] = Field(default=None, description="费率")
+    account: Optional[str] = Field(default=None, description="商户支付宝账号")
+    contact_name: Optional[str] = Field(default=None, description="联系人")
+    sign_and_auth: bool = Field(default=False, description="是否授权")
     confirm_url: Optional[str] = Field(default=None, description="商家确认链接")
     reject_reason: Optional[str] = Field(default=None, description="驳回原因")
     created_time: datetime = Field(description="创建时间")

+ 63 - 109
backend/app/plugin/module_payment/facetoface/service.py

@@ -1,15 +1,9 @@
-import os
-import tempfile
 from datetime import datetime, timedelta
 
-from fastapi import UploadFile
-
 from app.api.v1.module_system.auth.schema import AuthSchema
-from app.config.setting import settings
 from app.core.alipay import AlipayClient
 from app.core.exceptions import CustomException
 from app.core.logger import log
-from app.utils.upload_util import UploadUtil
 
 from .crud import FacetofaceCRUD
 from .enums import FacetofaceOrderStatus
@@ -21,23 +15,19 @@ from .schema import (
 
 
 class FacetofaceService:
-    """当面付开通服务"""
+    """当面付开通服务"""
 
     @classmethod
     async def apply_service(
         cls,
         auth: AuthSchema,
         data: FacetofaceApplySchema,
-        shop_scene_pic: UploadFile | None = None,
-        shop_sign_board_pic: UploadFile | None = None,
-        business_license_pic: UploadFile | None = None,
     ) -> FacetofaceOrderOutSchema:
         """
-        提交当面付开通申请
+        提交当面付代开通申请
 
-        三步操作: agent.create → facetoface.sign → agent.confirm
+        三步操作: agent.create → agent.facetoface.sign → agent.confirm
         """
-        from alipay.aop.api.FileItem import FileItem
         from alipay.aop.api.domain.AlipayOpenAgentCreateModel import AlipayOpenAgentCreateModel
         from alipay.aop.api.request.AlipayOpenAgentCreateRequest import AlipayOpenAgentCreateRequest
         from alipay.aop.api.response.AlipayOpenAgentCreateResponse import AlipayOpenAgentCreateResponse
@@ -50,15 +40,26 @@ class FacetofaceService:
         client = AlipayClient.get_client()
         crud = FacetofaceCRUD(auth)
 
-        # 检查该企业是否已有申请
+        # 检查该企业是否已有进行中的申请
         existing = await crud.get_by_enterprise_id(data.enterprise_id)
         if existing and existing.order_status not in (
             FacetofaceOrderStatus.CLOSED.value,
         ):
             raise CustomException(msg="该企业已有进行中的当面付申请")
 
-        # Step 1: 创建应用事务,获取 batch_no
+        # Step 1: 创建应用事务
         create_model = AlipayOpenAgentCreateModel()
+        create_model.account = data.account
+        # ContactModel
+        from alipay.aop.api.domain.ContactModel import ContactModel
+        create_model.contact_info = ContactModel()
+        create_model.contact_info.contact_name = data.contact_name
+        create_model.contact_info.contact_mobile = data.contact_mobile
+        if data.contact_email:
+            create_model.contact_info.contact_email = data.contact_email
+        if data.order_ticket:
+            create_model.order_ticket = data.order_ticket
+
         create_request = AlipayOpenAgentCreateRequest()
         create_request.biz_model = create_model
 
@@ -76,60 +77,27 @@ class FacetofaceService:
         if not batch_no:
             raise CustomException(msg="创建应用事务失败: 未返回 batch_no")
 
-        log.info(f"当面付申请 - Step1 创建事务成功: batch_no={batch_no}")
+        log.info(f"当面付代开通 - Step1 创建事务成功: batch_no={batch_no}, account={data.account}")
 
-        # Step 2: 提交当面付开通申请
+        # Step 2: 提交当面付签约申请
         sign_request = AlipayOpenAgentFacetofaceSignRequest()
         sign_request.batch_no = batch_no
-        sign_request.shop_name = data.shop_name
-        if data.shop_address:
-            sign_request.shop_address = data.shop_address
-        if data.mcc_code:
-            sign_request.mcc_code = data.mcc_code
-        if data.rate:
-            sign_request.rate = data.rate
-        if data.business_license_no:
-            sign_request.business_license_no = data.business_license_no
-        if data.business_license_mobile:
-            sign_request.business_license_mobile = data.business_license_mobile
         if data.sign_and_auth:
             sign_request.sign_and_auth = "true"
-
-        # 处理图片上传
-        image_paths: dict[str, str | None] = {
-            "shop_scene_pic_path": None,
-            "shop_sign_board_pic_path": None,
-            "business_license_pic_path": None,
-        }
-        file_mapping = [
-            ("shop_scene_pic", shop_scene_pic, "shop_scene_pic_path"),
-            ("shop_sign_board_pic", shop_sign_board_pic, "shop_sign_board_pic_path"),
-            ("business_license_pic", business_license_pic, "business_license_pic_path"),
-        ]
-        for attr_name, upload_file, path_key in file_mapping:
-            if upload_file and upload_file.filename:
-                content = await upload_file.read()
-                await upload_file.seek(0)
-                file_item = FileItem(
-                    file_name=upload_file.filename,
-                    file_content=content,
-                    mime_type=upload_file.content_type or "application/octet-stream",
-                )
-                sign_request.__setattr__(attr_name, file_item)
-                saved_path = await cls._save_uploaded_file(upload_file)
-                image_paths[path_key] = saved_path
+        if data.rate:
+            sign_request.rate = data.rate
 
         response = client.execute(sign_request)
         if not response:
-            raise CustomException(msg="提交当面付申请失败: 无响应")
+            raise CustomException(msg="提交当面付签约失败: 无响应")
 
         sign_result = AlipayOpenAgentFacetofaceSignResponse()
         sign_result.parse_response_content(response)
         if not sign_result.is_success():
-            log.error(f"提交当面付申请失败: {sign_result.code} - {sign_result.msg} - {sign_result.sub_msg}")
-            raise CustomException(msg=f"提交当面付申请失败: {sign_result.sub_msg or sign_result.msg}")
+            log.error(f"提交当面付签约失败: {sign_result.code} - {sign_result.msg} - {sign_result.sub_msg}")
+            raise CustomException(msg=f"提交当面付签约失败: {sign_result.sub_msg or sign_result.msg}")
 
-        log.info(f"当面付申请 - Step2 提交签约成功: batch_no={batch_no}")
+        log.info(f"当面付代开通 - Step2 签约成功: batch_no={batch_no}")
 
         # Step 3: 确认提交事务
         confirm_model = AlipayOpenAgentConfirmModel()
@@ -147,31 +115,34 @@ class FacetofaceService:
             log.error(f"确认提交事务失败: {confirm_result.code} - {confirm_result.msg} - {confirm_result.sub_msg}")
             raise CustomException(msg=f"确认提交事务失败: {confirm_result.sub_msg or confirm_result.msg}")
 
-        log.info(f"当面付申请 - Step3 确认事务成功: batch_no={batch_no}")
+        log.info(f"当面付代开通 - Step3 确认事务成功: batch_no={batch_no}, order_no={confirm_result.order_no}")
 
-        # 保存申请单到数据库
+        # 保存申请单
         now = datetime.now()
         create_data = {
             "enterprise_id": data.enterprise_id,
             "batch_no": batch_no,
+            "order_no": confirm_result.order_no,
             "order_status": FacetofaceOrderStatus.SUBMITTED.value,
-            "shop_scene_pic_path": image_paths["shop_scene_pic_path"],
-            "shop_sign_board_pic_path": image_paths["shop_sign_board_pic_path"],
-            "business_license_pic_path": image_paths["business_license_pic_path"],
-            "merchant_name": data.merchant_name,
-            "shop_name": data.shop_name,
-            "shop_address": data.shop_address,
-            "mcc_code": data.mcc_code,
-            "rate": data.rate,
-            "business_license_no": data.business_license_no,
-            "business_license_mobile": data.business_license_mobile,
+            "account": data.account,
+            "contact_name": data.contact_name,
+            "contact_mobile": data.contact_mobile,
+            "contact_email": data.contact_email,
+            "order_ticket": data.order_ticket,
             "sign_and_auth": data.sign_and_auth,
+            "rate": data.rate,
             "remark": data.remark,
+            "app_auth_token": confirm_result.app_auth_token,
+            "app_refresh_token": confirm_result.app_refresh_token,
+            "auth_app_id": confirm_result.auth_app_id,
+            "user_id": confirm_result.user_id,
+            "open_id": confirm_result.open_id,
+            "expires_in": confirm_result.expires_in,
+            "re_expires_in": confirm_result.re_expires_in,
             "next_query_time": now + timedelta(minutes=5),
             "query_count": 0,
         }
 
-        # 如果该企业已有已关闭的申请单,更新而非新建
         if existing:
             obj = await crud.get(id=existing.id, preload=[])
             if obj:
@@ -254,6 +225,8 @@ class FacetofaceService:
             update_data["order_no"] = result.order_no
         if result.confirm_url:
             update_data["confirm_url"] = result.confirm_url
+        if result.merchant_pid:
+            update_data["merchant_pid"] = result.merchant_pid
         if result.reject_reason:
             update_data["reject_reason"] = result.reject_reason
 
@@ -261,21 +234,28 @@ class FacetofaceService:
         if alipay_status:
             if alipay_status == "MERCHANT_CONFIRM":
                 update_data["order_status"] = FacetofaceOrderStatus.MERCHANT_CONFIRM.value
-                # 等待商家确认,继续轮询
                 update_data["next_query_time"] = now + timedelta(hours=4)
             elif alipay_status == "MERCHANT_AUDITING":
                 update_data["order_status"] = FacetofaceOrderStatus.MERCHANT_AUDITING.value
                 update_data["next_query_time"] = now + timedelta(hours=4)
-            elif alipay_status in ("MERCHANT_AGREED", "AGENT_BINDAPP_SUCCESS"):
+            elif alipay_status == "MERCHANT_CONFIRM_SUCCESS":
                 update_data["order_status"] = FacetofaceOrderStatus.SUCCESS.value
                 update_data["next_query_time"] = None
-            elif alipay_status in ("MERCHANT_REJECTED", "MERCHANT_CANCELLED", "AUDIT_REJECTED", "AUDIT_FAILED"):
+            elif alipay_status in ("MERCHANT_APPLY_ORDER_CANCELED", "MERCHANT_CONFIRM_TIME_OUT"):
                 update_data["order_status"] = FacetofaceOrderStatus.CLOSED.value
                 update_data["next_query_time"] = None
+            elif alipay_status == "MERCHANT_INFO_HOLD":
+                # 暂存状态,继续轮询
+                update_data["next_query_time"] = now + timedelta(hours=4)
             else:
+                # 未识别状态,继续轮询
                 update_data["next_query_time"] = now + timedelta(hours=4)
 
-        log.info(f"当面付申请单状态更新: batch_no={order.batch_no}, alipay_status={alipay_status}, local_status={update_data.get('order_status', order.order_status)}")
+        log.info(
+            f"当面付申请单状态更新: batch_no={order.batch_no}, "
+            f"alipay_status={alipay_status}, "
+            f"local_status={update_data.get('order_status', order.order_status)}"
+        )
 
         obj = await crud.get(id=order.id, preload=[])
         if obj:
@@ -284,11 +264,20 @@ class FacetofaceService:
                     setattr(obj, key, value)
             await crud.auth.db.flush()
 
+    @classmethod
+    async def get_by_enterprise_service(
+        cls, auth: AuthSchema, enterprise_id: str
+    ) -> FacetofaceOrderOutSchema | None:
+        crud = FacetofaceCRUD(auth)
+        order = await crud.get_by_enterprise_id(enterprise_id)
+        if not order:
+            return None
+        return FacetofaceOrderOutSchema.model_validate(order)
+
     @classmethod
     async def batch_status_service(
         cls, auth: AuthSchema, enterprise_ids: list[str]
     ) -> dict[str, str | None]:
-        """批量查询企业当面付状态"""
         crud = FacetofaceCRUD(auth)
         result: dict[str, str | None] = {}
         for eid in enterprise_ids:
@@ -296,17 +285,6 @@ class FacetofaceService:
             result[eid] = order.order_status if order else None
         return result
 
-    @classmethod
-    async def get_by_enterprise_service(
-        cls, auth: AuthSchema, enterprise_id: str
-    ) -> FacetofaceOrderOutSchema | None:
-        """按企业ID查询当面付申请单"""
-        crud = FacetofaceCRUD(auth)
-        order = await crud.get_by_enterprise_id(enterprise_id)
-        if not order:
-            return None
-        return FacetofaceOrderOutSchema.model_validate(order)
-
     @classmethod
     async def list_service(
         cls,
@@ -315,7 +293,6 @@ class FacetofaceService:
         page_size: int = 20,
         search: dict | None = None,
     ) -> dict:
-        """查询申请单列表"""
         crud = FacetofaceCRUD(auth)
         offset = (page_no - 1) * page_size
         return await crud.page(
@@ -330,39 +307,16 @@ class FacetofaceService:
     async def detail_service(
         cls, auth: AuthSchema, order_id: int
     ) -> FacetofaceOrderOutSchema:
-        """查询申请单详情"""
         crud = FacetofaceCRUD(auth)
         order = await crud.get(id=order_id)
         if not order:
             raise CustomException(msg="申请单不存在")
         return FacetofaceOrderOutSchema.model_validate(order)
 
-    @classmethod
-    async def _save_uploaded_file(cls, upload_file: UploadFile) -> str:
-        """保存上传的文件到本地,返回文件路径"""
-        await upload_file.seek(0)
-        content = await upload_file.read()
-        await upload_file.seek(0)
-
-        ext = os.path.splitext(upload_file.filename or "file")[1] or ".jpg"
-        safe_name = f"f2f_{datetime.now().strftime('%Y%m%d%H%M%S')}_{os.urandom(4).hex()}{ext}"
-
-        upload_dir = settings.UPLOAD_FILE_PATH.joinpath("facetoface", datetime.now().strftime("%Y/%m/%d"))
-        upload_dir.mkdir(parents=True, exist_ok=True)
-        filepath = upload_dir.joinpath(safe_name)
-
-        with open(filepath, "wb") as f:
-            f.write(content)
-
-        log.info(f"当面付图片已保存: {filepath}")
-        return str(filepath)
-
     @classmethod
     async def poll_pending_orders(cls) -> int:
         """
         轮询待处理的申请单(供定时任务调用)
-
-        返回本次处理的申请单数量
         """
         from app.core.database import async_db_session
 

File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/css/index.inhIJ3yF.css


+ 2 - 2
frontend/dist/index.html

@@ -10,7 +10,7 @@
       content=""
     />
     <title>Pyament Platform</title>
-    <script type="module" crossorigin src="/js/index.4bnNbR0E.js"></script>
+    <script type="module" crossorigin src="/js/index.DA4qvbdk.js"></script>
     <link rel="modulepreload" crossorigin href="/js/dayjs.DCWbrgJ0.js">
     <link rel="modulepreload" crossorigin href="/js/@vue.DbmRtknU.js">
     <link rel="modulepreload" crossorigin href="/js/lodash-es.DaM9m3L-.js">
@@ -20,7 +20,7 @@
     <link rel="modulepreload" crossorigin href="/js/memoize-one.BAtLgO95.js">
     <link rel="modulepreload" crossorigin href="/js/normalize-wheel-es.TzhA1irr.js">
     <link rel="modulepreload" crossorigin href="/js/@floating-ui.8vigAAFV.js">
-    <link rel="modulepreload" crossorigin href="/js/element-plus.D3rgKCI4.js">
+    <link rel="modulepreload" crossorigin href="/js/element-plus.DUy1TWHM.js">
     <link rel="modulepreload" crossorigin href="/js/pinia.BlfmsheH.js">
     <link rel="modulepreload" crossorigin href="/js/@vueuse.Dnsd2JKX.js">
     <link rel="modulepreload" crossorigin href="/js/@intlify.DPMNdUn_.js">

File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/401.B_Okh4G1.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/404.BuhxiUex.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/AccountOverview.MUSWmnA_.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/ChatInput.Bva9mUo5.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/ChatMessages.DbE-PM3o.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/ChatNavbar.BCYTyUMV.js


File diff ditekan karena terlalu besar
+ 1 - 1
frontend/dist/js/ConfigInfoDrawer.BNhs8WrE.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/ConsumeDetail.2iJiiZV8.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/CreateTableDialog.C6QC3Y_G.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/DataDrawer.BhOhVBaK.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/DataDrawer.DWcqaGZz.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/DepartmentDetail.ADC878Qk.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/DepartmentForm.Ca_HHA31.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/DeptTree.CDLv66ow.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/EdgeConfigPanel.DVTNo_rg.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/EmployeeForm.DTAifFCq.js


+ 1 - 1
frontend/dist/js/ExternalLink.91AT7pEq.js → frontend/dist/js/ExternalLink.oMCLRW6e.js

@@ -1 +1 @@
-import{u as s}from"./vue-router.yxIMtaxH.js";import{M as i,aL as r,u as t,v as o,q as e}from"./@vue.DbmRtknU.js";import{_ as p}from"./index.4bnNbR0E.js";import"./dayjs.DCWbrgJ0.js";import"./element-plus.D3rgKCI4.js";import"./lodash-es.DaM9m3L-.js";import"./async-validator.j0i5Y79Y.js";import"./@popperjs.DxtSUbXb.js";import"./@ctrl.BEgk5vdO.js";import"./memoize-one.BAtLgO95.js";import"./normalize-wheel-es.TzhA1irr.js";import"./@floating-ui.8vigAAFV.js";import"./pinia.BlfmsheH.js";import"./@vueuse.Dnsd2JKX.js";import"./vue-i18n.DXLOBfKS.js";import"./@intlify.DPMNdUn_.js";import"./nprogress.BTjJXJ-u.js";import"./codemirror.CYSLATvI.js";import"./diff-match-patch.DkK4wJpa.js";import"./vue-web-terminal.D-rog7dz.js";import"./vue.MGxsMDTR.js";/* empty css                    */import"./axios.Da-QW0H8.js";import"./qs.BQjOrGHM.js";import"./side-channel.4q28KFJj.js";import"./es-errors.DTEWvbA_.js";import"./object-inspect.DvQZIv3_.js";import"./side-channel-list.Do0-XmF5.js";import"./side-channel-map.DNHQ53lO.js";import"./get-intrinsic.Bbe5x-9b.js";import"./es-object-atoms.CyiuHMUS.js";import"./math-intrinsics.pM-JTNwN.js";import"./gopd.BudZp56J.js";import"./es-define-property.F0aoeP8o.js";import"./has-symbols.BcO-SUVM.js";import"./get-proto.Cb_fpw-j.js";import"./dunder-proto.WEH3rgQR.js";import"./call-bind-apply-helpers.DJjIjCF_.js";import"./function-bind.DrnB-baK.js";import"./hasown.BXcyoiLU.js";import"./call-bound.22gFUC2Q.js";import"./side-channel-weakmap.DpSeWE6i.js";import"./pinia-plugin-persistedstate.COWkwNh5.js";const m={class:"external-link-container"},a=["src"],n=p(i({__name:"ExternalLink",setup(i){const p=s(),n=e(()=>{var s;const i=null==(s=p.meta)?void 0:s.params,r=null==i?void 0:i.find(s=>"url"===s.key);return(null==r?void 0:r.value)||""});return(s,i)=>(r(),t("div",m,[o("iframe",{src:n.value,class:"external-link-iframe",frameborder:"0",width:"100%",height:"100%"},null,8,a)]))}}),[["__scopeId","data-v-ddb74517"]]);export{n as default};
+import{u as s}from"./vue-router.yxIMtaxH.js";import{M as i,aL as r,u as t,v as o,q as e}from"./@vue.DbmRtknU.js";import{_ as p}from"./index.DA4qvbdk.js";import"./dayjs.DCWbrgJ0.js";import"./element-plus.DUy1TWHM.js";import"./lodash-es.DaM9m3L-.js";import"./async-validator.j0i5Y79Y.js";import"./@popperjs.DxtSUbXb.js";import"./@ctrl.BEgk5vdO.js";import"./memoize-one.BAtLgO95.js";import"./normalize-wheel-es.TzhA1irr.js";import"./@floating-ui.8vigAAFV.js";import"./pinia.BlfmsheH.js";import"./@vueuse.Dnsd2JKX.js";import"./vue-i18n.DXLOBfKS.js";import"./@intlify.DPMNdUn_.js";import"./nprogress.BTjJXJ-u.js";import"./codemirror.CYSLATvI.js";import"./diff-match-patch.DkK4wJpa.js";import"./vue-web-terminal.D-rog7dz.js";import"./vue.MGxsMDTR.js";/* empty css                    */import"./axios.Da-QW0H8.js";import"./qs.BQjOrGHM.js";import"./side-channel.4q28KFJj.js";import"./es-errors.DTEWvbA_.js";import"./object-inspect.DvQZIv3_.js";import"./side-channel-list.Do0-XmF5.js";import"./side-channel-map.DNHQ53lO.js";import"./get-intrinsic.Bbe5x-9b.js";import"./es-object-atoms.CyiuHMUS.js";import"./math-intrinsics.pM-JTNwN.js";import"./gopd.BudZp56J.js";import"./es-define-property.F0aoeP8o.js";import"./has-symbols.BcO-SUVM.js";import"./get-proto.Cb_fpw-j.js";import"./dunder-proto.WEH3rgQR.js";import"./call-bind-apply-helpers.DJjIjCF_.js";import"./function-bind.DrnB-baK.js";import"./hasown.BXcyoiLU.js";import"./call-bound.22gFUC2Q.js";import"./side-channel-weakmap.DpSeWE6i.js";import"./pinia-plugin-persistedstate.COWkwNh5.js";const m={class:"external-link-container"},a=["src"],n=p(i({__name:"ExternalLink",setup(i){const p=s(),n=e(()=>{var s;const i=null==(s=p.meta)?void 0:s.params,r=null==i?void 0:i.find(s=>"url"===s.key);return(null==r?void 0:r.value)||""});return(s,i)=>(r(),t("div",m,[o("iframe",{src:n.value,class:"external-link-iframe",frameborder:"0",width:"100%",height:"100%"},null,8,a)]))}}),[["__scopeId","data-v-ddb74517"]]);export{n as default};

File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/GenBasicStep.Cf7NFvw5.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/GenCodeDrawer.Y-MtApRl.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/GenColumnsStep.D-vLt3q4.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/GenPreviewStep.CyPztHj5.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/GencodeHelpPanel.CrhhCk2p.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/ImportDbTableDialog.0vuwG-C0.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/InstitutionDetail.CZAlNueG.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/InstitutionDetail.DyJeeBod.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/InstitutionForm.C6l6uyCY.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/InviteDialog.DLlyXUBK.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/IssueBatchForm.tKTIH-nT.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/Login.BCSn0JPl.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/MessageItem.tFsC_ZmG.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/NodeConfigPanel.eVXhA8lc.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/PageContent.BbMtqJS6.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/QuotaList.Ca6sqg6C.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/QuotaList.yrxSEsFD.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/RuleForm.CfINdgJR.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/RuleList.CMwvOc5f.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/ScopeDialog.b4xVnEIo.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/Sidebar.Bjpi5nCT.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/TransferDetail.B6DdnL0u.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/UserTableSelect.CrH2H0OY.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/WelcomeScreen.DSXpY9kM.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/WorkflowDesignDrawer.CrBb6bAU.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/element-plus.DUy1TWHM.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/github.CQLrBYbE.js


File diff ditekan karena terlalu besar
+ 0 - 1
frontend/dist/js/index copy.B18dNqcj.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.4bnNbR0E.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.5n44_fRn.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.6W_xKRjb.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.AFRps8E_.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.BEM79XbV.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.BFDF0Oo-.js


File diff ditekan karena terlalu besar
+ 0 - 1
frontend/dist/js/index.BFyRIgJl.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.BGslBoqY.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.BL4xdu0l.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.BRVE3yma.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.B_dElfNO.js


+ 1 - 1
frontend/dist/js/index.Bh5WiWVl.js → frontend/dist/js/index.BbjEWaMs.js

@@ -1 +1 @@
-import{P as e}from"./vue-json-pretty.DEqWvEy3.js";import{M as t,aL as a,u as s,aw as r,s as o,bk as n,bb as l,q as u}from"./@vue.DbmRtknU.js";import{_ as p}from"./index.4bnNbR0E.js";const i={key:1,class:"json-pretty-fallback"},y=p(t({__name:"index",props:{value:{type:[String,Object,Array,Number,Boolean],default:""},height:{type:String,default:"240px"}},setup(t){const p=t,y=u(()=>{const e=p.value;if("string"==typeof e)try{return JSON.parse(e)}catch{return e}return e}),c=u(()=>"object"==typeof y.value&&null!==y.value),d=u(()=>{const e=p.value;return"string"==typeof e?e:JSON.stringify(e,null,2)});return(u,p)=>(a(),s("div",{class:"json-pretty-wrapper",style:r({maxHeight:t.height})},[c.value?(a(),o(n(e),{key:0,data:y.value,"show-line":!0,"show-icon":!0,"show-double-quotes":!1,"show-length":!0,deep:3},null,8,["data"])):(a(),s("pre",i,l(d.value),1))],4))}}),[["__scopeId","data-v-a0d23118"]]);export{y as J};
+import{P as e}from"./vue-json-pretty.DEqWvEy3.js";import{M as t,aL as a,u as s,aw as r,s as o,bk as n,bb as l,q as u}from"./@vue.DbmRtknU.js";import{_ as p}from"./index.DA4qvbdk.js";const i={key:1,class:"json-pretty-fallback"},y=p(t({__name:"index",props:{value:{type:[String,Object,Array,Number,Boolean],default:""},height:{type:String,default:"240px"}},setup(t){const p=t,y=u(()=>{const e=p.value;if("string"==typeof e)try{return JSON.parse(e)}catch{return e}return e}),c=u(()=>"object"==typeof y.value&&null!==y.value),d=u(()=>{const e=p.value;return"string"==typeof e?e:JSON.stringify(e,null,2)});return(u,p)=>(a(),s("div",{class:"json-pretty-wrapper",style:r({maxHeight:t.height})},[c.value?(a(),o(n(e),{key:0,data:y.value,"show-line":!0,"show-icon":!0,"show-double-quotes":!1,"show-length":!0,deep:3},null,8,["data"])):(a(),s("pre",i,l(d.value),1))],4))}}),[["__scopeId","data-v-a0d23118"]]);export{y as J};

File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.Be8Bawir.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.Biard4mi.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.BnIzSfCg.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.BqR4Tldw.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.BqZQ1U_9.js


File diff ditekan karena terlalu besar
+ 1 - 0
frontend/dist/js/index.BsULxyU3.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.C-wNWx2X.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.C1PTpZMw.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.C9vdlb95.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.CAPLxEOt.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.CO-zK6md.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.CS4qQIe1.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.CU87zUE7.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.CUPYftkF.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.Ce8F_9kJ.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.CnMaBBiw.js


+ 1 - 1
frontend/dist/js/index.CrL8JUPR.js → frontend/dist/js/index.CwRnxs-M.js

@@ -1 +1 @@
-import{e,f as a}from"./element-plus.D3rgKCI4.js";import{M as t,bq as i,bE as u,aL as l,s as n,bJ as o,v as p,I as s,au as r,aq as d}from"./@vue.DbmRtknU.js";import{_ as g}from"./index.4bnNbR0E.js";const m=g(t({__name:"index",props:d({total:{type:Number,default:0},pageSizes:{type:Array,default:()=>[10,20,30,50]},layout:{type:String,default:"total, sizes, prev, pager, next, jumper"},background:{type:Boolean,default:!0},autoScroll:{type:Boolean,default:!0},hidden:{type:Boolean,default:!1}},{page:{type:Number,required:!0,default:1},pageModifiers:{},limit:{type:Number,required:!0,default:10},limitModifiers:{}}),emits:d(["pagination"],["update:page","update:limit"]),setup(t,{emit:d}){const g=t,m=d,c=i(t,"page"),f=i(t,"limit");function v(e){c.value=1,m("pagination",{page:c.value,limit:e})}function y(e){m("pagination",{page:e,limit:f.value})}return u(()=>g.total,e=>{const a=Math.ceil(e/f.value);e>0&&c.value>a&&(c.value=a,m("pagination",{page:c.value,limit:f.value}))}),(i,u)=>{const d=a,g=e;return l(),n(g,null,{default:o(()=>[p("div",{class:r([{hidden:t.hidden},"pagination"])},[s(d,{"current-page":c.value,"onUpdate:currentPage":u[0]||(u[0]=e=>c.value=e),"page-size":f.value,"onUpdate:pageSize":u[1]||(u[1]=e=>f.value=e),background:t.background,layout:t.layout,"page-sizes":t.pageSizes,total:t.total,onSizeChange:v,onCurrentChange:y},null,8,["current-page","page-size","background","layout","page-sizes","total"])],2)]),_:1})}}}),[["__scopeId","data-v-02079684"]]);export{m as _};
+import{e,f as a}from"./element-plus.DUy1TWHM.js";import{M as t,bq as i,bE as u,aL as l,s as n,bJ as o,v as p,I as s,au as r,aq as d}from"./@vue.DbmRtknU.js";import{_ as g}from"./index.DA4qvbdk.js";const m=g(t({__name:"index",props:d({total:{type:Number,default:0},pageSizes:{type:Array,default:()=>[10,20,30,50]},layout:{type:String,default:"total, sizes, prev, pager, next, jumper"},background:{type:Boolean,default:!0},autoScroll:{type:Boolean,default:!0},hidden:{type:Boolean,default:!1}},{page:{type:Number,required:!0,default:1},pageModifiers:{},limit:{type:Number,required:!0,default:10},limitModifiers:{}}),emits:d(["pagination"],["update:page","update:limit"]),setup(t,{emit:d}){const g=t,m=d,c=i(t,"page"),f=i(t,"limit");function v(e){c.value=1,m("pagination",{page:c.value,limit:e})}function y(e){m("pagination",{page:e,limit:f.value})}return u(()=>g.total,e=>{const a=Math.ceil(e/f.value);e>0&&c.value>a&&(c.value=a,m("pagination",{page:c.value,limit:f.value}))}),(i,u)=>{const d=a,g=e;return l(),n(g,null,{default:o(()=>[p("div",{class:r([{hidden:t.hidden},"pagination"])},[s(d,{"current-page":c.value,"onUpdate:currentPage":u[0]||(u[0]=e=>c.value=e),"page-size":f.value,"onUpdate:pageSize":u[1]||(u[1]=e=>f.value=e),background:t.background,layout:t.layout,"page-sizes":t.pageSizes,total:t.total,onSizeChange:v,onCurrentChange:y},null,8,["current-page","page-size","background","layout","page-sizes","total"])],2)]),_:1})}}}),[["__scopeId","data-v-02079684"]]);export{m as _};

File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DA4qvbdk.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DEzj8Q_r.js


File diff ditekan karena terlalu besar
+ 0 - 1
frontend/dist/js/index.DGLdFR_J.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DITLLgVZ.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DLMAguNA.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DNUDVLkx.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DNzbL0f8.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DTITaP9Y.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DgWivzY3.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.Dir43w02.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DyS0bA__.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.DzsxLpTg.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.J3b3-jc3.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.JeWdgvjx.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.QsDPhaDr.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.Ut_HHvXm.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index._ZqfbF60.js


+ 1 - 1
frontend/dist/js/index.BAWVRpmK.js → frontend/dist/js/index.fwuhDT_d.js

@@ -1 +1 @@
-import{aU as e,aD as t,bL as r,aL as n,u as s,v as a,aw as o,q as i,M as l,az as c,I as u,bk as d}from"./@vue.DbmRtknU.js";import{O as p}from"./element-plus.D3rgKCI4.js";import{_ as m}from"./index.4bnNbR0E.js";const _=["src"],v=m({__name:"index",props:{src:{type:String,required:!0}},setup(l){const c=l,u=e(document.documentElement.clientHeight-94.5+"px;"),d=e(!0),m=i(()=>c.src);return t(()=>{setTimeout(()=>{d.value=!1},300)}),(e,t)=>{const i=p;return r((n(),s("div",{style:o("height:"+u.value)},[a("iframe",{src:m.value,frameborder:"0",width:"100%",height:"100%",scrolling:"auto"},null,8,_)],4)),[[i,d.value]])}}},[["__scopeId","data-v-c20c8d45"]]),f={class:"app-container"},b=l({name:"Docs",inheritAttrs:!1,__name:"index",setup(t){const r=e("/api/v1/docs");return c(()=>{window.onresize=null}),(e,t)=>{const a=v;return n(),s("div",f,[u(a,{src:d(r)},null,8,["src"])])}}}),g=Object.freeze(Object.defineProperty({__proto__:null,default:b},Symbol.toStringTag,{value:"Module"})),j={class:"app-container"},h=l({name:"Docs",inheritAttrs:!1,__name:"index",setup(t){const r=e("/api/v1/ljdoc");return c(()=>{window.onresize=null}),(e,t)=>{const a=v;return n(),s("div",j,[u(a,{src:d(r)},null,8,["src"])])}}}),w=Object.freeze(Object.defineProperty({__proto__:null,default:h},Symbol.toStringTag,{value:"Module"})),y={class:"app-container"},x=l({name:"Redoc",inheritAttrs:!1,__name:"index",setup(t){const r=e("/api/v1/redoc");return c(()=>{window.onresize=null}),(e,t)=>{const a=v;return n(),s("div",y,[u(a,{src:d(r)},null,8,["src"])])}}}),z=Object.freeze(Object.defineProperty({__proto__:null,default:x},Symbol.toStringTag,{value:"Module"}));export{w as a,z as b,g as i};
+import{aU as e,aD as t,bL as r,aL as n,u as s,v as a,aw as o,q as i,M as l,az as c,I as u,bk as d}from"./@vue.DbmRtknU.js";import{O as p}from"./element-plus.DUy1TWHM.js";import{_ as m}from"./index.DA4qvbdk.js";const _=["src"],v=m({__name:"index",props:{src:{type:String,required:!0}},setup(l){const c=l,u=e(document.documentElement.clientHeight-94.5+"px;"),d=e(!0),m=i(()=>c.src);return t(()=>{setTimeout(()=>{d.value=!1},300)}),(e,t)=>{const i=p;return r((n(),s("div",{style:o("height:"+u.value)},[a("iframe",{src:m.value,frameborder:"0",width:"100%",height:"100%",scrolling:"auto"},null,8,_)],4)),[[i,d.value]])}}},[["__scopeId","data-v-c20c8d45"]]),f={class:"app-container"},b=l({name:"Docs",inheritAttrs:!1,__name:"index",setup(t){const r=e("/api/v1/docs");return c(()=>{window.onresize=null}),(e,t)=>{const a=v;return n(),s("div",f,[u(a,{src:d(r)},null,8,["src"])])}}}),g=Object.freeze(Object.defineProperty({__proto__:null,default:b},Symbol.toStringTag,{value:"Module"})),j={class:"app-container"},h=l({name:"Docs",inheritAttrs:!1,__name:"index",setup(t){const r=e("/api/v1/ljdoc");return c(()=>{window.onresize=null}),(e,t)=>{const a=v;return n(),s("div",j,[u(a,{src:d(r)},null,8,["src"])])}}}),w=Object.freeze(Object.defineProperty({__proto__:null,default:h},Symbol.toStringTag,{value:"Module"})),y={class:"app-container"},x=l({name:"Redoc",inheritAttrs:!1,__name:"index",setup(t){const r=e("/api/v1/redoc");return c(()=>{window.onresize=null}),(e,t)=>{const a=v;return n(),s("div",y,[u(a,{src:d(r)},null,8,["src"])])}}}),z=Object.freeze(Object.defineProperty({__proto__:null,default:x},Symbol.toStringTag,{value:"Module"}));export{w as a,z as b,g as i};

File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.jdVFi9sq.js


File diff ditekan karena terlalu besar
+ 0 - 0
frontend/dist/js/index.o0EjCS4X.js


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini