store.ts 4.57 KB
/*
 * @Author: wangqiang@feewee.cn
 * @Date: 2022-11-19 10:58:19
 * @LastEditors: wangqiang@feewee.cn
 * @LastEditTime: 2023-02-10 14:50:19
 */
import useInitial from "@/hooks/useInitail";
import usePagination from "@/hooks/usePagination";
import {
  AbilitDraftType,
  getQuestionBankSelectListApi,
  getUserAbilityTypeListApi,
} from "@/pages/ehr/ProgramOfStudy/api";
import { useEffect, useMemo, useRef, useState } from "react";
import { getStudyListApi, checkStudyCanEditApi } from "./api";
import { getAbilityDraftListApi } from "../api";
import { Form, message } from "antd";

// 使用角色类型 1全部角色 2部分角色
export enum RoleRangeType {
  "全部角色" = 1,
  "部分角色",
}

// 适配类型 1品牌 2车系 3门店 4通用
export enum AdapterType {
  "品牌" = 1,
  "车系",
  "部分门店",
  "全部门店",
}

//   考核方式类型 1考试 2实操 3考试+实操
export enum AbilityType {
  "考试" = 1,
  "实操",
  "考试+实操",
}

export default function useStore() {
  const [listType, setListType] = useState<"列表" | "草稿">("列表");
  const abilityTypeInitial = useInitial(
    getUserAbilityTypeListApi,
    [],
    undefined
  );
  const listPagination = usePagination(getStudyListApi, { status: 1 });
  const draftPagination = usePagination(getAbilityDraftListApi, {
    type: AbilitDraftType.学习项目,
  });
  const pagination = useMemo(() => {
    if (listType === "列表") {
      return listPagination;
    } else {
      return draftPagination;
    }
  }, [listType, listPagination, draftPagination]);
  const questionBankInitial = useInitial(getQuestionBankSelectListApi, [], {});
  const [current, setCureent] = useState<EHrProgramOfStudySettings.ListVO>();
  const [visible, setVisible] = useState(false);
  const [isView, setIsView] = useState(false);
  const [form] = Form.useForm();
  const [modalInfo, setModalInfo] = useState<{
    visible: boolean;
    title?: "查看适用角色" | "查看适用范围";
    item?: EHrProgramOfStudySettings.ListVO;
    isList?: boolean; // 是否列表进入查看
    isInit?: boolean; // 如果查接口,是否返回结果了
  }>({ visible: false });
  const [approvalProgressModalInfo, setApprovalProgressModalInfo] =
    useState<PublicNotice.ApprovalProgressModalInfo>({ visible: false });
  const [checkLoading, setCheckLoading] = useState(false);

  useEffect(() => {
    if (listType) {
      if (listType === "列表") {
        listPagination.setLoading(true);
      } else {
        draftPagination.setLoading(true);
      }
    }
  }, [listType]);

  useEffect(() => {
    if (questionBankInitial.data.length && visible && !isView) {
      const examList = (form.getFieldValue("examList") ||
        []) as EHrProgramOfStudySettings.QuestionBank[];
      const listIds = questionBankInitial.data.map((item) => item.id);
      form.setFieldValue(
        "examList",
        examList.filter((exam) => listIds.includes(exam.factoryId))
      );
    }
  }, [questionBankInitial.data, visible, isView]);

  // 草稿状态 1未发布 2发布待审批 3审批拒绝 4审批通过 5撤销审批 列表状态 1生效中 2禁用 3过期
  enum Status {
    "生效中" = 1,
    "禁用",
    "过期",
  }

  enum StatusColor {
    "#4189FD" = 1,
    "#FF921C",
    "#F4333C",
  }

  enum DraftStatus {
    "未发布" = 1,
    "审批中",
    "审批拒绝",
    "审批通过",
    "撤销审批",
  }

  enum DraftStatusColor {
    "#999" = 1,
    "#4189FD",
    "#F4333C",
    "#20C688",
    "#FF921C",
  }

  const checkStudyCanEdit = async (item: EHrProgramOfStudySettings.ListVO) => {
    const hide = message.loading("检查中,请稍后...", 0);
    try {
      setCheckLoading(true);
      const { data } = await checkStudyCanEditApi(item.id || -1);
      if (data) {
        setCureent(item);
        setVisible(true);
      } else {
        message.warning("当前学习项目已有存在的草稿,请到草稿列表继续编辑!");
        setListType("草稿");
      }
    } catch (error: any) {
      message.error(error.message);
    } finally {
      hide();
      setCheckLoading(false);
    }
  };

  return {
    listType,
    setListType,
    abilityTypeInitial,
    listPagination,
    draftPagination,
    pagination,
    questionBankInitial,
    current,
    setCureent,
    visible,
    setVisible,
    isView,
    setIsView,
    form,
    approvalProgressModalInfo,
    setApprovalProgressModalInfo,
    RoleRangeType,
    AdapterType,
    AbilityType,
    Status,
    StatusColor,
    DraftStatus,
    DraftStatusColor,
    modalInfo,
    setModalInfo,
    checkLoading,
    setCheckLoading,
    checkStudyCanEdit,
  };
}