Files
collab-ledger/frontend/web/src/views/system/dept/utils/hook.tsx
T
2026-05-07 18:39:00 +08:00

207 lines
5.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import dayjs from "dayjs";
import editForm from "../form.vue";
import { setDisabledForTreeOptions, handleTree } from "@/utils/tree";
import { message } from "@/utils/message";
import {
DeptDTO,
DeptRequest,
addDeptApi,
deleteDeptApi,
getDeptInfoApi,
getDeptListApi,
updateDeptApi
} from "@/api/system/dept";
import { usePublicHooks } from "../../hooks";
import { addDialog } from "@/components/ReDialog";
import { reactive, ref, onMounted, h, computed } from "vue";
import { isAllEmpty } from "@pureadmin/utils";
export function useHook() {
const searchFormParams = reactive({
deptName: "",
status: null
});
const formRef = ref();
const originalDataList = ref([]);
const dataList = computed(() => {
let filterDataList = [...originalDataList.value];
if (!isAllEmpty(searchFormParams.deptName)) {
// 前端搜索部门名称
filterDataList = filterDataList.filter((item: DeptDTO) =>
item.deptName.includes(searchFormParams.deptName)
);
}
if (!isAllEmpty(searchFormParams.status)) {
// 前端搜索状态
filterDataList = filterDataList.filter(
(item: DeptDTO) => item.status === searchFormParams.status
);
}
// 处理成树结构
return [...handleTree(filterDataList)];
});
const loading = ref(true);
const { tagStyle } = usePublicHooks();
const columns: TableColumnList = [
{
label: "部门名称",
prop: "deptName",
width: 240,
align: "left"
},
{
label: "部门编号",
prop: "id",
width: 100,
align: "center"
},
{
label: "部门负责人",
prop: "leaderName",
minWidth: 70
},
{
label: "状态",
prop: "status",
minWidth: 100,
cellRenderer: ({ row, props }) => (
<el-tag size={props.size} style={tagStyle.value(row.status)}>
{row.status === 1 ? "启用" : "停用"}
</el-tag>
)
},
{
label: "排序",
prop: "orderNum",
minWidth: 70
},
{
label: "创建时间",
minWidth: 200,
prop: "createTime",
formatter: ({ createTime }) =>
dayjs(createTime).format("YYYY-MM-DD HH:mm:ss")
},
{
label: "操作",
fixed: "right",
width: 240,
slot: "operation"
}
];
function resetForm(formEl) {
if (!formEl) return;
formEl.resetFields();
onSearch();
}
async function onSearch() {
loading.value = true;
// 这里是返回一维数组结构,前端自行处理成树结构,返回格式要求:唯一id加父节点parentIdparentId取父节点id
const { data } = await getDeptListApi().finally(() => {
loading.value = false;
});
originalDataList.value = data;
}
async function handleAdd(row, done) {
await addDeptApi(row).then(() => {
message(`您新增了部门:${row.deptName}`, {
type: "success"
});
// 关闭弹框
done();
// 刷新列表
onSearch();
});
}
async function handleUpdate(row, done) {
await updateDeptApi(row.id, row).then(() => {
message(`您更新了部门${row.deptName}`, {
type: "success"
});
// 关闭弹框
done();
// 刷新列表
onSearch();
});
}
async function openDialog(title = "新增", row?: DeptDTO) {
const { data } = await getDeptListApi();
const treeList = setDisabledForTreeOptions(handleTree(data), "status");
if (title === "编辑") {
row = (await getDeptInfoApi(row.id + "")).data;
}
// TODO 为什么声明一个formInline变量,把变量填充进去, 再给props.formInline 结果就不生效
addDialog({
title: `${title}部门`,
props: {
formInline: {
id: row?.id ?? 0,
parentId: row?.parentId ?? 0,
deptName: row?.deptName ?? "",
leaderName: row?.leaderName ?? "",
phone: row?.phone ?? "",
email: row?.email ?? "",
orderNum: row?.orderNum ?? 0,
status: row?.status ?? 1
},
higherDeptOptions: [...treeList]
},
width: "40%",
draggable: true,
fullscreenIcon: true,
closeOnClickModal: false,
contentRenderer: () => h(editForm, { ref: formRef }),
beforeSure: (done, { options }) => {
const FormRef = formRef.value.getRef();
const curData = options.props.formInline as DeptRequest;
FormRef.validate(valid => {
if (valid) {
// 表单规则校验通过
if (title === "新增") {
handleAdd(curData, done);
} else {
// 实际开发先调用编辑接口,再进行下面操作
handleUpdate(curData, done);
}
}
});
}
});
}
async function handleDelete(row) {
await deleteDeptApi(row.id).then(() => {
message(`您删除了部门${row.deptName}`, { type: "success" });
// 刷新列表
onSearch();
});
}
onMounted(() => {
onSearch();
});
return {
searchFormParams,
loading,
columns,
dataList,
onSearch,
resetForm,
openDialog,
handleDelete
};
}