caiyuqin пре 11 месеци
родитељ
комит
4edfcc1753

+ 8 - 1
src/api/modules/consoleManage.ts

@@ -5,9 +5,16 @@ const manageApi = (axiosInstance: ApiInstance) => ({
     getSearchConfigurationList: (params: any) => axiosInstance.get('/console/searchConfiguration/getSearchConfigurationList', {params}),//查询统一筛选条件列表
     getSearchDefaultList: (params: any) => axiosInstance.get('/console/searchConfiguration/getSearchDefaultList', {params}),//查询页面默认筛选条件列表
     getCompanyListByCompanyId: (params: any) => axiosInstance.get('/console/searchConfiguration/getPartnerCompanyListByCompanyId',{params}),//通过保险公司id查询合作公司的三级列表
-    getTaskMessageNoReadCount: (params: any) => axiosInstance.get('/console/task/getTaskMessageNoReadCount',{params}),//1.查看用户的未读导出任务消息
+    getTaskMessageNoReadCount: (params: any) => axiosInstance.get('/console/task/getTaskMessageNoReadCount',{params}),//查看用户的未读导出任务消息
     getPageTaskList: (params: any) => axiosInstance.post('/console/task/getPageTaskList',params),//用户的导出任务分页列表
     updateReadStatus: (params: any) => axiosInstance.get('/console/task/updateReadStatus',{params}),//更新导出未读任务为已读
+    getDeptListByUserId: (params: any) => axiosInstance.get('/console/searchConfiguration/getDeptListByUserId',{params}),//通过用户id查询机构树
+    getUserManageListByUserId: (params: any) => axiosInstance.get('/console/searchConfiguration/getUserManageListByUserId',{params}),//通过用户id查询管理人树
+    downTaskFile: (params: any) => axiosInstance.get('/console/task/downTaskFile',{params}),//下载导出的excel文件
+
+    companyDataManagePageList: (params: any) => axiosInstance.post('/console/businessDataManage/companyDataManagePageList',params),//列表接口
+    companyDataManageToTask: (params: any) => axiosInstance.post('/console/businessDataManage/companyDataManageToTask',params),//列表导出接口
+
 
   })
 

BIN
src/assets/images/asc.png


BIN
src/assets/images/default.png


BIN
src/assets/images/desc.png


+ 14 - 4
src/layouts/components/Topbar/Toolbar/downLoad/downLoadList.vue

@@ -2,6 +2,7 @@
 import useSettingsStore from "@/store/modules/settings";
 import doIcon from "@/assets/images/download.png";
 import api from "@/api";
+import { Fileonload } from "@/utils/composables/fileProcessing"; //文件处理工具
 defineOptions({
   name: "message",
 });
@@ -63,6 +64,13 @@ const load = () => {
 const handleClose = () => {
   emits("close");
 };
+
+const downLoad = (item) => {
+  if (item.taskStatus == 2) {
+    Fileonload("/console/task/downTaskFile", item.taskName);
+  }
+};
+
 // 暴露给父组件的方法
 defineExpose({
   initDefaultList,
@@ -85,11 +93,11 @@ defineExpose({
 
         <div v-infinite-scroll="load" :infinite-scroll-immediate='false'>
           <div class='list' v-for="(item,index) in taskList" :key="index">
-            <div>
+            <div class='flex-1'>
               <div>{{item.taskName}}</div>
               <div class='time'>导出时间:{{item.uploadDate}}</div>
             </div>
-            <div class='flex items'>
+            <div class='flex items' @click='downLoad(item)'>
               <el-icon v-if='item.taskStatus==2'>
                 <download color='#0083FF' />
               </el-icon>
@@ -97,8 +105,8 @@ defineExpose({
                 <download color='#FF4545' />
               </el-icon>
               <ElImage v-if='item.taskStatus==1' :src="doIcon" :style="`width:16px;height:16px;`" fit="fill" />
-              <div class='text' :style='{color:startsList[item.taskStatus].color}'> {{startsList[item.taskStatus].text}}
-              </div>
+              <div class='text' :style='{color:startsList[item.taskStatus].color}'>
+                {{startsList[item.taskStatus].text}}</div>
             </div>
           </div>
         </div>
@@ -149,6 +157,8 @@ defineExpose({
     justify-content: space-between;
     .items {
       align-items: center;
+      margin-left: 10px;
+      cursor: pointer;
     }
     .text {
       margin-left: 5px;

+ 12 - 26
src/layouts/components/Topbar/Toolbar/downLoad/index.vue

@@ -11,13 +11,13 @@ defineOptions({
 });
 
 onMounted(() => {
-  initDefaultList();
+  initDefaultCount();
 });
 
 //查询数据
 const number = ref();
 const phone = JSON.parse(localStorage.getItem("userInfo")).username;
-const initDefaultList = async () => {
+const initDefaultCount = async () => {
   const { data } = await api.manageApi.getTaskMessageNoReadCount({
     userId: phone,
   });
@@ -30,24 +30,24 @@ const download = async () => {
   const { data } = await api.manageApi.updateReadStatus({
     userId: phone,
   });
+  downLoadRef.value?.initDefaultList();
+  initDefaultCount();
   show.value = true;
 };
 
 const downLoadRef = ref();
-const isVisible=ref(false)
 watch(
   () => userStore.count,
   () => {
-    isVisible.value=true
-    show.value = true;
-    downLoadRef.value?.initDefaultList();
+    initDefaultCount();
   }
 );
 </script>
 
 <template>
-  <span v-if="settingsStore.mode === 'pc'" id="navbarTarget" class="flex-center cursor-pointer px-2 py-1 download-box" @click="download">
-    <ElImage :src="message" :style="`width:15px;height:15px;`" fit="fill" />
+  <span v-if="settingsStore.mode === 'pc'" id="navbarTarget" class="flex-center cursor-pointer px-2 py-1 download-box"
+    @click="download">
+    <ElImage :src="message" class='sort-icon' fit="fill" />
     <div v-if='number' class='message-icon'></div>
   </span>
   <DownLoadList :show='show' @close='show=false' ref='downLoadRef'></DownLoadList>
@@ -56,6 +56,10 @@ watch(
 <style scoped lang="scss">
 .download-box {
   position: relative;
+  .sort-icon {
+    width: 15px;
+    height: 15px;
+  }
   .message-icon {
     position: absolute;
     right: 5px;
@@ -65,23 +69,5 @@ watch(
     border-radius: 50%;
     background: #f5222d;
   }
-
-  /* 过渡动画样式 */
-  .slide-up-enter-from,
-  .slide-up-leave-to {
-    opacity: 0;
-    transform: translateY(100vh); /* 从视口底部开始 */
-  }
-
-  .slide-up-enter-active,
-  .slide-up-leave-active {
-    transition: all 0.8s cubic-bezier(0.25, 0.8, 0.25, 1); /* 平滑的动画曲线 */
-  }
-
-  .slide-up-enter-to,
-  .slide-up-leave-from {
-    opacity: 1;
-    transform: translateY(0); /* 移动到最终位置 */
-  }
 }
 </style>

+ 6 - 5
src/views/consoleManage/businessDataManage/companyDataManage/companyDataManageDetail.vue

@@ -12,6 +12,7 @@
     <!-- 表格 -->
     <ComplexTable :tableData="tableData" :showSelect='false' :columns="listOption.columns" :showIndex="false"
       :columnwidth="120" :pageInfo="pageInfo" @getList="getList" :showOperation="false">
+
     </ComplexTable>
 
     <FilterDialog :show='isShow' @close='isShow=false' @sure='filterSure' ref='filterDialogRef' @selectedKeys='selected'
@@ -67,29 +68,29 @@ const listOption = reactive({
       width: "180",
     },
     {
-      prop: "tag",
+      prop: "tag1",
       label: "订单类型",
       width: "180",
     },
     {
-      prop: "tag",
+      prop: "tag2",
       label: "险种",
       width: "180",
     },
     {
-      prop: "tag",
+      prop: "tag3",
       label: "保费",
       width: "180",
       align: "right",
       sortable: "default",
     },
     {
-      prop: "tag",
+      prop: "tag4",
       label: "录单时间",
       width: "180",
     },
     {
-      prop: "tag",
+      prop: "tag5",
       label: "签单时间",
       width: "180",
     },

+ 95 - 45
src/views/consoleManage/businessDataManage/companyDataManage/index.vue

@@ -15,10 +15,15 @@
       <template v-slot:operation="scope">
         <el-button type="primary" link @click='agreementEdit(scope.operationData.id)'>明细</el-button>
       </template>
+
+      <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='companyDataManage'>
+      routerKey='routerKey'>
     </FilterDialog>
   </div>
 </template>
@@ -26,20 +31,22 @@
 <script setup lang="ts">
 import { useRouter } from "vue-router";
 import api from "@/api";
-import { ElMessage } from "element-plus";
 import QueryForm from "../../components/queryForm.vue";
 import FilterDialog from "../../components/filterDialog.vue";
 import DowButton from "../../components/button.vue";
+import Sort from "../../components/sort.vue";
 import useUserStore from "@/store/modules/message";
 import PageInfo from "@/api/types/agreementTypes";
+import { ElMessage } from "element-plus";
 
 const router = useRouter();
 const userStore = useUserStore();
 const isShow = ref(false);
 
+const isSort = ref();
 const pageInfo = ref({
   pageNum: 1,
-  pageSize: 20,
+  pageSize: 10,
   sizes: [10, 20, 30, 40, 50],
   total: 0,
 });
@@ -50,99 +57,83 @@ const listOption = reactive({
   // 表格列
   columns: [
     {
-      prop: "date",
+      prop: "companyName",
       label: "保险公司",
       width: "200",
     },
     {
-      prop: "name",
+      prop: "partnerCompanyName",
       label: "合作保险公司",
       width: "300",
     },
     {
-      prop: "address",
+      prop: "sumOrderNum",
       label: "订单",
       width: "120",
       align: "right",
-      sortable: "default",
+      sortable: true,
     },
     {
-      prop: "tag",
+      prop: "sumPremium",
       label: "保费",
       width: "180",
       align: "right",
-      sortable: "default",
+      sortable: true,
     },
     {
-      prop: "tag",
+      prop: "djPremium",
       label: "单交保费",
       width: "180",
       align: "right",
-      sortable: "default",
+      sortable: true,
     },
     {
-      prop: "tag",
+      prop: "dsyPremium",
       label: "单商保费",
       width: "180",
       align: "right",
-      sortable: "default",
+      sortable: true,
     },
     {
-      prop: "tag",
+      prop: "dszPremium",
       label: "单三保费",
       width: "180",
       align: "right",
-      sortable: "default",
+      sortable: true,
     },
     {
-      prop: "tag",
+      prop: "jszPremium",
       label: "交三保费",
       width: "180",
       align: "right",
-      sortable: "default",
+      sortable: true,
     },
     {
-      prop: "tag",
+      prop: "jsyPremium",
       label: "交商保费",
       width: "180",
       align: "right",
-      sortable: "default",
+      sortable: true,
     },
   ],
 });
-const tableData = ref([
-  {
-    date: "2016-05-02",
-    name: "1222",
-    address: "123.25",
-    tag: "3222",
-  },
-  {
-    date: "2016-05-02",
-    name: "3222",
-    address: "422.352",
-    tag: "2225",
-  },
-]);
+
 const selectedKeys = ref([]);
 const selected = function (val) {
   selectedKeys.value = val;
 };
 
-//查询
-const query = (item) => {
-  console.log(item);
-};
-
 //查询数据
 const phone = JSON.parse(localStorage.getItem("userInfo")).username;
 
 //获取默认选择数据
+const queryFormRes = ref();
+const routerKey = ref("companyDataManage");
 const defaultList = ref();
 const pageHiddenList = ref([]); //页面不显示的数据
 const initDefaultList = async () => {
   const { data } = await api.manageApi.getSearchDefaultList({
-    routerKey: "companyDataManage",
+    routerKey: routerKey.value,
     userId: phone,
   });
   listOption.queryFormFields = data.filter((e) => e.showFlag);
@@ -150,7 +141,8 @@ const initDefaultList = async () => {
   pageHiddenList.value = data.filter((e) => !e.showFlag);
   defaultList.value = data.map((e) => e.id);
   selectedKeys.value = defaultList.value;
-  queryFormRef.value?.initDefaultSaveForm();
+  queryFormRes.value = queryFormRef.value?.initDefaultSaveForm();
+  queryList();
 };
 
 //删除
@@ -194,18 +186,72 @@ const filterSure = (item, index) => {
   selectedKeys.value = item.list.filter((item) => item.id);
 };
 
-const isVisible = ref(false);
-const downloadFile = () => {
-  isVisible.value = true;
-  userStore.count++;
+const globalSortKey = ref("");
+const globalSortOrder = ref<"asc" | "desc">("asc");
+//  处理子组件传递的排序更新
+const handleSortUpdate = (sortInfo: {
+  key: string;
+  order: string;
+  name: string;
+}) => {
+  globalSortKey.value = sortInfo.key;
+  globalSortOrder.value = sortInfo.order;
+  queryList();
+};
+
+//查询
+const query = (item) => {
+  queryFormRes.value = item;
+  queryList();
+};
+
+//数据查询
+const tableData = ref([]);
+const queryList = async () => {
+  let query = { ...queryFormRes.value };
+  const { data } = await api.manageApi.companyDataManagePageList({
+    pageNo: pageInfo.value.pageNum,
+    pageSize: pageInfo.value.pageSize,
+    routerKey: routerKey.value,
+    userId: phone,
+    orderType: globalSortKey.value
+      ? globalSortKey.value + " " + globalSortOrder.value
+      : "",
+    ...query,
+  });
+  tableData.value = data.records;
+  pageInfo.value.pageNum = data.current;
+  pageInfo.value.pageSize = data.size;
+  pageInfo.value.total = data.total;
 };
 
 //分页事件
 function getList(item: PageInfo) {
   pageInfo.value.pageNum = item.pageNum;
   pageInfo.value.pageSize = item.pageSize;
+  queryList();
 }
 
+//导出
+const downloadFile = async () => {
+  let query = { ...queryFormRes.value };
+  const { data, msg } = await api.manageApi.companyDataManageToTask({
+    pageNo: pageInfo.value.pageNum,
+    pageSize: pageInfo.value.pageSize,
+    routerKey: routerKey.value,
+    userId: phone,
+    orderType: globalSortKey.value
+      ? globalSortKey.value + " " + globalSortOrder.value
+      : "",
+    ...query,
+  });
+  ElMessage({
+    message: msg,
+    type: "success",
+  });
+  userStore.count++;
+};
+
 const agreementEdit = (id) => {
   router.push({
     name: "companyDataManageDetail",
@@ -214,8 +260,9 @@ const agreementEdit = (id) => {
     },
   });
 };
+
 onMounted(() => {
-  initDefaultList();
+ 
 });
 </script>
 
@@ -237,4 +284,7 @@ onMounted(() => {
     justify-content: flex-end;
   }
 }
+:deep(.caret-wrapper) {
+  display: none !important;
+}
 </style>

+ 248 - 140
src/views/consoleManage/businessDataManage/salesmanDataManage/index.vue

@@ -1,170 +1,278 @@
 <template>
   <div class="log">
-    <el-form label-width="100" label-position="left" :model="form">
-      <el-row :gutter="20">
-        <el-col :span="8">
-          <el-form-item label="操作人">
-            <el-input v-model="form.operator" placeholder="请输入操作人姓名查找"></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="操作时间">
-            <el-date-picker
-              v-model="form.operatingTime"
-              type="daterange"
-              range-separator="至"
-              start-placeholder="开始时间"
-              end-placeholder="结束时间"
-              format="YYYY-MM-DD"
-              value-format="YYYY-MM-DD"
-              @change="timeChange"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="操作功能">
-            <el-select v-model="form.function" placeholder="请选择">
-              <el-option label="工能1" value="1" key="1"></el-option>
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="操作内容">
-            <el-input v-model="form.content" placeholder="请输入"></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="16" style="display: flex; align-items: center; justify-content: flex-end">
-          <el-button type="primary" @click="search">查询</el-button>
-          <el-button plain type="primary" @click="reset">重置</el-button>
-        </el-col>
-      </el-row>
-    </el-form>
-    <el-table
-      :data="tableData"
-      height="600"
-      style="margin-top: 24px"
-    >
-      <el-table-column label="操作人" prop="createBy" width="200"></el-table-column  >
-      <el-table-column label="操作时间" prop="createTime" width="240"></el-table-column>
-      <el-table-column label="操作功能" prop="moduleName"></el-table-column>
-      <el-table-column label="操作内容" prop="operationContent"></el-table-column>
-      <el-table-column label="类型" prop="operatorName" width="150"></el-table-column>
-      <el-table-column label="操作" width="150">
-        <template #default="scope">
-          <el-button link type="primary" @click="detail(scope.row)">查看详情</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <div class="pagination">
-      <el-pagination
-        v-model:current-page="pages"
-        v-model:page-size="size"
-        :page-sizes="[10, 20, 30, 40]"
-        layout="total, sizes, prev, pager, next, jumper"
-        :total="total"
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-      ></el-pagination>
+    <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>
+    <QueryForm :option="listOption" @query='query' @delSelect='delSelect' ref='queryFormRef'></QueryForm>
+
+    <div class='flex content-box'>
+      <!-- tree -->
+      <div>
+        <div class='content-l'>
+          <div class='item' v-for='(item,index) in tabList' :key="index" :class="{'active':index==tabIndex}"
+            @click='tabClick(item,index)'>
+            {{item.name}}
+          </div>
+        </div>
+        <Tree ref='treeRef'></Tree>
+      </div>
+
+      <!-- 表格 -->
+      <div class='flex-1 content-r'>
+        <ComplexTable :tableData="tableData" :showSelect='false' :columns="listOption.columns" :showIndex="false"
+          :columnwidth="120" :pageInfo="pageInfo" @getList="getList" :showOperation="false">
+        </ComplexTable>
+      </div>
+    </div>
+
+    <FilterDialog :show='isShow' @close='isShow=false' @sure='filterSure' ref='filterDialogRef' @selectedKeys='selected'
+      routerKey='salesmanDataManage'>
+    </FilterDialog>
   </div>
 </template>
 
 <script setup lang="ts">
-import { useRouter } from 'vue-router'
-import api from '@/api'
-import {ElMessage} from "element-plus";
+import { useRouter } from "vue-router";
+import api from "@/api";
+import { ElMessage } from "element-plus";
+import QueryForm from "../../components/queryForm.vue";
+import FilterDialog from "../../components/filterDialog.vue";
+import DowButton from "../../components/button.vue";
+import Tree from "../../components/tree.vue";
+import useUserStore from "@/store/modules/message";
+import PageInfo from "@/api/types/agreementTypes";
 
-const myRouter = useRouter()
+const tabList = ref([
+  {
+    name: "机构",
+    value: 1,
+    api: api.manageApi.getDeptListByUserId,
+  },
+  {
+    name: "人员",
+    value: 2,
+    api: api.manageApi.getUserManageListByUserId,
+  },
+]);
+const tabIndex = ref(0);
+const router = useRouter();
+const userStore = useUserStore();
+const isShow = ref(false);
 
-let activeName = ref('first')
-const handleClick = () => {
+const pageInfo = ref({
+  pageNum: 1,
+  pageSize: 20,
+  sizes: [10, 20, 30, 40, 50],
+  total: 0,
+});
+const listOption = reactive({
+  rowKey: "salesId",
+  //查询
+  queryFormFields: [],
+  // 表格列
+  columns: [
+    {
+      prop: "date",
+      label: "保险公司",
+      width: "200",
+    },
+    {
+      prop: "name",
+      label: "合作保险公司",
+      width: "300",
+    },
+    {
+      prop: "address",
+      label: "订单",
+      width: "120",
+    },
+    {
+      prop: "tag",
+      label: "车牌号",
+      width: "180",
+    },
+    {
+      prop: "tag",
+      label: "订单类型",
+      width: "180",
+    },
+    {
+      prop: "tag",
+      label: "险种",
+      width: "180",
+    },
+    {
+      prop: "tag",
+      label: "保费",
+      width: "180",
+      align: "right",
+      sortable: "default",
+    },
+    {
+      prop: "tag",
+      label: "录单时间",
+      width: "180",
+    },
+    {
+      prop: "tag",
+      label: "签单时间",
+      width: "180",
+    },
+  ],
+});
+const tableData = ref([
+  {
+    date: "2016-05-02",
+    name: "1222",
+    address: "123.25",
+    tag: "3222",
+  },
+  {
+    date: "2016-05-02",
+    name: "3222",
+    address: "422.352",
+    tag: "2225",
+  },
+]);
+const selectedKeys = ref([]);
+const selected = function (val) {
+  selectedKeys.value = val;
+};
 
-}
+//查询
+const query = (item) => {
+  console.log(item);
+};
 
-let form = ref({})
-const tableProps = ref({
-  value: "id",
-  label: "name",
-  children: "children",
-  checkStrictly: true,
-});
-let option = ref([])
-const timeChange = (val) => {
+//查询数据
+const phone = JSON.parse(localStorage.getItem("userInfo")).username;
 
-}
-// 搜索
-const search = () => {
-  pages.value = 1
-  size.value = 10
-  initData()
-}
-const reset = () => {
-  form.value = {}
-  pages.value = 1
-  size.value = 10
-  initData()
-}
+//获取默认选择数据
+const defaultList = ref();
+const pageHiddenList = ref([]); //页面不显示的数据
+const initDefaultList = async () => {
+  const { data } = await api.manageApi.getSearchDefaultList({
+    routerKey: "salesmanDataManage",
+    userId: phone,
+  });
+  listOption.queryFormFields = data.filter((e) => e.showFlag);
+  pageHiddenList.value = data.filter((e) => !e.showFlag);
+  defaultList.value = data.map((e) => e.id);
+  selectedKeys.value = defaultList.value;
+  queryFormRef.value?.initDefaultSaveForm();
+};
 
-// 列表
-let tableData = ref([])
-const detail = (row) => {
-  myRouter.push({
-    path: '/consoleManage/businessDataManage/salesmanDataManage/salesmanDataManageDetail',
-    query: {
-      id: row.id
-    }
-  })
-}
+//删除
+const filterDialogRef = ref();
+const delSelect = (id) => {
+  listOption.queryFormFields = listOption.queryFormFields.filter(
+    (item) => item.id != id
+  );
+  filterDialogRef.value.initList(
+    [...listOption.queryFormFields, ...pageHiddenList.value],
+    defaultList.value
+  );
+};
 
-// 分页
-let pages = ref(1)
-let size = ref(10)
-let total = ref(0)
-const handleSizeChange = (size) => {
-  size.value = size
-  initData()
-}
-const handleCurrentChange = (page) => {
-  pages.value = page
-  initData()
-}
+//打开dialogShow
+const dialogShow = function () {
+  isShow.value = true;
+  filterDialogRef.value.initList(
+    [...listOption.queryFormFields, ...pageHiddenList.value],
+    defaultList.value
+  );
+};
 
-const initData = () => {
-  api.logApi.list({
-    pages: pages.value,
-    size: size.value,
-    ...form.value
-  }).then((res: any) => {
-    if(res.code === 200) {
-      tableData.value = res.data.records
-      total.value = res.data.total
-    } else {
-      ElMessage({
-        message: res.msg,
-        type: 'warning'
-      })
-    }
-  })
+//确定
+const queryFormRef = ref();
+const filterSure = (item, index) => {
+  isShow.value = false;
+  const secondGroupIds = item.list.map((item) => item.id);
+  const oldList = listOption.queryFormFields.filter((item) =>
+    secondGroupIds.includes(item.id)
+  );
+  const firstGroupIds = listOption.queryFormFields.map((item) => item.id);
+  let newList = item.list.filter((item) => !firstGroupIds.includes(item.id));
+
+  //过滤掉默认不显示的数据
+  const hiddenList = new Set(pageHiddenList.value.map((item) => item.id));
+  const filterList = newList.filter((item) => !hiddenList.has(item.id));
+
+  listOption.queryFormFields = [...oldList, ...filterList];
+  queryFormRef.value?.initDefaultSaveForm();
+  selectedKeys.value = item.list.filter((item) => item.id);
+};
+
+const isVisible = ref(false);
+const downloadFile = () => {
+  isVisible.value = true;
+  userStore.count++;
+};
+
+//分页事件
+function getList(item: PageInfo) {
+  pageInfo.value.pageNum = item.pageNum;
+  pageInfo.value.pageSize = item.pageSize;
 }
 
-onMounted(() => {
-  initData()
-})
+//tabClick
+const treeRef = ref();
+const tabClick = (item, index) => {
+  tabIndex.value = index;
+  treeRef.value?.getTree(item.api);
+};
 
+onMounted(() => {
+  initDefaultList();
+  treeRef.value?.getTree(tabList.value[0].api);
+});
 </script>
 
 <style scoped lang="scss">
-.log{
+.log {
   width: 100%;
   height: calc(100vh - 120px);
-  background: #FFFFFF;
+  background: #ffffff;
   padding: 24px;
   overflow-y: auto;
-  .pagination{
-    margin-top: 24px;
+  .query-btn {
+    margin-left: 20px;
+  }
+  .btn-box {
+    padding-bottom: 15px;
+    margin-bottom: 24px;
+    border-bottom: 1px solid #eeeeee;
     display: flex;
-    align-items: center;
     justify-content: flex-end;
   }
+
+  .content-box {
+    justify-content: space-between;
+    .content-l {
+      width: 298px;
+      display: flex;
+      margin: 20px 16px 20px 0;
+      .item {
+        width: 50%;
+        height: 36px;
+        line-height: 36px;
+        background: #f7f7f7;
+        font-size: 16px;
+        text-align: center;
+        border-radius: 2px;
+      }
+      .active {
+        background: #0083ff;
+        color: #fff;
+      }
+    }
+    .content-r {
+      width: 0;
+    }
+  }
 }
 </style>

+ 12 - 96
src/views/consoleManage/components/filterDialog.vue

@@ -71,96 +71,7 @@ const handleSearchName = (value: string, data: any) => {
 let selectedKeys = ref([]);
 
 // 数据源
-let treeList = ref([
-  // {
-  //   label: "时间",
-  //   id: 1,
-  //   inputType: "date-picker",
-  //   key: "date2",
-  //   defaultValue: "",
-  // },
-  // {
-  //   label: "签单时间",
-  //   id: 2,
-  //   inputType: "date-picker",
-  //   key: "date2",
-  //   defaultValue: "",
-  // },
-  // {
-  //   label: "录单时间",
-  //   id: 3,
-  //   inputType: "date-picker",
-  //   key: "date3",
-  //   defaultValue: "",
-  // },
-  // {
-  //   label: "保险公司",
-  //   id: 4,
-  //   inputType: "select-single",
-  //   key: "test4",
-  //   listOption: [],
-  //   defaultValue: [],
-  //   selectValue: "", //用逗号分开存储的值
-  // },
-  // {
-  //   label: "合作保险公司",
-  //   id: 5,
-  //   inputType: "select-multiple",
-  //   key: "test5",
-  //   listOption: [],
-  //   defaultValue: [],
-  //   selectValue: "", //用逗号分开存储的值
-  // },
-  // {
-  //   label: "业务员类型",
-  //   id: 6,
-  //   inputType: "select-multiple",
-  //   key: "test6",
-  //   listOption: [],
-  //   defaultValue: [],
-  //   selectValue: "", //用逗号分开存储的值
-  // },
-  // {
-  //   label: "协议类型",
-  //   id: 7,
-  //   inputType: "select-multiple",
-  //   key: "test7",
-  //   listOption: [],
-  //   defaultValue: [],
-  //   selectValue: "", //用逗号分开存储的值
-  // },
-  // {
-  //   label: "出单机构",
-  //   id: 8,
-  //   inputType: "date-tree",
-  //   key: "test8",
-  //   listOption: [],
-  //   defaultValue: [],
-  //   defaultProps: {
-  //     children: "children",
-  //     label: "label",
-  //   },
-  //   selectValue: "", //用逗号分开存储的值
-  // },
-  // {
-  //   label: "订单状态",
-  //   id: 9,
-  //   inputType: "select-single",
-  //   key: "test9",
-  //   listOption: [],
-  //   defaultValue: [],
-  //   selectValue: "", //用逗号分开存储的值
-  // },
-  // {
-  //   label: "订单类型",
-  //   id: 10,
-  //   inputType: "select-multiple",
-  //   key: "test10",
-  //   listOption: [],
-  //   defaultValue: [],
-  //   selectValue: "", //用逗号分开存储的值
-  // },
-]);
+let treeList = ref([]);
 const defaultProps = {
   children: "children",
   label: "label",
@@ -281,16 +192,21 @@ const initList = async (list, defaultList) => {
     initDefaultSelect(list);
     selectedList.value = list || [];
   } else {
-    const { data } = await api.manageApi.getSearchConfigurationList({
-      routerKey: props.routerKey,
-      userId: phone,
-    });
-     treeList.value = data;
+    await treeList();
     initDefaultSelect(list);
     selectedList.value = list || [];
   }
 };
-
+const initTreeList = async () => {
+  const { data } = await api.manageApi.getSearchConfigurationList({
+    routerKey: props.routerKey,
+    userId: phone,
+  });
+  treeList.value = data;
+};
+onMounted(() => {
+  initTreeList();
+});
 defineExpose({
   initEditData,
   initList,

+ 100 - 41
src/views/consoleManage/components/queryForm.vue

@@ -21,10 +21,10 @@
 
         <!-- select -->
         <el-form-item :label="option.label" class='form-select-single  r-24 border position-box'
-          v-if="option.inputType == 'select-single' || option.selectType=='1'" @mouseenter="option.isShowDelIcon = true"
+          v-if="option.inputType == 'select-single'" @mouseenter="option.isShowDelIcon = true"
           @mouseleave="option.isShowDelIcon = false">
           <el-select class='min-w ' v-model="queryForm.data[option.key]" placeholder=""
-            @change='singleChange($event,option)' clearable>
+            @change='singleChange($event,option)'>
             <el-option v-for="item in option.listOption" :key="item.value" :label="item.label" :value="item.value">
             </el-option>
           </el-select>
@@ -39,10 +39,10 @@
 
         <!-- select 多选-->
         <el-form-item :label="option.label" class='form-select-multiple  r-24 border position-box'
-          v-if="option.inputType == 'select-multiple' || option.selectType=='2'"
-          @mouseenter="option.isShowDelIcon = true" @mouseleave="option.isShowDelIcon = false">
+          v-if="option.inputType == 'select-multiple'" @mouseenter="option.isShowDelIcon = true"
+          @mouseleave="option.isShowDelIcon = false">
           <el-select class='min-w' multiple v-model="queryForm.data[option.key]" value-key="value" placeholder=""
-            @change='moreChange($event,option,option.listOption)' clearable>
+            @change='moreChange($event,option,option.listOption)'>
             <el-option v-for="item in option.listOption" :key="item.value" :label="item.label" :value="item.value">
             </el-option>
             <template #tag>
@@ -144,9 +144,7 @@
 import { useRouter } from "vue-router";
 import { timestampFormat } from "@/utils/dayjs";
 import api from "@/api";
-
 const emit = defineEmits(["query", "delSelect"]);
-
 const props = defineProps({
   option: {
     type: Object,
@@ -213,38 +211,58 @@ const shortcuts = [
 ];
 //获取默认值
 const propsOption = props.option;
+const isEmptyValue = (value) => {
+  return (
+    value == null ||
+    value == undefined ||
+    (Array.isArray(value) && value.length === 0)
+  );
+};
 const initDefaultSaveForm = () => {
-  let defaultSaveForm = {};
-  propsOption.queryFormFields.forEach((item) => {
-    let key = item.key;
-    let val = item.defaultValue;
-    if (item.inputType == "date-picker" && !val) {
-      const start = new Date();
-      defaultSaveForm[key] = [
-        timestampFormat(start.getTime()),
-        timestampFormat(start.getTime()),
-      ];
-    } else if (item.inputType == "date-year") {
-      const start = new Date();
-      defaultSaveForm[key] = [timestampFormat(start.getTime(), "YYYY")];
-    } else {
-      let mul = item.inputType == "select-multiple";
-      let sin = item.inputType == "select-single";
-      if (mul || sin) {
-        defaultSaveForm[key] = item.listOption ? val : "";
-      } else {
-        defaultSaveForm[key] = val;
-      }
-      if (mul) {
-        defaultSaveForm[key] = [val];
+  const defaultSaveForm = {};
+  const { queryFormFields = [] } = propsOption;
+  const currentTimestamp = Date.now();
+  const formatTime = (timestamp, format = "") => {
+    return timestampFormat(timestamp, format);
+  };
+  // 处理不同输入类型
+  const typeHandlers = {
+    "date-picker": (item, baseValue) => {
+      if (isEmptyValue(baseValue)) {
+        const defaultTime = formatTime(currentTimestamp);
+        return [defaultTime, defaultTime];
       }
-      if (sin && item.isFirst) {
-        singleChange(0, item);
+      return baseValue;
+    },
+    "date-year": () => {
+      return [formatTime(currentTimestamp, "YYYY")];
+    },
+    "select-multiple": (item, baseValue) => {
+      const value = item.listOption ? baseValue : "";
+      return value === "0" ? ["0"] : value;
+    },
+    "select-single": (item, baseValue) => {
+      const value = item.listOption ? baseValue : "";
+      if (item.isFirst) {
+        singleChange(baseValue, item);
       }
-    }
+      return value;
+    },
+    default: (_, baseValue) => baseValue,
+  };
+
+  queryFormFields.forEach((item) => {
+    if (!item?.key) return;
+    const { key, inputType } = item;
+    const baseValue = queryForm.data[key] ?? item.defaultValue;
+
+    const handler = typeHandlers[inputType] || typeHandlers.default;
+    defaultSaveForm[key] = handler(item, baseValue);
   });
-  queryForm.data = Object.assign({}, defaultSaveForm);
-  console.log(queryForm.data);
+
+  // 更新表单数据并返回
+  queryForm.data = { ...defaultSaveForm };
+  return queryForm.data;
 };
 
 //多选中发生变化
@@ -274,15 +292,15 @@ const singleChange = async (val, option) => {
     const { data } = await api.manageApi.getCompanyListByCompanyId({
       companyId: val,
     });
-    queryForm.data.partnerCompanyIds = "";
     propsOption.queryFormFields.forEach((e) => {
       if (e.key == "partnerCompanyIds") {
-        e.selectValue = "";
         e.listOption = data;
         e.listOption.unshift({
           value: "0",
           label: "全部",
         });
+        e.selectValue = "全部";
+        queryForm.data.partnerCompanyIds = ["0"];
       }
     });
   }
@@ -290,13 +308,54 @@ const singleChange = async (val, option) => {
 
 //查询
 const query = () => {
-  emit("query", queryForm.data);
-};
+  const from = { ...queryForm.data };
+  const { queryFormFields } = propsOption;
 
+  const typeHandlers = {
+    "select-single": (item, value) => {
+      // 特殊处理companyId,其他单选转换为数组格式
+      return item.key === "companyId" ? value : [value || "0"];
+    },
+    "date-tree": (item, value) => {
+      // 日期树选择器:无默认值时转换为空数组
+      return item.selectValue ? value : [];
+    },
+    "select-multiple": (item, value) => {
+      // 多选框:无默认值时转换为空数组
+      return item.defaultValue ? value : [];
+    },
+    "date-picker": (item, value) => {
+      // 日期选择器:无值时转换为空数组
+      return value ? value : [];
+    },
+    "date-year": (item, value) => {
+      // 年份选择器:确保始终返回数组格式
+      if (!value) return [];
+      return Array.isArray(value) ? value : [value];
+    },
+  };
+
+  queryFormFields.forEach((item) => {
+    const { inputType, key } = item;
+    const handler = typeHandlers[inputType];
+    if (handler) {
+      from[key] = handler(item, from[key]);
+    }
+  });
+  emit("query", from);
+};
 //删除
 const del = (option) => {
-  queryForm.data[option.key] = "";
-  emit("delSelect", option.id);
+  const { inputType, key, id } = option;
+  const isInputOrCompanyId = inputType === "input" || key === "companyId";
+
+  if (isInputOrCompanyId) {
+    queryForm.data[key] = "";
+  } else {
+    option.selectValue = "";
+    queryForm.data[key] = [];
+  }
+  emit("delSelect", id);
 };
 
 // 暴露给父组件的方法

+ 72 - 0
src/views/consoleManage/components/sort.vue

@@ -0,0 +1,72 @@
+
+<template>
+  <div>
+    <span class='label'> {{ scope.label }}</span>
+    <span v-if='scope.sortable' @click='toggleSort(scope)'>
+      <template v-if="globalSortKey == scope.prop">
+        <ElImage v-if="props.globalSortOrder == 'asc'" :src="asc" class='sort-icon' />
+        <ElImage v-else-if="props.globalSortOrder == 'desc'" :src="desc" class='sort-icon' />
+      </template>
+      <template v-else>
+        <ElImage :src="def" class='sort-icon' />
+      </template>
+    </span>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useRouter } from "vue-router";
+import asc from "@/assets/images/asc.png";
+import desc from "@/assets/images/desc.png";
+import def from "@/assets/images/default.png";
+
+const emits = defineEmits(["update:sort"]);
+const props = defineProps({
+  scope: {
+    type: Object,
+    default: () => {},
+  },
+  globalSortKey: {
+    type: String,
+    default: "",
+  },
+  globalSortOrder: {
+    type: String,
+    default: "asc",
+  },
+});
+
+const toggleSort = (row: { prop: string }) => {
+  const targetProp = row.prop;
+  let newKey = targetProp;
+  let newOrder: "asc" | "desc" = "asc";
+
+  if (props.globalSortKey === targetProp) {
+    newOrder = props.globalSortOrder === "asc" ? "desc" : "asc";
+    if (props.globalSortOrder === "desc") {
+      newKey = ""; // 清空排序列
+      newOrder = "asc"; // 重置方向
+    }
+  } else {
+    newKey = targetProp;
+    newOrder = "asc";
+  }
+  emits("update:sort", { key: newKey, order: newOrder ,name:row.prop});
+};
+
+// 暴露给父组件的方法
+defineExpose({});
+</script>
+
+<style scoped lang="scss">
+:deep(.caret-wrapper) {
+  display: none !important;
+}
+.label {
+  margin-right: 6px;
+}
+.sort-icon {
+  width: 14px;
+  height: 14px;
+}
+</style>

+ 53 - 0
src/views/consoleManage/components/tree.vue

@@ -0,0 +1,53 @@
+
+<template>
+  <div class="tree-list">
+    <el-tree :data="treeList" :props="defaultProps" :show-checkbox='isCheckbox' @check-change="handleCheckChange"
+      highlight-current @node-click="treeClick" />
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useRouter } from "vue-router";
+const emits = defineEmits(["nodeId"]);
+const props = defineProps({
+  isCheckbox: {
+    type: Boolean,
+    default: false,
+  },
+});
+const defaultProps = {
+  label: "name",
+  children: "children",
+};
+
+const treeList = ref([]);
+const handleCheckChange = (data, checked) => {};
+
+const treeClick = (node, val) => {
+  emits("nodeId", node.id);
+};
+const phone = JSON.parse(localStorage.getItem("userInfo")).username;
+const getTree = async (api) => {
+  const { data } = await api({
+    userId: phone,
+  });
+  treeList.value = data;
+};
+// 暴露给父组件的方法
+defineExpose({ getTree });
+</script>
+
+<style scoped lang="scss">
+:deep(
+    .el-tree--highlight-current
+      .el-tree-node.is-current
+      > .el-tree-node__content
+  ) {
+  background-color: #f6fbff; /* 例如: #42b983 */
+  border-right: 2px solid #0083ff;
+}
+
+:deep(.el-tree .el-tree-node > .el-tree-node__content) {
+  height: 32px;
+}
+</style>