Ver Fonte

财务2.4 解决冲突

hbchen há 2 anos atrás
pai
commit
45987c593a

+ 11 - 7
src/api/crm.js

@@ -19,15 +19,13 @@ export function getPermissionList(data) {
 // 获取销售列表
 // 获取销售列表
  /**
  /**
   * @param {
   * @param {
-  * seller_type - 销售类型: 1-FICC(默认); 2-权益 - 非必填
   * } data 
   * } data 
   * @returns 
   * @returns 
   */
   */
-export function getSellerList(data) {
+export function getSellerList() {
   return request({
   return request({
       url:'/crm/company_seller/list',
       url:'/crm/company_seller/list',
-      method:'get',
-      params:data
+      method:'get'
   })
   })
 }
 }
 // 根据合同编号搜索合同列表
 // 根据合同编号搜索合同列表
@@ -64,11 +62,17 @@ export function getServiceDetail(data) {
      params:data
      params:data
  })
  })
 }
 }
-
- // 获取销售组别列表
+ /**
+  * 获取销售组别列表
+  * @param {
+ * seller_type - 1 ficc销售、2 权益销售 - 必填
+ * } data 
+ * @returns 
+ */
  export function getSellerGroupList(data) {
  export function getSellerGroupList(data) {
   return request({
   return request({
       url:'/crm/company_seller/group_list',
       url:'/crm/company_seller/group_list',
-      method:'get'
+      method:'get',
+      params:data
   })
   })
  }
  }

+ 29 - 0
src/api/financialMana.js

@@ -1,6 +1,18 @@
 import request from "../utils/request"
 import request from "../utils/request"
 
 
 // -----------------------------财务列表
 // -----------------------------财务列表
