Explorar el Código

需求和bug修改

wangxy hace 1 semana
padre
commit
02b05f185f

+ 7 - 0
src/api/course/courseWatchLog.js

@@ -52,6 +52,13 @@ export function exportCourseWatchLog(query) {
   })
 }
 
+export function watchLogExport(query) {
+  return request({
+    url: '/course/courseWatchLog/qwWatchLogAllStatisticsExport',
+    method: 'get',
+    params: query
+  })
+}
 
 export function statisticsList(query) {
   return request({

+ 8 - 0
src/api/course/qw/courseWatchLog.js

@@ -53,6 +53,14 @@ export function qwWatchLogAllStatisticsList(query) {
     params: query
   })
 }
+
+export function qwWatchLogExport(query) {
+  return request({
+    url: '/qw/course/courseWatchLog/qwWatchLogAllStatisticsExport',
+    method: 'get',
+    params: query
+  })
+}
 export function myQwWatchLogAllStatisticsList(query) {
   return request({
     url: '/qw/course/courseWatchLog/myQwWatchLogAllStatisticsList',

+ 28 - 0
src/api/his/packageOrder.js

@@ -99,6 +99,13 @@ export function PackageOrderReport(query) {
     params: query
   })
 }
+export function exportPackageOrderReport(query) {
+  return request({
+    url: '/his/packageOrder/exportPackageReport',
+    method: 'get',
+    params: query
+  })
+}
 
 export function orderReport(query) {
   return request({
@@ -107,6 +114,13 @@ export function orderReport(query) {
     params: query
   })
 }
+export function exportOrderReport(query) {
+  return request({
+    url: '/company/statistics/exportFsOrderReportVO',
+    method: 'get',
+    params: query
+  })
+}
 
 export function courseReport(query) {
   return request({
@@ -115,6 +129,13 @@ export function courseReport(query) {
     params: query
   })
 }
+export function exportCourseReport(query) {
+  return request({
+    url: '/company/statistics/exportFsCourseReportVO',
+    method: 'get',
+    params: query
+  })
+}
 
 export function userReport(query) {
   return request({
@@ -123,3 +144,10 @@ export function userReport(query) {
     params: query
   })
 }
+export function exportUserReport(query) {
+  return request({
+    url: '/company/statistics/exportUserReport',
+    method: 'get',
+    params: query
+  })
+}

+ 66 - 3
src/views/course/courseUserStatistics/qw/statistics.vue

@@ -29,7 +29,20 @@
       </el-form-item>
     </el-form>
 
-    <el-table border v-loading="loading" :data="courseWatchLogList" @selection-change="handleSelectionChange"  show-summary height="600">
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table border v-loading="loading" :data="courseWatchLogList" @selection-change="handleSelectionChange"  show-summary :summary-method="getSummaries" height="600">
       <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="员工名称" align="center" prop="qwUserName" />
 
@@ -462,7 +475,8 @@
 </template>
 
 <script>
-import { listCourseWatchLog, getCourseWatchLog, delCourseWatchLog, addCourseWatchLog, updateCourseWatchLog, exportCourseWatchLog,statisticsList,qwWatchLogStatisticsList,qwWatchLogAllStatisticsList } from "@/api/course/courseWatchLog";
+import { listCourseWatchLog, getCourseWatchLog, delCourseWatchLog, addCourseWatchLog, updateCourseWatchLog, exportCourseWatchLog,statisticsList,qwWatchLogStatisticsList } from "@/api/course/courseWatchLog";
+import {qwWatchLogAllStatisticsList, qwWatchLogExport} from "@/api/course/qw/courseWatchLog";
 import { courseList,videoList } from '@/api/course/courseRedPacketLog'
 import {getCompanyList} from "@/api/company/company";
 export default {
@@ -536,6 +550,55 @@ export default {
     });
   },
   methods: {
+     getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '合计';
+          return;
+        }
+
+        const values = data.map(item => Number(item[column.property]));
+        if (
+          column.property &&
+          [
+            'line', 'regNum', 'firstOnline', 'firstOver',
+            'd1Online', 'd1Over', 'd2Online', 'd2Over',
+            'd3Online', 'd3Over', 'd4Online', 'd4Over',
+            'd5Online', 'd5Over', 'd6Online', 'd6Over',
+            'd7Online', 'd7Over', 'd8Online', 'd8Over',
+            'd9Online', 'd9Over', 'd10Online', 'd10Over',
+            'd11Online', 'd11Over', 'd12Online', 'd12Over',
+            'd13Online', 'd13Over', 'd14Online', 'd14Over',
+            'd15Online', 'd15Over', 'd16Online', 'd16Over',
+            'd17Online', 'd17Over', 'd18Online', 'd18Over',
+            'd19Online', 'd19Over', 'd20Online', 'd20Over',
+            'd21Online', 'd21Over', 'd22Online', 'd22Over',
+            'd23Online', 'd23Over', 'd24Online', 'd24Over',
+            'd25Online', 'd25Over', 'd26Online', 'd26Over',
+            'd27Online', 'd27Over', 'd28Online', 'd28Over',
+            'd29Online', 'd29Over', 'd30Online', 'd30Over'
+          ].includes(column.property)
+        ) {
+          const sum = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + value;
+            } else {
+              return prev;
+            }
+          }, 0);
+
+          sums[index] = sum;
+        } else {
+          sums[index] = '';
+        }
+      });
+
+      return sums;
+    },
     courseChange(row){
       this.queryParams.videoId=null;
       if(row === ''){
@@ -678,7 +741,7 @@ export default {
           type: "warning"
         }).then(() => {
           this.exportLoading = true;
-          return exportCourseWatchLog(queryParams);
+          return qwWatchLogExport(queryParams);
         }).then(response => {
           this.download(response.msg);
           this.exportLoading = false;

+ 77 - 3
src/views/course/courseUserStatistics/statistics.vue

@@ -61,7 +61,21 @@
       </el-form-item>
     </el-form>
 
-    <el-table border v-loading="loading" :data="courseWatchLogList" @selection-change="handleSelectionChange"  show-summary height="600">
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="courseWatchLogList" @selection-change="handleSelectionChange"  show-summary :summary-method="getSummaries" height="600">
       <el-table-column type="selection" width="55" align="center" />
 <!--        <el-table-column label="会员名称" align="center" prop="fsUserName" />-->
       <el-table-column label="销售名称" align="center" prop="qwUserName" />
@@ -496,7 +510,18 @@
 </template>
 
 <script>
-import { listCourseWatchLog, getCourseWatchLog, delCourseWatchLog, addCourseWatchLog, updateCourseWatchLog, exportCourseWatchLog,statisticsList,qwWatchLogStatisticsList,qwWatchLogAllStatisticsList } from "@/api/course/courseWatchLog";
+import {
+  listCourseWatchLog,
+  getCourseWatchLog,
+  delCourseWatchLog,
+  addCourseWatchLog,
+  updateCourseWatchLog,
+  exportCourseWatchLog,
+  statisticsList,
+  qwWatchLogStatisticsList,
+  qwWatchLogAllStatisticsList,
+  watchLogExport
+} from "@/api/course/courseWatchLog";
 import { courseList,videoList } from '@/api/course/courseRedPacketLog'
 import {getUserList} from "@/api/company/companyUser";
 import {getCompanyList} from "@/api/company/company";
@@ -577,6 +602,55 @@ export default {
     })
   },
   methods: {
+     getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '合计';
+          return;
+        }
+
+        const values = data.map(item => Number(item[column.property]));
+        if (
+          column.property &&
+          [
+            'line', 'firstOnline', 'firstOver',
+            'd1Online', 'd1Over', 'd2Online', 'd2Over',
+            'd3Online', 'd3Over', 'd4Online', 'd4Over',
+            'd5Online', 'd5Over', 'd6Online', 'd6Over',
+            'd7Online', 'd7Over', 'd8Online', 'd8Over',
+            'd9Online', 'd9Over', 'd10Online', 'd10Over',
+            'd11Online', 'd11Over', 'd12Online', 'd12Over',
+            'd13Online', 'd13Over', 'd14Online', 'd14Over',
+            'd15Online', 'd15Over', 'd16Online', 'd16Over',
+            'd17Online', 'd17Over', 'd18Online', 'd18Over',
+            'd19Online', 'd19Over', 'd20Online', 'd20Over',
+            'd21Online', 'd21Over', 'd22Online', 'd22Over',
+            'd23Online', 'd23Over', 'd24Online', 'd24Over',
+            'd25Online', 'd25Over', 'd26Online', 'd26Over',
+            'd27Online', 'd27Over', 'd28Online', 'd28Over',
+            'd29Online', 'd29Over', 'd30Online', 'd30Over'
+          ].includes(column.property)
+        ) {
+          const sum = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + value;
+            } else {
+              return prev;
+            }
+          }, 0);
+
+          sums[index] = sum;
+        } else {
+          sums[index] = '';
+        }
+      });
+
+      return sums;
+    },
     handleSeller(){
       if(this.queryParams.companyId != null) {
         getUserList(this.queryParams.companyId).then(res=>{
@@ -732,7 +806,7 @@ export default {
           type: "warning"
         }).then(() => {
           this.exportLoading = true;
-          return exportCourseWatchLog(queryParams);
+          return watchLogExport(queryParams);
         }).then(response => {
           this.download(response.msg);
           this.exportLoading = false;

+ 35 - 20
src/views/his/statistics/courseReport.vue

@@ -43,18 +43,17 @@
       </el-form-item>
     </el-form>
     <el-row :gutter="10" class="mb8">
-      <!--      <el-col :span="1.5">-->
-      <!--        <el-button-->
-      <!--          type="warning"-->
-      <!--          plain-->
-      <!--          icon="el-icon-download"-->
-      <!--          size="mini"-->
-      <!--          :loading="exportLoading"-->
-      <!--          @click="handleExport"-->
-      <!--          v-hasPermi="['his:packageOrder:export']"-->
-      <!--        >导出</el-button>-->
-      <!--      </el-col>-->
-      <!--      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
+            <el-col :span="1.5">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-download"
+                size="mini"
+                :loading="exportLoading"
+                @click="handleExport"
+              >导出</el-button>
+            </el-col>
+            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <!--    <el-tabs type="card" v-model="actName" @tab-click="handleClickX">-->
     <!--      <el-tab-pane label="全部订单" name="10"></el-tab-pane>-->
@@ -101,7 +100,7 @@
 <script>
 import {
   listPackageOrder, getPackageOrder, delPackageOrder, addPackageOrder, updatePackageOrder, exportPackageOrder,
-  PackageOrderReport, orderReport, courseReport
+  PackageOrderReport, orderReport, courseReport, exportOrderReport, exportCourseReport
 } from "@/api/his/packageOrder";
 import {getCompanyList} from "@/api/company/company";
 import packageOrderDetails from '../../components/his/packageOrderDetails.vue';
@@ -325,15 +324,17 @@ export default {
         this.calculatedTotalData.answerUserCount += Number(item.answerUserCount) || 0;
         this.calculatedTotalData.packetUserCount += Number(item.packetUserCount) || 0;
         this.calculatedTotalData.packetAmount += Number(item.packetAmount) || 0;
-
-        // 看课率和完成率直接累加(求总和)
-        this.calculatedTotalData.watchRate += Number(item.watchRate) || 0;
-        this.calculatedTotalData.finishRate += Number(item.finishRate) || 0;
       });
 
-      // 格式化率值为百分比形式
-      this.calculatedTotalData.watchRate = this.calculatedTotalData.watchRate.toFixed(2) + '%';
-      this.calculatedTotalData.finishRate = this.calculatedTotalData.finishRate.toFixed(2) + '%';
+      if (this.calculatedTotalData.accessCount > 0) {
+        // 看课率 = 看课中人数 / 进线人数
+        this.calculatedTotalData.watchRate = ((this.calculatedTotalData.watchingCount / this.calculatedTotalData.accessCount) * 100).toFixed(2) + '%';
+        // 完课率 = 完课人数 / 进线人数
+        this.calculatedTotalData.finishRate = ((this.calculatedTotalData.finishedCount / this.calculatedTotalData.accessCount) * 100).toFixed(2) + '%';
+      } else {
+        this.calculatedTotalData.watchRate = '0.00%';
+        this.calculatedTotalData.finishRate = '0.00%';
+      }
 
       // 金额格式化
       this.calculatedTotalData.packetAmount = this.calculatedTotalData.packetAmount.toFixed(2);
@@ -451,6 +452,20 @@ export default {
         this.queryParams.eTime = null;
       }
     },
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出会员看课报表', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportCourseReport(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    },
     endChange() {
       if (this.endTime != null) {
         this.queryParams.endStartTime = this.endTime[0];

+ 26 - 13
src/views/his/statistics/orderReport.vue

@@ -43,18 +43,17 @@
       </el-form-item>
     </el-form>
     <el-row :gutter="10" class="mb8">
-      <!--      <el-col :span="1.5">-->
-      <!--        <el-button-->
-      <!--          type="warning"-->
-      <!--          plain-->
-      <!--          icon="el-icon-download"-->
-      <!--          size="mini"-->
-      <!--          :loading="exportLoading"-->
-      <!--          @click="handleExport"-->
-      <!--          v-hasPermi="['his:packageOrder:export']"-->
-      <!--        >导出</el-button>-->
-      <!--      </el-col>-->
-      <!--      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
+            <el-col :span="1.5">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-download"
+                size="mini"
+                :loading="exportLoading"
+                @click="handleExport"
+              >导出</el-button>
+            </el-col>
+            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <!--    <el-tabs type="card" v-model="actName" @tab-click="handleClickX">-->
     <!--      <el-tab-pane label="全部订单" name="10"></el-tab-pane>-->
@@ -94,7 +93,7 @@
 <script>
 import {
   listPackageOrder, getPackageOrder, delPackageOrder, addPackageOrder, updatePackageOrder, exportPackageOrder,
-  PackageOrderReport, orderReport
+  PackageOrderReport, orderReport, exportPackageOrderReport, exportOrderReport
 } from "@/api/his/packageOrder";
 import {getCompanyList} from "@/api/company/company";
 import packageOrderDetails from '../../components/his/packageOrderDetails.vue';
@@ -388,6 +387,20 @@ export default {
         this.queryParams.endEndTime = null;
       }
     },
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出收款统计报表', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportOrderReport(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    },
     endChange() {
       if (this.endTime != null) {
         this.queryParams.endStartTime = this.endTime[0];

+ 26 - 13
src/views/his/statistics/packageOrderReport.vue

@@ -43,18 +43,17 @@
       </el-form-item>
     </el-form>
     <el-row :gutter="10" class="mb8">
-      <!--      <el-col :span="1.5">-->
-      <!--        <el-button-->
-      <!--          type="warning"-->
-      <!--          plain-->
-      <!--          icon="el-icon-download"-->
-      <!--          size="mini"-->
-      <!--          :loading="exportLoading"-->
-      <!--          @click="handleExport"-->
-      <!--          v-hasPermi="['his:packageOrder:export']"-->
-      <!--        >导出</el-button>-->
-      <!--      </el-col>-->
-      <!--      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <!--    <el-tabs type="card" v-model="actName" @tab-click="handleClickX">-->
     <!--      <el-tab-pane label="全部订单" name="10"></el-tab-pane>-->
@@ -90,7 +89,7 @@
 <script>
 import {
   listPackageOrder, getPackageOrder, delPackageOrder, addPackageOrder, updatePackageOrder, exportPackageOrder,
-  PackageOrderReport
+  PackageOrderReport, exportPackageOrderReport
 } from "@/api/his/packageOrder";
 import {getCompanyList} from "@/api/company/company";
 import packageOrderDetails from '../../components/his/packageOrderDetails.vue';
@@ -380,6 +379,20 @@ export default {
       this.queryParams.pageNum=null;
       this.handleQuery();
     },
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出订单报表', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportPackageOrderReport(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    },
     xdChange() {
       if (this.createTime != null) {
         this.queryParams.stTime = this.createTime[0];

+ 26 - 13
src/views/his/statistics/userReport.vue

@@ -60,18 +60,17 @@
 
     </el-form>
     <el-row :gutter="10" class="mb8">
-      <!--      <el-col :span="1.5">-->
-      <!--        <el-button-->
-      <!--          type="warning"-->
-      <!--          plain-->
-      <!--          icon="el-icon-download"-->
-      <!--          size="mini"-->
-      <!--          :loading="exportLoading"-->
-      <!--          @click="handleExport"-->
-      <!--          v-hasPermi="['his:packageOrder:export']"-->
-      <!--        >导出</el-button>-->
-      <!--      </el-col>-->
-      <!--      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
+            <el-col :span="1.5">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-download"
+                size="mini"
+                :loading="exportLoading"
+                @click="handleExport"
+              >导出</el-button>
+            </el-col>
+            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <!--    <el-tabs type="card" v-model="actName" @tab-click="handleClickX">-->
     <!--      <el-tab-pane label="全部订单" name="10"></el-tab-pane>-->
@@ -117,7 +116,7 @@
 <script>
 import {
   listPackageOrder, getPackageOrder, delPackageOrder, addPackageOrder, updatePackageOrder, exportPackageOrder,
-  PackageOrderReport, orderReport, courseReport, userReport
+  PackageOrderReport, orderReport, courseReport, userReport, exportOrderReport, exportUserReport
 } from "@/api/his/packageOrder";
 import {getCompanyList} from "@/api/company/company";
 import packageOrderDetails from '../../components/his/packageOrderDetails.vue';
@@ -441,6 +440,20 @@ export default {
       // 立即执行查询
       this.handleQuery();
     },
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出会员积分报表', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportUserReport(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    },
     xdChange() {
       if (this.createTime != null) {
         this.queryParams.sTime = this.createTime[0];