|
@@ -62,48 +62,57 @@
|
|
|
</template>
|
|
</template>
|
|
|
<template #action="scope">
|
|
<template #action="scope">
|
|
|
<div class="action-container--div" style="justify-content: left">
|
|
<div class="action-container--div" style="justify-content: left">
|
|
|
- <ActionButton text="编辑" @click="handleEdit(scope.row.id)" />
|
|
|
|
|
- <ActionButton text="删除" :popconfirm="{
|
|
|
|
|
|
|
+ <ActionButton text="编辑" v-if="scope.row.status === 1" @click="handleEdit(scope.row.id)" />
|
|
|
|
|
+ <ActionButton text="删除" v-if="scope.row.status === 1" :popconfirm="{
|
|
|
title: '确定要删除?',
|
|
title: '确定要删除?',
|
|
|
}" @confirm="handleDelete(scope.row.id)" />
|
|
}" @confirm="handleDelete(scope.row.id)" />
|
|
|
- <!-- <ActionButton text="查看" @click="handleView(scope.row.id)" /> -->
|
|
|
|
|
- <ActionButton text="下发" @click="handleDispatch(scope.row.id)" />
|
|
|
|
|
|
|
+ <ActionButton text="查看" @click="handleView(scope.row.id)" />
|
|
|
|
|
+ <ActionButton text="下发" @click="handleDispatch(scope.row.id)" v-if="scope.row.status === 1"/>
|
|
|
|
|
+ <ActionButton text="活动报名" @click="" v-if="scope.row.status !== 1"/>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</BasicTable>
|
|
</BasicTable>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <el-dialog v-model="issueDialogVisible" title="安全文化活动下发" width="480px" destroy-on-close>
|
|
|
|
|
- <el-form :model="issueForm" label-width="130px" class="issue-dialog-form">
|
|
|
|
|
- <el-form-item label="负责人部门名称:">
|
|
|
|
|
|
|
+ <el-dialog
|
|
|
|
|
+ v-model="showIssueDialog"
|
|
|
|
|
+ title="安全文化活动下发"
|
|
|
|
|
+ width="500px"
|
|
|
|
|
+ destroy-on-close
|
|
|
|
|
+ @open="onIssueDialogOpen"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-form ref="issueFormRef" :model="issueForm" :rules="issueRules" label-width="140px">
|
|
|
|
|
+ <el-form-item label="整改责任部门" prop="rectificationDepartmentId">
|
|
|
<el-cascader
|
|
<el-cascader
|
|
|
- ref="issueDeptCascaderRef"
|
|
|
|
|
- v-model="issueDeptIds"
|
|
|
|
|
- :options="deptTree"
|
|
|
|
|
|
|
+ v-model="issueForm.rectificationDepartmentId"
|
|
|
|
|
+ :options="issueDeptTree"
|
|
|
:props="cascaderDeptProp"
|
|
:props="cascaderDeptProp"
|
|
|
:show-all-levels="false"
|
|
:show-all-levels="false"
|
|
|
- placeholder="请选择部门(可多选)"
|
|
|
|
|
|
|
+ placeholder="请选择整改责任部门"
|
|
|
filterable
|
|
filterable
|
|
|
clearable
|
|
clearable
|
|
|
- collapse-tags
|
|
|
|
|
- collapse-tags-tooltip
|
|
|
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
|
- @change="handleIssueDeptChange"
|
|
|
|
|
|
|
+ @change="onIssueDeptChange"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="负责人名称:">
|
|
|
|
|
|
|
+ <el-form-item label="整改负责人" prop="rectificationResponsibleUserId">
|
|
|
<el-select
|
|
<el-select
|
|
|
- v-model="issueForm.userGroupId"
|
|
|
|
|
- placeholder="请选择用户组"
|
|
|
|
|
|
|
+ v-model="issueForm.rectificationResponsibleUserId"
|
|
|
|
|
+ placeholder="选择整改负责人"
|
|
|
filterable
|
|
filterable
|
|
|
clearable
|
|
clearable
|
|
|
style="width: 100%"
|
|
style="width: 100%"
|
|
|
>
|
|
>
|
|
|
- <el-option v-for="item in userGroupOptions" :key="item.id" :label="item.name" :value="item.id" />
|
|
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="user in issueUserList"
|
|
|
|
|
+ :key="user.id"
|
|
|
|
|
+ :label="user.realname ?? user.username"
|
|
|
|
|
+ :value="user.id"
|
|
|
|
|
+ />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="计划开始日期:">
|
|
|
|
|
|
|
+ <el-form-item label="计划开始日期:" prop="startDate">
|
|
|
<el-date-picker
|
|
<el-date-picker
|
|
|
v-model="issueForm.startDate"
|
|
v-model="issueForm.startDate"
|
|
|
type="date"
|
|
type="date"
|
|
@@ -119,7 +128,7 @@
|
|
|
}"
|
|
}"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="计划结束日期:">
|
|
|
|
|
|
|
+ <el-form-item label="计划结束日期:" prop="endDate">
|
|
|
<el-date-picker
|
|
<el-date-picker
|
|
|
v-model="issueForm.endDate"
|
|
v-model="issueForm.endDate"
|
|
|
type="date"
|
|
type="date"
|
|
@@ -137,10 +146,8 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<template #footer>
|
|
<template #footer>
|
|
|
- <span class="dialog-footer">
|
|
|
|
|
- <el-button @click="issueDialogVisible = false">取消</el-button>
|
|
|
|
|
- <el-button type="primary" @click="handleIssueConfirm">确定</el-button>
|
|
|
|
|
- </span>
|
|
|
|
|
|
|
+ <el-button @click="showIssueDialog = false">取消</el-button>
|
|
|
|
|
+ <el-button type="primary" @click="handleIssueSave">保存</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
@@ -163,6 +170,7 @@ import {
|
|
|
safetyCultureActivityManagementFilePage,
|
|
safetyCultureActivityManagementFilePage,
|
|
|
deleteSafetyCultureActivityManagement,
|
|
deleteSafetyCultureActivityManagement,
|
|
|
getAllDepartments,
|
|
getAllDepartments,
|
|
|
|
|
+ activityDistribution,
|
|
|
type safetyCultureFileQuery,
|
|
type safetyCultureFileQuery,
|
|
|
type safetyCultureFilePageQuery,
|
|
type safetyCultureFilePageQuery,
|
|
|
} from '@/api/safety-culture';
|
|
} from '@/api/safety-culture';
|
|
@@ -172,21 +180,37 @@ import BatchImport from '@/components/batch-import/BatchImport.vue';
|
|
|
import { useGlobSetting } from '@/hooks/setting';
|
|
import { useGlobSetting } from '@/hooks/setting';
|
|
|
import urlJoin from 'url-join';
|
|
import urlJoin from 'url-join';
|
|
|
import { http } from '@/utils/http/axios';
|
|
import { http } from '@/utils/http/axios';
|
|
|
-
|
|
|
|
|
|
|
+import { queryAvailableUserList } from '@/api/production-safety/responsibility-implementation';
|
|
|
|
|
|
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
|
|
|
|
|
|
-// 下发弹窗相关
|
|
|
|
|
-const issueDialogVisible = ref(false);
|
|
|
|
|
-const currentIssueId = ref<number | null>(null);
|
|
|
|
|
-const issueForm = reactive({
|
|
|
|
|
- departmentName: '',
|
|
|
|
|
- startDate: '',
|
|
|
|
|
- endDate: '',
|
|
|
|
|
- userGroupId: undefined as number | undefined,
|
|
|
|
|
- deptSelfApproveUserId: undefined as number | undefined, // 部门自评审核人ID
|
|
|
|
|
|
|
+/** 下发弹窗:点击下发打开弹窗,弹窗内部门用 queryAllDeptTree、负责人用 queryAvailableUserList,点击保存才触发下发接口 */
|
|
|
|
|
+const showIssueDialog = ref(false);
|
|
|
|
|
+const distributionId = ref<number>(0);
|
|
|
|
|
+const issueFormRef = ref();
|
|
|
|
|
+const issueForm = ref({
|
|
|
|
|
+ rectificationDepartmentId: undefined as number | undefined,
|
|
|
|
|
+ rectificationResponsibleUserId: undefined as number | undefined,
|
|
|
|
|
+ rectificationResponsiblePersonName: '' as string,
|
|
|
|
|
+ startDate: '' as string,
|
|
|
|
|
+ endDate: '' as string,
|
|
|
});
|
|
});
|
|
|
-const issueDeptIds = ref<number[]>([]);
|
|
|
|
|
|
|
+const issueRules = {
|
|
|
|
|
+ rectificationDepartmentId: [{ required: true, message: '请选择整改责任部门', trigger: 'change' }],
|
|
|
|
|
+ rectificationResponsibleUserId: [{ required: true, message: '请选择整改负责人', trigger: 'change' }],
|
|
|
|
|
+ startDate: [{ required: true, message: '请选择计划开始日期', trigger: 'change' }],
|
|
|
|
|
+ endDate: [{ required: true, message: '请选择计划结束日期', trigger: 'change' }],
|
|
|
|
|
+};
|
|
|
|
|
+/** 下发弹窗部门树,与新增隐患台账复查人员所属部门一致(getAllDepartments 取第一级 children) */
|
|
|
|
|
+const cascaderDeptProp = {
|
|
|
|
|
+ checkStrictly: true,
|
|
|
|
|
+ expandTrigger: 'hover' as const,
|
|
|
|
|
+ value: 'id',
|
|
|
|
|
+ label: 'deptName',
|
|
|
|
|
+ emitPath: false,
|
|
|
|
|
+};
|
|
|
|
|
+const issueDeptTree = ref<DeptTree[]>([]);
|
|
|
|
|
+const issueUserList = ref<Array<{ id: number; realname?: string; username?: string }>>([]);
|
|
|
|
|
|
|
|
// 表格
|
|
// 表格
|
|
|
const basicTableRef = ref<InstanceType<typeof BasicTable>>();
|
|
const basicTableRef = ref<InstanceType<typeof BasicTable>>();
|
|
@@ -472,62 +496,82 @@ const activityRegistration = async (id: number) => {
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const handleIssueConfirm = async () => {
|
|
|
|
|
- if (!currentIssueId.value) {
|
|
|
|
|
- ElMessage.error('缺少考核表ID');
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- if (!issueDeptIds.value?.length) {
|
|
|
|
|
- ElMessage.error('请至少选择一个部门');
|
|
|
|
|
- return;
|
|
|
|
|
|
|
+const onIssueDialogOpen = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const [deptRes, userRes] = await Promise.all([
|
|
|
|
|
+ getAllDepartments(),
|
|
|
|
|
+ queryAvailableUserList({ pageNumber: 1, pageSize: 9999, queryParam: {} }),
|
|
|
|
|
+ ]);
|
|
|
|
|
+ const fullTree = (deptRes as DeptTree[]) ?? [];
|
|
|
|
|
+ issueDeptTree.value = Array.isArray(fullTree) && fullTree[0]?.children ? fullTree[0].children : [];
|
|
|
|
|
+ issueUserList.value = (userRes as any)?.records ?? [];
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('获取部门/用户列表失败:', e);
|
|
|
|
|
+ ElMessage.error(e?.message || e?.data || '加载部门或负责人列表失败');
|
|
|
|
|
+ issueDeptTree.value = [];
|
|
|
|
|
+ issueUserList.value = [];
|
|
|
}
|
|
}
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const onIssueDeptChange = () => {
|
|
|
|
|
+ issueForm.value.rectificationResponsibleUserId = undefined;
|
|
|
|
|
+ issueForm.value.rectificationResponsiblePersonName = '';
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const handleDispatch = (id: number) => {
|
|
|
|
|
+ distributionId.value = id;
|
|
|
|
|
+ showIssueDialog.value = true;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
- // 验证日期:开始日期不能大于结束日期
|
|
|
|
|
- if (issueForm.startDate && issueForm.endDate) {
|
|
|
|
|
- const startDate = new Date(issueForm.startDate);
|
|
|
|
|
- const endDate = new Date(issueForm.endDate);
|
|
|
|
|
- if (startDate > endDate) {
|
|
|
|
|
- ElMessage.error('计划开始日期不能大于计划结束日期');
|
|
|
|
|
- return;
|
|
|
|
|
|
|
+/** 从部门树中根据 id 查找部门名称 */
|
|
|
|
|
+function findDeptNameById(nodes: DeptTree[] | undefined, id: number): string {
|
|
|
|
|
+ if (!nodes?.length) return '';
|
|
|
|
|
+ for (const n of nodes) {
|
|
|
|
|
+ if (n.id === id) return n.deptName ?? '';
|
|
|
|
|
+ if (n.children?.length) {
|
|
|
|
|
+ const found = findDeptNameById(n.children, id);
|
|
|
|
|
+ if (found) return found;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ return '';
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
|
|
+const handleIssueSave = async () => {
|
|
|
|
|
+ await issueFormRef.value?.validate?.().catch(() => {});
|
|
|
|
|
+ const { rectificationDepartmentId, rectificationResponsibleUserId } = issueForm.value;
|
|
|
|
|
+ if (rectificationDepartmentId == null || rectificationResponsibleUserId == null) {
|
|
|
|
|
+ ElMessage.warning('请选择整改责任部门和整改负责人');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!issueForm.value.startDate || !issueForm.value.endDate) {
|
|
|
|
|
+ ElMessage.warning('请选择计划开始日期和计划结束日期');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ const selectedUser = issueUserList.value.find((u) => u.id === rectificationResponsibleUserId);
|
|
|
|
|
+ const personName = selectedUser?.realname ?? selectedUser?.username ?? '';
|
|
|
|
|
+ const deptName = findDeptNameById(issueDeptTree.value, rectificationDepartmentId);
|
|
|
try {
|
|
try {
|
|
|
- const payload = {
|
|
|
|
|
- id: currentIssueId.value,
|
|
|
|
|
- deptNames: issueForm.departmentName,
|
|
|
|
|
- deptIds: issueDeptIds.value,
|
|
|
|
|
- getUserGroupId: issueForm.userGroupId,
|
|
|
|
|
- deptSelfApproveUserId: issueForm.deptSelfApproveUserId,
|
|
|
|
|
- planStartTime: issueForm.startDate || undefined,
|
|
|
|
|
- planEndTime: issueForm.endDate || undefined,
|
|
|
|
|
- };
|
|
|
|
|
- // await saveSecurityExamineIssue(payload);
|
|
|
|
|
|
|
+ await activityDistribution({
|
|
|
|
|
+ id: distributionId.value,
|
|
|
|
|
+ specificDeptId: String(rectificationDepartmentId),
|
|
|
|
|
+ specificPersonId: String(rectificationResponsibleUserId),
|
|
|
|
|
+ startTime: issueForm.value.startDate,
|
|
|
|
|
+ endTime: issueForm.value.endDate,
|
|
|
|
|
+ });
|
|
|
ElMessage.success('下发成功');
|
|
ElMessage.success('下发成功');
|
|
|
- // issueDialogVisible.value = false;
|
|
|
|
|
- // getTableData();
|
|
|
|
|
|
|
+ showIssueDialog.value = false;
|
|
|
|
|
+ getTableData();
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error('下发失败:', e);
|
|
console.error('下发失败:', e);
|
|
|
ElMessage.error(e?.message || e?.data || '下发失败,请重试');
|
|
ElMessage.error(e?.message || e?.data || '下发失败,请重试');
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const handleDispatch = async (id: number) => {
|
|
|
|
|
- issueDialogVisible.value = true;
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-const getDeptData = () => {
|
|
|
|
|
- getAllDepartments().then((res) => {
|
|
|
|
|
- firstLevelDepts.value = formatDeptTree(res);
|
|
|
|
|
- });
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
loadDeptNameMap().finally(() => {
|
|
loadDeptNameMap().finally(() => {
|
|
|
getTableData();
|
|
getTableData();
|
|
|
});
|
|
});
|
|
|
// loginSw();
|
|
// loginSw();
|
|
|
- getDeptData();
|
|
|
|
|
});
|
|
});
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|