+ /**
+  * 获取简易的套餐列表(用于搜索下拉框)
+ * @returns 
+ */
+export function getSimpleServiceList() {
+ return request({
+     url:'/contract/service/simple',
+     method:'get'
+ })
+}
+
+
  // 获取套餐列表
  // 获取套餐列表
  /**
  /**
   * 
   * 
@@ -47,6 +59,23 @@ export function registerListExport(data) {
       responseType:'blob'
       responseType:'blob'
   })
   })
 }
 }
+
+ /**
+  * 合同名称或者合同有效期查询校验
+  * @param {
+ * company_name - 客户名称 - 必填
+ * start_date - 开始日期:格式2022-11-22 - 必填
+ * end_date - 开始日期:格式2022-11-22 - 必填
+ * } data 
+ * @returns 
+ */
+export function contractRegisterCheck(data) {
+ return request({
+     url:'/contract/register/check_contract_code',
+     method:'get',
+     params:data
+ })
+}
 // 合规登记 - 新增
 // 合规登记 - 新增
  /**
  /**
   * 
   * 

+ 181 - 0
src/views/financialManagement/components/permissionQyDia.vue

@@ -0,0 +1,181 @@
+
+<script setup>
+  
+  const props=defineProps({
+    visible:{
+      type:Boolean,
+      default:false
+    },
+    hasCheckedPermission:{
+      type:Array,
+      default:()=>[]
+    },
+    permissionData:{
+      type:Array,
+      default:()=>[]
+    },
+    // view - 查看 edit - 编辑
+    type:{
+      type:String,
+      default:'view'
+    },
+    // 1-权益大套餐 2-行业套餐
+    serviceType:{
+      type:Number,
+      default:1
+    }
+  })
+
+  const emits=defineEmits(['update:visible','selectFinish'])
+
+  const permissionDia=reactive({
+    permissionChecked:[],
+    qyBigService:''
+  })
+
+  watch(()=>props.visible,(newVal)=>{
+    // console.log(newVal);
+    if(newVal){
+      // 初始化
+      if(props.serviceType==1){
+        permissionDia.qyBigService=props.hasCheckedPermission[0]
+      }else{
+        props.permissionData.length>0&&props.permissionData.map(item=>{
+          item.check_list = [];
+          item.checked = false;
+          item.indeterminate = false;
+          item.children?.map(it => {
+            it.checked=false
+          })
+        })
+        // permissionDia.permissionChecked=[...props.hasCheckedPermission]
+        U:for (let i = 0,len=props.hasCheckedPermission.length; i < len; i++) {
+          const permission_id = +props.hasCheckedPermission[i];
+          for (let j = 0,jLen=props.permissionData.length; j < jLen; j++) {
+            const element = props.permissionData[j];
+            let index=element.children.findIndex(it => it.service_template_id==permission_id)
+            // console.log(index);
+            if(index!=-1){
+              element.children[index].checked=true
+              element.check_list.push(permission_id)
+              continue U
+            }
+          }
+        }
+        props.permissionData.map(item=>{
+          permissionCheckedChange(item)
+        })
+      }
+    }
+  },{immediately:true})
+
+  // -------method
+  const permissionCheckedChange=(e)=>{
+    e.checked = e.check_list.length == e.children.length
+    e.indeterminate = e.check_list.length>0 && e.check_list.length < e.children.length
+  }
+  const permissionAllChecked=(e)=>{
+    let arr = e.children.map((item) => {
+      return item.service_template_id;
+    });
+    e.check_list = e.checked ? arr : [];
+    e.indeterminate = false;
+  }
+ 
+  const submit=()=>{
+    permissionDia.permissionChecked=[]
+    if(props.serviceType==1 && !permissionDia.qyBigService){
+      ElMessage.warning('请选择权益大套餐品种')
+      return 
+    }
+    if(props.serviceType==2){
+      props.permissionData.map(item =>{
+        permissionDia.permissionChecked=[...permissionDia.permissionChecked,...item.check_list]
+      })
+    }
+    emits('selectFinish',props.serviceType==1?[permissionDia.qyBigService]: permissionDia.permissionChecked)
+    closeDia()
+  }
+
+  const closeDia=()=>{
+    emits('update:visible',false)
+  }
+
+  // --------------created
+</script>
+
+<template>
+  <div id="permission-qy-container">
+    <el-dialog title="选择品种" :model-value="props.visible"
+    :close-on-click-modal="false" width="360" @close="closeDia">
+      <div class="variety-big-box" v-show='props.serviceType==1'>
+        <el-radio model-value="权益大套餐" label="权益大套餐" :disabled="props.type=='view'">
+          <span class="first-level">权益大套餐:</span>
+        </el-radio>
+        <el-radio-group v-model="permissionDia.qyBigService" :disabled="props.type=='view'">
+          <el-radio :label="item.service_template_id" v-for="item in props.permissionData" 
+          :key="item.service_template_id" >{{ item.title }}</el-radio>
+        </el-radio-group>
+      </div>
+      <div class="variety-small-box" v-show='props.serviceType==2'>
+        <div v-for="item in props.permissionData" class="variety-item" :key="item.service_template_id" >
+          <el-checkbox v-model="item.checked" :indeterminate="item.check_list?.length>0 && item.check_list?.length < item.children?.length" 
+            @change="permissionAllChecked(item)" :disabled="props.type=='view'">
+            <span class="first-level">{{item.title}}:</span>
+          </el-checkbox>
+          <el-checkbox-group v-model="item.check_list" @change="permissionCheckedChange(item)" :disabled="props.type=='view'">
+            <el-checkbox :label="it.service_template_id" v-for="it in item.children" :key="it.service_template_id">{{it.title}}</el-checkbox>
+          </el-checkbox-group>
+        </div>
+      </div>
+      <template #footer v-if="props.type!='view'">
+        <div class="permission-buttons-zone">
+          <el-button @click="closeDia" style="background-color: #F5F7FA;border:none;color:var(--mainTextColor) ;">取消</el-button>
+          <el-button type="primary" @click="submit" style="color: white;margin-left: 30px;">保存</el-button>
+        </div>
+      </template> 
+    </el-dialog>
+  </div>
+</template>
+  
+  
+<style lang="scss" scoped>
+    .variety-big-box{
+      margin-right: -20px;
+      display: flex;
+      justify-content: center;
+    }
+    .variety-small-box{
+      // display: flex;
+      // justify-content: center;
+      // flex-wrap: wrap;
+      padding-left: 56px;
+      .variety-item{
+        display:flex;
+        justify-content: start;
+        margin: 0 auto;
+      }
+    }
+    .first-level{
+      font-weight: bold;
+    }
+    .permission-buttons-zone{
+      padding-bottom: 20px;
+    }
+</style>
+<style lang="scss">
+  #permission-qy-container{
+    .el-checkbox{
+      margin-right: 22px;
+    }
+    // .el-checkbox-group{
+    //   margin-right:-22px ;
+      // .el-checkbox{
+      //   margin-right: 22px;
+      // }
+    // }
+    .el-radio{
+      margin-right: 20px;
+    }
+  }
+</style>

+ 7 - 2
src/views/financialManagement/composition/IandPList.js

@@ -8,6 +8,8 @@ export default function getIandPListCom(type) {
 
 
   const dateButtonData=[{text:'本月',tabId:1},{text:'上月',tabId:2},{text:'前月',tabId:3}]
   const dateButtonData=[{text:'本月',tabId:1},{text:'上月',tabId:2},{text:'前月',tabId:3}]
 
 
+  const serviceTypeArray=[{label:'FICC套餐',value:1},{label:'权益套餐',value:2}]
+
   const placement=reactive({
   const placement=reactive({
     searchParams:{
     searchParams:{
       current:1,
       current:1,
@@ -18,6 +20,8 @@ export default function getIandPListCom(type) {
       min_amount:'',
       min_amount:'',
       max_amount:'',
       max_amount:'',
       invoice_type:type,
       invoice_type:type,
+      seller_ids:'',
+      service_product_id:'',
       is_export:0
       is_export:0
     },
     },
     dateRange:[],
     dateRange:[],
@@ -51,7 +55,7 @@ export default function getIandPListCom(type) {
   }
   }
   
   
   const searchPlacement=()=>{
   const searchPlacement=()=>{
-    console.log('search');
+    // console.log('search');
     placement.searchParams.current = 1
     placement.searchParams.current = 1
     placementList()
     placementList()
   }
   }
@@ -147,6 +151,7 @@ export default function getIandPListCom(type) {
     changePageNo,
     changePageNo,
     changePageSize,
     changePageSize,
     checkMoney,
     checkMoney,
-    changeDateType
+    changeDateType,
+    serviceTypeArray
   }
   }
 }
 }

Diff do ficheiro suprimidas por serem muito extensas
+ 566 - 105
src/views/financialManagement/contractProgress.vue


+ 27 - 11
src/views/financialManagement/financialList.vue

@@ -1,7 +1,7 @@
 <script setup>
 <script setup>
 import { Search } from '@element-plus/icons-vue'
 import { Search } from '@element-plus/icons-vue'
 import {useRouter,useRoute} from 'vue-router'
 import {useRouter,useRoute} from 'vue-router'
-import {getServiceList,getRegisterList,updateRegisterStatus,
+import {getSimpleServiceList,getRegisterList,updateRegisterStatus,
   registerDelete,registerListExport,importDataApi} from '@/api/financialMana'
   registerDelete,registerListExport,importDataApi} from '@/api/financialMana'
 import {downloadByFlow} from '@/utils/common-methods'
 import {downloadByFlow} from '@/utils/common-methods'
 
 
@@ -17,7 +17,7 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
       keyword:'',
       keyword:'',
       start_date:'',
       start_date:'',
       end_date:'',
       end_date:'',
-      service_type:'',
+      service_types:'',
       register_status:'',
       register_status:'',
       contract_type:'',
       contract_type:'',
       page_size:10,
       page_size:10,
@@ -67,7 +67,8 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
 //  --------------------------method
 //  --------------------------method
   //获取套餐列表
   //获取套餐列表
   const getServiceListFun=()=>{
   const getServiceListFun=()=>{
-    getServiceList().then(res=>{
+    getSimpleServiceList().then(res=>{
+      // console.log(res);
       financial.serviceTypeArray=res.data || []
       financial.serviceTypeArray=res.data || []
     })
     })
   }
   }
@@ -88,6 +89,12 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
     financial.searchParams.current = pageNo
     financial.searchParams.current = pageNo
     financialList()
     financialList()
   }
   }
+
+  const serviceTypeChange=(value)=>{
+    financial.searchParams.service_types=value.join(',')
+    searchFinancial()
+  }
+
   const searchFinancial=()=>{
   const searchFinancial=()=>{
     financial.searchParams.current = 1
     financial.searchParams.current = 1
     financialList()
     financialList()
@@ -207,21 +214,26 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
           <!-- 搜索区域 -->
           <!-- 搜索区域 -->
           <div class="financial-search-zone">
           <div class="financial-search-zone">
             <el-input v-model="financial.searchParams.keyword" placeholder="合同编号/客户姓名/销售/实际使用方" :prefix-icon="Search"
             <el-input v-model="financial.searchParams.keyword" placeholder="合同编号/客户姓名/销售/实际使用方" :prefix-icon="Search"
-            style="width: 286px;margin-bottom: 8px;" @input="searchFinancial" clearable />
+            style="width: 340px;margin-bottom: 8px;" @input="searchFinancial" clearable />
             <el-date-picker v-model="financial.createtime" start-placeholder="登记日期-开始"
             <el-date-picker v-model="financial.createtime" start-placeholder="登记日期-开始"
-            end-placeholder="登记日期-结束" style="margin-right: 30px;max-width: 286px;margin-bottom: 8px;"
+            end-placeholder="登记日期-结束" style="margin-right: 30px;max-width: 240px;margin-bottom: 8px;"
             value-format="YYYY-MM-DD" type="daterange"></el-date-picker>
             value-format="YYYY-MM-DD" type="daterange"></el-date-picker>
-            <el-select v-model="financial.searchParams.service_type" placeholder="请选择套餐类型" clearable
+            <!-- <el-select v-model="financial.searchParams.service_type" placeholder="请选择套餐类型" clearable
             @change="searchFinancial" style="width: 286px;margin-bottom: 8px;">
             @change="searchFinancial" style="width: 286px;margin-bottom: 8px;">
               <el-option v-for="item in financial.serviceTypeArray" :key="item.service_template_id"
               <el-option v-for="item in financial.serviceTypeArray" :key="item.service_template_id"
               :label="item.title" :value="item.service_template_id"></el-option>
               :label="item.title" :value="item.service_template_id"></el-option>
-            </el-select>
+            </el-select> -->
+            <el-cascader :options="financial.serviceTypeArray" style="width: 240px;margin-bottom: 8px;margin-right: 30px;"
+              @change="serviceTypeChange"
+             placeholder="请选择套餐" clearable collapse-tags :show-all-levels="false"
+            :props="{multiple:true,label:'title',value:'service_template_id',children:'children',emitPath:false}">
+            </el-cascader>
             <el-select v-model="financial.searchParams.contract_type" placeholder="请选择合同类型" clearable
             <el-select v-model="financial.searchParams.contract_type" placeholder="请选择合同类型" clearable
-            @change="searchFinancial" style="width: 286px;margin-bottom: 8px;">
+            @change="searchFinancial" style="width: 240px;margin-bottom: 8px;">
               <el-option :label="item.label" :value="item.id" v-for="item in contractTypeArray" :key="item.id"></el-option>
               <el-option :label="item.label" :value="item.id" v-for="item in contractTypeArray" :key="item.id"></el-option>
             </el-select>
             </el-select>
             <el-select v-model="financial.searchParams.register_status" placeholder="请选择登记状态" clearable
             <el-select v-model="financial.searchParams.register_status" placeholder="请选择登记状态" clearable
-            @change="searchFinancial" style="width: 286px;margin-bottom: 8px;">
+            @change="searchFinancial" style="width: 240px;margin-bottom: 8px;">
               <el-option :label="item.label" :value="item.id" v-for="item in statusArray" :key="item.id"></el-option>
               <el-option :label="item.label" :value="item.id" v-for="item in statusArray" :key="item.id"></el-option>
             </el-select>
             </el-select>
           </div>
           </div>
@@ -234,7 +246,7 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
                 @click="router.push('/financial/placementPre')" class="element-common-button">到款预登记</el-button> -->
                 @click="router.push('/financial/placementPre')" class="element-common-button">到款预登记</el-button> -->
               </div>
               </div>
               <div class="financial-top-option-zone-right">
               <div class="financial-top-option-zone-right">
-                <a href="https://hzstatic.hzinsights.com/static/fms/excel/财务列表-导入模板.xlsx" download>
+                <a href="https://hzchart.oss-cn-shanghai.aliyuncs.com/static/fms/excel/财务列表-导入模版(新).xlsx" download>
                   <el-button class="element-common-button" size="large"
                   <el-button class="element-common-button" size="large"
                   v-permission="'financial:list:complianceImport'">下载导入模版</el-button>
                   v-permission="'financial:list:complianceImport'">下载导入模版</el-button>
                 </a>
                 </a>
@@ -258,7 +270,11 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
               prop="contract_code" fixed="left" min-width="150"></el-table-column>
               prop="contract_code" fixed="left" min-width="150"></el-table-column>
               <el-table-column label="客户名称" align="center" prop="company_name"
               <el-table-column label="客户名称" align="center" prop="company_name"
               show-overflow-tooltip min-width="120"></el-table-column>
               show-overflow-tooltip min-width="120"></el-table-column>
-              <el-table-column label="销售" align="center" prop="seller_name" width="120"></el-table-column>
+              <el-table-column label="销售" align="center" prop="seller_name" width="120">
+                <template #default="{row}">
+                  {{ row.seller_name+(row.seller_name&&row.rai_seller_name?`、`:'')+row.rai_seller_name }}
+                </template>
+              </el-table-column>
               <el-table-column label="合同类型" align="center" width="90" prop="contract_type"
               <el-table-column label="合同类型" align="center" width="90" prop="contract_type"
               v-if="financial.tabelColumnShowArr.includes('contract_type')">
               v-if="financial.tabelColumnShowArr.includes('contract_type')">
                 <template #default="{row}">
                 <template #default="{row}">

+ 35 - 5
src/views/financialManagement/invoice/invoiceList.vue

@@ -1,30 +1,55 @@
 <script setup>
 <script setup>
-
+import {getSellerList} from '@/api/crm'
 import getCom from '../composition/IandPList'
 import getCom from '../composition/IandPList'
 import '../style/iandPList.scss'
 import '../style/iandPList.scss'
 
 
 const invoice=getCom(1)
 const invoice=getCom(1)
 const data = invoice.data
 const data = invoice.data
 
 
+const sellerArray=ref([])
+
+const sellerChange=(value)=>{
+  data.searchParams.seller_ids = value.join(',')
+  invoice.searchPlacement()
+}
+
+const getSellerListFun=()=>{
+  getSellerList().then(res=>{
+    sellerArray.value = res.data?.all_list || []
+    // console.log(res);
+  })
+}
 // --------created
 // --------created
+getSellerListFun()
 invoice.placementList()
 invoice.placementList()
 
 
+
+
 </script>
 </script>
 
 
 <template>
 <template>
     <div id="iandP-list-container">
     <div id="iandP-list-container">
       <div class="iandP-search-zone">
       <div class="iandP-search-zone">
         <div class="iandP-search-box">
         <div class="iandP-search-box">
-          <el-input v-model="data.searchParams.contract_code" placeholder="请输入合同编号/销售"
-          style="width: 309px;margin-left: 40px;margin-bottom: 8px;" clearable @input="invoice.searchPlacement" ></el-input>
+          <el-input v-model="data.searchParams.contract_code" placeholder="请输入合同编号"
+          class="iandP-search-item" clearable @input="invoice.searchPlacement" ></el-input>
+          <el-cascader :options="sellerArray" class="iandP-search-item" filterable 
+             @change="sellerChange" placeholder="请选择销售" clearable collapse-tags :show-all-levels="false"
+            :props="{multiple:true,label:'seller_name',value:'seller_id',children:'child',emitPath:false}">
+          </el-cascader>
+          <el-select v-model="data.searchParams.service_product_id" placeholder="请选择套餐类型" clearable
+          @change="invoice.searchPlacement" class="iandP-search-item">
+            <el-option v-for="item in invoice.serviceTypeArray" :key="item.value"
+            :label="item.label" :value="item.value"></el-option>
+          </el-select>
           <div class="date-box">
           <div class="date-box">
             <el-date-picker v-model="data.dateRange" start-placeholder="起始日期"
             <el-date-picker v-model="data.dateRange" start-placeholder="起始日期"
-            end-placeholder="结束日期" style="max-width: 321px;margin-right: 12px;"
+            end-placeholder="结束日期" style="max-width: 240px;margin-right: 20px;"
             value-format="YYYY-MM-DD" type="daterange" @change="data.currentDateTab=0"></el-date-picker>
             value-format="YYYY-MM-DD" type="daterange" @change="data.currentDateTab=0"></el-date-picker>
             <el-button v-for="item in invoice.dateButtonData" class="date-button"
             <el-button v-for="item in invoice.dateButtonData" class="date-button"
             :key="item.tabId" :class="data.currentDateTab==item.tabId?'selectTab':''" @click="invoice.changeDateType(item.tabId)">{{ item.text }}</el-button>
             :key="item.tabId" :class="data.currentDateTab==item.tabId?'selectTab':''" @click="invoice.changeDateType(item.tabId)">{{ item.text }}</el-button>
           </div>
           </div>
-          <div style="margin-left: 40px;margin-bottom: 8px;">
+          <div style="margin-left: 30px;margin-bottom: 8px;">
             开票金额
             开票金额
             <el-input v-model.trim="data.searchParams.min_amount" @blur="invoice.checkMoney"
             <el-input v-model.trim="data.searchParams.min_amount" @blur="invoice.checkMoney"
             @input="(value)=>invoice.moneyChange(value,'min_amount')" style="width: 104px;margin:0 8px" clearable></el-input>
             @input="(value)=>invoice.moneyChange(value,'min_amount')" style="width: 104px;margin:0 8px" clearable></el-input>
@@ -58,6 +83,11 @@ invoice.placementList()
         <!-- 表格 -->
         <!-- 表格 -->
         <el-table :data="data.tableData" border max-height="560px" size="default" style="position: sticky;"> 
         <el-table :data="data.tableData" border max-height="560px" size="default" style="position: sticky;"> 
           <el-table-column label="合同编号" align="center" prop="contract_code" show-overflow-tooltip></el-table-column>
           <el-table-column label="合同编号" align="center" prop="contract_code" show-overflow-tooltip></el-table-column>
+          <el-table-column label="套餐类型" align="center" prop="service_product_id">
+            <template #default="{row}">
+              {{ invoice.serviceTypeArray[row.service_product_id-1]?.label }}
+            </template>
+          </el-table-column>
           <el-table-column label="开票金额" align="center" prop="origin_amount" show-overflow-tooltip></el-table-column>
           <el-table-column label="开票金额" align="center" prop="origin_amount" show-overflow-tooltip></el-table-column>
           <el-table-column label="金额单位" align="center" prop="unit_name"></el-table-column>
           <el-table-column label="金额单位" align="center" prop="unit_name"></el-table-column>
           <el-table-column label="换算金额(元)" align="center" prop="amount" show-overflow-tooltip></el-table-column>
           <el-table-column label="换算金额(元)" align="center" prop="amount" show-overflow-tooltip></el-table-column>

+ 14 - 4
src/views/financialManagement/placement/placementList.vue

@@ -17,16 +17,21 @@ placement.placementList()
     <div id="iandP-list-container">
     <div id="iandP-list-container">
       <div class="iandP-search-zone">
       <div class="iandP-search-zone">
         <div class="iandP-search-box">
         <div class="iandP-search-box">
-          <el-input v-model="data.searchParams.contract_code" placeholder="请输入合同编号"
-          style="width: 309px;margin-left: 40px;margin-bottom: 8px;" clearable @input="placement.searchPlacement" ></el-input>
+          <el-input v-model="data.searchParams.contract_code" placeholder="请输入合同编号" class="iandP-search-item"
+          clearable @input="placement.searchPlacement" ></el-input>
+          <el-select v-model="data.searchParams.service_product_id" placeholder="请选择套餐类型" clearable
+          @change="placement.searchPlacement" class="iandP-search-item">
+            <el-option v-for="item in placement.serviceTypeArray" :key="item.value"
+            :label="item.label" :value="item.value"></el-option>
+          </el-select>
           <div class="date-box">
           <div class="date-box">
             <el-date-picker v-model="data.dateRange" start-placeholder="起始日期"
             <el-date-picker v-model="data.dateRange" start-placeholder="起始日期"
-            end-placeholder="结束日期" style="max-width: 321px;margin-right: 12px;"
+            end-placeholder="结束日期" style="max-width: 240px;margin-right: 20px;"
             value-format="YYYY-MM-DD" type="daterange" @change="data.currentDateTab=0"></el-date-picker>
             value-format="YYYY-MM-DD" type="daterange" @change="data.currentDateTab=0"></el-date-picker>
             <el-button v-for="item in placement.dateButtonData" class="date-button"
             <el-button v-for="item in placement.dateButtonData" class="date-button"
             :key="item.tabId" :class="data.currentDateTab==item.tabId?'selectTab':''" @click="placement.changeDateType(item.tabId)">{{ item.text }}</el-button>
             :key="item.tabId" :class="data.currentDateTab==item.tabId?'selectTab':''" @click="placement.changeDateType(item.tabId)">{{ item.text }}</el-button>
           </div>
           </div>
-          <div style="margin-left: 40px;margin-bottom: 8px;">
+          <div style="margin-left: 30px;margin-bottom: 8px;">
             到款金额
             到款金额
             <el-input v-model.trim="data.searchParams.min_amount" @blur="placement.checkMoney"
             <el-input v-model.trim="data.searchParams.min_amount" @blur="placement.checkMoney"
             @input="(value)=>placement.moneyChange(value,'min_amount')" style="width: 104px;margin:0 8px" clearable></el-input>
             @input="(value)=>placement.moneyChange(value,'min_amount')" style="width: 104px;margin:0 8px" clearable></el-input>
@@ -61,6 +66,11 @@ placement.placementList()
         <!-- 表格 -->
         <!-- 表格 -->
         <el-table :data="data.tableData" border max-height="560px" size="default" style="position: sticky;"> 
         <el-table :data="data.tableData" border max-height="560px" size="default" style="position: sticky;"> 
           <el-table-column label="合同编号" align="center" prop="contract_code" show-overflow-tooltip></el-table-column>
           <el-table-column label="合同编号" align="center" prop="contract_code" show-overflow-tooltip></el-table-column>
+          <el-table-column label="套餐类型" align="center" prop="service_product_id">
+            <template #default="{row}">
+              {{ placement.serviceTypeArray[row.service_product_id-1]?.label }}
+            </template>
+          </el-table-column>
           <el-table-column label="到款金额" align="center" prop="origin_amount" show-overflow-tooltip></el-table-column>
           <el-table-column label="到款金额" align="center" prop="origin_amount" show-overflow-tooltip></el-table-column>
           <el-table-column label="金额单位" align="center" prop="unit_name"></el-table-column>
           <el-table-column label="金额单位" align="center" prop="unit_name"></el-table-column>
           <el-table-column label="换算金额(元)" align="center" prop="amount" show-overflow-tooltip></el-table-column>
           <el-table-column label="换算金额(元)" align="center" prop="amount" show-overflow-tooltip></el-table-column>

+ 8 - 2
src/views/financialManagement/style/iandPList.scss

@@ -3,15 +3,21 @@
   .iandP-search-zone{
   .iandP-search-zone{
     margin-bottom: 20px;
     margin-bottom: 20px;
     .iandP-search-box{
     .iandP-search-box{
-      margin-left: -40px;
+      margin-left: -30px;
       display: flex;
       display: flex;
       flex-wrap: wrap;
       flex-wrap: wrap;
+      .iandP-search-item{
+        width: 240px;
+        margin-left: 30px;
+        margin-bottom: 8px;
+      }
       .date-box{
       .date-box{
         display: flex;
         display: flex;
         align-items: center;
         align-items: center;
-        margin: 0 0 8px 40px;
+        margin: 0 0 8px 30px;
         .date-button{
         .date-button{
           height: 40px;
           height: 40px;
+          width: 52px;
           color: $themeColor;
           color: $themeColor;
           border: 1px solid $themeColor;
           border: 1px solid $themeColor;
         }
         }

+ 76 - 50
src/views/financialStatistics/commodityPayment.vue

@@ -2,25 +2,25 @@
 import { Search } from '@element-plus/icons-vue'
 import { Search } from '@element-plus/icons-vue'
 // import dropdownText from '@/components/dropdown-text/index.vue'  
 // import dropdownText from '@/components/dropdown-text/index.vue'  
 import {getInvoicePaymentList,updatePayType,setServiceAmount} from '@/api/financialStatistics'
 import {getInvoicePaymentList,updatePayType,setServiceAmount} from '@/api/financialStatistics'
-import {getSellerGroupList} from '@/api/crm'
-import {getServiceList} from '@/api/financialMana'
+import {getSellerGroupList,getSellerList} from '@/api/crm'
+import {getSimpleServiceList} from '@/api/financialMana'
 import {downloadByFlow} from '@/utils/common-methods'
 import {downloadByFlow} from '@/utils/common-methods'
 
 
 const moment = inject('$moment')
 const moment = inject('$moment')
   const timeTypeData=[{label:'开票日期',value:1},{label:'到款日期',value:2},{label:'开票日期&到款日期',value:3}]
   const timeTypeData=[{label:'开票日期',value:1},{label:'到款日期',value:2},{label:'开票日期&到款日期',value:3}]
   const dateButtonData=[{text:'近1月',tabId:1},{text:'近2月',tabId:2},{text:'近3月',tabId:3}]
   const dateButtonData=[{text:'近1月',tabId:1},{text:'近2月',tabId:2},{text:'近3月',tabId:3}]
 
 
-  const groupList=ref([])
-  const serviceList=ref([])
+  // const groupList=ref([])
 
 
+  // sell_group_id:'',
   const searchParams=reactive({
   const searchParams=reactive({
     current:1,
     current:1,
     page_size:10,
     page_size:10,
     keyword:'',
     keyword:'',
-    sell_group_id:'',
-    service_type:'',
-    start_date:'',
-    end_date:'',
+    seller_ids:'',
+    service_types:'',
+    start_date:moment().startOf('year').format('YYYY-MM-DD') || '',
+    end_date:moment(new Date()).format('YYYY-MM-DD') || '',
     // 1-开票日期&到款日期 2-开票日期 3-到款日期
     // 1-开票日期&到款日期 2-开票日期 3-到款日期
     time_type:"",
     time_type:"",
     // 1-已开票
     // 1-已开票
@@ -31,7 +31,7 @@ const moment = inject('$moment')
     sort_param:'',
     sort_param:'',
     is_export:0
     is_export:0
   })
   })
-  const searchDate=ref(null)
+  const searchDate=ref([moment().startOf('year').format('YYYY-MM-DD'),moment(new Date()).format('YYYY-MM-DD')])
   const currentDateTab=ref(0)
   const currentDateTab=ref(0)
 
 
 
 
@@ -63,19 +63,11 @@ const moment = inject('$moment')
   // method
   // method
 
 
   //获取销售组别
   //获取销售组别
-  const getSellerGroupListFun=()=>{
-    getSellerGroupList().then(res=>{
-      groupList.value=res.data || []
-    })
-  }
-  // 获取套餐列表
-  const getServiceListFun=()=>{
-    getServiceList().then(res=>{
-      serviceList.value=res.data || []
-    })
-  }
-
-
+  // const getSellerGroupListFun=()=>{
+  //   getSellerGroupList().then(res=>{
+  //     groupList.value=res.data || []
+  //   })
+  // }
   const commodityPList=()=>{
   const commodityPList=()=>{
     // console.log(searchParams);
     // console.log(searchParams);
     getInvoicePaymentList(searchParams).then(res=>{
     getInvoicePaymentList(searchParams).then(res=>{
@@ -155,9 +147,37 @@ const moment = inject('$moment')
     }else{
     }else{
       invoiceIsFold.value = !invoiceIsFold.value
       invoiceIsFold.value = !invoiceIsFold.value
     }
     }
-    console.log(type,invoiceIsFold.value);
+    // console.log(type,invoiceIsFold.value);
+  }
+  // --------------------------销售选择
+
+  const sellerArray=ref([])
+  // 销售类型
+  const sellerTypeArray=ref(['','FICC销售','权益销售'])
+  const sellerChange=(value)=>{
+    searchParams.seller_ids = value.join(',')
+    searchCommodityP()
+  }
+  // 获取销售列表
+  const getSellerListFun=()=>{
+    getSellerList().then(res=>{
+      sellerArray.value = res.data?.all_list || []
+      // console.log(res);
+    })
   }
   }
 
 
+  // -------------------套餐选择
+  const serviceList=ref([])
+  // 获取简易套餐列表
+  const getServiceListFun=()=>{
+    getSimpleServiceList().then(res=>{
+      serviceList.value=res.data || []
+    })
+  }
+  const serviceChange=(value)=>{
+    searchParams.service_types = value.join(',')
+    searchCommodityP()
+  }
   //  -----------------------------------------------------弹窗
   //  -----------------------------------------------------弹窗
   // ---------------------------------编辑付款方式
   // ---------------------------------编辑付款方式
   const payTypeArray=[{id:0,type:'无'},{id:1,type:'年付'},{id:2,type:'半年付'},{id:3,type:'季付'},{id:4,type:'次付'},{id:5,type:'异常'}]
   const payTypeArray=[{id:0,type:'无'},{id:1,type:'年付'},{id:2,type:'半年付'},{id:3,type:'季付'},{id:4,type:'次付'},{id:5,type:'异常'}]
@@ -251,36 +271,37 @@ const moment = inject('$moment')
   // --------------------------------设置套餐信息
   // --------------------------------设置套餐信息
   //  -----------------------------------------------------弹窗
   //  -----------------------------------------------------弹窗
 
 
-  // 初始化 开始日期和结束日期的查询条件
-  try {
-    searchDate.value = [moment().startOf('year').format('YYYY-MM-DD'),moment(new Date()).format('YYYY-MM-DD')]
-  } catch (error) {
-    console.error(error.message);
-    commodityPList()
-  }
   
   
   // created
   // created
-  getSellerGroupListFun()
+  // getSellerGroupListFun()
   getServiceListFun()
   getServiceListFun()
-
-
-
+  commodityPList()
+  getSellerListFun()
 
 
 </script>
 </script>
 
 
 <template>
 <template>
     <div id="commodity-payment-container" class="commodity-payment-container">
     <div id="commodity-payment-container" class="commodity-payment-container">
       <div class="search-zone">
       <div class="search-zone">
-        <el-input v-model="searchParams.keyword" placeholder="请输入客户名称/销售" clearable class="search-zone-item"
-        @input="searchCommodityP" :prefix-icon="Search" style="width: 240px;"></el-input>
-        <el-select v-model="searchParams.sell_group_id" placeholder="请选择销售组别" clearable
-        @change="searchCommodityP" class="search-zone-item">
+        <el-input v-model="searchParams.keyword" placeholder="请输入客户名称" clearable class="search-item"
+        @input="searchCommodityP" :prefix-icon="Search" style="width: 240px;" ></el-input>
+        <!-- <el-select v-model="searchParams.sell_group_id" placeholder="请选择销售组别" clearable style="width: 240px;margin: 0 30px 10px 0;"
+        @change="searchCommodityP">
           <el-option :label="item.group_name" :value="item.group_id" v-for="item in groupList"></el-option>
           <el-option :label="item.group_name" :value="item.group_id" v-for="item in groupList"></el-option>
-        </el-select>
-        <el-select v-model="searchParams.service_type" placeholder="请选择套餐信息" clearable
-        @change="searchCommodityP" class="search-zone-item">
+        </el-select> -->
+        <el-cascader :options="sellerArray"  filterable style="width: 200px;margin: 0 0 8px 30px;"
+          @change="sellerChange" placeholder="请选择销售" clearable collapse-tags :show-all-levels="false"
+          :props="{multiple:true,label:'seller_name',value:'seller_id',children:'child',emitPath:false}" key="seller" >
+        </el-cascader>
+        <el-cascader :options="serviceList" style="width: 200px;margin: 0 0 8px 30px;" filterable 
+          @change="serviceChange" placeholder="请选择套餐信息" clearable collapse-tags :show-all-levels="false"
+          :props="{multiple:true,label:'title',value:'service_template_id',children:'children',emitPath:false}"
+          collapse-tags-tooltip key="serivce" >
+        </el-cascader>
+        <!-- <el-select v-model="searchParams.service_type" placeholder="请选择套餐信息" clearable style="width: 240px;margin: 0 30px 10px 0;"
+        @change="searchCommodityP">
           <el-option :label="item.title" :value="item.service_template_id" v-for="item in serviceList"></el-option>
           <el-option :label="item.title" :value="item.service_template_id" v-for="item in serviceList"></el-option>
-        </el-select>
+        </el-select> -->
         <div class="date-box">
         <div class="date-box">
           <el-date-picker v-model="searchDate" type="daterange" @change="currentDateTab=0" style="max-width: 240px;margin-right: 20px;"
           <el-date-picker v-model="searchDate" type="daterange" @change="currentDateTab=0" style="max-width: 240px;margin-right: 20px;"
             value-format="YYYY-MM-DD" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
             value-format="YYYY-MM-DD" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
@@ -296,12 +317,12 @@ const moment = inject('$moment')
           </el-select>
           </el-select>
         </div>
         </div>
         <el-select v-model="searchParams.has_invoice" placeholder="请选择开票状态" clearable 
         <el-select v-model="searchParams.has_invoice" placeholder="请选择开票状态" clearable 
-         class="search-zone-item" @change="searchCommodityP">
+         class="search-item" @change="searchCommodityP" >
           <el-option label="未开票" :value="0"></el-option>
           <el-option label="未开票" :value="0"></el-option>
           <el-option label="已开票" :value="1"></el-option>
           <el-option label="已开票" :value="1"></el-option>
         </el-select>
         </el-select>
-        <el-select v-model="searchParams.has_payment" placeholder="请选择到款状态" clearable
-        style="margin-bottom: 10px;" @change="searchCommodityP">
+        <el-select v-model="searchParams.has_payment" class="search-item" placeholder="请选择到款状态" clearable
+        @change="searchCommodityP">
           <el-option label="未到款" :value="0"></el-option>
           <el-option label="未到款" :value="0"></el-option>
           <el-option label="已到款" :value="1"></el-option>
           <el-option label="已到款" :value="1"></el-option>
         </el-select>
         </el-select>
@@ -393,7 +414,12 @@ const moment = inject('$moment')
             </template>
             </template>
           </el-table-column>
           </el-table-column>
           <el-table-column label="销售" prop="seller_name" align="center"></el-table-column>
           <el-table-column label="销售" prop="seller_name" align="center"></el-table-column>
-          <el-table-column label="组别" prop="seller_group_name" align="center"></el-table-column>
+          <el-table-column label="销售组别" prop="seller_group_name" align="center"></el-table-column>
+          <el-table-column label="销售类型" prop="seller_type" align="center">
+            <template #default="{row}">
+              {{ sellerTypeArray[row.seller_type] }}
+            </template>
+          </el-table-column>
           <el-table-column label="套餐信息" prop="services_name" align="center">
           <el-table-column label="套餐信息" prop="services_name" align="center">
             <template #default="{row}">
             <template #default="{row}">
               <span v-if="row.payment_amount&&row.payment_amount!=0" @click="setServiceInfo(row)"
               <span v-if="row.payment_amount&&row.payment_amount!=0" @click="setServiceInfo(row)"
@@ -469,18 +495,18 @@ const moment = inject('$moment')
     min-height: 100%;
     min-height: 100%;
     .search-zone{
     .search-zone{
       margin-bottom: 20px;
       margin-bottom: 20px;
+      margin-left: -30px;
       display: flex;
       display: flex;
       align-items: center;
       align-items: center;
       flex-wrap: wrap;
       flex-wrap: wrap;
-      margin-right: -30px;
-      .search-zone-item{
+      .search-item{
         width: 200px;
         width: 200px;
-        margin: 0 30px 10px 0;
+        margin: 0 0 8px 30px;
       }
       }
       .date-box{
       .date-box{
         display: flex;
         display: flex;
         align-items: center;
         align-items: center;
-        margin: 0 40px 10px 0;
+        margin: 0 0 8px 30px;
         .composition-button-tabs{
         .composition-button-tabs{
           margin-right: 20px;
           margin-right: 20px;
 
 

+ 41 - 14
src/views/financialStatistics/salesStatistics.vue

@@ -24,7 +24,9 @@
     // 排序方式: 1-正序; 2-倒序
     // 排序方式: 1-正序; 2-倒序
     sort_type:'',
     sort_type:'',
     // 是否导出:0-否;1-是
     // 是否导出:0-否;1-是
-    is_export:0
+    is_export:0,
+    // 销售类型 1-ficc销售 2-权益销售
+    seller_type:1
   })
   })
   // 搜索参数-创建时间数组
   // 搜索参数-创建时间数组
   const createtime=ref(null)
   const createtime=ref(null)
@@ -40,12 +42,15 @@
     searchStatistics()
     searchStatistics()
     
     
   })
   })
-
-  // method
+  // 销售类型缓存 为了减少请求次数
+  let sellerTypeCache=0
 
 
   const changeTab=(tab)=>{
   const changeTab=(tab)=>{
     if(tabType.value==tab) return 
     if(tabType.value==tab) return 
     tabType.value=tab
     tabType.value=tab
+    if(tab==2 && sellerTypeCache!=searchParams.seller_type){
+      getSellerGroup()
+    }
     searchParams.current=1
     searchParams.current=1
     searchParams.page_size=10
     searchParams.page_size=10
     searchParams.group_id=''
     searchParams.group_id=''
@@ -69,12 +74,6 @@
         // console.log(res);
         // console.log(res);
       })
       })
     }else if(tabType.value==2){
     }else if(tabType.value==2){
-      // 获取销售组别
-      if(!groupList.value || groupList.value.length==0){
-        getSellerGroupList().then(res=>{
-          groupList.value=res.data || []
-        })
-      }
 
 
       // 销售排名
       // 销售排名
       getSellerStatisticsList(searchParams).then(res=>{
       getSellerStatisticsList(searchParams).then(res=>{
@@ -86,6 +85,22 @@
 
 
   }
   }
 
 
+  // 获取销售组别
+  const getSellerGroup=()=>{
+    sellerTypeCache=searchParams.seller_type
+    getSellerGroupList({seller_type:searchParams.seller_type}).then(res=>{
+      groupList.value=res.data || []
+    })
+  }
+  // 切换销售类型
+  const changeSellerType=()=>{
+    if(tabType.value==2&&sellerTypeCache!=searchParams.seller_type){
+      searchParams.group_id=''
+      getSellerGroup()
+    }
+    searchStatistics()
+  }
+
   const searchStatistics=()=>{
   const searchStatistics=()=>{
     searchParams.current = 1
     searchParams.current = 1
     statisticsList()
     statisticsList()
@@ -122,7 +137,7 @@
 
 
   // created
   // created
   statisticsList()
   statisticsList()
-
+  // getSellerGroup()
 </script>
 </script>
 
 
 <template>
 <template>
@@ -135,12 +150,17 @@
       </div>
       </div>
       <div class="statistics-top-zone">
       <div class="statistics-top-zone">
         <div class="statistics-search-zone">
         <div class="statistics-search-zone">
-          <el-select v-model="searchParams.group_id" placeholder="请选择销售组别" style="width: 300px;margin-right: 30px;"
+          <el-select v-model="searchParams.seller_type" placeholder="请选择销售类型"
+          @change="changeSellerType" class="statistics-search-item" >
+            <el-option label="FICC销售" :value="1"></el-option>
+            <el-option label="权益销售" :value="2"></el-option>
+          </el-select>
+          <el-select v-model="searchParams.group_id" placeholder="请选择销售组别" class="statistics-search-item"
           @change="searchStatistics" v-show="tabType==2" clearable >
           @change="searchStatistics" v-show="tabType==2" clearable >
             <el-option :label="item.group_name" :value="item.group_id" v-for="item in groupList"></el-option>
             <el-option :label="item.group_name" :value="item.group_id" v-for="item in groupList"></el-option>
           </el-select>
           </el-select>
           <el-date-picker v-model="createtime" type="daterange" 
           <el-date-picker v-model="createtime" type="daterange" 
-          value-format="YYYY-MM-DD" style="width:300px"
+          value-format="YYYY-MM-DD" style="max-width:240px;margin-bottom: 8px"
           start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
           start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
         </div>
         </div>
         <div class="statistice-buttons-zone">
         <div class="statistice-buttons-zone">
@@ -210,12 +230,19 @@
     }
     }
     .statistics-top-zone{
     .statistics-top-zone{
       display: flex;
       display: flex;
-      align-items: center;
+      // align-items: center;
       justify-content: space-between;
       justify-content: space-between;
-      margin-bottom: 26px;
+      margin-bottom: 20px;
       .statistics-search-zone{
       .statistics-search-zone{
         display: flex;
         display: flex;
         align-items: center;
         align-items: center;
+        flex-wrap: wrap;
+        margin-right: 30px;
+        .statistics-search-item{
+          width: 200px;
+          margin-bottom: 8px;
+          margin-right: 30px;
+        }
       }
       }
     }
     }
   }
   }

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff