Browse Source

财务2.1 完成

hbchen 2 years ago
parent
commit
90089884e0

+ 8 - 0
src/api/crm.js

@@ -64,3 +64,11 @@ export function getServiceDetail(data) {
      params:data
  })
 }
+
+ // 获取销售组别列表
+ export function getSellerGroupList(data) {
+  return request({
+      url:'/crm/company_seller/group_list',
+      method:'get'
+  })
+ }

+ 26 - 24
src/api/financialMana.js

@@ -155,37 +155,39 @@ export function registerDelete(data) {
  * min_amount - 开票金额区间-最小值 - 非必填
  * max_amount - 开票金额区间-最大值 - 非必填
  * invoice_type - 类型: 1-开票登记; 2-到款登记 - 必填
+ * is_export - 是否是导出:0-否 1-是
  * } data 
  * @returns 
  */
 export function getIandPList(data) {
  return request({
-     url:'/contract/register/invoice_list',
-     method:'get',
-     params:data
- })
-}
-//导出excel
- /**
-  * 
-  * @param {
- * contract_code - 关键词-合同编号 - 非必填
- * start_date - 开始日期:格式2022-11-22 - 非必填
- * end_date - 结束日期:格式2022-11-22 - 非必填
- * min_amount - 开票金额区间-最小值 - 非必填
- * max_amount - 开票金额区间-最大值 - 非必填
- * invoice_type - 类型: 1-开票登记; 2-到款登记 - 必填
- * } data 
- * @returns 
- */
-export function exportIandPList(data) {
- return request({
-     url:'/contract/register/invoice_export',
-     method:'get',
-     responseType:'blob',
-     params:data
+    url:'/contract/register/invoice_list',
+    method:'get',
+    params:data,
+    responseType:data.is_export==1?'blob':'text'
  })
 }
+//导出excel  --- 已废弃
+//  /**
+//   * 
+//   * @param {
+//  * contract_code - 关键词-合同编号 - 非必填
+//  * start_date - 开始日期:格式2022-11-22 - 非必填
+//  * end_date - 结束日期:格式2022-11-22 - 非必填
+//  * min_amount - 开票金额区间-最小值 - 非必填
+//  * max_amount - 开票金额区间-最大值 - 非必填
+//  * invoice_type - 类型: 1-开票登记; 2-到款登记 - 必填
+//  * } data 
+//  * @returns 
+//  */
+// export function exportIandPList(data) {
+//  return request({
+//      url:'/contract/register/invoice_export',
+//      method:'get',
+//      responseType:'blob',
+//      params:data
+//  })
+// }
 
 // 合规登记-导入
  /**

+ 102 - 0
src/api/financialStatistics.js

@@ -0,0 +1,102 @@
+import request from "../utils/request"
+
+// -------------------财务统计-销售统计
+ // 获取销售组排名列表
+ /**
+ * data
+ * @param data.page_size - 每页数据量 - 必填
+ * @param data.current - 页码 - 必填
+ * @param data.start_date - 开始日期
+ * @param data.end_date - 结束日期
+ * @param data.sort_field - 排序字段: 1-开票金额; 2-组别占比
+ * @param data.sort_type - 排序方式: 1-正序; 2-倒序
+ * @param data.is_export - 是否是导出:0-否;1-是
+ * @returns 
+ */
+export function getSellerGroupStatisticsList(data) {
+ return request({
+     url:'/census/seller/group_invoice_list',
+     method:'get',
+     params:data,
+     responseType:data.is_export==1?'blob':'text',
+ })
+}
+
+  // 获取销售排名列表
+ /**
+ * data
+ * @param data.page_size - 每页数据量 - 必填
+ * @param data.current - 页码 - 必填
+ * @param data.group_id - 组别ID
+ * @param data.start_date - 开始日期
+ * @param data.end_date - 结束日期
+ * @param data.sort_field - 排序字段: 1-开票金额; 2-组别占比
+ * @param data.sort_type - 排序方式: 1-正序; 2-倒序
+ * @param data.is_export - 是否是导出:0-否;1-是
+ * @returns 
+ */
+export function getSellerStatisticsList(data) {
+  return request({
+      url:'/census/seller/invoice_list',
+      method:'get',
+      params:data,
+      responseType:data.is_export==1?'blob':'text',
+  })
+ }
+
+// -------------------财务统计-商品到款统计
+  // 获取到款统计列表
+ /**
+ * data
+ * @param data.page_size - 每页数据量 - 必填
+ * @param data.current - 页码 - 必填
+ * @param data.keyword - 关键词-客户名称/销售
+ * @param data.sell_group_id - 销售组别ID
+ * @param data.service_type - 套餐类型
+ * @param data.start_date - 开始时间
+ * @param data.end_date - 结束时间
+ * @param data.time_type - 时间类型:1-开票时间; 2-到款时间
+ * @param data.has_invoice - 是否开票:1-已开票
+ * @param data.has_payment - 是否到款:1-已到款
+ * @param data.is_export - 是否是导出:0-否;1-是
+ * @returns 
+ */
+ export function getInvoicePaymentList(data) {
+  return request({
+      url:'/census/invoice_payment/list',
+      method:'get',
+      params:data,
+      responseType:data.is_export==1?'blob':'text',
+  })
+ }
+
+ // 编辑付款方式
+ /**
+ * @param data.contract_payment_id - 到款ID(即列表中的payment_id)
+ * @param data.pay_type - 付款方式: 1-年付; 2-半年付; 3-季付; 4-次付
+ * @returns 
+ */
+export function updatePayType(data) {
+ return request({
+     url:'/contract/payment/update_pay_type',
+     method:'post',
+     data
+ })
+}
+
+ // 分配套餐金额
+ /**
+ * @param data.contract_payment_id - 到款ID(即列表中的payment_id)
+ * @param data.contract_register_id - 合同登记ID
+ * @param data.contract_register_id - 合同登记ID
+ * @param data.list[i].contract_payment_service_amount_id - 套餐分配ID
+ * @param data.list[i].service_template_id - 套餐ID
+ * @param data.list[i].amount - 套餐金额
+ */
+export function setServiceAmount(data) {
+    return request({
+        url:'/contract/payment/distribute_service_amount',
+        method:'post',
+        data
+    })
+}

+ 3 - 0
src/assets/svg-icons/common/edit.svg

@@ -0,0 +1,3 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.4798 0.813167C12.5259 0.765411 12.5811 0.72732 12.6421 0.701116C12.7031 0.674911 12.7687 0.661118 12.8351 0.660541C12.9015 0.659964 12.9674 0.672615 13.0288 0.697756C13.0902 0.722896 13.1461 0.760023 13.193 0.806969C13.24 0.853915 13.2771 0.909741 13.3022 0.971189C13.3274 1.03264 13.34 1.09848 13.3394 1.16487C13.3389 1.23126 13.3251 1.29687 13.2989 1.35787C13.2727 1.41887 13.2346 1.47404 13.1868 1.52017L6.11632 8.59083C6.02255 8.68461 5.89536 8.73729 5.76274 8.73729C5.63012 8.73729 5.50293 8.68461 5.40916 8.59083C5.31538 8.49706 5.2627 8.36987 5.2627 8.23725C5.2627 8.10463 5.31538 7.97744 5.40916 7.88367L12.4798 0.813333V0.813167ZM12.3333 6C12.3333 5.86739 12.386 5.74021 12.4798 5.64645C12.5735 5.55268 12.7007 5.5 12.8333 5.5C12.9659 5.5 13.0931 5.55268 13.1869 5.64645C13.2806 5.74021 13.3333 5.86739 13.3333 6V11.5C13.3333 12.5125 12.5125 13.3333 11.5 13.3333H2.49999C1.48749 13.3333 0.666656 12.5125 0.666656 11.5V2.5C0.666656 1.4875 1.48749 0.666667 2.49999 0.666667H7.83332C7.96593 0.666667 8.09311 0.719345 8.18688 0.813113C8.28064 0.906881 8.33332 1.03406 8.33332 1.16667C8.33332 1.29927 8.28064 1.42645 8.18688 1.52022C8.09311 1.61399 7.96593 1.66667 7.83332 1.66667H2.49999C2.27898 1.66667 2.06701 1.75446 1.91073 1.91074C1.75445 2.06702 1.66666 2.27899 1.66666 2.5V11.5C1.66666 11.721 1.75445 11.933 1.91073 12.0893C2.06701 12.2455 2.27898 12.3333 2.49999 12.3333H11.5C11.721 12.3333 11.933 12.2455 12.0892 12.0893C12.2455 11.933 12.3333 11.721 12.3333 11.5V6Z" fill="#AB9523"/>
+</svg>

File diff suppressed because it is too large
+ 0 - 11
src/assets/svg-icons/country/America.svg


File diff suppressed because it is too large
+ 0 - 11
src/assets/svg-icons/country/China.svg


File diff suppressed because it is too large
+ 0 - 11
src/assets/svg-icons/country/Singapore.svg


+ 5 - 0
src/styles/main.scss

@@ -137,6 +137,11 @@ div::-webkit-scrollbar-corner {
     }
   }
 }
+.el-checkbox{
+  .el-checkbox__label{
+    color: $secondaryTextColor;
+  }
+}
 
 
 // 弹窗头部

+ 8 - 17
src/views/financialManagement/composition/IandPList.js

@@ -1,6 +1,6 @@
 
 import {useRouter} from 'vue-router'
-import {getIandPList,exportIandPList} from '@/api/financialMana'
+import {getIandPList} from '@/api/financialMana'
 import { downloadByFlow } from '@/utils/common-methods'
 export default function getIandPListCom(type) {
   const router = useRouter()
@@ -14,12 +14,14 @@ export default function getIandPListCom(type) {
       end_date:'',
       min_amount:'',
       max_amount:'',
-      invoice_type:type
+      invoice_type:type,
+      is_export:0
     },
     dateRange:[],
     tableData:[],
     total:0,
-    amountTotal:0
+    amountTotal:0,
+    countryAmountList:[]
   })
 
 
@@ -39,11 +41,8 @@ export default function getIandPListCom(type) {
       // console.log(res);
       placement.tableData=res.data.list || []
       placement.total=res.data.page&&res.data.page.total || 0
-      let amount=placement.tableData.reduce((pre,item)=>{
-        return pre+item.amount
-      },0)
-      // 防止失真
-      placement.amountTotal=Math.round(amount*100)/100
+      placement.amountTotal = res.data.amount_total || 0
+      placement.countryAmountList=res.data.currency_total||[]
     })
   }
   
@@ -110,15 +109,7 @@ export default function getIandPListCom(type) {
     router.push({path:'/financial/list/contractProgress',query:{type:detailType,complianceId:row.contract_register_id}})
   }
   const placementExport=()=>{
-    let params={
-      contract_code:placement.searchParams.contract_code,
-      start_date:placement.searchParams.start_date,
-      end_date:placement.searchParams.end_date,
-      min_amount:placement.searchParams.min_amount,
-      max_amount:placement.searchParams.max_amount,
-      invoice_type:type
-    }
-    exportIandPList(params).then(res=>{
+    getIandPList({...placement.searchParams,is_export:1}).then(res=>{
       let fileName = type==1?'开票列表':'到款列表'
       downloadByFlow(res,'xlxs',fileName)
     })

+ 61 - 47
src/views/financialManagement/contractProgress.vue

@@ -46,8 +46,8 @@
       contract_source:0,
       contract_code:'',
       company_name:'',
-      isNew:'',
       currency_unit:'CNY',
+      new_company:0,
       seller_id:'',
       seller_name:'',
       contract_status:'',
@@ -160,10 +160,11 @@
         amount:'',
         invoice_date:'',
         remark:'',
-        salesman:'',
         // dom的类型
         amountDomType:'text',
         remarkDomType:'text',
+        seller_id:'',
+        seller_name:''
       }
     ]
   })
@@ -190,6 +191,9 @@
   const previewImage=ref('')
   // 查看套餐报价单 标题
   const previewImageTitle=ref('')
+  // 是否是新公司的复选框勾选判断
+  let is_new_company=ref(false)
+
 // -----------------------------监听
   // 已开票金额
   watch(()=> contractInfo.moneyData.haveInvoiceMoney ,(newValue)=>{
@@ -201,6 +205,15 @@
     contractInfo.moneyData.waitPlacementMoney = contractInfo.moneyData.allPlacementMoney-newValue
     contractInfo.moneyData.waitPlacementMoney=Math.round(contractInfo.moneyData.waitPlacementMoney*100)/100
   })
+
+  watch(()=>contractInfo.form.new_company,(newVal)=>{
+    if(newVal==1){
+      is_new_company.value=true
+    }else{
+      is_new_company.value=false
+    }
+  })
+
   // -----------------------method
   // 权限验证
   const permissionValidation=()=>{
@@ -272,8 +285,8 @@
       crm_contract_id:0,
       contract_code:'',
       company_name:'',
-      isNew:'',
       currency_unit:'CNY',
+      new_company:0,
       seller_id:'',
       seller_name:'',
       contract_status:'',
@@ -413,16 +426,26 @@
   // 添加行
   const addTableRow=(type)=>{
     if(type=='invoice'){
-      invoiceForm.invoiceData.push({origin_amount:'',amount:'',invoice_date:'',remark:'',salesman:'',amountDomType:'text',remarkDomType:'text'})
+      invoiceForm.invoiceData.push({origin_amount:'',amount:'',invoice_date:'',remark:'',seller_id:'',seller_name:'',amountDomType:'text',remarkDomType:'text'})
     }else{
       placementForm.placementData.push({origin_amount:'',amount:'',invoice_date:'',remark:'',amountDomType:'text',remarkDomType:'text'})
     }
   }
 
   // 表格添加行
-  const addRow=(type,index)=>{
+  const addRow=(type,row,index)=>{
+    console.log(type,row,index);
+    if(!(row.amount && row.invoice_date)){
+      ElMessage.error('请填写完整信息')
+      return
+    }
     if(type=='invoice'){
-      invoiceForm.invoiceData.splice((index+1),0,{origin_amount:'',amount:'',invoice_date:'',remark:'',salesman:'',amountDomType:'text',remarkDomType:'text'})
+      if(!row.seller_id){
+        ElMessage.error('请填写完整信息')
+        return
+      }
+      invoiceForm.invoiceData.splice((index+1),0,
+      {origin_amount:'',amount:'',invoice_date:'',remark:'',seller_id:'',seller_name:'',amountDomType:'text',remarkDomType:'text'})
     }else{
       placementForm.placementData.splice((index+1),0,{origin_amount:'',amount:'',invoice_date:'',remark:'',amountDomType:'text',remarkDomType:'text'})
     }
@@ -434,7 +457,7 @@
     let haveSalesman=false
     if(type=='invoice'){
       tempArr=invoiceForm.invoiceData
-      if(tempArr[index].salesman) haveSalesman=true
+      if(tempArr[index].seller_id) haveSalesman=true
       word='开票'
     }else{
       tempArr=placementForm.placementData
@@ -647,8 +670,9 @@
     contractInfo.serviceShow=true
   }
 
-  const isNewChange=()=>{
-    console.log(contractInfo.form);
+  const isNewChange=(value)=>{
+    contractInfo.form.new_company = value?1:0
+    // console.log(contractInfo.form);
   }
 
   // 合规登记、开票登记、到款登记 展开收起
@@ -734,8 +758,8 @@
         crm_contract_id:res.data.crm_contract_id,
         contract_code:res.data.contract_code,
         company_name:res.data.company_name,
-        isNew:res.data.isNew,
         currency_unit:res.data.currency_unit,
+        new_company:res.data.new_company,
         seller_id:res.data.seller_id,
         seller_name:res.data.seller_name,
         contract_status:res.data.contract_status,
@@ -753,6 +777,7 @@
         contract_source:res.data.contract_source,
       }
       rmbRate.value=res.data.rmb_rate
+      console.log(rmbRate.value,res.data.rmb_rate);
       if(haveGetCurrencyList.value){
         // 拿到货币列表后才去取单位
         contractInfo.currencyUnit=currencyList.value.find(item => item.code==res.data.currency_unit)?.unit_name
@@ -802,7 +827,8 @@
             amount:item.amount,
             invoice_date:item.invoice_time,
             remark:item.remark,
-            salesman:item.salesman
+            seller_id:item.seller_id,
+            seller_name:item.seller_name
           })
         })
         // 添加一行空的
@@ -812,9 +838,10 @@
             amount:'',
             invoice_date:'',
             remark:'',
-            salesman:'',
             amountDomType:'text',
-            remarkDomType:'text'
+            remarkDomType:'text',
+            seller_id:'',
+            seller_name:''
           })
         }
       }
@@ -884,7 +911,7 @@
                       <el-form-item label="客户名称" prop="company_name" id="contractInfo-companyName">
                         <el-input v-model="contractInfo.form.company_name"
                         placeholder="请输入客户名称" />
-                        <el-checkbox v-model="contractInfo.form.isNew" label="新客户" style="margin-left: 20px;min-width: 100px;"
+                        <el-checkbox v-model="is_new_company" label="新客户" style="margin-left: 20px;min-width: 100px;"
                         size="large" @change="isNewChange" />
                       </el-form-item>
                       <el-form-item label="销售" prop="seller_id">
@@ -975,32 +1002,12 @@
                     :class="{'viewService':canServiceShow(contractInfo.serviceArray[2]?.service_template_id)}">
                     {{contractInfo.serviceArray[2]?.title}}
                     </el-checkbox>
-                    <!-- 财富管理 -->
-                    <el-checkbox v-for="item in contractInfo.serviceArray.slice(3)" :label="item.service_template_id">
-                      {{item.title}}
-                    </el-checkbox>
-                    <!-- 财富管理 -->
-                    <el-checkbox v-for="item in contractInfo.serviceArray.slice(3)" :label="item.service_template_id">
-                      {{item.title}}
-                    </el-checkbox>
-                    <!-- 财富管理 -->
-                    <el-checkbox v-for="item in contractInfo.serviceArray.slice(3)" :label="item.service_template_id">
-                      {{item.title}}
-                    </el-checkbox>
-                    <!-- 财富管理 -->
-                    <el-checkbox v-for="item in contractInfo.serviceArray.slice(3)" :label="item.service_template_id">
-                      {{item.title}}
-                    </el-checkbox>
-                    <!-- 财富管理 -->
-                    <el-checkbox v-for="item in contractInfo.serviceArray.slice(3)" :label="item.service_template_id">
-                      {{item.title}}
-                    </el-checkbox>
-                    <!-- 财富管理 -->
+                    <!-- 财富管理类似没有详情的套餐 -->
                     <el-checkbox v-for="item in contractInfo.serviceArray.slice(3)" :label="item.service_template_id">
                       {{item.title}}
                     </el-checkbox>
                   </el-checkbox-group>
-                  <div class="info-service-remark">
+                  <div class="remark info-service-remark">
                     <span style="white-space: nowrap;font-size: 14px;margin-right: 20px;">套餐备注</span>
                     <el-input style="flex-grow: 1;" :disabled="contractInfo.operationtype!='compliance'"
                         v-model="contractInfo.form.service_remark" placeholder="请输入备注"
@@ -1051,7 +1058,7 @@
                       <el-button type="primary" style="margin: 0 0 0 auto;" @click="addTableRow('invoice')" 
                       v-if="contractInfo.operationtype=='invoice'&&invoiceForm.invoiceData.length==0">添加开票信息</el-button>
                     </div>
-                    <el-form ref="invoiceFormRef" :model="invoiceForm">
+                    <el-form ref="invoiceFormRef" :model="invoiceForm" :disabled="contractInfo.operationtype!='invoice'">
                       <el-table :data="invoiceForm.invoiceData" border v-if="invoiceForm.invoiceData.length>0" style="width: 100%;"> 
                         <el-table-column label="序号" width="50" align="center">
                           <template #default="{row,$index}">
@@ -1079,7 +1086,7 @@
                         </el-table-column>
                         <el-table-column label="换算金额(元)" show-overflow-tooltip width="200" align="center" prop="amount">
                           <template #default="{row,$index}">
-                            <span v-if="row.amount">{{ parseFloat(row.amount).toFixed(2)}}</span>
+                            <span v-if="row.amount">{{ row.amount.toFixed(2)}}</span>
                             <span v-else style="color: var(--hitTextColorOne);">开票金额为空不可换算</span>
                           </template>
                         </el-table-column>
@@ -1096,21 +1103,21 @@
                             <span v-else>{{ row.invoice_date }}</span>
                           </template>
                         </el-table-column >
-                        <el-table-column label="销售" width="150" align="center" prop="salesman">
+                        <el-table-column label="销售" width="150" align="center" prop="seller_id">
                           <template #header>
                             <span style="color: var(--dangerColor);">*</span>销售
                           </template>
                           <template #default="{row,$index}">
-                            <el-form-item :prop="`invoiceData.${$index}.salesman`" :show-message="false" v-if="!row.invoice_id"
+                            <el-form-item :prop="`invoiceData.${$index}.seller_id`" :show-message="false" v-if="!row.invoice_id"
                             :rules="{required:true,message:()=>{ ElMessage.error('销售不能为空')},trigger:'change'}">
-                              <el-select v-model="row.salesman" style="width: 124px;"
+                              <el-select v-model="row.seller_id" style="width: 124px;"
                               placeholder="请选择销售" filterable>
                                 <el-option :label="item.real_name" :value="item.admin_id" 
                                 v-for="item in contractInfo.sellerList" :key="item.admin_id">
                                 </el-option>
                               </el-select>
                             </el-form-item>
-                            <span v-else>{{ row.salesman || '--' }}</span>
+                            <span v-else>{{ row.seller_name || '--' }}</span>
                           </template>
                         </el-table-column>
                         <el-table-column label="备注" width="150" align="center" prop="remark" show-overflow-tooltip >
@@ -1127,7 +1134,7 @@
                         </el-table-column>
                         <el-table-column label="操作" width="140" align="center" v-if="contractInfo.operationtype=='invoice'">
                           <template #default="{row,$index}" >
-                            <span class="table-operation-button" @click="addRow('invoice',$index)" style="margin-right: 10px;">添加</span>
+                            <span class="table-operation-button" @click="addRow('invoice',row,$index)" style="margin-right: 10px;">添加</span>
                             <span class="table-operation-button" style="color: var(--dangerColor);" 
                             @click="deleteRow('invoice',$index)">删除</span>
                           </template>
@@ -1168,7 +1175,7 @@
                       <el-button type="primary" style="margin: 0 0 0 auto;" @click="addTableRow('placement')" 
                       v-if="contractInfo.operationtype=='placement'&&placementForm.placementData.length==0">添加到款信息</el-button>
                     </div>
-                    <el-form ref="placementFormRef" :model="placementForm">
+                    <el-form ref="placementFormRef" :model="placementForm" :disabled="contractInfo.operationtype!='placement'">
                       <el-table :data="placementForm.placementData" border v-if="placementForm.placementData.length>0"> 
                         <el-table-column label="序号" width="50" align="center">
                           <template #default="{row,$index}">
@@ -1196,7 +1203,7 @@
                         </el-table-column>
                         <el-table-column label="换算金额(元)" width="200" align="center" prop="amount">
                           <template #default="{row,$index}">
-                            <span v-if="row.amount">{{ parseFloat(row.amount).toFixed(2)}}</span>
+                            <span v-if="row.amount">{{ row.amount.toFixed(2)}}</span>
                             <span v-else style="color: var(--hitTextColorOne);">到款金额为空不可换算</span>
                           </template>
                         </el-table-column>
@@ -1394,6 +1401,15 @@
                   align-items: center;
                   margin-top: 20px;
                 }
+                .remark{
+                  span{
+                    font-weight: 400;
+                    font-size: 14px;
+                    color: #333333;
+                    margin-right: 20px;
+                    white-space: nowrap;
+                  }
+                }
                 // 备注
                 .info-row-remark{
                   display: flex;
@@ -1427,9 +1443,7 @@
                 }
               }
             }
-
           }
-
         }
       }
       .contract-progress-aside{

+ 20 - 12
src/views/financialManagement/financialList.vue

@@ -226,18 +226,22 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
           <div class="financial-top-option-zone">
               <el-button type="primary" size="large" style="width: 130px;margin-right: 30px;" v-permission="'financial:list:complianceAdd'"
               @click="registration('compliance')">合规登记</el-button>
-              <el-button @click="exportData" size="large" style="margin: 0 30px 0 0;" class="element-common-button" >导出</el-button>
-              <el-upload
-                class="upload-demo"
-                accept=".xlsx"
-                :show-file-list="false"
-                :http-request="importData"
-                v-permission="'financial:list:complianceImport'"
-              >
-                <el-button size="large" :loading="financial.importLoading"
-                style="margin-left: 0;" class="element-common-button" >导入</el-button>
-              </el-upload>
-              
+              <div class="financial-top-option-zone-right">
+                <a href="https://hzstatic.hzinsights.com/static/fms/excel/财务列表-导入模板.xlsx" download>
+                  <el-button class="element-common-button" size="large" style="margin-right: 30px;">下载导入模版</el-button>
+                </a>
+                <el-upload
+                  class="upload-demo"
+                  accept=".xlsx"
+                  :show-file-list="false"
+                  :http-request="importData"
+                  v-permission="'financial:list:complianceImport'"
+                >
+                  <el-button size="large" :loading="financial.importLoading"
+                  style="margin-right:30px;" class="element-common-button" >导入</el-button>
+                </el-upload>
+                <el-button @click="exportData" size="large" class="element-common-button" >导出</el-button>
+              </div>              
           </div>
           <div class="financial-table-zone">
             <!-- 表格 -->
@@ -411,6 +415,10 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
     .financial-top-option-zone{
       display: flex;
       align-items: center;
+      justify-content: space-between;
+      .financial-top-option-zone-right{
+        display: flex;
+      }
     }
     .financial-table-zone{
       margin-top: 20px;

+ 11 - 25
src/views/financialManagement/invoice/invoiceList.vue

@@ -15,7 +15,7 @@ invoice.placementList()
     <div id="iandP-list-container">
       <div class="iandP-search-zone">
         <div class="iandP-search-box">
-          <el-input v-model="data.searchParams.contract_code" placeholder="请输入合同编号"
+          <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-date-picker v-model="data.dateRange" start-placeholder="起始日期"
             end-placeholder="结束日期" style="margin-left: 40px;max-width: 321px;margin-bottom: 8px;"
@@ -37,30 +37,16 @@ invoice.placementList()
             <div class="iandP-amout-box">
               <div class="iandP-amout-box-text">
                 <span>已开票合计金额(换算后)</span>
-                <span>5000.00(元)</span>
+                <span>{{ data.amountTotal }}(元)</span>
               </div>
               <svg-Icon name="svgIcon-financial-calculation" size="40" />
             </div>
-            <div class="iandP-amout-box">
-              <div class="iandP-amout-box-text">
-                <span>人民币</span>
-                <span>2000.00(元)</span>
-              </div>
-              <svg-Icon name="svgIcon-country-China" size="40" />
-            </div>
-            <div class="iandP-amout-box">
-              <div class="iandP-amout-box-text">
-                <span>新加坡币</span>
-                <span>2000.00(新元)</span>
-              </div>
-              <svg-Icon name="svgIcon-country-Singapore" size="40" />
-            </div>
-            <div class="iandP-amout-box">
+            <div class="iandP-amout-box" v-for="item in data.countryAmountList" :key="item.code">
               <div class="iandP-amout-box-text">
-                <span>美元</span>
-                <span>5000.00(美元)</span>
+                <span>{{ item.name }}</span>
+                <span>{{ item.amount }}({{ item.unit_name }})</span>
               </div>
-              <svg-Icon name="svgIcon-country-America" size="40" />
+              <img :src="item.flag_img" style="height: 40px;width: 40px;" />
             </div>
           </div>
           <el-button class="element-common-button" style="margin-bottom: 10px;" size="large" @click="invoice.placementExport">导出</el-button>
@@ -68,12 +54,12 @@ invoice.placementList()
         <!-- 表格 -->
         <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="amount" show-overflow-tooltip></el-table-column>
-          <el-table-column label="金额单位" align="center" prop="amount">美元</el-table-column>
-          <el-table-column label="换算金额(元)" align="center" prop="amount" show-overflow-tooltip>2100.00</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="amount" show-overflow-tooltip></el-table-column>
           <el-table-column label="开票日" align="center" prop="invoice_time" show-overflow-tooltip></el-table-column>
-          <el-table-column label="销售" align="center" prop="amount" >张三</el-table-column>
-          <el-table-column label="备注" align="center" prop="amount" show-overflow-tooltip>哈哈哈哈哈</el-table-column>
+          <el-table-column label="销售" align="center" prop="seller_name" ></el-table-column>
+          <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip></el-table-column>
           <el-table-column label="操作" width="120" align="center">
             <template #default="{row}">
               <div class="table-options" style="justify-content: center;">

+ 10 - 24
src/views/financialManagement/placement/placementList.vue

@@ -38,31 +38,17 @@ placement.placementList()
           <div class="iandP-top-amout">
             <div class="iandP-amout-box">
               <div class="iandP-amout-box-text">
-                <span>已开票合计金额(换算后)</span>
-                <span>5000.00(元)</span>
+                <span>已到款合计金额(换算后)</span>
+                <span>{{ data.amountTotal }}(元)</span>
               </div>
               <svg-Icon name="svgIcon-financial-calculation" size="40" />
             </div>
-            <div class="iandP-amout-box">
-              <div class="iandP-amout-box-text">
-                <span>人民币</span>
-                <span>2000.00(元)</span>
-              </div>
-              <svg-Icon name="svgIcon-country-China" size="40" />
-            </div>
-            <div class="iandP-amout-box">
-              <div class="iandP-amout-box-text">
-                <span>新加坡币</span>
-                <span>2000.00(新元)</span>
-              </div>
-              <svg-Icon name="svgIcon-country-Singapore" size="40" />
-            </div>
-            <div class="iandP-amout-box">
+            <div class="iandP-amout-box" v-for="item in data.countryAmountList" :key="item.code">
               <div class="iandP-amout-box-text">
-                <span>美元</span>
-                <span>5000.00(美元)</span>
+                <span>{{ item.name }}</span>
+                <span>{{ item.amount }}({{ item.unit_name }})</span>
               </div>
-              <svg-Icon name="svgIcon-country-America" size="40" />
+              <img :src="item.flag_img" style="height: 40px;width: 40px;" />
             </div>
           </div>
           <el-button class="element-common-button" style="margin-bottom: 10px;" size="large" @click="placement.placementExport">导出</el-button>
@@ -70,11 +56,11 @@ placement.placementList()
         <!-- 表格 -->
         <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="amount" show-overflow-tooltip></el-table-column>
-          <el-table-column label="金额单位" align="center" prop="amount">美元</el-table-column>
-          <el-table-column label="换算金额(元)" align="center" prop="amount" show-overflow-tooltip>2100.00</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="amount" show-overflow-tooltip></el-table-column>
           <el-table-column label="到款日" align="center" prop="invoice_time" show-overflow-tooltip></el-table-column>
-          <el-table-column label="备注" align="center" prop="amount" show-overflow-tooltip>哈哈哈哈哈</el-table-column>
+          <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip></el-table-column>
           <el-table-column label="操作" width="120" align="center">
             <template #default="{row}">
               <div class="table-options" style="justify-content: center;">

+ 165 - 217
src/views/financialStatistics/commodityPayment.vue

@@ -1,22 +1,32 @@
 <script setup>
 import { Search } from '@element-plus/icons-vue'
 import dropdownText from '@/components/dropdown-text/index.vue'  
+import {getInvoicePaymentList,updatePayType,setServiceAmount} from '@/api/financialStatistics'
+import {getSellerGroupList} from '@/api/crm'
+import {getServiceList} from '@/api/financialMana'
+import {downloadByFlow} from '@/utils/common-methods'
 
-  const groupList=[{id:1,group:'家人组'},{id:2,group:'联合组'},{id:3,group:'摆烂组'}]
-  const serviceList=[{id:1,service:'大套餐'},{id:2,service:'小套餐'},{id:3,service:'策略'}]
+  
   const dateTypeList=[{id:1,type:'开票时间'},{id:2,type:'到款时间'}]
 
+  const groupList=ref([])
+  const serviceList=ref([])
+
   const searchParams=reactive({
     current:1,
     page_size:10,
-    keyWord:'',
-    group:'',
-    service:'',
+    keyword:'',
+    sell_group_id:'',
+    service_type:'',
     start_date:'',
     end_date:'',
-    dateType:1,
-    invoice:'',
-    placement:''
+    // 1-开票时间 2-到款时间
+    time_type:1,
+    // 1-已开票
+    has_invoice:0,
+    // 1-已到款
+    has_payment:0,
+    is_export:0
   })
   const searchDate=ref(null)
   watch(searchDate,(newVal)=>{
@@ -33,7 +43,11 @@ import dropdownText from '@/components/dropdown-text/index.vue'
   const commodityPData=reactive({
     tableData:[],
     total:25,
-    rowMergeArray:[]
+    rowMergeArray:[],
+    invoiceAmountTotal:0,
+    invoiceAmountList:[],
+    placementAmountTotal:0,
+    placementAmountList:[],
   })
   // 开票金额是否收起
   let invoiceIsFold=ref(true)
@@ -42,8 +56,47 @@ import dropdownText from '@/components/dropdown-text/index.vue'
   let placementIsFold=ref(true)
 
   // method
+
+  //获取销售组别
+  const getSellerGroupListFun=()=>{
+    getSellerGroupList().then(res=>{
+      groupList.value=res.data || []
+    })
+  }
+  // 获取套餐列表
+  const getServiceListFun=()=>{
+    getServiceList().then(res=>{
+      serviceList.value=res.data || []
+    })
+  }
+
+
   const commodityPList=()=>{
-    console.log(searchParams);
+    // console.log(searchParams);
+    getInvoicePaymentList(searchParams).then(res=>{
+      // console.log(res);
+      commodityPData.tableData=[]
+      commodityPData.rowMergeArray=[]
+      let tempData = res.data.list.data_list || []
+      commodityPData.total = res.data.page.total
+      commodityPData.invoiceAmountTotal=res.data.list.invoice_total
+      commodityPData.invoiceAmountList = res.data.list.invoice_currency_total || []
+      commodityPData.placementAmountTotal=res.data.list.payment_total
+      commodityPData.placementAmountList = res.data.list.payment_currency_total || []
+      tempData.map((item,index) =>{
+        commodityPData.rowMergeArray.push(item.invoice_payment_list.length)
+        item.invoice_payment_list.map((it,ind) =>{
+          if(ind-1>=0){
+            commodityPData.rowMergeArray.push(0)
+          }
+          commodityPData.tableData.push({
+            serialNumber:searchParams.page_size*(searchParams.current-1)+index+1,
+            ...item,date:item.start_date+'至'+item.end_date,...it
+          })
+        })
+      })
+      // console.log(commodityPData.tableData);
+    })
   }
 
   const searchCommodityP=()=>{
@@ -52,8 +105,8 @@ import dropdownText from '@/components/dropdown-text/index.vue'
   }
 
   const dateTypeCommand=(id)=>{
-    if(id == searchParams.dateType) return 
-    searchParams.dateType=id
+    if(id == searchParams.time_type) return 
+    searchParams.time_type=id
     searchCommodityP()
     // console.log(id);
   }
@@ -67,33 +120,18 @@ import dropdownText from '@/components/dropdown-text/index.vue'
     searchParams.current = pageNo
     commodityPList()
   }
-  // 时间类型改变
-  const dateTypeChange=()=>{
-    if(!searchDate.value) return
-    searchCommodityP()
-  }
 
   const dataExport=()=>{
-    console.log('导出');
-  }
-
-  const getRowMergeArray=()=>{
-    commodityPData.rowMergeArray=[]
-    let flag=0
-    commodityPData.tableData.map((item,index) =>{
-      if(index==0){
-        commodityPData.rowMergeArray.push(1)
-      }else{
-        if(item.companyName === commodityPData.tableData[index - 1].companyName){
-          commodityPData.rowMergeArray[flag] ++; //项目名称相同,合并到同一个数组中
-          commodityPData.rowMergeArray.push(0);
-        }else {
-          commodityPData.rowMergeArray.push(1);
-          flag = index;
-        }
-      }
+    getInvoicePaymentList({...searchParams,is_export:1}).then(res=>{
+      downloadByFlow(res,'xlsx',`商品到款统计列表`)
     })
   }
+  // 是否已开票或已到款 改变
+  const haveIAndPChange=(value,prop)=>{
+    searchParams[prop]=value?1:0
+    searchCommodityP()
+  }
+
 
   // 单元格合并
   const cellMerge=({ row,column,rowIndex,columnIndex})=>{
@@ -126,29 +164,38 @@ import dropdownText from '@/components/dropdown-text/index.vue'
 
   //  -----------------------------------------------------弹窗
   // ---------------------------------编辑付款方式
-  const payTypeArray=[{id:1,type:'年付'},{id:2,type:'半年付'},{id:3,type:'季付'},{id:4,type:'次付'}]
+  const payTypeArray=[{id:0,type:'无'},{id:1,type:'年付'},{id:2,type:'半年付'},{id:3,type:'季付'},{id:4,type:'次付'},{id:5,type:'异常'}]
+  // 可以选择的付款方式
+  const selectablePayTypeArray=[{id:1,type:'年付'},{id:2,type:'半年付'},{id:3,type:'季付'},{id:4,type:'次付'}]
+
   const editPayTypeRef=ref(null)
   const editPayTypeDia=reactive({
     diaShow:false,
     form:{
-      payType:''
+      contract_payment_id:'',
+      pay_type:'',
+      index:0
     }
   })
 
-  const editPayType=(row)=>{
-    editPayTypeDia.diaShow=true
-    editPayTypeDia.form.payType=''
+  const editPayType=(row,index)=>{
+    editPayTypeDia.form.index=index
+    editPayTypeDia.form.pay_type=''
+    editPayTypeDia.form.contract_payment_id=row.payment_id
     setTimeout(()=>{
       editPayTypeRef.value && editPayTypeRef.value.clearValidate()
     },0)
+    editPayTypeDia.diaShow=true
   }
   // 提交
   const editPayTypeSubmit=()=>{
-    console.log(editPayTypeDia.form);
     editPayTypeRef.value.validate((valid)=>{
       if(valid){
-        ElMessage.success('编辑成功')
-        editPayTypeDia.diaShow=false
+        updatePayType(editPayTypeDia.form).then(res=>{
+          ElMessage.success('编辑成功')
+          commodityPData.tableData[editPayTypeDia.form.index].pay_type=editPayTypeDia.form.pay_type
+          editPayTypeDia.diaShow=false
+        })
       }
     })
   }
@@ -156,23 +203,23 @@ import dropdownText from '@/components/dropdown-text/index.vue'
   // --------------------------------设置套餐信息
   const setServiceInfoDia=reactive({
     diaShow:false,
-    dataFormList:[
-      {serviceId:1,serviceTitle:'大套餐',amount:0},
-      {serviceId:1,serviceTitle:'小套餐',amount:0},
-      {serviceId:1,serviceTitle:'海外报告',amount:0},
-      {serviceId:1,serviceTitle:'策略报告',amount:0},
-      {serviceId:1,serviceTitle:'财富管理',amount:0},
-      {serviceId:1,serviceTitle:'会展',amount:0},
-      {serviceId:1,serviceTitle:'赞助',amount:0},
-      {serviceId:1,serviceTitle:'调研门票',amount:0},
-      {serviceId:1,serviceTitle:'其他',amount:0}
-    ]
+    dataForm:{
+      contract_register_id:'',
+      contract_payment_id:'',
+      list:[]
+    },
+    placementAmount:0
   })
 
+  let rowItem={}
 
   const setServiceInfo=(row)=>{
+    rowItem=row
+    setServiceInfoDia.dataForm.contract_register_id=row.contract_register_id
+    setServiceInfoDia.dataForm.contract_payment_id=row.payment_id
+    setServiceInfoDia.dataForm.list=row.service_amount_list?JSON.parse(JSON.stringify(row.service_amount_list)):[]
+    setServiceInfoDia.placementAmount=row.payment_amount
     setServiceInfoDia.diaShow=true
-    // setServiceInfoDia.form.payType=''
   }
 
   const serviceAmountChange=(item)=>{
@@ -189,14 +236,20 @@ import dropdownText from '@/components/dropdown-text/index.vue'
   }
 
   const setServiceInfoSubmit=()=>{
-    console.log(setServiceInfoDia.dataFormList);
+    console.log(setServiceInfoDia.dataForm);
     let totalAmout=0
-    setServiceInfoDia.dataFormList.map(item =>{
+    setServiceInfoDia.dataForm.list.map(item =>{
       totalAmout= Math.round(item.amount*100 + totalAmout*100)/100
     })
-    // console.log(totalAmout,'totalAmout');
-    ElMessage.success('设置套餐信息成功')
-    setServiceInfoDia.diaShow=false
+    if(totalAmout>setServiceInfoDia.placementAmount){
+      ElMessage.warning('套餐总金额大于到款金额,请检查')
+      return
+    }
+    setServiceAmount(setServiceInfoDia.dataForm).then(res=>{
+      rowItem.service_amount_list=setServiceInfoDia.dataForm.list
+      ElMessage.success('设置套餐信息成功')
+      setServiceInfoDia.diaShow=false
+    })
   }
 
   // --------------------------------设置套餐信息
@@ -204,113 +257,30 @@ import dropdownText from '@/components/dropdown-text/index.vue'
 
 
   // created
+  getSellerGroupListFun()
+  getServiceListFun()
   commodityPList()
-  // getRowMergeArray()
-  const data=[{id:1,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'',
-    placementAmount:'0',payType:'异常',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:2,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:3,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:4,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:5,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:6,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:7,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'',
-    placementAmount:'0',payType:'异常',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:8,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:9,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:10,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]},
-  {id:11,companyName:'哈哈',isNew:'是',date:'2022-01-01至2022-12-31',recordList:[
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'},
-    {invoiceDate:'12月29日',invoiceAmount:'10000.00',placementDate:'12月30日',
-    placementAmount:'3000.00',payType:'季付',seller:'张三',group:'销售组1',serviceInfo:'大套餐、小套餐、海外报告'}
-  ]}]
 
-  data.map((item,index) =>{
-    commodityPData.rowMergeArray.push(item.recordList.length)
-    item.recordList.map((it,ind) =>{
-      if(ind-1>=0){
-        commodityPData.rowMergeArray.push(0)
-      }
-      commodityPData.tableData.push({
-        serialNumber:searchParams.page_size*(searchParams.current-1)+index+1,
-        id:item.id,companyName:item.companyName,isNew:item.isNew,date:item.date,
-        invoiceDate:it.invoiceDate,invoiceAmount:it.invoiceAmount,placementDate:it.placementDate,
-        placementAmount:it.placementAmount,payType:it.payType,seller:it.seller,
-        group:it.group,serviceInfo:it.serviceInfo
-      })
-    })
-  })
 </script>
 
 <template>
     <div id="commodity-payment-container" class="commodity-payment-container">
       <div class="search-zone">
-        <el-input v-model="searchParams.keyWord" placeholder="请输入客户名称/销售"
+        <el-input v-model="searchParams.keyword" placeholder="请输入客户名称/销售" clearable 
         @input="searchCommodityP" :prefix-icon="Search" style="width: 286px;margin: 0 30px 10px 0;" ></el-input>
-        <el-select v-model="searchParams.group" placeholder="请选择销售组别" clearable style="width: 240px;margin: 0 30px 10px 0;"
+        <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" :value="item.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" placeholder="请选择套餐信息" clearable style="width: 240px;margin: 0 30px 10px 0;"
+        <el-select v-model="searchParams.service_type" placeholder="请选择套餐信息" clearable style="width: 240px;margin: 0 30px 10px 0;"
         @change="searchCommodityP">
-          <el-option :label="item.service" :value="item.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-date-picker v-model="searchDate" type="daterange" style="max-width: 240px;margin: 0 20px 10px 0;"
         value-format="YYYY-MM-DD" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
-        <!-- <el-select v-model="searchParams.dateType" placeholder="请选择日期类型" @change="dateTypeChange">
-          <el-option :label="item.type" :value="item.id" v-for="item in dateTypeList"></el-option>
-        </el-select> -->
         <el-dropdown size="large" trigger="click" style="margin:0 60px 10px 0;" @command="dateTypeCommand">
           <dropdownText>
-            {{dateTypeList.find(it => it.id==searchParams.dateType).type}}
+            {{dateTypeList.find(it => it.id==searchParams.time_type).type}}
           </dropdownText>
           <template #dropdown>
             <el-dropdown-menu>
@@ -319,8 +289,8 @@ import dropdownText from '@/components/dropdown-text/index.vue'
           </template>
         </el-dropdown>
         <div class="search-checkbox" >
-          <el-checkbox label="已开票" v-model="searchParams.invoice" @change="searchCommodityP"></el-checkbox>
-          <el-checkbox el-checkbox label="已到款" v-model="searchParams.placement" @change="searchCommodityP"></el-checkbox>
+          <el-checkbox label="已开票" @change="(value)=>haveIAndPChange(value,'has_invoice')"></el-checkbox>
+          <el-checkbox el-checkbox label="已到款" @change="(value)=>haveIAndPChange(value,'has_payment')"></el-checkbox>
         </div>
       </div>
       <div class="operation-zone">
@@ -328,7 +298,7 @@ import dropdownText from '@/components/dropdown-text/index.vue'
           <div class="amount-show-item">
             <div class="amount-item-head" @click="foldOrUnfold(0)">
               <div class="amount-item-head-title">
-                已开票合计金额(换算后):80000.00(元)
+                已开票合计金额(换算后):{{ commodityPData.invoiceAmountTotal }}(元)
               </div>
               <span class="amount-item-head-icon">
                 {{ invoiceIsFold?'展开':'收起' }}
@@ -336,25 +306,11 @@ import dropdownText from '@/components/dropdown-text/index.vue'
             </div>
             <div class="amount-item-body-package" :style="{height:invoiceIsFold?'0':'66px'}">
               <div class="amount-item-body">
-                <div class="amount-item-body-box">
-                  <svg-Icon name="svgIcon-country-China" style="margin-right: 20px;" size="40" />
-                  <div class="amount-item-body-info">
-                    <span>人民币</span>
-                    <span>5000.00(元)</span>
-                  </div>
-                </div>
-                <div class="amount-item-body-box">
-                  <svg-Icon name="svgIcon-country-Singapore" style="margin-right: 20px;" size="40" />
+                <div class="amount-item-body-box" v-for="item in commodityPData.invoiceAmountList" :key="item.code">
+                  <img :src="item.flag_img" style="height: 40px;width: 40px;margin-right: 20px;" />
                   <div class="amount-item-body-info">
-                    <span>新加坡币</span>
-                    <span>5000.00(新元)</span>
-                  </div>
-                </div>
-                <div class="amount-item-body-box">
-                  <svg-Icon name="svgIcon-country-America" style="margin-right: 20px;" size="40" />
-                  <div class="amount-item-body-info">
-                    <span>美元</span>
-                    <span>5000.00(美元)</span>
+                    <span>{{ item.name }}</span>
+                    <span>{{ item.amount }}({{ item.unit_name }})</span>
                   </div>
                 </div>
               </div>
@@ -363,7 +319,7 @@ import dropdownText from '@/components/dropdown-text/index.vue'
           <div class="amount-show-item">
             <div class="amount-item-head" @click="foldOrUnfold(1)">
               <div class="amount-item-head-title">
-                已到款合计金额(换算后):80000.00(元)
+                已到款合计金额(换算后):{{ commodityPData.placementAmountTotal }}(元)
               </div>
               <span class="amount-item-head-icon">
                 {{ placementIsFold?'展开':'收起' }}
@@ -371,25 +327,11 @@ import dropdownText from '@/components/dropdown-text/index.vue'
             </div>
             <div class="amount-item-body-package" :style="{height:placementIsFold?'0':'66px'}"> 
               <div class="amount-item-body">
-                <div class="amount-item-body-box">
-                  <svg-Icon name="svgIcon-country-China" style="margin-right: 20px;" size="40" />
-                  <div class="amount-item-body-info">
-                    <span>人民币</span>
-                    <span>5000.00(元)</span>
-                  </div>
-                </div>
-                <div class="amount-item-body-box">
-                  <svg-Icon name="svgIcon-country-Singapore" style="margin-right: 20px;" size="40" />
+                <div class="amount-item-body-box" v-for="item in commodityPData.placementAmountList" :key="item.code">
+                  <img :src="item.flag_img" style="height: 40px;width: 40px;margin-right: 20px;" />
                   <div class="amount-item-body-info">
-                    <span>新加坡币</span>
-                    <span>5000.00(新元)</span>
-                  </div>
-                </div>
-                <div class="amount-item-body-box">
-                  <svg-Icon name="svgIcon-country-America" style="margin-right: 20px;" size="40" />
-                  <div class="amount-item-body-info">
-                    <span>美元</span>
-                    <span>5000.00(美元)</span>
+                    <span>{{ item.name }}</span>
+                    <span>{{ item.amount }}({{ item.unit_name }})</span>
                   </div>
                 </div>
               </div>
@@ -403,31 +345,35 @@ import dropdownText from '@/components/dropdown-text/index.vue'
         max-height="600" :row-class-name="tableRowClassName" :span-method="cellMerge">
           <el-table-column label="序号" align="center" prop="serialNumber" >
           </el-table-column>
-          <el-table-column label="客户名称" prop="companyName" align="center" show-overflow-tooltip ></el-table-column>
-          <el-table-column label="是否新客户" prop="isNew" align="center"></el-table-column>
-          <el-table-column label="合同有效期" prop="date" align="center" show-overflow-tooltip ></el-table-column>
-          <el-table-column label="开票日" prop="invoiceDate" align="center" id="spc-column"></el-table-column>
-          <el-table-column label="开票金额" prop="invoiceAmount" align="center"></el-table-column>
-          <el-table-column label="到款日" prop="placementDate" align="center"></el-table-column>
-          <el-table-column label="到款金额" prop="placementAmount" align="center"></el-table-column>
-          <el-table-column label="付款方式" prop="payType" align="center">
+          <el-table-column label="客户名称" prop="company_name" align="center" show-overflow-tooltip ></el-table-column>
+          <el-table-column label="是否新客户" prop="new_company" align="center">
             <template #default="{row}">
-              <span v-if="row.payType!='异常'">{{ row.payType }}</span>
-              <span v-else @click="editPayType(row)"
+              {{ row.new_company==1?'是':'否' }}
+            </template>
+          </el-table-column>
+          <el-table-column label="合同有效期" prop="date" align="center" show-overflow-tooltip ></el-table-column>
+          <el-table-column label="开票日" show-overflow-tooltip  prop="invoice_time" align="center" id="spc-column"></el-table-column>
+          <el-table-column label="开票金额" prop="invoice_amount" align="center"></el-table-column>
+          <el-table-column label="到款日" show-overflow-tooltip prop="payment_date" align="center"></el-table-column>
+          <el-table-column label="到款金额" prop="payment_amount" align="center"></el-table-column>
+          <el-table-column label="付款方式" prop="pay_type" align="center">
+            <template #default="{row,$index}">
+              <span v-if="row.pay_type!='5'">{{ row.pay_type!=0?payTypeArray[row.pay_type].type:'' }}</span>
+              <span v-else @click="editPayType(row,$index)"
               style="cursor: pointer;display: flex;align-items: center;justify-content: center;">
-                <span style="color: var(--dangerColor);">{{ row.payType }}</span>
-                <el-icon :size="20" 
-                style="position: absolute;right: 0;top: 50%;transform: translateX(-50%) translateY(-50%);"><Edit /></el-icon>
+                <span style="color: var(--dangerColor);">{{ payTypeArray[row.pay_type].type }}</span>
+                <svg-Icon name="svgIcon-common-edit" size="13" 
+                style="position: absolute;right: 4px;top: 50%;transform: translateX(-50%) translateY(-50%);" ></svg-Icon>
               </span>
             </template>
           </el-table-column>
-          <el-table-column label="销售" prop="seller" align="center"></el-table-column>
-          <el-table-column label="组别" prop="group" align="center"></el-table-column>
-          <el-table-column label="套餐信息" prop="serviceInfo" align="center">
+          <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="services_name" align="center">
             <template #default="{row}">
-              <span v-if="row.placementAmount&&row.placementAmount!=0" @click="setServiceInfo"
-              style="cursor: pointer;color: var(--themeColor);">{{ row.serviceInfo }}</span>
-              <span v-else style="color: #666;">{{ row.serviceInfo }}</span>
+              <span v-if="row.payment_amount&&row.payment_amount!=0" @click="setServiceInfo(row)"
+              style="cursor: pointer;color: var(--themeColor);">{{ row.services_name }}</span>
+              <span v-else style="color: #666;">{{ row.services_name }}</span>
             </template>
           </el-table-column>
           <template #empty>
@@ -445,13 +391,15 @@ import dropdownText from '@/components/dropdown-text/index.vue'
       <!-- 编辑付款方式弹窗 -->
       <el-dialog title="编辑付款方式" v-model="editPayTypeDia.diaShow" width="492"
        :close-on-click-modal="false">
+       <div style="display: flex;justify-content: center;">
         <el-form :model="editPayTypeDia.form" ref="editPayTypeRef" style="display: flex;justify-self: center">
-          <el-form-item label="付款方式" prop="payType" :rules="{required:true,message:'请选择付款方式',trigger:'change'}">
-            <el-select v-model="editPayTypeDia.form.payType" placeholder="请选择付款方式" style="width: 286px;">
-              <el-option :label="item.type" :value="item.id" v-for="item in payTypeArray" :key="item.id"></el-option>
+          <el-form-item label="付款方式" prop="pay_type" :rules="{required:true,message:'请选择付款方式',trigger:'change'}">
+            <el-select v-model="editPayTypeDia.form.pay_type" placeholder="请选择付款方式" style="width: 286px;">
+              <el-option :label="item.type" :value="item.id" v-for="item in selectablePayTypeArray" :key="item.id"></el-option>
             </el-select>
           </el-form-item>
         </el-form>
+       </div>
         <template #footer>
           <div style="padding: 10px 0;">
             <el-button @click="editPayTypeDia.diaShow = false">取消</el-button>
@@ -465,14 +413,14 @@ import dropdownText from '@/components/dropdown-text/index.vue'
       <!-- 设置套餐信息弹窗 -->
       <el-dialog title="套餐信息" v-model="setServiceInfoDia.diaShow" width="774"
       :close-on-click-modal="false">
-        <div class="serviceInf-table" :style="{'height':Math.ceil(setServiceInfoDia.dataFormList.length/2)*50+'px'}">
-          <div class="serviceInf-table-item" v-for="item in setServiceInfoDia.dataFormList" :key="item.serviceId">
-            <div class="serviceInfo-label">{{ item.serviceTitle }}</div>
+        <div class="serviceInf-table" :style="{'height':Math.ceil(setServiceInfoDia.dataForm.list.length/2)*50+'px'}">
+          <div class="serviceInf-table-item" v-for="item in setServiceInfoDia.dataForm.list" :key="item.serviceId">
+            <div class="serviceInfo-label">{{ item.service_template_name }}</div>
             <div class=" serviceInfo-label serviceInfo-input" id="serviceInfo-input">
               <el-input v-model="item.amount" placeholder="请输入金额" style="width: 124px;height: 28px;" @input="serviceAmountChange(item)"></el-input>
             </div>
           </div>
-          <div class="serviceInf-table-item" v-show="setServiceInfoDia.dataFormList.length%2!=0">
+          <div class="serviceInf-table-item" v-show="setServiceInfoDia.dataForm.list.length%2!=0">
             <div class="serviceInfo-label"></div>
             <div class=" serviceInfo-label serviceInfo-input" id="serviceInfo-input">
             </div>

+ 86 - 42
src/views/financialStatistics/salesStatistics.vue

@@ -1,34 +1,30 @@
 <script setup>
-  
-
+  import {getSellerGroupStatisticsList,getSellerStatisticsList} from '@/api/financialStatistics'
+  import {getSellerGroupList} from '@/api/crm'
+  import {downloadByFlow} from '@/utils/common-methods'
 
-  const groupList=[{id:1,group:'家人组'},{id:2,group:'联合组'},{id:3,group:'摆烂组'}]
+  
 
+  const sortFiledMap = new Map([['invoice_amount',1],['group_rate',2],['seller_rate',3]])
+  let groupList=ref([])
   const tabType=ref(1)
-  const tableRef = ref(null)
   const statisticsData=reactive({
-    tableData:[{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},
-    {saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},{saller:'张三',group:1,invoiceAmount:3000,groupPercent:"50%",wholePercent:'21%'},],
-    total:25
+    tableData:[],
+    total:0
   })
   // 搜索参数
   const searchParams=reactive({
     current:1,
     page_size:10,
-    group:'',
+    group_id:'',
     start_date:'',
-    end_date:''
+    end_date:'',
+    // 排序字段: 1-开票金额; 2-组别占比
+    sort_field:'',
+    // 排序方式: 1-正序; 2-倒序
+    sort_type:'',
+    // 是否导出:0-否;1-是
+    is_export:0
   })
   // 搜索参数-创建时间数组
   const createtime=ref(null)
@@ -42,21 +38,52 @@
       searchParams.end_date=''
     }
     searchStatistics()
+    
   })
 
   // method
 
   const changeTab=(tab)=>{
     if(tabType.value==tab) return 
-    tableRef.value.clearSort()
     tabType.value=tab
     searchParams.current=1
-    searchParams.group=''
-    createtime.value=null
+    searchParams.page_size=10
+    searchParams.group_id=''
+    searchParams.sort_field=''
+    searchParams.sort_type=''
+    if(createtime.value===null){
+      statisticsList()
+    }else{
+      // 监听了createtime,createtime变化就会发起请求,避免发起两次请求
+      createtime.value=null
+    }
   }
-
+  // 获取列表
   const statisticsList=()=>{
-    console.log(searchParams);
+    // console.log(searchParams);
+    if(tabType.value==1){
+      // 销售组排名
+      getSellerGroupStatisticsList(searchParams).then(res=>{
+        statisticsData.tableData = res.data.list || []
+        statisticsData.total = res.data.page.total || 0
+        // console.log(res);
+      })
+    }else if(tabType.value==2){
+      // 获取销售组别
+      if(!groupList.value || groupList.value.length==0){
+        getSellerGroupList().then(res=>{
+          groupList.value=res.data || []
+        })
+      }
+
+      // 销售排名
+      getSellerStatisticsList(searchParams).then(res=>{
+        // console.log(res);
+        statisticsData.tableData = res.data.list || []
+        statisticsData.total = res.data.page.total || 0
+      })
+    }
+
   }
 
   const searchStatistics=()=>{
@@ -74,11 +101,23 @@
   }
   // 列表排序发生改变
   const sortChange=({order,prop})=>{
-    console.log(order,prop);
+    // console.log(order,prop);
+    searchParams.sort_field=sortFiledMap.get(prop)
+    searchParams.sort_type=order == 'ascending'?1:2
+    statisticsList()
   }
-
+  // 导出
   const statisticeExport=()=>{
-    console.log("导出");
+    if(tabType.value == 1){
+      getSellerGroupStatisticsList({...searchParams,is_export:1}).then(res=>{
+        downloadByFlow(res,'xlsx',`销售统计-销售组排名列表`)
+      })
+    }else if(tabType.value == 2){
+      getSellerStatisticsList({...searchParams,is_export:1}).then(res=>{
+        downloadByFlow(res,'xlsx',`销售统计-销售排名列表`)
+      })
+    }
+
   }
 
   // created
@@ -96,9 +135,9 @@
       </div>
       <div class="statistics-top-zone">
         <div class="statistics-search-zone">
-          <el-select v-model="searchParams.group" placeholder="请选择销售组别" style="width: 300px;margin-right: 30px;"
+          <el-select v-model="searchParams.group_id" placeholder="请选择销售组别" style="width: 300px;margin-right: 30px;"
           @change="searchStatistics" v-show="tabType==2" clearable >
-            <el-option :label="item.group" :value="item.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-date-picker v-model="createtime" type="daterange" 
           value-format="YYYY-MM-DD" style="width:300px"
@@ -109,30 +148,35 @@
         </div>
       </div>
       <div class="statistics-table-zone" >
-        <el-table :data="statisticsData.tableData" border ref="tableRef"
+        <el-table :data="statisticsData.tableData" border
         max-height="600" @sort-change="sortChange" size='large'>
           <el-table-column label="排名" align="center">
             <template #default="{$index}">
               {{ searchParams.page_size*(searchParams.current-1)+$index+1}}
             </template>
           </el-table-column>
-          <el-table-column label="销售员" prop="saller" align="center" v-if="tabType==2"></el-table-column>
-          <el-table-column label="销售组别" prop="group" align="center">
-            <template #default="{row}">
-              {{ groupList.find(item => row.group==item.id).group  }}
-            </template>
-          </el-table-column>
-          <el-table-column label="收入金额" prop="invoiceAmount" align="center" sortable >
+          <el-table-column label="销售员" prop="seller_name" align="center" v-if="tabType==2"></el-table-column>
+          <el-table-column label="销售组别" prop="group_name" align="center"></el-table-column>
+          <!-- <el-table-column label="开票金额" prop="invoice_amount" align="center" sortable="custom" ></el-table-column> -->
+          <el-table-column label="收入金额(元)" prop="invoice_amount" align="center" sortable="custom" >
             <template #header>
               <el-tooltip content="收入金额为开票金额换算后的人民币金额" placement="top">
-                <span style="display: inline-flex;align-items: center;">收入金额
+                <span style="display: inline-flex;align-items: center;">收入金额(元)
                   <svg-Icon name="svgIcon-financial-info" size="18" style="margin-left: 5px;color: white;" />
                 </span>
               </el-tooltip>
             </template>
           </el-table-column>
-          <el-table-column label="小组占比" prop="groupPercent" align="center" sortable></el-table-column>
-          <el-table-column label="全员占比" prop="wholePercent" align="center" sortable v-if="tabType==2"></el-table-column>
+          <el-table-column label="小组占比" prop="group_rate" align="center" sortable="custom">
+            <template #default="{row}">
+              {{ row.group_rate+'%' }}
+            </template>
+          </el-table-column>
+          <el-table-column label="全员占比" prop="seller_rate" align="center" sortable="custom" v-if="tabType==2">
+            <template #default="{row}">
+              {{ row.seller_rate+'%' }}
+            </template>
+          </el-table-column>
           <template #empty>
             <div class="table-no-data">
               <img src="@/assets/img/icon/empty-data.png" />
@@ -157,7 +201,7 @@
         color: $themeColor;
         border: 1px solid $themeColor;
         width: 130px;
-        background-color: transparent;
+        background-color: white;
       }
       .actice-tab{
         color: white;

Some files were not shown because too many files changed in this diff