index.vue 10.3 KB
<script setup lang="ts">
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import {
  handworkList,
  handworkDelete,
  handworkCancel,
  handworkEdit,
} from "@/api/event";
import { parseTime, globalFilters } from "@/utils/tool";
import { statusData, publishData } from "./../config";
import { useLoginStore } from "@/pinia/login";
import Pagination from "@/components/Pagination/index.vue";
import { ElMessageBox, ElMessage } from "element-plus";
let instance: ComponentInternalInstance | null = getCurrentInstance();
interface Form {
  page: number;
  pageSize: number;
  startTime: string;
  endTime: string;
  oid: number | null;
  name: string;
  status: number | null;
  duration: number | null;
}
interface Params {
  total: number;
  query: Form;
}
interface Data {
  loading: boolean;
  list: any[] | null;
  params: Params;
}
const value1 = ref([]);
let data = reactive({
  list: [],
  loading: false,
  params: {
    total: 0,
    query: {
      page: 1,
      pageSize: 10,
      oid: useLoginStore()?.getOid ?? 0,
      startTime: "",
      endTime: "",
      name: "",
      status: null,
      duration: null,
    },
  },
});
/**
 * 列表
 */
const getList = async () => {
  data.loading = true;
  try {
    const res = await handworkList(data.params.query);
    data.list = res?.data?.data.list;
    data.params.total = res?.data?.data?.total;
  } catch (e) {
    console.log(e);
  } finally {
    data.loading = false;
  }
};
/**
 * 时间组件回调
 * @param {array} value [开始时间, 结束时间]
 */
const handleTimeChange = (value: array) => {
  data.params.query.startTime = value ? value[0] : "";
  data.params.query.endTime = value ? value[1] : "";
  getList();
};
/**
 * 取消发布
 */
const handleCancel = (id: number) => {
  ElMessageBox.confirm("是否确定删除该活动?", "提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  }).then(async () => {
    try {
      const res = await handworkCancel({
        handworkId: id,
        status: 2,
      });
      if (res?.data) {
        ElMessage({
          type: "success",
          message: "操作成功",
        });
        getList();
      } else {
        ElMessage({
          type: "error",
          message: "操作失败",
        });
      }
    } catch (e) {
      console.log(e);
    }
  });
};
/**
 * 活动删除
 * @param {number | string} id 活动id
 */
const handleDelete = (id: number | string) => {
  ElMessageBox.confirm("是否确定删除该活动?", "提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(async () => {
      try {
        const res = await handworkDelete({
          handworkId: id,
        });
        if (res?.data) {
          ElMessage({
            type: "success",
            message: "操作成功",
          });
          getList();
        } else {
          ElMessage({
            type: "error",
            message: "操作失败",
          });
        }
      } catch (e) {
        console.log(e);
      }
    })
    .catch((error) => {
      console.log(error);
    });
};
/**
 * 活动发布
 */
const issue = async (row: Object): void => {
  const currObj = JSON.parse(JSON.stringify(row));
  currObj.status = 1;
  handworkEdit(currObj)
    .then((res) => {
      if (res) {
        instance?.proxy?.$message.success("发布成功");
        getList();
      }
    })
    .catch((error) => {
      console.log(error);
    });
};
onMounted(() => {
  getList();
});
</script>

