|
|
@@ -2,10 +2,26 @@
|
|
|
<main class="safety-platform-container__main">
|
|
|
<el-form ref="formRef" :model="formData" :rules="isViewMode ? undefined : formRules" label-width="180px" class="check-record-form">
|
|
|
<el-form-item label="被检查单位:" prop="inspectedUnit">
|
|
|
- <el-input v-model="formData.inspectedUnit" :disabled="!isAddMode || checkType===1" placeholder="请输入被检查单位" clearable />
|
|
|
+ <el-cascader
|
|
|
+ ref="CascaderRef"
|
|
|
+ v-model="formData.inspectedUnit"
|
|
|
+ :options="deptTreeOne"
|
|
|
+ :props="cascaderDeptProp"
|
|
|
+ :show-all-levels="false"
|
|
|
+ collapse-tags
|
|
|
+ collapse-tags-tooltip
|
|
|
+ :max-collapse-tags="3"
|
|
|
+ placeholder="请选择被检查单位"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ :disabled="true"
|
|
|
+ style="width: 100%"
|
|
|
+ @change="responsibleDeptChange"
|
|
|
+ />
|
|
|
+ <!-- <el-input v-model="formData.inspectedUnit" :disabled="!isAddMode || checkType===1" placeholder="请输入被检查单位" clearable /> -->
|
|
|
</el-form-item>
|
|
|
<el-form-item label="检查人员:" prop="inspector">
|
|
|
- <el-input v-model="formData.inspector" :disabled="!isAddMode" placeholder="请输入检查人员" clearable />
|
|
|
+ <el-input v-model="formData.inspector" :disabled="true" placeholder="请输入检查人员" clearable />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="检查时间:" prop="checkTime">
|
|
|
<el-date-picker
|
|
|
@@ -22,7 +38,7 @@
|
|
|
<el-form-item label="检查地点:" prop="checkPlace">
|
|
|
<el-input v-model="formData.checkPlace" :disabled="!isAddMode" placeholder="请输入检查地点" clearable />
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="viewDetailData.needOverallDesc === 1" label="整体检查情况描述:" prop="overallDesc" :required="viewDetailData.needOverallDesc === 1 && isAddMode">
|
|
|
+ <el-form-item v-if="needOverallDesc === '1'" label="整体检查情况描述:" prop="overallDesc" :required="needOverallDesc === '1' && isAddMode">
|
|
|
<el-input
|
|
|
v-model="formData.overallDesc"
|
|
|
type="textarea"
|
|
|
@@ -33,7 +49,7 @@
|
|
|
:placeholder="isAddMode ? '请输入整体检查情况描述(限300字)' : '整体检查情况描述(限300字)'"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
- <el-form-item v-if="viewDetailData.needSigneeSign === 1" label="被检查人签字文件:" prop="signFile" :required="viewDetailData.needSigneeSign === 1 && isAddMode">
|
|
|
+ <el-form-item v-if="needSigneeSign === '1'" label="被检查人签字文件:" prop="signFile" :required="needSigneeSign === '1' && isAddMode">
|
|
|
<UploadFiles
|
|
|
v-if="!isViewMode"
|
|
|
label="上传文件"
|
|
|
@@ -116,25 +132,26 @@
|
|
|
import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
|
|
|
import { downloadFile } from '@/views/disaster/utils';
|
|
|
import { useUserInfoHook } from '@/views/disaster/hooks';
|
|
|
-
|
|
|
+ import type { DeptTree } from '@/types/dept/type';
|
|
|
+ import { getAllDepartments } from '@/api/auth/dept';
|
|
|
const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
|
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
|
const { id } = useUserInfoHook()
|
|
|
|
|
|
const operate = computed(() => (route.query.operate as string) || '');
|
|
|
- const isAddMode = computed(() => operate.value === 'area-check-plan-create');
|
|
|
- const isViewMode = computed(() => operate.value === 'area-check-plan-view');
|
|
|
+ const isAddMode = computed(() => operate.value === 'area-check-plan-record-add');
|
|
|
+ const isViewMode = computed(() => operate.value === 'area-check-plan-record-view');
|
|
|
const recordId = computed(() => Number(route.query.recordId));
|
|
|
const planId = computed(() => Number(route.query.planId));
|
|
|
const checkType = computed(() => Number(route.query.checkType));
|
|
|
const areaPlanId = computed(() => Number(route.query.areaPlanId));
|
|
|
-// const needOverallDesc = computed(() => route.query.needOverallDesc);
|
|
|
-// const needSigneeSign = computed(() => route.query.needSigneeSign);
|
|
|
- const viewDetailData = ref<Record<string, unknown>>({});
|
|
|
+ const needOverallDesc = computed(() => route.query.needOverallDesc);
|
|
|
+ const needSigneeSign = computed(() => route.query.needSigneeSign);
|
|
|
const formRef = ref();
|
|
|
const formData = ref({
|
|
|
- inspectedUnit: '',
|
|
|
+ inspectedUnit: '' as string | number,
|
|
|
+ checkedCompanyName: '',
|
|
|
inspector: '',
|
|
|
checkTime: '',
|
|
|
checkPlace: '',
|
|
|
@@ -148,12 +165,12 @@
|
|
|
checkTime: [{ required: true, message: '请选择检查时间', trigger: 'change' }],
|
|
|
checkPlace: [{ required: true, message: '请输入检查地点', trigger: 'blur' }],
|
|
|
overallDesc: [{
|
|
|
- required: viewDetailData.value.needOverallDesc === 1,
|
|
|
+ required: needOverallDesc.value === '1',
|
|
|
message: '请输入整体检查情况描述',
|
|
|
trigger: 'blur'
|
|
|
}],
|
|
|
signFile: [{
|
|
|
- required: viewDetailData.value.needSigneeSign === 1,
|
|
|
+ required: needSigneeSign.value === '1',
|
|
|
message: '请上传被检查人签字文件',
|
|
|
trigger: 'change'
|
|
|
}],
|
|
|
@@ -168,7 +185,37 @@
|
|
|
}
|
|
|
|
|
|
const checkItems = ref<CheckItem[]>([]);
|
|
|
+ const deptTreeOne = ref<DeptTree[]>([]);
|
|
|
+ const cascaderDeptProp = {
|
|
|
+ checkStrictly: true,
|
|
|
+ expandTrigger: 'hover' as const,
|
|
|
+ value: 'id',
|
|
|
+ label: 'deptName',
|
|
|
+ emitPath: false,
|
|
|
+ };
|
|
|
+ const responsibleDeptChange = (value) => {
|
|
|
+ formData.value.inspectedUnit = value;
|
|
|
+ // 根据选择的部门ID获取对应的部门name并设置到表单中
|
|
|
+ const deptName = getDeptCodeByName(value);
|
|
|
+ formData.value.checkedCompanyName = deptName;
|
|
|
+ };
|
|
|
|
|
|
+ const getDeptCodeByName = (id) => {
|
|
|
+ const findDeptCode = (nodes: DeptTree[]): string | null => {
|
|
|
+ for (const node of nodes) {
|
|
|
+ if (String(node.id) === String(id)) {
|
|
|
+ return node.deptName || null;
|
|
|
+ }
|
|
|
+ if (node.children && node.children.length > 0) {
|
|
|
+ const code = findDeptCode(node.children);
|
|
|
+ if (code) return code;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ };
|
|
|
+ return findDeptCode(deptTreeOne.value || []) || '';
|
|
|
+ }
|
|
|
+ const CascaderRef = ref();
|
|
|
function convertSignFileToFileItems(attachmentsStr: string): FileItem[] {
|
|
|
if (!attachmentsStr || !String(attachmentsStr).trim()) return [];
|
|
|
const urls = String(attachmentsStr)
|
|
|
@@ -217,7 +264,8 @@
|
|
|
await saveAreaCheckPlanDetailDept({
|
|
|
areaPlanId: checkItemData.areaPlanId || planId.value,
|
|
|
id: checkItemData.id, // 编辑时传记录ID,新增时后端自动生成无需传
|
|
|
- checkedCompanyName: formData.value.inspectedUnit,
|
|
|
+ checkedCompanyName: formData.value.checkedCompanyName,
|
|
|
+ checkedCompanyCode: formData.value.inspectedUnit,
|
|
|
checkTime: formData.value.checkTime,
|
|
|
checkPersonName: formData.value.inspector,
|
|
|
// 暂无人员 code 来源,前端先不传或由后端根据名称解析
|
|
|
@@ -240,20 +288,7 @@
|
|
|
ElMessage.error(e?.message || e?.data || '提交失败,请稍后重试');
|
|
|
}
|
|
|
};
|
|
|
- // 判断是否有值, 如果有值就转换成JSON.parse
|
|
|
- const safeJsonParse = (str) => {
|
|
|
- // 判断是否有有效值
|
|
|
- if (str === null || str === undefined || str.trim() === '') {
|
|
|
- return [];
|
|
|
- }
|
|
|
|
|
|
- try {
|
|
|
- return JSON.parse(str);
|
|
|
- } catch (e) {
|
|
|
- console.warn('JSON 解析失败:', e);
|
|
|
- return [];
|
|
|
- }
|
|
|
-}
|
|
|
const loadRecordDetail = async () => {
|
|
|
if (recordId.value) {
|
|
|
try {
|
|
|
@@ -261,14 +296,15 @@
|
|
|
const raw = (res as { data?: Record<string, unknown> })?.data ?? res;
|
|
|
const r = raw as Record<string, unknown>;
|
|
|
formData.value = {
|
|
|
- inspectedUnit: String(r?.checkedCompanyName ?? r?.checkedCompany ?? ''),
|
|
|
+ inspectedUnit: Number(r.checkedCompanyCode),
|
|
|
+ checkedCompanyName: String(r?.checkedCompanyName ?? ''),
|
|
|
inspector: String(r?.checkPersonName ?? r?.checkPerson ?? ''),
|
|
|
checkTime: String(r?.checkTime ?? ''),
|
|
|
checkPlace: String(r?.checkAddress ?? r?.checkPlace ?? ''),
|
|
|
overallDesc: String(r?.overallCheckDesc ?? ''),
|
|
|
signFile: JSON.stringify(convertSignFileToFileItems(String(r?.checkedPersonSign ?? ''))),
|
|
|
};
|
|
|
- signFileList.value = safeJsonParse(r?.checkedPersonSign);
|
|
|
+ signFileList.value = JSON.parse(r.checkedPersonSign || '[]');
|
|
|
const records = (r?.areaCheckRecords ?? []) as Array<Record<string, unknown>>;
|
|
|
checkItems.value = records.map((item) => ({
|
|
|
checkContent: (item.checkContent ?? '') as string,
|
|
|
@@ -283,6 +319,7 @@
|
|
|
// 无 recordId 的查看场景,只保留空表单和空检查明细(不依赖路由传递数据)
|
|
|
formData.value = {
|
|
|
inspectedUnit: '',
|
|
|
+ checkedCompanyName: '',
|
|
|
inspector: '',
|
|
|
checkTime: '',
|
|
|
checkPlace: '',
|
|
|
@@ -312,9 +349,18 @@
|
|
|
const res = await fetchDeptAreaCheckRecord(recordId.value);
|
|
|
const list = res.areaCheckRecords || [];
|
|
|
checkItemData = res
|
|
|
- if(checkType.value === 1){
|
|
|
- formData.value.inspectedUnit = res.checkedCompanyName || ''
|
|
|
+ formData.value.inspectedUnit = res.checkedCompanyCode
|
|
|
+ formData.value.checkedCompanyName = res.checkedCompanyName
|
|
|
+ formData.value.inspector = res.checkPersonName ??''
|
|
|
+ formData.value.checkTime = res.checkTime || ''
|
|
|
+ formData.value.checkPlace = res.checkAddress ?? res.checkPlace ?? ''
|
|
|
+ formData.value.overallDesc = res.overallCheckDesc || ''
|
|
|
+ // 被检查人签字文件
|
|
|
+ if(res.checkedPersonSign){
|
|
|
+ formData.value.signFile = res.checkedPersonSign || ''
|
|
|
+ signFileList.value = JSON.parse(res.checkedPersonSign || '')
|
|
|
}
|
|
|
+
|
|
|
if (Array.isArray(list) && list.length > 0) {
|
|
|
checkItems.value = list;
|
|
|
} else {
|
|
|
@@ -330,9 +376,9 @@
|
|
|
|
|
|
const initFormData = async () => {
|
|
|
if (isAddMode.value) {
|
|
|
- const { planName, checkVenue } = route.query;
|
|
|
formData.value = {
|
|
|
- inspectedUnit: '',
|
|
|
+ inspectedUnit: '',
|
|
|
+ checkedCompanyName: '',
|
|
|
inspector: '',
|
|
|
checkTime: '',
|
|
|
checkPlace: '',
|
|
|
@@ -351,31 +397,33 @@
|
|
|
previewOnlineRef.value?.open(url, type);
|
|
|
}
|
|
|
};
|
|
|
-
|
|
|
+ const viewDetailData = ref<Record<string, unknown>>({});
|
|
|
const authority = ref(false)
|
|
|
- const currentId = computed(() => Number(route.query.recordId));
|
|
|
+ const currentId = computed(() => Number(route.query.areaPlanId));
|
|
|
const getDetail = async () => {
|
|
|
if (!currentId.value) return;
|
|
|
try {
|
|
|
const res = await queryAreaCheckPlanManageDeptDetail(currentId.value);
|
|
|
viewDetailData.value = { ...res };
|
|
|
- // 若是自查,则被检查单位默认就是本单位,不需要手动输入。
|
|
|
- if(checkType.value === 1){
|
|
|
- authority.value = true
|
|
|
- formData.value.inspectedUnit = res.responsibleDeptName || ''
|
|
|
- }
|
|
|
- // 如果主责部门责任人ID包含当前登录人ID,则直接回填(被检查单位、 检查人员、检查时间、检查地点),且不可更改
|
|
|
- // let primaryResponsibleDeptPersonCode = res.primaryResponsibleDeptPersonCode?.split(',').map(Number)
|
|
|
- // if(primaryResponsibleDeptPersonCode?.includes(id)){
|
|
|
- // authority.value = true
|
|
|
- // formData.value.inspectedUnit = res.responsibleDeptName || ''
|
|
|
- // formData.value.inspector = String(res.primaryResponsibleDeptPersonName) || ''
|
|
|
- // }
|
|
|
} catch (e) {
|
|
|
console.error('获取详情失败:', e);
|
|
|
}
|
|
|
+ };
|
|
|
+ /** 部门树:一级部门 */
|
|
|
+ const getDeptTreeData = async () => {
|
|
|
+ try {
|
|
|
+ const res = await getAllDepartments();
|
|
|
+ deptTreeOne.value = res?.[0]?.children.map(item => ({
|
|
|
+ ...item,
|
|
|
+ children: []
|
|
|
+ }));
|
|
|
+ } catch (e) {
|
|
|
+ console.error('获取部门树失败:', e);
|
|
|
+ deptTreeOne.value = [];
|
|
|
+ }
|
|
|
};
|
|
|
onMounted(() => {
|
|
|
+ getDeptTreeData();
|
|
|
getDetail()
|
|
|
initFormData();
|
|
|
});
|