瀏覽代碼

报表统计-权益套餐统计

jwyu 9 月之前
父節點
當前提交
2fc6e8d94d
共有 2 個文件被更改,包括 569 次插入6 次删除
  1. 9 6
      src/router/modules/statisticRoutes.js
  2. 560 0
      src/views/dataReport_manage/equityPackageStatistics.vue

+ 9 - 6
src/router/modules/statisticRoutes.js

@@ -69,12 +69,15 @@ export default [
 			// 	name: '权益客户统计',
 			// 	hidden: false
 			// },
-			// {
-			// 	path: 'equityPackageStatistics',
-			// 	component: () => import('@/views/dataReport_manage/equityPackageStatistics.vue'),
-			// 	name: '权益套餐统计',
-			// 	hidden: false
-			// },
+			{
+				path: 'equityPackageStatistics',
+				component: () => import('@/views/dataReport_manage/equityPackageStatistics.vue'),
+				name: 'equityPackageStatistics',
+				hidden: false,
+				meta:{
+					title:'权益套餐统计'
+				}
+			},
 			// {
 			// 	path: 'readClassify',
 			// 	component: () => import('@/views/dataReport_manage/readClassify.vue'),

+ 560 - 0
src/views/dataReport_manage/equityPackageStatistics.vue

@@ -0,0 +1,560 @@
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  //进入前是否清除参数
+  beforeRouteEnter(to, from, next) {
+    if (from.path != "/customDetail") {
+      sessionStorage.removeItem("incrementBack");
+    }
+    next()
+  }
+})
+
+</script>
+<script setup>
+import { equityTableColums } from "./configdata.js";
+import { dataMainInterface, customInterence } from "@/api/api.js";
+import mPage from "@/components/mPage.vue";
+import moment from "moment";
+import { computed, reactive, onMounted } from 'vue'
+import { onBeforeRouteLeave, useRouter } from 'vue-router';
+import { Search } from '@element-plus/icons-vue'
+
+const router = useRouter()
+
+onBeforeRouteLeave((to, form, next) => {
+  let backData = {
+    page_no: pageState.page_no,
+    end_date: pageState.end_date,
+    start_date: pageState.start_date,
+    filterObj: pageState.filterObj,
+  };
+  sessionStorage.setItem("incrementBack", JSON.stringify(backData));
+  next();
+})
+
+const pageState = reactive({
+  searchVal: sessionStorage.getItem("incrementBack") ? JSON.parse(sessionStorage.getItem("incrementBack")).searchVal : "",
+  tableData: [],
+  isShowloadding: false,
+  start_date: "",
+  end_date: "",
+  /* 筛选条件 */
+  filterObj: {
+    month: "近1个月",
+    date: [],
+    sale: "",
+    data_type: "行业新签",
+  },
+  monthLabel: [
+    {
+      label: "近1个月",
+    },
+    {
+      label: "近2个月",
+    },
+    {
+      label: "近3个月",
+    },
+  ],
+  salesArr: [], //销售列表
+  defaultSalesProps: {
+    multiple: true,
+    label: "RealName",
+    children: "ChildrenList",
+    value: "AdminId",
+  }, //销售级联配置
+  pageSize: 10,
+  page_no: sessionStorage.getItem("incrementBack") ? JSON.parse(sessionStorage.getItem("incrementBack")).page_no : 1,
+  total: 0,
+  data_typeArr: [
+    {
+      label: "行业新签",
+    },
+    {
+      label: "行业续约",
+    },
+    {
+      label: "行业未续约",
+    },
+  ], //数据类型
+  NewCompanyTotal: 0, //行业新签数
+  NotRenewalCompanyTotal: 0, //行业未续约数
+  RenewalCompanyTotal: 0, //行业续约数
+  listPermissionName: [],
+  tabsPitchon: "医药",
+})
+
+const exportExcel = computed(() => {
+  let baseUrl = import.meta.env.VITE_APP_API_ROOT + "/statistic_report/merge_company/company_contract_permission/list";
+  let token = localStorage.getItem("auth") || "";
+  let paramStr = "";
+  // 处理销售筛选
+  let salesArr = [];
+  if (pageState.filterObj.sale.length) {
+    salesArr = pageState.filterObj.sale.map((item) => {
+      return item[item.length - 1];
+    });
+  }
+  let obj = {
+    IsExport: true,
+    Keyword: pageState.searchVal,
+    AdminId: salesArr.join(","),
+    EndDate: pageState.end_date,
+    StartDate: pageState.start_date,
+    DataType: pageState.filterObj.data_type,
+    PermissionName: pageState.tabsPitchon,
+  };
+  for (let key in obj) {
+    paramStr = `${paramStr}&${key}=${obj[key]}`;
+  }
+  return `${baseUrl}?${token}${paramStr}`;
+})
+const Role = computed(() => {
+  let role = localStorage.getItem("Role") || "";
+  return role;
+})
+//管理权限
+const ManageType = computed(() => {
+  return localStorage.getItem("ManageType") || "";
+})
+//确认未续约权限
+const canConfirmNotRenewed = computed(() => {
+  return ["admin", "rai_admin"].includes(pageState.Role);
+})
+
+
+
+// 搜索
+function handleSearch() {
+  if (!pageState.searchVal) {
+    pageState.page_no = 1;
+    pageState.filterObj = {
+      month: "近1个月",
+      date: [],
+      sale: "",
+      data_type: pageState.filterObj.data_type,
+    };
+    let date_before = moment().subtract(1, "M").format("YYYY-MM-DD");
+    let date_now = moment().format("YYYY-MM-DD");
+    let date = [date_before, date_now];
+    pageState.start_date = date_before;
+    pageState.end_date = date_now;
+    pageState.filterObj.date = date;
+    getTableData();
+    return;
+  }
+  pageState.page_no = 1;
+  pageState.filterObj = {
+    month: "",
+    date: [],
+    sale: "",
+    data_type: pageState.filterObj.data_type,
+  };
+  pageState.start_date = "";
+  pageState.end_date = "";
+  getTableData();
+}
+/* 获取表格 */
+function getTableData() {
+  pageState.isShowloadding = true;
+  // 处理销售筛选
+  let salesArr = [];
+  if (pageState.filterObj.sale.length) {
+    salesArr = pageState.filterObj.sale.map((item) => {
+      return item[item.length - 1];
+    });
+  }
+  let params = {
+    Keyword: pageState.searchVal,
+    PageSize: pageState.pageSize,
+    CurrentIndex: pageState.page_no,
+    AdminId: salesArr.join(","),
+    EndDate: pageState.end_date,
+    StartDate: pageState.start_date,
+    DataType: pageState.filterObj.data_type,
+    PermissionName: pageState.tabsPitchon,
+  };
+  dataMainInterface.incrementalCompanyContractPermissionList(params).then((res) => {
+    if (res.Ret === 200) {
+      pageState.tableData = res.Data.List || [];
+      pageState.total = res.Data.Paging.Totals;
+      pageState.NewCompanyTotal = res.Data.NewCompanyTotal;
+      pageState.RenewalCompanyTotal = res.Data.RenewalCompanyTotal;
+      pageState.NotRenewalCompanyTotal = res.Data.NotRenewalCompanyTotal;
+      pageState.isShowloadding = false;
+      pageState.listPermissionName = res.Data.ListPermissionName;
+    }
+  });
+}
+/* 获取销售 */
+function getSale() {
+  customInterence.getSalesRaiData().then((res) => {
+    if (res.Ret === 200) {
+      pageState.salesArr = res.Data.List;
+    }
+  });
+}
+/* 切换月份 */
+function toggleMonth(label) {
+  pageState.filterObj.month = label;
+  let days = label == "近1个月" ? 1 : label == "近2个月" ? 2 : label == "近3个月" ? 3 : 0;
+  filterDate(days);
+}
+/* 选择服务日期 */
+function dateChange(e) {
+  if (e[0]) {
+    pageState.start_date = e[0];
+    pageState.end_date = e[1];
+  } else {
+    pageState.start_date = "";
+    pageState.end_date = "";
+  }
+  pageState.filterObj.month = "";
+  pageState.page_no = 1;
+  pageState.searchVal = "";
+  getTableData();
+}
+/* 切换数据类型 */
+function toggleType(label) {
+  pageState.tabsPitchon = "医药";
+  pageState.filterObj.data_type = label;
+  pageState.page_no = 1;
+  getTableData();
+}
+/* 筛选改变时 */
+function changeFilter() {
+  pageState.page_no = 1;
+  pageState.searchVal = "";
+  getTableData();
+}
+/* 切换页码 */
+function handleCurrentChange(page) {
+  pageState.page_no = page;
+  getTableData();
+}
+/* 获取近几个月的日期范围 */
+function filterDate(month) {
+  if (month) {
+    let date_before = moment().subtract(month, "M").format("YYYY-MM-DD");
+    let date_now = moment().format("YYYY-MM-DD");
+    let date = [date_before, date_now];
+    pageState.start_date = date_before;
+    pageState.end_date = date_now;
+    pageState.filterObj.date = date;
+    pageState.page_no = 1;
+    pageState.searchVal = "";
+    getTableData();
+  }
+}
+function tabsBoxBtn(item) {
+  pageState.tabsPitchon = item.PermissionName;
+  changeFilter();
+}
+// 去往公司详情
+function goCompanyHandle(row) {
+  let { href } = router.resolve({
+    path: "/customDetail",
+    query: {
+      id: row.CompanyId,
+    },
+  });
+  window.open(href, "_blank");
+}
+
+onMounted(() => {
+  getSale();
+  if (sessionStorage.getItem("incrementBack")) {
+    let backData = JSON.parse(sessionStorage.getItem("incrementBack"));
+    pageState.page_no = backData.page_no;
+    pageState.end_date = backData.end_date;
+    pageState.start_date = backData.start_date;
+    pageState.filterObj = backData.filterObj;
+    pageState.searchVal = backData.searchVal;
+  }
+  /* 默认选中近1个月 */
+  filterDate(pageState.filterObj.month === "近1个月" ? 1 : pageState.filterObj.month === "近2个月" ? 2 : pageState.filterObj.month === "近3个月" ? 3 : 0);
+})
+
+
+
+</script>
+
+<template>
+  <div class="dataReport-container" id="dataReport-container">
+    <div class="dataReport-top">
+      <a :href="exportExcel" download>
+        <button class="button-sty act">导出EXCEL</button>
+      </a>
+      <button
+        :class="['button-sty', { act: pageState.filterObj.month === item.label }]"
+        v-for="item in pageState.monthLabel"
+        @click="toggleMonth(item.label)"
+        :key="item.label"
+      >
+        {{ item.label }}
+      </button>
+      <date-picker
+        v-model="pageState.filterObj.date"
+        type="date"
+        range
+        value-type="format"
+        placeholder="自定义时间段"
+        :clearable="false"
+        :editable="false"
+        @change="dateChange"
+      />
+      <el-input
+        placeholder="请输入客户名称"
+        v-model="pageState.searchVal"
+        style="width: 400px; margin-left: auto"
+        @input="handleSearch"
+        clearable
+        :prefix-icon="Search"
+      >
+      </el-input>
+    </div>
+    <div class="dataReport-main">
+      <div class="main-top">
+        <el-cascader
+          v-if="
+            Role == 'finance' ||
+            Role == 'admin' ||
+            Role == 'ficc_admin' ||
+            Role == 'rai_admin' ||
+            ManageType != 0
+          "
+          v-model="pageState.filterObj.sale"
+          placeholder="请选择销售"
+          style="min-width: 250px; margin-right: 10px; margin-bottom: 8px"
+          :options="pageState.salesArr"
+          :props="pageState.defaultSalesProps"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          filterable
+          @change="changeFilter"
+        >
+        </el-cascader>
+      </div>
+      <div class="main-section">
+        <el-row :gutter="36">
+          <el-col :span="8" v-for="item in pageState.data_typeArr" :key="item.label">
+            <el-card
+              :class="[
+                'base-card',
+                { 'main-card': pageState.filterObj.data_type === item.label },
+              ]"
+              shadow="hover"
+              @click="toggleType(item.label)"
+            >
+              <template #header>
+              <div class="clearfix">
+                <span>
+                  {{ item.label }}
+                  <el-tooltip
+                    class="item"
+                    effect="dark"
+                    :content="
+                      item.label === '行业新签'
+                        ? '行业合同开始时间在查询时间段内,且该行业在历史上没有转正记录'
+                        : item.label === '行业续约'
+                        ? '行业合同开始时间在查询时间段内,且该行业历史上有过正式到期记录'
+                        : '行业合同到期时间在查询时间段内,且该行业当前状态是非正式状态'
+                    "
+                    placement="top"
+                  >
+                    <i class="el-icon-info"></i>
+                  </el-tooltip>
+                </span>
+              </div>
+              </template>
+              <div class="card-cont">
+                {{
+                  item.label === "行业新签"
+                    ? pageState.NewCompanyTotal
+                    : item.label === "行业续约"
+                    ? pageState.RenewalCompanyTotal
+                    : item.label === "行业未续约"
+                    ? pageState.NotRenewalCompanyTotal
+                    : ""
+                }}
+              </div>
+            </el-card>
+          </el-col>
+        </el-row>
+      </div>
+      <div class="tabs-content-box">
+        <span
+          v-for="item in pageState.listPermissionName"
+          :key="item.ChartPermissionId"
+          @click="tabsBoxBtn(item)"
+          :class="item.PermissionName == pageState.tabsPitchon ? 'pitch' : ''"
+        >
+          {{ item.PermissionName }} ({{ item.Total }})
+        </span>
+      </div>
+      <el-table
+        :data="pageState.tableData"
+        border
+        style="margin-top: 20px; min-height: 400px"
+        v-loading="pageState.isShowloadding"
+        element-loading-text="数据加载中..."
+      >
+        <el-table-column label="公司名称" prop="CompanyName" align="center">
+          <template #default="{ row }">
+            <span class="editsty" @click="goCompanyHandle(row)">{{
+              row.CompanyName
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          width="100"
+          label="所属销售"
+          prop="SellerName"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column label="合同金额" prop="Money" align="center">
+        </el-table-column>
+        <el-table-column label="合同期限" prop="StartDate" align="center">
+          <template #default="{ row }">
+            <span>{{ row.StartDate }} ~ {{ row.EndDate }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="签约套餐" prop="PermissionName" align="center">
+          <template #default="{ row }">
+            <template v-if="row.PermissionName.length">
+              <el-tag
+                size="mini"
+                style="margin: 0 10px 10px 0"
+                v-for="key in row.PermissionName.split(',')"
+                :key="key"
+                >{{ key }}</el-tag
+              >
+            </template>
+          </template>
+        </el-table-column>
+        <template v-if="pageState.filterObj.data_type == '行业未续约'">
+          <el-table-column
+            width="118"
+            label="当前行业状态"
+            prop="PermissionNameStatus"
+            align="center"
+          >
+          </el-table-column>
+          <el-table-column
+            width="118"
+            label="当前客户状态"
+            prop="CompanyProductStatus"
+            align="center"
+          >
+          </el-table-column>
+        </template>
+      </el-table>
+      <el-col :span="24" class="toolbar" v-if="pageState.total">
+        <m-page
+          :total="pageState.total"
+          :page_no="pageState.page_no"
+          @handleCurrentChange="handleCurrentChange"
+        />
+      </el-col>
+    </div>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+.tabs-box {
+  flex-direction: column;
+  .tabs-box-confirm {
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+    .center-line {
+      width: 1px;
+      height: 21px;
+      background-color: #333333;
+      margin: 0 20px;
+    }
+    .confirm-box-li {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      cursor: pointer;
+      width: 120px;
+      height: 40px;
+      border-radius: 4px;
+    }
+    .active {
+      background-color: #409eff;
+      color: #fff;
+    }
+  }
+}
+.operation-button {
+  color: #409eff;
+  cursor: pointer;
+  font-size: 14px;
+  margin-right: 10px;
+}
+.remark-row {
+  display: flex;
+  justify-content: center;
+  .remark-text {
+    width: 18px;
+    height: 18px;
+    margin-right: 8px;
+    font-size: 18px;
+    color: #409eff;
+    cursor: pointer;
+  }
+}
+.operation-row {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-wrap: wrap;
+  .operation-button {
+    &:last-child {
+      margin-right: 0;
+    }
+  }
+}
+.package-difference {
+  cursor: pointer;
+}
+.tabs-content-box {
+  margin-top: 20px;
+  span {
+    display: inline-block;
+    padding: 9px 24px;
+    background-color: #e9f4ff;
+    border: 1px solid #b3d8ff;
+    border-radius: 4px;
+    margin-right: 30px;
+    color: #409eff;
+    cursor: pointer;
+  }
+  .pitch {
+    background-color: #409eff;
+    border: none;
+    color: #fff;
+  }
+}
+</style>
+<style lang="scss">
+#dataReport-container {
+  .tabs-box {
+    .el-radio-button {
+      margin-right: 0;
+    }
+    .el-radio-button .el-radio-button__inner {
+      border: none;
+      width: 120px;
+      height: 40px;
+      border-radius: 4px;
+    }
+  }
+}
+</style>