Browse Source

冲突解决

hbchen 2 years ago
parent
commit
9f7f26b18a

+ 8 - 0
src/api/common.js

@@ -8,3 +8,11 @@ export function getOSSToken() {
   })
 }
 
+ // 获取 货币单位与汇率
+ export function getCurrencyList() {
+  return request({
+      url:'/contract/register/currency_list',
+      method:'get'
+  })
+}
+

+ 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
+ 4 - 0
src/assets/svg-icons/financial/calculation.svg


+ 5 - 0
src/assets/svg-icons/financial/info.svg

@@ -0,0 +1,5 @@
+<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z" fill="#C0C4CC"/>
+<path d="M9 12V9" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M9 6H9.0075" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 3 - 0
src/assets/svg-icons/menu/financialStatistics.svg

@@ -0,0 +1,3 @@
+<svg width="22" height="22" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg">
+<path d="M20.1026 15.144C20.0379 15.286 19.9194 15.3964 19.7732 15.451C19.6271 15.5056 19.4652 15.4999 19.3232 15.4352C19.1812 15.3704 19.0708 15.252 19.0162 15.1058C18.9616 14.9596 18.9673 14.7977 19.032 14.6558C19.925 12.6944 20.0693 10.4741 19.4376 8.41365C18.806 6.35323 17.4421 4.59521 15.6033 3.47127C13.7646 2.34734 11.578 1.9352 9.45629 2.31263C7.33454 2.69006 5.42427 3.83095 4.08589 5.52005C2.74752 7.20915 2.07359 9.32966 2.19125 11.4815C2.30891 13.6334 3.21002 15.6677 4.72458 17.2009C6.23914 18.734 8.26241 19.6598 10.4127 19.8036C12.5629 19.9474 14.6915 19.2994 16.3968 17.9817C16.5205 17.8929 16.6738 17.8556 16.8244 17.8775C16.9751 17.8995 17.1114 17.979 17.2046 18.0994C17.2979 18.2197 17.3408 18.3716 17.3244 18.523C17.3081 18.6743 17.2336 18.8135 17.1168 18.9111C15.1845 20.4051 12.7722 21.1403 10.3351 20.9779C7.89802 20.8155 5.60463 19.7667 3.88766 18.0295C2.1707 16.2924 1.14889 13.9868 1.01504 11.548C0.881185 9.10919 1.64455 6.7057 3.16109 4.79105C4.67763 2.87639 6.84247 1.58298 9.24716 1.15485C11.6518 0.726715 14.1301 1.19348 16.2142 2.46706C18.2984 3.74064 19.8444 5.73297 20.5605 8.06813C21.2766 10.4033 21.1133 12.9198 20.1014 15.1428L20.1026 15.144ZM9.49088 14.344L7.73089 11.2181L5.58971 14.1546C5.54414 14.217 5.48671 14.2698 5.42072 14.3101C5.35473 14.3503 5.28146 14.3771 5.2051 14.389C5.12873 14.4009 5.05077 14.3977 4.97567 14.3795C4.90056 14.3613 4.82978 14.3284 4.76736 14.2828C4.70494 14.2373 4.65212 14.1798 4.61189 14.1138C4.57167 14.0479 4.54484 13.9746 4.53293 13.8982C4.52102 13.8219 4.52427 13.7439 4.54249 13.6688C4.56071 13.5937 4.59355 13.5229 4.63913 13.4605L7.85912 9.04638L9.62971 12.1923L12.2356 8.7005L14.5062 11.637L17.0862 7.17815C17.1666 7.04779 17.2947 6.95394 17.4432 6.91656C17.5918 6.87918 17.7491 6.90122 17.8816 6.978C18.0141 7.05477 18.1115 7.18021 18.153 7.32766C18.1945 7.47511 18.1769 7.63293 18.1038 7.76756L14.6473 13.7428L12.2521 10.6452L9.49206 14.344H9.49088Z" stroke="#AB9523" stroke-width="0.3"/>
+</svg>

+ 1 - 1
src/components/SvgIcon/index.vue

