<template>
  <div class="app-container">
    <el-form
      :model="queryParams"
      ref="queryForm"
      :inline="true"
      v-show="showSearch"
      label-width="68px"
    >
      <el-form-item label="部门" prop="type">
        <treeselect
          style="width: 220px"
          :clearable="false"
          v-model="queryParams.deptIds"
          multiple
          :options="deptOptions"
          clearable
          :show-count="true"
          placeholder="请选择归属部门"
        />
      </el-form-item>
      <el-form-item label="所属客服" prop="companyUserId">
        <el-select
          v-model="queryParams.companyUserId"
          clearable
          filterable
          remote
          placeholder="请输入关键词"
          :remote-method="loadCompanyUserOptions"
          v-select-load-more="loadMoreCompanyUserOptions"
          :loading="companyUserOptionsLoading"
        >
          <el-option
            v-for="item in companyUserOptions"
            :key="item.dictValue"
            :label="item.dictLabel"
            :value="item.dictValue"
          >
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="企微昵称" prop="nickName">
        <el-input
          v-model="queryParams.nickName"
          placeholder="请输入企微昵称"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>

      <!--企微主体选择框 -->
      <el-form-item label="企微主体" prop="corpId">
        <el-select v-model="queryParams.corpId" placeholder="企微主体" size="small" @change="updateCorpId()" clearable>
          <el-option
            v-for="dict in myQwCompanyList"
            :key="dict.dictValue"
            :label="dict.dictLabel"
            :value="dict.dictValue"
          />
        </el-select>
      </el-form-item>

      <el-form-item label="添加时间" prop="createTime">
        <el-date-picker
          v-model="createTime"
          size="small"
          style="width: 220px"
          value-format="yyyy-MM-dd"
          type="daterange"
          range-separator="-"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          @change="change"
        ></el-date-picker>
      </el-form-item>
       <el-form-item label="添加方式" prop="addWays" v-if="showCompanyField">
        <el-select v-model="addWays" placeholder="请选择添加方式" size="small" multiple
    collapse-tags
    style="width: 100%;" clearable>
          <el-option
            v-for="dict in myAddWayList"
            :key="dict.dictValue"
            :label="dict.dictLabel"
            :value="dict.dictValue"
          />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button
          type="primary"
          icon="el-icon-search"
          size="mini"
          @click="handleQuery"
          >搜索</el-button
        >
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
          >重置</el-button
        >
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          :loading="exportLoading"
          @click="handleExport"
          v-hasPermi="['course:courseWatchLog:export']"
          >导出</el-button
        >
      </el-col>
      <right-toolbar
        :showSearch.sync="showSearch"
        @queryTable="getList"
      ></right-toolbar>
    </el-row>
    <el-table
      border
      v-loading="loading"
      :data="courseWatchLogList"
      @selection-change="handleSelectionChange"
      show-summary
      :summary-method="getSummaries"
      ref="table1"
    >
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="企微员工名称" align="center" prop="qwUserName" />

      <!-- 发课时间 -->
      <el-table-column label="进线时间" align="center" prop="createTime" />
      <!-- 进线数 -->
      <el-table-column label="进线数" align="center" prop="line" />

      <!-- 先导课上线 -->
      <el-table-column label="先导课上线" align="center" prop="firstOnline">
        <template slot-scope="scope">
          <span>{{ scope.row.firstOnline }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor(
                (scope.row.firstOnline / scope.row.line) * 100
              ),
            }"
          >
            ({{ ((scope.row.firstOnline / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- 先导课完课 -->
      <el-table-column label="先导课完课" align="center" prop="firstOver">
        <template slot-scope="scope">
          <span>{{ scope.row.firstOver }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor(
                (scope.row.firstOver / scope.row.line) * 100
              ),
            }"
          >
            ({{ ((scope.row.firstOver / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- 首日上线 -->
      <el-table-column label="首日上线" align="center" prop="d1Online">
        <template slot-scope="scope">
          <span>{{ scope.row.d1Online }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor(
                (scope.row.d1Online / scope.row.line) * 100
              ),
            }"
          >
            ({{ ((scope.row.d1Online / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- 首日完课 -->
      <el-table-column label="首日完课" align="center" prop="d1Over">
        <template slot-scope="scope">
          <span>{{ scope.row.d1Over }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor(
                (scope.row.d1Over / scope.row.line) * 100
              ),
            }"
          >
            ({{ ((scope.row.d1Over / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- 综合报名数 -->
      <el-table-column label="综合报名数" align="center" prop="sign">
        <template slot-scope="scope">
          <span>{{ scope.row.sign }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor(
                (scope.row.sign / scope.row.line) * 100
              ),
            }"
          >
            ({{ ((scope.row.sign / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- 互动数 -->
      <el-table-column label="互动数" align="center" prop="interact">
        <template slot-scope="scope">
          <span>{{ scope.row.interact }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor(
                (scope.row.interact / scope.row.line) * 100
              ),
            }"
          >
            ({{ ((scope.row.interact / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- A级客户 -->
      <el-table-column label="A级客户" align="center" prop="a">
        <template slot-scope="scope">
          <span>{{ scope.row.a }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.a / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.a / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- B级客户 -->
      <el-table-column label="B级客户" align="center" prop="b">
        <template slot-scope="scope">
          <span>{{ scope.row.b }}</span>

          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.b / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.b / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- C级客户 -->
      <el-table-column label="C级客户" align="center" prop="c">
        <template slot-scope="scope">
          <span>{{ scope.row.c }}</span>

          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.c / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.c / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- D级客户 -->
      <el-table-column label="D级客户" align="center" prop="d">
        <template slot-scope="scope">
          <span>{{ scope.row.d }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.d / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.d / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- E级客户 -->
      <el-table-column label="E级客户" align="center" prop="e">
        <template slot-scope="scope">
          <span>{{ scope.row.e }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.e / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.e / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>
      <!-- 流失数 -->
      <el-table-column label="拉黑数" align="center" prop="black">
        <template slot-scope="scope">
          <span>{{ scope.row.black }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.black / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.black / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- 流失数 -->
      <el-table-column label="流失数" align="center" prop="los">
        <template slot-scope="scope">
          <span>{{ scope.row.los }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.los / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.los / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- 删除数 -->
      <el-table-column label="删除数" align="center" prop="del">
        <template slot-scope="scope">
          <span>{{ scope.row.del }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.del / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.del / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>

      <!-- 重粉数 -->
      <el-table-column label="重粉数" align="center" prop="repeatCount">
        <template slot-scope="scope">
          <span>{{ scope.row.repeatCount }}</span>
          <span
            :style="{
              'font-size': '12px',
              'margin-left': '5px',
              color: getPercentageColor((scope.row.repeatCount / scope.row.line) * 100),
            }"
          >
            ({{ ((scope.row.repeatCount / scope.row.line) * 100).toFixed(2) }}%)
          </span>
        </template>
      </el-table-column>
    </el-table>

    <pagination-more
      v-show="total > 0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
  </div>
</template>

<script>
import {
  listCourseWatchLog,
  getCourseWatchLog,
  delCourseWatchLog,
  addCourseWatchLog,
  updateCourseWatchLog,
  exportCourseWatchLog,
  statisticsList,
  qwWatchLogStatisticsList,
  // exportWatchLogStatistics
} from "@/api/course/qw/courseWatchLog";
import { courseList, videoList } from "@/api/course/courseRedPacketLog";
import { treeselect } from "@/api/company/companyDept";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { getCompanyUserListLikeName } from "@/api/company/companyUser";
import { getMyQwCompanyList } from '@/api/qw/user';
import { getTask } from "@/api/common";
import PaginationMore from "@/components/PaginationMore/index.vue";
export default {
  name: "CourseWatchLog",
  components: {PaginationMore, Treeselect },
  data() {
    return {
      activeName: "00",
      createTime: null,
      courseLists: [],
      companyUserOptionsParams: {
        name: undefined,
        hasNextPage: false,
        pageNum: 1,
        pageSize: 10,
      },
      companyUserOptionsLoading: false,
      companyUserOptions: [],
      deptOptions: [],
      videoList: [],
      logTypeOptions: [],
      // 遮罩层
      loading: true,
      // 导出遮罩层
      exportLoading: false,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 短链课程看课记录表格数据
      courseWatchLogList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        userId: null,
        nickName: null,
        videoId: null,
        logType: null,
        qwExternalContactId: null,
        duration: null,
        qwUserId: null,
        companyUserId: null,
        companyId: null,
        courseId: null,
        sTime: null,
        eTime: null,
        scheduleStartTime: null,
        scheduleEndTime: null,
        corpId: null, // 企微主体ID
        addWays:[],
      },
      // 表单参数
      form: {},
      // 表单校验
      rules: {},
      scheduleTime: null,
      myQwCompanyList: [], // 存储企微主体选项列表
      myAddWayList:[],
      addWays:[],
    };
  },
  computed: {
    // 计算属性判断是否显示
    showCompanyField() {
      return process.env.VUE_APP_TITLE_INDEX === '恒春来';
    },
  },
  created() {
    courseList().then((response) => {
      this.courseLists = response.list;
    });

    this.getDicts("sys_course_watch_log_type").then((response) => {
      this.logTypeOptions = response.data;
    });
    this.getDicts("sys_qw_externalContact_addWay").then((response) => {
      this.myAddWayList = response.data;
    });
    this.getTreeselect();
    this.getList();
    // --- 获取企微主体列表 ---
    getMyQwCompanyList().then(response => {
      this.myQwCompanyList = response.data;
    });
  },
  methods: {
    updateCorpId() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    getSummaries(param) {
      let totalNum = 0;
      const { columns, data } = param;
      const sums = [];
      columns.forEach((column, index) => {
        if (index === 0) {
          sums[index] = "总计";
          return;
        }

        const values = data.map((item) => Number(item[column.property]));
        if (!values.every((value) => isNaN(value))) {
          sums[index] = values.reduce((prev, curr) => {
            const value = Number(curr);
            if (!isNaN(value)) {
              return prev + curr;
            } else {
              return prev;
            }
          }, 0);
          //第三列计数为进线数量和
          if(index === 3){
            totalNum = sums[index];
          }
          if(index > 3 && totalNum != 0){
              sums[index] = sums[index] + "("+ ((sums[index] / totalNum) * 100).toFixed(2)  + "%)"
          }
          if (
            column.property === "firstOnline" ||
            column.property === "firstOver" ||
            column.property === "d1Online" ||
            column.property === "d1Over" ||
            column.property === "sign" ||
            column.property === "interact" ||
            column.property === "a" ||
            column.property === "b" ||
            column.property === "c" ||
            column.property === "d" ||
            column.property === "e" ||
            column.property === "black" ||
            column.property === "los" ||
            column.property === "del"
          ) {
          }
        } else {
          sums[index] = "";
        }
      });

      return sums;
    },
    getPercentageColor(percentage) {
      // HSL模式从黄色(60度)渐变到红色(0度)
      const percent = Math.min(100, Math.max(0, parseFloat(percentage)));

      // 调整色相范围：从深黄色（40°）渐变到红色（0°）
      const hue = 40 - 40 * (percent / 100); // 初始 hue=40（深黄），终点 hue=0（红）

      // 提高饱和度（100%），亮度保持 50%（鲜艳但不刺眼）
      return `hsl(${hue}, 100%, 50%)`;
    },
    courseChange(row) {
      this.queryParams.videoId = null;
      if (row === "") {
        this.videoList = [];
        return;
      }
      videoList(row).then((response) => {
        this.videoList = response.list;
      });
    },
    getTreeselect() {
      var that = this;
      var param = { companyId: this.companyId };
      treeselect(param).then((response) => {
        this.deptOptions = response.data;
        if (response.data != null && response.data.length > 0) {
          //this.queryParams.deptId=response.data[0].id;
        }
      });
    },
    loadCompanyUserOptions(query) {
      this.companyUserOptions = [];
      if (query === "") {
        return;
      }

      this.companyUserOptionsParams.pageNum = 1;
      this.companyUserOptionsParams.name = query;
      this.companyUserOptionsLoading = true;
      this.getCompanyUserListLikeName();
    },
    getCompanyUserListLikeName() {
      getCompanyUserListLikeName(this.companyUserOptionsParams).then(
        (response) => {
          this.companyUserOptions = [
            ...this.companyUserOptions,
            ...response.data.list,
          ];
          this.companyUserOptionsParams.hasNextPage = response.data.hasNextPage;
          this.companyUserOptionsLoading = false;
        }
      );
    },
    loadMoreCompanyUserOptions() {
      if (!this.companyUserOptionsParams.hasNextPage) {
        return;
      }

      this.companyUserOptionsParams.pageNum += 1;
      this.getCompanyUserListLikeName();
    },
    change() {
      if (this.createTime != null) {
        this.queryParams.sTime = this.createTime[0];
        this.queryParams.eTime = this.createTime[1];
      } else {
        this.queryParams.sTime = null;
        this.queryParams.eTime = null;
      }
    },
    handleClickX(tab, event) {
      this.activeName = tab.name;
      if (tab.name == "00") {
        this.queryParams.logType = null;
      } else {
        this.queryParams.logType = tab.name;
      }
      this.getList();
    },
    /** 查询短链课程看课记录列表 */
    getList() {
      this.loading = true;
      qwWatchLogStatisticsList(this.queryParams).then((response) => {
        this.courseWatchLogList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
      this.$nextTick(() => {
        setTimeout(() => {
          this.$refs.table1?.doLayout();
        }, 2000);
      });
    },
    // 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // 表单重置
    reset() {
      this.form = {
        logId: null,
        userId: null,
        videoId: null,
        logType: null,
        createTime: null,
        updateTime: null,
        qwExternalContactId: null,
        duration: null,
        qwUserId: null,
        companyUserId: null,
        companyId: null,
        courseId: null,
      };
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
      if (!this.queryParams.sTime || !this.queryParams.eTime) {
        this.$message.warning("请选择添加时间");
        return;
      }

        // 检查时间范围是否为7天内
        const startTime = new Date(this.queryParams.sTime).getTime();
        const endTime = new Date(this.queryParams.eTime).getTime();
        const sevenDays = 7 * 24 * 60 * 60 * 1000; // 7天的毫秒数

        if (endTime - startTime > sevenDays) {
            this.$message.warning("时间范围不能超过7天，请重新选择");
            return;
        }


        if( this.addWays.length>0){
        this.queryParams.addWays = this.addWays.join(',');
      }
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.createTime = null;
      this.scheduleTime = null;
      this.queryParams.sTime = null;
      this.queryParams.eTime = null;
      this.queryParams.scheduleStartTime = null;
      this.queryParams.scheduleEndTime = null;
      this.queryParams.corpId = null; // 重置企微主体选择
      this.queryParams.addWays = [];
      this.addWays = [];
      this.handleQuery();
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map((item) => item.logId);
      this.single = selection.length !== 1;
      this.multiple = !selection.length;
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加短链课程看课记录";
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.reset();
      const logId = row.logId || this.ids;
      getCourseWatchLog(logId).then((response) => {
        this.form = response.data;
        this.open = true;
        this.title = "修改短链课程看课记录";
      });
    },
    /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate((valid) => {
        if (valid) {
          if (this.form.logId != null) {
            updateCourseWatchLog(this.form).then((response) => {
              this.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addCourseWatchLog(this.form).then((response) => {
              this.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const logIds = row.logId || this.ids;
      this.$confirm(
        '是否确认删除短链课程看课记录编号为"' + logIds + '"的数据项?',
        "警告",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      )
        .then(function () {
          return delCourseWatchLog(logIds);
        })
        .then(() => {
          this.getList();
          this.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    /** 导出按钮操作 */
    handleExport() {
      const queryParams = this.queryParams;
      this.$confirm('是否确认导出所有短链课程看课记录数据项?', "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        this.exportLoading = true;
        return exportCourseWatchLog(queryParams);
      }).then(response => {
        this.download(response.msg);
        this.exportLoading = false;
      }).catch(() => {});
    },
    handleScheduleTimeChange(val) {
      if (val) {
        this.queryParams.scheduleStartTime = val[0];
        this.queryParams.scheduleEndTime = val[1];
      } else {
        this.queryParams.scheduleStartTime = null;
        this.queryParams.scheduleEndTime = null;
      }
    },
  },
};
</script>
