Browse Source

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

@dongkboy 4 months ago
parent
commit
4c10cd63f9

+ 1 - 1
src/api/modules/finance.ts

@@ -8,7 +8,7 @@ const financeApi = (axiosInstance: ApiInstance) => ({
     auditReceive: (data: string) => axiosInstance.post(`/feeAudit/auditReceive?orderNo=${data}`), //  财务中心-订单审核-领取
     auditCancel: (data: string) => axiosInstance.post(`/feeAudit/auditCancel?orderNo=${data}`), // 放弃审核
     updateSigningTime: (data: string) => axiosInstance.post(`/feeAudit/updateSigningTime?orderNo=${data}`), // 更新签单时间
-    updateToQuestionOrder: (data: string) => axiosInstance.post(`/feeAudit/updateToQuestionOrder?orderNo=${data}`), // 设置为疑问订单
+    updateToQuestionOrder: (data: object) => axiosInstance.post(`/feeAudit/updateToQuestionOrder?orderNo=${data.orderNo}&problemReason=${data.problemReason}`), // 设置为疑问订单
     updateToUnQuestionOrder: (data: string) => axiosInstance.post(`/feeAudit/updateToUnQuestionOrder?orderNo=${data}`), // 取消疑问订单
     auditCostInfo: (data: string) => axiosInstance.get(`/feeAudit/auditCostInfo?orderNo=${data}`), // 获取费用详情
     saveCostInfo: (data: any) => axiosInstance.post('/feeAudit/saveCostInfo', data), // 保存调整后的费用

+ 3 - 0
src/store/modules/route.ts

@@ -2,6 +2,7 @@ import type { Route } from '#/global'
 import type { RouteRecordRaw } from 'vue-router'
 import { systemRoutes } from '@/router/routes'
 import { resolveRoutePath } from '@/utils'
+import useUserStore from '@/store/modules/user'
 import { cloneDeep } from 'lodash-es'
 import useSettingsStore from './settings'
 import api from '@/api'
@@ -222,6 +223,8 @@ function formatBackRoutes(routes: any, views = import.meta.glob('../../views/**/
           routesRaw.value = converDeprecatedAttribute(formatBackRoutes(res.data) as any)
           isGenerate.value = true
         }else{
+          // 退出登录
+          useUserStore().logout()
           // 路由获取失败
           ElMessage.error('路由获取失败')
         }

+ 10 - 8
src/views/additionalOrder/additional/index.vue

@@ -3998,6 +3998,8 @@ const handleSubmit = async (FormRefs) => {
           }
         })
       }
+    }else{
+      ElMessage.warning('请完善订单内容')
     }
   })
 }
