Ver Fonte

feat(facetoface): 补充完整字段 + 图片上传,必填校验

- 后端 model 新增 shop_scene_pic_path / shop_sign_board_pic_path / business_license_pic_path
- schema 中 shop_address/mcc_code/rate/business_license_no 改为必填
- controller 改为 multipart/form-data 接收 (JSON data + 3个图片文件)
- service 创建 FileItem 传给支付宝 SDK,图片保存到本地 UPLOAD_FILE_PATH
- 前端新增 3 个图片上传组件,必填校验,FormData 提交
alphah há 1 semana atrás
pai
commit
cbe44a4142
100 ficheiros alterados com 101 adições e 20 exclusões
  1. 16 5
      backend/app/plugin/module_payment/facetoface/controller.py
  2. 10 0
      backend/app/plugin/module_payment/facetoface/model.py
  3. 7 4
      backend/app/plugin/module_payment/facetoface/schema.py
  4. 60 1
      backend/app/plugin/module_payment/facetoface/service.py
  5. 0 0
      frontend/dist/css/index.DfsUjPOD.css
  6. 2 2
      frontend/dist/index.html
  7. 0 0
      frontend/dist/js/401.D4RujKSD.js
  8. 0 0
      frontend/dist/js/404.D-TFvqpO.js
  9. 0 0
      frontend/dist/js/AccountOverview.VNb3sSsA.js
  10. 0 0
      frontend/dist/js/ChatInput.NnJkDsyZ.js
  11. 0 0
      frontend/dist/js/ChatMessages.CxtBMqUT.js
  12. 0 0
      frontend/dist/js/ChatNavbar.CA_cifJO.js
  13. 1 1
      frontend/dist/js/ConfigInfoDrawer.D28Cne5o.js
  14. 0 0
      frontend/dist/js/ConsumeDetail.BWe-XAm9.js
  15. 0 0
      frontend/dist/js/CreateTableDialog.D-ZMZUMn.js
  16. 0 0
      frontend/dist/js/DataDrawer.DHSCvnHU.js
  17. 0 0
      frontend/dist/js/DataDrawer.DWcqaGZz.js
  18. 0 0
      frontend/dist/js/DepartmentDetail.mI8PtOsC.js
  19. 0 0
      frontend/dist/js/DepartmentForm.tmuCJuNd.js
  20. 0 0
      frontend/dist/js/DeptTree.o3p9l2SU.js
  21. 0 0
      frontend/dist/js/EdgeConfigPanel.BbsrFKzn.js
  22. 0 0
      frontend/dist/js/EmployeeForm.Bboz-TSQ.js
  23. 1 1
      frontend/dist/js/ExternalLink.91AT7pEq.js
  24. 0 0
      frontend/dist/js/GenBasicStep.BynqcssT.js
  25. 0 0
      frontend/dist/js/GenCodeDrawer.DkttlhQR.js
  26. 0 0
      frontend/dist/js/GenColumnsStep.Br-aWYQ8.js
  27. 0 0
      frontend/dist/js/GenPreviewStep.D7yJ0gex.js
  28. 0 0
      frontend/dist/js/GencodeHelpPanel.CMOX7glN.js
  29. 0 0
      frontend/dist/js/ImportDbTableDialog.NUfZN98p.js
  30. 0 0
      frontend/dist/js/InstitutionDetail.DyJeeBod.js
  31. 0 0
      frontend/dist/js/InstitutionDetail.RoEnI7gP.js
  32. 0 0
      frontend/dist/js/InstitutionForm.WK7lGGAL.js
  33. 0 0
      frontend/dist/js/InviteDialog.2FLpYvSE.js
  34. 0 0
      frontend/dist/js/IssueBatchForm.DAp0J4s3.js
  35. 0 0
      frontend/dist/js/Login.Bz5QxPY0.js
  36. 0 0
      frontend/dist/js/MessageItem.B0rJD67E.js
  37. 0 0
      frontend/dist/js/NodeConfigPanel.DeSY_6Ah.js
  38. 0 0
      frontend/dist/js/PageContent.B1uSmT1Y.js
  39. 0 0
      frontend/dist/js/QuotaList.wB5GldbV.js
  40. 0 0
      frontend/dist/js/QuotaList.yrxSEsFD.js
  41. 0 0
      frontend/dist/js/RuleForm.CThOABFf.js
  42. 0 0
      frontend/dist/js/RuleList.DGYqfF6W.js
  43. 0 0
      frontend/dist/js/ScopeDialog.CVsMbOpT.js
  44. 0 0
      frontend/dist/js/Sidebar.DT9_orc5.js
  45. 0 0
      frontend/dist/js/TransferDetail.B1s5sNEt.js
  46. 0 0
      frontend/dist/js/UserTableSelect.BCEUkA3h.js
  47. 0 0
      frontend/dist/js/WelcomeScreen.EzdOpxah.js
  48. 0 0
      frontend/dist/js/WorkflowDesignDrawer.C3lXc1mk.js
  49. 0 0
      frontend/dist/js/element-plus.D3rgKCI4.js
  50. 0 0
      frontend/dist/js/github.BgQplNdF.js
  51. 0 1
      frontend/dist/js/index copy.CLdVw8Rn.js
  52. 0 0
      frontend/dist/js/index.-WglgRN2.js
  53. 0 0
      frontend/dist/js/index.4bnNbR0E.js
  54. 0 0
      frontend/dist/js/index.5n44_fRn.js
  55. 0 0
      frontend/dist/js/index.B2YEX3v2.js
  56. 0 1
      frontend/dist/js/index.B4P18P9L.js
  57. 0 0
      frontend/dist/js/index.B8a8_W-o.js
  58. 1 1
      frontend/dist/js/index.BAWVRpmK.js
  59. 0 0
      frontend/dist/js/index.BBEaVb3x.js
  60. 1 0
      frontend/dist/js/index.BFyRIgJl.js
  61. 0 0
      frontend/dist/js/index.BOMYnevp.js
  62. 0 0
      frontend/dist/js/index.BSlxMm2p.js
  63. 0 0
      frontend/dist/js/index.B_98wDJw.js
  64. 0 0
      frontend/dist/js/index.B_YLKG-8.js
  65. 1 1
      frontend/dist/js/index.Bh5WiWVl.js
  66. 0 0
      frontend/dist/js/index.Biard4mi.js
  67. 0 0
      frontend/dist/js/index.BnIzSfCg.js
  68. 0 0
      frontend/dist/js/index.BqMt-nvY.js
  69. 0 0
      frontend/dist/js/index.ByPFzEOR.js
  70. 0 0
      frontend/dist/js/index.CS4qQIe1.js
  71. 0 0
      frontend/dist/js/index.CUPYftkF.js
  72. 0 0
      frontend/dist/js/index.CiXIZUYz.js
  73. 0 0
      frontend/dist/js/index.CmEP8F3-.js
  74. 1 1
      frontend/dist/js/index.CrL8JUPR.js
  75. 0 0
      frontend/dist/js/index.Cu2C_PTP.js
  76. 0 0
      frontend/dist/js/index.CypQ9D5K.js
  77. 0 0
      frontend/dist/js/index.D0yQ8qyV.js
  78. 0 0
      frontend/dist/js/index.D1kcPmdc.js
  79. 0 0
      frontend/dist/js/index.DEzj8Q_r.js
  80. 0 0
      frontend/dist/js/index.DG0t9aKB.js
  81. 0 0
      frontend/dist/js/index.DGJvnmN-.js
  82. 0 0
      frontend/dist/js/index.DLMAguNA.js
  83. 0 0
      frontend/dist/js/index.DMmn0seZ.js
  84. 0 0
      frontend/dist/js/index.DOSAwatY.js
  85. 0 0
      frontend/dist/js/index.DPbf6GXG.js
  86. 0 0
      frontend/dist/js/index.DTITaP9Y.js
  87. 0 0
      frontend/dist/js/index.DakRV9kS.js
  88. 0 0
      frontend/dist/js/index.DeVJZQ6e.js
  89. 0 0
      frontend/dist/js/index.Der-rA5i.js
  90. 0 0
      frontend/dist/js/index.DnzTpneR.js
  91. 0 0
      frontend/dist/js/index.Dqkc0D5x.js
  92. 0 0
      frontend/dist/js/index.DuqpLkVi.js
  93. 0 0
      frontend/dist/js/index.JeWdgvjx.js
  94. 0 0
      frontend/dist/js/index.NA5nIfE-.js
  95. 0 0
      frontend/dist/js/index.QLDyurM2.js
  96. 0 0
      frontend/dist/js/index.Rsa3Vonu.js
  97. 0 0
      frontend/dist/js/index.UmPBp-bo.js
  98. 0 0
      frontend/dist/js/index._ZqfbF60.js
  99. 0 1
      frontend/dist/js/index.dWIY_WKH.js
  100. 0 0
      frontend/dist/js/index.rWr9VTD0.js

+ 16 - 5
backend/app/plugin/module_payment/facetoface/controller.py

@@ -1,7 +1,8 @@
+import json
 from typing import Annotated
 
 from apscheduler.schedulers.asyncio import AsyncIOScheduler
-from fastapi import APIRouter, Depends, Path, Query
+from fastapi import APIRouter, Depends, Form, Path, Query, UploadFile
 from fastapi.responses import JSONResponse
 
 from app.api.v1.module_system.auth.schema import AuthSchema
@@ -27,15 +28,25 @@ FacetofaceRouter = APIRouter(
 @FacetofaceRouter.post(
     "/apply",
     summary="提交当面付开通申请",
-    description="代商家提交当面付开通申请(自动完成 create → sign → confirm 三步)",
+    description="代商家提交当面付开通申请(自动完成 create → sign → confirm 三步),支持图片上传",
     response_model=ResponseSchema[FacetofaceOrderOutSchema],
 )
 async def apply_controller(
     auth: Annotated[AuthSchema, Depends(AuthPermission(["module_payment:facetoface:apply"]))],
-    data: FacetofaceApplySchema,
+    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,
 ) -> JSONResponse:
-    result = await FacetofaceService.apply_service(auth=auth, data=data)
-    log.info(f"当面付开通申请已提交: batch_no={result.batch_no}, merchant={data.merchant_name}")
+    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="当面付开通申请已提交")
 
 