@@ -1,4 +1,4 @@
-<!-- svg图标组件 -->
+<!-- svg图标组件 使用: <svg-Icon :name="svgIcon-[dir]-[name]" size="" color="" />-->
 <script setup>
 import { computed } from 'vue'
 const props = defineProps({

+ 42 - 0
src/components/dropdown-text/index.vue

@@ -0,0 +1,42 @@
+<script setup>
+  
+</script>
+
+<template>
+  <div class="dropdown-text-box">
+    <!-- <el-button type="primary" 
+    > -->
+      <div class="dropdown-text">
+        <slot></slot>
+      </div>
+      <el-icon style="margin-left: 13px;"><arrow-down /></el-icon>
+    <!-- </el-button> -->
+  </div>
+</template>
+  
+<style lang="scss">
+  .dropdown-text-box{
+    display: flex;
+    align-items: center;
+    justify-content: flex-start;
+    background-color: var(--themeColor);
+    border-radius: 4px;
+    color: white;
+    cursor: pointer;
+    height: 40px; 
+    padding: 9px 13px 9px 20px;
+    box-sizing: border-box;
+    .dropdown-text{
+      display: flex;
+      align-items: center;
+      height: 100%;
+      border-right: solid 1px white;
+      padding-right: 20px;
+      flex-grow: 1;
+    }
+    &:hover{
+      background-color: #c4b565;
+      border-color: #c4b565;
+    }
+  }
+</style>

+ 11 - 0
src/styles/element.scss

@@ -1,9 +1,20 @@
 
+
 // 重新定义element-plus主题
 @forward 'element-plus/theme-chalk/src/common/var.scss' with (
   $colors: (
     'primary': (
       'base': #AB9523,
     ),
+    'danger': (
+      'base': #C54322,
+    ),
+    'error': (
+      'base': #C54322,
+    ),
+  ),
+  $text-color: (
+    'placeholder': #999999,
+    'regular':#333333
   ),
 );

+ 32 - 2
src/styles/main.scss

@@ -9,6 +9,11 @@ body,div,p,span,input,textarea,h1,h2,h3,h4,h5,h6,select,option,ul,ol,li,table,th
 html{
   // css 变量
   --themeColor:#{$themeColor};
+  --dangerColor:#{$dangerColor};
+  --auxiliaryColor:#{$auxiliaryColor};
+  --hitTextColorOne:#{$hitTextColorOne};
+  --secondaryTextColor:#{$secondaryTextColor};
+  font-family: $regularFont;
 }
 
 
@@ -69,6 +74,18 @@ div::-webkit-scrollbar-corner {
     white-space: nowrap;
   }
 }
+// 表格 斑马纹背景样式
+.back-color-row{
+  background-color: #FCFBF7!important;
+}
+
+// 普通按钮
+.element-common-button{
+  color: $themeColor;
+  border: 1px solid $themeColor;
+  font-size: 16px;
+  width: 130px;
+}
 
 // 表格没有数据的插槽样式
 .table-no-data{
@@ -109,10 +126,23 @@ div::-webkit-scrollbar-corner {
 // 表格头部
 .el-table__header{
   .cell{
-    font-weight: bold;
-    color: #000000;
+    font-weight: 400;
+    color: #333333;
   }
 }
+.el-table{
+  td.el-table__cell{
+    div{
+      color: #666666;
+    }
+  }
+}
+.el-checkbox{
+  .el-checkbox__label{
+    color: $secondaryTextColor;
+  }
+}
+
 
 // 弹窗头部
 .el-dialog__header{

+ 31 - 2
src/styles/theme.scss

@@ -1,2 +1,31 @@
-// 主题颜色
-$themeColor:#AB9523;
+// 主基调
+// 品牌色 - 关键按钮和选中状态
+$themeColor:#AB9523;
+// 警示色 - 警告按钮以及重要提示
+$dangerColor:#C54322;
+// 辅助色 - 输入框/选择器描边
+$auxiliaryColor:#DCDFE6;
+// 背景色 - 关键按钮和选中状态
+$backColor:#F2F6FA;
+
+// 文字颜色
+// 标题、表头、已输入状态文字等
+$mainTextColor:#333333;
+// 列表文字、单选多选、侧边导航栏未选中状态等
+$secondaryTextColor:#666666;
+// 筛选正文,提示性文字等
+$hitTextColorOne:#C0C4CC;
+// 警告性提示,警示按钮
+$dangerTextColor:#C54322;
+// 提示性文字
+$hitTextColorTwo:#999999;
+// 按钮文字、链接文字、内容图标等
+$linkTextColor:#AB9523;
+
+// 字体
+// 苹方常规体文字样例展示
+$regularFont:'PingFangSC-Regular,sans-serif';
+// 按钮文字、链接文字、内容图标等
+$mediumFont:'PingFangSC-Medium,sans-serif';
+// 苹方常规体文字样例展示
+$boldFont:'PingFangSC-Bold,sans-serif';

+ 1 - 0
src/views/Login.vue

@@ -219,6 +219,7 @@ if (userAccount) {
 			img{
 				height: 100vh;
 				min-width: 300px;
+				vertical-align: bottom;
 			}
 		}
 	}

+ 8 - 13
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,7 +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
-      placement.amountTotal = res.data.amount_total
+      placement.amountTotal = res.data.amount_total || 0
+      placement.countryAmountList=res.data.currency_total||[]
     })
   }
   
@@ -106,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)
     })

File diff suppressed because it is too large
+ 548 - 276
src/views/financialManagement/contractProgress.vue


+ 30 - 18
src/views/financialManagement/financialList.vue

@@ -226,18 +226,23 @@ 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="width: 130px;margin: 0 30px 0 0;" >导出</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="width: 130px;margin-left: 0;"  >导入</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;" 
+                  v-permission="'financial:list:complianceImport'">下载导入模版</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">
             <!-- 表格 -->
@@ -262,12 +267,12 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
               </el-table-column>
               <el-table-column label="合同金额" align="center" width="100" prop="contract_amount"></el-table-column>
               <el-table-column label="约定付款时间" align="center" width="120" prop="agreed_pay_time"
-              v-if="financial.tabelColumnShowArr.includes('agreed_pay_time')"></el-table-column>
+              v-if="financial.tabelColumnShowArr.includes('agreed_pay_time')" show-overflow-tooltip ></el-table-column>
               <el-table-column label="签订日" align="center" prop="sign_date" width="110"
               v-if="financial.tabelColumnShowArr.includes('sign_date')"></el-table-column>
               <el-table-column label="合同状态" align="center" width="90" prop="contract_status">
                 <template #default="{row}">
-                  {{contractStatusArray[row.contract_status-1].label}}
+                  {{contractStatusArray[row.contract_status-1]?.label}}
                 </template>
               </el-table-column>
               <el-table-column label="已开票金额" align="center" prop="invoiced_amount" width="100"
@@ -324,7 +329,7 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
                         编辑
                       </span>
                       <span class="table-option-buttons"  v-permission="'financial:list:delete'"
-                      @click="delteRecord(row)" style="color:#FF3400;">
+                      @click="delteRecord(row)" style="color:var(--dangerColor);">
                         删除
                       </span>
                       <span class="table-option-buttons" v-permission="'financial:list:invoice'"
@@ -355,17 +360,20 @@ const statusArray=[{id:1,label:"进行中"},{id:2,label:"已完成"}]
           </div>
         </div>
         <!-- 开票详情弹窗 -->
-        <el-dialog v-model="dialog.invoiceDetailShow" title="开票详情" width="500px" :close-on-click-modal="false">
+        <el-dialog v-model="dialog.invoiceDetailShow" title="开票详情" width="600px" :close-on-click-modal="false">
           <el-table :data="dialog.invoiceDetailList" border max-height="600px">
+            <el-table-column label="开票金额" prop="origin_amount" align="center"></el-table-column>
             <el-table-column label="开票日" prop="invoice_time" align="center"></el-table-column>
-            <el-table-column label="开票金额(元)" prop="amount" align="center"></el-table-column>
+            <el-table-column label="销售" align="center" prop="seller_name"></el-table-column>
+            <el-table-column label="备注" align="center" show-overflow-tooltip prop="remark" ></el-table-column>
           </el-table>
         </el-dialog>
         <!-- 到款详情弹窗 -->
         <el-dialog v-model="dialog.refundDetailShow" title="到款详情" width="500px" :close-on-click-modal="false">
           <el-table :data="dialog.refundDetailList" border max-height="600px">
+            <el-table-column label="到款金额" prop="origin_amount" align="center"></el-table-column>
             <el-table-column label="到款日" prop="invoice_time" align="center"></el-table-column>
-            <el-table-column label="到款金额(元)" prop="amount" align="center"></el-table-column>
+            <el-table-column label="备注" align="center" show-overflow-tooltip prop="remark" ></el-table-column>
           </el-table>
         </el-dialog>
         <!-- 更改合同状态弹窗 -->
@@ -408,6 +416,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;

+ 31 - 36
src/views/financialManagement/invoice/invoiceList.vue

@@ -1,6 +1,7 @@
 <script setup>
 
 import getCom from '../composition/IandPList'
+import '../style/iandPList.scss'
 
 const invoice=getCom(1)
 const data = invoice.data
@@ -11,10 +12,10 @@ invoice.placementList()
 </script>
 
 <template>
-    <div id="invoice-list-container">
-      <div class="invoice-search-zone">
-        <div class="invoice-search-box">
-          <el-input v-model="data.searchParams.contract_code" placeholder="请输入合同编号"
+    <div id="iandP-list-container">
+      <div class="iandP-search-zone">
+        <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-date-picker v-model="data.dateRange" start-placeholder="起始日期"
             end-placeholder="结束日期" style="margin-left: 40px;max-width: 321px;margin-bottom: 8px;"
@@ -30,16 +31,35 @@ invoice.placementList()
           </div>
         </div>
       </div>
-      <div class="invoice-table-container">
-        <div class="invoice-table-top">
-          <span style="font-size:14px">已开票金额:{{ data.amountTotal }}元</span>
-          <el-button type="primary" style="width: 80px;" size="large" @click="invoice.placementExport">导出</el-button>
+      <div class="iandP-table-container">
+        <div class="iandP-table-top">
+          <div class="iandP-top-amout">
+            <div class="iandP-amout-box">
+              <div class="iandP-amout-box-text">
+                <span>已开票合计金额(换算后)</span>
+                <span>{{ data.amountTotal }}(元)</span>
+              </div>
+              <svg-Icon name="svgIcon-financial-calculation" size="40" />
+            </div>
+            <div class="iandP-amout-box" v-for="item in data.countryAmountList" :key="item.code">
+              <div class="iandP-amout-box-text">
+                <span>{{ item.name }}</span>
+                <span>{{ item.amount }}({{ item.unit_name }})</span>
+              </div>
+              <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>
         </div>
         <!-- 表格 -->
         <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="invoice_time" 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="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="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;">
@@ -66,30 +86,5 @@ invoice.placementList()
 </template>
   
 <style lang="scss" scoped>
-  #invoice-list-container{
-    min-height: 100%;
-    .invoice-search-zone{
-      border: 1px solid #ECECEC;
-      background-color: white;
-      padding: 18px 30px 12px;
-      box-sizing: border-box;
-      .invoice-search-box{
-        margin-left: -40px;
-        display: flex;
-        flex-wrap: wrap;
-      }
-    }
-    .invoice-table-container{
-      border: 1px solid #ECECEC;
-      background-color: white;
-      margin-top: 18px;
-      padding: 18px 30px 26px;
-      .invoice-table-top{
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        margin-bottom: 18px;
-      }
-    }
-  }
+
 </style>

+ 29 - 35
src/views/financialManagement/placement/placementList.vue

@@ -1,6 +1,7 @@
 <script setup>
 
 import getCom from '../composition/IandPList'
+import '../style/iandPList.scss'
 
 const placement=getCom(2)
 const data = placement.data
@@ -13,9 +14,9 @@ placement.placementList()
 </script>
 
 <template>
-    <div id="placement-list-container">
-      <div class="placement-search-zone">
-        <div class="placement-search-box">
+    <div id="iandP-list-container">
+      <div class="iandP-search-zone">
+        <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-date-picker v-model="data.dateRange" start-placeholder="起始日期"
@@ -32,16 +33,34 @@ placement.placementList()
           </div>
         </div>
       </div>
-      <div class="placement-table-container">
-        <div class="placement-table-top">
-          <span style="font-size:14px">已到款金额:{{ data.amountTotal }}元</span>
-          <el-button type="primary" style="width: 80px;" size="large" @click="placement.placementExport">导出</el-button>
+      <div class="iandP-table-container">
+        <div class="iandP-table-top">
+          <div class="iandP-top-amout">
+            <div class="iandP-amout-box">
+              <div class="iandP-amout-box-text">
+                <span>已到款合计金额(换算后)</span>
+                <span>{{ data.amountTotal }}(元)</span>
+              </div>
+              <svg-Icon name="svgIcon-financial-calculation" size="40" />
+            </div>
+            <div class="iandP-amout-box" v-for="item in data.countryAmountList" :key="item.code">
+              <div class="iandP-amout-box-text">
+                <span>{{ item.name }}</span>
+                <span>{{ item.amount }}({{ item.unit_name }})</span>
+              </div>
+              <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>
         </div>
         <!-- 表格 -->
         <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="invoice_time" 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="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="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;">
@@ -68,30 +87,5 @@ placement.placementList()
 </template>
   
 <style lang="scss" scoped>
-  #placement-list-container{
-    min-height: 100%;
-    .placement-search-zone{
-      border: 1px solid #ECECEC;
-      background-color: white;
-      padding: 18px 30px 12px;
-      box-sizing: border-box;
-      .placement-search-box{
-        margin-left: -40px;
-        display: flex;
-        flex-wrap: wrap;
-      }
-    }
-    .placement-table-container{
-      border: 1px solid #ECECEC;
-      background-color: white;
-      margin-top: 18px;
-      padding: 18px 30px 26px;
-      .placement-table-top{
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        margin-bottom: 18px;
-      }
-    }
-  }
+
 </style>

+ 66 - 0
src/views/financialManagement/style/iandPList.scss

@@ -0,0 +1,66 @@
+#iandP-list-container{
+  min-height: 100%;
+  .iandP-search-zone{
+    margin-bottom: 20px;
+    .iandP-search-box{
+      margin-left: -40px;
+      display: flex;
+      flex-wrap: wrap;
+    }
+  }
+  .iandP-table-container{
+    .iandP-table-top{
+      display: flex;
+      align-items: flex-end;
+      justify-content: space-between;
+      margin-bottom: 20px;
+      .iandP-top-amout{
+        display: flex;
+        flex-wrap: wrap;
+        .iandP-amout-box{
+          display: flex;
+          justify-content: space-between;
+          height: 88px;
+          width: 274px;
+          background: #FFFFFF;
+          border: 1px solid #DCDFE6;
+          box-shadow: 0px 4px 12px rgba(153, 153, 153, 0.08);
+          border-radius: 8px;
+          padding: 14px 20px 20px;
+          box-sizing: border-box;
+          margin-right: 30px;
+          margin-bottom: 10px;
+          .iandP-amout-box-text{
+            display: flex;
+            flex-direction: column;
+            justify-content: space-between;
+            span{
+              font-size: 18px;
+              font-weight: 700;
+              color: $mainTextColor;
+              &:first-child{
+                font-size: 14px;
+                font-weight: 400;
+                color: $secondaryTextColor;
+              }
+            }
+          }
+        }
+        // font-size: 14px;
+        // .iandP-top-amout-span{
+        //   color: $dangerColor;
+        // }
+        // .iandP-top-amout-box{
+        //   display: flex;
+        //   // align-items: center;
+        //   flex-wrap: nowrap;
+        //   .iandP-top-amout-row{
+        //     display: flex;
+        //     flex-wrap: wrap;
+        //     align-items: center;
+        //   }
+        // }
+      }
+    }
+  }
+}

+ 578 - 0
src/views/financialStatistics/commodityPayment.vue