@@ -4147,14 +4149,14 @@ const initEditData = () => {
         additionalForm.value.syPremium = obj.insOrdersOtherInfo.syPremium
         additionalForm.value.sumPremium = obj.insOrdersOtherInfo.sumPremium
 
-        additionalForm.value.agreementId = obj.feeOrdersVo.agreementId
-        additionalForm.value.costId = obj.feeOrdersVo.costId
-        additionalForm.value.jqInletRatio = obj.feeOrdersVo.jqInletRatio
-        additionalForm.value.syInletRatio = obj.feeOrdersVo.syInletRatio
-        additionalForm.value.jyInletRatio = obj.feeOrdersVo.jyInletRatio
-        additionalForm.value.jqExportRatio = obj.feeOrdersVo.jqExportRatio
-        additionalForm.value.syExportRatio = obj.feeOrdersVo.syExportRatio
-        additionalForm.value.jyExportRatio = obj.feeOrdersVo.jyExportRatio
+        additionalForm.value.agreementId = obj.feeOrdersVo?.agreementId
+        additionalForm.value.costId = obj.feeOrdersVo?.costId
+        additionalForm.value.jqInletRatio = obj.feeOrdersVo?.jqInletRatio
+        additionalForm.value.syInletRatio = obj.feeOrdersVo?.syInletRatio
+        additionalForm.value.jyInletRatio = obj.feeOrdersVo?.jyInletRatio
+        additionalForm.value.jqExportRatio = obj.feeOrdersVo?.jqExportRatio
+        additionalForm.value.syExportRatio = obj.feeOrdersVo?.syExportRatio
+        additionalForm.value.jyExportRatio = obj.feeOrdersVo?.jyExportRatio
 
 
         jqPolicyId.value = obj.insOrdersExternalPolicy?.jqPolicy

+ 27 - 3
src/views/finance/audit.vue

@@ -117,7 +117,7 @@
           <el-table-column label="操作" fixed="right" width="200">
             <template #default="scope">
               <el-button link type="primary" size="small" @click="handleToDetail(scope, 1, '0')">审核</el-button>
-              <el-button link type="primary" size="small" @click="handleUpdateToQuestionOrder(scope)">设置疑问订单</el-button>
+              <el-button link type="primary" size="small" @click="openQuestionOrderDialog(scope.row)">设置疑问订单</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -468,6 +468,7 @@
           <el-table-column prop="companyName" label="保险公司" width="120"></el-table-column>
           <el-table-column prop="licenseNo" label="车牌号" width="120"></el-table-column>
           <el-table-column prop="insurName" label="被保人" width="120"></el-table-column>
+          <el-table-column prop="problemReason" label="疑问原因" width="120"></el-table-column>
           <el-table-column prop="orderType" label="订单类型" width="120">
             <template #default="scope">
               {{ scope.row.orderType == '1' ? '车险录入' : scope.row.orderType == '2' ? '代客录单' : scope.row.orderType ==
@@ -510,6 +511,16 @@
       </el-tab-pane>
     </el-tabs>
   </PageMain>
+  <el-dialog v-model="questionOrderDialog" title="设为疑问订单" width="600">
+    <el-form>
+      <el-form-item label="疑问原因">
+        <el-input type="textarea" v-model="questionOrderValue" placeholder="输入疑问原因"></el-input>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button size="small" type="primary" @click="handleUpdateToQuestionOrder">确定</el-button>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup lang="ts">
@@ -682,10 +693,23 @@ const handleCancel = (scope) => {
   })
 }
 
+const questionOrderDialog = ref(false)
+const questionOrderValue = ref('')
+const questionOrderRow = ref({})
+const openQuestionOrderDialog = (row) => {
+  questionOrderValue.value = ''
+  questionOrderRow.value = row
+  questionOrderDialog.value = true
+}
 // 设为疑问订单
-const handleUpdateToQuestionOrder = (scope) => {
-  api.financeApi.updateToQuestionOrder(scope.row.orderNo).then((res: any) => {
+const handleUpdateToQuestionOrder = () => {
+  const params = {
+    problemReason: questionOrderValue.value,
+    orderNo: questionOrderRow.value.orderNo
+  }
+  api.financeApi.updateToQuestionOrder(params).then((res: any) => {
     if (res.code == 200) {
+      questionOrderDialog.value = false
       ElMessage({
         message: res.msg,
         type: 'success'

+ 57 - 3
src/views/finance/index.vue

@@ -69,6 +69,22 @@
                   start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
               </el-form-item>
             </el-col>
+            <el-col v-show="isTrue" :span="8">
+              <el-form-item label="疑问订单">
+                <el-select v-model="firstForm.isProblem" placeholder="请选择" clearable>
+                  <el-option label="否" value="0"></el-option>
+                  <el-option label="是" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col v-show="isTrue" :span="8">
+              <el-form-item label="业务来源">
+                <el-select v-model="firstForm.orderSource" placeholder="请选择" clearable>
+                  <el-option label="pc" value="0"></el-option>
+                  <el-option label="app" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
             <el-col :span="24" style="display: flex; align-items: center; justify-content: flex-end">
               <el-button plain @click="handleExport('0')">数据导出</el-button>
               <el-button type="primary" @click="handleSearch">搜索</el-button>
@@ -82,7 +98,7 @@
             </el-col>
           </el-row>
         </el-form>
-        <el-table :data="firstData" :height="isTrue ? 'calc(100% - 244px)' : 'calc(100% - 194px)'"
+        <el-table :data="firstData" :height="isTrue ? 'calc(100% - 294px)' : 'calc(100% - 194px)'"
           style="width: 100%; margin-top: 20px;">
           <el-table-column prop="orderNo" label="订单号" width="120"></el-table-column>
           <el-table-column prop="companyALlName" label="保险公司" width="120"></el-table-column>
@@ -105,6 +121,8 @@
           <el-table-column prop="jqPremium" label="交强险" width="120"></el-table-column>
           <el-table-column prop="syPremium" label="商业险" width="120"></el-table-column>
           <el-table-column prop="jyPremium" label="驾意险" width="120"></el-table-column>
+          <el-table-column prop="isProblem" label="疑问订单" width="120"></el-table-column>
+          <el-table-column prop="orderSource" label="订单来源" width="120"></el-table-column>
           <el-table-column label="操作" fixed="right" width="200">
             <template #default="scope">
               <el-button link type="primary" size="small" @click="auditReceive(scope.row)">领取</el-button>
@@ -187,6 +205,22 @@
                   start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
               </el-form-item>
             </el-col>
+            <el-col v-show="isTrue" :span="8">
+              <el-form-item label="疑问订单">
+                <el-select v-model="firstForm.isProblem" placeholder="请选择" clearable>
+                  <el-option label="否" value="0"></el-option>
+                  <el-option label="是" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col v-show="isTrue" :span="8">
+              <el-form-item label="业务来源">
+                <el-select v-model="firstForm.orderSource" placeholder="请选择" clearable>
+                  <el-option label="pc" value="0"></el-option>
+                  <el-option label="app" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
             <el-col :span="24" style="display: flex; align-items: center; justify-content: flex-end">
               <el-button plain @click="handleExport('1')">数据导出</el-button>
               <el-button type="primary" @click="handleSearch">搜索</el-button>
@@ -200,7 +234,7 @@
             </el-col>
           </el-row>
         </el-form>
-        <el-table :data="secondData" :height="isTrue ? 'calc(100% - 246px)' : 'calc(100% - 196px)'"
+        <el-table :data="secondData" :height="isTrue ? 'calc(100% - 294px)' : 'calc(100% - 194px)'"
           style="width: 100%; margin-top: 20px;">
           <el-table-column prop="orderNo" label="订单号" width="120"></el-table-column>
           <el-table-column prop="companyALlName" label="保险公司" width="120"></el-table-column>
@@ -223,6 +257,8 @@
           <el-table-column prop="jqPremium" label="交强险" width="120"></el-table-column>
           <el-table-column prop="syPremium" label="商业险" width="120"></el-table-column>
           <el-table-column prop="jyPremium" label="驾意险" width="120"></el-table-column>
+          <el-table-column prop="isProblem" label="疑问订单" width="120"></el-table-column>
+          <el-table-column prop="orderSource" label="订单来源" width="120"></el-table-column>
           <el-table-column label="操作" fixed="right" width="150">
             <template #default="scope">
               <!--                            <el-button link type="primary" size="small" @click="auditReceive(scope.row)">领取</el-button>
@@ -306,6 +342,22 @@
                   start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
               </el-form-item>
             </el-col>
+            <el-col v-show="isTrue" :span="8">
+              <el-form-item label="疑问订单">
+                <el-select v-model="firstForm.isProblem" placeholder="请选择" clearable>
+                  <el-option label="否" value="0"></el-option>
+                  <el-option label="是" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col v-show="isTrue" :span="8">
+              <el-form-item label="业务来源">
+                <el-select v-model="firstForm.orderSource" placeholder="请选择" clearable>
+                  <el-option label="pc" value="0"></el-option>
+                  <el-option label="app" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
             <el-col :span="24" style="display: flex; align-items: center; justify-content: flex-end">
               <el-button plain @click="handleExport('2')">数据导出</el-button>
               <el-button type="primary" @click="handleSearch">搜索</el-button>
@@ -319,7 +371,7 @@
             </el-col>
           </el-row>
         </el-form>
-        <el-table :data="thirdData" :height="isTrue ? 'calc(100% - 246px)' : 'calc(100% - 196px)'"
+        <el-table :data="thirdData" :height="isTrue ? 'calc(100% - 294px)' : 'calc(100% - 194px)'"
           style="width: 100%; margin-top: 20px;">
           <el-table-column prop="orderNo" label="订单号" width="120"></el-table-column>
           <el-table-column prop="companyALlName" label="保险公司" width="120"></el-table-column>
@@ -345,6 +397,8 @@
           <el-table-column prop="jqPremium" label="交强险" width="120"></el-table-column>
           <el-table-column prop="syPremium" label="商业险" width="120"></el-table-column>
           <el-table-column prop="jyPremium" label="驾意险" width="120"></el-table-column>
+          <el-table-column prop="isProblem" label="疑问订单" width="120"></el-table-column>
+          <el-table-column prop="orderSource" label="订单来源" width="120"></el-table-column>
           <el-table-column label="操作" fixed="right" width="200">
             <template #default="scope">
               <el-button link type="primary" size="small" @click="auditReceive(scope.row)">领取</el-button>

+ 17 - 7
src/views/finance/modules/auditDetail.vue

@@ -956,8 +956,7 @@ import image from "@/assets/images/image.png";
 import pdf from "@/assets/images/pdf.png";
 import word from "@/assets/images/word.png";
 import VueOfficeDocx from "@vue-office/docx";
-import { ElMessage } from "element-plus";
-
+import { ElMessage, ElLoading } from "element-plus";
 const myRoute = useRoute()
 const myRouter = useRouter()
 const activeindex = ref(myRoute.query.activeindex)
@@ -1215,17 +1214,28 @@ const download = (item) => {
   image.src = item.fileName
 }
 const vehicleAndVesselTaxVo = ref()//车船税
+
 // 获取详情
 const initDetail = () => {
+  // 打开 loading
+  const loading = ElLoading.service({
+    lock: true,
+    text: "正在加载订单详情...",
+    background: "rgba(0, 0, 0, 0.7)",
+  });
+
   api.financeApi.auditInfo(myRoute.query.id).then((res: any) => {
     if (res.code == 200) {
       detailData.value = res.data;
-      vehicleAndVesselTaxVo.value = res.data?.vehicleAndVesselTaxVo || {}
-      nextTick(() => jumpFn())
-
+      vehicleAndVesselTaxVo.value = res.data?.vehicleAndVesselTaxVo || {};
+      nextTick(() => jumpFn());
     }
-  })
-}
+  }).catch((err) => {
+    console.log("获取详情失败", err);
+  }).finally(() => {
+    loading.close();
+  });
+};
 
 // 放弃审核
 const handleAuditCancel = () => {

+ 5 - 2
src/views/partnerManagement/modules/addCard.vue

@@ -4,7 +4,7 @@
       <el-form-item prop="name" label="姓名">
         <el-input v-model="bankForm.name" disabled></el-input>
       </el-form-item>
-      <el-form-item prop="bank" label="银行">
+      <el-form-item prop="bankName" label="银行">
         <el-select v-model="bankForm.bankName" :disabled="bankForm.isRead">
           <el-option v-for="item in bankOption" :key="item.id" :value="item.label" :label="item.label"></el-option>
         </el-select>
@@ -12,7 +12,7 @@
       <el-form-item prop="bankCardNumber" label="银行卡号">
         <el-input v-model="bankForm.bankCardNumber" :disabled="bankForm.isRead"></el-input>
       </el-form-item>
-      <el-form-item prop="bankName" label="开户行">
+      <el-form-item prop="bankAddress" label="开户行">
         <el-input v-model="bankForm.bankAddress" :disabled="bankForm.isRead"></el-input>
       </el-form-item>
       <el-form-item prop="photo" label="照片" class="upload-btn">
@@ -79,6 +79,9 @@ const bankRules = {
     { required: true, message: '请填写姓名', trigger: 'blur' }
   ],
   bankName: [
+    { required: true, message: '请选择银行', trigger: 'blur' }
+  ],
+  bankAddress: [
     { required: true, message: '请填写开户行', trigger: 'blur' }
   ],
   bankCardNumber: [

+ 144 - 156
src/views/partnerManagement/modules/addPartner.vue

@@ -17,8 +17,8 @@
               <el-col :span="10">
                 <el-form-item label="上级推荐人" :prop="mingrade == 1 ? '' : 'referrerId'">
                   <el-select v-model="operationForm.referrerId" filterable
-                    :disabled="!operationForm.gradeList || operationForm.gradeList.includes('1') || editId" placeholder="请选择上级推荐人"
-                    @focus="searchRecommend" @change="handleReferrerChange">
+                    :disabled="!operationForm.gradeList || operationForm.gradeList.includes('1') || editId"
+                    placeholder="请选择上级推荐人" @focus="searchRecommend" @change="handleReferrerChange">
                     <el-option v-for="item in referrerList" :key="item.userId" :value="item.userId" :label="item.name">
                       <span>{{ item.name }}-</span>
                       <span> {{ item.mobile }}-</span>
@@ -38,8 +38,8 @@
               <el-col :span="10">
                 <!--   去掉手机号带出人员信息数据    @input="mobileInput"   -->
                 <el-form-item prop="mobile" label="手机号">
-                  <el-input type="text" :maxlength="11" :disabled="editId" show-word-limit v-model="operationForm.mobile"
-                    placeholder="请填写手机号" ></el-input>
+                  <el-input type="text" :maxlength="11" :disabled="editId" show-word-limit
+                    v-model="operationForm.mobile" placeholder="请填写手机号"></el-input>
                 </el-form-item>
               </el-col>
             </el-row>
@@ -117,10 +117,7 @@
       <el-descriptions title="资料附件">
         <el-descriptions-item>
           <template #default>
-            <el-form-item prop="IDCardFront" label-width="150">
-              <template #label>
-                <span style="color: #f56c6c">*</span>身份证(人像面)
-              </template>
+            <el-form-item prop="IDCardFront" label-width="150" label="身份证(人像面)">
               <el-upload action="" v-if="!IDCardFront" :auto-upload="false" :show-file-list="false"
                 accept=".png, .jpg, .jpeg" @change="uploadImage($event, 1)">
                 <el-button link type="primary" icon="Upload">上传</el-button>
@@ -160,10 +157,7 @@
                 </div>-->
               </div>
             </el-form-item>
-            <el-form-item prop="IDCardBack" label-width="150">
-              <template #label>
-                <span style="color: #f56c6c">*</span>身份证(国徽面)
-              </template>
+            <el-form-item prop="IDCardBack" label-width="150" label="身份证(国徽面)">
               <el-upload v-if="!IDCardBack" :auto-upload="false" :show-file-list="false" accept=".png, .jpg, .jpeg"
                 @change="uploadImage($event, 2)">
                 <el-button link type="primary" icon="Upload">上传</el-button>
@@ -843,76 +837,76 @@ const disabledDateEnd = (time: Date) => {
 // 编辑的id
 let editId = ref()
 const initEditData = (id: any) => {
-    editId.value = id
-    api.operationApi.operationDetail(id).then((res: any) => {
-      if (res?.code == 200) {
-        let formData = res.data
-        Object.assign(operationForm, formData)
-        console.log(operationForm)
-        mingrade.value = getMinValueFromStrArray(formData.gradeList)
-        searchRecommend();//编辑回显查询上级推荐人列表
-        operationForm.deptId = formData.deptId
-        let address = [] as any
-        if (formData.province && formData.city && formData.district) {
-          address = [formData.province, formData.city, formData.district]
+  editId.value = id
+  api.operationApi.operationDetail(id).then((res: any) => {
+    if (res?.code == 200) {
+      let formData = res.data
+      Object.assign(operationForm, formData)
+      console.log(operationForm)
+      mingrade.value = getMinValueFromStrArray(formData.gradeList)
+      searchRecommend();//编辑回显查询上级推荐人列表
+      operationForm.deptId = formData.deptId
+      let address = [] as any
+      if (formData.province && formData.city && formData.district) {
+        address = [formData.province, formData.city, formData.district]
+      }
+      if (formData.province && !formData.city && !formData.district) {
+        address = [formData.province]
+      }
+      if (formData.fileList) {
+        let sfz1 = formData.fileList.find((item: any) => item.fileType == 'sfz1')
+        let sfz2 = formData.fileList.find((item: any) => item.fileType == 'sfz2')
+        let qualification = formData.fileList.find((item: any) => item.fileType == 'qualification')
+        let contractImg = formData.fileList.find((item: any) => item.fileType == 'contract')
+        let applicantImg = formData.fileList.find((item: any) => item.fileType == 'applicant')
+        let salaryTable = formData.fileList.find((item: any) => item.fileType == 'salary')
+        let leaveTable = formData.fileList.find((item: any) => item.fileType == 'leave')
+        if (sfz1) {
+          operationForm.sfz1 = sfz1.id
+          IDCardFrontName.value = sfz1.fileName
+          IDCardFront.value = sfz1.fileUrl
         }
-        if (formData.province && !formData.city && !formData.district) {
-          address = [formData.province]
+        if (sfz2) {
+          operationForm.sfz2 = sfz2.id
+          IDCardBackName.value = sfz2.fileName
+          IDCardBack.value = sfz2.fileUrl
         }
-        if (formData.fileList) {
-          let sfz1 = formData.fileList.find((item: any) => item.fileType == 'sfz1')
-          let sfz2 = formData.fileList.find((item: any) => item.fileType == 'sfz2')
-          let qualification = formData.fileList.find((item: any) => item.fileType == 'qualification')
-          let contractImg = formData.fileList.find((item: any) => item.fileType == 'contract')
-          let applicantImg = formData.fileList.find((item: any) => item.fileType == 'applicant')
-          let salaryTable = formData.fileList.find((item: any) => item.fileType == 'salary')
-          let leaveTable = formData.fileList.find((item: any) => item.fileType == 'leave')
-          if (sfz1) {
-            operationForm.sfz1 = sfz1.id
-            IDCardFrontName.value = sfz1.fileName
-            IDCardFront.value = sfz1.fileUrl
-          }
-          if (sfz2) {
-            operationForm.sfz2 = sfz2.id
-            IDCardBackName.value = sfz2.fileName
-            IDCardBack.value = sfz2.fileUrl
-          }
-          if (qualification) {
-            operationForm.qualification = qualification.id
-            certificationName.value = qualification.fileName
-            certification.value = qualification.fileUrl
-          }
-          if (contractImg) {
-            operationForm.contract = contractImg.id
-            contractName.value = contractImg.fileName
-            contract.value = contractImg.fileUrl
-          }
-          if (applicantImg) {
-            operationForm.applicant = applicantImg.id
-            applicantName.value = applicantImg.fileName
-            applicant.value = applicantImg.fileUrl
-          }
-          if (salaryTable) {
-            operationForm.salaryTable = salaryTable.id
-            decidePayName.value = salaryTable.fileName
-            decidePay.value = salaryTable.fileUrl
-          }
-          if (leaveTable) {
-            operationForm.leaveTable = leaveTable.id
-            dimissionName.value = leaveTable.fileName
-            dimission.value = leaveTable.fileUrl
-          }
+        if (qualification) {
+          operationForm.qualification = qualification.id
+          certificationName.value = qualification.fileName
+          certification.value = qualification.fileUrl
+        }
+        if (contractImg) {
+          operationForm.contract = contractImg.id
+          contractName.value = contractImg.fileName
+          contract.value = contractImg.fileUrl
+        }
+        if (applicantImg) {
+          operationForm.applicant = applicantImg.id
+          applicantName.value = applicantImg.fileName
+          applicant.value = applicantImg.fileUrl
+        }
+        if (salaryTable) {
+          operationForm.salaryTable = salaryTable.id
+          decidePayName.value = salaryTable.fileName
+          decidePay.value = salaryTable.fileUrl
+        }
+        if (leaveTable) {
+          operationForm.leaveTable = leaveTable.id
+          dimissionName.value = leaveTable.fileName
+          dimission.value = leaveTable.fileUrl
         }
-        operationForm.address = address
-        getUser(operationForm.deptId)
-        getRecommend(operationForm.deptId)
-      } else {
-        ElMessage({
-          message: res.msg,
-          type: 'warning'
-        })
       }
-    })
+      operationForm.address = address
+      getUser(operationForm.deptId)
+      getRecommend(operationForm.deptId)
+    } else {
+      ElMessage({
+        message: res.msg,
+        type: 'warning'
+      })
+    }
+  })
 }
 
 // 新增数据初始化
@@ -1259,87 +1253,81 @@ const onSubmit = async (OperationFormRef: any, type: any) => {
   if (type) {
     await OperationFormRef.validate((valid: any, error: any) => {
       if (valid) {
-        if (IDCardFront.value && IDCardBack.value) {
-          let formData = { ...operationForm }
-          // formData.organization = operationForm.value.organization[operationForm.value.organization.length - 1]
-          formData.systemCode = localStorage.getItem('login_system') ? localStorage.getItem('login_system') : ''
-          formData.province = operationForm.address ? operationForm.address[0] : ''
-          formData.city = operationForm.address ? operationForm.address[1] ? operationForm.address[1] : '' : ''
-          formData.district = operationForm.address ? operationForm.address[2] ? operationForm.address[2] : '' : ''
-          if (editId.value) {
-            api.operationApi.updateOperation(formData).then((res: any) => {
-              if (res.code == 200) {
-                ElMessage({
-                  message: res.msg,
-                  type: 'success'
-                })
-                emits('closeDialog', '确定')
-              } else {
-                ElMessage({
-                  message: res.msg,
-                  type: 'error'
-                })
-              }
-              IDCardFrontName.value = ''
-              IDCardFront.value = ''
-              IDCardBackName.value = ''
-              IDCardBack.value = ''
-              certificationName.value = ''
-              certification.value = ''
-              contractName.value = ''
-              contract.value = ''
-              applicantName.value = ''
-              applicant.value = ''
-              decidePayName.value = ''
-              decidePay.value = ''
-              dimissionName.value = ''
-              dimission.value = ''
-              recordShow.value = false
-              OperationFormRef.resetFields()
-              emits('closeDialog', '取消')
-            })
-          } else {
-            console.log(formData)
-            api.partnerApi.saveByPartner({
-              ...formData,
-            }).then((res: any) => {
-              if (res.code == 200) {
-                ElMessage({
-                  message: res.msg,
-                  type: 'success'
-                })
-                emits('closeDialog', '确定')
-              } else {
-                ElMessage({
-                  message: res.msg,
-                  type: 'error'
-                })
-              }
-              IDCardFrontName.value = ''
-              IDCardFront.value = ''
-              IDCardBackName.value = ''
-              IDCardBack.value = ''
-              certificationName.value = ''
-              certification.value = ''
-              contractName.value = ''
-              contract.value = ''
-              applicantName.value = ''
-              applicant.value = ''
-              decidePayName.value = ''
-              decidePay.value = ''
-              dimissionName.value = ''
-              dimission.value = ''
-              recordShow.value = false
-              OperationFormRef.resetFields()
-              emits('closeDialog', '取消')
-            })
-          }
+        let formData = { ...operationForm }
+        // formData.organization = operationForm.value.organization[operationForm.value.organization.length - 1]
+        formData.systemCode = localStorage.getItem('login_system') ? localStorage.getItem('login_system') : ''
+        formData.province = operationForm.address ? operationForm.address[0] : ''
+        formData.city = operationForm.address ? operationForm.address[1] ? operationForm.address[1] : '' : ''
+        formData.district = operationForm.address ? operationForm.address[2] ? operationForm.address[2] : '' : ''
+        if (editId.value) {
+          api.operationApi.updateOperation(formData).then((res: any) => {
+            if (res.code == 200) {
+              ElMessage({
+                message: res.msg,
+                type: 'success'
+              })
+              emits('closeDialog', '确定')
+            } else {
+              ElMessage({
+                message: res.msg,
+                type: 'error'
+              })
+            }
+            IDCardFrontName.value = ''
+            IDCardFront.value = ''
+            IDCardBackName.value = ''
+            IDCardBack.value = ''
+            certificationName.value = ''
+            certification.value = ''
+            contractName.value = ''
+            contract.value = ''
+            applicantName.value = ''
+            applicant.value = ''
+            decidePayName.value = ''
+            decidePay.value = ''
+            dimissionName.value = ''
+            dimission.value = ''
+            recordShow.value = false
+            OperationFormRef.resetFields()
+            emits('closeDialog', '取消')
+          })
         } else {
-          ElMessage({
-            message: '请上传必传附件!',
-            type: 'warning'
+          console.log(formData)
+          api.partnerApi.saveByPartner({
+            ...formData,
+          }).then((res: any) => {
+            if (res.code == 200) {
+              ElMessage({
+                message: res.msg,
+                type: 'success'
+              })
+              emits('closeDialog', '确定')
+            } else {
+              ElMessage({
+                message: res.msg,
+                type: 'error'
+              })
+            }
+            IDCardFrontName.value = ''
+            IDCardFront.value = ''
+            IDCardBackName.value = ''
+            IDCardBack.value = ''
+            certificationName.value = ''
+            certification.value = ''
+            contractName.value = ''
+            contract.value = ''
+            applicantName.value = ''
+            applicant.value = ''
+            decidePayName.value = ''
+            decidePay.value = ''
+            dimissionName.value = ''
+            dimission.value = ''
+            recordShow.value = false
+            OperationFormRef.resetFields()
+            emits('closeDialog', '取消')
           })
         }
+
       } else {
         Object.keys(error).forEach((key, i) => {
           if (i == 0) {

+ 31 - 4
src/views/quoteConfig/agreement/agreementDetails.vue

@@ -168,9 +168,19 @@
     </PageMain>
     <el-drawer v-model="addUnderwritingRuleShow" :direction="direction" :close-on-click-modal="false" size="50%">
       <template #header>
-        <h4>添加承保规则</h4>
+        <div>添加承保规则</div>
       </template>
       <template #default>
+        <el-form :model="rulesAttrListInfo" ref="OperationFormRef" :rules="rulesAttrListInfoRules" label-width="110">
+          <el-form-item prop="startTime" label="生效起始时间">
+            <el-date-picker v-model="rulesAttrListInfo.startTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime"
+              placeholder="生效起始时间" />
+          </el-form-item>
+          <el-form-item prop="endTime" label="生效终止时间">
+            <el-date-picker v-model="rulesAttrListInfo.endTime" value-format="YYYY-MM-DD HH:mm:ss" type="datetime"
+              placeholder="生效终止时间" />
+          </el-form-item>
+        </el-form>
         <div class="flex a-c j-s ">
           <span class="strong title" style="margin-right: 20px;">规则条件</span>
           <el-button type="primary" link @click="addRules">
@@ -213,6 +223,7 @@
 <script lang='ts' setup>
 import api from '@/api';
 import { CaretBottom } from '@element-plus/icons-vue'
+import type { FormRules } from "element-plus";
 import { ElMessage, ElMessageBox, DrawerProps, TabsInstance } from 'element-plus'
 import { ref, reactive } from 'vue'
 import { useRoute, useRouter } from 'vue-router';
@@ -460,6 +471,8 @@ const ruleFeePosition = ref<TabsInstance['tabPosition']>('left')
 const direction = ref<DrawerProps['direction']>('rtl')
 const addUnderwritingRule = () => {
   addUnderwritingRuleShow.value = true;
+  rulesAttrListInfo.startTime = ''
+  rulesAttrListInfo.endTime = ''
   rulesAttrListInfo.rulesAttrList = []
 }
 //承保规则保存事件
@@ -516,6 +529,8 @@ const ruleEdit = (id: string) => {
   addUnderwritingRuleShow.value = true;
   api.agreementApi.agreementRulesGet(id).then((res: any) => {
     if (res.code == '200') {
+      rulesAttrListInfo.startTime = res.data.startTime;
+      rulesAttrListInfo.endTime = res.data.endTime;
       rulesAttrListInfo.rulesAttrList = processArray(res.data.costsAttrLinks);
       console.log(rulesAttrListInfo.rulesAttrList)
     } else {
@@ -583,7 +598,7 @@ const columns = [
       let info = row.ptlAgreementCostTypeList.find((val: any) => val.costType == '交强险');
       if (info) {
         return `入口:${info.inlet.toFixed(2)}% 出口:${info.export.toFixed(2)}%\n加投:${info.addThrow.toFixed(2)}% 手续费:${info.commission.toFixed(2)}%`
-      }else{
+      } else {
         return '-'
       }
     }
@@ -593,7 +608,7 @@ const columns = [
       let info = row.ptlAgreementCostTypeList.find((val: any) => val.costType == '商业险');
       if (info) {
         return `入口:${info.inlet.toFixed(2)}% 出口:${info.export.toFixed(2)}%\n加投:${info.addThrow.toFixed(2)}% 手续费:${info.commission.toFixed(2)}%`
-      }else{
+      } else {
         return '-'
       }
     }
@@ -603,7 +618,7 @@ const columns = [
       let info = row.ptlAgreementCostTypeList.find((val: any) => val.costType == '驾意险');
       if (info) {
         return `入口:${info.inlet.toFixed(2)}% 出口:${info.export.toFixed(2)}%\n加投:${info.addThrow.toFixed(2)}% 手续费:${info.commission.toFixed(2)}%`
-      }else{
+      } else {
         return '-'
       }
     }
@@ -730,14 +745,26 @@ const costitemDel = (id: string) => {
 interface rulesAttrListInfo {
   id: string,
   agreementId: string,
+  startTime: string,
+  endTime: string,
   rulesAttrList: any[],
 }
 const ruleConditionVisible = ref(false);//规则条件弹窗
 const rulesAttrListInfo = reactive<rulesAttrListInfo>({
   id: '',
   agreementId: "",
+  startTime: "",
+  endTime: "",
   rulesAttrList: []
 });//规则条件列表数据
+const rulesAttrListInfoRules = ref<FormRules>({
+  startTime: [
+    { required: true, trigger: "change", message: "请选择生效起始时间" }
+  ],
+  endTime: [
+    { required: true, trigger: "change", message: "请选择生效终止时间" }
+  ],
+});
 const ruleConditionSave = (list: string[]) => {//获取规则条件选中集合
   rulesAttrListInfo.rulesAttrList = list;
   ruleConditionVisible.value = false;

+ 39 - 74
src/views/quoteConfig/dispatch/components/rule.vue

@@ -23,7 +23,6 @@
                   <el-option v-for="item in getOperations(domain.attrCode)" :key="item.value" :label="item.label"
                     :value="item.value" />
                 </el-select>
-
                 <!-- 3. 值输入区域(动态切换) -->
                 <!-- 单选按钮组 -->
                 <el-radio-group v-model="domain.min" v-if="getConditionType(domain.attrCode) === 'radio'">
@@ -34,13 +33,26 @@
                 <!-- 多选下拉 -->
                 <el-select v-model="domain.minArray" placeholder="选择值" multiple style="width: 341px"
                   v-if="getConditionType(domain.attrCode) === 'checkbox'" :disabled="!domain.operator" clearable>
+                  <template #header>
+                    <el-checkbox v-model="domain.checkAll" :indeterminate="domain.indeterminate"
+                      @change="(val) => handleCheckAll(domain, val)">
+                      全选
+                    </el-checkbox>
+                  </template>
                   <el-option v-for="item in getOptions(domain.attrCode)" :key="item.id" :label="item.name"
                     :value="item.id" />
                 </el-select>
 
                 <!-- 单选下拉 -->
                 <el-select v-model="domain.minArray" placeholder="选择值" style="width: 341px" multiple
-                  v-if="getConditionType(domain.attrCode) === 'select'" :disabled="!domain.operator" clearable>
+                  @change="change(domain)" v-if="getConditionType(domain.attrCode) === 'select'"
+                  :disabled="!domain.operator" clearable>
+                  <template #header>
+                    <el-checkbox v-model="domain.checkAll" :indeterminate="domain.indeterminate"
+                      @change="(val) => handleCheckAll(domain, val)">
+                      全选
+                    </el-checkbox>
+                  </template>
                   <el-option v-for="item in getOptions(domain.attrCode)" :key="item.code" :label="item.name"
                     :value="item.code" />
                 </el-select>
@@ -213,6 +225,8 @@ interface ConditionRow {
   attrCode: string;
   max: any;
   errorMsg: string;
+  checkAll: boolean;
+  indeterminate: boolean;
   minArray?: string[];
 }
 
@@ -280,83 +294,30 @@ const dictionaries = ref([]);
 const dispatchId = ref(""); //调度id
 const editType = ref("");
 
-// 表单校验规则
-// 先定义独立校验函数(放在formRules之前)
-const validateConditionGroups = (
-  rule: any,
-  value: ConditionGroup[],
-  callback: any
-) => {
-  // 1. 校验:至少1组条件
-  if (value.length === 0) {
-    return callback(new Error("至少配置1组“或者”条件"));
-  }
-
-  // 2. 遍历每组校验
-  for (const group of value) {
-    // 2.1 校验:每组至少1行“并且”条件
-    if (group.actions.length === 0) {
-      return callback(new Error("每组条件至少包含1条“并且”规则"));
-    }
-
-    // 2.2 遍历每行校验完整性
-    for (const row of group.actions) {
-      row.errorMsg = ""; // 清空历史错误,避免残留
-      const attrType = getConditionType(row.attrCode);
-      const isRangeOp = row.operator === "1"; // 是否为“介于”等范围运算符
 
-      // 校验1:条件类型未选择
-      if (!row.attrCode) {
-        row.errorMsg = "请选择条件类型(如“报价金额”“车辆类型”)";
-        return callback(new Error(row.errorMsg));
-      }
+const handleCheckAll = (item, val: boolean) => {
 
-      // 校验2:运算符未选择
-      if (!row.operator) {
-        row.errorMsg = "请选择运算符(如“等于”“大于”)";
-        return callback(new Error(row.errorMsg));
-      }
+  item.indeterminate = false
+  if (val) {
+    item.minArray = getOptions(item.attrCode).map((_) => _.code)
+  } else {
+    item.minArray = []
+  }
+}
 
-      // 校验3:根据条件类型校验“值”
-      // 3.1 多选/标签类型(依赖minArray)
-      if (["checkbox", "inputTag"].includes(attrType)) {
-        if (!row.minArray || row.minArray.length === 0) {
-          row.errorMsg = `请选择至少一个条件值(当前为${attrType === "checkbox" ? "多选" : "标签"
-            }类型)`;
-          return callback(new Error(row.errorMsg));
-        }
-      }
-      // 3.2 范围类型(需同时填min和max)
-      else if (isRangeOp) {
-        if (row.min === null || row.min === "" || row.min === undefined) {
-          row.errorMsg = "请填写范围起始值(如“1000”)";
-          return callback(new Error(row.errorMsg));
-        }
-        if (row.max === null || row.max === "" || row.max === undefined) {
-          row.errorMsg = "请填写范围结束值(如“2000”)";
-          return callback(new Error(row.errorMsg));
-        }
-      }
-      // 3.3 普通类型(单选/输入框,依赖min或max)
-      else {
-        const targetVal = ["radio", "select", "plate", "datetime"].includes(
-          attrType
-        )
-          ? row.max
-          : row.min;
-        if (targetVal === null || targetVal === "" || targetVal === undefined) {
-          row.errorMsg = `请${attrType === "datetime" ? "选择" : "输入"
-            }条件值(当前为${attrType === "select" ? "下拉选择" : "文本输入"
-            }类型)`;
-          return callback(new Error(row.errorMsg));
-        }
-      }
+const change = (item: any) => {
+  if (item?.attrType == 'select') {
+    if (item.minArray.length === 0) {
+      item.checkAll = false
+      item.indeterminate = false
+    } else if (item.minArray.length === getOptions(item.attrCode).length) {
+      item.checkAll = true
+      item.indeterminate = false
+    } else {
+      item.indeterminate = true
     }
   }
-
-  // 所有校验通过
-  callback();
-};
+}
 
 const validateAgreementId = (rule: any, value: string, callback: any) => {
   if (!value) {
@@ -473,12 +434,16 @@ const handleConditionChange = (domain: ConditionRow, val: string) => {
   const target = dispatchList.value.find((item: any) => item.attrCode == val)
   domain.max = null;
   domain.operator = "";
+  domain.checkAll = false;
+  domain.indeterminate = false
   domain.attrType = target?.attrType || "input";
 };
 
 // 运算符切换时重置值
 const handleOperatorChange = (domain: ConditionRow) => {
   const attrType = getConditionType(domain.attrCode);
+  domain.checkAll = false;
+  domain.indeterminate = false
   // 重置对应类型的值
   if (["checkbox", "inputTag", "select"].includes(attrType)) {
     domain.minArray = [];

+ 38 - 17
src/views/receivable/handingFee/invoiceRecord.vue

@@ -58,10 +58,7 @@
     </el-form>
     <el-table :data="tableData" height="calc(100% - 192px)">
       <el-table-column prop="id" label="开票记录编号" width="200"></el-table-column>
-      <el-table-column prop="companyId" label="保险公司" width="150">
-        <template #default="scope">
-          {{ getCompanyName(scope.row) }}
-        </template>
+      <el-table-column prop="companyALlName" label="保险公司" width="150">
       </el-table-column>
       <el-table-column prop="invoiceParty" label="开票方" width="150"></el-table-column>
       <el-table-column prop="accountsReceivable" label="应收项" width="100"></el-table-column>
@@ -88,7 +85,7 @@
         layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
         @current-change="handleCurrentChange"></el-pagination>
     </div>
-    <el-dialog v-model="countShow" width="600" title="开票并结算">
+    <el-dialog v-model="countShow" width="600" title="结算">
       <el-form ref="CountForm" :model="countForm" :rules="countRules" label-width="120">
         <el-form-item prop="invoiceParty" label="开票方">
           <el-input v-model="countForm.invoiceParty" disabled placeholder="请输入"></el-input>
@@ -97,10 +94,10 @@
           <el-input v-model="countForm.receivableSupervisePremium" disabled placeholder="请输入"></el-input>
         </el-form-item>
         <el-form-item prop="overinflatedAmount" label="虚增金额">
-          <el-input v-model="countForm.overinflatedAmount" placeholder="请输入"></el-input>
+          <el-input v-model="countForm.overinflatedAmount" disabled placeholder="请输入"></el-input>
         </el-form-item>
         <el-form-item prop="taxPoint" label="税点">
-          <el-input v-model="countForm.taxPoint" placeholder="请输入"></el-input>
+          <el-input v-model="countForm.taxPoint" disabled placeholder="请输入"></el-input>
         </el-form-item>
         <el-form-item prop="receivableSupervisePremium" label="应收金额">
           <el-input v-model="countForm.receivableSupervisePremium" disabled placeholder="请输入"></el-input>
@@ -108,6 +105,12 @@
         <el-form-item prop="actualReceivedAmount" label="实收金额">
           <el-input v-model="countForm.actualReceivedAmount" placeholder="请输入"></el-input>
         </el-form-item>
+        <el-form-item label="回款差额">
+          <el-input v-model="countForm.paymentDifference" disabled placeholder="自动计算" />
+        </el-form-item>
+        <el-form-item prop="actualReceivedAmount" label="回款原因">
+          <el-input v-model="countForm.paymentReason" placeholder="请输入"></el-input>
+        </el-form-item>
         <el-form-item prop="receivePaymentDate" label="收款日期">
           <el-date-picker v-model="countForm.receivePaymentDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
             format="YYYY-MM-DD HH:mm:ss" />
@@ -151,20 +154,15 @@ import { ElMessage, ElMessageBox } from 'element-plus'
 let form = ref({})
 let tableData = ref([])
 
-const getCompanyName = (row) => {
-  let company = companyList.value.find(item => item.id === row.companyId)
-  return company?.nameSimple || ''
-}
-
 let pages = ref(1)
 let size = ref(10)
 let total = ref(0)
-const handleSizeChange = (val) => {
+const handleSizeChange = (val: number) => {
   size.value = val
   initList()
 }
-const handleCurrentChange = (pages) => {
-  pages.value = pages
+const handleCurrentChange = (page: number) => {
+  pages.value = page
   initList()
 }
 const search = () => {
@@ -196,6 +194,11 @@ let imageUrl = ref([])
 let attachmentIds = ref([])
 let invoicingId = ref('')
 const handleCount = (row) => {
+  if (row.settlementStatus === "已结算"){
+    ElMessage.warning('当前开票记录已结算完成,不能结算!')
+    return
+  }
+
   countShow.value = true
   invoicingId.value = row.id
   countForm.value = {
@@ -204,8 +207,22 @@ const handleCount = (row) => {
     overinflatedAmount: row.overinflatedAmount,
     actualReceivedAmount: row.remainSettlementAmount,
     taxPoint: row.taxPoint,
+    paymentDifference: row.paymentDifference, // 回款差额(自动计算)
+    paymentReason: row.paymentReason, // 回款原因
+    receivePaymentDate: row.receivePaymentDate, // 收款日期
+    attachmentIds: row.attachmentIds // 凭证
   }
 }
+// 监听实收金额变化 → 自动计算回款差额
+watch(
+  () => countForm.value.actualReceivedAmount,
+  (newVal) => {
+    const receivable = Number(countForm.value.receivableSupervisePremium) || 0
+    const actual = Number(newVal) || 0
+    // 回款差额 = 实收 - 应收
+    countForm.value.paymentDifference = (actual - receivable).toFixed(5)
+  }
+)
 const uploadImage = async (file, fileList) => {
   let files = file.raw
   const params = new FormData(); // 声明formData数据类型
@@ -297,7 +314,9 @@ const handelComfirm = (CountForm) => {
         invoicingId: invoicingId.value,
         actualReceivedAmount: countForm.value.actualReceivedAmount,
         receivePaymentDate: countForm.value.receivePaymentDate,
-        attachmentIds: countForm.value.attachmentIds
+        attachmentIds: countForm.value.attachmentIds,
+        paymentDifference: countForm.value.paymentDifference,
+        paymentReason: countForm.value.paymentReason
       }).then((res: any) => {
         countShow.value = false
         if (res.code == 200) {
@@ -325,7 +344,9 @@ const handelCancel = () => {
     taxPoint: '',
     actualReceivedAmount: '',
     receivePaymentDate: [],
-    attachmentIds: []
+    attachmentIds: [],
+    paymentDifference: '', // 回款差额(自动计算)
+    paymentReason: '' // 回款原因
   }
   imageUrl.value = []
 }