+ 10 - 0
backend/app/plugin/module_payment/facetoface/model.py

@@ -55,6 +55,16 @@ class FacetofaceOrderModel(PaymentModelMixin, TenantMixin):
         Boolean, default=False, comment="是否同时获取授权"
     )
 
+    shop_scene_pic_path: Mapped[str | None] = mapped_column(
+        String(256), comment="店铺场景照片路径"
+    )
+    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="商家确认链接"
     )

+ 7 - 4
backend/app/plugin/module_payment/facetoface/schema.py

@@ -10,10 +10,10 @@ class FacetofaceApplySchema(BaseModel):
     enterprise_id: str = Field(description="关联企业ID")
     merchant_name: str = Field(description="商户名称")
     shop_name: str = Field(description="店铺名称")
-    shop_address: Optional[str] = Field(default=None, description="店铺地址")
-    mcc_code: Optional[str] = Field(default=None, description="商户类别码")
-    rate: Optional[str] = Field(default=None, description="费率,如 0.006")
-    business_license_no: Optional[str] = Field(default=None, 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="是否同时获取商家授权")
     remark: Optional[str] = Field(default=None, description="备注")
@@ -37,6 +37,9 @@ class FacetofaceOrderOutSchema(BaseModel):
     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="营业执照照片")
     confirm_url: Optional[str] = Field(default=None, description="商家确认链接")
     app_auth_token: Optional[str] = Field(default=None, description="商家授权token")
     reject_reason: Optional[str] = Field(default=None, description="驳回原因")

+ 60 - 1
backend/app/plugin/module_payment/facetoface/service.py

