This commit is contained in:
2025-09-01 09:22:33 +08:00
39 changed files with 1102 additions and 209 deletions

View File

@ -6,7 +6,7 @@ VITE_APP_ENV = 'development'
# 开发环境 # 开发环境
# 李陈杰 209 # 李陈杰 209
VITE_APP_BASE_API = 'http://192.168.110.180:8899' VITE_APP_BASE_API = 'http://192.168.110.188:8899'
# 曾涛 # 曾涛
# VITE_APP_BASE_API = 'http://192.168.110.180:8899' # VITE_APP_BASE_API = 'http://192.168.110.180:8899'
# 罗成 # 罗成

BIN
public/daolu.xlsx Normal file

Binary file not shown.

BIN
public/dikuai.xlsx Normal file

Binary file not shown.

View File

@ -546,7 +546,7 @@ const handleTerminationTask = async () => {
if (isDrawing.value) { if (isDrawing.value) {
isShowTermination.value = true; isShowTermination.value = true;
nextTick(() => { nextTick(() => {
detailFormTeRef.value.getInfo(props.businessId); detailFormTeRef.value.getInfo(props.businessId1);
}); });
return; return;
} }

View File

@ -165,7 +165,8 @@ const getTableData = async () => {
loading.value = true; loading.value = true;
const params = { const params = {
projectId: currentProject.value?.id, projectId: currentProject.value?.id,
sheet: queryForm.value.sheet sheet: queryForm.value.sheet,
versions: queryForm.value.versions
}; };
const res = await getTreeLimit(params); const res = await getTreeLimit(params);
loading.value = false; loading.value = false;

View File

@ -165,7 +165,7 @@
</el-row> </el-row>
<template #footer> <template #footer>
<el-button @click="closeDialog">取消</el-button> <el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitForm(formRef)">确定</el-button> <el-button type="primary" @click="submitForm(formRef)" :loading="loadingBtn">确定</el-button>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog title="详情" v-model="detailDialog" width="75%" draggable> <el-dialog title="详情" v-model="detailDialog" width="75%" draggable>
@ -228,7 +228,7 @@ const rules = ref({
content: [{ required: true, message: '请输入内容', trigger: 'blur' }] content: [{ required: true, message: '请输入内容', trigger: 'blur' }]
}); });
const loading = ref(false); const loading = ref(false);
const loadingBtn = ref();
//字典获取数据 //字典获取数据
const getTabsList = async () => { const getTabsList = async () => {
const res = await getDicts('subcontracting_type'); const res = await getDicts('subcontracting_type');
@ -457,6 +457,7 @@ const submitForm = async (formEl: FormInstance | undefined) => {
}); });
return; return;
} }
loadingBtn.value = true;
const newSelectionData = selectionData.value.filter((item) => item.quantity != '' && item.quantity != null); const newSelectionData = selectionData.value.filter((item) => item.quantity != '' && item.quantity != null);
if (newSelectionData.some((item) => item.selectNum == '' || item.selectNum == null)) { if (newSelectionData.some((item) => item.selectNum == '' || item.selectNum == null)) {
ElMessage.error('存在未填写数量的工程或费用名称,请检查'); ElMessage.error('存在未填写数量的工程或费用名称,请检查');
@ -488,6 +489,8 @@ const submitForm = async (formEl: FormInstance | undefined) => {
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} finally {
loadingBtn.value = false;
} }
} else { } else {
console.log('error submit!', fields); console.log('error submit!', fields);
@ -544,7 +547,7 @@ const handleDetail = (row: any) => {
getDetails(row); getDetails(row);
}; };
const getDetails = (row: any) => { const getDetails = (row: any) => {
getDetailsList({ id: row.id, type: '1' }).then((res) => { getDetailsList({ id: row.id, type: '1', projectId: currentProject.value?.id }).then((res) => {
if (res.code == 200) { if (res.code == 200) {
detailData.value = res.data; detailData.value = res.data;
} }

View File

@ -35,7 +35,13 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" v-if="reviewStatus && reviewStatus == 'draft'" @click="clickApprovalSheet()">审核</el-button> <el-button
type="primary"
v-if="reviewStatus && reviewStatus == 'draft'"
@click="clickApprovalSheet()"
v-hasPermi="['tender:tenderPlanLimitList:getVersionDetail']"
>审核</el-button
>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button <el-button

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="content-box"> <div class="content-box">
<el-table :data="data" @selection-change="handleSelectionChange"> <el-table :data="data" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="index" label="序号" width="55" align="center" />
<el-table-column align="center" prop="projectName" label="工程名称" /> <el-table-column align="center" prop="projectName" label="工程名称" />
<el-table-column align="center" prop="serialNumber" label="编号" /> <el-table-column align="center" prop="serialNumber" label="编号" />
<el-table-column align="center" prop="to" label="致" /> <el-table-column align="center" prop="to" label="致" />

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="content-box"> <div class="content-box">
<el-table :data="data" style="width: 100%" @selection-change="handleSelectionChange"> <el-table :data="data" style="width: 100%" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="index" width="55" label="序号" align="center" />
<el-table-column align="center" prop="projectName" label="工程名称" /> <el-table-column align="center" prop="projectName" label="工程名称" />
<el-table-column align="center" prop="submitUnit" label="提出单位" /> <el-table-column align="center" prop="submitUnit" label="提出单位" />
<el-table-column align="center" prop="specialty" label="专业"> <el-table-column align="center" prop="specialty" label="专业">
@ -30,7 +30,7 @@
</el-button> </el-button>
<el-button link type="primary" icon="View" @click="handleViewInfo(scope.row)" class="ml-3"> 查看流程 </el-button> <el-button link type="primary" icon="View" @click="handleViewInfo(scope.row)" class="ml-3"> 查看流程 </el-button>
<el-button link type="success" icon="View" @click="handleDetail(scope.row)" class="ml-3"> 详情 </el-button> <el-button link type="success" icon="View" @click="handleDetail(scope.row)" class="ml-3"> 详情 </el-button>
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)"> 删除 </el-button> <!-- <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)"> 删除 </el-button> -->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

View File

@ -36,12 +36,42 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="工程名称"> <el-form-item label="工程名称">
<el-input v-model="form.projectName" /> <el-input disabled v-model="form.projectName" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="提出单位"> <el-form-item label="提出单位">
<el-input v-model="form.submitUnit" /> <el-input v-model="form.submitUnit" placeholder="请输入提出单位" />
</el-form-item>
</el-col>
</el-row>
<!-- 卷册名称 & 附图 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="卷册号">
<!-- <el-input v-model="form.volumeName" /> -->
<el-select
id="projectSelect"
v-model="form.volumeNumber"
placeholder="请选择原卷册号"
clearable
filterable
@change="handleSelect"
style="width: 150px; margin-right: 20px"
>
<el-option
v-for="project in volumeCatalogList"
:key="project.volumeNumber"
:label="project.volumeNumber"
:value="project.volumeNumber"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<!-- 卷册号 -->
<el-form-item label="卷册名称">
<el-input disabled v-model="form.volumeName" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -50,7 +80,7 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="专业"> <el-form-item label="专业">
<el-select v-model="form.specialty" placeholder=""> <el-select disabled v-model="form.specialty" placeholder="请选择专业">
<el-option v-for="item in des_user_major" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in des_user_major" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -62,27 +92,11 @@
</el-col> </el-col>
</el-row> </el-row>
<!-- 卷册名称 & 附图 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="卷册名称">
<el-input v-model="form.volumeName" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附图"> <el-form-item label="附图">
<file-Upload v-model="form.attachmentsImg" :file-type="['pdf', 'png', 'jpg', 'jpeg', 'gif', 'bmp']"> <file-Upload v-model="form.attachmentsImg" :file-type="['pdf', 'png', 'jpg', 'jpeg', 'gif', 'bmp']">
<el-button type="primary">上传附件</el-button> <el-button type="primary">上传附件</el-button>
</file-Upload> </file-Upload>
</el-form-item> </el-form-item>
</el-col>
</el-row>
<!-- 卷册号 -->
<el-form-item label="卷册号">
<el-input v-model="form.volumeNumber" />
</el-form-item>
<!-- 变更原因 --> <!-- 变更原因 -->
<el-form-item label="变更原因"> <el-form-item label="变更原因">
<el-checkbox-group v-model="form.changeReasons"> <el-checkbox-group v-model="form.changeReasons">
@ -103,7 +117,7 @@
<file-upload v-model="form.attachments" :limit="1" :file-type="['pdf']"></file-upload> <file-upload v-model="form.attachments" :limit="1" :file-type="['pdf']"></file-upload>
</el-form-item> </el-form-item>
<el-form-item label="变更费用估算" prop="costEstimation"> <el-form-item label="变更费用估算" prop="costEstimation">
<el-input v-model="form.costEstimation" :rows="6" placeholder="请输入变更费用估算" /> <el-input v-model="form.costEstimation" :rows="6" type="number" placeholder="请输入变更费用估算" />
</el-form-item> </el-form-item>
<el-divider class="mb-10! mt-10!">施工项目部</el-divider> <el-divider class="mb-10! mt-10!">施工项目部</el-divider>
<el-form-item label="项目负责人" prop="contractorLeader"> <el-form-item label="项目负责人" prop="contractorLeader">
@ -177,6 +191,7 @@ import { useUserStoreHook } from '@/store/modules/user';
import { listByIds } from '@/api/system/oss'; import { listByIds } from '@/api/system/oss';
import { addContactnotice, getContactnotice, updateContactnotice } from '@/api/cory/contactnotice'; import { addContactnotice, getContactnotice, updateContactnotice } from '@/api/cory/contactnotice';
const { des_user_major } = toRefs(proxy?.useDict('des_user_major')); const { des_user_major } = toRefs(proxy?.useDict('des_user_major'));
import { catalogList } from '@/api/design/designChange';
// 获取用户 store // 获取用户 store
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
@ -221,11 +236,11 @@ const initFormData = {
id: undefined, id: undefined,
projectId: currentProject.value?.id, projectId: currentProject.value?.id,
projectType: '', projectType: '',
projectName: '', projectName: currentProject.value?.name,
serialNumber: '', serialNumber: '',
to: '', to: '',
subject: '', subject: '',
costEstimation: '', costEstimation: 0,
content: '', content: '',
attachments: '', attachments: '',
contractorLeader: '', contractorLeader: '',
@ -275,13 +290,27 @@ const handleClose = () => {
buttonLoading.value = false; buttonLoading.value = false;
}; };
const { form, rules } = toRefs(data); const { form, rules } = toRefs(data);
const volumeCatalogList = ref([]);
let volumeMap = new Map();
/** 表单重置 */ /** 表单重置 */
const reset = () => { const reset = () => {
form.value = { ...initFormData }; form.value = { ...initFormData };
leaveFormRef.value?.resetFields(); leaveFormRef.value?.resetFields();
}; };
// 获取卷册号列表
const getJuance = async () => {
const res = await catalogList(currentProject.value?.id);
volumeCatalogList.value = res.data;
volumeCatalogList.value.forEach((e) => {
volumeMap.set(e.volumeNumber, e);
});
};
const handleSelect = (val) => {
let obj = volumeMap.get(val);
console.log(obj);
form.value.volumeName = obj.documentName;
form.value.specialty = obj.specialty;
};
/** 获取详情 */ /** 获取详情 */
const getInfo = () => { const getInfo = () => {
loading.value = true; loading.value = true;
@ -345,7 +374,8 @@ const handleStartWorkFlow = async (data: LeaveForm) => {
//流程变量 //流程变量
taskVariables.value = { taskVariables.value = {
// leave4/5 使用的流程变量 // leave4/5 使用的流程变量
userList: ['1', '3', '4'] userList: ['1', '3', '4'],
costEstimation: form.value.costEstimation
}; };
submitFormData.value.variables = taskVariables.value; submitFormData.value.variables = taskVariables.value;
const resp = await startWorkFlow(submitFormData.value); const resp = await startWorkFlow(submitFormData.value);
@ -402,6 +432,7 @@ onMounted(() => {
routeParams.value = proxy.$route.query; routeParams.value = proxy.$route.query;
thumbnailUrl.value = proxy.$route.query.thumbnailUrl; thumbnailUrl.value = proxy.$route.query.thumbnailUrl;
reset(); reset();
getJuance();
loading.value = false; loading.value = false;
if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') { if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
getInfo(); getInfo();

View File

@ -5,7 +5,7 @@
<el-table-column label="序号" type="index" width="60" align="center" /> <el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="处理状态" align="center" prop="status"> <el-table-column label="处理状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :options="safety_inspection_type" :value="scope.row.status" /> <dict-tag :options="wf_business_status" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="检查人" align="center" prop="correctorName" /> <el-table-column label="检查人" align="center" prop="correctorName" />
@ -46,13 +46,16 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220">
<template #default="scope"> <template #default="scope">
<el-space> <el-space>
<el-button link type="primary" icon="View" @click="handleDetail(scope.row)" v-hasPermi="['safety:safetyInspection:query']"> <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"> 详情 </el-button>
详情 <el-button link type="primary" icon="Edit" @click="handleAddApp(scope.row)" v-if="scope.row.status && scope.row.status == 'draft'"
>审批
</el-button> </el-button>
<!-- <el-button link type="success" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['safety:safetyInspection:edit']">修改 </el-button> --> <el-button link type="primary" icon="View" @click="handleAddApp(scope.row)" v-if="scope.row.status && scope.row.status != 'draft'"
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['safety:safetyInspection:remove']"> >查看流程
</el-button>
<!-- <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['safety:safetyInspection:remove']">
删除 删除
</el-button> </el-button> -->
</el-space> </el-space>
</template> </template>
</el-table-column> </el-table-column>
@ -191,9 +194,10 @@ const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目 // 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject); const currentProject = computed(() => userStore.selectedProject);
const { safety_inspection_violation_type, safety_inspection_check_type, review_type, safety_inspection_type } = toRefs<any>( const { safety_inspection_violation_type, safety_inspection_check_type, review_type, safety_inspection_type, wf_business_status } = toRefs<any>(
useDict('safety_inspection_violation_type', 'safety_inspection_check_type', 'review_type', 'safety_inspection_type') useDict('safety_inspection_violation_type', 'safety_inspection_check_type', 'review_type', 'safety_inspection_type', 'wf_business_status')
); );
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const safetyInspectionDetail = ref<SafetyInspectionVO>(); const safetyInspectionDetail = ref<SafetyInspectionVO>();
const form = reactive({ const form = reactive({
@ -236,6 +240,18 @@ const handleDetail = async (row) => {
rectificationFileList.value = rectificationFileRes.data; rectificationFileList.value = rectificationFileRes.data;
} }
}; };
const handleAddApp = (row) => {
// 添加审批
proxy.$tab.closePage(proxy.$route);
proxy.$router.push({
path: `/approval/workMessage/indexEdit`,
query: {
id: row.id,
type: 'update'
}
});
};
const getList = (row) => {}; const getList = (row) => {};
const handleDelete = (row) => {}; const handleDelete = (row) => {};
</script> </script>

View File

@ -1,15 +1,12 @@
<template> <template>
<div class="p-2"> <div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
:leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="模板类型" prop="projectType"> <el-form-item label="模板类型" prop="projectType">
<el-select v-model="queryParams.projectType" placeholder="请选择模板类型" clearable filterable <el-select v-model="queryParams.projectType" placeholder="请选择模板类型" clearable filterable @change="selectType">
@change="selectType"> <el-option v-for="item in projectTypeOptions" :key="item.name" :label="item.name" :value="item.name"> </el-option>
<el-option v-for="item in projectTypeOptions" :key="item.name" :label="item.name" :value="item.name">
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item> <!-- <el-form-item>
@ -24,8 +21,9 @@
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" :disabled="addSingle" @click="handleAdd" <el-button type="primary" plain icon="Plus" :disabled="addSingle" @click="handleAdd" v-hasPermi="['cory:contactnotice:add']"
v-hasPermi="['quality:qualityInspection:add']">新增</el-button> >新增</el-button
>
</el-col> </el-col>
<!-- <el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['quality:qualityInspection:edit']" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['quality:qualityInspection:edit']"
@ -33,8 +31,9 @@
> >
</el-col> --> </el-col> -->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['cory:contactnotice:remove']"
v-hasPermi="['quality:qualityInspection:remove']">删除</el-button> >删除</el-button
>
</el-col> </el-col>
<!-- <el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['quality:qualityInspection:export']">导出</el-button> <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['quality:qualityInspection:export']">导出</el-button>
@ -44,8 +43,7 @@
</template> </template>
<!-- card body --> <!-- card body -->
<Notice @selection-change="handleSelectionChange" :data="tableData"></Notice> <Notice @selection-change="handleSelectionChange" :data="tableData"></Notice>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card> </el-card>
<el-dialog title="新增模板" v-model="dialogVisible" width="800"> <el-dialog title="新增模板" v-model="dialogVisible" width="800">
@ -56,14 +54,12 @@
<div> <div>
<el-form-item label="检查类型" prop="checkType"> <el-form-item label="检查类型" prop="checkType">
<el-select v-model="form.checkType" placeholder="请选择检查类型"> <el-select v-model="form.checkType" placeholder="请选择检查类型">
<el-option v-for="dict in safety_inspection_check_type" :key="dict.value" :label="dict.label" <el-option v-for="dict in safety_inspection_check_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
:value="dict.value"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="违章类型" prop="violationType"> <el-form-item label="违章类型" prop="violationType">
<el-select v-model="form.violationType" placeholder="请选择违章类型"> <el-select v-model="form.violationType" placeholder="请选择违章类型">
<el-option v-for="dict in safety_inspection_violation_type" :key="dict.value" :label="dict.label" <el-option v-for="dict in safety_inspection_violation_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
:value="dict.value"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="巡检结果" prop="inspectionResult"> <el-form-item label="巡检结果" prop="inspectionResult">
@ -71,8 +67,7 @@
</el-form-item> </el-form-item>
<el-form-item label="整改班组" prop="teamId"> <el-form-item label="整改班组" prop="teamId">
<el-select v-model="form.teamId" placeholder="请选择整改班组"> <el-select v-model="form.teamId" placeholder="请选择整改班组">
<el-option v-for="item in teamOpt" :key="item.value" :label="item.label" :value="item.value" <el-option v-for="item in teamOpt" :key="item.value" :label="item.label" :value="item.value" @click="changeForeman(item.value)" />
@click="changeForeman(item.value)" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="整改人" prop="correctorId"> <el-form-item label="整改人" prop="correctorId">
@ -87,16 +82,13 @@
<el-input v-model="form.measure" type="textarea" placeholder="请输入内容" /> <el-input v-model="form.measure" type="textarea" placeholder="请输入内容" />
</el-form-item> </el-form-item>
<el-form-item label="要求整改期限" prop="rectificationDeadline"> <el-form-item label="要求整改期限" prop="rectificationDeadline">
<el-date-picker clearable v-model="form.rectificationDeadline" type="date" value-format="YYYY-MM-DD" <el-date-picker clearable v-model="form.rectificationDeadline" type="date" value-format="YYYY-MM-DD" placeholder="选择要求整改期限" />
placeholder="选择要求整改期限" />
</el-form-item> </el-form-item>
<el-form-item label="检查附件" prop="checkFile"> <el-form-item label="检查附件" prop="checkFile">
<file-upload v-model="form.checkFile" :file-size="20" <file-upload v-model="form.checkFile" :file-size="20" :file-type="['doc', 'docx', 'pdf', 'png', 'jpg', 'jpeg']" />
:file-type="['doc', 'docx', 'pdf', 'png', 'jpg', 'jpeg']" />
</el-form-item> </el-form-item>
<el-form-item label="整改附件" prop="rectificationFile"> <el-form-item label="整改附件" prop="rectificationFile">
<file-upload v-model="form.rectificationFile" :file-size="20" <file-upload v-model="form.rectificationFile" :file-size="20" :file-type="['doc', 'docx', 'pdf', 'png', 'jpg', 'jpeg']" />
:file-type="['doc', 'docx', 'pdf', 'png', 'jpg', 'jpeg']" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
@ -308,6 +300,7 @@ const selectType = (value: string) => {
const resetForm = () => { const resetForm = () => {
formRef.value?.resetFields(); formRef.value?.resetFields();
}; };
//监听项目id刷新数据 //监听项目id刷新数据
const listeningProject = watch( const listeningProject = watch(
() => currentProject.value?.id, () => currentProject.value?.id,

View File

@ -0,0 +1,482 @@
<template>
<div class="p-4 bg-gray-50">
<div class="max-w-4xl mx-auto">
<!-- 顶部按钮区域 -->
<el-card class="mb-4 rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md">
<approvalButton
@submitForm="submitForm"
@approvalVerifyOpen="approvalVerifyOpen"
@handleApprovalRecord="handleApprovalRecord"
:buttonLoading="buttonLoading"
:id="form.id"
:status="form.status"
:pageType="routeParams.type"
/>
</el-card>
<!-- 表单区域 -->
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
<h3 class="text-lg font-semibold text-gray-800">工作联系单审批</h3>
</div>
<div class="p-6">
<div class="w80% ma">
<h2 style="text-align: center; margin-top: 5px; font-weight: bold">通知单</h2>
<el-row>
<el-col :span="12" style="text-align: left">填报人{{ safetyInspectionDetail?.creatorName }}</el-col>
<el-col :span="12" style="text-align: right">填报时间{{ safetyInspectionDetail?.createTime }}</el-col>
</el-row>
<el-descriptions :column="2" border style="margin-top: 8px" label-width="160px" size="large">
<el-descriptions-item label-align="center" label="检查项目" :span="2" class-name="zebra"
>{{ currentProject?.name }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="检查类型" label-class-name="white">
<dict-tag :options="safety_inspection_check_type" :value="safetyInspectionDetail?.checkType" />
</el-descriptions-item>
<el-descriptions-item label-align="center" label="违章类型" label-class-name="white">
<dict-tag :options="safety_inspection_violation_type" :value="safetyInspectionDetail?.violationType" />
</el-descriptions-item>
<el-descriptions-item label-align="center" label="检查时间" class-name="zebra"
>{{ safetyInspectionDetail?.checkTime }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="检查人" class-name="zebra"
>{{ safetyInspectionDetail?.creatorName }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="整改人" label-class-name="white"
>{{ safetyInspectionDetail?.correctorName }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="要求整改期限" label-class-name="white">
{{ dayjs(safetyInspectionDetail?.rectificationDeadline).format('YYYY 年 MM 月 DD 日') }}
</el-descriptions-item>
</el-descriptions>
<el-descriptions border direction="vertical" size="large">
<el-descriptions-item label-align="center" label="巡检结果" class-name="none"></el-descriptions-item>
</el-descriptions>
<el-descriptions :column="2" border label-width="160px" size="large">
<el-descriptions-item label-align="center" label="内容" :span="2" label-class-name="white"
>{{ safetyInspectionDetail?.hiddenDanger }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="检查附件" :span="2" label-class-name="white">
<el-space wrap>
<div v-for="item in checkFileList" :key="item.ossId">
<span v-if="['.png', '.jpg', '.jpeg'].includes(item.fileSuffix)">
<image-preview :src="item.url" width="200px" />
</span>
<span v-else>
<el-link :href="`${item.url}`" type="primary" :underline="false" target="_blank">
<span> {{ item.originalName }} </span>
</el-link>
</span>
</div>
</el-space>
</el-descriptions-item>
<el-descriptions-item label-align="center" label="检查状态" :span="2" label-class-name="white">
<el-steps style="max-width: 200px" :active="Number(safetyInspectionDetail?.status)" finish-status="finish">
<el-step v-for="item in safety_inspection_type" :key="item.value" :title="item.label" />
</el-steps>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border direction="vertical" size="large">
<el-descriptions-item label-align="center" label="整改情况" class-name="none"></el-descriptions-item>
</el-descriptions>
<el-descriptions :column="2" border label-width="160px" size="large">
<el-descriptions-item label-align="center" label="班组" label-class-name="white"
>{{ safetyInspectionDetail?.teamName }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="整改日期" label-class-name="white"
>{{ safetyInspectionDetail?.rectificationTime }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="整改措施及完成情况" :span="2" label-class-name="white">
{{ safetyInspectionDetail?.measure }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="整改附件" :span="2" label-class-name="white">
<el-space wrap>
<div v-for="item in rectificationFileList" :key="item.ossId">
<span v-if="['.png', '.jpg', '.jpeg'].includes(item.fileSuffix)">
<image-preview :src="item.url" width="200px" />
</span>
<span v-else>
<el-link :href="`${item.url}`" :underline="false" target="_blank">
<span> {{ item.originalName }} </span>
</el-link>
</span>
</div>
</el-space>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border direction="vertical" size="large">
<el-descriptions-item label-align="center" label="复查结果" class-name="none"></el-descriptions-item>
</el-descriptions>
<el-descriptions :column="2" border label-width="160px" size="large">
<el-descriptions-item label-align="center" label="复查人" label-class-name="white"
>{{ safetyInspectionDetail?.creatorName }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="复查日期" label-class-name="white"
>{{ safetyInspectionDetail?.reviewTime }}
</el-descriptions-item>
<el-descriptions-item label-align="center" label="复查情况" :span="2" label-class-name="white"
>{{ safetyInspectionDetail?.review }}
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</el-card>
<!-- 提交组件 -->
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
<approvalRecord ref="approvalRecordRef"></approvalRecord>
<!-- 流程选择对话框 -->
<el-dialog
draggable
v-model="dialogVisible.visible"
:title="dialogVisible.title"
:before-close="handleClose"
width="500"
class="rounded-lg shadow-lg"
>
<div class="p-4">
<p class="text-gray-600 mb-4">请选择要启动的流程</p>
<el-select v-model="flowCode" placeholder="请选择流程" style="width: 100%">
<el-option v-for="item in flowCodeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<template #footer>
<div class="dialog-footer p-4 border-t border-gray-100 flex justify-end space-x-3">
<el-button @click="handleClose" class="px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50 transition-colors"
>取消</el-button
>
<el-button type="primary" @click="submitFlow()" class="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90 transition-colors"
>确认</el-button
>
</div>
</template>
</el-dialog>
</div>
</div>
</template>
<script setup name="Leave" lang="ts">
import { LeaveForm, LeaveQuery, LeaveVO } from '@/api/workflow/leave/types';
import { startWorkFlow } from '@/api/workflow/task';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import ApprovalButton from '@/components/Process/approvalButton.vue';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
import { useUserStoreHook } from '@/store/modules/user';
import { listByIds } from '@/api/system/oss';
import { dayjs } from 'element-plus';
import { useDict } from '@/utils/dict';
import { SafetyInspectionVO } from '@/api/safety/safetyInspection/types';
// const { des_user_major } = toRefs(proxy?.useDict('des_user_major'));
import { getContactnotice } from '@/api/cory/contactnotice';
const { safety_inspection_violation_type, safety_inspection_check_type, review_type, safety_inspection_type, wf_business_status } = toRefs<any>(
useDict('safety_inspection_violation_type', 'safety_inspection_check_type', 'review_type', 'safety_inspection_type', 'wf_business_status')
);
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
const buttonLoading = ref(false);
const loading = ref(true);
const thumbnailUrl = ref('');
//路由参数
const routeParams = ref<Record<string, any>>({});
const flowCodeOptions = [
{
value: currentProject.value?.id + '_contactForm',
label: '工作联系单审批'
}
];
const flowCode = ref<string>('');
const status = ref<string>('');
const dialogVisible = reactive<DialogOption>({
visible: false,
title: '流程定义'
});
//提交组件
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
//审批记录组件
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const leaveFormRef = ref<ElFormInstance>();
const dialog = reactive({
visible: false,
title: '',
isEdit: false
});
const submitFormData = ref<StartProcessBo>({
businessId: '',
flowCode: '',
variables: {}
});
const taskVariables = ref<Record<string, any>>({});
const initFormData = {
id: undefined,
projectId: currentProject.value?.id,
projectType: '',
projectName: '',
serialNumber: '',
to: '',
subject: '',
costEstimation: '',
content: '',
attachments: '',
contractorLeader: '',
contractorDate: '',
supervisorLeader: '',
supervisorDate: '',
ownerRep: '',
ownerDate: '',
unitName: '',
profession: '',
applyDate: '',
bookName: '',
bookNo: '',
hasAttachment: '',
changeReasons: [],
changeContent: '',
costEstimate: '',
status: ''
};
const data = reactive({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: currentProject.value?.id,
fileName: undefined,
fileType: undefined,
fileSuffix: undefined,
fileStatus: undefined,
originalName: undefined,
newest: undefined,
params: {}
}
});
const safetyInspectionDetail = ref<SafetyInspectionVO>();
const handleClose = () => {
dialogVisible.visible = false;
flowCode.value = '';
buttonLoading.value = false;
};
const { form } = toRefs(data);
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
leaveFormRef.value?.resetFields();
};
const checkFileList: any = ref([]);
const rectificationFileList: any = ref([]);
/** 获取详情 */
const getInfo = () => {
loading.value = true;
buttonLoading.value = false;
nextTick(async () => {
const res = await getContactnotice(routeParams.value.id);
console.log(res.data);
const detail = res.data.detail ? JSON.parse(res.data.detail) : {};
safetyInspectionDetail.value = { ...res.data, ...detail };
if (safetyInspectionDetail.value.checkFile) {
const checkFileRes = await listByIds(safetyInspectionDetail.value.checkFile.split(','));
checkFileList.value = checkFileRes.data;
}
if (safetyInspectionDetail.value.rectificationFile) {
const rectificationFileRes = await listByIds(safetyInspectionDetail.value.rectificationFile.split(','));
rectificationFileList.value = rectificationFileRes.data;
}
Object.assign(form.value, safetyInspectionDetail.value);
loading.value = false;
buttonLoading.value = false;
});
};
const submitFlow = async () => {
console.log('form.value', form.value);
handleStartWorkFlow(form.value);
dialogVisible.visible = false;
};
//提交申请
const handleStartWorkFlow = async (data: LeaveForm) => {
console.log('data', data);
try {
submitFormData.value.flowCode = flowCode.value;
submitFormData.value.businessId = data.id;
//流程变量
taskVariables.value = {
// leave4/5 使用的流程变量
userList: ['1', '3', '4']
};
submitFormData.value.variables = taskVariables.value;
const resp = await startWorkFlow(submitFormData.value);
if (submitVerifyRef.value) {
buttonLoading.value = false;
submitVerifyRef.value.openDialog(resp.data.taskId);
}
} finally {
buttonLoading.value = false;
}
};
/** 提交按钮 */
const submitForm = (status1: string) => {
status.value = status1;
submit(status.value, form.value);
};
//审批记录
const handleApprovalRecord = () => {
approvalRecordRef.value.init(form.value.id);
};
//提交回调
const submitCallback = async () => {
await proxy.$tab.closePage(proxy.$route);
proxy.$router.go(-1);
};
//审批
const approvalVerifyOpen = async () => {
submitVerifyRef.value.openDialog(routeParams.value.taskId);
};
// 图纸上传成功之后 开始提交
const submit = async (status, data) => {
form.value = data;
if (status === 'draft') {
buttonLoading.value = false;
proxy?.$modal.msgSuccess('暂存成功');
proxy.$tab.closePage(proxy.$route);
proxy.$router.go(-1);
} else {
if ((form.value.status === 'draft' && (flowCode.value === '' || flowCode.value === null)) || routeParams.value.type === 'add') {
flowCode.value = flowCodeOptions[0].value;
dialogVisible.visible = true;
return;
}
//说明启动过先随意穿个参数
if (flowCode.value === '' || flowCode.value === null) {
flowCode.value = 'xx';
}
console.log('data', data);
await handleStartWorkFlow(data);
}
};
onMounted(() => {
nextTick(async () => {
routeParams.value = proxy.$route.query;
reset();
loading.value = false;
if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
getInfo();
}
});
});
</script>
<style scoped lang="scss">
/* 全局样式 */
:root {
--primary: #409eff;
--primary-light: #66b1ff;
--primary-dark: #3a8ee6;
--success: #67c23a;
--warning: #e6a23c;
--danger: #f56c6c;
--info: #909399;
}
/* 表单样式优化 */
.el-form-item {
.el-form-item__label {
color: #606266;
font-weight: 500;
}
.el-input__inner,
.el-select .el-input__inner {
border-radius: 4px;
transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus {
border-color: var(--primary-light);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
}
.el-textarea__inner {
border-radius: 4px;
transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus {
border-color: var(--primary-light);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
}
}
/* 按钮样式优化 */
.el-button {
border-radius: 4px;
transition: all 0.2s;
&.is-primary {
background-color: var(--primary);
border-color: var(--primary);
&:hover {
background-color: var(--primary-light);
border-color: var(--primary-light);
}
&:active {
background-color: var(--primary-dark);
border-color: var(--primary-dark);
}
}
&.is-text {
color: var(--primary);
&:hover {
color: var(--primary-light);
background-color: rgba(64, 158, 255, 0.05);
}
}
}
/* 卡片样式优化 */
.el-card {
transition: all 0.3s ease;
&:hover {
/* transform: translateY(-2px); */
}
}
/* 对话框样式优化 */
.el-dialog {
.el-dialog__header {
background-color: #f5f7fa;
border-bottom: 1px solid #ebeef5;
padding: 15px 20px;
}
.el-dialog__title {
font-size: 16px;
font-weight: 600;
color: #303133;
}
.el-dialog__footer {
padding: 15px 20px;
border-top: 1px solid #ebeef5;
}
}
</style>

View File

@ -67,7 +67,7 @@
<el-form-item label="招标计划" prop="tenderId"> <el-form-item label="招标计划" prop="tenderId">
<!-- <el-input v-model="form.tenderId" placeholder="请输入招标Id" /> --> <!-- <el-input v-model="form.tenderId" placeholder="请输入招标Id" /> -->
<el-input v-model="form.name" placeholder="请选择招标计划" disabled /> <el-input v-model="form.name" placeholder="请选择招标计划" disabled />
<el-button type="primary" @click="handleChoose">选择招标</el-button> <el-button type="primary" @click="handleChoose" v-hasPermi="['ctr:expensesContract:tenderList']">选择招标</el-button>
</el-form-item> </el-form-item>
<el-form-item label="供应商" prop="contractSupplier"> <el-form-item label="供应商" prop="contractSupplier">
<el-input v-model="form.contractSupplier" placeholder="请输入供应商" disabled /> <el-input v-model="form.contractSupplier" placeholder="请输入供应商" disabled />
@ -313,7 +313,7 @@ const submitForm = async () => {
} }
resetForm(); resetForm();
ElMessage.success('合同提交成功'); ElMessage.success('合同提交成功');
// active.value = 0; // 重置步骤 active.value = 0; // 重置步骤
if (contract_type.value === 'income') { if (contract_type.value === 'income') {
proxy.$router.push('/ctr/incomeContract'); proxy.$router.push('/ctr/incomeContract');
} else { } else {

View File

@ -476,7 +476,7 @@ const designUser = async () => {
form.reviewers = []; form.reviewers = [];
form.approved = []; form.approved = [];
form.auditor = []; form.auditor = [];
disabledForm.value = false;
if (res.code == 200 && Array.isArray(res.rows) && res.rows.length > 0) { if (res.code == 200 && Array.isArray(res.rows) && res.rows.length > 0) {
disabledForm.value = true; disabledForm.value = true;
// 1. 按用户类型分类数据(明确类型) // 1. 按用户类型分类数据(明确类型)

View File

@ -113,7 +113,7 @@ const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
//按钮组件 //按钮组件
const flowCodeOptions = [ const flowCodeOptions = [
{ {
value: currentProject.value?.id + '_equipmentList', value: currentProject.value?.id + '_materialsPlans',
label: '物资设备清单审核' label: '物资设备清单审核'
} }
]; ];

View File

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

View File

@ -49,7 +49,7 @@
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-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> <el-button @click="cancel"> </el-button>
</div> </div>
</template> </template>

View File

@ -109,7 +109,12 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="设计人员" prop="principal"> <el-form-item label="设计人员" prop="principal">
<el-select :disabled="!form.specialty" 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-option v-for="item in userAppList" :key="item.userId" :label="item.userName" :value="item.userId.toString()" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -146,12 +151,16 @@
/></el-select> /></el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="uploadForm.type == '3'" label="蓝图" prop="fileIds"> <el-form-item v-if="uploadForm.type == '3'" label="蓝图" prop="fileIds">
<<<<<<< HEAD
<file-upload <file-upload
:fileType="['pdf']" :fileType="['pdf']"
:isShowTip="false" :isShowTip="false"
:fileSize="100" :fileSize="100"
. v-model="uploadForm.fileIds" . v-model="uploadForm.fileIds"
></file-upload> ></file-upload>
=======
<file-upload :fileType="['pdf']" :isShowTip="false" :fileSize="100" v-model="uploadForm.fileIds"></file-upload>
>>>>>>> 8a3f338e2734575bcb743e917b1232bedc76f105
</el-form-item> </el-form-item>
<el-form-item v-if="uploadForm.type == '1'" label="过程图纸" prop="cancellationIds"> <el-form-item v-if="uploadForm.type == '1'" label="过程图纸" prop="cancellationIds">
<file-upload :fileType="['pdf']" :isShowTip="false" :fileSize="100" v-model="uploadForm.cancellationIds"></file-upload> <file-upload :fileType="['pdf']" :isShowTip="false" :fileSize="100" v-model="uploadForm.cancellationIds"></file-upload>
@ -252,7 +261,8 @@ import {
delVolumeCatalog, delVolumeCatalog,
addVolumeCatalog, addVolumeCatalog,
updateVolumeCatalog, updateVolumeCatalog,
uploadVolumeFile,majorList, uploadVolumeFile,
majorList,
getVolumeCatafileList, getVolumeCatafileList,
volumeFileList volumeFileList
} from '@/api/design/volumeCatalog'; } from '@/api/design/volumeCatalog';
@ -263,7 +273,7 @@ import TableContent from './comm/tableContent.vue';
const fileList = ref([]); const fileList = ref([]);
import { designUserList } from '@/api/design/appointment'; import { designUserList } from '@/api/design/appointment';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { design_state, wf_business_status, } = toRefs(proxy?.useDict('design_state', 'wf_business_status')); const { design_state, wf_business_status } = toRefs(proxy?.useDict('design_state', 'wf_business_status'));
import { drawingreviewReceiptsDetail, drawingreviewReceiptsList } from '@/api/design/drawingreview'; import { drawingreviewReceiptsDetail, drawingreviewReceiptsList } from '@/api/design/drawingreview';
const volumeCatalogList = ref<VolumeCatalogVO[]>([]); const volumeCatalogList = ref<VolumeCatalogVO[]>([]);
const des_user_major = ref([]); const des_user_major = ref([]);
@ -361,7 +371,7 @@ const data = reactive({
documentName: [{ required: true, message: '资料名称不能为空', trigger: 'blur' }], documentName: [{ required: true, message: '资料名称不能为空', trigger: 'blur' }],
plannedCompletion: [{ required: true, message: '计划出图事件不能为空', trigger: 'blur' }], plannedCompletion: [{ required: true, message: '计划出图事件不能为空', trigger: 'blur' }],
principal: [{ required: true, message: '设计人员不能为空', trigger: 'blur' }], principal: [{ required: true, message: '设计人员不能为空', trigger: 'blur' }],
specialty: [{ required: true, message: '专业不能为空', trigger: 'blur' }], specialty: [{ required: true, message: '专业不能为空', trigger: 'blur' }]
} }
}); });
@ -369,7 +379,7 @@ const { queryParams, form, rules } = toRefs(data);
const changeSpecialty = (val) => { const changeSpecialty = (val) => {
form.value.principal = ''; //清空 form.value.principal = ''; //清空
getUserAppList(val); getUserAppList(val);
} };
// 获取专业列表 // 获取专业列表
const getSpecialtyList = async () => { const getSpecialtyList = async () => {
const res = await majorList({ projectId: currentProject.value?.id, userType: 2 }); const res = await majorList({ projectId: currentProject.value?.id, userType: 2 });

View File

@ -47,16 +47,16 @@
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['formalities:listOfFormalities:add']">新增</el-button> <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['formalities:formalitiesAreConsolidated:getTree']"
>新增</el-button
>
<span style="margin-left: 10px" <span style="margin-left: 10px"
><el-tooltip class="box-item" effect="dark" content="从原有模板列表选择新增" placement="top"> ><el-tooltip class="box-item" effect="dark" content="从原有模板列表选择新增" placement="top">
<el-icon color="#409efc"><WarningFilled /></el-icon> </el-tooltip <el-icon color="#409efc"><WarningFilled /></el-icon> </el-tooltip
></span> ></span>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5" v-hasPermi="['formalities:listOfFormalities:list']">
<el-button type="primary" plain icon="Plus" @click="addTemplate()" v-hasPermi="['formalities:formalitiesAreConsolidated:addFormalities']" <el-button type="primary" plain icon="Plus" @click="addTemplate()">新增数据</el-button>
>新增数据</el-button
>
<span style="margin-left: 10px"> <span style="margin-left: 10px">
<el-tooltip class="box-item" effect="dark" content="创建新模板并添加数据" placement="top"> <el-tooltip class="box-item" effect="dark" content="创建新模板并添加数据" placement="top">
<el-icon color="#409efc"><WarningFilled /></el-icon> <el-icon color="#409efc"><WarningFilled /></el-icon>

View File

@ -202,28 +202,25 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="合格证文件" prop="certCountFileId"> <el-form-item label="合格证文件" prop="certCountFileId">
<file-upload :isShowTip="false" v-model="form.certCountFileId" /> <file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.certCountFileId" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="出厂报告文件" prop="reportCountFileId"> <el-form-item label="出厂报告文件" prop="reportCountFileId">
<file-upload :isShowTip="false" v-model="form.reportCountFileId" /> <file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.reportCountFileId" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="技术资料文件" prop="techDocCountFileId"> <el-form-item label="技术资料文件" prop="techDocCountFileId">
<file-upload :isShowTip="false" v-model="form.techDocCountFileId" /> <file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.techDocCountFileId" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="厂家资质文件" prop="licenseCountFileId"> <el-form-item label="厂家资质文件" prop="licenseCountFileId">
<file-upload :isShowTip="false" v-model="form.licenseCountFileId" /> <file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.licenseCountFileId" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24"> <span style="color: #ff0000ab; margin-bottom: 10px; display: block">注意pdf/png/jpg/jpeg格式文件</span> </el-col
<span style="color: #ff0000ab; margin-bottom: 10px; display: block"
>注意请上传doc/xls/ppt/txt/pdf/png/jpg/jpeg/zip格式文件</span
> </el-col
><el-col :span="24"> ><el-col :span="24">
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />

View File

@ -8,6 +8,7 @@
<right-toolbar @queryTable="refreshData"></right-toolbar> <right-toolbar @queryTable="refreshData"></right-toolbar>
</el-row> </el-row>
</el-card> </el-card>
<!-- 数据表格 --> <!-- 数据表格 -->
<div class="bg-white rounded-lg shadow-sm overflow-hidden transition-all duration-300 hover:shadow-md"> <div class="bg-white rounded-lg shadow-sm overflow-hidden transition-all duration-300 hover:shadow-md">
<el-table <el-table

View File

@ -58,7 +58,19 @@
<!-- 添加或修改施工产值对话框 --> <!-- 添加或修改施工产值对话框 -->
<el-dialog draggable :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog draggable :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="constructionValueFormRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="constructionValueFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="方阵" prop="matrixId" v-if="!form.id"> <el-form-item label="对应项目结构" prop="progressCategoryId">
<el-tree-select
v-model="form.progressCategoryId"
:data="ProjectStructureList"
@node-click="handleCheckChange"
:props="{ value: 'id', label: 'name', children: 'children' }"
value-key="id"
@change="selectTime"
placeholder="请选择项目结构"
check-strictly
/>
</el-form-item>
<!-- <el-form-item label="方阵" prop="matrixId" v-if="!form.id">
<el-cascader <el-cascader
:options="matrixOptions" :options="matrixOptions"
placeholder="请选择" placeholder="请选择"
@ -81,7 +93,7 @@
clearable clearable
> >
</el-cascader> </el-cascader>
</el-form-item> </el-form-item> -->
<el-form-item label="计划日期" prop="reportDateId" v-if="!form.id"> <el-form-item label="计划日期" prop="reportDateId" v-if="!form.id">
<el-cascader <el-cascader
:options="progressTimeList" :options="progressTimeList"
@ -129,6 +141,7 @@ import {
updateConstructionValue updateConstructionValue
} from '@/api/out/constructionValue'; } from '@/api/out/constructionValue';
import { ConstructionValueVO, ConstructionValueQuery, ConstructionValueForm } from '@/api/out/constructionValue/types'; import { ConstructionValueVO, ConstructionValueQuery, ConstructionValueForm } from '@/api/out/constructionValue/types';
import { getProjectStructure } from '@/api/progress/constructionSchedulePlan';
import { getProjectSquare, listProgressCategory, workScheduleList, workScheduleListDetail, workScheduleListPosition } from '@/api/progress/plan'; import { getProjectSquare, listProgressCategory, workScheduleList, workScheduleListDetail, workScheduleListPosition } from '@/api/progress/plan';
import { ProgressCategoryVO } from '@/api/progress/plan/types'; import { ProgressCategoryVO } from '@/api/progress/plan/types';
@ -216,7 +229,7 @@ const data = reactive<PageData<ConstructionValueForm, ConstructionValueQuery>>({
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
const ProjectStructureList = ref([]);
/** 查询施工产值列表 */ /** 查询施工产值列表 */
const getList = async () => { const getList = async () => {
loading.value = true; loading.value = true;
@ -260,19 +273,19 @@ const handleSelectionChange = (selection: ConstructionValueVO[]) => {
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = async () => { const handleAdd = async () => {
reset(); reset();
const res = await getProjectSquare(currentProject.value?.id); // const res = await getProjectSquare(currentProject.value?.id);
if (res.data.length === 0) return proxy?.$modal.msgWarning('当前项目下没有方阵,请先创建方阵'); // if (res.data.length === 0) return proxy?.$modal.msgWarning('当前项目下没有方阵,请先创建方阵');
const isFangzhen = res.data.some((item) => item.children && item.children.length); // const isFangzhen = res.data.some((item) => item.children && item.children.length);
console.log('🚀 ~ handleAdd ~ isFangzhen:', isFangzhen); // console.log('🚀 ~ handleAdd ~ isFangzhen:', isFangzhen);
if (!isFangzhen) return proxy?.$modal.msgWarning('当前项目下没有方阵,请先创建方阵'); // if (!isFangzhen) return proxy?.$modal.msgWarning('当前项目下没有方阵,请先创建方阵');
let matrixList = res.data.map((item) => { // let matrixList = res.data.map((item) => {
return { // return {
...item, // ...item,
matrixId: item?.projectId // matrixId: item?.projectId
}; // };
}); // });
matrixOptions.value = matrixList; // matrixOptions.value = matrixList;
dialog.visible = true; dialog.visible = true;
dialog.title = '添加施工产值'; dialog.title = '添加施工产值';
}; };
@ -304,6 +317,18 @@ const submitTime = async (value: string) => {
form.value.artificialNum = data?.finishedNumber; form.value.artificialNum = data?.finishedNumber;
}; };
/** 查询施工进度计划列表 */
const getProjectStructureList = async () => {
const res = await getProjectStructure(currentProject.value?.id);
ProjectStructureList.value = [res.data];
console.log(ProjectStructureList.value);
};
/** 查询施工进度计划列表 */
const handleCheckChange = (val) => {
form.value.projectStructureName = val.name;
};
/** 重置选择器 */ /** 重置选择器 */
const resetCascader = (index?: number) => { const resetCascader = (index?: number) => {
if (index) { if (index) {
@ -370,6 +395,7 @@ const handleExport = () => {
}; };
onMounted(() => { onMounted(() => {
getProjectStructureList();
getList(); getList();
}); });

View File

@ -24,8 +24,8 @@
<!-- 添加或修改月度产值计划对话框 --> <!-- 添加或修改月度产值计划对话框 -->
<el-dialog draggable :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog draggable :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="monthPlanFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="monthPlanFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="金额" prop="unitPrice"> <el-form-item label="接收数量" prop="acceptedQuantity">
<el-input v-model="form.unitPrice" placeholder="请输入金额" type="number" /> <el-input v-model="form.acceptedQuantity" placeholder="请输入接收数量" type="number" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -76,7 +76,8 @@ const initFormData = {
valueType: undefined, valueType: undefined,
planAuditStatus: undefined, planAuditStatus: undefined,
completeAuditStatus: undefined, completeAuditStatus: undefined,
unitPrice: undefined unitPrice: undefined,
acceptedQuantity: undefined
}; };
const data = reactive({ const data = reactive({
form: { ...initFormData }, form: { ...initFormData },

View File

@ -1,7 +1,6 @@
<template> <template>
<div class="p-2"> <div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
:leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@ -10,8 +9,7 @@
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable> <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option v-for="dict in project_construction_status" :key="dict.value" :label="dict.label" <el-option v-for="dict in project_construction_status" :key="dict.value" :label="dict.label" :value="dict.value" />
:value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -27,8 +25,7 @@
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd()" <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['progress:constructionSchedulePlan:add']">新增</el-button>
v-hasPermi="['progress:constructionSchedulePlan:add']">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button> <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
@ -36,9 +33,14 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
</template> </template>
<el-table ref="constructionSchedulePlanTableRef" v-loading="loading" :data="constructionSchedulePlanList" <el-table
row-key="id" :default-expand-all="isExpandAll" ref="constructionSchedulePlanTableRef"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> v-loading="loading"
:data="constructionSchedulePlanList"
row-key="id"
:default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<!-- <el-table-column label="序号" type="id" /> --> <!-- <el-table-column label="序号" type="id" /> -->
<el-table-column label="节点名称" prop="nodeName" /> <el-table-column label="节点名称" prop="nodeName" />
<el-table-column label="对应项目结构" align="center" prop="projectStructureName" /> <el-table-column label="对应项目结构" align="center" prop="projectStructureName" />
@ -71,16 +73,19 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['progress:constructionSchedulePlan:edit']" />
v-hasPermi="['progress:constructionSchedulePlan:edit']" />
</el-tooltip> </el-tooltip>
<el-tooltip content="新增" placement="top"> <el-tooltip content="新增" placement="top">
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['progress:constructionSchedulePlan:add']" />
v-hasPermi="['progress:constructionSchedulePlan:add']" />
</el-tooltip> </el-tooltip>
<el-tooltip content="删除" placement="top"> <el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" <el-button
v-hasPermi="['progress:constructionSchedulePlan:remove']" /> link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['progress:constructionSchedulePlan:remove']"
/>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@ -90,39 +95,57 @@
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="constructionSchedulePlanFormRef" :model="form" :rules="rules" label-width="110px"> <el-form ref="constructionSchedulePlanFormRef" :model="form" :rules="rules" label-width="110px">
<el-form-item label="父节点" prop="parentId"> <el-form-item label="父节点" prop="parentId">
<el-tree-select v-model="form.parentId" :data="constructionSchedulePlanOptions" <el-tree-select
:props="{ value: 'id', label: 'nodeName', children: 'children' }" value-key="id" placeholder="请选择父节点" v-model="form.parentId"
check-strictly /> :data="constructionSchedulePlanOptions"
:props="{ value: 'id', label: 'nodeName', children: 'children' }"
value-key="id"
placeholder="请选择父节点"
check-strictly
/>
</el-form-item> </el-form-item>
<el-form-item label="节点名称" prop="nodeName"> <el-form-item label="节点名称" prop="nodeName">
<el-input v-model="form.nodeName" placeholder="请输入节点名称" /> <el-input v-model="form.nodeName" placeholder="请输入节点名称" />
</el-form-item> </el-form-item>
<el-form-item label="对应项目结构" prop="projectStructure"> <el-form-item label="对应项目结构" prop="projectStructure">
<el-tree-select v-model="form.projectStructure" :data="ProjectStructureList" @node-click="handleCheckChange" <el-tree-select
:props="{ value: 'id', label: 'name', children: 'children' }" value-key="id" placeholder="请选择项目结构" v-model="form.projectStructure"
check-strictly /> :data="ProjectStructureList"
@node-click="handleCheckChange"
:props="{ value: 'id', label: 'name', children: 'children' }"
value-key="id"
placeholder="请选择项目结构"
check-strictly
/>
<!-- <el-input v-model="form.projectStructure" placeholder="请输入对应项目结构" /> --> <!-- <el-input v-model="form.projectStructure" placeholder="请输入对应项目结构" /> -->
</el-form-item> </el-form-item>
<el-form-item label="预计开始时间" prop="planStartDate"> <el-form-item label="预计开始时间" prop="planStartDate">
<el-date-picker clearable v-model="form.planStartDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" <el-date-picker clearable v-model="form.planStartDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择预计开始时间" />
placeholder="选择预计开始时间" />
</el-form-item> </el-form-item>
<el-form-item label="预计结束时间" prop="planEndDate"> <el-form-item label="预计结束时间" prop="planEndDate">
<el-date-picker clearable v-model="form.planEndDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" <el-date-picker clearable v-model="form.planEndDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择预计结束时间" />
placeholder="选择预计结束时间" />
</el-form-item> </el-form-item>
<el-form-item label="实际开始时间" prop="practicalStartDate"> <el-form-item label="实际开始时间" prop="practicalStartDate">
<el-date-picker clearable v-model="form.practicalStartDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" <el-date-picker
placeholder="选择实际开始时间" /> clearable
v-model="form.practicalStartDate"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择实际开始时间"
/>
</el-form-item> </el-form-item>
<el-form-item label="实际结束时间" prop="practicalEndDate"> <el-form-item label="实际结束时间" prop="practicalEndDate">
<el-date-picker clearable v-model="form.practicalEndDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" <el-date-picker
placeholder="选择实际结束时间" /> clearable
v-model="form.practicalEndDate"
type="datetime"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择实际结束时间"
/>
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="form.status" placeholder="请选择状态"> <el-select v-model="form.status" placeholder="请选择状态">
<el-option v-for="dict in project_construction_status" :key="dict.value" :label="dict.label" <el-option v-for="dict in project_construction_status" :key="dict.value" :label="dict.label" :value="dict.value" />
:value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
@ -145,7 +168,8 @@ import {
getConstructionSchedulePlan, getConstructionSchedulePlan,
delConstructionSchedulePlan, delConstructionSchedulePlan,
addConstructionSchedulePlan, addConstructionSchedulePlan,
updateConstructionSchedulePlan, getProjectStructure updateConstructionSchedulePlan,
getProjectStructure
} from '@/api/progress/constructionSchedulePlan'; } from '@/api/progress/constructionSchedulePlan';
import { import {
ConstructionSchedulePlanVO, ConstructionSchedulePlanVO,
@ -196,7 +220,6 @@ const initFormData = {
status: undefined, status: undefined,
remark: undefined, remark: undefined,
projectStructureName: undefined projectStructureName: undefined
}; };
const data = reactive<PageData<ConstructionSchedulePlanForm, ConstructionSchedulePlanQuery>>({ const data = reactive<PageData<ConstructionSchedulePlanForm, ConstructionSchedulePlanQuery>>({
@ -243,7 +266,7 @@ const handleCheckChange = (val) => {
/** 查询施工进度计划下拉树结构 */ /** 查询施工进度计划下拉树结构 */
const getTreeselect = async () => { const getTreeselect = async () => {
const res = await listConstructionSchedulePlan(); const res = await listConstructionSchedulePlan({ projectId: currentProject.value?.id });
constructionSchedulePlanOptions.value = []; constructionSchedulePlanOptions.value = [];
const data: ConstructionSchedulePlanOption = { id: 0, nodeName: '顶级节点', children: [] }; const data: ConstructionSchedulePlanOption = { id: 0, nodeName: '顶级节点', children: [] };
data.children = proxy?.handleTree<ConstructionSchedulePlanOption>(res.data, 'id', 'parentId'); data.children = proxy?.handleTree<ConstructionSchedulePlanOption>(res.data, 'id', 'parentId');

View File

@ -345,7 +345,6 @@ const getWorkList = (bool = false) => {
if (res.code === 200) { if (res.code === 200) {
state.tableData = res.rows.map((item: any, i: number) => { state.tableData = res.rows.map((item: any, i: number) => {
item.index = i + 1; item.index = i + 1;
item.aiFill = item.detailList?.reduce((sum: number, child: any) => sum + child.aiFill, 0) || 0;
return item; return item;
}); });
state.total = res.total; state.total = res.total;

View File

@ -34,7 +34,7 @@
:file-type="['xls', 'xlsx']" :file-type="['xls', 'xlsx']"
:on-upload-success="handleSuccess" :on-upload-success="handleSuccess"
> >
<el-button type="primary" plain icon="Compass">导入</el-button> <el-button type="primary" plain icon="upload">导入</el-button>
</file-upload> </file-upload>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@ -140,10 +140,10 @@
<el-input v-model="form.unit" placeholder="请输入计量单位" /> <el-input v-model="form.unit" placeholder="请输入计量单位" />
</el-form-item> </el-form-item>
<el-form-item label="综合单价(业主)" prop="ownerPrice" v-if="form.unitType != '0'"> <el-form-item label="综合单价(业主)" prop="ownerPrice" v-if="form.unitType != '0'">
<el-input v-model="form.ownerPrice" placeholder="请输入综合单价(业主)" /> <el-input v-model="form.ownerPrice" type="number" min="0" placeholder="请输入综合单价(业主)" />
</el-form-item> </el-form-item>
<el-form-item label="综合单价(分包)" prop="constructionPrice" v-if="form.unitType != '0'"> <el-form-item label="综合单价(分包)" prop="constructionPrice" v-if="form.unitType != '0'">
<el-input v-model="form.constructionPrice" placeholder="请输入综合单价(分包)" /> <el-input v-model="form.constructionPrice" type="number" min="0" placeholder="请输入综合单价(分包)" />
</el-form-item> </el-form-item>
<el-form-item label="数量" prop="total" v-if="!form.workType && form.unitType != '0'"> <el-form-item label="数量" prop="total" v-if="!form.workType && form.unitType != '0'">
<el-input v-model="form.total" placeholder="请输入数量" /> <el-input v-model="form.total" placeholder="请输入数量" />
@ -249,6 +249,7 @@ const initFormData: ProgressCategoryForm = {
status: undefined, status: undefined,
remark: undefined remark: undefined
}; };
const labelTitle = ref('测试方阵');
const data = reactive<PageData<ProgressCategoryForm, ProgressCategoryQuery>>({ const data = reactive<PageData<ProgressCategoryForm, ProgressCategoryQuery>>({
form: { ...initFormData }, form: { ...initFormData },
@ -323,7 +324,8 @@ const getList = async () => {
if (data) { if (data) {
progressCategoryList.value = data; progressCategoryList.value = data;
progressCategoryOptions.value = []; progressCategoryOptions.value = [];
const datas: ProgressCategoryOption = { id: 0, name: '顶级节点', children: [...data] }; const datas: ProgressCategoryOption = { id: 0, name: '顶级节点', children: [{ id: id, children: [...data], name: labelTitle.value }] };
// form.value.parentId = id;
progressCategoryOptions.value.push(datas); progressCategoryOptions.value.push(datas);
console.log('🚀 ~ getList ~ progressCategoryOptions.value:', progressCategoryOptions.value); console.log('🚀 ~ getList ~ progressCategoryOptions.value:', progressCategoryOptions.value);
loading.value = false; loading.value = false;
@ -336,6 +338,7 @@ const getList = async () => {
const handleSuccess = () => { const handleSuccess = () => {
console.log(111); console.log(111);
proxy.$modal.msgSuccess('操作成功'); proxy.$modal.msgSuccess('操作成功');
getList();
}; };
/** 查询分项工程单价下拉树结构 */ /** 查询分项工程单价下拉树结构 */
@ -355,6 +358,8 @@ const cancel = () => {
}; };
const handleTabClick = (tab: any) => { const handleTabClick = (tab: any) => {
console.log(tab);
labelTitle.value = tab.props.label;
const id = tab.props.name; // 实际上就是 item.id const id = tab.props.name; // 实际上就是 item.id
const current = tabList.value.find((item) => item.id === id); const current = tabList.value.find((item) => item.id === id);
if (current.matrixStructureList && current.matrixStructureList.length > 0) { if (current.matrixStructureList && current.matrixStructureList.length > 0) {

View File

@ -106,7 +106,7 @@
<el-input v-model="form.name" placeholder="请输入类别名称" /> <el-input v-model="form.name" placeholder="请输入类别名称" />
</el-form-item> </el-form-item>
<el-form-item label="关联数据" prop="workType"> <el-form-item label="关联数据" prop="workType">
<el-select v-model="form.workType" placeholder="请选择关联数据"> <el-select v-model="form.workType" clearable filterable placeholder="请选择关联数据">
<el-option v-for="dict in progress_work_type" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in progress_work_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>

View File

@ -87,11 +87,11 @@
<el-table-column label="迟到(次)" align="center" prop="lateDays" /> <el-table-column label="迟到(次)" align="center" prop="lateDays" />
<el-table-column label="早退(次)" align="center" prop="leaveEarlyDays" /> <el-table-column label="早退(次)" align="center" prop="leaveEarlyDays" />
<el-table-column label="缺卡(次)" align="center" prop="unClockDays" /> <el-table-column label="缺卡(次)" align="center" prop="unClockDays" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" icon="View" @click="handleDetails(scope.row)" v-hasPermi="['project:attendance:edit']">详情</el-button> <el-button link type="primary" icon="View" @click="handleDetails(scope.row)" v-hasPermi="['project:attendance:edit']">详情</el-button>
</template> </template>
</el-table-column> </el-table-column> -->
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
@ -347,10 +347,10 @@ const getList = async () => {
/** 查询近两周考勤列表 */ /** 查询近两周考勤列表 */
const getListTwoWeek = async () => { const getListTwoWeek = async () => {
loading.value = true; loading.value = true;
const res = await listAttendanceTwoWeek(queryParams.value); // const res = await listAttendanceTwoWeek(queryParams.value);
attendanceTwoWeekList.value = res.data; // attendanceTwoWeekList.value = res.data;
echartsOption.value = { ...option(attendanceTwoWeekList.value) }; // echartsOption.value = { ...option(attendanceTwoWeekList.value) };
commandstatsIntance.value.setOption(echartsOption.value); // commandstatsIntance.value.setOption(echartsOption.value);
}; };
/** 取消按钮 */ /** 取消按钮 */

View File

@ -31,16 +31,20 @@
<el-button type="success" plain icon="Plus" @click="downloadTemplate" v-hasPermi="['land:enterRoad:import']">模板下载</el-button> <el-button type="success" plain icon="Plus" @click="downloadTemplate" v-hasPermi="['land:enterRoad:import']">模板下载</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-upload ref="uploadRef" class="upload-demo" :http-request="handleImport" :show-file-list="false"> <el-upload
ref="uploadRef"
v-hasPermi="['land:enterRoad:upload']"
class="upload-demo"
:http-request="handleImport"
:show-file-list="false"
>
<template #trigger> <template #trigger>
<el-button plain type="primary">导入excel</el-button> <el-button plain type="primary" icon="upload">导入excel</el-button>
</template> </template>
</el-upload> </el-upload>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['land:enterRoad:remove']" <el-button type="success" plain icon="Download" @click="exportFile">导出模版</el-button>
>删除</el-button
>
</el-col> </el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
@ -93,7 +97,7 @@
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button> <el-button :loading="buttonLoading" type="primary" v-hasPermi="['land:enterRoad:add']" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</template> </template>
@ -204,7 +208,24 @@ const resetQuery = () => {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
handleQuery(); handleQuery();
}; };
const exportFile = () => {
// 导出模版文件
try {
// 创建a标签
const link = document.createElement('a');
// 设置PDF文件路径 - 相对于public目录
link.href = '/daolu.xlsx';
// 设置下载后的文件名
link.download = '道路信息导入模版.xlsx';
// 触发点击
document.body.appendChild(link);
link.click();
// 清理
document.body.removeChild(link);
} catch (error) {
alert('下载失败,请重试');
}
};
/** 多选框选中数据 */ /** 多选框选中数据 */
const handleSelectionChange = (selection: EnterRoadVO[]) => { const handleSelectionChange = (selection: EnterRoadVO[]) => {
ids.value = selection.map((item) => item.id); ids.value = selection.map((item) => item.id);
@ -270,15 +291,18 @@ const handleImport = (options: any) => {
loading.value = true; loading.value = true;
let formData = new FormData(); let formData = new FormData();
formData.append('file', options.file); formData.append('file', options.file);
importEnterRoad(currentProject.value?.id,formData).then((res) => { importEnterRoad(currentProject.value?.id, formData)
.then((res) => {
if (res.code == 200) { if (res.code == 200) {
proxy.$modal.msgSuccess(res.msg || '导入成功'); proxy.$modal.msgSuccess(res.msg || '导入成功');
getListLand(); getListLand();
getList(); getList();
} }
}).catch((err) => { })
.catch((err) => {
proxy.$modal.msgError(err.msg || '导入失败'); proxy.$modal.msgError(err.msg || '导入失败');
}).finally(() => { })
.finally(() => {
loading.value = false; loading.value = false;
}); });
}; };

View File

@ -42,10 +42,13 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-upload ref="uploadRef" class="upload-demo" :http-request="handleImport" :show-file-list="false"> <el-upload ref="uploadRef" class="upload-demo" :http-request="handleImport" :show-file-list="false">
<template #trigger> <template #trigger>
<el-button plain type="primary">导入excel</el-button> <el-button plain type="primary" icon="upload">导入excel</el-button>
</template> </template>
</el-upload> </el-upload>
</el-col> </el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Download" @click="exportFile">导出模版</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
</template> </template>
@ -99,7 +102,7 @@
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm" v-hasPermi="['land:landBlock:add']"> </el-button>
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</template> </template>
@ -521,7 +524,24 @@ const handleImport = (options: { file: File }) => {
loading.value = false; loading.value = false;
}); });
}; };
const exportFile = () => {
// 导出模版文件
try {
// 创建a标签
const link = document.createElement('a');
// 设置PDF文件路径 - 相对于public目录
link.href = '/dikuai.xlsx';
// 设置下载后的文件名
link.download = '地块信息导入模版.xlsx';
// 触发点击
document.body.appendChild(link);
link.click();
// 清理
document.body.removeChild(link);
} catch (error) {
alert('下载失败,请重试');
}
};
/** 下载导入模板 */ /** 下载导入模板 */
const downloadTemplate = () => { const downloadTemplate = () => {
try { try {

View File

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

View File

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

View File

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

View File

@ -119,7 +119,7 @@
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-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> <el-button @click="cancel"> </el-button>
</div> </div>
</template> </template>

View File

@ -6,7 +6,7 @@
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="标文件" prop="name"> <el-form-item label="标文件" prop="name">
<file-upload <file-upload
v-model="form.costEstimationFile" v-model="form.costEstimationFile"
:fileSize="100" :fileSize="100"

View File

@ -665,7 +665,7 @@ const handleDetail = (row: any) => {
getDetails(row); getDetails(row);
}; };
const getDetails = (row: any) => { const getDetails = (row: any) => {
getTenderPlanDetail({ id: row.id }).then((res) => { getTenderPlanDetail({ id: row.id, projectId: currentProject.value?.id }).then((res) => {
if (res.code == 200) { if (res.code == 200) {
detailData.value = res.data; detailData.value = res.data;
} }

View File

@ -16,7 +16,7 @@
<!-- 表单区域 --> <!-- 表单区域 -->
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden"> <el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100"> <div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
<h3 class="text-lg font-semibold text-gray-800">专项方案信息</h3> <h3 class="text-lg font-semibold text-gray-800">供应商入库</h3>
</div> </div>
<div class="p-6"> <div class="p-6">
<el-form ref="leaveFormRef" v-loading="loading" disabled :model="form" :rules="rules" label-width="150px" class="space-y-4"> <el-form ref="leaveFormRef" v-loading="loading" disabled :model="form" :rules="rules" label-width="150px" class="space-y-4">
@ -333,6 +333,17 @@ const getInfo = () => {
nextTick(async () => { nextTick(async () => {
const res = await getSupplierInput(routeParams.value.id); const res = await getSupplierInput(routeParams.value.id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
form.value.registeredNumber = form.value.registeredNumber?.split(',');
form.value.build1 = form.value.registeredNumber[0] || '';
form.value.build2 = form.value.registeredNumber[1] || '';
form.value.build3 = form.value.registeredNumber[2] || '';
form.value.build4 = form.value.registeredNumber[3] || '';
form.value.personnelNumber = form.value.personnelNumber?.split(',');
form.value.personnelNumber1 = form.value.personnelNumber[0] || '';
form.value.personnelNumber2 = form.value.personnelNumber[1] || '';
form.value.personnelNumber3 = form.value.personnelNumber[2] || '';
form.value.personnelNumber4 = form.value.personnelNumber[3] || '';
loading.value = false; loading.value = false;
buttonLoading.value = false; buttonLoading.value = false;
}); });
@ -437,7 +448,9 @@ onMounted(() => {
.el-input__inner, .el-input__inner,
.el-select .el-input__inner { .el-select .el-input__inner {
border-radius: 4px; border-radius: 4px;
transition: border-color 0.2s, box-shadow 0.2s; transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus { &:focus {
border-color: var(--primary-light); border-color: var(--primary-light);
@ -447,7 +460,9 @@ onMounted(() => {
.el-textarea__inner { .el-textarea__inner {
border-radius: 4px; border-radius: 4px;
transition: border-color 0.2s, box-shadow 0.2s; transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus { &:focus {
border-color: var(--primary-light); border-color: var(--primary-light);

File diff suppressed because one or more lines are too long