@@ -0,0 +1,578 @@
+<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 dateTypeList=[{id:1,type:'开票时间'},{id:2,type:'到款时间'}]
+
+  const groupList=ref([])
+  const serviceList=ref([])
+
+  const searchParams=reactive({
+    current:1,
+    page_size:10,
+    keyword:'',
+    sell_group_id:'',
+    service_type:'',
+    start_date:'',
+    end_date:'',
+    // 1-开票时间 2-到款时间
+    time_type:1,
+    // 1-已开票
+    has_invoice:0,
+    // 1-已到款
+    has_payment:0,
+    is_export:0
+  })
+  const searchDate=ref(null)
+  watch(searchDate,(newVal)=>{
+    if(newVal){
+      searchParams.start_date=newVal[0]
+      searchParams.end_date=newVal[1]
+    }else{
+      searchParams.start_date=''
+      searchParams.end_date=''
+    }
+    searchCommodityP()
+  })
+
+  const commodityPData=reactive({
+    tableData:[],
+    total:25,
+    rowMergeArray:[],
+    invoiceAmountTotal:0,
+    invoiceAmountList:[],
+    placementAmountTotal:0,
+    placementAmountList:[],
+  })
+  // 开票金额是否收起
+  let invoiceIsFold=ref(true)
+
+  // 到款金额是否收起
+  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);
+    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=()=>{
+    searchParams.current=1
+    commodityPList()
+  }
+
+  const dateTypeCommand=(id)=>{
+    if(id == searchParams.time_type) return 
+    searchParams.time_type=id
+    searchCommodityP()
+    // console.log(id);
+  }
+
+  // 切换每页的数量
+  const changePageSize=(pageSize)=>{
+    searchParams.page_size = pageSize
+    commodityPList()
+  }
+  const changePageNo = (pageNo)=>{
+    searchParams.current = pageNo
+    commodityPList()
+  }
+
+  const dataExport=()=>{
+    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})=>{
+    // console.log({ row,column,rowIndex,columnIndex});
+    if([0,1,2,3].includes(columnIndex)){
+      const _row = commodityPData.rowMergeArray[rowIndex];
+      return {
+        rowspan: _row,
+        colspan: 1
+      };
+    }
+  }
+  // 自定义表格行的类名
+  const tableRowClassName=({ row, rowIndex })=>{
+    if (row.serialNumber%2 === 1) {
+      return 'back-color-row'
+    }
+    return ''
+  }
+  // 开票到款金额展开收起
+  const foldOrUnfold=(type)=>{
+    // type: 0-开票  1-到款
+    if(type){
+      placementIsFold.value = !placementIsFold.value
+    }else{
+      invoiceIsFold.value = !invoiceIsFold.value
+    }
+    console.log(type,invoiceIsFold.value);
+  }
+
+  //  -----------------------------------------------------弹窗
+  // ---------------------------------编辑付款方式
+  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:{
+      contract_payment_id:'',
+      pay_type:'',
+      index:0
+    }
+  })
+
+  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=()=>{
+    editPayTypeRef.value.validate((valid)=>{
+      if(valid){
+        updatePayType(editPayTypeDia.form).then(res=>{
+          ElMessage.success('编辑成功')
+          commodityPData.tableData[editPayTypeDia.form.index].pay_type=editPayTypeDia.form.pay_type
+          editPayTypeDia.diaShow=false
+        })
+      }
+    })
+  }
+  // ---------------------------------编辑付款方式
+  // --------------------------------设置套餐信息
+  const setServiceInfoDia=reactive({
+    diaShow:false,
+    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
+  }
+
+  const serviceAmountChange=(item)=>{
+    // console.log(item);
+    if(!item.amount.trim()){
+      item.amount=0
+      return 
+    }
+    let value = item.amount
+    if(!((value.endsWith('.') && value.indexOf('.')==(value.length-1)) || 
+    (value.endsWith('0') && value.indexOf('.')==(value.length-2)))){
+      item.amount = parseFloat(item.amount)
+    }
+  }
+
+  const setServiceInfoSubmit=()=>{
+    console.log(setServiceInfoDia.dataForm);
+    let totalAmout=0
+    setServiceInfoDia.dataForm.list.map(item =>{
+      totalAmout= Math.round(item.amount*100 + totalAmout*100)/100
+    })
+    if(totalAmout>setServiceInfoDia.placementAmount){
+      ElMessage.warning('套餐总金额大于到款金额,请检查')
+      return
+    }
+    setServiceAmount(setServiceInfoDia.dataForm).then(res=>{
+      rowItem.service_amount_list=setServiceInfoDia.dataForm.list
+      ElMessage.success('设置套餐信息成功')
+      setServiceInfoDia.diaShow=false
+    })
+  }
+
+  // --------------------------------设置套餐信息
+  //  -----------------------------------------------------弹窗
+
+
+  // created
+  getSellerGroupListFun()
+  getServiceListFun()
+  commodityPList()
+
+</script>
+
+<template>
+    <div id="commodity-payment-container" class="commodity-payment-container">
+      <div class="search-zone">
+        <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.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-select>
+        <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-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-dropdown size="large" trigger="click" style="margin:0 60px 10px 0;" @command="dateTypeCommand">
+          <dropdownText>
+            {{dateTypeList.find(it => it.id==searchParams.time_type).type}}
+          </dropdownText>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item :command="item.id" v-for="item in dateTypeList" :key="item.id">{{ item.type }}</el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <div class="search-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">
+        <div class="amount-show-zone">
+          <div class="amount-show-item">
+            <div class="amount-item-head" @click="foldOrUnfold(0)">
+              <div class="amount-item-head-title">
+                已开票合计金额(换算后):{{ commodityPData.invoiceAmountTotal }}(元)
+              </div>
+              <span class="amount-item-head-icon">
+                {{ invoiceIsFold?'展开':'收起' }}
+              </span>
+            </div>
+            <div class="amount-item-body-package" :style="{height:invoiceIsFold?'0':'66px'}">
+              <div class="amount-item-body">
+                <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>{{ item.name }}</span>
+                    <span>{{ item.amount }}({{ item.unit_name }})</span>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="amount-show-item">
+            <div class="amount-item-head" @click="foldOrUnfold(1)">
+              <div class="amount-item-head-title">
+                已到款合计金额(换算后):{{ commodityPData.placementAmountTotal }}(元)
+              </div>
+              <span class="amount-item-head-icon">
+                {{ placementIsFold?'展开':'收起' }}
+              </span>
+            </div>
+            <div class="amount-item-body-package" :style="{height:placementIsFold?'0':'66px'}"> 
+              <div class="amount-item-body">
+                <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>{{ item.name }}</span>
+                    <span>{{ item.amount }}({{ item.unit_name }})</span>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <el-button @click="dataExport" style="margin-bottom: 10px;" size="large" class="element-common-button">导出</el-button>
+      </div>
+      <div class="table-zone">
+        <el-table :data="commodityPData.tableData" border ref="tableRef"
+        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="company_name" align="center" show-overflow-tooltip ></el-table-column>
+          <el-table-column label="是否新客户" prop="new_company" align="center">
+            <template #default="{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);">{{ 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_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.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>
+            <div class="table-no-data">
+              <img src="@/assets/img/icon/empty-data.png" />
+              <span>暂无数据</span>
+            </div>
+          </template>
+        </el-table>
+        <!-- 分页 -->
+        <m-page :pageSize="searchParams.page_size" :page_no="searchParams.current" 
+        style="display: flex;justify-content: flex-end;margin-top: 20px;" 
+        :total="commodityPData.total" @handleCurrentChange="changePageNo" @handleSizeChange="changePageSize"/>
+      </div>
+      <!-- 编辑付款方式弹窗 -->
+      <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="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>
+            <el-button type="primary" @click="editPayTypeSubmit">
+              确定
+            </el-button>
+          </div>
+        </template>
+      </el-dialog>
+
+      <!-- 设置套餐信息弹窗 -->
+      <el-dialog title="套餐信息" v-model="setServiceInfoDia.diaShow" width="774"
+      :close-on-click-modal="false">
+        <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.dataForm.list.length%2!=0">
+            <div class="serviceInfo-label"></div>
+            <div class=" serviceInfo-label serviceInfo-input" id="serviceInfo-input">
+            </div>
+          </div>
+        </div>
+        <template #footer>
+          <div style="padding: 10px 0;">
+            <el-button @click="setServiceInfoDia.diaShow = false">取消</el-button>
+            <el-button type="primary" @click="setServiceInfoSubmit">
+              确定
+            </el-button>
+          </div>
+        </template>
+      </el-dialog>
+    </div>
+</template>
+  
+  
+<style lang="scss" scoped>
+  #commodity-payment-container{
+    min-height: 100%;
+    .search-zone{
+      margin-bottom: 20px;
+      display: flex;
+      align-items: center;
+      flex-wrap: wrap;
+      .search-checkbox{
+        // margin-left: 60px;
+        margin-bottom: 10px;
+        height: 40px;
+        display: flex;
+        align-items: center;
+      }
+    }
+    .operation-zone{
+      margin-bottom: 20px;
+      display: flex;
+      align-items: flex-end;
+      justify-content: space-between;
+      .amount-show-zone{
+        display: flex;
+        align-items: flex-start;
+        flex-wrap: wrap;
+        // justify-content: space-between;        
+        // padding-left: 20px;
+        .amount-show-item{
+          margin-bottom: 10px;
+          background: #FFFFFF;
+          border: 1px solid #DCDFE6;
+          box-shadow: 0px 4px 12px rgba(153, 153, 153, 0.08);
+          border-radius: 8px;
+          // height: 132px;
+          width: 725px;
+          margin-right: 30px;
+          box-sizing: border-box;
+          // padding-bottom: 16px;
+          .amount-item-head{
+            padding: 20px 20px 20px 20px;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            cursor: pointer;
+            .amount-item-head-title{
+              font-weight: 400;
+              font-size: 18px;
+              color: #000000;
+            }
+            .amount-item-head-icon{
+              font-weight: 400;
+              font-size: 14px;
+              color: $themeColor;
+            }
+          }
+          .amount-item-body-package{
+            overflow: hidden;
+            transition: height 0.1s ease;
+            .amount-item-body{
+              padding: 6px 20px 16px;
+              box-sizing: border-box;
+              display: flex;
+              align-items: center;
+              justify-content: space-between;
+              .amount-item-body-box{
+                display: flex;
+                align-items: center;
+                width: 220px;
+                .amount-item-body-info{
+                  display: flex;
+                  flex-direction: column;
+                  justify-content: space-between;
+                  span{
+                    font-weight: 400;
+                    font-size: 14px;
+                    color: $secondaryTextColor;
+                    margin-bottom: 2px;
+                    &:last-child{
+                      font-weight: 700;
+                      font-size: 16px;
+                      color: $mainTextColor;
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    .serviceInf-table{
+      margin: 0 auto;
+      width: 644px;
+      // height: 200px;
+      display: flex;
+      flex-direction: column;
+      flex-wrap: wrap;
+      border-top: solid 1px $auxiliaryColor ;
+      border-left: solid 1px $auxiliaryColor ;
+      .serviceInf-table-item{
+        display: flex;
+        align-items: center;
+        .serviceInfo-label{
+          width: 140px;
+          height: 50px;
+          border-right: solid 1px $auxiliaryColor ;
+          border-bottom: solid 1px $auxiliaryColor ;
+          box-sizing: border-box;
+          padding: 10px;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+        }
+        .serviceInfo-input{
+          width: 182px;
+        }
+      }
+    }
+  }
+</style>
+<style lang="scss">
+#commodity-payment-container{
+  #serviceInfo-input{
+    .el-input__wrapper{
+      height: 28px;
+    }
+  }
+}
+
+// .dropdown-text{
+//   &:hover{
+//     background-color: #c4b565;
+//     border-color: #c4b565;
+//   }
+// }
+
+</style>

+ 222 - 0
src/views/financialStatistics/salesStatistics.vue

@@ -0,0 +1,222 @@
+<script setup>
+  import {getSellerGroupStatisticsList,getSellerStatisticsList} from '@/api/financialStatistics'
+  import {getSellerGroupList} from '@/api/crm'
+  import {downloadByFlow} from '@/utils/common-methods'
+
+  
+
+  const sortFiledMap = new Map([['invoice_amount',1],['group_rate',2],['seller_rate',3]])
+  let groupList=ref([])
+  const tabType=ref(1)
+  const statisticsData=reactive({
+    tableData:[],
+    total:0
+  })
+  // 搜索参数
+  const searchParams=reactive({
+    current:1,
+    page_size:10,
+    group_id:'',
+    start_date:'',
+    end_date:'',
+    // 排序字段: 1-开票金额; 2-组别占比
+    sort_field:'',
+    // 排序方式: 1-正序; 2-倒序
+    sort_type:'',
+    // 是否导出:0-否;1-是
+    is_export:0
+  })
+  // 搜索参数-创建时间数组
+  const createtime=ref(null)
+
+  watch(createtime,(newVal)=>{
+    if(newVal){
+      searchParams.start_date=newVal[0]
+      searchParams.end_date=newVal[1]
+    }else{
+      searchParams.start_date=''
+      searchParams.end_date=''
+    }
+    searchStatistics()
+    
+  })
+
+  // method
+
+  const changeTab=(tab)=>{
+    if(tabType.value==tab) return 
+    tabType.value=tab
+    searchParams.current=1
+    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);
+    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=()=>{
+    searchParams.current = 1
+    statisticsList()
+  }
+  // 切换每页的数量
+  const changePageSize=(pageSize)=>{
+    searchParams.page_size = pageSize
+    statisticsList()
+  }
+  const changePageNo = (pageNo)=>{
+    searchParams.current = pageNo
+    statisticsList()
+  }
+  // 列表排序发生改变
+  const sortChange=({order,prop})=>{
+    // console.log(order,prop);
+    searchParams.sort_field=sortFiledMap.get(prop)
+    searchParams.sort_type=order == 'ascending'?1:2
+    statisticsList()
+  }
+  // 导出
+  const statisticeExport=()=>{
+    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
+  statisticsList()
+
+</script>
+
+<template>
+    <div id="sales-statistics-container" class="sales-statistics-container">
+      <div class="statistics-tabs-zone">
+        <el-button size="large" class="tab-button element-common-button" :class="tabType==1?'actice-tab':''"
+        style="border-radius: 4px 0 0 4px;" @click="changeTab(1)">销售组排名</el-button>
+        <el-button size="large" class="tab-button element-common-button" :class="tabType==2?'actice-tab':''"
+        style="border-radius: 0 4px 4px 0;margin-left: 0;" @click="changeTab(2)">销售排名</el-button>
+      </div>
+      <div class="statistics-top-zone">
+        <div class="statistics-search-zone">
+          <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_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"
+          start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+        </div>
+        <div class="statistice-buttons-zone">
+          <el-button @click="statisticeExport" class="element-common-button" size="large">导出</el-button>
+        </div>
+      </div>
+      <div class="statistics-table-zone" >
+        <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="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;">收入金额(元)
+                  <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="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" />
+              <span>暂无数据</span>
+            </div>
+          </template>
+        </el-table>
+        <!-- 分页 -->
+        <m-page :pageSize="searchParams.page_size" :page_no="searchParams.current" 
+        style="display: flex;justify-content: flex-end;margin-top: 20px;" 
+        :total="statisticsData.total" @handleCurrentChange="changePageNo" @handleSizeChange="changePageSize"/>
+      </div>
+    </div>
+</template>
+  
+<style lang="scss" scoped>
+  #sales-statistics-container{
+    min-height: 100%;
+    .statistics-tabs-zone{
+      margin-bottom: 26px;
+      .tab-button{
+        color: $themeColor;
+        border: 1px solid $themeColor;
+        width: 130px;
+        background-color: white;
+      }
+      .actice-tab{
+        color: white;
+        background-color: $themeColor;
+      }
+    }
+    .statistics-top-zone{
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      margin-bottom: 26px;
+      .statistics-search-zone{
+        display: flex;
+        align-items: center;
+      }
+    }
+  }
+</style>

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