<template>
  <div class="page-container">
    <!-- <h1>手工活动</h1> -->
    <el-row style="padding-bottom: 20px">
      <el-form :inline="true" label-width="70px" @submit.native.prevent>
        <el-form-item label="名称">
          <el-input
            v-model.trim="data.params.query.name"
            placeholder="请填写名称"
            maxlength="15"
            @change="getList"
          />
        </el-form-item>
        <el-form-item label="活动状态">
          <el-select
            v-model="data.params.query.status"
            placeholder="请选择活动状态"
            @change="getList"
            clearable
          >
            <el-option
              v-for="(item, index) in statusData"
              :label="item.label"
              :value="item.value"
            ></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="活动时间">
          <el-date-picker
            v-model="value1"
            type="datetimerange"
            range-separator="至"
            format="YYYY-MM-DD HH:mm:ss"
            value-format="YYYY-MM-DD HH:mm:ss"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            @change="handleTimeChange"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="getList">查询</el-button>
        </el-form-item>
        <el-form-item>
        <router-link to="/event/handwork/edit">
          <el-button type="primary">
            发布活动
          </el-button>
          </router-link>
        </el-form-item>
      </el-form>
    </el-row>
    <el-table
      :data="data.list"
      style="width: 100%"
      border
      v-loading="data.loading"
      align="center"
      element-loading-text="拼命加载中"
    >
      <el-table-column prop="id" label="ID" align="center"></el-table-column>
      <el-table-column
        prop="name"
        label="活动名称"
        align="center"
      ></el-table-column>
      <el-table-column
        prop="craftName"
        label="活动分类"
        align="center"
      ></el-table-column>
      <el-table-column
        prop="personLimit"
        label="活动人数"
        align="center"
      ></el-table-column>
      <el-table-column
        prop="signupNum"
        label="参与人数"
        align="center"
      ></el-table-column>
      <el-table-column
        prop="signupResidueNum"
        label="富余人数"
        align="center"
      ></el-table-column>
      <el-table-column prop="startTime" label="活动报名时间" align="center">
        <template #default="scope">
          {{ parseTime(new Date(scope.row.signupStartTime).getTime()) }} ~
          {{ parseTime(new Date(scope.row.signupEndTime).getTime()) }}
        </template>
      </el-table-column>
      <el-table-column prop="startTime" label="活动时间" align="center">
        <template #default="scope">
          {{ parseTime(new Date(scope.row.startTime).getTime()) }} ~
          {{ parseTime(new Date(scope.row.endTime).getTime()) }}
        </template>
      </el-table-column>
      <el-table-column
        prop="duration"
        label="活动时长/小时"
        align="center"
      ></el-table-column>
      <el-table-column prop="unitPrice" label="单价/元" align="center">
        <template #default="scope">
          {{ (~~scope.row.unitPrice / 100).toFixed(2) }}
        </template>
      </el-table-column>
      <el-table-column
        prop="location"
        label="活动地址"
        align="center"
      ></el-table-column>
      <el-table-column label="活动状态" align="center">
        <!-- 活动状态值是当前时间和活动开始结束时间对比的结果
        当前时间晚于活动结束时间,即活动已结束
        当前时间早于活动开始时间,即活动未开始
        当前时间介于活动开始、结束时间之间(含),即活动进行中 -->
        <template #default="scope">
          <span v-show="new Date(scope.row.endTime) < new Date()">已结束</span>
          <span v-show="new Date(scope.row.startTime) > new Date()"
            >未开始</span
          >
          <span
            v-show="
              new Date(scope.row.startTime) <= new Date() &&
              new Date(scope.row.endTime) >= new Date()
            "
            >进行中</span
          >
        </template>
      </el-table-column>
      <el-table-column prop="status" label="发布状态" align="center">
        <template #default="scope">
          {{ globalFilters(scope.row.status, publishData) }}
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template #default="scope">
          <el-button
            type="text"
            @click="issue(scope.row)"
            v-if="scope.row.status == 0"
            >发布</el-button
          >

          <!-- 已发布的活动不能编辑和删除。 -->
          <el-button type="text" v-show="~~scope.row.status === 0"
            ><router-link
              :to="{
                path: '/event/handwork/edit',
                query: { p: JSON.stringify(scope.row) },
              }"
              >编辑</router-link
            ></el-button
          >
          <!-- 活动取消发布了以后,只能查看人员 -->
          <el-button type="text"
            ><router-link
              :to="{
                path: '/event/signup',
                query: {
                  id: scope.row.id,
                  eName: scope.row.name,
                  unitPrice: scope.row.unitPrice,
                },
              }"
              >查看人员</router-link
            ></el-button
          >
          <!-- 活动结束以后可以填写活动总结 -->
          <el-button
            type="text"
            v-show="new Date(scope.row.endTime) < new Date()"
            ><router-link :to="{ path: '/event/summary', query: scope.row }"
              >活动总结</router-link
            ></el-button
          >
          <el-button
            type="text"
            @click="handleDelete(scope.row.id)"
            v-show="~~scope.row.status === 0"
            >删除</el-button
          >

          <!-- 已发布的活动才能取消发布,取消了以后不能再重新发布 -->
          <!-- 已结束的活动,不能取消发布。 -->
          <el-button
            type="text"
            @click="handleCancel(scope.row.id)"
            v-show="
              ~~scope.row.status === 1 &&
              new Date(scope.row.endTime) > new Date()
            "
            >取消发布</el-button
          >
        </template>
      </el-table-column>
    </el-table>
    <Pagination
      :total="data.params.total"
      v-model:currentPage="data.params.query.page"
      v-model:pageSize="data.params.query.pageSize"
      @pageChange="getList"
    ></Pagination>
  </div>
</template>