This commit is contained in:
2025-09-01 09:18:21 +08:00
120 changed files with 3971 additions and 1395 deletions

View File

@ -37,7 +37,15 @@
</el-table-column>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['design:extract:query']">审核</el-button>
<el-button
link
type="primary"
v-if="scope.row.status == 'draft'"
icon="Edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['design:extract:query']"
>审核</el-button
>
<el-button
link
type="primary"

View File

@ -5,7 +5,12 @@
<div class="bg-gradient-to-r from-blue-500 to-blue-600 text-white p-6">
<h2 class="text-2xl font-bold flex items-center"><i class="el-icon-user-circle mr-3"></i>人员配置</h2>
<p class="text-blue-100 mt-2 opacity-90">请配置项目相关负责人员信息</p>
<el-button @click="disabledForm = false" class="px-8 py-2.5 transition-all duration-300 font-medium" v-if="disabledForm">
<el-button
@click="disabledForm = false"
v-hasPermi="['design:user:list']"
class="px-8 py-2.5 transition-all duration-300 font-medium"
v-if="disabledForm"
>
点击编辑
</el-button>
</div>
@ -220,7 +225,7 @@
</div>
<!-- 提交按钮区域 -->
<div class="flex justify-center space-x-6 mt-8 pt-6 border-t border-gray-100">
<div class="flex justify-center space-x-6 mt-8 pt-6 border-t border-gray-100">
<el-button
type="primary"
size="large"

View File

@ -47,9 +47,9 @@
<el-row :gutter="8" class="mb-3 font-medium text-gray-700 whitespace-nowrap">
<el-col :span="4">专业</el-col>
<el-col :span="5">设计人员可多选</el-col>
<el-col :span="5">校审人员可多选</el-col>
<el-col :span="5">审定人员可多选</el-col>
<el-col :span="4">审核人员可多选</el-col>
<el-col :span="5">校审人员</el-col>
<el-col :span="5">审定人员</el-col>
<el-col :span="4">审核人员</el-col>
<el-col :span="3"></el-col>
</el-row>
@ -65,7 +65,7 @@
>
<el-row :gutter="8" class="items-top">
<!-- 1. 专业选择核心统一所有角色的专业来源 -->
<el-col :span="3" class="mb-4 sm:mb-0 pl-4">
<el-col :span="3" class="mb-4 sm:mb-0 pl-4" style="margin-top:8px;">
<el-form-item
:prop="`designers.${configIndex}.userMajor`"
:rules="[
@ -76,7 +76,7 @@
label-width="60px"
label="专业"
>
<el-select
<el-select filterable
v-model="form.designers[configIndex].userMajor"
placeholder="请选择专业"
class="w-full transition-all duration-300 border-gray-300"
@ -109,7 +109,7 @@
label="设计"
label-width="50px"
>
<el-select
<el-select filterable
v-model="person.userId"
placeholder="选择人员"
class="w-full transition-all duration-300 border-gray-300"
@ -165,7 +165,7 @@
label="校审"
label-width="50px"
>
<el-select
<el-select filterable
v-model="person.userId"
placeholder="选择人员"
class="w-full transition-all duration-300 border-gray-300"
@ -174,7 +174,7 @@
<el-option v-for="item in userList" :key="`user-${item.userId}`" :label="item.nickName" :value="item.userId" />
</el-select>
</el-form-item>
<div class="flex gap-1">
<!-- <div class="flex gap-1">
<el-button
type="danger"
size="small"
@ -193,7 +193,7 @@
>
<el-icon :size="14"><Plus /></el-icon>
</el-button>
</div>
</div> -->
</div>
</div>
<div
@ -221,7 +221,7 @@
label="审定"
label-width="50px"
>
<el-select
<el-select filterable
v-model="person.userId"
placeholder="选择人员"
class="w-full transition-all duration-300 border-gray-300"
@ -230,7 +230,7 @@
<el-option v-for="item in userList" :key="`user-${item.userId}`" :label="item.nickName" :value="item.userId" />
</el-select>
</el-form-item>
<div class="flex gap-1">
<!-- <div class="flex gap-1">
<el-button
type="danger"
size="small"
@ -249,7 +249,7 @@
>
<el-icon :size="14"><Plus /></el-icon>
</el-button>
</div>
</div> -->
</div>
</div>
<div
@ -277,7 +277,7 @@
label="审核"
label-width="50px"
>
<el-select
<el-select filterable
v-model="person.userId"
placeholder="选择人员"
class="w-full transition-all duration-300 border-gray-300"
@ -286,7 +286,7 @@
<el-option v-for="item in userList" :key="`user-${item.userId}`" :label="item.nickName" :value="item.userId" />
</el-select>
</el-form-item>
<div class="flex gap-1">
<!-- <div class="flex gap-1">
<el-button
type="danger"
size="small"
@ -305,7 +305,7 @@
>
<el-icon :size="14"><Plus /></el-icon>
</el-button>
</div>
</div> -->
</div>
</div>
<div
@ -436,6 +436,8 @@ const disabledForm = ref(true); // 初始禁用表单(编辑时开启)
/** 查询当前部门的所有用户(确保用户列表有效) */
const getDeptAllUser = async (deptId: number | undefined) => {
console.log(1111111111111);
if (!deptId) {
ElMessage.warning('请先选择部门');
return;

View File

@ -16,10 +16,10 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="openTable(true, index)">一键展开</el-button>
<el-button type="primary" @click="openTable(index)">{{ isExpandAll ? '一键收起' : '一键展开' }}</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="openTable(false, index)">一键收起</el-button>
<el-button type="success" @click="downloadTemplate(1)">下载模板</el-button>
</el-form-item>
<el-form-item>
<el-upload ref="uploadRef" class="upload-demo" :http-request="importExcel" :show-file-list="false">
@ -51,15 +51,21 @@
<el-option v-for="item in state.options" :key="item.versions" :label="item.versions" :value="item.versions" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="success" @click="downloadTemplate(2)">下载模板</el-button>
</el-form-item>
<el-form-item>
<el-upload ref="uploadRef" class="upload-demo" :http-request="importExcel" :show-file-list="false" style="margin-right: 10px">
<template #trigger>
<el-button type="primary">导入excel</el-button>
</template>
</el-upload>
<el-button v-if="state.versionsData.status == 'draft'" type="primary" con="edit" @click="clickApprovalSheet()">审核</el-button>
</el-form-item>
<el-form-item v-if="state.versionsData.status == 'draft'">
<el-button type="primary" con="edit" @click="clickApprovalSheet()">审核</el-button>
</el-form-item>
<el-form-item v-if="state.versionsData.status == 'waiting' || state.versionsData.status == 'finish'">
<el-button
v-if="state.versionsData.status == 'waiting' || state.versionsData.status == 'finish'"
icon="view"
@click="lookApprovalFlow()"
type="warning"
@ -117,6 +123,7 @@ const { proxy } = getCurrentInstance();
const { work_order_type } = toRefs(proxy?.useDict('work_order_type'));
const tableRef = ref({});
console.log(work_order_type);
const isExpandAll = ref(true);
// tableData
// 版本号
@ -146,6 +153,7 @@ const state = reactive({
});
// tab切换
const handleTabChange = (tab) => {
isExpandAll.value = true;
console.log('tab', tab);
state.tableData = [];
state.options = [];
@ -305,13 +313,14 @@ function handleChangeVersion(versions) {
handleQueryList();
}
// 在 openTable 方法中通过索引获取对应的表格实例
function openTable(flag, index) {
function openTable( index) {
isExpandAll.value = !isExpandAll.value;
nextTick(() => {
// 通过索引获取当前标签页的表格实例
const currentTable = tableRef.value[index];
console.log(currentTable, index);
if (currentTable) {
handleArr(state.tableData, flag, currentTable);
handleArr(state.tableData, isExpandAll.value, currentTable);
}
});
}
@ -345,6 +354,34 @@ function lookApprovalFlow(row) {
}
});
}
// 下载模板
const downloadTemplate = (type) => {
// 导出模版文件
try {
let linkurl = '';
let name = '';
if (type==1) {
linkurl = '/billOfQuantities.xlsx';
name = '工程量清单模板.xlsx';
}else{
linkurl = '/materialsEquipment.xlsx';
name = '物资设备清单模板.xlsx';
}
// 创建a标签
const link = document.createElement('a');
// 设置PDF文件路径 - 相对于public目录
link.href = linkurl;
// 设置下载后的文件名
link.download = name;
// 触发点击
document.body.appendChild(link);
link.click();
// 清理
document.body.removeChild(link);
} catch (error) {
alert('下载失败,请重试');
}
};
</script>
<style>
.billof-quantities {

View File

@ -6,7 +6,7 @@
<el-col :span="1.5">
<div class="box_btn">
<file-upload :limit="1" :uploadUrl="uploadUrl" :params="uploadParams" :on-upload-success="uploadFile" :fileType="[]">
<el-button type="primary" style="float: left" v-hasPermi="['design:collectFile:add']">
<el-button type="primary" style="float: left" v-hasPermi="['design:collectFile:upload']">
<el-icon size="small"><Upload /></el-icon>上传文件
</el-button>
</file-upload>

View File

@ -314,14 +314,14 @@ let volumeMap = new Map();
const handleSelect = (val) => {
let obj = volumeMap.get(val);
console.log('🚀 ~ handleSelect ~ obj:', obj);
fileVoList.value = obj.fileVoList;
designId.value = obj.design;
form.value.volumeName = obj.volumeName;
form.value.specialty = obj.specialty;
form.value.specialtyName = obj.specialtyName;
form.value.extendDetail.subName = obj.designSubitem;
form.value.saveFile = [];
getBlueprintList();
};
// 获取图纸列表
const blueprintListAll = ref([]);
@ -331,9 +331,6 @@ const getBlueprintList = async () => {
};
const handleRadio = (val) => {
form.value.saveFile = [];
if (val == 2) {
getBlueprintList();
}
};
/** 表单重置 */
@ -351,8 +348,15 @@ const getInfo = () => {
let id = routeParams.value.id.split('_')[0];
const res = await getDesignChange(id);
Object.assign(form.value, res.data);
console.log(form.value);
if (form.value.status != 'draft') {
form.value.id = id + '_audit';
}
if (form.value.extendDetail.designDisposal == 2) {
let obj = volumeMap.get(form.value.volumeNo);
designId.value = obj.design;
form.value.saveFile = form.value.saveFile.split(',');
getBlueprintList();
}
if (form.value.changeReason.length > 0) {
form.value.changeReason = form.value.changeReason.split(',');
}
@ -381,8 +385,11 @@ const submitForm = (status1: string) => {
if (valid) {
buttonLoading.value = true;
var res;
delete form.value.id;
res = await addDesignChange({ ...form.value, changeReason, saveFile }).finally(() => (buttonLoading.value = false));
if (res.code == 200) {
routeParams.value.type = 'update';
form.value = res.data;
if (form.value.costEstimation == '0') {
ElMessage.success('通知成功');
goBack();
@ -425,6 +432,9 @@ const handleStartWorkFlow = async (data: LeaveForm) => {
};
//审批记录
const handleApprovalRecord = () => {
if (form.value.id.indexOf('_audit') == -1) {
form.value.id = form.value.id + '_audit';
}
approvalRecordRef.value.init(form.value.id);
};
//提交回调

View File

@ -159,7 +159,7 @@ const histroyList = ref([]);
const getList = async () => {
loading.value = true;
try {
const res = await joinList({ type: catalogueId.value, ...queryParams.value });
const res = await joinList({ type: catalogueId.value, ...queryParams.value, auditStatus: 'finish' });
volumeCatalogList.value = res.rows;
total.value = res.total;
} finally {

View File

@ -17,6 +17,7 @@
<el-select
:disabled="disabledAll"
v-model="form.userId"
filterable
placeholder="请选择收资人"
class="w-full transition-all duration-300 border-gray-300 focus:border-blue-400 focus:ring-1 focus:ring-blue-400"
>
@ -93,6 +94,7 @@
<el-select
:disabled="disabledAll"
v-model="item.userId"
filterable
placeholder="请选择人员"
class="w-full transition-all duration-300 border-gray-300 focus:border-blue-400 focus:ring-1 focus:ring-blue-400"
>
@ -112,7 +114,7 @@
<el-button
type="primary"
@click="submitForm"
v-hasPermi="['design:collect:add']"
v-hasPermi="['design:collect:batch']"
v-if="!form.id || form.status == 'draft'"
size="large"
class="px-8 transition-all hover:bg-blue-600"
@ -181,6 +183,7 @@ import { systemUserList } from '@/api/design/appointment';
import { collectBatch, byProjectId, exportWord } from '@/api/design/received';
import { getUser } from '@/api/system/user';
import type { ComponentInternalInstance, ElFormInstance } from 'element-plus';
import { getInfo } from '@/api/login';
// 全局实例与状态管理
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@ -202,7 +205,7 @@ const disabledAll = ref(false); // 表单是否全部禁用
const form = reactive({
projectId: currentProject.value?.id,
userId: '', // 收资人
user_major: '', // 专业
user_major: '1', // 专业
phone: '', // 电话
email: '', // 邮箱
id: '', // 表单ID
@ -273,6 +276,8 @@ const byProjectIdAll = async () => {
disabledAll.value = false;
if (res.code == 200 && res.data) {
console.log('🚀 ~ byProjectIdAll ~ res:', res);
const data = res.data;
// 回显基本信息
form.userId = data.userId || '';
@ -415,7 +420,7 @@ const onView = () => {
/** 获取当前用户详情(回显个人信息) */
const getUserDetail = async () => {
try {
const res = await getUser(userId.value);
const res = await getInfo();
if (res.data?.user) {
form.userId = res.data.user.userId;
form.phone = res.data.user.phonenumber || '';

View File

@ -49,7 +49,7 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button v-hasPermi="['design:subcontract:add']" :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>

View File

@ -99,17 +99,22 @@
</el-card>
<!-- 添加或修改卷册目录对话框 -->
<el-dialog draggable :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="volumeCatalogFormRef" :model="form" :rules="rules" label-width="100px">
<el-form ref="volumeCatalogFormRef" :model="form" :rules="rules" label-width="110px">
<el-form-item label="子项" prop="designSubitem">
<el-input v-model="form.designSubitem" placeholder="请输入设计子项" />
</el-form-item>
<el-form-item label="专业" prop="specialty">
<el-select v-model="form.specialty" placeholder="请选择专业">
<el-option :value="item.value" v-for="item in des_user_major" :key="item.value" :label="item.label" />
<el-select v-model="form.specialty" placeholder="请选择专业" @change="changeSpecialty">
<el-option :value="item.userMajor" v-for="item in des_user_major" :key="item.userMajor" :label="item.userMajorName" />
</el-select>
</el-form-item>
<el-form-item label="设计人员" prop="principal">
<el-select v-model="form.principal" placeholder="请选择设计人员" class="transition-all duration-300 border-gray-300">
<el-select
:disabled="!form.specialty"
v-model="form.principal"
placeholder="请选择设计人员"
class="transition-all duration-300 border-gray-300"
>
<el-option v-for="item in userAppList" :key="item.userId" :label="item.userName" :value="item.userId.toString()" />
</el-select>
</el-form-item>
@ -248,6 +253,7 @@ import {
addVolumeCatalog,
updateVolumeCatalog,
uploadVolumeFile,
majorList,
getVolumeCatafileList,
volumeFileList
} from '@/api/design/volumeCatalog';
@ -258,9 +264,10 @@ import TableContent from './comm/tableContent.vue';
const fileList = ref([]);
import { designUserList } from '@/api/design/appointment';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { design_state, wf_business_status, des_user_major } = toRefs(proxy?.useDict('design_state', 'wf_business_status', 'des_user_major'));
const { design_state, wf_business_status } = toRefs(proxy?.useDict('design_state', 'wf_business_status'));
import { drawingreviewReceiptsDetail, drawingreviewReceiptsList } from '@/api/design/drawingreview';
const volumeCatalogList = ref<VolumeCatalogVO[]>([]);
const des_user_major = ref([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
@ -350,13 +357,28 @@ const data = reactive({
rules: {
design: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
projectId: [{ required: true, message: '项目ID不能为空', trigger: 'blur' }],
designSubitem: [{ required: true, message: '子项不能为空', trigger: 'blur' }],
volumeNumber: [{ required: true, message: '卷册号不能为空', trigger: 'blur' }],
documentName: [{ required: true, message: '资料名称不能为空', trigger: 'blur' }]
documentName: [{ required: true, message: '资料名称不能为空', trigger: 'blur' }],
plannedCompletion: [{ required: true, message: '计划出图事件不能为空', trigger: 'blur' }],
principal: [{ required: true, message: '设计人员不能为空', trigger: 'blur' }],
specialty: [{ required: true, message: '专业不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const changeSpecialty = (val) => {
form.value.principal = ''; //清空
getUserAppList(val);
};
// 获取专业列表
const getSpecialtyList = async () => {
const res = await majorList({ projectId: currentProject.value?.id, userType: 2 });
console.log(res);
if (res.code === 200) {
des_user_major.value = res.data;
}
};
/** 查询卷册目录列表 */
const getList = async () => {
loading.value = true;
@ -368,17 +390,10 @@ const getList = async () => {
loading.value = false;
}
};
const getUserAppList = async () => {
const res = await designUserList({ projectId: currentProject.value?.id });
const getUserAppList = async (userMajor) => {
const res = await designUserList({ projectId: currentProject.value?.id, userType: 2, userMajor });
if (res.code === 200) {
console.log(res.rows);
res.rows.forEach((item: any) => {
if (item.userType == 2) {
//设计人员
userAppList.value.push(item);
}
});
userAppList.value = res.rows;
}
};
const handleViewHistory = async (row) => {
@ -641,7 +656,7 @@ const handleAuditInfo = (row) => {
// 审核图纸
};
onMounted(() => {
getUserAppList();
getSpecialtyList();
getList();
});
@ -651,7 +666,7 @@ const listeningProject = watch(
(nid, oid) => {
queryParams.value.projectId = nid;
form.value.projectId = nid;
getUserAppList();
getSpecialtyList();
getList();
}
);