Kaynağa Gözat

feat: 进件状态闭环 — PENDING置灰/INVALID重提/VALID才能开记账本

AccountOverview:
  - null: 可提交
  - PENDING: 按钮置灰+显示审核中
  - INVALID: 可重新提交
  - VALID: 已通过,开通按钮亮起
createAccount: 非VALID状态拒绝开通(区分INVALID/PENDING/null原因)
alphaH 1 gün önce
ebeveyn
işleme
2dc8b38bfb

+ 29 - 9
frontend/src/views/module_payment/account/components/AccountOverview.vue

@@ -61,25 +61,20 @@
 
         <div
           class="action-item"
-          :class="{ disabled: authorizeStatus !== 'AUTHORIZED' || !!accountData.account_book_id || accountData.onboard_status === 'VALID' }"
+          :class="{ disabled: isOnboardDisabled }"
         >
           <div class="action-icon">
             <el-icon :size="32"><Upload /></el-icon>
           </div>
           <div class="action-title">提交进件资料</div>
-          <div class="action-desc">
-            <template v-if="accountData.onboard_status === 'VALID'">审核已通过</template>
-            <template v-else-if="accountData.onboard_status === 'INVALID'">审核未通过</template>
-            <template v-else-if="authorizeStatus !== 'AUTHORIZED'">需先签约</template>
-            <template v-else>提交资料</template>
-          </div>
+          <div class="action-desc">{{ onboardDesc }}</div>
           <el-button
             v-hasPerm="['module_payment:account:authorize']"
             type="primary"
-            :disabled="authorizeStatus !== 'AUTHORIZED' || !!accountData.account_book_id || accountData.onboard_status === 'VALID'"
+            :disabled="isOnboardDisabled"
             @click="$emit('goTab', 'onboard')"
           >
-            {{ accountData.onboard_status === 'VALID' ? '已通过' : '去提交' }}
+            {{ onboardBtnText }}
           </el-button>
         </div>
 
@@ -345,6 +340,31 @@ const currentEnterpriseName = computed(() => {
   return `${currentEnterprise.value.name} (${currentEnterprise.value.enterprise_id.slice(-4)})`;
 });
 
