Bladeren bron

feat: 更新转账

gatsby 1 maand geleden
bovenliggende
commit
2b5370e185

+ 5 - 4
backend/app/plugin/module_payment/account/schema.py

@@ -33,11 +33,12 @@ class BankcardExtInfoSchema(BaseModel):
             raise ValueError(f"account_type 必须是 {['1', '2']}")
         return v
     
-    @field_validator("inst_name")
-    def validate_inst_name(cls, v: Optional[str]) -> Optional[str]:
-        if cls.account_type == "1" and v is None:
+    @model_validator(mode='after')
+    def validate_inst_name(self) -> 'BankcardExtInfoSchema':
+        """验证对公账户时inst_name必填"""
+        if self.account_type == "1" and self.inst_name is None:
             raise ValueError("当 account_type 是 1 时,inst_name 必填")
-        return v
+        return self
 
 class PayeeInfoSchema(BaseModel):
     """收款方信息"""

+ 4 - 4
backend/app/plugin/module_payment/account/service.py

@@ -227,13 +227,13 @@ class AccountService:
         enterprise = await EnterpriseCRUD(auth).get_by_enterprise_id(data.enterprise_id)
         if not enterprise:
             raise CustomException(msg="企业不存在")
-        if not enterprise.tenant_id != auth.tenant_id:
+        if enterprise.tenant_id != auth.tenant_id:
             raise CustomException(msg="无权限操作")
         
         # 检查资金专户是否存在
         account = await AccountCRUD(auth).get_by_enterprise_id(data.enterprise_id)
         if not account:
-            raise CustomException(msg="资金户不存在")
+            raise CustomException(msg="资金户不存在")
 
         model = AlipayCommerceEcTransAccountTransferModel()
         model.enterprise_id = enterprise.enterprise_id
@@ -241,7 +241,7 @@ class AccountService:
         model.out_biz_no = get_snowflake_id_str(auth.tenant_id)
         # 转账总金额,单位为元,精确到小数点后两位
         model.amount = str(data.amount)
-        model.order_title = data.order_title or "对公转账"
+        model.order_title = data.order_title or f"{enterprise.name}转账"
 
         payee_info = TransParticipant()
         payee_info.identity_type = data.payee_info.identity_type
@@ -268,7 +268,7 @@ class AccountService:
 
         if not result.is_success():
             log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
