Преглед на файлове

数据报表-业务员报表详情接口对接

祁鹏飞 преди 1 месец
родител
ревизия
28bba1c73a

+ 4 - 3
src/views/consoleManage/personDataManage/salesmanReport/index.vue

@@ -14,7 +14,7 @@
       <ComplexTable :tableData="tableData" :showSelect='false' :columns="listOption.columns" :showIndex="false"
         :columnwidth="120" :pageInfo="pageInfo" @getList="getList">
         <template v-slot:operation="scope">
-          <el-button type="primary" link @click='agreementEdit(scope.operationData.id)'>明细</el-button>
+          <el-button type="primary" link @click='agreementEdit(scope.operationData.mobile)'>明细</el-button>
         </template>
 
         <template v-slot:search="scope">
@@ -283,11 +283,12 @@ const downloadFile = async () => {
   userStore.count++;
 };
 
-const agreementEdit = (id) => {
+const agreementEdit = (mobile) => {
   router.push({
     name: "salesmanReportDetail",
     query: {
-      id: id,
+      mobile: mobile,
+      ...queryFormRes.value
     },
   });
 };

+ 73 - 39
src/views/consoleManage/personDataManage/salesmanReport/salesmanReportDetail.vue

@@ -1,33 +1,33 @@
 <template>
   <div class="log">
     <PageMain class="vh100">
-    <div class='btn-box'>
-      <el-button type="primary" plain class='query-btn'
-        @click='dialogShow'>{{selectedKeys.length?`已选${selectedKeys.length}项`:'筛选条件'}}</el-button>
-      <div class='query-btn'>
-        <DowButton @endAnim='downloadFile'></DowButton>
+      <div class='btn-box'>
+        <el-button type="primary" plain class='query-btn'
+          @click='dialogShow'>{{ selectedKeys.length ? `已选${selectedKeys.length}项` : '筛选条件' }}</el-button>
+        <div class='query-btn'>
+          <DowButton @endAnim='downloadFile'></DowButton>
+        </div>
       </div>
-    </div>
-    <QueryForm :option="listOption" @query='query' @delSelect='delSelect' ref='queryFormRef'></QueryForm>
+      <QueryForm :option="listOption" @query='query' @delSelect='delSelect' ref='queryFormRef'></QueryForm>
 
-    <!-- 表格 -->
-    <ComplexTable :tableData="tableData" :showSelect='false' :columns="listOption.columns" :showIndex="false"
-      :columnwidth="120" :pageInfo="pageInfo" @getList="getList" :showOperation='false'>
-      <template v-slot:search="scope">
-        <Sort :scope="scope.slotData" :globalSortKey="globalSortKey" :globalSortOrder="globalSortOrder"
-          @update:sort="handleSortUpdate"></Sort>
-      </template>
-    </ComplexTable>
+      <!-- 表格 -->
+      <ComplexTable :tableData="tableData" :showSelect='false' :columns="listOption.columns" :showIndex="false"
+        :columnwidth="120" :pageInfo="pageInfo" @getList="getList" :showOperation='false'>
+        <template v-slot:search="scope">
+          <Sort :scope="scope.slotData" :globalSortKey="globalSortKey" :globalSortOrder="globalSortOrder"
+            @update:sort="handleSortUpdate"></Sort>
+        </template>
+      </ComplexTable>
 
-    <FilterDialog :show='isShow' @close='isShow=false' @sure='filterSure' ref='filterDialogRef' @selectedKeys='selected'
-      routerKey='routerKey'>
-    </FilterDialog>
+      <FilterDialog :show='isShow' @close='isShow = false' @sure='filterSure' ref='filterDialogRef'
+        @selectedKeys='selected' routerKey='routerKey'>
+      </FilterDialog>
     </PageMain>
   </div>
 </template>
 
 <script setup lang="ts">
-import { useRouter } from "vue-router";
+import { useRoute } from "vue-router";
 import api from "@/api";
 import QueryForm from "../../components/queryForm.vue";
 import FilterDialog from "../../components/filterDialog.vue";
@@ -37,7 +37,7 @@ import useUserStore from "@/store/modules/message";
 import PageInfo from "@/api/types/agreementTypes";
 import { ElMessage } from "element-plus";
 
-const router = useRouter();
+const route = useRoute();
 const userStore = useUserStore();
 const isShow = ref(false);
 
@@ -55,12 +55,12 @@ const listOption = reactive({
   // 表格列
   columns: [
     {
-      prop: "salesmanName",
+      prop: "name",
       label: "业务员",
-      width: "100",
+      width: "120",
     },
     {
-      prop: "salesmanPhone",
+      prop: "mobile",
       label: "手机号",
       width: "120",
     },
@@ -70,7 +70,7 @@ const listOption = reactive({
       width: "120",
     },
     {
-      prop: "partnerCompanyName",
+      prop: "partnerCompany",
       label: "合作保险公司",
       width: "300",
     },
@@ -85,24 +85,24 @@ const listOption = reactive({
       width: "180",
     },
     {
-      prop: "orderTypeName",
+      prop: "entryStatus",
       label: "订单类型",
       width: "180",
     },
     {
-      prop: "riskName",
+      prop: "productName",
       label: "险种",
       width: "180",
     },
     {
-      prop: "sumPremium",
+      prop: "premium",
       label: "保费",
       width: "180",
       align: "right",
       sortable: true,
     },
     {
-      prop: "orderCommissionPremium",
+      prop: "commission",
       label: "出单佣金",
       width: "180",
       align: "right",
@@ -114,15 +114,15 @@ const listOption = reactive({
       width: "180",
     },
     {
-      prop: "recordTime",
+      prop: "signTime",
       label: "签单时间",
       width: "180",
     },
-    {
-      prop: "manegerName",
-      label: "管理人",
-      width: "180",
-    },
+    // {
+    //   prop: "manegerName",
+    //   label: "管理人",
+    //   width: "180",
+    // },
   ],
 });
 
@@ -139,20 +139,46 @@ const queryFormRes = ref();
 const routerKey = ref("salesmanReportDetail");
 const defaultList = ref();
 const pageHiddenList = ref([]); //页面不显示的数据
+const isFilterFrom = ref(); //主页面查询条件且在过滤中不存在
+
 const initDefaultList = async () => {
   const { data } = await api.manageApi.getSearchDefaultList({
     routerKey: routerKey.value,
     userId: phone,
   });
-  listOption.queryFormFields = data.filter((e) => e.showFlag);
 
-  pageHiddenList.value = data.filter((e) => !e.showFlag);
-  defaultList.value = data.map((e) => e.id);
+  const queryParamsMap = route.query;
+  const processedData = data.map((item) => {
+    if (queryParamsMap.hasOwnProperty(item.key)) {
+      let defaultValue = queryParamsMap[item.key]
+      return { ...item, defaultValue };
+    }
+    return item;
+  });
+
+  let filterFrom = {};
+  processedData.map((item) => {
+    filterFrom[item.key] = item.defaultValue;
+  });
+  isFilterFrom.value = getUniqueProperties(queryParamsMap, filterFrom);
+
+  listOption.queryFormFields = processedData.filter((e) => e.showFlag);
+  pageHiddenList.value = processedData.filter((e) => !e.showFlag);
+  defaultList.value = processedData.map((e) => e.id);
   selectedKeys.value = defaultList.value;
   queryFormRes.value = queryFormRef.value?.initDefaultSaveForm();
   queryList();
 };
 
+const getUniqueProperties = (obj1, obj2) => {
+  const uniqueProps = {};
+  Object.keys(obj1).forEach((key) => {
+    if (!(key in obj2) || obj2[key] == undefined) {
+      uniqueProps[key] = obj1[key];
+    }
+  });
+  return uniqueProps;
+};
 //删除
 const filterDialogRef = ref();
 const delSelect = (id) => {
@@ -216,16 +242,19 @@ const query = (item) => {
 //数据查询
 const tableData = ref([]);
 const queryList = async () => {
-  let query = { ...queryFormRes.value };
+  let query = { ...queryFormRes.value, ...isFilterFrom.value };
   const { data } = await api.manageApi.salesmanReportDetailPageList({
     pageNo: pageInfo.value.pageNum,
     pageSize: pageInfo.value.pageSize,
     routerKey: routerKey.value,
+    systemCode: localStorage.getItem('login_system'),
     userId: phone,
     orderType: globalSortKey.value
       ? globalSortKey.value + " " + globalSortOrder.value
       : "",
     ...query,
+    signTimeBegin: query.signTime[0] ?? '',
+    signTimeEnd: query.signTime[1] ?? '',
   });
   tableData.value = data.records;
   pageInfo.value.pageNum = data.current;
@@ -242,16 +271,19 @@ function getList(item: PageInfo) {
 
 //导出
 const downloadFile = async () => {
-  let query = { ...queryFormRes.value };
+  let query = { ...queryFormRes.value, ...isFilterFrom.value };
   const { data, msg } = await api.manageApi.salesmanReportDetailToTask({
     pageNo: pageInfo.value.pageNum,
     pageSize: pageInfo.value.pageSize,
     routerKey: routerKey.value,
+    systemCode: localStorage.getItem('login_system'),
     userId: phone,
     orderType: globalSortKey.value
       ? globalSortKey.value + " " + globalSortOrder.value
       : "",
     ...query,
+    signTimeBegin: query.signTime[0] ?? '',
+    signTimeEnd: query.signTime[1] ?? '',
   });
   ElMessage({
     message: msg,
@@ -270,6 +302,7 @@ onMounted(() => {
   .query-btn {
     margin-left: 20px;
   }
+
   .btn-box {
     padding-bottom: 15px;
     margin-bottom: 24px;
@@ -278,6 +311,7 @@ onMounted(() => {
     justify-content: flex-end;
   }
 }
+
 :deep(.caret-wrapper) {
   display: none !important;
 }

+ 28 - 113
vite.config.ts

@@ -1,126 +1,41 @@
-import fs from "node:fs";
-import path from "node:path";
-import process from "node:process";
-import dayjs from "dayjs";
-import { defineConfig, loadEnv } from "vite";
-import pkg from "./package.json";
-import createVitePlugins from "./vite/plugins";
+import fs from 'node:fs'
+import path from 'node:path'
+import process from 'node:process'
+import dayjs from 'dayjs'
+import { defineConfig, loadEnv } from 'vite'
+import pkg from './package.json'
+import createVitePlugins from './vite/plugins'
 
 // https://vitejs.dev/config/
 export default defineConfig(({ mode, command }) => {
-  const env = loadEnv(mode, process.cwd());
+  const env = loadEnv(mode, process.cwd())
   // 全局 scss 资源
-  const scssResources: string[] = [];
-  fs.readdirSync("src/assets/styles/resources").forEach((dirname) => {
+  const scssResources: string[] = []
+  fs.readdirSync('src/assets/styles/resources').forEach((dirname) => {
     if (fs.statSync(`src/assets/styles/resources/${dirname}`).isFile()) {
-      scssResources.push(
-        `@use "/src/assets/styles/resources/${dirname}" as *;`
-      );
+      scssResources.push(`@use "/src/assets/styles/resources/${dirname}" as *;`)
     }
-  });
+  })
   return {
     // 静态资源基础路径
-    base: env.VITE_BASE_PATH || "/",
+    base: env.VITE_BASE_PATH || '/',
     // 开发服务器选项 https://cn.vitejs.dev/config/server-options
     server: {
       open: true,
-      host: "0.0.0.0", // 监听所有接口
+      host: '0.0.0.0', // 监听所有接口
       port: 9000,
       proxy: {
-        "/proxy": {
+        '/proxy': {
           target: env.VITE_APP_API_BASEURL,
-          changeOrigin: command === "serve" && env.VITE_OPEN_PROXY === "true",
-          rewrite: (path) => path.replace(/\/proxy/, ""),
+          changeOrigin: command === 'serve' && env.VITE_OPEN_PROXY === 'true',
+          rewrite: path => path.replace(/\/proxy/, ''),
         },
       },
     },
     // 构建选项 https://cn.vitejs.dev/config/build-options
     build: {
-      outDir: mode === "production" ? "dist" : `dist-${mode}`,
-      sourcemap: env.VITE_BUILD_SOURCEMAP === "true",
-      minify: "terser",
-      terserOptions: {
-        compress: {
-          drop_console: true,
-          drop_debugger: true,
-          pure_funcs: ["console.log", "console.table"], // 可选
-        },
-      },
-      rollupOptions: {
-        output: {
-          manualChunks(id) {
-            // Vue 核心生态:稳定、基础、几乎不变
-            if (
-              id.includes("node_modules/vue") ||
-              id.includes("node_modules/pinia") ||
-              id.includes("node_modules/vue-router") ||
-              id.includes("node_modules/@vue/")
-            ) {
-              return "vendor-vue";
-            }
-
-            // Element Plus 及其关联 UI 组件
-            if (
-              id.includes("node_modules/element-plus") ||
-              id.includes("node_modules/@element-plus") ||
-              id.includes("node_modules/floating-vue") ||
-              id.includes("node_modules/@headlessui") ||
-              id.includes("node_modules/overlayscrollbars") ||
-              id.includes("node_modules/vue-m-message")
-            ) {
-              return "vendor-ui";
-            }
-
-            // VueUse 全家桶
-            if (id.includes("node_modules/@vueuse/")) {
-              return "vendor-vueuse";
-            }
-
-            // ECharts(独立大体积,按需更新)
-            if (
-              id.includes("node_modules/echarts") ||
-              id.includes("node_modules/zrender")
-            ) {
-              return "vendor-echarts";
-            }
-
-            // 办公文档处理相关(一般只有特定页面用,可异步加载)
-            if (
-              id.includes("node_modules/@vue-office") ||
-              id.includes("node_modules/jszip") ||
-              id.includes("node_modules/html2canvas") ||
-              id.includes("node_modules/file-saver")
-            ) {
-              return "vendor-office";
-            }
-
-            // 通用工具库:使用频繁、体积适中、变更少
-            if (
-              id.includes("node_modules/axios") ||
-              id.includes("node_modules/lodash-es") ||
-              id.includes("node_modules/dayjs") ||
-              id.includes("node_modules/qs") ||
-              id.includes("node_modules/mitt") ||
-              id.includes("node_modules/decimal.js") ||
-              id.includes("node_modules/defu") ||
-              id.includes("node_modules/scule") ||
-              id.includes("node_modules/path-to-regexp") ||
-              id.includes("node_modules/chinese-days") ||
-              id.includes("node_modules/js-pinyin") ||
-              id.includes("node_modules/hotkeys-js") ||
-              id.includes("node_modules/nprogress") ||
-              id.includes("node_modules/mockjs")
-            ) {
-              return "vendor-utils";
-            }
-
-            // 其它第三方库(较小的、非核心)
-            if (id.includes("node_modules")) {
-              return "vendor-misc";
-            }
-          },
-        },
-      },
+      outDir: mode === 'production' ? 'dist' : `dist-${mode}`,
+      sourcemap: env.VITE_BUILD_SOURCEMAP === 'true',
     },
     define: {
       __SYSTEM_INFO__: JSON.stringify({
@@ -129,26 +44,26 @@ export default defineConfig(({ mode, command }) => {
           dependencies: pkg.dependencies,
           devDependencies: pkg.devDependencies,
         },
-        lastBuildTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+        lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
       }),
     },
-    plugins: createVitePlugins(mode, command === "build"),
+    plugins: createVitePlugins(mode, command === 'build'),
     resolve: {
       alias: {
-        "@": path.resolve(__dirname, "src"),
-        "#": path.resolve(__dirname, "src/types"),
+        '@': path.resolve(__dirname, 'src'),
+        '#': path.resolve(__dirname, 'src/types'),
       },
     },
     optimizeDeps: {
-      include: ["@vue-office/docx", "vue-demi"],
+      include: ['@vue-office/docx', 'vue-demi'],
     },
     css: {
       preprocessorOptions: {
         scss: {
-          api: "modern-compiler",
-          additionalData: scssResources.join(""),
+          api: 'modern-compiler',
+          additionalData: scssResources.join(''),
         },
       },
     },
-  };
-});
+  }
+})