Explorar el Código

1.合同模板增加已选网点搜索功能和分页
2.网点合同签约增加批量失败和批量挂起功能

FengChaoYu hace 1 día
padre
commit
dfb1637a69

+ 16 - 0
src/api/networkContractSigning.js

@@ -86,3 +86,19 @@ export function websitContractSignConfirm(params) {
     params: params
   })
 }
+
+export function websitContractSignCancelBatch(params) {
+  return request({
+    url: '/websit/contract/sign/cancel/batch',
+    method: 'post',
+    params: params
+  })
+}
+
+export function websitContractSignPendBatch(params) {
+  return request({
+    url: '/websit/contract/sign/pend/batch',
+    method: 'post',
+    params: params
+  })
+}

+ 79 - 17
src/components/paging-transfer.vue

@@ -66,6 +66,15 @@
     <div class="transfer-panel">
       <p class="transfer-panel-header">
         <span>{{ titleTexts && titleTexts[1] }}</span>
+        <el-input 
+          v-model="rightQuickSearch" 
+          placeholder="快速查找"
+          size="mini"
+          clearable
+          style="width: 200px; margin: 0 10px;"
+        >
+          <el-button slot="append" icon="el-icon-search" @click="handleRightQuickSearch" size="mini"></el-button>
+        </el-input>        
         <span>{{ rightSelection.length }}/{{ rightTableData.length }}</span>
       </p>
       <div v-if="showQuery">
@@ -81,7 +90,7 @@
         size="small"
         :max-height="maxHeight"
         :height="minHeight"
-        :data="calcRightTableData"
+        :data="paginatedRightTableData"
         :row-key="tableRowKey"
         @row-click="handleRightRowClick"
         @selection-change="handleRightSelectionChange"
@@ -103,7 +112,18 @@
           </template>
         </el-table-column>
       </el-table>
-      <el-pagination v-if="showPagination" :total="rightTableData.length" layout="total"> </el-pagination>
+      <el-pagination
+        v-if="showPagination"
+        @size-change="handleRightSizeChange"
+        @current-change="handleRightCurrentChange"
+        :current-page="rightPageIndex"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="rightPageSize"
+        :pager-count="5"
+        :total="calcRightTableData.length"
+        layout="total, sizes, prev, pager, next"
+      >
+      </el-pagination>
     </div>
   </div>
 </template>