+/** 进件按钮: 未提交或审核不通过时可点,审核中/已通过置灰 */
+const isOnboardDisabled = computed(() =>
+  authorizeStatus.value !== "AUTHORIZED" || !!accountData.value.account_book_id
+  || accountData.value.onboard_status === "PENDING"
+  || accountData.value.onboard_status === "VALID"
+);
+
+const onboardDesc = computed(() => {
+  switch (accountData.value.onboard_status) {
+    case "PENDING": return "审核中,请耐心等待";
+    case "VALID": return "审核已通过";
+    case "INVALID": return "审核未通过,可重新提交";
+    default: return authorizeStatus.value !== "AUTHORIZED" ? "需先签约" : "提交资料";
+  }
+});
+
+const onboardBtnText = computed(() => {
+  switch (accountData.value.onboard_status) {
+    case "PENDING": return "审核中";
+    case "VALID": return "已通过";
+    case "INVALID": return "重新提交";
+    default: return "去提交";
+  }
+});
+
 // 签约状态: 有签约协议号即视为已签约(通知已写入 DB)
 const authorizeStatus = computed(() =>
   accountData.value.sign_status === "SIGNED" || accountData.value.account_book_id

+ 7 - 0
java/src/main/java/com/payment/platform/module/payment/account/service/AlipayTransferService.java

@@ -347,6 +347,13 @@ public class AlipayTransferService {
                 new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<AccountEntity>()
                         .eq(AccountEntity::getEnterpriseId, enterpriseId));
 
+        // 进件必须审核通过才允许开通记账本
+        if (account != null && account.getOnboardStatus() != null
+                && !"VALID".equals(account.getOnboardStatus()))
+            throw new BusinessException(400, "进件审核" +
+                    ("INVALID".equals(account.getOnboardStatus()) ? "未通过,请重新提交进件资料" :
+                     "PENDING".equals(account.getOnboardStatus()) ? "中,请耐心等待" : "尚未完成"));
+
         // 签约协议号:优先用传入,其次从 DB 取,最后自动查询
         String agmtNo = (agreementNo != null && !agreementNo.isBlank()) ? agreementNo
                 : (account != null ? account.getAgreementNo() : null);

+ 0 - 1
java/src/main/java/com/payment/platform/module/payment/notification/handler/AccountHandler.java

@@ -103,7 +103,6 @@ public class AccountHandler extends BaseNotifyHandler {
             acc.setAgreementNo(agreementNo);
             acc.setSignStatus("SIGNED");
             acc.setStatus("PENDING");
-            acc.setOnboardStatus("PENDING");
             acc.setScene("B2B_TRANS");
             acc.setAccountType("ALL");
             // 从 EnterpriseEntity 反查 tenant_id(通知回调无租户上下文)

+ 1 - 0
logs/payment-platform-error.log

@@ -966,3 +966,4 @@ Caused by: java.io.EOFException: null
 	... 46 common frames omitted
 2026-07-15 14:32:09.526 [tomcat-handler-7] ERROR sdk.biz.err - ErrorScene^_^40004^_^INVALID_PARAMETER^_^null^_^Windows 10^_^2026-07-15 14:32:09^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.expandindirect.image.upload&sign=iiR45tFjICuHAIBtU+hBkSbRRc+Nx6Y+hHvrAxiOD0WOwZoqZ3Vo8nHcvt8KPvOb7KPDoMjVurKXjlKmNMj0dLV9ZWStVXMuUy/qNBmEfL+qlJsaJj4kOpwqVB/8lCrLDMh8RqmAXUxsY/V8BrZI/7WVIlgc73qWWe5zWv5sD+Cke9/ZvmSom+XrQt5nOTX6DYmxUUHtzXDce7CVx5YABGfW8jH6ziJZpvzwdJi+/UMOxExSR5UqNBq7zc+JQjd19aHqxgAdHR9u1ABPJBRp/8lQkylmdphqT0OUiC1MzGxgkdAM8+A7CDJhtUDQjikvL7wDVF+9pwhh6bRYTOIbIQ==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 14:32:08^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b22834317840971289352495e7502&product_code=MERCHANT_TRANSFER_EXPAND_INDIRECT&biz_scene=ENTRUST_SATF_TRANSFER&image_type=jpg^_^Body:{"alipay_fund_expandindirect_image_upload_response":{"msg":"Business Failed","code":"40004","sub_msg":"参数有误文件类型不匹配","sub_code":"INVALID_PARAMETER"},"sign":"HZq7wjtEHdvFNXGXTAZXlRtZGHFehfKSZlcKpqNvvfVJGaXE7vXOl6vkyut3oiUOeErHKY+9vDdinpPNDRbX/51MniM2HHGHCBFEMojoOjOwkS2041SxmpAmr2AQ8q7zrCRctexwxn6yWuwQfkJJ/AhbXdeHNqcg62I4RM5Qt5nrMHI0YfE70QlKvSCb27Y/qZu2nyriF+/geD0uatcN6OB3YihjOCG8PEoizzkOpk/KQxT4AQ6AnYnaOGexx2zTBYAYM7bJ2S3VOlrtTa6+vKi/MZbY6xsSeWt73UFLHEtBistuklz9aQyULdWVirtm1XHYG1bmsUO3zjPSNd3Z3w=="}^_^24ms,1169ms,19ms^_^trace_id:0b22834317840971289352495e7502
 2026-07-15 14:32:27.221 [tomcat-handler-8] ERROR sdk.biz.err - ErrorScene^_^40004^_^INVALID_PARAMETER^_^null^_^Windows 10^_^2026-07-15 14:32:27^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.expandindirect.image.upload&sign=lm98gB5fw5nzMScTxdkZ+oNgHMxmzt6O1CDGaQ4mab6DOXGQ84rFxnWOJYZMWrJHLYEOhl5FIXjODV8DNIDfWSXKDbx63W/b1R8Kxi7h9pXSX/vRd+f4SrEv0z9s57sLJvMKwK/YXvCYgb1wEpyaEke+CLBqpKZe0m+h2d3YMiUYNNzoZXMyRnzbsGNgybYTcIEcAfMuRzrqzeDN+SsXvhl/Cc81E9yY5bSbJNfAc9lADImKHYLG1hWqAUg1ZOKq6rz3X102o6CG4KrROJiTweBluzGT53lLIPaSp1C8+fS80xq+Xk7PvccWESVK6z+mO2qWzonRsAx3NXS06CFpLg==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 14:32:26^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b22830317840971471292317e4f01&product_code=MERCHANT_TRANSFER_EXPAND_INDIRECT&biz_scene=ENTRUST_SATF_TRANSFER&image_type=jpg^_^Body:{"alipay_fund_expandindirect_image_upload_response":{"msg":"Business Failed","code":"40004","sub_msg":"参数有误文件类型不匹配","sub_code":"INVALID_PARAMETER"},"sign":"HZq7wjtEHdvFNXGXTAZXlRtZGHFehfKSZlcKpqNvvfVJGaXE7vXOl6vkyut3oiUOeErHKY+9vDdinpPNDRbX/51MniM2HHGHCBFEMojoOjOwkS2041SxmpAmr2AQ8q7zrCRctexwxn6yWuwQfkJJ/AhbXdeHNqcg62I4RM5Qt5nrMHI0YfE70QlKvSCb27Y/qZu2nyriF+/geD0uatcN6OB3YihjOCG8PEoizzkOpk/KQxT4AQ6AnYnaOGexx2zTBYAYM7bJ2S3VOlrtTa6+vKi/MZbY6xsSeWt73UFLHEtBistuklz9aQyULdWVirtm1XHYG1bmsUO3zjPSNd3Z3w=="}^_^11ms,511ms,10ms^_^trace_id:0b22830317840971471292317e4f01
+2026-07-15 14:48:07.261 [tomcat-handler-28] ERROR sdk.biz.err - ErrorScene^_^40004^_^INVALID_PARAMETER^_^null^_^Windows 10^_^2026-07-15 14:48:07^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.expandindirect.create&sign=UKY325uKzEiF2RSJWtipBdoYBiWbyu7ORCJb1HqyermIB/juNGALAQyQw7OjKNz4QcDiTjiracJ7mRtHuzm5KyT0PwI8H3C+FijxA9O4ld+5sip7Swd7BwnhrB0noqv9uHNcZPiF6fGKybK6qVNHSzSrDkFbb1IbXOf6uMJQnMEEoOoGdHFT3zjamGNjjbhJ/qMRMY9TBX77kqeItme0HyrqlmBsxLxF2iWjYeT6jF8KHCZaT6x4fx98MNIksNyeV3lAr39E2OjcPymqqkORX4byVTUyyNMLTGe8LamctZ4bjyBdilxQMh8BqgRoQIyqWaSaskRPaAGfZ4hKuNzaDw==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 14:48:07^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b426f4c17840980874964168e2f1f&biz_content={"biz_scene":"ENTRUST_SATF_TRANSFER","biz_type":"CREATE","out_biz_no":"1274781615507116032","product_code":"MERCHANT_TRANSFER_EXPAND_INDIRECT","scene_code":"XIANJIN_YINGXIAO","scene_directions":"测试提交","scene_image":"4pGXT5-KAXkAAAAATvAAAAgAp8JGAAFr.png","secondary_partner_info":{"identity":"","identity_type":"ALIPAY_USER_ID"}}^_^Body:{"alipay_fund_expandindirect_create_response":{"code":"40004","msg":"Business Failed","sub_code":"INVALID_PARAMETER","sub_msg":"参数[secondary_partner_info.identity]错误, 原因: 字符串长度必须大于等于[1]字符"},"sign":"MgQibO4ft1CBjefnMA8kWprepuuXFWx3b8j1IFU80KD0PrMwd6QBXul6G4SNsDB16rGg0ccFKpyTzNpL8psXJAFjjKC8rePQPFpZHoFCBx+T39ZMKiaEepXEnPl+D0RoSvHhOe+umgFebOHy6q8XtELOKFbeDDjUh6XqUD1jcAGFZP89D856IHqHylEW7y09L3vhLpSsTIxBQhTytHndhoTY/IyqAep5kADkDWCrHaJx7y6cUc3UBXGBIbqUVz2Id121yhwPI7yIUdR+Od9dyparr88UNSs+Sa5UejBF3sWa4b494XxCfZKPsUlIAuKgLzLGm9CaAdNLfFmN4eBf6A=="}^_^10ms,137ms,11ms^_^trace_id:0b426f4c17840980874964168e2f1f

+ 5 - 0
logs/payment-platform.log

@@ -1882,3 +1882,8 @@ Caused by: java.io.EOFException: null
 2026-07-15 14:44:39.282 [tomcat-handler-0] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 2 ms
 2026-07-15 14:44:55.755 [tomcat-handler-7] INFO  c.p.p.c.alipay.AlipayClientFactory - 服务商[3]客户端创建成功, appId=2021006160682088, name=跨境服务商
 2026-07-15 14:44:56.638 [tomcat-handler-7] INFO  sdk.biz.info - Summary^_^10000^_^null^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.expandindirect.image.upload&sign=JrQgUi94/Cl4gWV3W/O7/GkT8DWC0XSbxLICXeiw7dEIvbfucj9d23DDkUWrIGiz9OtMdAwTODjIA48TlGwTrqYkjm2Zc3j/BqAj3N5zNnyn7Y7OTVStmjcDXobefJJaG6N9Edz9HPf1k+ajF8iAq2XoAgRKyC11A4JQKQi0dusKD57t5Zwf9J+BvSuORnLl1BC7aLT++NHrJQ/zyJczbvSgKmOn8s9ajXaFDnolVgM2CiWRIja8s4ZpXkTmO7ldaYDQhXOiykr/wQC8pj868U3Cm7mTZ9eEzf8LwZxCv3/9Ru92CykhsXgn4yo1uS2uJJpKfuZm5tOvksssS7VK0g==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 14:44:55^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=2197054a17840978963616807eb098&product_code=MERCHANT_TRANSFER_EXPAND_INDIRECT&biz_scene=ENTRUST_SATF_TRANSFER&image_type=png^_^24ms,840ms,18ms^_^trace_id:2197054a17840978963616807eb098
+2026-07-15 14:48:04.649 [tomcat-handler-27] INFO  sdk.biz.info - Summary^_^10000^_^null^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.expandindirect.image.upload&sign=HlT702SuX3z6RI4LvHzJZYkAs9xKjK91zLcRBGighXENji5W3v7hb4MR3o7kbGqmC4fvWCSKzzcWlhCZrfFMu7fl2TikDIYY51z5p5HX+ruA+OofoW9xRuhohE9mzvrdVa9yoitGcwUrgsHqJHRhTcFiYPwc6yXns5YGFabcb5tyuzqwpC+eLKGumaaEdXPmQO9T5gshLzMOYn/auLGPDtKdI1CwEdNu1qdZ+vZjPIPcsGnyKOfNTpkNdBWKLUZ/oyP+LHxYTMem/4BksbJn4xlFLSubT27odGyWKUhmdVt7y6sqzV0UO/xpoViSkyzlrgQ+yqwEHua2RzbiRiU6lw==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 14:48:03^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b426f4c17840980843293920e2f1f&product_code=MERCHANT_TRANSFER_EXPAND_INDIRECT&biz_scene=ENTRUST_SATF_TRANSFER&image_type=png^_^9ms,736ms,11ms^_^trace_id:0b426f4c17840980843293920e2f1f
+2026-07-15 14:48:07.261 [tomcat-handler-28] ERROR sdk.biz.err - ErrorScene^_^40004^_^INVALID_PARAMETER^_^null^_^Windows 10^_^2026-07-15 14:48:07^_^ProtocalMustParams:charset=UTF-8&method=alipay.fund.expandindirect.create&sign=UKY325uKzEiF2RSJWtipBdoYBiWbyu7ORCJb1HqyermIB/juNGALAQyQw7OjKNz4QcDiTjiracJ7mRtHuzm5KyT0PwI8H3C+FijxA9O4ld+5sip7Swd7BwnhrB0noqv9uHNcZPiF6fGKybK6qVNHSzSrDkFbb1IbXOf6uMJQnMEEoOoGdHFT3zjamGNjjbhJ/qMRMY9TBX77kqeItme0HyrqlmBsxLxF2iWjYeT6jF8KHCZaT6x4fx98MNIksNyeV3lAr39E2OjcPymqqkORX4byVTUyyNMLTGe8LamctZ4bjyBdilxQMh8BqgRoQIyqWaSaskRPaAGfZ4hKuNzaDw==&version=1.0&app_id=2021006160682088&sign_type=RSA2&timestamp=2026-07-15 14:48:07^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.40.865.ALL&format=JSON^_^ApplicationParams:traceId=0b426f4c17840980874964168e2f1f&biz_content={"biz_scene":"ENTRUST_SATF_TRANSFER","biz_type":"CREATE","out_biz_no":"1274781615507116032","product_code":"MERCHANT_TRANSFER_EXPAND_INDIRECT","scene_code":"XIANJIN_YINGXIAO","scene_directions":"测试提交","scene_image":"4pGXT5-KAXkAAAAATvAAAAgAp8JGAAFr.png","secondary_partner_info":{"identity":"","identity_type":"ALIPAY_USER_ID"}}^_^Body:{"alipay_fund_expandindirect_create_response":{"code":"40004","msg":"Business Failed","sub_code":"INVALID_PARAMETER","sub_msg":"参数[secondary_partner_info.identity]错误, 原因: 字符串长度必须大于等于[1]字符"},"sign":"MgQibO4ft1CBjefnMA8kWprepuuXFWx3b8j1IFU80KD0PrMwd6QBXul6G4SNsDB16rGg0ccFKpyTzNpL8psXJAFjjKC8rePQPFpZHoFCBx+T39ZMKiaEepXEnPl+D0RoSvHhOe+umgFebOHy6q8XtELOKFbeDDjUh6XqUD1jcAGFZP89D856IHqHylEW7y09L3vhLpSsTIxBQhTytHndhoTY/IyqAep5kADkDWCrHaJx7y6cUc3UBXGBIbqUVz2Id121yhwPI7yIUdR+Od9dyparr88UNSs+Sa5UejBF3sWa4b494XxCfZKPsUlIAuKgLzLGm9CaAdNLfFmN4eBf6A=="}^_^10ms,137ms,11ms^_^trace_id:0b426f4c17840980874964168e2f1f
+2026-07-15 14:48:07.263 [tomcat-handler-28] WARN  c.p.p.c.e.GlobalExceptionHandler - 业务异常 [/api/v1/payment/account/onboard/create] 400: 创建进件单失败: Business Failed
+2026-07-15 14:57:29.449 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closing ...
+2026-07-15 14:57:29.451 [SpringApplicationShutdownHook] INFO  c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed