caichengyu 2 недель назад
Родитель
Сommit
dcf564a151

+ 2 - 0
src/api/api.js

@@ -6,6 +6,7 @@ import dictType from "../api/dict/dictType";
 import customer from "../api/business/customer";
 import order from "../api/business/order";
 import task from "../api/business/task";
+import dataAnalysis from "../api/business/dataAnalysis";
 // 导入对应模块------------------------
 export default {
   ...menu,
@@ -16,4 +17,5 @@ export default {
   ...customer,
   ...order,
   ...task,
+  ...dataAnalysis,
 };

+ 21 - 0
src/api/business/dataAnalysis.js

@@ -0,0 +1,21 @@
+import request from '@/utils/request' 
+
+export default {
+    // 数据分析-新客户统计-列表
+    getNewCustomerList(data) {
+        return request({
+            url: `/system/Statistical/newCompany/list`,
+            method: 'get',
+            params: data
+        })
+    },
+
+    // 数据分析-新客户统计-详情
+    getNewCustomerDetail(data) {
+        return request({
+            url: `/system/Statistical/newCompany/detail`,
+            method: 'get',
+            params: data
+        })
+    }
+}

+ 25 - 1
src/api/business/order.js

@@ -273,5 +273,29 @@ export default {
             method: 'post',
             data
         })
-    }
+    },
+    // 财务-订单导出
+    financeorderexport(data) {
+        return request({
+            url: '/finance/order/export',
+            method: 'post',
+            data
+        })
+    },
+    // 学习记录列表
+    orderpersonstudy(data) {
+        return request({
+            url: '/order/person/study',
+            method: 'get',
+            params: data
+        })
+    },
+    // 学员学习记录导出
+    orderpersonstudyexport(data) {
+        return request({
+            url: '/order/person/study/export',
+            method: 'get',
+            params: data
+        })
+    },
 }

+ 1 - 1
src/components/searchBoxNew.vue

@@ -67,7 +67,7 @@
     <div class="inputListBoxs">
       <div
         class="fon_s"
-        style="padding-top: 10px; width: 70px; text-align: end"
+        style="padding-top: 8px; width: 70px; text-align: end"
         v-if="!redIcon"
       >
         筛选:

+ 16 - 5
src/components/tableList.vue

@@ -150,7 +150,9 @@
         :key="index"
       >
         <template slot-scope="scope">
-          <div class="imgboxsq" v-if="item.scope === 'img'">
+           <!-- 新增:兼容 formatter 格式化函数,优先级最高 -->
+          <span v-if="item.formatter">{{ item.formatter(scope.row) }}</span>
+          <div class="imgboxsq" v-else-if="item.scope === 'img'">
             <img
               style="height: 60px; width: 60px"
               v-if="!scope.row[item.prop]"
@@ -1685,16 +1687,25 @@ export default {
       this.checkedCities = [];
       this.checkAll = true;
       this.isIndeterminate = false;
+
+  // 👇 关键修复:不再用JSON序列化,保留formatter
+  const originTableSet = JSON.parse(this.inittableSet);
+  this.tableSet.forEach((item, index) => {
+    const target = originTableSet.find(o => o.label === item.label);
+    if (target) target.formatter = item.formatter; // 把函数还回去
+  });
+  this.tableSet = originTableSet;
+
       this.tableSet.forEach((item, index) => {
         this.cities.push(item.label);
         if (item.hidden) {
           this.checkedCities.push(item.label);
         }
       });
-      this.tableSet = [];
-      this.$nextTick(() => {
-        this.tableSet = JSON.parse(this.inittableSet);
-      });
+      // this.tableSet = [];
+      // this.$nextTick(() => {
+      //   this.tableSet = JSON.parse(this.inittableSet);
+      // });
       if (this.checkedCities.length === 0) {
         this.isIndeterminate = false;
       } else if (this.checkedCities.length === this.cities.length) {

+ 2 - 2
src/layout/components/Navbar.vue

@@ -74,9 +74,9 @@
           <i class="el-icon-caret-bottom" />
         </div>
         <el-dropdown-menu slot="dropdown">
-          <router-link to="/user/profile">
+          <!-- <router-link to="/user/profile">
             <el-dropdown-item>个人中心</el-dropdown-item>
-          </router-link>
+          </router-link> -->
           <el-dropdown-item @click.native="setting = true">
             <span>布局设置</span>
           </el-dropdown-item>

+ 1 - 1
src/utils/request.js

@@ -10,7 +10,7 @@ axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
 // 创建axios实例
 // export const baseURL = process.env.VUE_APP_BASE_API
 export const BASE_IMG_URL = process.env.VUE_APP_IMG_API
-export const baseURL = 'http://192.168.1.123:6088'
+export const baseURL = 'http://192.168.1.123:6088/'
 // export const baseURL = 'https://cloud.xyyxt.net/'
 // export const BASE_IMG_URL = 'https://file.xyyxt.net'
 const service = axios.create({

+ 4 - 1
src/views/customer/customerSea/index.vue

@@ -17,7 +17,7 @@
       <template slot="btn" slot-scope="props">
         <el-button type="text" @click="addClick(props.scope.row, 2)">编辑</el-button>
         <!-- <el-button type="text" @click="del(props.scope.row)">删除</el-button> -->
-        <el-button type="text" @click="claim(props.scope.row)">领取客户</el-button>
+        <el-button type="text" v-if="!props.scope.row.userId" @click="claim(props.scope.row)">领取客户</el-button>
       </template>
     </table-list>
     <pagination
@@ -216,6 +216,9 @@ export default {
         { label: "客户状态", prop: "status", hidden: true, scope: "isOptions",
           options: [{ label: "活跃", value: 1 },{ label: "锁定", value: 2 }]
         },
+        { label: "领取状态", prop: "userId", hidden: true, 
+        formatter: (row) => row.userId ? "已领取" : "未领取",
+        },
         { label: "二建证书数量", prop: "ejCount", hidden: true },
         { label: "abc证书数量", prop: "abcCount", hidden: true },
         { label: "安全生产许可证号", prop: "azCertificateNumber", hidden: true },

+ 1 - 1
src/views/customer/index.vue

@@ -499,7 +499,7 @@ export default {
             provinceCode: v.provinceCode,
             cityCode: v.cityCode,
           };
-          this.listData = v;
+          this.listData = {...v};
           this.dialog = true;
         }
       }

+ 2 - 2
src/views/customer/staffCertificate/index.vue

@@ -81,12 +81,12 @@
           width="50 "
         ></el-table-column>
         <el-table-column prop="personName" label="姓名" width="120"></el-table-column>
-        <el-table-column prop="idCard" label="身份证" width="180"></el-table-column>
+        <el-table-column prop="idCard" label="身份证"></el-table-column>
         <el-table-column prop="certificateNumber" label="证书编号" width="180"></el-table-column>
         <el-table-column prop="certificateTypeName" label="证书类型" width="120"></el-table-column>
         <el-table-column prop="certificateTypeName2" label="证书名称" width="180"></el-table-column>
         <!-- <el-table-column prop="companyId" label="企业ID" width="100" show-overflow-tooltip></el-table-column> -->
-        <el-table-column prop="companyName" label="企业名称" width="180" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="companyName" label="企业名称" show-overflow-tooltip></el-table-column>
         <!-- <el-table-column prop="personId" label="员工ID" width="100" show-overflow-tooltip></el-table-column> -->
         <!-- <el-table-column prop="majorId" label="专业ID" width="100"></el-table-column> -->
         <el-table-column prop="majorName" label="专业名称" width="150">

+ 292 - 0
src/views/dataAnalysis‌/newCustomer/index.vue

@@ -0,0 +1,292 @@
+<template>
+  <div id="newCustomerStatistics">
+    <!-- 查询区域 -->
+    <search-box-new
+      ref="searchBox"
+      :formList="formList"
+      :formData="formData"
+      @search="search"
+      @init="init"
+    />
+
+    <!-- 主列表 -->
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+      ref="tableList"
+    >
+      <!-- 操作按钮 -->
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="openDetail(props.scope.row)">详情</el-button>
+      </template>
+    </table-list>
+
+    <!-- 主列表分页 -->
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+
+    <!-- 详情弹窗 -->
+    <el-dialog
+      :visible.sync="detailDialog"
+      title="新客户成交详情"
+      width="70%"
+      :show-close="true"
+      :close-on-click-modal="false"
+      append-to-body
+    >
+      <!-- 详情列表 -->
+      <table-list
+        :tableSets="detailTableSet"
+        :tableData="detailTableData"
+        :loading="detailLoading"
+        :navText="detailNavText"
+      />
+
+      <!-- 详情分页 -->
+      <pagination
+        :total="detailTotal"
+        :pageSize="detailForm.pageSize"
+        :currentPage="detailForm.pageNum"
+        @handleSizeChange="handleDetailSizeChange"
+        @handleCurrentChange="handleDetailCurrentChange"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+
+export default {
+  name: "newCustomerStatistics",
+  components: { searchBoxNew, tableList, pagination },
+  data() {
+    const currentYear = new Date().getFullYear();
+    
+    // 年份下拉 倒序(今年 → 去年 → 前年)
+    const yearOptions = [
+      { label: currentYear + "年", value: currentYear },
+      { label: currentYear - 1 + "年", value: currentYear - 1 },
+      { label: currentYear - 2 + "年", value: currentYear - 2 },
+    ];
+
+    // 月份 0=全部
+    const monthOptions = [];
+    for (let i = 0; i <= 12; i++) {
+      if (i === 0) {
+        monthOptions.push({ label: "全部", value: 0 });
+      } else {
+        monthOptions.push({ label: i + "月", value: i });
+      }
+    }
+
+    return {
+      loading: false,
+      navText: {
+        title: "新客户统计列表",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: false,
+        addHide: true,
+        border: true,
+      },
+
+      // 查询条件:默认今年,年份必选
+      formData: {
+        year: currentYear,
+        month: 0,
+        pageSize: 10,
+        pageNum: 1,
+      },
+
+      // 查询配置:年份必选
+      formList: [
+        {
+          label: "年份",
+          prop: "year",
+          scope: "select",
+          options: yearOptions,
+          required: true,
+        },
+        {
+          label: "月份",
+          prop: "month",
+          scope: "select",
+          options: monthOptions,
+        },
+      ],
+
+      // 主列表字段
+      tableSet: [
+        { label: "帐号名称", prop: "nickName", minWidth: 140, hidden: true },
+        { label: "第一次成交公司数量", prop: "companyCount", minWidth: 180, hidden: true },
+        { label: "年份", prop: "year", width: 100, hidden: true },
+        {
+          label: "月份",
+          prop: "month",
+          width: 100,
+          hidden: true,
+          // 月份=0显示全部
+          formatter: (row) => row.month === 0 ? "全部" : row.month + "月",
+        },
+      ],
+
+      tableData: [],
+      total: 0,
+
+      // ==================== 详情弹窗 ====================
+      detailDialog: false,
+      detailLoading: false,
+      detailTableData: [],
+      detailTotal: 0,
+      // 详情传参:userId + year + month
+      detailForm: {
+        userId: "",
+        year: "",
+        month: "",
+        pageSize: 10,
+        pageNum: 1,
+      },
+      detailNavText: {
+        title: "成交详情",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: false,
+        addHide: true,
+      },
+      // 详情列表字段
+      detailTableSet: [
+        { label: "帐号名称", prop: "nickName",width: 200,  hidden: true },
+        { label: "公司名", prop: "companyName",  hidden: true },
+        { label: "成交时间", prop: "createTime", scope: "aTimeList",width: 180,  hidden: true },
+        { label: "成交金额(元)", prop: "orderPrice",width: 100,  hidden: true },
+      ],
+    };
+  },
+
+  mounted() {
+    this.search();
+  },
+
+  activated() {
+    this.search();
+  },
+
+  methods: {
+    // ==================== 主列表查询 ====================
+    search(int) {
+      this.loading = true;
+      if (int === 1) this.formData.pageNum = 1;
+      if (int === 2) {
+        this.formData = {
+          year: new Date().getFullYear(),
+          month: 0,
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+
+      this.$api
+        .getNewCustomerList(this.formData)
+        .then((res) => {
+          this.tableData = res.rows || [];
+          this.total = res.total || 0;
+          this.navText.index = res.total || 0;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+
+    // 重置
+    init() {
+      this.search(2);
+    },
+
+    // 分页
+    handleSizeChange(v) {
+      this.formData.pageSize = v;
+      this.formData.pageNum = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.formData.pageNum = v;
+      this.search();
+    },
+
+    // ==================== 详情功能 ====================
+    // 传参:userId、year、month
+    openDetail(row) {
+      this.detailForm.userId = row.userId;
+      this.detailForm.year = row.year;
+      this.detailForm.month = row.month;
+      this.detailForm.pageNum = 1;
+      this.detailDialog = true;
+      this.getDetailList();
+    },
+
+    // 获取详情
+    getDetailList() {
+      this.detailLoading = true;
+      this.$api
+        .getNewCustomerDetail(this.detailForm)
+        .then((res) => {
+          this.detailTableData = res.rows || [];
+          this.detailTotal = res.total || 0;
+          this.detailNavText.index = res.total || 0;
+        })
+        .finally(() => {
+          this.detailLoading = false;
+        });
+    },
+
+    // 详情分页
+    handleDetailSizeChange(v) {
+      this.detailForm.pageSize = v;
+      this.detailForm.pageNum = 1;
+      this.getDetailList();
+    },
+    handleDetailCurrentChange(v) {
+      this.detailForm.pageNum = v;
+      this.getDetailList();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+:deep(.el-table) {
+  width: 100% !important;
+  table-layout: fixed !important;
+}
+
+:deep(.el-table__row) {
+  height: 46px !important;
+  line-height: 46px !important;
+  box-sizing: border-box !important;
+}
+
+:deep(.el-table .cell) {
+  line-height: 20px !important;
+  padding: 8px 0 !important;
+  white-space: nowrap !important;
+  overflow: hidden !important;
+  text-overflow: ellipsis !important;
+  box-sizing: border-box !important;
+}
+
+:deep(.el-button) {
+  border-radius: 8px;
+}
+</style>

+ 275 - 19
src/views/index.vue

@@ -1,32 +1,85 @@
 <template>
-  <div id="index">
+  <div id="index" style="padding: 20px;">
+    <!-- 顶部欢迎信息 -->
     <p class="TopSystem">
-      {{ user.userName }},欢迎您使用本系统<span style="margin-left: 20px"
-        >本次登录的时间:{{ changeDateTime(user.loginDate) }}</span
-      >
-      <span style="margin-left: 14px"
-        >您上次登录的时间:{{ changeDateTime(user.preLoginDate) }}</span
-      >
+      {{ user.userName }},欢迎您使用本系统
+      <span style="margin-left: 20px">本次登录的时间:{{ changeDateTime(user.loginDate) }}</span>
+      <span style="margin-left: 14px">您上次登录的时间:{{ changeDateTime(user.preLoginDate) }}</span>
     </p>
+
+    <!-- 左右各50%均分布局 -->
+    <div class="wrap-container">
+      <!-- 左侧待办任务 -->
+      <div class="task-wrap">
+        <div class="module-title">待办任务提醒</div>
+        <div class="scroll-box">
+          <div class="scroll-inner" v-if="taskRemindList.length > 0">
+            <div class="task-item" v-for="item in taskRemindList" :key="item.taskId">
+              <div class="task-row">任务名称:{{ item.taskName }}</div>
+              <div class="task-row">企业名称:{{ item.companyName }}</div>
+              <div class="task-row task-content">任务内容:{{ item.remark || '无' }}</div>
+              <div class="task-row task-time">提醒时间:{{ $methodsTools.onlyForma(item.tipTime, true) }}</div>
+              <el-button type="primary" size="mini" @click="viewTaskDetail(item)">查看详情</el-button>
+            </div>
+          </div>
+          <div v-else class="empty-tip">暂无待办提醒任务</div>
+        </div>
+      </div>
+
+      <!-- 右侧订单金额统计图表 -->
+      <div class="chart-wrap">
+        <div class="module-title">我的订单金额统计(已通过订单)</div>
+        <div ref="orderChart" class="chart-box"></div>
+      </div>
+    </div>
+
+    <!-- 任务详情弹窗 -->
+    <el-dialog
+      :visible.sync="taskDetailVisible"
+      title="任务详情"
+      width="600px"
+      @close="resetTaskForm"
+    >
+      <el-form :model="taskDetail" label-width="100px">
+        <el-form-item label="任务名称">{{ taskDetail.taskName }}</el-form-item>
+        <el-form-item label="企业名称">{{ taskDetail.companyName }}</el-form-item>
+        <el-form-item label="提醒时间">{{ $methodsTools.onlyForma(taskDetail.tipTime, true) }}</el-form-item>
+        <el-form-item label="任务内容">
+          <div style="white-space: pre-wrap; line-height: 1.6">{{ taskDetail.remark || '无内容' }}</div>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
   </div>
 </template>
+
 <script>
 import { getInfo } from "@/api/login";
+import * as echarts from "echarts";
+
 export default {
   name: "Index",
   data() {
     return {
       user: {},
+      taskRemindList: [],
+      taskDetailVisible: false,
+      taskDetail: {},
+      // 图表数据
+      orderChart: null,
+      orderStats: {
+        lastMonth: 0,
+        currentMonth: 0,
+        lastWeek: 0,
+        currentWeek: 0,
+        yesterday: 0,
+      },
     };
   },
   computed: {
-    changeDateTime: function () {
+    changeDateTime() {
       return function (date) {
         if (date) {
-          let da = this.$methodsTools.onlyForma(
-            new Date(date).getTime() / 1000
-          );
-          return da;
+          return this.$methodsTools.onlyForma(date, true);
         } else {
           return "没有记录";
         }
@@ -34,19 +87,222 @@ export default {
     },
   },
   created() {
-    getInfo().then((res) => {
-      this.user = res.data.user;
-    });
+    this.getUserInfo();
+  },
+  mounted() {
+    this.getRemindTaskList();
+    this.getOrderStatData();
+  },
+  beforeDestroy() {
+    if (this.orderChart) this.orderChart.dispose();
+  },
+  methods: {
+    getUserInfo() {
+      getInfo().then((res) => {
+        this.user = res.data.user;
+      });
+    },
+
+    // 获取今日到期任务 + 修复时间戳为整数
+    async getRemindTaskList() {
+      try {
+        // 修复:获取今日23:59:59整数时间戳(无小数点)
+        const todayEnd = Math.floor(new Date().setHours(23, 59, 59, 999) / 1000);
+
+        const res = await this.$api.getTaskList({
+          status: 2,
+          isRead:0,
+          pageSize: 100,
+          pageNum: 1,
+          // endTime: todayEnd, // 纯整数,后端Long类型不报错
+        });
+
+        const now = Date.now() / 1000;
+        this.taskRemindList = (res.rows || []).filter(item => item.tipTime && item.tipTime <= now);
+      } catch (err) {
+        console.error("获取提醒任务失败", err);
+      }
+    },
+
+    // 查看详情 + 已读接口
+    async viewTaskDetail(row) {
+      this.taskDetail = { ...row };
+      this.taskDetailVisible = true;
+      try {
+        await this.$api.readTask({ taskId: row.taskId });
+      } catch (err) {
+        console.error("任务已读失败", err);
+      }
+    },
+
+    resetTaskForm() {
+      this.taskDetail = {};
+    },
+
+    // 订单统计
+    async getOrderStatData() {
+      try {
+         // 获取上个月1号 00:00:00 的10位时间戳
+    const lastMonthFirst = Math.floor(
+      new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1).setHours(0, 0, 0, 0) / 1000
+    );
+        const res = await this.$api.orderlist({
+          checkStatus: 1,
+          pageSize: 5000,
+          pageNum: 1,
+          startTime: lastMonthFirst, // 筛选上个月至今
+        });
+        const list = res.rows || [];
+        this.calcOrderStats(list);
+        this.$nextTick(() => this.renderOrderChart());
+      } catch (err) {
+        console.error("获取订单统计失败", err);
+      }
+    },
+
+    calcOrderStats(list) {
+      const now = new Date();
+      const today = new Date(now.setHours(0, 0, 0, 0)).getTime();
+      const oneDay = 86400 * 1000;
+
+      const yesterdayStart = today - oneDay;
+      const day = new Date().getDay() || 7;
+      const monday = today - (day - 1) * oneDay;
+      const lastMonday = monday - 7 * oneDay;
+      const firstDayOfMonth = new Date(now.getFullYear(), now.getMonth(), 1).getTime();
+      const firstDayOfLastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1).getTime();
+
+      let lastMonth = 0, currentMonth = 0;
+      let lastWeek = 0, currentWeek = 0;
+      let yesterday = 0;
+
+      list.forEach((item) => {
+        if (!item.payPrice || !item.createTime) return;
+        const time = item.createTime * 1000;
+        const price = Number(item.payPrice) || 0;
+
+        if (time >= firstDayOfLastMonth && time < firstDayOfMonth) lastMonth += price;
+        if (time >= firstDayOfMonth) currentMonth += price;
+        if (time >= lastMonday && time < monday) lastWeek += price;
+        if (time >= monday) currentWeek += price;
+        if (time >= yesterdayStart && time < today) yesterday += price;
+      });
+
+      this.orderStats = { lastMonth, currentMonth, lastWeek, currentWeek, yesterday };
+    },
+
+    // 修复图表顺序
+    renderOrderChart() {
+      const dom = this.$refs.orderChart;
+      if (!dom) return;
+      this.orderChart = echarts.init(dom);
+      const data = this.orderStats;
+
+      const option = {
+        tooltip: { trigger: "axis" },
+        // 正确顺序:昨日 → 本周 → 上周 → 当月 → 上月
+        xAxis: {
+          type: "category",
+          data: ["昨日", "本周", "上周", "当月", "上月"],
+          axisLabel: { color: "#666" },
+        },
+        yAxis: { type: "value", axisLabel: { formatter: "¥{value}" } },
+        series: [
+          {
+            name: "订单金额",
+            type: "bar",
+            data: [data.yesterday, data.currentWeek, data.lastWeek, data.currentMonth, data.lastMonth],
+            itemStyle: { color: "#409EFF" },
+            barWidth: "40%",
+          },
+        ],
+      };
+      this.orderChart.setOption(option);
+      window.addEventListener("resize", () => this.orderChart.resize());
+    },
   },
-  methods: {},
 };
 </script>
 
 <style lang="scss" scoped>
 .TopSystem {
-  margin: 0px;
+  margin: 0;
   font-size: 14px;
   font-weight: 400;
-  color: #999999;
+  color: #999;
+}
+
+// 左右50%均分
+.wrap-container {
+  display: flex;
+  gap: 20px;
+  margin-top: 20px;
+  width: 100%;
+}
+.task-wrap,
+.chart-wrap {
+  flex: 1;
+  background: #fff;
+  padding: 20px;
+  border-radius: 8px;
+  box-shadow: 0 2px 10px #eee;
+}
+
+.module-title {
+  font-size: 16px;
+  font-weight: bold;
+  margin-bottom: 15px;
+  color: #333;
+}
+
+// 滚动容器
+.scroll-box {
+  height: 360px;
+  overflow: hidden;
+  position: relative;
+}
+.scroll-inner {
+  animation: scrollLoop 30s linear infinite;
+}
+.scroll-box:hover .scroll-inner {
+  animation-play-state: paused;
+}
+
+@keyframes scrollLoop {
+  0% { transform: translateY(0); }
+  100% { transform: translateY(-100%); }
+}
+
+.task-item {
+  height: 160px;
+  padding: 12px 15px;
+  border-bottom: 1px solid #f0f0f0;
+  box-sizing: border-box;
+}
+.task-row {
+  font-size: 14px;
+  color: #666;
+  margin-bottom: 6px;
+  line-height: 1.5;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.task-time {
+  color: #f56c6c;
+  margin-bottom: 10px;
+}
+
+.empty-tip {
+  height: 360px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #999;
+}
+
+.chart-box {
+  width: 100%;
+  height: 360px;
 }
-</style>
+</style>

+ 296 - 0
src/views/orderManagement/affairsOrder/index.vue

@@ -0,0 +1,296 @@
+<template>
+  <div class="order-list-container">
+    <!-- 搜索组件 -->
+    <search-box-new
+      ref="searchBox"
+      :formList="formList"
+      :formData="formData"
+      @search="search"
+      @init="resetQuery"
+    />
+
+    <!-- 表格组件 -->
+    <table-list
+      ref="tableList"
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    >
+    <template slot="customize" >
+       <el-button size="medium" @click="downexcel()" type="primary"
+            >批量导出</el-button
+          >
+      </template>
+      <!-- 操作列插槽 -->
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="openDetail(props.scope.row,'detail')">查看详情</el-button>
+
+      </template>
+    </table-list>
+
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+
+    <!-- 财务订单详情弹窗组件 -->
+    <order-check-detail
+      :visible="detailVisible"
+      :detail-info="detailInfo"
+      :operate-type="operateType"
+      @close="detailVisible = false"
+      @refresh="search"
+    />
+
+
+  </div>
+</template>
+
+<script>
+import searchBoxNew from "@/components/searchBoxNew";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+import orderCheckDetail from "../checkOrder/component/orderCheckDetail.vue";
+export default {
+  name: "affairsOrderList",
+  components: {
+    searchBoxNew,
+    tableList,
+    pagination,
+    orderCheckDetail
+  },
+  data() {
+    return {
+      loading: false,
+      // 弹窗
+      detailVisible: false,
+      invoiceCheckVisible: false,
+      invoiceOperateType: "detail", // 发票操作类型:check审核/upload上传/detail详情
+      detailInfo: null,
+      operateType: "detail",
+
+      // 搜索条件配置
+      formData: {
+        orderSn: "",
+        orderType: "",
+        orderStatus: "",
+        checkStatus: "",
+        refundStatus: "",
+        invoiceStatus: "",
+        userName: "",
+        startTime: "",
+        endTime: "",
+        pageNum: 1,
+        pageSize: 10
+      },
+      formList: [
+        { label: "订单号", prop: "orderSn", placeholder: "请输入订单号" },
+        { label: "用户名称", prop: "userName", placeholder: "请输入用户名称" },
+        {
+          label: "订单类型",
+          prop: "orderType",
+          placeholder: "请选择订单类型",
+          scope: "select",
+          options: [
+            { label: "对公", value: 1 },
+            { label: "微信", value: 2 },
+            { label: "线下", value: 3 }
+          ]
+        },
+        // {
+        //   label: "订单状态",
+        //   prop: "checkStatus",
+        //   placeholder: "请选择审核状态",
+        //   scope: "select",
+        //   options: [
+        //     { label: "待审核", value: 0 },
+        //     { label: "已通过", value: 1 },
+        //     { label: "未通过", value: 2 },
+        //     { label: "已撤销", value: 3 }
+        //   ]
+        // },
+        {
+          label: "退款状态",
+          prop: "refundStatus",
+          placeholder: "请选择退款状态",
+          scope: "select",
+          options: [
+            { label: "待审核", value: 0 },
+            { label: "未通过", value: 1 },
+            { label: "未退款", value: 2 },
+            { label: "已完成", value: 3 }
+          ]
+        },
+        // {
+        //   label: "发票状态",
+        //   prop: "invoiceStatus",
+        //   placeholder: "请选择发票状态",
+        //   scope: "select",
+        //   options: [
+        //     { label: "未开票", value: 0 },
+        //     { label: "已开票", value: 1 },
+        //     { label: "待审核", value: 2 },
+        //     { label: "已审核", value: 3 },
+        //     { label: "审核未通过", value: 4 }
+        //   ]
+        // },
+        {
+          label: "创建时间",
+          prop1: "startTime",
+          prop2: "endTime",
+          placeholder1: "订单开始时间",
+          placeholder2: "订单结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        }
+      ],
+
+      // 表格配置
+      navText: {
+        title: "教务订单管理",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: false,
+        addHide: true,
+        border: true,
+        tableHide:true,
+        backFatherBtn: { status: false, title: "未定义" }
+      },
+      tableSet: [
+        { label: "订单号", prop: "orderSn",  hidden: true},
+        { label: "用户名称", prop: "userName",  hidden: true},
+        { label: "公司名称", prop: "companyName",  hidden: true},
+        { label: "渠道名称", prop: "channelName",  hidden: true},
+        { label: "教育类型", prop: "eduName",  hidden: true},
+        { label: "业务名称", prop: "businessName",  hidden: true},
+        { label: "订单类型", prop: "orderType",  hidden: true, scope: "isOptions",
+          options: [{ label: "对公转账", value: 1 },{ label: "微信支付", value: 2 },{ label: "线下结算", value: 3 }] },
+        { label: "订单状态", prop: "checkStatus",  hidden: true, scope: "isOptions",
+          options: [{ label: "待审核", value: 0 },{ label: "已通过", value: 1 },{ label: "未通过", value: 2 },{ label: "已撤销", value: 3 }]},
+        { label: "退款状态", prop: "refundStatus",  hidden: true, scope: "isOptions",
+          options: [{ label: "待审核", value: 0 },{ label: "未通过", value: 1 },{ label: "未退款", value: 2 },{ label: "已完成", value: 3 },{ label: "正常", value: null }]},
+        // { label: "发票状态", prop: "invoiceStatus",  hidden: true, scope: "isOptions",
+        //   options: [{ label: "未开票", value: 0 },{ label: "已开票", value: 1 },{ label: "待审核", value: 2 },{ label: "已审核", value: 3 },{ label: "审核未通过", value: 4 }]},
+        { label: "订单数量", prop: "orderNum",  hidden: true},
+        { label: "订单人数", prop: "orderPersonNum",  hidden: true},
+        // { label: "标准价格", prop: "orderPrice",  hidden: true},
+        // { label: "支付价格", prop: "payPrice",  hidden: true},
+        // { label: "实收账款", prop: "orderReceived",  hidden: true},
+        // { label: "未收账款", prop: "orderUncollected",  hidden: true},
+        { label: "创建时间", prop: "createTime",  hidden: true, scope: "aTimeList"},
+        { label: "支付/审核时间", prop: "payTime",  hidden: true, scope: "aTimeList"}
+      ],
+      tableData: [],
+      total: 0,
+    };
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    /** 获取财务订单列表 */
+    async search(int) {
+      this.loading = true;
+      if (int === 1) {
+        this.formData.pageNum = 1;
+      }
+      if (int === 2) {
+        this.formData = {
+          pageSize: 10,
+          pageNum: 1,
+        };
+      }
+      if (int === 3) {
+        this.formData.pageNum = 1;
+      }
+      this.formData.checkStatus=1;
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.startTime) {
+        data.startTime = data.startTime / 1000;
+      }
+      if (this.formData.endTime) {
+        data.endTime = data.endTime / 1000;
+      }
+      try {
+        const res = await this.$api.financeOrderList(data);
+        this.tableData = res.rows || [];
+        this.total = res.total || 0;
+        this.navText.index = this.total;
+      } catch (err) {
+        console.error("获取订单列表失败", err);
+      } finally {
+        this.loading = false;
+      }
+    },
+downexcel(){
+  this.formData.checkStatus=1;
+      var data = JSON.parse(JSON.stringify(this.formData));
+      data.checkStatus=1;
+      data.pageNum = 1;
+      data.pageSize = 10000;
+      if (this.formData.startTime) {
+        data.startTime = data.startTime / 1000;
+      }
+      if (this.formData.endTime) {
+        data.endTime = data.endTime / 1000;
+      }
+   this.$api
+            .financeorderexport(data)
+            .then((res) => {
+              // console.log(res.msg)
+              this.$methodsTools.exportData(res.msg,true)
+            });
+},
+    /** 重置查询 */
+    resetQuery() {
+      this.formData = {
+        orderSn: "",
+        orderType: "",
+        orderStatus: "",
+        checkStatus: "",
+        refundStatus: "",
+        invoiceStatus: "",
+        userName: "",
+        startTime: "",
+        endTime: "",
+        pageNum: 1,
+        pageSize: 10
+      };
+      this.search();
+    },
+
+    /** 分页改变 */
+    handleSizeChange(val) {
+      this.formData.pageSize = val;
+      this.search();
+    },
+    handleCurrentChange(val) {
+      this.formData.pageNum = val;
+      this.search();
+    },
+
+    /** 打开详情/审核/退款审核 */
+    openDetail(row,type) {
+      this.operateType = type;
+      this.detailInfo = row;
+      this.detailVisible = true;
+    },
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.order-list-container {
+  padding: 20px;
+}
+</style>

+ 339 - 0
src/views/orderManagement/orderstudy/index.vue

@@ -0,0 +1,339 @@
+<template>
+  <div class="study-record-container">
+    <!-- 原生 Element UI 搜索区域 -->
+    <div class="search-wrap">
+      <el-form :model="formData" inline label-width="80px">
+        <el-form-item label="教育类型">
+          <el-select
+            v-model="formData.eduName"
+            placeholder="请选择教育类型"
+            clearable
+            @change="handleEduChange"
+          >
+            <el-option
+              v-for="item in educationList"
+              :key="item.id"
+              :label="item.educationName"
+              :value="item.educationName"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="业务层次">
+          <el-select
+            v-model="formData.businessName"
+            placeholder="请选择业务层次"
+            clearable
+          >
+            <el-option
+              v-for="item in businessList"
+              :key="item.id"
+              :label="item.aliasName"
+              :value="item.businessName=='七大员'?(item.businessName+ item.aliasName):item.aliasName"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="订单号">
+          <el-input
+            v-model="formData.orderSn"
+            placeholder="请输入订单号"
+            clearable
+          />
+        </el-form-item>
+
+        <el-form-item label="公司名称">
+          <el-input
+            v-model="formData.companyName"
+            placeholder="请输入公司名称"
+            clearable
+          />
+        </el-form-item>
+
+        <el-form-item label="学员姓名">
+          <el-input
+            v-model="formData.personName"
+            placeholder="请输入学员姓名"
+            clearable
+          />
+        </el-form-item>
+
+        <el-form-item label="身份证">
+          <el-input
+            v-model="formData.personCard"
+            placeholder="请输入身份证"
+            clearable
+          />
+        </el-form-item>
+
+        <el-form-item label="手机号">
+          <el-input
+            v-model="formData.personPhone"
+            placeholder="请输入手机号"
+            clearable
+          />
+        </el-form-item>
+
+        <el-form-item>
+          <el-button type="primary" @click="search(1)">查询</el-button>
+          <el-button @click="resetQuery">重置</el-button>
+          <el-button type="primary" @click="downexcel">批量导出</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <!-- 表格组件 -->
+    <table-list
+      ref="tableList"
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      :loading="loading"
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    >
+      <template slot="orderinfo" slot-scope="props">
+        <p>订单编号:{{ props.scope.row.orderSn }}</p>
+        <p>公司名称:{{ props.scope.row.companyName }}</p>
+      </template>
+      <template slot="personinfo" slot-scope="props">
+        <p>姓  名:{{ props.scope.row.personName }}</p>
+        <p>身份证:{{ props.scope.row.personCard }}</p>
+        <p>手机号:{{ props.scope.row.personPhone}}</p>
+      </template>
+      <template slot="edugroup" slot-scope="props">
+        <p>教育类型:{{ props.scope.row.eduName }}</p>
+        <p>业务类型:{{ props.scope.row.businessName }}</p>
+        <p>科目名称:{{ props.scope.row.subjectName}}</p>
+      </template>
+      <template slot="classinfo" slot-scope="props">
+        <p>课程名称:{{ props.scope.row.courseName }}</p>
+        <p>班级名称:{{ props.scope.row.className }}</p>
+        <p>班级状态:{{ props.scope.row.classStatus}}</p>
+        <p>班级结束时间:{{ props.scope.row.classEndTime}}</p>
+      </template>
+    </table-list>
+
+    <!-- 分页 -->
+    <pagination
+      :total="total"
+      :pageSize="formData.pageSize"
+      :currentPage="formData.pageNum"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+
+    <!-- 详情弹窗 -->
+    <order-check-detail
+      :visible="detailVisible"
+      :detail-info="detailInfo"
+      :operate-type="operateType"
+      @close="detailVisible = false"
+    />
+  </div>
+</template>
+
+<script>
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+import orderCheckDetail from "../checkOrder/component/orderCheckDetail.vue";
+
+export default {
+  name: "personStudyRecordList",
+  components: {
+    tableList,
+    pagination,
+    orderCheckDetail,
+  },
+  data() {
+    return {
+      loading: false,
+      detailVisible: false,
+      operateType: "detail",
+      detailInfo: null,
+
+      // 搜索条件 —— 已改为中文传参
+      formData: {
+        eduName: "",        // 教育类型 中文
+        businessName: "",   // 业务层次 中文
+        orderSn: "",
+        companyName: "",
+        personName: "",
+        personCard: "",
+        personPhone: "",
+        pageNum: 1,
+        pageSize: 10,
+      },
+
+      // 下拉数据
+      educationList: [],
+      businessList: [],
+
+      // 表格配置
+      navText: {
+        title: "学员学习记录管理",
+        index: 0,
+        ch: "条",
+        num: false,
+        choice: false,
+        addHide: true,
+        border: true,
+        tableHide:true,
+        backFatherBtn: { status: false, title: "未定义" },
+      },
+      tableSet: [
+        {
+          label: "订单信息",
+          hidden: true,
+          scope: "slot",
+          slotName: "orderinfo",
+          dontCenter: true,
+          width:260,
+        },
+        {
+          label: "学员信息",
+          hidden: true,
+          scope: "slot",
+          slotName: "personinfo",
+          dontCenter: true,
+          width:260,
+        },
+        {
+          label: "教育类型",
+          hidden: true,
+          scope: "slot",
+          slotName: "edugroup",
+          dontCenter: true,
+          width:260,
+        },
+        {
+          label: "班级信息",
+          hidden: true,
+          scope: "slot",
+          slotName: "classinfo",
+          dontCenter: true,
+        },
+        { label: "审核状态", prop: "periodStatus", width:100, hidden: true },
+        { label: "学习进度", prop: "studyPlan", width:100, hidden: true },
+        { label: "学习情况", prop: "studyStatus", width:100, hidden: true },
+      ],
+      tableData: [],
+      total: 0,
+    };
+  },
+  mounted() {
+    this.getEducationList();
+    this.search();
+  },
+  methods: {
+    // 获取教育类型
+    getEducationList() {
+      this.$api.getedulist().then((res) => {
+        this.educationList = [
+          { id: "", educationName: "全部" },
+          ...(res.data || []),
+        ];
+      });
+    },
+
+    // 教育类型切换(联动业务)
+    handleEduChange(eduName) {
+      this.formData.businessName = "";
+      const item = this.educationList.find(i => i.educationName === eduName);
+      this.getBusinessList(item ? item.id : "");
+    },
+
+    // 获取业务层次(联动)
+    getBusinessList(eduId) {
+      if (!eduId) {
+        this.businessList = [{ id: "", aliasName: "全部" }];
+        return;
+      }
+      this.$api.getbusinesslist({ eduId }).then((res) => {
+        this.businessList = [
+          { id: "", aliasName: "全部" },
+          ...(res.data || []),
+        ];
+      });
+    },
+
+    // 获取列表
+    async search(int) {
+      this.loading = true;
+      if (int === 1) this.formData.pageNum = 1;
+
+      const data = { ...this.formData };
+      try {
+        const res = await this.$api.orderpersonstudy(data);
+        this.tableData = res.rows || [];
+        this.total = res.total || 0;
+        this.navText.index = this.total;
+      } catch (err) {
+        console.error("获取学习记录失败", err);
+      } finally {
+        this.loading = false;
+      }
+    },
+
+    // 导出Excel(传参同步修改)
+    downexcel() {
+      const data = { ...this.formData };
+      data.pageNum = 1;
+      data.pageSize = 10000;
+      this.$api.orderpersonstudyexport(data).then((res) => {
+        this.$methodsTools.exportData(res.msg, true);
+      });
+    },
+
+    // 重置
+    resetQuery() {
+      this.formData = {
+        eduName: "",
+        businessName: "",
+        orderSn: "",
+        companyName: "",
+        personName: "",
+        personCard: "",
+        personPhone: "",
+        pageNum: 1,
+        pageSize: 10,
+      };
+      this.businessList = [{ id: "", aliasName: "全部" }];
+      this.search();
+    },
+
+    // 分页
+    handleSizeChange(val) {
+      this.formData.pageSize = val;
+      this.search();
+    },
+    handleCurrentChange(val) {
+      this.formData.pageNum = val;
+      this.search();
+    },
+
+    // 查看详情
+    openDetail(row, type) {
+      this.operateType = type;
+      this.detailInfo = row;
+      this.detailVisible = true;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.study-record-container {
+  padding: 20px;
+}
+.search-wrap {
+  background: #fff;
+  padding: 16px;
+  border-radius: 4px;
+  margin-bottom: 16px;
+  border: 1px solid #ebeef5;
+}
+</style>

+ 1 - 1
src/views/systemManagement/roleManagement/index.vue

@@ -508,7 +508,7 @@ export default {
       this.listData.businessIds = this.getMenuAllCheckedKeysInfo();
       if (!this.listData.businessIds.length) {
         this.disabledBtn = false;
-        return this.$message.error("请勾选数据池");
+        // return this.$message.error("请勾选数据池");
       }
       var data = this.listData;
       if (this.statusPop === 1) {

+ 24 - 13
src/views/task/index.vue

@@ -10,11 +10,6 @@
       @editInfo="editInfo"
       ref="tableList"
     >
-    <!-- <template slot="customize" >
-       <el-button size="medium" @click="dels()" type="danger"
-            >批量删除</el-button
-          >
-      </template> -->
       <template slot="btn" slot-scope="props">
         <el-button type="text" @click="addClick(props.scope.row, 2)">编辑</el-button>
         <el-button type="text" @click="del(props.scope.row)">删除</el-button>
@@ -147,25 +142,34 @@ export default {
           prop: "status",
           scope: "select",
           options: [
-            { label: "正常", value: 0 },
-            { label: "处理", value: 1 },
-            { label: "取消", value: 2 },
+            // { label: "正常", value: 0 },
+            { label: "处理", value: 1 },
+            { label: "已处理", value: 2 },
           ],
         },
+         {
+          label: "提醒时间",
+          prop1: "beginTime",
+          prop2: "endTime",
+          placeholder1: "开始时间",
+          placeholder2: "结束时间",
+          scope: "moreDataPicker",
+          Diszing: true,
+        }
       ],
       tableSet: [
         { label: "任务名称", prop: "taskName", hidden: true},
         { label: "企业名称", prop: "companyName", hidden: true},
-        { label: "任务内容", prop: "remark", hidden: true},
+        { label: "任务内容", prop: "remark",width:500, hidden: true},
         { label: "提醒时间", prop: "tipTime", scope: "aTimeList", hidden: true },
         { label: "已读时间", prop: "readTime", scope: "aTimeList", hidden: true },
         {
-          label: "状态", prop: "status",
+          label: "状态", prop: "status",width:100,
           scope: "isOptions",
           options: [
-            { label: "正常", value: 0 },
+            { label: "待处理", value: 0 },
             { label: "已处理", value: 1 },
-            { label: "取消", value: 2 }
+            // { label: "取消", value: 2 }
           ],
           hidden: true
         },
@@ -238,7 +242,14 @@ export default {
           taskName: "", status: "", pageSize: 10, pageNum: 1
         };
       }
-      this.$api.getTaskList(this.formData).then((res) => {
+      var data = JSON.parse(JSON.stringify(this.formData));
+      if (this.formData.beginTime) {
+        data.beginTime = data.beginTime / 1000;
+      }
+      if (this.formData.endTime) {
+        data.endTime = data.endTime / 1000;
+      }
+      this.$api.getTaskList(data).then((res) => {
         this.tableData = res.rows;
         this.total = res.total;
         this.navText.index = res.total;