@@ -200,19 +220,22 @@ export default {
     }
   },
   data() {
-    return {
-      leftTableData: [],
-      rightTableData: this.value || [],
-      pageIndex: 1,
-      pageSize: 20,
-      totalSize: 0,
-      leftSelection: [],
-      rightSelection: [],
-      leftQueryCondition: {},
-      rightQueryCondition: {},
-      rightConditionTemp: undefined
-    }
-  },
+      return {
+        leftTableData: [],
+        rightTableData: this.value || [],
+        pageIndex: 1,
+        pageSize: 20,
+        totalSize: 0,
+        rightPageIndex: 1,
+        rightPageSize: 20,
+        leftSelection: [],
+        rightSelection: [],
+        leftQueryCondition: {},
+        rightQueryCondition: {},
+        rightConditionTemp: undefined,
+        rightQuickSearch: ''
+      }
+    },
   created() {
     this.handlePaginationCallBack()
     EventBus.$on(this.handlePaginationCallBackKey, this.handlePaginationCallBack)
@@ -233,9 +256,10 @@ export default {
       )
     },
     calcRightTableData() {
+      let filteredData = this.rightTableData
       if (this.showQuery && this.rightConditionTemp) {
         const conditionKeys = Object.keys(this.rightConditionTemp)
-        return this.rightTableData.filter(data => {
+        filteredData = this.rightTableData.filter(data => {
           return conditionKeys.some(key => {
             const rowCellData = data[key]
             const condVal = this.rightConditionTemp[key].trim()
@@ -246,7 +270,28 @@ export default {
           })
         })
       }
-      return this.rightTableData
+      return filteredData
+    },
+    // 右侧表格分页数据
+    paginatedRightTableData() {
+      const startIndex = (this.rightPageIndex - 1) * this.rightPageSize
+      const endIndex = startIndex + this.rightPageSize
+      let paginatedData = this.calcRightTableData.slice(startIndex, endIndex)
+      
+      // 应用快速搜索过滤
+      if (this.rightQuickSearch) {
+        const searchKeyword = this.rightQuickSearch.toLowerCase().trim()
+        paginatedData = paginatedData.filter(row => {
+          // 遍历所有列,查找匹配的内容
+          const columns = this.rightColumns || this.leftColumns
+          return columns.some(column => {
+            const cellValue = String(row[column.id] || '').toLowerCase()
+            return cellValue.includes(searchKeyword)
+          })
+        })
+      }
+      
+      return paginatedData
     }
   },
   methods: {
@@ -335,6 +380,22 @@ export default {
     },
     onRightQuerySubmit() {
       this.rightConditionTemp = JSON.parse(JSON.stringify(this.rightQueryCondition))
+      // 重置右侧分页
+      this.rightPageIndex = 1
+    },
+    // 右侧分页大小改变
+    handleRightSizeChange(val) {
+      this.rightPageSize = val
+      this.rightPageIndex = 1
+    },
+    // 右侧当前页码改变
+    handleRightCurrentChange(val) {
+      this.rightPageIndex = val
+    },
+    // 右侧快速搜索
+    handleRightQuickSearch() {
+      // 搜索逻辑已经在计算属性中实现,这里可以添加一些额外的处理
+      this.$emit('right-quick-search', this.rightQuickSearch)
     },
     checkObjectIsEqual(rowObj1, rowObj2) {
       return this.tableRowKey(rowObj1) === this.tableRowKey(rowObj2)
@@ -349,6 +410,7 @@ export default {
         this.rightQueryCondition[key] = undefined
       }
       this.pageIndex = 1
+      this.rightPageIndex = 1
       this.handlePaginationCallBack()
     }
   }

+ 130 - 14
src/views/setting/networkSigning/networkContractSigning/index.vue

@@ -87,6 +87,27 @@
         </el-form-item>
       </el-form>
     </el-dialog>
+
+    <el-dialog title="批量失效" :visible.sync="batchCancelVisible" :before-close="batchCancelClose" :close-on-click-modal="false">
+      <el-input type="textarea" :autosize="{ minRows: 10, maxRows: 20 }" v-model="cancelForm.websits" 
+        @input="formatWebsitsInput" placeholder="请输入要失效的网点编号"></el-input>  
+        <div style="margin-top: 20px; text-align: right">
+          <el-button @click="batchCancelClose">取消</el-button>
+          <el-button type="primary" @click="batchCancelSubmit">确定</el-button>
+        </div>
+    </el-dialog>
+
+    <el-dialog title="批量挂起" :visible.sync="batchPendVisible" :before-close="batchPendClose" :close-on-click-modal="false">
+      <el-select v-model="pendForm.contractTemplateId" placeholder="请选择合同模板">
+        <el-option v-for="item in contractTemplateMAIN" :key="item.contractTemplateId" :label="item.contractTemplateName" :value="item.contractTemplateId"></el-option>
+      </el-select>
+      <el-input type="textarea" :autosize="{ minRows: 10, maxRows: 20 }" v-model="pendForm.websits" 
+        @input="formatWebsitsInput" placeholder="请输入要挂起的网点编号" style="margin-top: 20px;"></el-input>  
+        <div style="margin-top: 20px; text-align: right">
+          <el-button @click="batchPendClose">取消</el-button>
+          <el-button type="primary" @click="batchPendSubmit">确定</el-button>
+        </div>
+    </el-dialog>    
   </template-page>
 </template>
 
@@ -104,9 +125,12 @@ import {
   fddCommonDownloadContract,
   websitContractSignConfirm,
   websitContractSignCount,
-  websitContractSignSingleSign
+  websitContractSignSingleSign,
+  websitContractSignCancelBatch,
+  websitContractSignPendBatch
 } from '@/api/networkContractSigning'
 import operation_mixin from '@/components/template/operation_mixin.js'
+import { contractTemplateList } from '@/api/fddContractTemplate.js'
 export default {
   components: { TemplatePage },
   mixins: [import_mixin, operation_mixin],
@@ -126,10 +150,20 @@ export default {
       formData: {},
       formRules: {},
       shenheBool: false,
+      batchCancelVisible: false,
+      batchPendVisible: false,
+      pendForm: {
+        contractTemplateId: '',
+        websits: ''
+      },
       form: {
         status: 'OK'
       },
-      statusList: []
+      cancelForm: {
+        websits: ''
+      },
+      statusList: [],
+      contractTemplateMAIN: []
     }
   },
   computed: {
@@ -156,7 +190,34 @@ export default {
       return this?.userData?.adminWebsitIds || []
     },
     optionsEvensGroup() {
-      return []
+      return [
+        [
+          [
+            this.optionsEvensAuth('batchCancel', {
+              click: () => {
+                this.batchCancelVisible = true
+              }
+            })
+          ],
+          [
+            this.optionsEvensAuth('batchPend', {
+              click: async () => {
+                await contractTemplateList({
+                  pageNum: 1,
+                  pageSize: -1,
+                  params: [
+                    { param: 'a.contract_type', compare: '=', value: 'MAIN' },
+                    { param: 'a.status', compare: '=', value: 'ON' }
+                  ]
+                }).then(res => {
+                  this.contractTemplateMAIN = res.data.records
+                })                
+                this.batchPendVisible = true
+              }
+            })
+          ]
+        ]
+      ]
     },
     items() {
       return [
@@ -360,7 +421,7 @@ export default {
                           <div style="padding-left:10px">
                             {
                               { WAIT_SIGN: '待签约', WAIT: '待审核', OK: '审核通过', REJECT: '驳回' }[
-                                row.contractStatus
+                              row.contractStatus
                               ]
                             }
                           </div>
@@ -419,7 +480,7 @@ export default {
                               </el-button>
                             ) : null}
                             {row.contractStatus == 'OK' &&
-                            (this.adminWebsitIds.includes(this.formData?.parentId) || this.userData.type == 1) ? (
+                              (this.adminWebsitIds.includes(this.formData?.parentId) || this.userData.type == 1) ? (
                               <el-button
                                 type="text"
                                 onClick={() => {
@@ -434,18 +495,17 @@ export default {
                               </el-button>
                             ) : null}
                             {row.contractStatus == 'WAIT_SIGN' &&
-                            !(
-                              this.formData.items.filter(v => v.contractStatus == 'WAIT_SIGN').length ===
-                              this.formData.items.length
-                            ) ? (
+                              !(
+                                this.formData.items.filter(v => v.contractStatus == 'WAIT_SIGN').length ===
+                                this.formData.items.length
+                              ) ? (
                               <el-button
                                 type="text"
                                 onClick={() => {
                                   websitContractSignSingleSign({
                                     id: this.formData.id,
-                                    returnUrl: `${window.location.href.split('#')?.[0]}#/networkSigning?id=${
-                                      this.formData.id
-                                    }&itemId=${row.id}`,
+                                    returnUrl: `${window.location.href.split('#')?.[0]}#/networkSigning?id=${this.formData.id
+                                      }&itemId=${row.id}`,
                                     itemId: row.id
                                   }).then(res => {
                                     if (res.data.jump) {
@@ -571,7 +631,7 @@ export default {
         loseEfficacy: {
           prompt: '是否确定设为失效?',
           conditions: ({ row, index, column }) => {
-            return row.status !== 'CANCEL'
+            return !['CANCEL', 'PEND', 'REJECT'].includes(row.status) 
           },
           click: ({ row, index, column }) => {
             websitContractSignCancel({
@@ -617,7 +677,63 @@ export default {
           window.open(res.data.url, '_blank')
         }
       })
-    }
+    },
+    batchCancelClose() {
+      this.batchCancelVisible = false
+      this.cancelForm.websits = ''
+    },
+    // 格式化网点编号输入
+    formatWebsitsInput() {
+      // 先处理已有的逗号和空格,将所有分隔符统一为换行符
+      let input = this.cancelForm.websits
+        .replace(/[\s,,]+/g, '\n') // 将逗号、空格、中文逗号替换为换行符
+        .replace(/\n+/g, '\n') // 合并连续的换行符
+        .trim() // 去除首尾空白
+
+      // 如果是空字符串,直接返回
+      if (!input) {
+        this.cancelForm.websits = ''
+        return
+      }
+
+      // 将换行符分隔的内容转换为英文逗号分隔
+      this.cancelForm.websits = input.split('\n').join(',')
+    },
+    // 批量失效提交
+    batchCancelSubmit() {
+      if (!this.cancelForm.websits) {
+        this.$message({ type: 'warning', message: '请输入要失效的网点编号!' })
+        return
+      }
+      websitContractSignCancelBatch({
+        websits: this.cancelForm.websits
+      }).then(res => {
+        this.$message({ type: 'success', message: '批量失效成功!' })
+        this.batchCancelClose()
+        this.$refs?.pageRef?.refreshList()
+      })
+    },
+    // 批量挂起关闭
+    batchPendClose() {
+      this.batchPendVisible = false
+      this.pendForm.websits = ''
+      this.pendForm.contractTemplateId = ''
+    },
+    // 批量挂起提交
+    batchPendSubmit() {
+      if (!this.pendForm.websits) {
+        this.$message({ type: 'warning', message: '请输入要挂起的网点编号!' })
+        return
+      }
+      websitContractSignPendBatch({
+        contractTemplateId: this.pendForm.contractTemplateId,
+        websits: this.pendForm.websits
+      }).then(res => {
+        this.$message({ type: 'success', message: '批量挂起成功!' })
+        this.batchPendClose()
+        this.$refs?.pageRef?.refreshList()
+      })
+    }    
   }
 }
 </script>