-            raise CustomException(msg=f"转账失败: {result.msg}")
+            raise CustomException(msg=f"转账失败: {result.sub_msg or result.msg or result.code}")
 
         transfer_crud = TransferCRUD(auth)
         transfer_data = {

+ 1 - 1
backend/app/plugin/module_payment/enterprise/service.py

@@ -173,7 +173,7 @@ class EnterpriseService:
         
         
         # 当状态为签约成功或认证时,调用支付宝查询企业详情
-        if data.status in [
+        if data.status and data.status in [
             EnterpriseStatusEnum.ENTERPRISE_ACTIVATED.value,
             EnterpriseStatusEnum.ENTERPRISE_AUTH.value
         ]:

+ 8 - 6
backend/app/plugin/module_payment/notification/handlers/account_handler.py

@@ -5,8 +5,9 @@ from redis.asyncio import Redis
 
 from app.api.v1.module_system.auth.schema import AuthSchema
 from app.core.logger import log
+from app.plugin.module_payment.enterprise.schema import EnterpriseCreateOrUpdateSchema
 from app.plugin.module_payment.notification.enums import AlipayNotifyMethodEnum
-
+from app.plugin.module_payment.enterprise.service import EnterpriseService
 from .base_handler import BaseHandler
 
 from ...points import PointsService
@@ -74,14 +75,15 @@ class AccountHandler(BaseHandler):
         """
         try:
             # 解析通知内容
-            authorize_info = content.get("authorize_info", {})
-            authorize_status = authorize_info.get("authorize_status")
-            enterprise_id = authorize_info.get("enterprise_id")
+            authorize_status = content.get("status") # NORMAL
+            enterprise_id = content.get("enterprise_id")
 
             log.info(f"转账授权通知: 状态={authorize_status}, 企业ID={enterprise_id}")
 
-            # 可以在这里处理授权状态变更
-            # 例如更新数据库中的授权状态
+            await EnterpriseService.update_service_from_alipay(
+                auth, 
+                EnterpriseCreateOrUpdateSchema(remark=authorize_status, enterprise_id=enterprise_id)
+            )
 
             return True
         except Exception as e:

+ 85 - 79
frontend/src/views/module_payment/account/components/AccountOverview.vue

@@ -9,13 +9,13 @@
       </template>
 
       <el-steps :active="currentStep" align-center finish-status="success" class="mb-6">
-        <el-step title="转账授权签约" :description="authorizeStatusText" />
-        <el-step title="开通资金专户" :description="accountStatusText" />
+        <el-step title="转账授权签约 & 开通资金账户" :description="authorizeStatusText" />
+        <!-- <el-step title="开通资金账户" :description="accountStatusText" /> -->
         <el-step title="账户充值" :description="depositStatusText" />
         <el-step title="进行转账" />
       </el-steps>
 
-      <div v-if="!accountData.account_book_id && authorizeStatus !== 'AUTHORIZED'" class="warning-box">
+      <!-- <div v-if="!accountData.account_book_id" class="warning-box">
         <el-alert
           title="您还未完成转账授权签约,无法开通资金专户"
           type="warning"
@@ -27,68 +27,18 @@
             <el-button type="primary" link @click="$emit('goTab', 'authorize')">转账授权签约</el-button>
           </template>
         </el-alert>
-      </div>
+      </div> -->
     </el-card>
 
-    <el-row :gutter="16" class="mt-4">
-      <el-col :span="6">
-        <el-card shadow="hover">
-          <div class="stat-item">
-            <div class="stat-label">签约状态</div>
-            <div class="stat-value">
-              <el-tag :type="getAuthorizeStatusType(authorizeStatus)">
-                {{ authorizeStatusText }}
-              </el-tag>
-            </div>
-          </div>
-        </el-card>
-      </el-col>
-
-      <!-- <el-col :span="6">
-        <el-card shadow="hover">
-          <div class="stat-item">
-            <div class="stat-label">专户状态</div>
-            <div class="stat-value">
-              <el-tag :type="getAccountStatusType(accountData.status)">
-                {{ accountData.status || '未开通' }}
-              </el-tag>
-            </div>
-          </div>
-        </el-card>
-      </el-col> -->
-
-      <el-col :span="6">
-        <el-card shadow="hover">
-          <div class="stat-item">
-            <div class="stat-label">专户ID</div>
-            <div class="stat-value text-truncate">
-              {{ accountData.account_book_id || '-' }}
-            </div>
-          </div>
-        </el-card>
-      </el-col>
-
-      <el-col :span="6">
-        <el-card shadow="hover">
-          <div class="stat-item">
-            <div class="stat-label">账户余额</div>
-            <div class="stat-value balance-value">
-              ¥{{ accountData.balance || '0.00' }}
-            </div>
-          </div>
-        </el-card>
-      </el-col>
-    </el-row>
-
-    <el-card class="mt-4">
-      <template #header>
+    <el-card class="">
+      <!-- <template #header>
         <div class="card-header">
           <span>快捷操作</span>
         </div>
-      </template>
+      </template> -->
 
       <div class="quick-actions">
-        <div class="action-item" :class="{ disabled: authorizeStatus !== 'AUTHORIZED' }">
+        <div class="action-item" :class="{ disabled: authorizeStatus === 'AUTHORIZED' || !!accountData.account_book_id }">
           <div class="action-icon">
             <el-icon :size="32"><Document /></el-icon>
           </div>
@@ -106,7 +56,7 @@
           </el-button>
         </div>
 
-        <div class="action-item" :class="{ disabled: authorizeStatus !== 'AUTHORIZED' || !!accountData.account_book_id }">
+        <div class="action-item" :class="{ disabled: authorizeStatus === 'AUTHORIZED' || !!accountData.account_book_id }">
           <div class="action-icon">
             <el-icon :size="32"><Coin /></el-icon>
           </div>
@@ -119,27 +69,27 @@
           <el-button
             v-hasPerm="['module_payment:account:create']"
             type="primary"
-            :disabled="authorizeStatus !== 'AUTHORIZED' || !!accountData.account_book_id"
+            :disabled="authorizeStatus === 'AUTHORIZED' || !!accountData.account_book_id"
             @click="$emit('goTab', 'create')"
           >
             {{ accountData.account_book_id ? '已开通' : '去开通' }}
           </el-button>
         </div>
 
-        <div class="action-item" :class="{ disabled: !accountData.account_book_id || accountData.status !== 'ACTIVE' }">
+        <div class="action-item" :class="{ disabled: !accountData.account_book_id}">
           <div class="action-icon">
             <el-icon :size="32"><Wallet /></el-icon>
           </div>
           <div class="action-title">账户充值</div>
           <div class="action-desc">
             <template v-if="!accountData.account_book_id">需先开通专户</template>
-            <template v-else-if="accountData.status !== 'ACTIVE'">专户状态异常</template>
+            <template v-else-if="accountData.status !== 'ON'">专户状态异常</template>
             <template v-else>立即充值</template>
           </div>
           <el-button
             v-hasPerm="['module_payment:account:deposit']"
             type="primary"
-            :disabled="!accountData.account_book_id || accountData.status !== 'ACTIVE'"
+            :disabled="!accountData.account_book_id"
             @click="$emit('goTab', 'deposit')"
           >
             去充值
@@ -168,6 +118,56 @@
       </div>
     </el-card>
 
+    <el-row :gutter="16" class="mt-4">
+      <el-col :span="6">
+        <el-card shadow="hover">
+          <div class="stat-item">
+            <div class="stat-label">签约状态</div>
+            <div class="stat-value">
+              <el-tag :type="getAuthorizeStatusType(authorizeStatus)">
+                {{ authorizeStatusText }}
+              </el-tag>
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="6">
+        <el-card shadow="hover">
+          <div class="stat-item">
+            <div class="stat-label">账户状态</div>
+            <div class="stat-value">
+              <el-tag :type="getAccountStatusType(accountData.status)">
+                {{ accountData.status || '未开通' }}
+              </el-tag>
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="6">
+        <el-card shadow="hover">
+          <div class="stat-item">
+            <div class="stat-label">账户号</div>
+            <div class="stat-value text-truncate">
+              {{ accountData.account_book_id || '-' }}
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="6">
+        <el-card shadow="hover">
+          <div class="stat-item">
+            <div class="stat-label">账户余额</div>
+            <div class="stat-value balance-value">
+              ¥{{ accountData.balance || '0.00' }}
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+
     <el-card class="mt-4">
       <template #header>
         <div class="card-header">
@@ -181,14 +181,15 @@
           <el-empty description="暂无交易记录" />
         </template>
         <el-table-column prop="out_biz_no" label="订单号" min-width="180" show-overflow-tooltip />
-        <el-table-column prop="amount" label="金额" min-width="100">
+        <el-table-column prop="amount" label="转账金额" min-width="100">
           <template #default="{ row }">
-            <span :class="row.payee_info ? 'expense' : 'income'">
-              {{ row.payee_info ? '-' : '+' }}¥{{ row.amount }}
+            <span class="amount">
+              <!-- {{ row.payee_info ? '-' : '+' }}¥{{ row.amount }} -->
+                ¥{{ row.amount }}
             </span>
           </template>
         </el-table-column>
-        <el-table-column prop="payee_info.name" label="方" min-width="120" show-overflow-tooltip>
+        <el-table-column prop="payee_info.name" label="收款方" min-width="120" show-overflow-tooltip>
           <template #default="{ row }">
             {{ row.payee_info?.name || '-' }}
           </template>
@@ -196,7 +197,7 @@
         <el-table-column prop="status" label="状态" min-width="100">
           <template #default="{ row }">
             <el-tag :type="getTransferStatusType(row.status)">
-              {{ row.status }}
+              {{ getStatusLabel(row.status) }}
             </el-tag>
           </template>
         </el-table-column>
@@ -234,11 +235,11 @@ const recentTransfers = ref<any[]>([]);
 
 const currentEnterpriseId = computed(() => props.enterpriseId || enterpriseStore.getCurrentEnterprise?.enterprise_id);
 
-const authorizeStatus = computed(() => 'ACTIVE');
+const authorizeStatus = computed(() =>  !!accountData.value.account_book_id ? "AUTHORIZED" : 'PENDING');
 
 const currentStep = computed(() => {
   if (authorizeStatus.value !== "AUTHORIZED") return 0;
-  if (!accountData.value.account_book_id) return 1;
+  // if (!accountData.value.account_book_id) return 1;
   if (!accountData.value.balance || accountData.value.balance <= 0) return 2;
   return 3;
 });
@@ -253,6 +254,16 @@ const authorizeStatusText = computed(() => {
   return map[authorizeStatus.value] || authorizeStatus.value;
 });
 
+function getStatusLabel(status: string) {
+  const map: Record<string, string> = {
+    DEALING: "处理中",
+    SUCCESS: "成功",
+    FAIL: "失败",
+    REFUND: "退票",
+  };
+  return map[status] || status;
+}
+
 const accountStatusText = computed(() => {
   if (!accountData.value.account_book_id) return "未开通";
   const map: Record<string, string> = {
@@ -280,9 +291,9 @@ function getAuthorizeStatusType(status: string) {
 
 function getAccountStatusType(status: string) {
   const map: Record<string, any> = {
-    ACTIVE: "success",
-    FROZEN: "warning",
-    CLOSED: "danger",
+    ON: "success",
+    // FROZEN: "warning",
+    // CLOSED: "danger",
   };
   return map[status] || "info";
 }
@@ -307,7 +318,6 @@ async function fetchAccountInfo() {
       const account = res.data.data[0];
       accountData.value = {
         account_book_id: account.account_book_id,
-        // account.available_amount转换成number保留两位小数显示
         balance: Number(account.available_amount),
         status: account.enable_status,
         scene: account.scene,
@@ -439,11 +449,7 @@ onMounted(() => {
   padding: 16px 0;
 }
 
-.expense {
-  color: #f56c6c;
-}
-
-.income {
+.amount {
   color: #67c23a;
 }
 </style>

+ 1 - 1
frontend/src/views/module_payment/account/components/TransferDetail.vue

@@ -17,7 +17,7 @@
         <el-descriptions-item label="企业ID">
           {{ detailData.enterprise_id || '-' }}
         </el-descriptions-item>
-        <el-descriptions-item label="资金专户号">
+        <el-descriptions-item label="资金账户">
           {{ detailData.account_book_id || '-' }}
         </el-descriptions-item>
         <el-descriptions-item label="转账金额">

File diff suppressed because it is too large
+ 606 - 189
frontend/src/views/module_payment/account/index.vue


+ 3 - 2
frontend/src/views/module_payment/employee/index.vue

@@ -70,7 +70,8 @@
           </template>
         </PageContent>
       </el-tab-pane>
-      <el-tab-pane label="部门信息">
+
+      <!-- <el-tab-pane label="部门信息">
         <PageSearch ref="deptSearchRef" :search-config="deptSearchConfig" @query-click="handleDeptQueryClick"
           @reset-click="handleDeptResetClick" />
 
@@ -139,7 +140,7 @@
             </div>
           </template>
         </PageContent>
-      </el-tab-pane>
+      </el-tab-pane> -->
     </el-tabs>
 
     <EnhancedDialog v-model="dialogVisible.visible" :title="dialogVisible.title" @close="handleCloseDialog">

Some files were not shown because too many files changed in this diff