@@ -1,9 +1,15 @@
+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
@@ -19,13 +25,19 @@ class FacetofaceService:
 
     @classmethod
     async def apply_service(
-        cls, auth: AuthSchema, data: FacetofaceApplySchema
+        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
         """
+        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
@@ -83,6 +95,30 @@ class FacetofaceService:
         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
+
         response = client.execute(sign_request)
         if not response:
             raise CustomException(msg="提交当面付申请失败: 无响应")
@@ -119,6 +155,9 @@ class FacetofaceService:
             "enterprise_id": data.enterprise_id,
             "batch_no": batch_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,
@@ -298,6 +337,26 @@ class FacetofaceService:
             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:
         """

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/css/index.DfsUjPOD.css


+ 2 - 2
frontend/dist/index.html

@@ -10,7 +10,7 @@
       content=""
     />
     <title>Pyament Platform</title>
-    <script type="module" crossorigin src="/js/index.DnzTpneR.js"></script>
+    <script type="module" crossorigin src="/js/index.4bnNbR0E.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.DYHj_7Hl.js">
+    <link rel="modulepreload" crossorigin href="/js/element-plus.D3rgKCI4.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">

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/401.D4RujKSD.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/404.D-TFvqpO.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/AccountOverview.VNb3sSsA.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/ChatInput.NnJkDsyZ.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/ChatMessages.CxtBMqUT.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/ChatNavbar.CA_cifJO.js


Diff do ficheiro suprimidas por serem muito extensas
+ 1 - 1
frontend/dist/js/ConfigInfoDrawer.D28Cne5o.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/ConsumeDetail.BWe-XAm9.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/CreateTableDialog.D-ZMZUMn.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/DataDrawer.DHSCvnHU.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/DataDrawer.DWcqaGZz.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/DepartmentDetail.mI8PtOsC.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/DepartmentForm.tmuCJuNd.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/DeptTree.o3p9l2SU.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/EdgeConfigPanel.BbsrFKzn.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/EmployeeForm.Bboz-TSQ.js


+ 1 - 1
frontend/dist/js/ExternalLink.Cn3YP1oI.js → frontend/dist/js/ExternalLink.91AT7pEq.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.DnzTpneR.js";import"./dayjs.DCWbrgJ0.js";import"./element-plus.DYHj_7Hl.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.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};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/GenBasicStep.BynqcssT.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/GenCodeDrawer.DkttlhQR.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/GenColumnsStep.Br-aWYQ8.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/GenPreviewStep.D7yJ0gex.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/GencodeHelpPanel.CMOX7glN.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/ImportDbTableDialog.NUfZN98p.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/InstitutionDetail.DyJeeBod.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/InstitutionDetail.RoEnI7gP.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/InstitutionForm.WK7lGGAL.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/InviteDialog.2FLpYvSE.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/IssueBatchForm.DAp0J4s3.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/Login.Bz5QxPY0.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/MessageItem.B0rJD67E.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/NodeConfigPanel.DeSY_6Ah.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/PageContent.B1uSmT1Y.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/QuotaList.wB5GldbV.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/QuotaList.yrxSEsFD.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/RuleForm.CThOABFf.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/RuleList.DGYqfF6W.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/ScopeDialog.CVsMbOpT.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/Sidebar.DT9_orc5.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/TransferDetail.B1s5sNEt.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/UserTableSelect.BCEUkA3h.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/WelcomeScreen.EzdOpxah.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/WorkflowDesignDrawer.C3lXc1mk.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/element-plus.D3rgKCI4.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/github.BgQplNdF.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 1
frontend/dist/js/index copy.CLdVw8Rn.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.-WglgRN2.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.4bnNbR0E.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.5n44_fRn.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.B2YEX3v2.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 1
frontend/dist/js/index.B4P18P9L.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.B8a8_W-o.js


+ 1 - 1
frontend/dist/js/index.mmuNwm8z.js → frontend/dist/js/index.BAWVRpmK.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.DYHj_7Hl.js";import{_ as m}from"./index.DnzTpneR.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.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};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.BBEaVb3x.js


Diff do ficheiro suprimidas por serem muito extensas
+ 1 - 0
frontend/dist/js/index.BFyRIgJl.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.BOMYnevp.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.BSlxMm2p.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.B_98wDJw.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.B_YLKG-8.js


+ 1 - 1
frontend/dist/js/index.BrfkZJnm.js → frontend/dist/js/index.Bh5WiWVl.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.DnzTpneR.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.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};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.Biard4mi.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.BnIzSfCg.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.BqMt-nvY.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.ByPFzEOR.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.CS4qQIe1.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.CUPYftkF.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.CiXIZUYz.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.CmEP8F3-.js


+ 1 - 1
frontend/dist/js/index.bSb3Sb83.js → frontend/dist/js/index.CrL8JUPR.js

@@ -1 +1 @@
-import{e,f as a}from"./element-plus.DYHj_7Hl.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.DnzTpneR.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.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 _};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.Cu2C_PTP.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.CypQ9D5K.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.D0yQ8qyV.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.D1kcPmdc.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DEzj8Q_r.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DG0t9aKB.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DGJvnmN-.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DLMAguNA.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DMmn0seZ.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DOSAwatY.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DPbf6GXG.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DTITaP9Y.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DakRV9kS.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DeVJZQ6e.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.Der-rA5i.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DnzTpneR.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.Dqkc0D5x.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.DuqpLkVi.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.JeWdgvjx.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.NA5nIfE-.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.QLDyurM2.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.Rsa3Vonu.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.UmPBp-bo.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index._ZqfbF60.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 1
frontend/dist/js/index.dWIY_WKH.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
frontend/dist/js/index.rWr9VTD0.js


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff