定时任务管理,告警管理,用户管理,推进记录信息reqMap传参
parent
bb5295e084
commit
27800acfae
|
|
@ -12,6 +12,14 @@
|
||||||
:prop="option.key"
|
:prop="option.key"
|
||||||
:rules="option.rules"
|
:rules="option.rules"
|
||||||
>
|
>
|
||||||
|
<template #label>
|
||||||
|
<div style="display: flex; align-items: center">
|
||||||
|
{{ option.label }}
|
||||||
|
<el-tooltip v-if="option.tip" :content="option.tip">
|
||||||
|
<el-icon :size="12" class="ml-2"><info-filled /></el-icon>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
<slot :name="option.key">
|
<slot :name="option.key">
|
||||||
<el-input
|
<el-input
|
||||||
v-if="option.type === 'input' || !option.type"
|
v-if="option.type === 'input' || !option.type"
|
||||||
|
|
@ -19,6 +27,7 @@
|
||||||
:placeholder="'请输入' + option.label"
|
:placeholder="'请输入' + option.label"
|
||||||
v-bind="fnGetProps(option)"
|
v-bind="fnGetProps(option)"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<el-input
|
<el-input
|
||||||
v-else-if="option.type === 'textarea'"
|
v-else-if="option.type === 'textarea'"
|
||||||
v-model="modelValue[option.key]"
|
v-model="modelValue[option.key]"
|
||||||
|
|
@ -168,6 +177,7 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { omit } from "lodash-es";
|
import { omit } from "lodash-es";
|
||||||
import { unref } from "vue";
|
import { unref } from "vue";
|
||||||
|
import { InfoFilled } from "@element-plus/icons-vue";
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
options: { type: Array, required: true },
|
options: { type: Array, required: true },
|
||||||
|
|
|
||||||
|
|
@ -27,3 +27,10 @@ export const appFnGetSectorList = async () => {
|
||||||
});
|
});
|
||||||
return dictionariesList;
|
return dictionariesList;
|
||||||
};
|
};
|
||||||
|
// 部门级别
|
||||||
|
export const appFnGetDepartmentLevelList = async () => {
|
||||||
|
const { dictionariesList } = await getDataDictionariesList({
|
||||||
|
parentId: "4a661fa8aedc4d158c9cddaa9d2ec47e",
|
||||||
|
});
|
||||||
|
return dictionariesList;
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
import { postRequest } from "@/request/axios";
|
||||||
|
export const getAlarmList = (params) =>
|
||||||
|
postRequest("/data/aram/getAramList", params); // 告警列表
|
||||||
|
|
||||||
|
export const setAlarmUpdate = (params) =>
|
||||||
|
postRequest("/data/aram/updateAramInfo", params); // 告警处理
|
||||||
|
|
||||||
|
export const getAlarmInfo = (params) =>
|
||||||
|
postRequest("/data/aram/getAramInfo", params); // 告警详情
|
||||||
|
|
@ -32,3 +32,24 @@ export const setRouteDelete = (params) =>
|
||||||
export const setRouteIcon = (params) => postRequest("/sys/menu/icon", params); // 菜单管理修改图标
|
export const setRouteIcon = (params) => postRequest("/sys/menu/icon", params); // 菜单管理修改图标
|
||||||
export const setRouteSort = (params) =>
|
export const setRouteSort = (params) =>
|
||||||
postRequest("/sys/menu/editMenuOrder", params); // 菜单管理排序
|
postRequest("/sys/menu/editMenuOrder", params); // 菜单管理排序
|
||||||
|
export const getScheduleList = (params) =>
|
||||||
|
postRequest("/sys/schedule/list", params); // 定时任务列表
|
||||||
|
export const setScheduleAdd = (params) =>
|
||||||
|
postRequest("/sys/schedule/save", params); // 定时任务添加
|
||||||
|
export const setScheduleUpdate = (params) =>
|
||||||
|
postRequest("/sys/schedule/update", params); // 定时任务修改
|
||||||
|
export const setScheduleDelete = (params) =>
|
||||||
|
postRequest("/sys/schedule/delete", params); // 定时任务删除
|
||||||
|
export const getScheduleInfo = (params) =>
|
||||||
|
postRequest("/sys/schedule/info", params); // 定时任务查看
|
||||||
|
export const setSchedulePause = (params) =>
|
||||||
|
postRequest("/sys/schedule/pause", params); // 定时任务暂停
|
||||||
|
export const setScheduleResume = (params) =>
|
||||||
|
postRequest("/sys/schedule/resume", params); // 定时任务恢复
|
||||||
|
export const setScheduleRun = (params) =>
|
||||||
|
postRequest("/sys/schedule/run", params); // 定时任务立即执行
|
||||||
|
export const getScheduleLogList = (params) =>
|
||||||
|
postRequest("/sys/scheduleLog/list", params); // 定时任务日志列表
|
||||||
|
|
||||||
|
export const getScheduleLogInfo = (params) =>
|
||||||
|
postRequest("/sys/scheduleLog/info", params); // 定时任务日志信息
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,13 @@ export const setDepartmentDelete = (params) =>
|
||||||
export const getDepartmentInfo = (params) =>
|
export const getDepartmentInfo = (params) =>
|
||||||
postRequest("/oa/department/info", params); // 部门信息
|
postRequest("/oa/department/info", params); // 部门信息
|
||||||
export const getUserList = (params) => postRequest("/sys/user/list", params); // 用户列表
|
export const getUserList = (params) => postRequest("/sys/user/list", params); // 用户列表
|
||||||
|
|
||||||
|
export const setUserAdd = (params) => postRequest("/sys/user/save", params); // 用户新增
|
||||||
|
export const setUserUpdate = (params) =>
|
||||||
|
postRequest("/sys/user/update", params); // 用户修改
|
||||||
export const setUserResetPassword = (params) =>
|
export const setUserResetPassword = (params) =>
|
||||||
postRequest("/sys/user/password", params); // 用户重置密码
|
postRequest("/sys/user/password", params); // 用户重置密码
|
||||||
export const setUserDelete = (params) =>
|
export const setUserDelete = (params) =>
|
||||||
postRequest("/sys/user/delete", params); // 用户删除
|
postRequest("/sys/user/delete", params); // 用户删除
|
||||||
export const hasUser = (params) => postRequest("/sys/user/hasUser", params); // 验证用户是否重复
|
export const hasUser = (params) => postRequest("/sys/user/hasUser", params); // 验证用户是否重复
|
||||||
|
export const getUserInfo = (params) => postRequest("/sys/user/getInfo", params); // 用户信息
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
<template>
|
||||||
|
<el-dialog v-model="visible" title="告警处理" :before-close="fnClose">
|
||||||
|
<app-form-builder
|
||||||
|
ref="formRef"
|
||||||
|
v-model="form"
|
||||||
|
:rules
|
||||||
|
:options
|
||||||
|
label-width="160px"
|
||||||
|
>
|
||||||
|
</app-form-builder>
|
||||||
|
<template #footer>
|
||||||
|
<el-button type="primary" @click="fnSubmit">提交</el-button>
|
||||||
|
<el-button @click="fnClose">取消</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import useForm from "@/hooks/useForm.js";
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { debounce } from "throttle-debounce";
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
|
import AppFormBuilder from "@/components/form_builder/index.vue";
|
||||||
|
import { setAlarmUpdate } from "@/request/alarm_management.js";
|
||||||
|
const visible = defineModel("visible", { type: Boolean, required: true });
|
||||||
|
const props = defineProps({
|
||||||
|
id: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const emits = defineEmits(["getData"]);
|
||||||
|
const { formRef, validate, reset } = useForm();
|
||||||
|
const form = ref({
|
||||||
|
alarmReason: "",
|
||||||
|
handleBy: "",
|
||||||
|
handleRemark: "",
|
||||||
|
handleResult: "",
|
||||||
|
handleStatus: "",
|
||||||
|
});
|
||||||
|
const rules = {
|
||||||
|
alarmReason: [
|
||||||
|
{ required: true, message: "告警原因不能为空", trigger: "blur" },
|
||||||
|
],
|
||||||
|
handleBy: [{ required: true, message: "处理人不能为空", trigger: "blur" }],
|
||||||
|
handleRemark: [
|
||||||
|
{ required: true, message: "处理备注不能为空", trigger: "blur" },
|
||||||
|
],
|
||||||
|
handleResult: [
|
||||||
|
{ required: true, message: "处理结果不能为空", trigger: "blur" },
|
||||||
|
],
|
||||||
|
handleStatus: [
|
||||||
|
{ required: true, message: "处理状态不能为空", trigger: "change" },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const handleStatusOptions = [
|
||||||
|
// { name: "未处理", id: 1 },
|
||||||
|
{ name: "处理成功", id: 2 },
|
||||||
|
{ name: "不需要处理", id: 3 },
|
||||||
|
];
|
||||||
|
const options = [
|
||||||
|
{ key: "handleBy", label: "处理人" },
|
||||||
|
{ key: "handleRemark", label: "处理备注" },
|
||||||
|
{ key: "handleResult", label: "处理结果" },
|
||||||
|
{
|
||||||
|
key: "handleStatus",
|
||||||
|
label: "处理状态",
|
||||||
|
type: "select",
|
||||||
|
options: handleStatusOptions,
|
||||||
|
},
|
||||||
|
{ key: "alarmReason", label: "告警原因", type: "textarea", span: 24 },
|
||||||
|
];
|
||||||
|
const fnSubmit = debounce(
|
||||||
|
1000,
|
||||||
|
async () => {
|
||||||
|
await validate();
|
||||||
|
await setAlarmUpdate({ ...form.value, id: props.id });
|
||||||
|
|
||||||
|
ElMessage.success("操作成功");
|
||||||
|
emits("getData");
|
||||||
|
visible.value = false;
|
||||||
|
},
|
||||||
|
{ atBegin: true }
|
||||||
|
);
|
||||||
|
const fnClose = () => {
|
||||||
|
reset();
|
||||||
|
visible.value = false;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss"></style>
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!-- <app-search v-model="searchForm" :options @submit="resetPagination" /> -->
|
||||||
|
<app-table ref="tableRef" v-model:pagination="pagination" :data="list">
|
||||||
|
<el-table-column prop="companyName" label="企业名称" />
|
||||||
|
<el-table-column prop="servicePlatformName" label="服务平台名称" />
|
||||||
|
<el-table-column prop="thirdPlatformName" label="上级平台名称" />
|
||||||
|
<el-table-column prop="handleStatus" label="处理类型">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<span v-if="row.handleStatus === 1"> 未处理</span>
|
||||||
|
<span v-else-if="row.handleStatus === 2"> 处理成功</span>
|
||||||
|
<span v-else-if="row.handleStatus === 3"> 不需要处理</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column v-slot="{ row }" label="操作" width="260">
|
||||||
|
<el-button
|
||||||
|
v-if="row.handleStatus === 1"
|
||||||
|
type="primary"
|
||||||
|
text
|
||||||
|
link
|
||||||
|
@click="fnStatus(row)"
|
||||||
|
>
|
||||||
|
处理
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
text
|
||||||
|
link
|
||||||
|
@click="
|
||||||
|
router.push({
|
||||||
|
path: '/alarm_management/info',
|
||||||
|
query: { id: row.id },
|
||||||
|
})
|
||||||
|
"
|
||||||
|
>
|
||||||
|
查看
|
||||||
|
</el-button>
|
||||||
|
</el-table-column>
|
||||||
|
</app-table>
|
||||||
|
<edit-dialog
|
||||||
|
v-model:visible="editDialogInfo.visible"
|
||||||
|
:id="editDialogInfo.id"
|
||||||
|
@get-data="resetPagination"
|
||||||
|
></edit-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
// import AppSearch from "@/components/search/index.vue";
|
||||||
|
import { ref } from "vue";
|
||||||
|
import useListData from "@/hooks/useListData.js";
|
||||||
|
import { getAlarmList } from "@/request/alarm_management.js";
|
||||||
|
import AppTable from "@/components/table/index.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import editDialog from "./components/edit.vue";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
const { list, pagination, tableRef, resetPagination } =
|
||||||
|
useListData(getAlarmList);
|
||||||
|
// const options = [{ key: "jobName", label: "任务名称" }];
|
||||||
|
const editDialogInfo = ref({
|
||||||
|
visible: false,
|
||||||
|
id: "",
|
||||||
|
});
|
||||||
|
const fnStatus = (row) => {
|
||||||
|
editDialogInfo.value.id = row.id;
|
||||||
|
editDialogInfo.value.visible = true;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<app-info-builder :options :info> </app-info-builder>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
import AppInfoBuilder from "@/components/info_builder/index.vue";
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { getAlarmInfo } from "@/request/alarm_management.js";
|
||||||
|
const route = useRoute();
|
||||||
|
const { id } = route.query;
|
||||||
|
const info = ref({});
|
||||||
|
const fnGetData = async () => {
|
||||||
|
const { data } = await getAlarmInfo({ id });
|
||||||
|
info.value = data;
|
||||||
|
info.value.status = fnStatus(info.value.handleStatus);
|
||||||
|
};
|
||||||
|
fnGetData();
|
||||||
|
const fnStatus = (status) => {
|
||||||
|
switch (status) {
|
||||||
|
case 1:
|
||||||
|
return "未处理";
|
||||||
|
case 2:
|
||||||
|
return "处理成功";
|
||||||
|
case 3:
|
||||||
|
return "不需要处理";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const options = [
|
||||||
|
{ key: "companyName", label: "企业名称" },
|
||||||
|
{ key: "servicePlatformName", label: "服务平台名称" },
|
||||||
|
{ key: "thirdPlatformName", label: "上级平台名称" },
|
||||||
|
{ key: "alarmReason", label: "告警原因" },
|
||||||
|
{ key: "handleBy", label: " 处理人" },
|
||||||
|
{ key: "handleRemark", label: "处理备注" },
|
||||||
|
{
|
||||||
|
key: "handleResult",
|
||||||
|
label: "处理结果",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "status",
|
||||||
|
label: "处理状态",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss"></style>
|
||||||
|
|
@ -56,6 +56,7 @@ import AppSearch from "@/components/search/index.vue";
|
||||||
import AppTable from "@/components/table/index.vue";
|
import AppTable from "@/components/table/index.vue";
|
||||||
import { translationStatus } from "@/assets/js/utils.js";
|
import { translationStatus } from "@/assets/js/utils.js";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
|
// import { reqMapArr } from "./reqMap.js";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const dataType = defineModel("dataType", {
|
const dataType = defineModel("dataType", {
|
||||||
type: Number,
|
type: Number,
|
||||||
|
|
@ -68,7 +69,6 @@ const { list, pagination, searchForm, resetPagination, tableRef } = useListData(
|
||||||
params: () => ({
|
params: () => ({
|
||||||
dataType: dataType.value,
|
dataType: dataType.value,
|
||||||
}),
|
}),
|
||||||
// apiType: apiType.value,
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
const pushOptions = [
|
const pushOptions = [
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,9 @@
|
||||||
{{ translationStatus(row.pushStatus, pushOptions) }}
|
{{ translationStatus(row.pushStatus, pushOptions) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<template v-for="item in reqMapOptions" :key="item.key">
|
||||||
|
<el-table-column :prop="item.key" :label="item.label" />
|
||||||
|
</template>
|
||||||
<el-table-column label="操作" width="240">
|
<el-table-column label="操作" width="240">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-button
|
<el-button
|
||||||
|
|
@ -58,18 +61,33 @@ import AppTable from "@/components/table/index.vue";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { translationStatus } from "@/assets/js/utils.js";
|
import { translationStatus } from "@/assets/js/utils.js";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
import { reqMapArr } from "./reqMap.js";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
const reqMapObj = reqMapArr.find(
|
||||||
|
(item) => item.dataType.indexOf(route.query.dataType) !== -1
|
||||||
|
);
|
||||||
|
const reqMapOptions = reqMapObj?.options || [];
|
||||||
|
const reqMap = reqMapObj?.reqMap;
|
||||||
|
|
||||||
const { list, pagination, searchForm, getData, resetPagination, tableRef } =
|
const { list, pagination, searchForm, getData, resetPagination, tableRef } =
|
||||||
useListData(getRecordList, {
|
useListData(getRecordList, {
|
||||||
|
before: (searchForm) => {
|
||||||
|
Object.keys(reqMap).forEach((key) => {
|
||||||
|
reqMap[key] = searchForm[key] || "";
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
reqMap: reqMap,
|
||||||
|
};
|
||||||
|
},
|
||||||
params: () => ({
|
params: () => ({
|
||||||
thirdPlatformId: route.query.thirdPlatformId,
|
thirdPlatformId: route.query.thirdPlatformId,
|
||||||
companyId: route.query.companyId,
|
companyId: route.query.companyId,
|
||||||
servicePlatformId: route.query.servicePlatformId,
|
servicePlatformId: route.query.servicePlatformId,
|
||||||
dataType: Number(route.query.dataType),
|
dataType: Number(route.query.dataType),
|
||||||
}),
|
}),
|
||||||
// apiType: route.query.apiType,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const pushOptions = [
|
const pushOptions = [
|
||||||
{ id: 1, name: "未推送" },
|
{ id: 1, name: "未推送" },
|
||||||
{ id: 2, name: "定时推送" },
|
{ id: 2, name: "定时推送" },
|
||||||
|
|
@ -81,7 +99,7 @@ const receiveOptions = [
|
||||||
{ id: 1, name: "接收正常" },
|
{ id: 1, name: "接收正常" },
|
||||||
{ id: 2, name: "接收异常" },
|
{ id: 2, name: "接收异常" },
|
||||||
];
|
];
|
||||||
const options = [
|
const optionsBase = [
|
||||||
{
|
{
|
||||||
key: "receiveStatus",
|
key: "receiveStatus",
|
||||||
label: "接收状态",
|
label: "接收状态",
|
||||||
|
|
@ -95,6 +113,7 @@ const options = [
|
||||||
options: pushOptions,
|
options: pushOptions,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
const options = [...optionsBase, ...reqMapOptions];
|
||||||
|
|
||||||
const fnDelete = async (id) => {
|
const fnDelete = async (id) => {
|
||||||
await ElMessageBox.confirm("确定要删除吗?", {
|
await ElMessageBox.confirm("确定要删除吗?", {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,297 @@
|
||||||
|
export const reqMapArr = [
|
||||||
|
{
|
||||||
|
dataType: ["1"],
|
||||||
|
options: [
|
||||||
|
{ key: "hazardCode", label: "对象编码" },
|
||||||
|
{ key: "riskUnitName", label: "单元名称" },
|
||||||
|
{ key: "hazardName", label: "对象名称" },
|
||||||
|
{ key: "hazardDep", label: "部门名称" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
hazardCode: "",
|
||||||
|
riskUnitName: "",
|
||||||
|
hazardName: "",
|
||||||
|
hazardDep: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["2"],
|
||||||
|
options: [
|
||||||
|
{ key: "riskEventName", label: "风险事件名称" },
|
||||||
|
{ key: "riskEventDep", label: "责任部门" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
riskEventName: "",
|
||||||
|
riskEventDep: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["3"],
|
||||||
|
options: [{ key: "riskMeasureDep", label: "管控责任部门" }],
|
||||||
|
reqMap: {
|
||||||
|
riskMeasureDep: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["4"],
|
||||||
|
options: [
|
||||||
|
{ key: "partName", label: "辨识部位" },
|
||||||
|
{ key: "riskEventName", label: "风险事件名称" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
partName: "",
|
||||||
|
riskEventName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["6"],
|
||||||
|
options: [
|
||||||
|
{ key: "checkRiskName", label: "排查风险名称" },
|
||||||
|
{ key: "checkDep", label: "排查部门" },
|
||||||
|
{ key: "checker", label: "排查人" },
|
||||||
|
{ key: "taskName", label: "任务名称" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
checkRiskName: "",
|
||||||
|
checkDep: "",
|
||||||
|
checker: "",
|
||||||
|
taskName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["7"],
|
||||||
|
options: [
|
||||||
|
{ key: "dangerName", label: "隐患名称" },
|
||||||
|
{ key: "dangerLocation", label: "隐患位置" },
|
||||||
|
{ key: "registrant", label: "登记人姓名" },
|
||||||
|
{ key: "registerDept", label: "登记部门" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
dangerName: "",
|
||||||
|
dangerLocation: "",
|
||||||
|
registrant: "",
|
||||||
|
registerDept: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["8"],
|
||||||
|
options: [
|
||||||
|
{ key: "plantCode", label: "装置编码" },
|
||||||
|
{ key: "plantName", label: "装置名称" },
|
||||||
|
{ key: "startPersonName", label: "开停车责任人" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
plantCode: "",
|
||||||
|
plantName: "",
|
||||||
|
startPersonName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["9"],
|
||||||
|
options: [
|
||||||
|
{ key: "plantCode", label: "装置编码" },
|
||||||
|
{ key: "plantName", label: "装置名称" },
|
||||||
|
{ key: "projectName", label: "项目名称" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
plantCode: "",
|
||||||
|
plantName: "",
|
||||||
|
projectName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["10"],
|
||||||
|
options: [
|
||||||
|
{ key: "plantCode", label: "装置编码" },
|
||||||
|
{ key: "plantName", label: "装置名称" },
|
||||||
|
{ key: "plantPrincipalPersonName", label: "装置负责人" },
|
||||||
|
{ key: "maintenanceName", label: "检修任务" },
|
||||||
|
{ key: "maintenancePersonName", label: "大检修责任人" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
plantCode: "",
|
||||||
|
plantName: "",
|
||||||
|
plantPrincipalPersonName: "",
|
||||||
|
maintenanceName: "",
|
||||||
|
maintenancePersonName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["11"],
|
||||||
|
options: [
|
||||||
|
{ key: "planName", label: "名称" },
|
||||||
|
{ key: "deptName", label: "部门" },
|
||||||
|
{ key: "postName", label: "岗位" },
|
||||||
|
{ key: "chargePerson", label: "负责人" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
planName: "",
|
||||||
|
deptName: "",
|
||||||
|
postName: "",
|
||||||
|
chargePerson: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["12"],
|
||||||
|
options: [{ key: "commitment", label: "承诺人" }],
|
||||||
|
reqMap: {
|
||||||
|
commitment: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["13", "47", "49"],
|
||||||
|
options: [{ key: "hazardCode", label: "危险源编码" }],
|
||||||
|
reqMap: {
|
||||||
|
hazardCode: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["15"],
|
||||||
|
options: [
|
||||||
|
{ key: "cnumberplate", label: "车牌号码" },
|
||||||
|
{ key: "entranceName", label: "车辆通行卡口名称" },
|
||||||
|
{ key: "enterpriseName", label: "企业名称" },
|
||||||
|
{ key: "trackgateNum", label: "道闸编号" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
cnumberplate: "",
|
||||||
|
entranceName: "",
|
||||||
|
enterpriseName: "",
|
||||||
|
trackgateNum: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["16"],
|
||||||
|
options: [
|
||||||
|
{ key: "equipmentCode", label: "设备编码" },
|
||||||
|
{ key: "staffType", label: "人员名称" },
|
||||||
|
{ key: "checkName", label: "通行卡口名称" },
|
||||||
|
{ key: "enterpriseName", label: "企业名称" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
equipmentCode: "",
|
||||||
|
staffType: "",
|
||||||
|
checkName: "",
|
||||||
|
enterpriseName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["17"],
|
||||||
|
options: [
|
||||||
|
{ key: "equipCode", label: "设备编码" },
|
||||||
|
{ key: "equipName", label: "设备名称" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
equipCode: "",
|
||||||
|
equipName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["18"],
|
||||||
|
options: [
|
||||||
|
{ key: "crashNumber", label: "预警事件编号" },
|
||||||
|
{ key: "equipCode", label: "设备编码" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
crashNumber: "",
|
||||||
|
equipCode: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["19"],
|
||||||
|
options: [{ key: "equipCode", label: "设备编码" }],
|
||||||
|
reqMap: {
|
||||||
|
equipCode: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["20"],
|
||||||
|
options: [
|
||||||
|
{ key: "personName", label: "人员姓名" },
|
||||||
|
{ key: "positionName", label: "岗位" },
|
||||||
|
{ key: "departmentName", label: "部门" },
|
||||||
|
{ key: "enterpriseName", label: "企业名称" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
personName: "",
|
||||||
|
positionName: "",
|
||||||
|
departmentName: "",
|
||||||
|
enterpriseName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["21"],
|
||||||
|
options: [{ key: "licenseNumber", label: "证件号码" }],
|
||||||
|
reqMap: {
|
||||||
|
licenseNumber: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["24"],
|
||||||
|
options: [{ key: "zoneName", label: "区域名称" }],
|
||||||
|
reqMap: {
|
||||||
|
zoneName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["27"],
|
||||||
|
options: [
|
||||||
|
{ key: "processNodes", label: "流程节点名称" },
|
||||||
|
{ key: "processPersonnel", label: "处理人员名称" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
processNodes: "",
|
||||||
|
processPersonnel: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["28"],
|
||||||
|
options: [{ key: "confirmPerson", label: "确认人" }],
|
||||||
|
reqMap: {
|
||||||
|
confirmPerson: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["29"],
|
||||||
|
options: [
|
||||||
|
{ key: "gasName", label: "气体名称" },
|
||||||
|
{ key: "analyst", label: "分析人" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
gasName: "",
|
||||||
|
analyst: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: ["32"],
|
||||||
|
options: [{ key: "fileName", label: "附件名称" }],
|
||||||
|
reqMap: {
|
||||||
|
fileName: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataType: [
|
||||||
|
"33",
|
||||||
|
"34",
|
||||||
|
"35",
|
||||||
|
"36",
|
||||||
|
"37",
|
||||||
|
"38",
|
||||||
|
"39",
|
||||||
|
"40",
|
||||||
|
"41",
|
||||||
|
"42",
|
||||||
|
"43",
|
||||||
|
"44",
|
||||||
|
"45",
|
||||||
|
],
|
||||||
|
options: [
|
||||||
|
{ key: "workName", label: "作业名称" },
|
||||||
|
{ key: "workNumber", label: "作业票编号" },
|
||||||
|
],
|
||||||
|
reqMap: {
|
||||||
|
workName: "",
|
||||||
|
workNumber: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
v-model="visible"
|
||||||
|
:title="type === 'edit' ? '修改' : '新增'"
|
||||||
|
:before-close="fnClose"
|
||||||
|
>
|
||||||
|
<app-form-builder
|
||||||
|
ref="formRef"
|
||||||
|
v-model="form"
|
||||||
|
:rules
|
||||||
|
:options
|
||||||
|
label-width="160px"
|
||||||
|
>
|
||||||
|
</app-form-builder>
|
||||||
|
<template #footer>
|
||||||
|
<el-button type="primary" @click="fnSubmit">提交</el-button>
|
||||||
|
<el-button @click="fnClose">取消</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import useForm from "@/hooks/useForm.js";
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { debounce } from "throttle-debounce";
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
|
import AppFormBuilder from "@/components/form_builder/index.vue";
|
||||||
|
import {
|
||||||
|
setScheduleAdd,
|
||||||
|
setScheduleUpdate,
|
||||||
|
getScheduleInfo,
|
||||||
|
} from "@/request/system_management.js";
|
||||||
|
const visible = defineModel("visible", { type: Boolean, required: true });
|
||||||
|
const props = defineProps({
|
||||||
|
info: { type: Object, required: true },
|
||||||
|
type: { type: String, required: true },
|
||||||
|
});
|
||||||
|
const emits = defineEmits(["getData"]);
|
||||||
|
const { formRef, validate, reset } = useForm();
|
||||||
|
const form = ref({
|
||||||
|
beanName: "",
|
||||||
|
chargeName: "",
|
||||||
|
jobName: "",
|
||||||
|
params: "",
|
||||||
|
cronExpression: "",
|
||||||
|
remark: "",
|
||||||
|
status: 0,
|
||||||
|
});
|
||||||
|
const rules = {
|
||||||
|
beanName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
|
||||||
|
jobName: [{ required: true, message: "任务名称不能为空", trigger: "blur" }],
|
||||||
|
chargeName: [{ required: true, message: "负责人不能为空", trigger: "blur" }],
|
||||||
|
cronExpression: [
|
||||||
|
{ required: true, message: "cron表达式不能为空", trigger: "blur" },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const options = [
|
||||||
|
{ key: "beanName", label: "bean名称" },
|
||||||
|
{ key: "jobName", label: "任务名称" },
|
||||||
|
{ key: "chargeName", label: "负责人" },
|
||||||
|
{ key: "params", label: "参数" },
|
||||||
|
{
|
||||||
|
key: "cronExpression",
|
||||||
|
label: "cron表达式",
|
||||||
|
},
|
||||||
|
{ key: "remark", label: "备注" },
|
||||||
|
];
|
||||||
|
const fnGetData = async () => {
|
||||||
|
if (!props.info.id) return;
|
||||||
|
if (visible.value) {
|
||||||
|
const { schedule } = await getScheduleInfo({ jobId: props.info.id });
|
||||||
|
form.value = schedule;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fnGetData();
|
||||||
|
const fnSubmit = debounce(
|
||||||
|
1000,
|
||||||
|
async () => {
|
||||||
|
await validate();
|
||||||
|
!props.info.id
|
||||||
|
? await setScheduleAdd(form.value)
|
||||||
|
: await setScheduleUpdate(form.value);
|
||||||
|
|
||||||
|
ElMessage.success("操作成功");
|
||||||
|
emits("getData");
|
||||||
|
visible.value = false;
|
||||||
|
},
|
||||||
|
{ atBegin: true }
|
||||||
|
);
|
||||||
|
const fnClose = () => {
|
||||||
|
reset();
|
||||||
|
visible.value = false;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss"></style>
|
||||||
|
|
@ -0,0 +1,155 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<app-search v-model="searchForm" :options @submit="resetPagination" />
|
||||||
|
<app-table
|
||||||
|
ref="tableRef"
|
||||||
|
v-model:pagination="pagination"
|
||||||
|
:data="list"
|
||||||
|
@get-data="getData"
|
||||||
|
>
|
||||||
|
<el-table-column prop="beanName" label="bean名称" />
|
||||||
|
<el-table-column prop="jobName" label="任务名称" />
|
||||||
|
<el-table-column prop="chargeName" label="负责人" />
|
||||||
|
<el-table-column prop="params" label="参数" />
|
||||||
|
<el-table-column prop="cronExpression" label="cron表达式" />
|
||||||
|
<el-table-column prop="remark" label="备注" />
|
||||||
|
<el-table-column prop="status" label="状态">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag v-if="row.status === 0" type="success">正常</el-tag>
|
||||||
|
<el-tag v-else type="danger">暂停</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column v-slot="{ row }" label="操作" width="260">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
text
|
||||||
|
link
|
||||||
|
@click="fnAddOrEdit('edit', row.jobId)"
|
||||||
|
>
|
||||||
|
修改
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
text
|
||||||
|
link
|
||||||
|
@click="fnDelete(row.jobId, row.beanName)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-if="row.status === 0"
|
||||||
|
type="primary"
|
||||||
|
text
|
||||||
|
link
|
||||||
|
@click="fnPause(row.jobId, row.beanName)"
|
||||||
|
>
|
||||||
|
暂停
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-if="row.status === 1"
|
||||||
|
type="primary"
|
||||||
|
text
|
||||||
|
link
|
||||||
|
@click="fnResume(row.jobId, row.beanName)"
|
||||||
|
>
|
||||||
|
恢复
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
text
|
||||||
|
link
|
||||||
|
@click="fnRun(row.jobId, row.beanName)"
|
||||||
|
>
|
||||||
|
立即执行
|
||||||
|
</el-button>
|
||||||
|
</el-table-column>
|
||||||
|
<template #button>
|
||||||
|
<el-button type="primary" @click="fnAddOrEdit('add', '')">
|
||||||
|
新增
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</app-table>
|
||||||
|
<edit-dialog
|
||||||
|
v-if="addOrEditDialog.visible"
|
||||||
|
v-model:visible="addOrEditDialog.visible"
|
||||||
|
:type="addOrEditDialog.type"
|
||||||
|
:info="addOrEditDialog.info"
|
||||||
|
@get-data="resetPagination"
|
||||||
|
></edit-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref } from "vue";
|
||||||
|
import AppSearch from "@/components/search/index.vue";
|
||||||
|
import useListData from "@/hooks/useListData.js";
|
||||||
|
import {
|
||||||
|
getScheduleList,
|
||||||
|
setScheduleDelete,
|
||||||
|
setSchedulePause,
|
||||||
|
setScheduleResume,
|
||||||
|
setScheduleRun,
|
||||||
|
} from "@/request/system_management.js";
|
||||||
|
import AppTable from "@/components/table/index.vue";
|
||||||
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
|
import editDialog from "./components/add.vue";
|
||||||
|
|
||||||
|
const { list, pagination, getData, searchForm, resetPagination, tableRef } =
|
||||||
|
useListData(getScheduleList);
|
||||||
|
const addOrEditDialog = ref({
|
||||||
|
visible: false,
|
||||||
|
type: "",
|
||||||
|
info: {
|
||||||
|
id: "",
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
beanName: "",
|
||||||
|
chargeName: "",
|
||||||
|
jobName: "",
|
||||||
|
params: "",
|
||||||
|
cronExpression: "",
|
||||||
|
remark: "",
|
||||||
|
status: 0,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const options = [{ key: "jobName", label: "任务名称" }];
|
||||||
|
const fnAddOrEdit = async (type, id) => {
|
||||||
|
addOrEditDialog.value.type = type;
|
||||||
|
// addOrEditDialog.value.visible = true;
|
||||||
|
// await nextTick();
|
||||||
|
// if (type === "add") {
|
||||||
|
// addOrEditDialog.value.info = { id: "" };
|
||||||
|
// } else {
|
||||||
|
// }
|
||||||
|
addOrEditDialog.value.info = { id: id };
|
||||||
|
addOrEditDialog.value.visible = true;
|
||||||
|
};
|
||||||
|
const fnDelete = async (id, name) => {
|
||||||
|
await ElMessageBox.confirm(`确定要删除【${name}】吗?`, { type: "warning" });
|
||||||
|
await setScheduleDelete({ jobId: id });
|
||||||
|
ElMessage.success("删除成功");
|
||||||
|
resetPagination();
|
||||||
|
};
|
||||||
|
const fnPause = async (id, name) => {
|
||||||
|
await ElMessageBox.confirm(`确定要暂停【${name}】吗?`, { type: "warning" });
|
||||||
|
await setSchedulePause({ jobId: id });
|
||||||
|
ElMessage.success("操作成功");
|
||||||
|
resetPagination();
|
||||||
|
};
|
||||||
|
const fnResume = async (id, name) => {
|
||||||
|
await ElMessageBox.confirm(`确定要恢复【${name}】吗?`, { type: "warning" });
|
||||||
|
await setScheduleResume({ jobId: id });
|
||||||
|
ElMessage.success("操作成功");
|
||||||
|
resetPagination();
|
||||||
|
};
|
||||||
|
const fnRun = async (id, name) => {
|
||||||
|
await ElMessageBox.confirm(`确定要立即执行【${name}】吗?`, {
|
||||||
|
type: "warning",
|
||||||
|
});
|
||||||
|
await setScheduleRun({ jobId: id });
|
||||||
|
ElMessage.success("操作成功");
|
||||||
|
resetPagination();
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<app-search v-model="searchForm" :options @submit="resetPagination" />
|
||||||
|
<app-table ref="tableRef" v-model:pagination="pagination" :data="list">
|
||||||
|
<el-table-column prop="beanName" label="bean名称" />
|
||||||
|
<el-table-column prop="jobName" label="任务名称" />
|
||||||
|
<el-table-column prop="params" label="参数" />
|
||||||
|
<el-table-column prop="status" label="状态">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag v-if="row.status === 0" type="success">正常</el-tag>
|
||||||
|
<el-tag v-else type="danger">暂停</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="error" label="失败信息" />
|
||||||
|
<el-table-column prop="times" label="耗时(毫秒)" />
|
||||||
|
<el-table-column prop="createTime" label="创建时间" />
|
||||||
|
|
||||||
|
<el-table-column v-slot="{ row }" label="操作" width="260">
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
text
|
||||||
|
link
|
||||||
|
@click="
|
||||||
|
router.push({
|
||||||
|
path: '/schedule_management/scheduleLog/info',
|
||||||
|
query: { logId: row.logId },
|
||||||
|
})
|
||||||
|
"
|
||||||
|
>
|
||||||
|
查看
|
||||||
|
</el-button>
|
||||||
|
</el-table-column>
|
||||||
|
</app-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import AppSearch from "@/components/search/index.vue";
|
||||||
|
import useListData from "@/hooks/useListData.js";
|
||||||
|
import { getScheduleLogList } from "@/request/system_management.js";
|
||||||
|
import AppTable from "@/components/table/index.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
const { list, pagination, searchForm, resetPagination, tableRef } =
|
||||||
|
useListData(getScheduleLogList);
|
||||||
|
const options = [{ key: "jobName", label: "任务名称" }];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<app-info-builder :options :info> </app-info-builder>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
import AppInfoBuilder from "@/components/info_builder/index.vue";
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { getScheduleLogInfo } from "@/request/system_management.js";
|
||||||
|
const route = useRoute();
|
||||||
|
const { logId } = route.query;
|
||||||
|
const info = ref({});
|
||||||
|
const options = [
|
||||||
|
{ key: "beanName", label: "bean名称" },
|
||||||
|
{ key: "jobName", label: "任务名称" },
|
||||||
|
{ key: "params", label: "参数" },
|
||||||
|
{
|
||||||
|
key: "status",
|
||||||
|
label: "状态",
|
||||||
|
value: info.value.status === 0 ? "正常" : "暂停",
|
||||||
|
},
|
||||||
|
{ key: "error", label: "失败信息" },
|
||||||
|
{ key: "times", label: "耗时(毫秒)" },
|
||||||
|
{ key: "createTime", label: "创建时间" },
|
||||||
|
];
|
||||||
|
const fnGetData = async () => {
|
||||||
|
const { log } = await getScheduleLogInfo({ logId });
|
||||||
|
info.value = log;
|
||||||
|
};
|
||||||
|
fnGetData();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss"></style>
|
||||||
|
|
@ -13,70 +13,31 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="行政区域级别" prop="level">
|
<el-form-item label="部门级别" prop="level">
|
||||||
<el-select
|
<el-select v-model="form.level">
|
||||||
v-model="form.level"
|
|
||||||
placeholder="请选择"
|
|
||||||
@change="fnChangeLevel"
|
|
||||||
>
|
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in ADMINISTRATIVE_REGION_LEVEL_LIST"
|
v-for="item in departmentLevelList"
|
||||||
:key="item.id"
|
:key="item.dictionaryId"
|
||||||
:label="item.name"
|
:label="item.name"
|
||||||
:value="item.id"
|
:value="item.dictionaryId"
|
||||||
/>
|
></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-if="form.level" :span="12">
|
|
||||||
<el-form-item :key="form.level" label="所属区域" prop="area">
|
|
||||||
<app-area-cascader
|
|
||||||
v-model="form.area"
|
|
||||||
control-level
|
|
||||||
:level="form.level"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col v-if="type === '2'" :span="12">
|
|
||||||
<el-form-item label="部门类别" prop="category">
|
|
||||||
<el-select v-model="form.category" placeholder="请选择">
|
|
||||||
<el-option
|
|
||||||
v-for="item in categoryList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col v-if="parentId === '0'" :span="12">
|
|
||||||
<el-form-item label="是否监管部门" prop="supervisory">
|
|
||||||
<el-select v-model="form.supervisory" placeholder="请选择">
|
|
||||||
<el-option
|
|
||||||
v-for="item in WHETHER_LIST"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<template v-if="!!departmentId">
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="主管负责人" prop="headman">
|
|
||||||
<app-user v-model="form.headman" splicing-label />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="分管领导" prop="lrman">
|
|
||||||
<app-user v-model="form.lrman" splicing-label />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</template>
|
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="排序" prop="depOrder">
|
<el-form-item label="部门负责人" prop="headman">
|
||||||
|
<el-input v-model="form.headman" splicing-label />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="手机号" prop="phone">
|
||||||
|
<el-input v-model="form.phone" splicing-label />
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="排序" prop="orderBy">
|
||||||
<el-input
|
<el-input
|
||||||
v-model.number="form.depOrder"
|
v-model.number="form.orderBy"
|
||||||
placeholder="这里输入排序..."
|
placeholder="这里输入排序..."
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
@ -93,12 +54,8 @@
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import useForm from "@/hooks/useForm.js";
|
import useForm from "@/hooks/useForm.js";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import AppAreaCascader from "@/components/area_cascader/index.vue";
|
import { appFnGetDepartmentLevelList } from "@/data_dictionary/data_dictionary.js";
|
||||||
import AppUser from "@/components/user/index.vue";
|
import useDataDictionary from "@/hooks/useDataDictionary.js";
|
||||||
import {
|
|
||||||
ADMINISTRATIVE_REGION_LEVEL_LIST,
|
|
||||||
WHETHER_LIST,
|
|
||||||
} from "@/assets/js/constant.js";
|
|
||||||
import { debounce } from "throttle-debounce";
|
import { debounce } from "throttle-debounce";
|
||||||
import {
|
import {
|
||||||
getDepartmentInfo,
|
getDepartmentInfo,
|
||||||
|
|
@ -106,92 +63,46 @@ import {
|
||||||
setDepartmentUpdate,
|
setDepartmentUpdate,
|
||||||
} from "@/request/user_management.js";
|
} from "@/request/user_management.js";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
|
import { MOBILE_PHONE } from "@/assets/js/regular.js";
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { parentId, parentName, type, departmentId } = route.query;
|
const { parentId, parentName, departmentId } = route.query;
|
||||||
const { formRef, validate } = useForm();
|
const { formRef, validate } = useForm();
|
||||||
const form = ref({
|
const form = ref({
|
||||||
name: "",
|
name: "",
|
||||||
level: "",
|
level: "",
|
||||||
area: [],
|
|
||||||
category: "",
|
|
||||||
supervisory: "",
|
|
||||||
headman: "",
|
headman: "",
|
||||||
lrman: "",
|
phone: "",
|
||||||
depOrder: "",
|
orderBy: "",
|
||||||
});
|
});
|
||||||
const parentInfo = {
|
|
||||||
parentIds: "",
|
|
||||||
parentNames: "",
|
|
||||||
treeIds: "",
|
|
||||||
treeNames: "",
|
|
||||||
};
|
|
||||||
const rules = {
|
const rules = {
|
||||||
name: [{ required: true, message: "请输入部门名称", trigger: "blur" }],
|
name: [{ required: true, message: "请输入部门名称", trigger: "blur" }],
|
||||||
level: [{ required: true, message: "请选择部门级别", trigger: "change" }],
|
level: [{ required: true, message: "请选择部门级别", trigger: "change" }],
|
||||||
area: [{ required: true, message: "请选择所属区域", trigger: "change" }],
|
phone: [
|
||||||
category: [{ required: true, message: "请选择部门类别", trigger: "change" }],
|
{ required: false, message: "手机号", trigger: "blur" },
|
||||||
supervisory: [
|
{ pattern: MOBILE_PHONE, message: "请输入正确的手机号码", trigger: "blur" },
|
||||||
{ required: true, message: "请选择是否监管部门", trigger: "change" },
|
|
||||||
],
|
],
|
||||||
depOrder: [{ required: true, message: "请输入排序", trigger: "blur" }],
|
orderBy: [{ required: true, message: "请输入排序", trigger: "blur" }],
|
||||||
};
|
};
|
||||||
const categoryList = [
|
const { data: departmentLevelList } = useDataDictionary(
|
||||||
{ id: "1", name: "行业监管" },
|
appFnGetDepartmentLevelList
|
||||||
{ id: "2", name: "综合监管" },
|
);
|
||||||
];
|
|
||||||
const fnGetData = async () => {
|
const fnGetData = async () => {
|
||||||
if (!departmentId) return;
|
if (!departmentId) return;
|
||||||
const { data } = await getDepartmentInfo(departmentId);
|
const { department } = await getDepartmentInfo({
|
||||||
form.value = data;
|
departmentId: departmentId,
|
||||||
form.value.area = [
|
});
|
||||||
data.province,
|
form.value = department;
|
||||||
data.city,
|
|
||||||
data.county,
|
|
||||||
data.village,
|
|
||||||
data.street,
|
|
||||||
].filter(Boolean);
|
|
||||||
parentInfo.parentIds = data.parentIds;
|
|
||||||
parentInfo.parentNames = data.parentNames;
|
|
||||||
parentInfo.treeIds = data.treeIds;
|
|
||||||
parentInfo.treeNames = data.treeNames;
|
|
||||||
};
|
};
|
||||||
fnGetData();
|
fnGetData();
|
||||||
const fnGetDataParent = async () => {
|
|
||||||
if (parentId === "0" || departmentId) return;
|
|
||||||
const { data } = await getDepartmentInfo(parentId);
|
|
||||||
const parentIds = data.parentIds.split(",");
|
|
||||||
const parentNames = data.parentNames.split(",");
|
|
||||||
const treeIds = data.treeIds.split(",");
|
|
||||||
const treeNames = data.treeNames.split(",");
|
|
||||||
parentIds.push(parentId);
|
|
||||||
parentNames.push(parentName);
|
|
||||||
parentInfo.parentIds = parentIds.filter(Boolean).join(",");
|
|
||||||
parentInfo.parentNames = parentNames.filter(Boolean).join(",");
|
|
||||||
parentInfo.treeIds = treeIds.filter(Boolean).join(",");
|
|
||||||
parentInfo.treeNames = treeNames.filter(Boolean).join(",");
|
|
||||||
};
|
|
||||||
fnGetDataParent();
|
|
||||||
const fnChangeLevel = (event) => {
|
|
||||||
if (event === 1) form.value.area = ["130000", "130300"];
|
|
||||||
else form.value.area = [];
|
|
||||||
};
|
|
||||||
const fnSubmit = debounce(
|
const fnSubmit = debounce(
|
||||||
1000,
|
1000,
|
||||||
async () => {
|
async () => {
|
||||||
await validate();
|
await validate();
|
||||||
const [province = "", city = "", county = "", village = "", street = ""] =
|
|
||||||
form.value.area;
|
|
||||||
const params = {
|
const params = {
|
||||||
...form.value,
|
...form.value,
|
||||||
...parentInfo,
|
|
||||||
province,
|
|
||||||
city,
|
|
||||||
county,
|
|
||||||
village,
|
|
||||||
street,
|
|
||||||
type,
|
|
||||||
parentId,
|
parentId,
|
||||||
};
|
};
|
||||||
!departmentId
|
!departmentId
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div style="display: flex; gap: 20px">
|
<div style="display: flex; gap: 20px">
|
||||||
<div style="width: 300px">
|
|
||||||
<app-area-view-tree
|
|
||||||
:default-expanded-keys="code"
|
|
||||||
@node-click="fnNavigation({ code: $event.bianma, level: $event.level })"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div style="flex: 1">
|
<div style="flex: 1">
|
||||||
<el-tabs v-model="activeTab" @tab-change="fnNavigation({ type: $event })">
|
|
||||||
<el-tab-pane
|
|
||||||
v-for="tab in tabs"
|
|
||||||
:key="tab.id"
|
|
||||||
:name="tab.id"
|
|
||||||
:label="tab.name"
|
|
||||||
/>
|
|
||||||
</el-tabs>
|
|
||||||
<app-table
|
<app-table
|
||||||
v-model:pagination="pagination"
|
v-model:pagination="pagination"
|
||||||
:data="list"
|
:data="list"
|
||||||
|
|
@ -35,24 +21,9 @@
|
||||||
{{ row.name }}
|
{{ row.name }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column v-slot="{ row }" prop="category" label="部门类型">
|
<el-table-column prop="levelName" label="部门级别" />
|
||||||
<div v-if="row.category === '1'">行业监管</div>
|
<el-table-column prop="headman" label="部门负责人" />
|
||||||
<div v-if="row.category === '2'">综合监管</div>
|
<el-table-column prop="phone" label="手机号" />
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="headmanName" label="部门负责人" />
|
|
||||||
<el-table-column v-slot="{ row }" label="属地">
|
|
||||||
{{
|
|
||||||
[
|
|
||||||
row.provinceName,
|
|
||||||
row.cityName,
|
|
||||||
row.countyName,
|
|
||||||
row.villageName,
|
|
||||||
row.streetName,
|
|
||||||
]
|
|
||||||
.filter(Boolean)
|
|
||||||
.join("--")
|
|
||||||
}}
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column v-slot="{ row }" label="操作" width="120">
|
<el-table-column v-slot="{ row }" label="操作" width="120">
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
|
|
@ -64,7 +35,6 @@
|
||||||
query: {
|
query: {
|
||||||
parentId,
|
parentId,
|
||||||
parentName,
|
parentName,
|
||||||
type: activeTab,
|
|
||||||
departmentId: row.departmentId,
|
departmentId: row.departmentId,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
@ -73,7 +43,6 @@
|
||||||
修改
|
修改
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="parentId !== '0' || isRootAdd"
|
|
||||||
type="danger"
|
type="danger"
|
||||||
text
|
text
|
||||||
link
|
link
|
||||||
|
|
@ -84,12 +53,12 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template #button>
|
<template #button>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="parentId !== '0' || isRootAdd"
|
v-if="parentId !== '0'"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="
|
@click="
|
||||||
router.push({
|
router.push({
|
||||||
path: '/user_management/department/add',
|
path: '/user_management/department/add',
|
||||||
query: { parentId, parentName, type: activeTab },
|
query: { parentId, parentName },
|
||||||
})
|
})
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
|
|
@ -109,9 +78,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import AppAreaViewTree from "@/components/area_view_tree/index.vue";
|
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { useUserStore } from "@/pinia/user.js";
|
|
||||||
import useListData from "@/hooks/useListData.js";
|
import useListData from "@/hooks/useListData.js";
|
||||||
import {
|
import {
|
||||||
getDepartmentList,
|
getDepartmentList,
|
||||||
|
|
@ -121,73 +88,27 @@ import AppTable from "@/components/table/index.vue";
|
||||||
import { ArrowLeft } from "@element-plus/icons-vue";
|
import { ArrowLeft } from "@element-plus/icons-vue";
|
||||||
import { onBeforeRouteUpdate, useRoute, useRouter } from "vue-router";
|
import { onBeforeRouteUpdate, useRoute, useRouter } from "vue-router";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { DEPARTMENT_CATEGORY_LIST } from "@/assets/js/constant.js";
|
|
||||||
|
|
||||||
const userStore = useUserStore();
|
|
||||||
const userInfo = userStore.getUserInfo;
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const defaultQuery = {
|
const defaultQuery = {
|
||||||
parentId: "0",
|
parentId: "0",
|
||||||
parentName: "(无)此项为顶级部门",
|
parentName: "(无)此项为顶级部门",
|
||||||
type: "1",
|
|
||||||
code: "",
|
|
||||||
level: "",
|
|
||||||
};
|
};
|
||||||
const parentId = ref(route.query.parentId || defaultQuery.parentId);
|
const parentId = ref(route.query.parentId || defaultQuery.parentId);
|
||||||
const parentName = ref(route.query.parentName || defaultQuery.parentName);
|
const parentName = ref(route.query.parentName || defaultQuery.parentName);
|
||||||
const activeTab = ref(route.query.type || defaultQuery.type);
|
|
||||||
const code = ref(route.query.code || defaultQuery.code);
|
|
||||||
const level = ref(route.query.level || defaultQuery.level);
|
|
||||||
const isRootAdd = ref(true);
|
|
||||||
const tabs = ref(
|
|
||||||
DEPARTMENT_CATEGORY_LIST.map((item) => ({
|
|
||||||
...item,
|
|
||||||
show: true,
|
|
||||||
}))
|
|
||||||
);
|
|
||||||
const fnInitTabs = () => {
|
|
||||||
if (userInfo.userId === "1") return;
|
|
||||||
const roleId = "6084ca2e939f4fa6bed93ce01786df35";
|
|
||||||
const roleIndex = userInfo.rolesId?.indexOf(roleId);
|
|
||||||
if (roleIndex !== -1) {
|
|
||||||
activeTab.value = "1";
|
|
||||||
tabs.value.forEach((item, index) => {
|
|
||||||
item.show = index !== 3;
|
|
||||||
});
|
|
||||||
} else if (userInfo.type === 2) {
|
|
||||||
isRootAdd.value = false;
|
|
||||||
activeTab.value = "2";
|
|
||||||
tabs.value.forEach((item, index) => {
|
|
||||||
item.show = index === 1;
|
|
||||||
});
|
|
||||||
} else if (userInfo.type === 3) {
|
|
||||||
isRootAdd.value = false;
|
|
||||||
activeTab.value = "3";
|
|
||||||
tabs.value.forEach((item, index) => {
|
|
||||||
item.show = index === 2;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
tabs.value = tabs.value.filter((item) => item.show);
|
|
||||||
};
|
|
||||||
fnInitTabs();
|
|
||||||
const { list, pagination, getData, resetPagination } = useListData(
|
const { list, pagination, getData, resetPagination } = useListData(
|
||||||
getDepartmentList,
|
getDepartmentList,
|
||||||
{
|
{
|
||||||
params: () => ({
|
params: () => ({
|
||||||
type: activeTab.value,
|
parentId: parentId.value,
|
||||||
code: code.value,
|
|
||||||
level: level.value,
|
|
||||||
departmentId: parentId.value,
|
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
onBeforeRouteUpdate((to) => {
|
onBeforeRouteUpdate((to) => {
|
||||||
parentId.value = to.query.parentId || defaultQuery.parentId;
|
parentId.value = to.query.parentId || defaultQuery.parentId;
|
||||||
parentName.value = to.query.parentName || defaultQuery.parentName;
|
parentName.value = to.query.parentName || defaultQuery.parentName;
|
||||||
activeTab.value = to.query.type || defaultQuery.type;
|
|
||||||
code.value = to.query.code || defaultQuery.code;
|
|
||||||
level.value = to.query.level || defaultQuery.level;
|
|
||||||
resetPagination();
|
resetPagination();
|
||||||
});
|
});
|
||||||
const fnNavigation = (query) => {
|
const fnNavigation = (query) => {
|
||||||
|
|
@ -201,7 +122,7 @@ const fnNavigation = (query) => {
|
||||||
};
|
};
|
||||||
const fnDelete = async (departmentId, name) => {
|
const fnDelete = async (departmentId, name) => {
|
||||||
await ElMessageBox.confirm(`确定要删除【${name}】吗?`, { type: "warning" });
|
await ElMessageBox.confirm(`确定要删除【${name}】吗?`, { type: "warning" });
|
||||||
await setDepartmentDelete({ ids: [departmentId] });
|
await setDepartmentDelete({ departmentId: departmentId });
|
||||||
ElMessage.success("删除成功");
|
ElMessage.success("删除成功");
|
||||||
resetPagination();
|
resetPagination();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,92 +2,6 @@
|
||||||
<div>
|
<div>
|
||||||
<el-form ref="formRef" :rules="rules" :model="form" label-width="110px">
|
<el-form ref="formRef" :rules="rules" :model="form" label-width="110px">
|
||||||
<el-row :gutter="12">
|
<el-row :gutter="12">
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="角色" prop="roleId">
|
|
||||||
<el-select v-model="form.roleId">
|
|
||||||
<el-option
|
|
||||||
v-for="item in roleList"
|
|
||||||
:key="item.roleId"
|
|
||||||
:label="item.roleName"
|
|
||||||
:value="item.roleId"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col v-if="form.roleId" :span="12">
|
|
||||||
<el-form-item label="行政区域级别" prop="level">
|
|
||||||
<el-select v-model="form.level">
|
|
||||||
<el-option
|
|
||||||
v-for="item in ADMINISTRATIVE_REGION_LEVEL_LIST"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col
|
|
||||||
v-if="form.roleId && form.level && form.level !== '-1'"
|
|
||||||
:span="12"
|
|
||||||
>
|
|
||||||
<el-form-item :key="form.level" label="所属区域" prop="area">
|
|
||||||
<app-area-cascader v-model="form.area" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col
|
|
||||||
v-if="form.roleId && form.level && form.area.length > 0"
|
|
||||||
:span="12"
|
|
||||||
>
|
|
||||||
<el-form-item label="部门类别" prop="type">
|
|
||||||
<el-select v-model="form.type">
|
|
||||||
<el-option
|
|
||||||
v-for="item in DEPARTMENT_CATEGORY_LIST"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col
|
|
||||||
v-if="form.roleId && form.level && form.area.length > 0 && pd.type"
|
|
||||||
:span="12"
|
|
||||||
>
|
|
||||||
<el-form-item label="部门" prop="departmentId">
|
|
||||||
<app-department v-model="form.departmentId" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col v-if="form.roleId && form.level && form.type === 1" :span="12">
|
|
||||||
<el-form-item label="安委会部门" prop="departmentCommission">
|
|
||||||
<app-department v-model="form.departmentCommission" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
|
||||||
<el-form-item label="职务" prop="duty">
|
|
||||||
<el-select v-model="form.duty" allow-create default-first-option>
|
|
||||||
<el-option
|
|
||||||
v-for="item in dutyList"
|
|
||||||
:key="item.bianma"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.bianma"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col
|
|
||||||
v-if="
|
|
||||||
form.type === 3 &&
|
|
||||||
(form.level === '2' || form.level === '3' || form.level === '4')
|
|
||||||
"
|
|
||||||
:span="12"
|
|
||||||
>
|
|
||||||
<el-form-item label="网格" prop="grid">
|
|
||||||
<el-select v-model="form.grid">
|
|
||||||
<el-option label="网格长" value="0" />
|
|
||||||
<el-option v-if="form.level === '4'" label="网格员" value="1" />
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="用户名" prop="username">
|
<el-form-item label="用户名" prop="username">
|
||||||
<el-input v-model="form.username" />
|
<el-input v-model="form.username" />
|
||||||
|
|
@ -99,8 +13,8 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="手机号" prop="phone">
|
<el-form-item label="手机号" prop="mobile">
|
||||||
<el-input v-model="form.phone" />
|
<el-input v-model="form.mobile" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
|
|
@ -109,11 +23,38 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="备注" prop="bz">
|
<el-form-item label="部门" prop="departmentId">
|
||||||
<el-input v-model="form.bz" type="textarea" />
|
<app-department v-model="form.departmentId"></app-department>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="人员类型" prop="userType">
|
||||||
|
<el-select v-model="form.userType">
|
||||||
|
<el-option
|
||||||
|
v-for="item in userTypeList"
|
||||||
|
:key="item.id"
|
||||||
|
:label="item.name"
|
||||||
|
:value="item.id"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="角色" prop="rolesId">
|
||||||
|
<el-select v-model="form.rolesId">
|
||||||
|
<el-option
|
||||||
|
v-for="item in roleList"
|
||||||
|
:key="item.roleId"
|
||||||
|
:label="item.roleName"
|
||||||
|
:value="item.roleId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
<div class="mt-10 tc">
|
||||||
|
<el-button type="primary" @click="fnSubmit">保存</el-button>
|
||||||
|
</div>
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -121,16 +62,26 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import useForm from "@/hooks/useForm.js";
|
import useForm from "@/hooks/useForm.js";
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import { getRoleListAll } from "@/request/system_management.js";
|
import { getRoleListAll } from "@/request/system_management.js";
|
||||||
import AppAreaCascader from "@/components/area_cascader/index.vue";
|
|
||||||
import AppDepartment from "@/components/department/index.vue";
|
import AppDepartment from "@/components/department/index.vue";
|
||||||
import { MOBILE_PHONE } from "@/assets/js/regular.js";
|
import { MOBILE_PHONE } from "@/assets/js/regular.js";
|
||||||
import { hasUser } from "@/request/user_management.js";
|
|
||||||
import {
|
import {
|
||||||
ADMINISTRATIVE_REGION_LEVEL_LIST,
|
hasUser,
|
||||||
DEPARTMENT_CATEGORY_LIST,
|
getUserInfo,
|
||||||
} from "@/assets/js/constant.js";
|
setUserAdd,
|
||||||
|
setUserUpdate,
|
||||||
|
} from "@/request/user_management.js";
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
|
import { debounce } from "throttle-debounce";
|
||||||
|
const route = useRoute();
|
||||||
|
const router = useRouter();
|
||||||
|
const { userId } = route.query;
|
||||||
|
const userTypeList = [
|
||||||
|
{ id: 1, name: "销售" },
|
||||||
|
{ id: 2, name: "服务" },
|
||||||
|
{ id: 3, name: "专家" },
|
||||||
|
];
|
||||||
const fnHasUser = async (_, value, callback) => {
|
const fnHasUser = async (_, value, callback) => {
|
||||||
const { user } = await hasUser({
|
const { user } = await hasUser({
|
||||||
username: value,
|
username: value,
|
||||||
|
|
@ -139,40 +90,17 @@ const fnHasUser = async (_, value, callback) => {
|
||||||
if (!user) callback();
|
if (!user) callback();
|
||||||
else callback(new Error("用户名重复"));
|
else callback(new Error("用户名重复"));
|
||||||
};
|
};
|
||||||
|
const { formRef, validate } = useForm();
|
||||||
const form = ref({
|
const form = ref({
|
||||||
roleId: "",
|
rolesId: "",
|
||||||
level: "",
|
|
||||||
area: [],
|
|
||||||
type: "",
|
|
||||||
departmentId: "",
|
departmentId: "",
|
||||||
departmentCommission: "",
|
|
||||||
duty: "",
|
|
||||||
grid: "",
|
|
||||||
username: "",
|
username: "",
|
||||||
name: "",
|
name: "",
|
||||||
phone: "",
|
mobile: "",
|
||||||
email: "",
|
email: "",
|
||||||
bz: "",
|
userType: "",
|
||||||
});
|
});
|
||||||
const rules = {
|
const rules = {
|
||||||
roleId: [{ required: true, message: "角色不能为空", trigger: "blur" }],
|
|
||||||
area: [{ required: true, message: "所属区域不能为空", trigger: "blur" }],
|
|
||||||
type: [{ required: true, message: "部门类别不能为空", trigger: "change" }],
|
|
||||||
level: [{ required: true, message: "行政区域级别不能为空", trigger: "blur" }],
|
|
||||||
departmentId: [
|
|
||||||
{
|
|
||||||
required: true,
|
|
||||||
message: "部门不能为空",
|
|
||||||
trigger: ["input", "change"],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
departmentCommission: [
|
|
||||||
{
|
|
||||||
required: true,
|
|
||||||
message: "安委会部门不能为空",
|
|
||||||
trigger: ["input", "change"],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
username: [
|
username: [
|
||||||
{ required: true, message: "用户名不能为空", trigger: "blur" },
|
{ required: true, message: "用户名不能为空", trigger: "blur" },
|
||||||
{ min: 2, max: 30, message: "长度在 2 到 30 个字符", trigger: "blur" },
|
{ min: 2, max: 30, message: "长度在 2 到 30 个字符", trigger: "blur" },
|
||||||
|
|
@ -182,18 +110,49 @@ const rules = {
|
||||||
{ required: true, message: "姓名不能为空", trigger: "blur" },
|
{ required: true, message: "姓名不能为空", trigger: "blur" },
|
||||||
{ min: 2, max: 30, message: "长度在 2 到 30 个字符", trigger: "blur" },
|
{ min: 2, max: 30, message: "长度在 2 到 30 个字符", trigger: "blur" },
|
||||||
],
|
],
|
||||||
phone: [
|
mobile: [
|
||||||
{ required: true, message: "手机号码不能为空", trigger: "blur" },
|
{ required: true, message: "手机号码不能为空", trigger: "blur" },
|
||||||
{ pattern: MOBILE_PHONE, message: "请输入正确的手机号码", trigger: "blur" },
|
{ pattern: MOBILE_PHONE, message: "请输入正确的手机号码", trigger: "blur" },
|
||||||
],
|
],
|
||||||
|
rolesId: [{ required: true, message: "角色不能为空", trigger: "change" }],
|
||||||
|
departmentId: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: "部门不能为空",
|
||||||
|
trigger: ["input", "change"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
userType: [
|
||||||
|
{ required: true, message: "人员类型不能为空", trigger: "change" },
|
||||||
|
],
|
||||||
};
|
};
|
||||||
const roleList = ref([]);
|
const roleList = ref([]);
|
||||||
const dutyList = ref([]);
|
|
||||||
const { formRef } = useForm();
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const resData = await getRoleListAll();
|
const resData = await getRoleListAll();
|
||||||
roleList.value = resData.roleList;
|
roleList.value = resData.roleList;
|
||||||
})();
|
})();
|
||||||
|
const fnGetData = async () => {
|
||||||
|
if (!userId) return;
|
||||||
|
const { user } = await getUserInfo({
|
||||||
|
userId: userId,
|
||||||
|
});
|
||||||
|
form.value = user;
|
||||||
|
};
|
||||||
|
fnGetData();
|
||||||
|
const fnSubmit = debounce(
|
||||||
|
1000,
|
||||||
|
async () => {
|
||||||
|
await validate();
|
||||||
|
const params = {
|
||||||
|
...form.value,
|
||||||
|
roleIdList: [form.value.rolesId],
|
||||||
|
};
|
||||||
|
!userId ? await setUserAdd(params) : await setUserUpdate(params);
|
||||||
|
ElMessage.success("操作成功");
|
||||||
|
router.back();
|
||||||
|
},
|
||||||
|
{ atBegin: true }
|
||||||
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style>
|
<style scoped lang="scss"></style>
|
||||||
|
|
|
||||||
|
|
@ -1,101 +1,69 @@
|
||||||
<template>
|
<template>
|
||||||
<div style="display: flex; gap: 20px">
|
<div style="gap: 20px">
|
||||||
<div
|
<app-search v-model="searchForm" :options @submit="resetPagination" />
|
||||||
v-if="userType === 3 && (userLevel === 2 || userLevel === 3)"
|
<app-table
|
||||||
style="width: 300px"
|
ref="tableRef"
|
||||||
|
v-model:pagination="pagination"
|
||||||
|
:data="list"
|
||||||
|
row-key="userId"
|
||||||
|
show-selection
|
||||||
|
@get-data="getData"
|
||||||
>
|
>
|
||||||
<app-area-view-tree
|
<el-table-column prop="name" label="姓名" />
|
||||||
:default-expanded-keys="code"
|
<el-table-column prop="username" label="用户名" />
|
||||||
@node-click="fnNavigation({ code: $event.bianma, level: $event.level })"
|
<el-table-column prop="mobile" label="手机号" />
|
||||||
/>
|
<el-table-column prop="departmentName" label="部门"> </el-table-column>
|
||||||
</div>
|
<el-table-column v-slot="{ row }" label="操作" width="150">
|
||||||
<div style="flex: 1">
|
<el-button
|
||||||
<app-search v-model="searchForm" :options @submit="resetPagination" />
|
type="primary"
|
||||||
<app-table
|
text
|
||||||
ref="tableRef"
|
link
|
||||||
v-model:pagination="pagination"
|
@click="
|
||||||
:data="list"
|
router.push({
|
||||||
row-key="userId"
|
path: '/user_management/user/edit',
|
||||||
show-selection
|
query: { userId: row.userId },
|
||||||
@get-data="getData"
|
})
|
||||||
>
|
"
|
||||||
<el-table-column prop="username" label="用户名" />
|
>
|
||||||
<el-table-column prop="name" label="姓名" />
|
修改
|
||||||
<el-table-column prop="roleName" label="角色" />
|
</el-button>
|
||||||
<el-table-column v-slot="{ row }" label="部门">
|
<el-button
|
||||||
{{ row.DEPARTMENT_FULL_NAME.replace(",", "/") }}
|
type="primary"
|
||||||
</el-table-column>
|
text
|
||||||
<el-table-column prop="dutyName" label="职务" />
|
link
|
||||||
<el-table-column v-slot="{ row }" label="用户类别" width="90">
|
@click="fnResetPassword(row.userId, row.username)"
|
||||||
<div v-if="row.type === 1">安委会用户</div>
|
>
|
||||||
<div v-else-if="row.type === 2">行业用户</div>
|
重置密码
|
||||||
<div v-else-if="row.type === 3">
|
</el-button>
|
||||||
<div v-if="row.grid === '0'">
|
<el-button
|
||||||
<div v-if="row.gridLevel === '1'">一级网格长</div>
|
type="danger"
|
||||||
<div v-else-if="row.gridLevel === '2'">二级网格长</div>
|
text
|
||||||
<div v-else-if="row.gridLevel === '3'">三级网格长</div>
|
link
|
||||||
</div>
|
@click="fnDelete(row.userId, row.username)"
|
||||||
<div v-else-if="row.grid === '1'">网格员</div>
|
>
|
||||||
<div v-else>属地用户</div>
|
删除
|
||||||
</div>
|
</el-button>
|
||||||
<div v-else>其它用户</div>
|
</el-table-column>
|
||||||
</el-table-column>
|
<template #button>
|
||||||
<el-table-column prop="lastLogin" label="最近登录" width="140" />
|
<el-button
|
||||||
<el-table-column prop="ip" label="上次登录IP" width="120" />
|
type="primary"
|
||||||
<el-table-column v-slot="{ row }" label="操作" width="150">
|
@click="router.push({ path: '/user_management/user/add' })"
|
||||||
<el-button
|
>
|
||||||
type="primary"
|
新建
|
||||||
text
|
</el-button>
|
||||||
link
|
<el-button type="danger" @click="fnDelete('', '')">
|
||||||
@click="
|
批量删除
|
||||||
router.push({
|
</el-button>
|
||||||
url: '/user_management/user/add',
|
</template>
|
||||||
query: { userId: row.userId },
|
</app-table>
|
||||||
})
|
|
||||||
"
|
|
||||||
>
|
|
||||||
修改
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
text
|
|
||||||
link
|
|
||||||
@click="fnResetPassword(row.userId, row.username)"
|
|
||||||
>
|
|
||||||
重置密码
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="danger"
|
|
||||||
text
|
|
||||||
link
|
|
||||||
@click="fnDelete(row.userId, row.username)"
|
|
||||||
>
|
|
||||||
删除
|
|
||||||
</el-button>
|
|
||||||
</el-table-column>
|
|
||||||
<template #button>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
@click="router.push({ path: '/user_management/user/add' })"
|
|
||||||
>
|
|
||||||
新建
|
|
||||||
</el-button>
|
|
||||||
<el-button type="danger" @click="fnDelete('', '')">
|
|
||||||
批量删除
|
|
||||||
</el-button>
|
|
||||||
</template>
|
|
||||||
</app-table>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import AppSearch from "@/components/search/index.vue";
|
import AppSearch from "@/components/search/index.vue";
|
||||||
import { useUserStore } from "@/pinia/user.js";
|
|
||||||
import { getRoleListAll } from "@/request/system_management.js";
|
import { getRoleListAll } from "@/request/system_management.js";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import AppAreaViewTree from "@/components/area_view_tree/index.vue";
|
import { useRouter } from "vue-router";
|
||||||
import { onBeforeRouteUpdate, useRoute, useRouter } from "vue-router";
|
|
||||||
import useListData from "@/hooks/useListData.js";
|
import useListData from "@/hooks/useListData.js";
|
||||||
import {
|
import {
|
||||||
getUserList,
|
getUserList,
|
||||||
|
|
@ -104,49 +72,13 @@ import {
|
||||||
} from "@/request/user_management.js";
|
} from "@/request/user_management.js";
|
||||||
import AppTable from "@/components/table/index.vue";
|
import AppTable from "@/components/table/index.vue";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { DEPARTMENT_CATEGORY_LIST } from "@/assets/js/constant.js";
|
|
||||||
|
|
||||||
const userStore = useUserStore();
|
|
||||||
const {
|
|
||||||
rolesId,
|
|
||||||
userId,
|
|
||||||
type: userType,
|
|
||||||
level: userLevel,
|
|
||||||
} = userStore.getUserInfo;
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const route = useRoute();
|
|
||||||
const defaultQuery = {
|
|
||||||
code: "",
|
|
||||||
level: "",
|
|
||||||
};
|
|
||||||
const code = ref(route.query.code || defaultQuery.code);
|
|
||||||
const level = ref(route.query.level || defaultQuery.level);
|
|
||||||
const roleList = ref([]);
|
const roleList = ref([]);
|
||||||
const { list, pagination, searchForm, getData, resetPagination, tableRef } =
|
const { list, pagination, searchForm, getData, resetPagination, tableRef } =
|
||||||
useListData(getUserList, {
|
useListData(getUserList);
|
||||||
params: () => ({
|
|
||||||
code: code.value,
|
|
||||||
level: level.value,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
const options = [
|
const options = [
|
||||||
{ key: "roleName", label: "关键字", tip: "帐号、姓名、手机号" },
|
{ key: "name", label: "姓名" },
|
||||||
{
|
{ key: "username", label: "用户名" },
|
||||||
key: "type",
|
|
||||||
label: "部门类别",
|
|
||||||
type: "select",
|
|
||||||
options: DEPARTMENT_CATEGORY_LIST,
|
|
||||||
hidden: !(rolesId?.indexOf("1") !== -1 || userId === "1"),
|
|
||||||
},
|
|
||||||
{ key: "departmentName", label: "部门名称" },
|
|
||||||
{
|
|
||||||
key: "roleId",
|
|
||||||
label: "角色",
|
|
||||||
type: "select",
|
|
||||||
options: roleList,
|
|
||||||
valueKey: "roleId",
|
|
||||||
labelKey: "roleName",
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
(async () => {
|
(async () => {
|
||||||
const resData = await getRoleListAll();
|
const resData = await getRoleListAll();
|
||||||
|
|
@ -169,35 +101,24 @@ const fnDelete = async (userId, name) => {
|
||||||
});
|
});
|
||||||
ids.push(userId);
|
ids.push(userId);
|
||||||
} else {
|
} else {
|
||||||
ids = tableRef.value.getSelectionRows();
|
const selectData = tableRef.value.getSelectionRows();
|
||||||
|
ids = selectData.map((item) => item.userId);
|
||||||
if (ids.length === 0) {
|
if (ids.length === 0) {
|
||||||
return ElMessage.error("请选择要删除的数据");
|
return ElMessage.error("请选择要删除的数据");
|
||||||
}
|
}
|
||||||
await ElMessageBox.confirm(
|
await ElMessageBox.confirm(
|
||||||
`"确定要删除【${ids.map((item) => item.username).join("、")}】吗?"`,
|
`"确定要删除【${selectData
|
||||||
|
.map((item) => item.username)
|
||||||
|
.join("、")}】吗?"`,
|
||||||
{
|
{
|
||||||
type: "warning",
|
type: "warning",
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
await setUserDelete({ ids });
|
await setUserDelete({ userIds: ids });
|
||||||
ElMessage.success("删除成功");
|
ElMessage.success("删除成功");
|
||||||
resetPagination();
|
resetPagination();
|
||||||
};
|
};
|
||||||
onBeforeRouteUpdate((to) => {
|
|
||||||
code.value = to.query.code || defaultQuery.code;
|
|
||||||
level.value = to.query.level || defaultQuery.level;
|
|
||||||
resetPagination();
|
|
||||||
});
|
|
||||||
const fnNavigation = (query) => {
|
|
||||||
router.push({
|
|
||||||
path: "/user_management/user",
|
|
||||||
query: {
|
|
||||||
...route.query,
|
|
||||||
...query,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped></style>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue