Kaynağa Gözat

Merge branch 'dev' of http://39.101.143.165:8090/dong_k/tenant-Platform into dev

祁鹏飞 2 hafta önce
ebeveyn
işleme
d773fd8c97

+ 23 - 16
src/api/index.ts

@@ -21,7 +21,7 @@ import teamApi from "@/api/modules/team.ts";
 import advertisementApi from "@/api/modules/advertisement.ts"
 import representativeApi from "@/api/modules/representative.ts";
 import contentApi from "@/api/modules/content.ts";
-import agreementApi  from "@/api/modules/agreement";
+import agreementApi from "@/api/modules/agreement";
 import companySortApi from "@/api/modules/companySort.ts"
 import homeApi from "@/api/modules/home.ts";
 
@@ -45,7 +45,7 @@ import saleApi from '@/api/modules/sale.ts'
 import dispatchApi from '@/api/modules/dispatch.ts'
 
 
-const axiosInstance:ApiInstance = axios.create({
+const axiosInstance: ApiInstance = axios.create({
   baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true') ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL,
   timeout: 1000 * 120,
   responseType: 'json',
@@ -99,7 +99,7 @@ axiosInstance.interceptors.response.use(
           duration: 2000,
         })
         useUserStore().logout()
-      } else if(response.data.code === 400 && !skipGlobalError) {
+      } else if (response.data.code === 400 && !skipGlobalError) {
         ElMessage({
           message: `${response.data.msg}!!!`,
           type: 'error',
@@ -110,7 +110,12 @@ axiosInstance.interceptors.response.use(
   },
   (error) => {
     let message = error.message
-    if (message === 'Network Error') {
+    // 按 HTTP 状态码分类提示
+    if (error.response && error.response.status === 404) {
+
+      message = '请求的接口不存在'
+    }
+    else if (message === 'Network Error') {
       message = '后端网络故障'
     }
     else if (message.includes('timeout')) {
@@ -119,29 +124,31 @@ axiosInstance.interceptors.response.use(
     else if (message.includes('Request failed with status code')) {
       message = `接口${message.substr(message.length - 3)}异常`
     }
-    Message.error(message, {
-      zIndex: 2000,
+    ElMessage({
+      message: message,
+      type: 'error',
+      plain: true,
     })
     return Promise.reject(error)
   },
 )
-  // API 模块
+// API 模块
 const api = {
   appApi: appApi(axiosInstance),
   userApi: userApi(axiosInstance),
   roleApi: roleApi(axiosInstance),
-  institutionApi:institutionApi(axiosInstance),
-  partnerApi:partnerApi(axiosInstance),
-  areaApi:areaApi(axiosInstance),
+  institutionApi: institutionApi(axiosInstance),
+  partnerApi: partnerApi(axiosInstance),
+  areaApi: areaApi(axiosInstance),
   operationApi: operationApi(axiosInstance),
-  menuApi:menuApi(axiosInstance),
+  menuApi: menuApi(axiosInstance),
   commonApi: commonApi(axiosInstance),
   teamApi: teamApi(axiosInstance),
   representativeApi: representativeApi(axiosInstance),
   lotteryApi: lotteryApi(axiosInstance),
-  contentApi:contentApi(axiosInstance),
-  advertisementApi:advertisementApi(axiosInstance),
-  agreementApi:agreementApi(axiosInstance),
+  contentApi: contentApi(axiosInstance),
+  advertisementApi: advertisementApi(axiosInstance),
+  agreementApi: agreementApi(axiosInstance),
   insuranceApi: insuranceApi(axiosInstance),
   projectApi: projectApi(axiosInstance),
   additionalApi: additionalApi(axiosInstance),
@@ -151,11 +158,11 @@ const api = {
   financeApi: financeApi(axiosInstance),
   invoiceRecordApi: invoiceRecordApi(axiosInstance),
   settlementApi: settlementApi(axiosInstance),
-  wechatApi:wechatApi(axiosInstance),
+  wechatApi: wechatApi(axiosInstance),
   saleApi: saleApi(axiosInstance),
   dispatchApi: dispatchApi(axiosInstance),
   companySortApi: companySortApi(axiosInstance),
   dictApi: dictApi(axiosInstance),
   homeApi: homeApi(axiosInstance)
 }
-export default api
+export default api

+ 1 - 1
src/views/finance/modules/auditDetail.vue

@@ -594,7 +594,7 @@
           <div class="btns" v-if="Number(activeindex) == 0">
             <el-button size="small" v-if="!costShow" type="primary" plain @click="handleCostChange">调整费用</el-button>
             <div v-else style="display: flex; align-items: center; justify-content: flex-end">
-              <el-button size="small" type="primary" plain @click="costShow = false">取消调整</el-button>
+              <el-button size="small" type="primary" plain @click="costShow = false,initDetail()">取消调整</el-button>
               <el-button size="small" type="primary" plain @click="handleComputedCostInfo">留点计算</el-button>
               <el-button size="small" type="primary" :loading="handleSaveCostloading" plain
                 @click="handleSaveCostChange">保存</el-button>

+ 205 - 57
src/views/insurancePolicy/modules/Equities.vue

@@ -3,18 +3,17 @@
   <div>
     <el-drawer :model-value="show" @update:model-value="$emit('update:show', $event)" title="权益选择"
       :direction="direction" size="1100px">
-
       <el-form :model="form" label-width="80px" label-position="left">
         <el-row :gutter="20">
           <el-col :span="24">
             <el-form-item label="接收人">
               <el-radio-group v-model="form.recipient">
                 <el-radio v-for="item in props.recipientInfo" :key="item.title" :value="item.title">{{ item.title
-                  }}</el-radio>
-                <el-radio :value="'other'">其它
-                  <el-input class="ml-2" v-model="form.otherRecipient" style="width: 200px" placeholder="请输入" />
-                </el-radio>
+                }}</el-radio>
+                <el-radio :value="'其他'">其他</el-radio>
               </el-radio-group>
+              <el-input v-if="form.recipient == '其他'" class="ml-2" v-model="form.otherRecipient" style="width: 200px"
+                placeholder="请输入" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -35,15 +34,16 @@
           </div>
           <div>
             <span>已使用金额</span>
-            <span>¥{{ insFeeOrders.usedAmount || 0 }}</span>
+            <span>¥{{ calcUsedAndRemaining.usedAmount }}</span>
           </div>
-          <div>
+          <div style="font-weight: bold;">
             <span>剩余金额</span>
-            <span style="color: #FF8C21;"> ¥{{ insFeeOrders.remainingAmount || 0 }}</span>
+            <span style="color: #FF8C21;"> ¥{{ calcUsedAndRemaining.remainingAmount }}</span>
           </div>
-          <div>
+          <div style="font-weight: bold;">
             <span>已选权益价值</span>
-            <span  style="color: #FF8C21;"> ¥{{insOrderRightsPackageList.length > 0 ? totalPriceCount : totalPriceCount1 || 0 }}</span>
+            <span style="color: #FF8C21;"> ¥{{ insOrderRightsPackageList.length > 0 ? totalPriceCount : totalPriceCount1
+              || 0 }}</span>
           </div>
         </div>
         <!-- 备注信息 -->
@@ -67,26 +67,46 @@
 
           <div class="PackageselectedList mt-[16px] flex " v-if="insOrderRightsPackageList.length > 0">
             <div class="view-card mr-[20px]">
-              <div class="view-item mb-[10px]  " :class="{ 'active': index === benefitPackageIndex }"
+              <div class="view-item mb-[10px]  " :class="index == benefitPackageIndex ? 'view-card-item-active' : ''"
                 v-for="(item, index) in insOrderRightsPackageList" :key="index" @click="rightsDetails(item, index)">
                 <div class="flex f-c ">
                   <div class="flex a-c j-s">
                     <span class="equityPackageName text-[14px] text-[#333]">{{ item.equityPackageName }}</span>
                     <span class="rightsCount text-[14px] text-[#333]">x{{ item.rightsCount }}</span>
                   </div>
-                  <div class="mt-5 flex a-c j-s">
-                    <span v-if="item.totalNumber" class="text-[12px] text-[#666]">数量{{ item.totalNumber }}张</span>
-                    <span class="text-[12px] text-[#666]">价格:{{ item.packagePrice }}元</span>
-                    <el-icon @click="removeSelectedRight(index)" color="#666">
+                  <div class="mt-5 flex a-c ">
+                    <span v-if="item.totalNumber" class="text-[12px] text-[#666]">数量:{{ item.totalNumber }}张</span>
+                    <span class="text-[12px] text-[#666] ml-[16px]">价格:{{ item.packagePrice }}元</span>
+                    <el-icon @click="removeSelectedRight(index)" color="#666" style="margin-left: auto;">
                       <Delete />
                     </el-icon>
                   </div>
                 </div>
               </div>
             </div>
-            <el-table class="details" :data="selectedPackageDetail.rightsDetailsList" max-height="300px"
-              style="flex: 1;" border>
-              <el-table-column prop="rightsName" label="权益名称" width="180" align="center" />
+            <el-table class="details" :data="selectedPackageDetail" max-height="300px"
+              :header-cell-style="{ color: '#333333' }" style="flex: 1;" border>
+              <template #empty>
+                <div class="flex f-c a-c ">
+                  <img src="@/assets/images/empty.png" alt="">
+                  <span style="font-size: 14px;color: #909399;">暂无数据</span>
+                </div>
+              </template>
+              <el-table-column prop="rightsName" label="权益名称" width="180" align="center">
+                <template #default="scope">
+                  <el-popover placement="right" trigger="hover" :width="324">
+                    <div class="iframe-container" v-show="!iframeLoading">
+                      <iframe :src="iframeUrl" frameborder="0" class="external-iframe"></iframe>
+                    </div>
+                    <div class="iframe-loading" v-show="iframeLoading">加载中...</div>
+                    <template #reference>
+                      <span class="rights-name-link" @mouseenter="benefitDetail(scope.row)">
+                        {{ scope.row.rightsName }}
+                      </span>
+                    </template>
+                  </el-popover>
+                </template>
+              </el-table-column>
               <el-table-column prop="number" label="数量" align="center" />
               <el-table-column prop="contractRate" label="价格" align="center"></el-table-column>
               <el-table-column prop="marketPrice" label="价值" align="center">
@@ -99,16 +119,23 @@
             </el-table>
           </div>
           <div class="RightselectedList mt-[16px]  " v-if="insOrderRightsList.length > 0">
-            <el-table class="details" :data="insOrderRightsList" max-height="300px" style="flex: 1;cursor: pointer;"
-              border>
+            <el-table class="details" :data="insOrderRightsList" max-height="300px"
+              :header-cell-style="{ color: '#333333' }" style="flex: 1;cursor: pointer;" border>
+              <template #empty>
+                <div class="flex f-c a-c ">
+                  <img src="@/assets/images/empty.png" alt="" style="width: 100px;">
+                  <span style="font-size: 14px;color: #909399;">暂无数据</span>
+                </div>
+              </template>
               <el-table-column prop="rightsName" label="权益名称" align="center">
                 <template #default="scope">
-                  <el-popover placement="right" trigger="click" :width="324">
-                    <div class="iframe-container">
+                  <el-popover placement="right" trigger="hover" :width="324">
+                    <div class="iframe-container" v-show="!iframeLoading">
                       <iframe :src="iframeUrl" frameborder="0" class="external-iframe"></iframe>
                     </div>
+                    <div class="iframe-loading" v-show="iframeLoading">加载中...</div>
                     <template #reference>
-                      <span @click="benefitDetail(scope.row)" :class="{ 'clicked': clickedRightsId === scope.row.id }">
+                      <span class="rights-name-link" @mouseenter="benefitDetail(scope.row)">
                         {{ scope.row.rightsName }}
                       </span>
                     </template>
@@ -124,7 +151,8 @@
               </el-table-column>
               <el-table-column prop="number" label="数量" align="center">
                 <template #default="scope">
-                  <el-input-number size="small" :model-value="scope.row.rightsCount" style="width: 80px;"
+                  <el-input-number class="rights-count-input" size="small" :model-value="scope.row.rightsCount"
+                    style="width: 80px;"
                     @update:model-value="val => onRightsCountChange(val, scope.$index, 'insOrderRightsList', 'contractRate')"
                     :min="0" />
                 </template>
@@ -154,7 +182,7 @@
           <Warning />
         </el-icon>
         <span>本次订单共计优惠<span class="font-size-[16px] font-bold">{{ insFeeOrders.availableAmount ||
-            0}}</span>元,您可使用部分优惠金额为客户购买车主服务。</span>
+          0 }}</span>元,您可使用部分优惠金额为客户购买车主服务。</span>
       </div>
       <div class="flex a-c mt-[24px]">
         <span style="flex-shrink: 0;" class="mr-[12px]">可用金额</span>
@@ -183,7 +211,7 @@
 <script lang='ts' setup>
 import { ref, reactive, computed, onBeforeMount, watch } from 'vue'
 import api from '@/api'
-import { ElMessage, DrawerProps } from 'element-plus'
+import { ElMessage, DrawerProps, ElMessageBox } from 'element-plus'
 import Decimal from 'decimal.js'
 import EquitiesItem from './EquitiesItem.vue' // 权益单品模块
 import EquitiesPage from './EquitiesPage.vue' // 权益套餐模块
@@ -197,7 +225,7 @@ const props = defineProps<{
 }>();
 console.log(props.EquitiesInfo)
 const emits = defineEmits(['update:show', 'cancel', 'save']);
-
+const OtherRadio = ref('null')//其他接收人
 // 子弹窗状态
 const equitiesItemShow = ref(false);
 const equitiesPageShow = ref(false);
@@ -235,7 +263,7 @@ const privilegeItem = ref(); //权益单品列表
 const insOrderRightsPackageList = ref([]); //权益套餐选中列表
 const insOrderRightsList = ref([]); //权益单品选中列表
 const benefitPackageIndex = ref(null); //选中的权益套餐索引
-const selectedPackageDetail = ref<any>({}) //选中的权益套餐详情
+const selectedPackageDetail = ref<any>([])  //选中的权益套餐详情
 const totalPriceCount = computed(() => {
   // 计算权益套餐的总价
   const packageTotal = insOrderRightsPackageList.value?.reduce((sum: Decimal, item: any) => {
@@ -261,6 +289,23 @@ const totalPriceCount1 = computed(() => {
   const sum = new Decimal(itemTotal);
   return sum.toString(); // 返回字符串
 });
+// 根据可用金额与已选权益价值,高精度计算已使用/剩余金额
+// 已使用金额 = 已选权益价值;剩余金额 = 可用金额 - 已使用金额
+const calcUsedAndRemaining = computed(() => {
+  const available = new Decimal(insFeeOrders.value.availableAmount || 0)
+  const selectedValue = new Decimal(
+    insOrderRightsPackageList.value.length > 0 ? totalPriceCount.value : (totalPriceCount1.value || 0)
+  )
+  const usedAmount = selectedValue
+  const remainingAmount = available.minus(usedAmount)
+  // 同步赋值给 insFeeOrders,供模板及其他逻辑使用
+  insFeeOrders.value.usedAmount = usedAmount.toFixed(2)
+  insFeeOrders.value.remainingAmount = remainingAmount.toFixed(2)
+  return {
+    usedAmount: usedAmount.toFixed(2),
+    remainingAmount: remainingAmount.toFixed(2),
+  }
+});
 //合并所有已选权益套餐和权益单品
 const selectedRights = computed(() => {
   const selectedPackages = insOrderRightsPackageList.value?.filter((item: any) => item.rightsCount > 0) || []
@@ -343,14 +388,8 @@ const tabslist = ref([
 
 // 选中的权益套餐详情
 const rightsDetails = async (item: any, index: any) => {
-  selectedPackageDetail.value = item;
+  selectedPackageDetail.value = item.rightsDetailsList || [];
   benefitPackageIndex.value = index;
-  try {
-    const response = await api.additionalApi.rightsGrant(item.id);
-    selectedPackageDetail.value.rightsDetailsList = response.data || {};
-  } catch (error) {
-    console.error('获取权益套餐详情失败:', error);
-  }
 }
 // 地区选项
 const regionOptions = ref();
@@ -378,21 +417,47 @@ const provinceChange = (value: any) => {
 }
 const PackageBenefits = () => {
   if (insOrderRightsList.value.length > 0) {
-    return ElMessage({
-      type: 'warning',
-      message: '套餐和单品只能选择其中1种',
-      plain: true,
-    })
+    // 已选单品权益,提醒二选一,确认后清空单品再选套餐
+    ElMessageBox.confirm(
+      '您已选择单品权益,套餐和单品只能二选一。是否清空已选单品权益,继续选择套餐?',
+      '提示',
+      {
+        confirmButtonText: '清空并选择套餐',
+        cancelButtonText: '取消',
+        type: 'warning',
+        center: true,
+      }
+    )
+      .then(() => {
+        insOrderRightsList.value = [] // 清空已选单品权益
+        equitiesPageShow.value = true
+      })
+      .catch(() => {
+      })
+    return
   }
   equitiesPageShow.value = true;
 }
 const RightsBenefits = () => {
   if (insOrderRightsPackageList.value.length > 0) {
-    return ElMessage({
-      type: 'warning',
-      message: '套餐和单品只能选择其中1种',
-      plain: true,
-    })
+    // 已选套餐权益,提醒二选一,确认后清空套餐再选单品
+    ElMessageBox.confirm(
+      '您已选择套餐权益,套餐和单品只能二选一。是否清空已选套餐权益,继续选择单品?',
+      '提示',
+      {
+        confirmButtonText: '清空并选择单品',
+        cancelButtonText: '取消',
+        type: 'warning',
+        center: true,
+      }
+    )
+      .then(() => {
+        insOrderRightsPackageList.value = [] // 清空已选套餐权益
+        equitiesItemShow.value = true
+      })
+      .catch(() => {
+      })
+    return
   }
   equitiesItemShow.value = true;
 }
@@ -407,7 +472,11 @@ const handleEquitiesItemSave = (selectedItems: any[]) => {
   insOrderRightsList.value = selectedItems;
 }
 const saveEquitiesPage = (selectedItems: any[]) => {
+  console.log(selectedItems)
   insOrderRightsPackageList.value = selectedItems;
+  selectedPackageDetail.value = selectedItems[0].rightsDetailsList || [];
+  benefitPackageIndex.value = 0;
+
 }
 const adjustDiscountAmount = () => {
   adjustDiscountAmountShow.value = true;
@@ -450,6 +519,8 @@ const adjustDiscountAmountconfirm = () => {
   });
 }
 const save = () => {
+  console.log(form.recipient)
+  // return
   if (!form.recipient) {
     ElMessage({
       type: 'warning',
@@ -476,16 +547,31 @@ const save = () => {
   emits("save", insOrderRightsInfoDto)
 }
 const iframeUrl = ref('');//权益单品详情
-const clickedRightsId = ref<string | number | null>(null); // 记录点击的权益ID
+const iframeLoading = ref(false); // 详情加载中,显示加载占位
+const rightsUrlCache = new Map<string | number, string>(); // 权益详情地址缓存
+let latestRequestId = 0; // 竞态标记:只让最后一次移入的请求生效
 const benefitDetail = (item: any) => {
-  clickedRightsId.value = item.id; // 设置点击状态
+  // 缓存命中:直接显示,不发请求,不闪
+  const cachedUrl = rightsUrlCache.get(item.id);
+  if (cachedUrl) {
+    iframeUrl.value = cachedUrl;
+    return;
+  }
+  // 未命中:显示加载占位并请求详情(不清空 iframeUrl,保留旧内容直到新内容就绪)
+  const requestId = ++latestRequestId;
+  iframeLoading.value = true;
   api.additionalApi.rightsProduct({
     rightsId: item.id,
   }).then((res: any) => {
+    if (requestId !== latestRequestId) {
+      return; // 已有更新的移入,丢弃过期响应
+    }
     if (res.code == '200') {
-      iframeUrl.value = `https://life.baoxianzhanggui.com/custh5/#/packageF/pages/home/details-channel?productId=${res.data[0].productId}`
-    } else {
+      const url = `https://life.baoxianzhanggui.com/custh5/#/packageF/pages/home/details-channel?productId=${res.data[0].productId}`
+      rightsUrlCache.set(item.id, url);
+      iframeUrl.value = url;
     }
+    iframeLoading.value = false;
   });
   console.log(item)
 }
@@ -571,18 +657,21 @@ const benefitDetail = (item: any) => {
       padding: 10px;
       box-sizing: border-box;
       border-radius: 4px 4px 4px 4px;
+      border: 1px solid #F7F7F7;
+
+    }
+
+    .view-card-item-active {
+      border: 1px solid #0083FF;
     }
 
     .view-item:hover {
-      background: #dfdfdf;
+      background: #F6FBFF;
+
     }
 
   }
 
-  .view-card .active {
-    background: #dfdfdf;
-    color: #fff;
-  }
 }
 
 // 自定义抽屉样式
@@ -625,9 +714,54 @@ const benefitDetail = (item: any) => {
   border: none;
 }
 
-// 点击权益名称变色效果
-.clicked {
-  color: #409EFF;
+// 权益详情加载占位
+.iframe-loading {
+  width: 300px;
+  height: 600px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #909399;
+  font-size: 14px;
+}
+
+// 移入权益名称变色效果
+.linkrights-name- {
+  cursor: pointer;
+
+  &:hover {
+    color: #409EFF;
+  }
+}
+
+// 权益数量步进器:加减号背景白色、图标固定蓝色(默认和悬停均为蓝色)
+.rights-count-input {
+
+  :deep(.el-input-number__increase),
+  :deep(.el-input-number__decrease) {
+    background-color: #fff !important;
+    color: #0083FF !important;
+
+    .el-icon {
+      color: #0083FF !important;
+    }
+
+    &:hover {
+      background-color: #fff !important;
+      color: #0083FF !important;
+
+      .el-icon {
+        color: #0083FF !important;
+      }
+    }
+  }
+
+  // 去掉鼠标移入时的蓝色边框,保持原灰色边框
+  :deep(.el-input__wrapper) {
+    &:hover {
+      box-shadow: 0 0 0 1px var(--el-input-border-color, #dcdfe6) inset;
+    }
+  }
 }
 
 // 权益金额调整弹窗
@@ -641,4 +775,18 @@ const benefitDetail = (item: any) => {
   padding: 10px 16px;
   box-sizing: border-box;
 }
+
+// 移入权益名称变色效果
+.rights-name-link {
+  cursor: pointer;
+
+  &:hover {
+    color: #409EFF;
+  }
+}
+
+// 移入权益名称时当前单元格背景色(!important 压过 el-table 行 hover 背景)
+:deep(.el-table__body td.el-table__cell:has(.rights-name-link:hover)) {
+  background-color: #F6FBFF !important;
+}
 </style>

+ 128 - 10
src/views/insurancePolicy/modules/EquitiesItem.vue

@@ -26,13 +26,13 @@
           </div>
           <div>
             <span>已使用金额</span>
-            <span>¥{{ props.EquitiesInfo.insFeeOrders.usedAmount }}</span>
+            <span>¥{{ calcUsedAndRemaining.usedAmount }}</span>
           </div>
-          <div>
+          <div style="font-weight: bold;">
             <span>剩余金额</span>
-            <span style="color: #FF8C21;"> ¥{{ props.EquitiesInfo.insFeeOrders.remainingAmount }}</span>
+            <span style="color: #FF8C21;"> ¥{{ calcUsedAndRemaining.remainingAmount }}</span>
           </div>
-          <div>
+          <div style="font-weight: bold;">
             <span>已选权益价值</span>
             <span style="color: #FF8C21;"> ¥{{ totalPriceCount }}</span>
           </div>
@@ -63,8 +63,28 @@
       <div class="flex mt-4  tab-btn">
         <div class="content flex  f-c ">
           <div class="RightselectedList">
-            <el-table class="details" :data="privilegeItem" max-height="300px" style="flex: 1;" border>
-              <el-table-column prop="rightsName" label="权益名称" align="center" />
+            <el-table class="details" :data="privilegeItem" max-height="300px" style="flex: 1;" :header-cell-style="{ color: '#333333' }" border>
+               <template #empty>
+                <div class="flex f-c a-c ">
+                  <img src="@/assets/images/empty.png" alt="" >
+                  <span style="font-size: 14px;color: #909399;">暂无数据</span>
+                </div>
+              </template>
+              <el-table-column prop="rightsName" label="权益名称" align="center">
+                <template #default="scope">
+                  <el-popover placement="right" trigger="hover" :width="324">
+                    <div class="iframe-container" v-show="!iframeLoading">
+                      <iframe :src="iframeUrl" frameborder="0" class="external-iframe"></iframe>
+                    </div>
+                    <div class="iframe-loading" v-show="iframeLoading">加载中...</div>
+                    <template #reference>
+                      <span class="rights-name-link" @mouseenter="benefitDetail(scope.row)">
+                        {{ scope.row.rightsName }}
+                      </span>
+                    </template>
+                  </el-popover>
+                </template>
+              </el-table-column>
               <el-table-column prop="contractRate" label="价格" align="center"></el-table-column>
               <el-table-column prop="marketPrice" label="价值" align="center"></el-table-column>
               <el-table-column prop="shareableStoreNum" label="适用门店" align="center">
@@ -74,7 +94,8 @@
               </el-table-column>
               <el-table-column prop="number" label="数量" align="center">
                 <template #default="scope">
-                  <el-input-number size="small" :model-value="scope.row.rightsCount" style="width: 80px;"
+                  <el-input-number class="rights-count-input" size="small" :model-value="scope.row.rightsCount"
+                    style="width: 80px;"
                     @update:model-value="val => onRightsCountChange(val, scope.$index, 'privilegeItem', 'contractRate')"
                     :min="0" />
                 </template>
@@ -126,7 +147,7 @@ onBeforeMount(async () => {
   await queryTreeQuery();
   await getRightsCategory();
   await getPrivilegeItem();
-  provinceoptions.value = ['110000', '110100', '110101']
+  provinceoptions.value = []
 
 });
 
@@ -154,6 +175,18 @@ const totalPriceCount = computed(() => {
   const sum = new Decimal(itemTotal);
   return sum.toString(); // 返回字符串
 });
+// 根据可用金额与已选权益价值,高精度计算已使用/剩余金额
+// 已使用金额 = 已选权益价值;剩余金额 = 可用金额 - 已使用金额
+const calcUsedAndRemaining = computed(() => {
+  const available = new Decimal(props.EquitiesInfo.insFeeOrders.availableAmount || 0)
+  const selectedValue = new Decimal(totalPriceCount.value || 0)
+  const usedAmount = selectedValue
+  const remainingAmount = available.minus(usedAmount)
+  return {
+    usedAmount: usedAmount.toFixed(2),
+    remainingAmount: remainingAmount.toFixed(2),
+  }
+});
 
 
 const onRightsCountChange = (e: any, index: any, name: any, field: string) => {
@@ -255,8 +288,11 @@ const queryTreeQuery = () => {
 }
 const provinceChange = (value: any) => {
   if (value && value[0] != null && value[1] != null && value[2] != null) {
-
+    queryInfo.value.countryAll = value[0] + value[1] + value[2];
+    getPrivilegeItem()
   } else {
+    queryInfo.value.countryAll = '';
+    getPrivilegeItem()
   }
 }
 const cancel = () => {
@@ -266,6 +302,35 @@ const cancel = () => {
   emits('update:show', false);
 }
 
+const iframeUrl = ref('');//权益单品详情
+const iframeLoading = ref(false); // 详情加载中,显示加载占位
+const rightsUrlCache = new Map<string | number, string>(); // 权益详情地址缓存
+let latestRequestId = 0; // 竞态标记:只让最后一次移入的请求生效
+const benefitDetail = (item: any) => {
+  // 缓存命中:直接显示,不发请求,不闪
+  const cachedUrl = rightsUrlCache.get(item.id);
+  if (cachedUrl) {
+    iframeUrl.value = cachedUrl;
+    return;
+  }
+  // 未命中:显示加载占位并请求详情(不清空 iframeUrl,保留旧内容直到新内容就绪)
+  const requestId = ++latestRequestId;
+  iframeLoading.value = true;
+  api.additionalApi.rightsProduct({
+    rightsId: item.id,
+  }).then((res: any) => {
+    if (requestId !== latestRequestId) {
+      return; // 已有更新的移入,丢弃过期响应
+    }
+    if (res.code == '200') {
+      const url = `https://life.baoxianzhanggui.com/custh5/#/packageF/pages/home/details-channel?productId=${res.data[0].productId}`
+      rightsUrlCache.set(item.id, url);
+      iframeUrl.value = url;
+    }
+    iframeLoading.value = false;
+  });
+  console.log(item)
+}
 const save = () => {
   console.log(privilegeItem.value)
   const selectedItems = privilegeItem.value?.filter((item: any) => item.rightsCount > 0) || []
@@ -390,7 +455,6 @@ const save = () => {
   width: 100%;
   height: 600px;
   /* 固定高度 */
-  border: 1px solid #ddd;
 }
 
 .external-iframe {
@@ -398,4 +462,58 @@ const save = () => {
   height: 100%;
   border: none;
 }
+
+// 权益详情加载占位
+.iframe-loading {
+  width: 100%;
+  height: 600px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #909399;
+  font-size: 14px;
+}
+
+// 移入权益名称变色效果
+.rights-name-link {
+  cursor: pointer;
+
+  &:hover {
+    color: #409EFF;
+  }
+}
+
+// 移入权益名称时当前单元格背景色(!important 压过 el-table 行 hover 背景)
+:deep(.el-table__body td.el-table__cell:has(.rights-name-link:hover)) {
+  background-color: #F6FBFF !important;
+}
+
+// 权益数量步进器:加减号背景白色、图标固定蓝色(默认和悬停均为蓝色)
+.rights-count-input {
+  :deep(.el-input-number__increase),
+  :deep(.el-input-number__decrease) {
+    background-color: #fff !important;
+    color: #0083FF !important;
+
+    .el-icon {
+      color: #0083FF !important;
+    }
+
+    &:hover {
+      background-color: #fff !important;
+      color: #0083FF !important;
+
+      .el-icon {
+        color: #0083FF !important;
+      }
+    }
+  }
+
+  // 去掉鼠标移入时的蓝色边框,保持原灰色边框
+  :deep(.el-input__wrapper) {
+    &:hover {
+      box-shadow: 0 0 0 1px var(--el-input-border-color, #dcdfe6) inset;
+    }
+  }
+}
 </style>

+ 196 - 26
src/views/insurancePolicy/modules/EquitiesPage.vue

@@ -1,7 +1,8 @@
 <!-- 模板区域 -->
 <template>
   <div>
-    <el-drawer :model-value="show" @update:model-value="$emit('update:show', $event)" title="权益选择" :direction="direction" size="900px">
+    <el-drawer :model-value="show" @update:model-value="$emit('update:show', $event)" title="权益选择"
+      :direction="direction" size="900px">
       <el-form :model="form" label-width="120px" label-position="left">
         <el-row :gutter="20">
           <el-col :span="10">
@@ -25,13 +26,13 @@
           </div>
           <div>
             <span>已使用金额</span>
-            <span>¥{{ props.EquitiesInfo.insFeeOrders.usedAmount }}</span>
+            <span>¥{{ calcUsedAndRemaining.usedAmount }}</span>
           </div>
-          <div>
+          <div style="font-weight: bold;">
             <span>剩余金额</span>
-            <span style="color: #FF8C21;"> ¥{{ props.EquitiesInfo.insFeeOrders.remainingAmount }}</span>
+            <span style="color: #FF8C21;"> ¥{{ calcUsedAndRemaining.remainingAmount }}</span>
           </div>
-          <div>
+          <div style="font-weight: bold;">
             <span>已选权益价值</span>
             <span style="color: #FF8C21;"> ¥{{ totalPriceCount }}</span>
           </div>
@@ -48,29 +49,53 @@
         <div class="content flex  f-c ">
           <div class="PackageselectedList mt-[16px] flex ">
             <div class="view-card mr-[20px]">
-              <div class="view-item mb-[10px] " v-for="(item, index) in benefitPackageList" :key="item.id"
-                @click="rightsDetails(item, index)">
+              <div class="view-item mb-[10px] " :class="index == benefitPackageIndex ? 'view-card-item-active' : ''"
+                v-for="(item, index) in benefitPackageList" :key="item.id" @click="rightsDetails(item, index)">
                 <div class="flex f-c ">
-                  <div class="flex a-c j-s">
-                    <span class="equityPackageName text-[14px] text-[#333]">{{ item.equityPackageName }}</span>
-                    <el-input-number size="small" :model-value="item.rightsCount" style="width: 80px;"
+                  <span class="equityPackageName text-[14px] text-[#333]">权益名称权益名称权益名称权益名称益名称益名称
+                  </span>
+                  <el-input-number size="small" :model-value="item.rightsCount" class="custom-input-number"
                     @update:model-value="val => onRightsCountChange(val, index, 'benefitPackageList', 'packagePrice')"
-                    :min="0" />
-
-                  </div>
-                  <div class="mt-5 flex a-c j-s">
+                    :min="0">
+                    <template #decrease-icon>
+                      <span class="custom-btn ">
+                        <el-icon color="#0083FF" style="margin-top: 2px;">
+                          <Minus />
+                        </el-icon>
+                      </span>
+                    </template>
+                    <template #increase-icon>
+                      <span class="custom-btn ">
+                        <el-icon>
+                          <Plus />
+                        </el-icon>
+                      </span>
+                    </template>
+                  </el-input-number>
+                  <div class=" flex a-c ">
                     <span v-if="item.totalNumber" class="text-[12px] text-[#666]">数量:{{ item.totalNumber }}张</span>
-                    <span class="text-[12px] text-[#666]">价格:{{ item.packagePrice }}元</span>
-                    <el-icon @click="removeSelectedRight(item)" color="#666">
-                      <Delete />
-                    </el-icon>
+                    <span class="text-[12px] text-[#666] ml-[16px]">价格:{{ item.packagePrice }}元</span>
                   </div>
                 </div>
               </div>
             </div>
-            <el-table class="details" v-if="selectedPackageDetail.length" :data="selectedPackageDetail.rightsDetailsList" max-height="300px"
+            <el-table class="details" :data="selectedPackageDetail.rightsDetailsList" max-height="300px"  :header-cell-style="{ color: '#333333' }"
               style="flex: 1;" border>
-              <el-table-column prop="rightsName" label="权益名称" width="180" align="center" />
+              <el-table-column prop="rightsName" label="权益名称" width="180" align="center">
+                <template #default="scope">
+                  <el-popover placement="right" trigger="hover" :width="324">
+                    <div class="iframe-container" v-show="!iframeLoading">
+                      <iframe :src="iframeUrl" frameborder="0" class="external-iframe"></iframe>
+                    </div>
+                    <div class="iframe-loading" v-show="iframeLoading">加载中...</div>
+                    <template #reference>
+                      <span class="rights-name-link" @mouseenter="benefitDetail(scope.row)">
+                        {{ scope.row.rightsName }}
+                      </span>
+                    </template>
+                  </el-popover>
+                </template>
+              </el-table-column>
               <el-table-column prop="number" label="数量" align="center" />
               <el-table-column prop="contractRate" label="价格" align="center"></el-table-column>
               <el-table-column prop="marketPrice" label="价值" align="center">
@@ -207,7 +232,7 @@ watch(() => props.recipientInfo, (newVal) => {
 onBeforeMount(async () => {
   await queryTreeQuery();
   await getBenefitPackageList();
-  provinceoptions.value = ['110000', '110100', '110101']
+  provinceoptions.value = []
 
 });
 const queryInfo = ref({
@@ -236,6 +261,18 @@ const totalPriceCount = computed(() => {
   const sum = new Decimal(packageTotal);
   return sum.toString(); // 返回字符串
 });
+// 根据可用金额与已选权益价值,高精度计算已使用/剩余金额
+// 已使用金额 = 已选权益价值;剩余金额 = 可用金额 - 已使用金额
+const calcUsedAndRemaining = computed(() => {
+  const available = new Decimal(props.EquitiesInfo.insFeeOrders.availableAmount || 0)
+  const selectedValue = new Decimal(totalPriceCount.value || 0)
+  const usedAmount = selectedValue
+  const remainingAmount = available.minus(usedAmount)
+  return {
+    usedAmount: usedAmount.toFixed(2),
+    remainingAmount: remainingAmount.toFixed(2),
+  }
+});
 //合并所有已选权益套餐和权益单品
 const selectedRights = computed(() => {
   const selectedPackages = benefitPackageList.value?.filter((item: any) => item.rightsCount > 0) || []
@@ -319,8 +356,15 @@ const getBenefitPackageList = async () => {
   queryInfo.value.maxPrice = props.EquitiesInfo.insFeeOrders.availableAmount;
   try {
     const response = await api.additionalApi.rightsGrantList(queryInfo.value);
-    if(response.code == '200'){
+    if (response.code == '200' && response.data.records.length > 0) {
       benefitPackageList.value = response.data.records || [];
+      rightsDetails(response.data.records[0], 0);
+    } else {
+      ElMessage({
+        type: 'warning',
+        message: '暂无权益套餐',
+        plain: true,
+      })
     }
   } catch (error) {
     console.error('获取权益套餐列表失败:', error);
@@ -335,8 +379,9 @@ const rightsDetails = async (item: any, index: any) => {
   try {
     const response = await api.additionalApi.rightsGrant(item.id);
     console.log(response)
-    if(response.code == '200'){
+    if (response.code == '200') {
       selectedPackageDetail.value.rightsDetailsList = response.data || {};
+      console.log(selectedPackageDetail.value)
     }
   } catch (error) {
     console.error('获取权益套餐详情失败:', error);
@@ -362,8 +407,11 @@ const queryTreeQuery = () => {
 }
 const provinceChange = (value: any) => {
   if (value && value[0] != null && value[1] != null && value[2] != null) {
-
+    queryInfo.value.countryAll = value[0] + value[1] + value[2];
+    getBenefitPackageList()
   } else {
+    queryInfo.value.countryAll = '';
+    getBenefitPackageList()
   }
 }
 const cancel = () => {
@@ -373,6 +421,35 @@ const cancel = () => {
   emits('update:show', false);
 }
 
+const iframeUrl = ref('');//权益单品详情
+const iframeLoading = ref(false); // 详情加载中,显示加载占位
+const rightsUrlCache = new Map<string | number, string>(); // 权益详情地址缓存
+let latestRequestId = 0; // 竞态标记:只让最后一次移入的请求生效
+const benefitDetail = (item: any) => {
+  // 缓存命中:直接显示,不发请求,不闪
+  const cachedUrl = rightsUrlCache.get(item.id);
+  if (cachedUrl) {
+    iframeUrl.value = cachedUrl;
+    return;
+  }
+  // 未命中:显示加载占位并请求详情(不清空 iframeUrl,保留旧内容直到新内容就绪)
+  const requestId = ++latestRequestId;
+  iframeLoading.value = true;
+  api.additionalApi.rightsProduct({
+    rightsId: item.id,
+  }).then((res: any) => {
+    if (requestId !== latestRequestId) {
+      return; // 已有更新的移入,丢弃过期响应
+    }
+    if (res.code == '200') {
+      const url = `https://life.baoxianzhanggui.com/custh5/#/packageF/pages/home/details-channel?productId=${res.data[0].productId}`
+      rightsUrlCache.set(item.id, url);
+      iframeUrl.value = url;
+    }
+    iframeLoading.value = false;
+  });
+  console.log(item)
+}
 const save = () => {
   const packageItems = benefitPackageList.value?.filter((item: any) => item.rightsCount > 0) || []
   // 发送表单数据
@@ -461,10 +538,16 @@ const save = () => {
       padding: 10px;
       box-sizing: border-box;
       border-radius: 4px 4px 4px 4px;
+      border: 1px solid #F7F7F7;
+
+    }
+
+    .view-card-item-active {
+      border: 1px solid #0083FF;
     }
 
     .view-item:hover {
-      background: #dfdfdf;
+      background: #F6FBFF;
     }
 
   }
@@ -503,7 +586,6 @@ const save = () => {
   width: 100%;
   height: 600px;
   /* 固定高度 */
-  border: 1px solid #ddd;
 }
 
 .external-iframe {
@@ -511,4 +593,92 @@ const save = () => {
   height: 100%;
   border: none;
 }
+
+// 权益详情加载占位
+.iframe-loading {
+  width: 100%;
+  height: 600px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #909399;
+  font-size: 14px;
+}
+
+// 移入权益名称变色效果
+.rights-name-link {
+  cursor: pointer;
+
+  &:hover {
+    color: #409EFF;
+  }
+}
+
+// 移入权益名称时当前单元格背景色(!important 压过 el-table 行 hover 背景)
+:deep(.el-table__body td.el-table__cell:has(.rights-name-link:hover)) {
+  background-color: #F6FBFF !important;
+}
+
+.custom-input-number {
+  margin: 6px 0;
+  margin-left: auto;
+  width: 80px;
+
+  :deep(.el-input-number__decrease) {
+    width: 20px;
+    height: 20px;
+    border-radius: 50%;
+    border: 1px solid #DDDDDD;
+  }
+
+  :deep(.el-input-number__increase) {
+    width: 21px;
+    height: 21px;
+    background: #EBF6FF;
+    border-radius: 50%;
+    color: #0083FF;
+    border-left: 0;
+  }
+  :deep(.el-input__wrapper) {
+    border: none;
+    background: transparent;
+    box-shadow: none !important;
+    padding: 0 22px;
+  }
+
+  :deep(.el-input__wrapper:hover) {
+    box-shadow: none !important;
+  }
+
+  :deep(.el-input__wrapper.is-focus) {
+    box-shadow: none !important;
+  }
+
+  :deep(.el-input__inner) {
+    text-align: center;
+    color: #333;
+    font-size: 14px;
+  }
+
+  :deep(.el-input-number) {
+    width: 80px !important;
+  }
+}
+
+.custom-btn {
+  font-size: 14px;
+  line-height: 1;
+  color: #0083FF;
+
+}
+
+.decrease-btn {
+  color: #0083FF;
+  line-height: 1;
+
+}
+
+.increase-btn {
+  color: #0083FF;
+}
 </style>

+ 12 - 6
src/views/insurancePolicy/modules/underwriting.vue

@@ -86,8 +86,15 @@
               :value="item.title" />
           </el-select>
         </div>
-        <el-button icon="plus" type="primary" @click="handleOpenEquities">选择权益</el-button>
-        <el-table :data="equitiesData" style="margin-top: 20px" height="200px">
+        <el-button icon="plus" plain type="primary" @click="handleOpenEquities">选择权益</el-button>
+        <el-table :data="equitiesData" style="margin-top: 20px" height="200px"
+          :header-cell-style="{ color: '#333333' }">
+          <template #empty>
+            <div class="flex f-c a-c ">
+              <img src="@/assets/images/empty.png" alt="" style="width: 100px;">
+              <span style="font-size: 14px;color: #909399;">暂无数据</span>
+            </div>
+          </template>
           <el-table-column prop="equityPackageName" label="权益名称" align="center">
             <template #default="scope">
               <div>{{ scope.row.equityPackageName || scope.row.rightsName }}</div>
@@ -137,8 +144,8 @@
         @click="handleSubmit(false)">取消</el-button>
       <el-button type="primary" @click="handleSubmit(true)" :loading="loading">提交核保</el-button>
     </div>
-    <Equities v-model:show="equitiesShow" v-if="equitiesShow" :recipientInfo="recipientInfo" :EquitiesInfo="EquitiesInfo"
-      @save="handleEquitiesSave"></Equities>
+    <Equities v-model:show="equitiesShow" v-if="equitiesShow" :recipientInfo="recipientInfo"
+      :EquitiesInfo="EquitiesInfo" @save="handleEquitiesSave"></Equities>
   </div>
 </template>
 
@@ -432,8 +439,7 @@ defineExpose({
 </script>
 
 <style scoped lang="scss">
-
-:deep(.el-upload-dragger){
+:deep(.el-upload-dragger) {
   padding: unset;
   width: 208px;
 }

+ 9 - 5
src/views/platform/index.vue

@@ -144,7 +144,10 @@
           <span class="col-108 m-r-8">
             <el-button class="radius-2px width-100"
               :disabled="selectedList.some(item => item.settlementStatusName === '已结算')"
-              @click="handleBatchEdit">批量修改</el-button>
+              @click="handleBatchEdit('first')">批量修改</el-button>
+          </span>
+          <span class="col-108 m-r-8">
+            <el-button class="radius-2px width-100" @click="handleBatchEdit('second')">导入修改</el-button>
           </span>
           <span class="col-108 m-r-8">
             已选: <span class="text-red">{{ selectedList.length }}</span> 条
@@ -309,7 +312,7 @@
     </el-dialog>
     <el-dialog :close-on-click-modal="false" title="批量修改" v-model="batchEditShow" width="700">
       <el-tabs v-model="subActiveName" class="demo-tabs">
-        <el-tab-pane label="User" name="first">
+        <el-tab-pane label="User" name="first" v-if="subActiveName === 'first'">
           <template #label>选中修改({{ selectedList.length }})</template>
           <el-form :model="editForm">
             <el-row :gutter="20">
@@ -382,7 +385,7 @@
             </el-row>
           </el-form>
         </el-tab-pane>
-        <el-tab-pane label="Config" name="second">
+        <el-tab-pane label="Config" name="second" v-if="subActiveName === 'second'">
           <template #label>导入修改</template>
           <div style="display: flex; align-items: center; justify-content: center; margin-bottom: 10px">
             下载「标准导入模板」,编辑后上传;系统将自动匹配相关字段
@@ -766,8 +769,8 @@ let feeRate = ref(null)
 let signTime = ref(null)
 let people = ref(null)
 let editForm = ref({})
-const handleBatchEdit = () => {
-  if (selectedList.value.length < 1) {
+const handleBatchEdit = (str: string) => {
+  if (selectedList.value.length < 1 && str === 'first') {
     ElMessage({
       message: '请选择数据!',
       type: 'warning'
@@ -777,6 +780,7 @@ const handleBatchEdit = () => {
   editForm.value = {}
   importModifyCallback.value = null
   batchEditShow.value = true
+  subActiveName.value = str
 }
 
 const handleBatchEditSubmit = async () => {

+ 17 - 9
src/views/receivable/documentary/index.vue

@@ -130,7 +130,10 @@
           <span class="col-108 m-r-8">
             <el-button class="radius-2px width-100"
               :disabled="selectedList.some(item => item.invoiceStatusName === '已开票' || item.disableFlag === '1')"
-              @click="handleBatchEdit">批量修改</el-button>
+              @click="handleBatchEdit('first')">批量修改</el-button>
+          </span>
+          <span class="col-108 m-r-8">
+            <el-button class="radius-2px width-100" @click="handleBatchEdit('second')">导入修改</el-button>
           </span>
           <span class="col-108 m-r-8">
             <el-dropdown class="width-100" trigger="click" placement="bottom" @command="dropdownCommand">
@@ -325,7 +328,10 @@
             <el-button class="radius-2px width-100" type="primary" @click="handleExport(2)">导出</el-button>
           </div>
           <span class="col-108 m-r-8">
-            <el-button class="radius-2px width-100" @click="handleBatchEdit">批量修改</el-button>
+            <el-button class="radius-2px width-100" @click="handleBatchEdit('first')">批量修改</el-button>
+          </span>
+          <span class="col-108 m-r-8">
+            <el-button class="radius-2px width-100" @click="handleBatchEdit('second')">导入修改</el-button>
           </span>
           <span class="col-108 m-r-8">
             已选: <span class="text-red">{{ selectedList.length }}</span> 条
@@ -378,7 +384,7 @@
                       <el-dropdown-item command="数据导入">数据导入</el-dropdown-item>
                     </el-dropdown-menu>
                   </template>
-                </el-dropdown> -->
+      </el-dropdown> -->
               </div>
             </template>
           </el-table-column>
@@ -471,8 +477,8 @@
       </template>
     </el-dialog>
     <el-dialog :close-on-click-modal="false" title="批量修改" v-model="batchEditShow" width="700">
-      <el-tabs v-model="subActiveName" class="demo-tabs">
-        <el-tab-pane label="User" name="first">
+      <el-tabs v-model="subActiveName" class="demo-tabs" >
+        <el-tab-pane label="User" name="first" v-if="subActiveName === 'first'">
           <template #label>选中修改({{ selectedList.length }})</template>
           <el-form :model="editForm">
             <el-row :gutter="20">
@@ -523,7 +529,7 @@
             </el-row>
           </el-form>
         </el-tab-pane>
-        <el-tab-pane label="Config" name="second">
+        <el-tab-pane label="Config" name="second" v-if="subActiveName === 'second'">
           <template #label>导入修改</template>
           <div style="display: flex; align-items: center; justify-content: center; margin-bottom: 10px">
             下载「标准导入模板」,编辑后上传;系统将自动匹配相关字段
@@ -552,7 +558,7 @@
       </el-tabs>
       <template #footer>
         <el-button class="border-[#0083FF] color-[#0083FF]" plain @click="batchEditShow = false">取消</el-button>
-        <el-button type="primary" @click="handleBatchEditSubmit()">确定</el-button>
+        <el-button type="primary" v-if="subActiveName === 'first'" @click="handleBatchEditSubmit()">确定</el-button>
       </template>
     </el-dialog>
   </PageMain>
@@ -918,8 +924,8 @@ let feeRate = ref(null)
 let signTime = ref(null)
 let people = ref(null)
 let editForm = ref({})
-const handleBatchEdit = () => {
-  if (selectedList.value.length < 1) {
+const handleBatchEdit = (str: string) => {
+  if (selectedList.value.length < 1 && str === 'first') {
     ElMessage({
       message: '请选择数据!',
       type: 'warning'
@@ -927,7 +933,9 @@ const handleBatchEdit = () => {
     return
   }
   editForm.value = {}
+  importModifyCallback.value = null
   batchEditShow.value = true
+  subActiveName.value = str
 }
 
 const handleBatchEditSubmit = async () => {