合并
@ -6,13 +6,15 @@ VITE_APP_ENV = 'development'
|
||||
|
||||
# 开发环境
|
||||
# 李陈杰 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.213: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.149:8899'
|
||||
#曾涛
|
||||
# VITE_APP_BASE_API = 'http://192.168.110.171:8899'
|
||||
|
||||
# 无人机接口地址
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
"await-to-js": "3.0.0",
|
||||
"axios": "1.7.8",
|
||||
"crypto-js": "4.2.0",
|
||||
"date-fns": "^4.1.0",
|
||||
"diagram-js": "12.3.0",
|
||||
"didi": "9.0.2",
|
||||
"echarts": "5.5.0",
|
||||
|
BIN
public/assets/demo/Sunny.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
public/assets/demo/avatar.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
public/assets/demo/back.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
public/assets/demo/back2.png
Normal file
After Width: | Height: | Size: 419 KiB |
BIN
public/assets/demo/back3.png
Normal file
After Width: | Height: | Size: 344 KiB |
BIN
public/assets/demo/back4.png
Normal file
After Width: | Height: | Size: 428 KiB |
BIN
public/assets/demo/fengshu.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/demo/qiangdu.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
public/assets/demo/rain.png
Normal file
After Width: | Height: | Size: 1014 B |
BIN
public/assets/demo/rain1.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
public/assets/demo/rain_show.png
Normal file
After Width: | Height: | Size: 993 B |
BIN
public/assets/demo/riluo.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
public/assets/demo/sb1.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
public/assets/demo/sb2.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
public/assets/demo/sb3.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
public/assets/demo/sb4.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
public/assets/demo/sbi1.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
public/assets/demo/sbi2.png
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
public/assets/demo/shidu.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
public/assets/demo/sunny_s.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
public/assets/demo/wcl.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
public/assets/demo/ycl.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
public/assets/demo/yin.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
public/assets/demo/zgjxx.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
public/assets/demo/zzcl.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
public/billOfQuantities.xlsx
Normal file
BIN
public/daolu.xlsx
Normal file
BIN
public/dikuai.xlsx
Normal file
BIN
public/materialsEquipment.xlsx
Normal file
@ -8,14 +8,12 @@
|
||||
import useSettingsStore from '@/store/modules/settings';
|
||||
import { handleThemeStyle } from '@/utils/theme';
|
||||
import useAppStore from '@/store/modules/app';
|
||||
import { getProjectTeam } from './utils/projectTeam';
|
||||
const appStore = useAppStore();
|
||||
|
||||
onMounted(() => {
|
||||
nextTick(() => {
|
||||
// 初始化主题样式
|
||||
handleThemeStyle(useSettingsStore().theme);
|
||||
getProjectTeam();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
@ -21,7 +21,7 @@ export const AddbiddingUser = (data) => {
|
||||
data
|
||||
});
|
||||
};
|
||||
// 新增招投标人员
|
||||
// 查询招投标人员
|
||||
export const biddingUserList = (projectId) => {
|
||||
return request({
|
||||
url: '/bidding/biddingUser/list',
|
||||
|
@ -116,6 +116,17 @@ export const getileDetail = (id) => {
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
/**
|
||||
* 获取专业列表
|
||||
* @param query
|
||||
*/
|
||||
export const majorList = (params) => {
|
||||
return request({
|
||||
url: '/design/volumeCatalog/majorList',
|
||||
method: 'get',
|
||||
params: params
|
||||
});
|
||||
};
|
||||
/**
|
||||
* 获取二维码信息
|
||||
* @param query
|
||||
|
@ -21,7 +21,7 @@ export const totalsupplyplan = (params: any): AxiosPromise => {
|
||||
export const totalSupplyplanDetails = (id: any): AxiosPromise => {
|
||||
return request({
|
||||
url: '/design/totalsupplyplan/' + id,
|
||||
method: 'get',
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
// 修改物资-总供应计划
|
||||
@ -33,4 +33,11 @@ export const materialChangeSupplyplan = (data: any): AxiosPromise => {
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// 总供应计划-批量编辑
|
||||
export const totalSupplyplanBatchEdit = (data: any): AxiosPromise => {
|
||||
return request({
|
||||
url: '/design/totalsupplyplan/batchEdit',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
};
|
||||
|
@ -96,8 +96,6 @@ export const addProjectFacilities = (data: any) => {
|
||||
* @param data
|
||||
*/
|
||||
export const addProjectPilePoint = (data: any) => {
|
||||
console.log('🚀 ~ addProjectPilePoint ~ data:', data);
|
||||
|
||||
return request({
|
||||
url: '/facility/photovoltaicPanelPoint/parts/geoJson',
|
||||
method: 'post',
|
||||
|
@ -12,9 +12,9 @@ export function listPost(query: { pageNum: number; pageSize: number }): AxiosPro
|
||||
}
|
||||
|
||||
// 查询岗位列表
|
||||
export function listTreeByProject(projectId: string): AxiosPromise<PostVO[]> {
|
||||
export function listTreeByProject(): AxiosPromise<PostVO[]> {
|
||||
return request({
|
||||
url: '/system/dept/list/treeByProjectId/' + projectId,
|
||||
url: '/system/dept/list/tree',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
BIN
src/assets/demo/avatar.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
src/assets/demo/back.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
src/assets/demo/gaojing.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/demo/rain.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
src/assets/demo/wcl.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/demo/yichuli.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/demo/zzcl.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
@ -546,7 +546,7 @@ const handleTerminationTask = async () => {
|
||||
if (isDrawing.value) {
|
||||
isShowTermination.value = true;
|
||||
nextTick(() => {
|
||||
detailFormTeRef.value.getInfo(props.businessId);
|
||||
detailFormTeRef.value.getInfo(props.businessId1);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
@ -134,6 +134,7 @@ export const useUserStore = defineStore('user', () => {
|
||||
roles.value = projectRole;
|
||||
const projectPermissions = permissionList.value.find((item) => item.projectId == selectedProject.value?.id)?.projectPermissions || [];
|
||||
permissions.value = projectPermissions;
|
||||
getProjectTeam();
|
||||
};
|
||||
|
||||
// 注销
|
||||
|
@ -2,7 +2,13 @@ import $cache from '@/plugins/cache';
|
||||
//获取班组列表
|
||||
import { listProjectTeam } from '@/api/project/projectTeam';
|
||||
import { ProjectTeamVO } from '@/api/project/projectTeam/types';
|
||||
import useUserStore from '@/store/modules/user';
|
||||
export const getProjectTeam = async () => {
|
||||
const isPermission = useUserStore().permissions.some((item) => item == 'project:team:list');
|
||||
console.log(useUserStore().permissions);
|
||||
|
||||
if (!isPermission && useUserStore().permissions[0] != '*:*:*') return;
|
||||
|
||||
const { id } = $cache.local.getJSON('selectedProject');
|
||||
const res = await listProjectTeam({
|
||||
pageNum: 1,
|
||||
|
@ -14,7 +14,6 @@ import Header from './components/header.vue';
|
||||
import leftPage from './components/leftPage.vue';
|
||||
import centerPage from './components/centerPage.vue';
|
||||
import rightPage from './components/rightPage.vue';
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
@ -21,11 +21,11 @@
|
||||
<div class="fonts w60% ma">
|
||||
<el-form-item label="招投标专员" prop="userId" class="mb-4">
|
||||
<el-select
|
||||
v-model="form.userId"
|
||||
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"
|
||||
>
|
||||
<el-option v-for="item in userList" :key="item.userId" :label="item.userName" :value="item.userId" />
|
||||
<el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</div>
|
||||
|
@ -165,7 +165,8 @@ const getTableData = async () => {
|
||||
loading.value = true;
|
||||
const params = {
|
||||
projectId: currentProject.value?.id,
|
||||
sheet: queryForm.value.sheet
|
||||
sheet: queryForm.value.sheet,
|
||||
versions: queryForm.value.versions
|
||||
};
|
||||
const res = await getTreeLimit(params);
|
||||
loading.value = false;
|
||||
|
@ -96,10 +96,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="toggleExpandAll(true)">一键展开</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="toggleExpandAll(false)">一键收起</el-button>
|
||||
<el-button type="primary" @click="toggleExpandAll">{{ isExpandAll ? '一键收起' : '一键展开' }}</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
@ -168,7 +165,7 @@
|
||||
</el-row>
|
||||
<template #footer>
|
||||
<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>
|
||||
</el-dialog>
|
||||
<el-dialog title="详情" v-model="detailDialog" width="75%" draggable>
|
||||
@ -231,7 +228,7 @@ const rules = ref({
|
||||
content: [{ required: true, message: '请输入内容', trigger: 'blur' }]
|
||||
});
|
||||
const loading = ref(false);
|
||||
|
||||
const loadingBtn = ref();
|
||||
//字典获取数据
|
||||
const getTabsList = async () => {
|
||||
const res = await getDicts('subcontracting_type');
|
||||
@ -413,11 +410,12 @@ const changeSheet = () => {
|
||||
getTreeList();
|
||||
};
|
||||
|
||||
const toggleExpandAll = (isExpand: boolean) => {
|
||||
const toggleExpandAll = () => {
|
||||
isExpandAll.value = !isExpandAll.value;
|
||||
console.log(isExpandAll.value);
|
||||
treeData.value.forEach((row) => {
|
||||
treeTableRef.value.toggleRowExpansion(row, isExpand);
|
||||
treeTableRef.value.toggleRowExpansion(row, isExpandAll.value);
|
||||
});
|
||||
isExpandAll.value = isExpand;
|
||||
};
|
||||
//打开获取表数据
|
||||
const getTreeList = async () => {
|
||||
@ -459,6 +457,7 @@ const submitForm = async (formEl: FormInstance | undefined) => {
|
||||
});
|
||||
return;
|
||||
}
|
||||
loadingBtn.value = true;
|
||||
const newSelectionData = selectionData.value.filter((item) => item.quantity != '' && item.quantity != null);
|
||||
if (newSelectionData.some((item) => item.selectNum == '' || item.selectNum == null)) {
|
||||
ElMessage.error('存在未填写数量的工程或费用名称,请检查');
|
||||
@ -490,6 +489,8 @@ const submitForm = async (formEl: FormInstance | undefined) => {
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
} finally {
|
||||
loadingBtn.value = false;
|
||||
}
|
||||
} else {
|
||||
console.log('error submit!', fields);
|
||||
@ -546,7 +547,7 @@ const handleDetail = (row: any) => {
|
||||
getDetails(row);
|
||||
};
|
||||
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) {
|
||||
detailData.value = res.data;
|
||||
}
|
||||
|
@ -14,11 +14,9 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="toggleExpandAll(true)">一键展开</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="toggleExpandAll(false)">一键收起</el-button>
|
||||
<el-button type="primary" @click="toggleExpandAll">{{ isExpandAll ? '一键收起' : '一键展开' }}</el-button>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-upload
|
||||
ref="uploadRef"
|
||||
@ -37,7 +35,13 @@
|
||||
</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-button
|
||||
@ -274,11 +278,12 @@ const handleSave = (row?: any, type?: any) => {
|
||||
};
|
||||
const tableRef = ref<any>();
|
||||
|
||||
const toggleExpandAll = (isExpand: boolean) => {
|
||||
const toggleExpandAll = () => {
|
||||
isExpandAll.value = !isExpandAll.value;
|
||||
console.log(isExpandAll.value);
|
||||
tableData.value.forEach((row) => {
|
||||
tableRef.value.toggleRowExpansion(row, isExpand);
|
||||
tableRef.value.toggleRowExpansion(row, isExpandAll.value);
|
||||
});
|
||||
isExpandAll.value = isExpand;
|
||||
};
|
||||
//导入
|
||||
const importExcel = (options: any): any => {
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="content-box">
|
||||
<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="serialNumber" label="编号" />
|
||||
<el-table-column align="center" prop="to" label="致" />
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="content-box">
|
||||
<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="submitUnit" label="提出单位" />
|
||||
<el-table-column align="center" prop="specialty" label="专业">
|
||||
@ -30,7 +30,7 @@
|
||||
</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="danger" icon="Delete" @click="handleDelete(scope.row)"> 删除 </el-button>
|
||||
<!-- <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)"> 删除 </el-button> -->
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
@ -36,12 +36,42 @@
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="工程名称">
|
||||
<el-input v-model="form.projectName" />
|
||||
<el-input disabled v-model="form.projectName" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<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-col>
|
||||
</el-row>
|
||||
@ -50,7 +80,7 @@
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<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-select>
|
||||
</el-form-item>
|
||||
@ -62,27 +92,11 @@
|
||||
</el-col>
|
||||
</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="附图">
|
||||
<file-Upload v-model="form.attachmentsImg" :file-type="['pdf', 'png', 'jpg', 'jpeg', 'gif', 'bmp']">
|
||||
<el-button type="primary">上传附件</el-button>
|
||||
</file-Upload>
|
||||
</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-checkbox-group v-model="form.changeReasons">
|
||||
@ -103,7 +117,7 @@
|
||||
<file-upload v-model="form.attachments" :limit="1" :file-type="['pdf']"></file-upload>
|
||||
</el-form-item>
|
||||
<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-divider class="mb-10! mt-10!">施工项目部</el-divider>
|
||||
<el-form-item label="项目负责人" prop="contractorLeader">
|
||||
@ -177,6 +191,7 @@ import { useUserStoreHook } from '@/store/modules/user';
|
||||
import { listByIds } from '@/api/system/oss';
|
||||
import { addContactnotice, getContactnotice, updateContactnotice } from '@/api/cory/contactnotice';
|
||||
const { des_user_major } = toRefs(proxy?.useDict('des_user_major'));
|
||||
import { catalogList } from '@/api/design/designChange';
|
||||
|
||||
// 获取用户 store
|
||||
const userStore = useUserStoreHook();
|
||||
@ -221,11 +236,11 @@ const initFormData = {
|
||||
id: undefined,
|
||||
projectId: currentProject.value?.id,
|
||||
projectType: '',
|
||||
projectName: '',
|
||||
projectName: currentProject.value?.name,
|
||||
serialNumber: '',
|
||||
to: '',
|
||||
subject: '',
|
||||
costEstimation: '',
|
||||
costEstimation: 0,
|
||||
content: '',
|
||||
attachments: '',
|
||||
contractorLeader: '',
|
||||
@ -275,13 +290,27 @@ const handleClose = () => {
|
||||
buttonLoading.value = false;
|
||||
};
|
||||
const { form, rules } = toRefs(data);
|
||||
|
||||
const volumeCatalogList = ref([]);
|
||||
let volumeMap = new Map();
|
||||
/** 表单重置 */
|
||||
const reset = () => {
|
||||
form.value = { ...initFormData };
|
||||
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 = () => {
|
||||
loading.value = true;
|
||||
@ -345,7 +374,8 @@ const handleStartWorkFlow = async (data: LeaveForm) => {
|
||||
//流程变量
|
||||
taskVariables.value = {
|
||||
// leave4/5 使用的流程变量
|
||||
userList: ['1', '3', '4']
|
||||
userList: ['1', '3', '4'],
|
||||
costEstimation: form.value.costEstimation
|
||||
};
|
||||
submitFormData.value.variables = taskVariables.value;
|
||||
const resp = await startWorkFlow(submitFormData.value);
|
||||
@ -402,6 +432,7 @@ onMounted(() => {
|
||||
routeParams.value = proxy.$route.query;
|
||||
thumbnailUrl.value = proxy.$route.query.thumbnailUrl;
|
||||
reset();
|
||||
getJuance();
|
||||
loading.value = false;
|
||||
if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
|
||||
getInfo();
|
||||
|
@ -5,7 +5,7 @@
|
||||
<el-table-column label="序号" type="index" width="60" align="center" />
|
||||
<el-table-column label="处理状态" align="center" prop="status">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="safety_inspection_type" :value="scope.row.status" />
|
||||
<dict-tag :options="wf_business_status" :value="scope.row.status" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<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">
|
||||
<template #default="scope">
|
||||
<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 link type="success" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['safety:safetyInspection:edit']">修改 </el-button> -->
|
||||
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['safety:safetyInspection:remove']">
|
||||
<el-button link type="primary" icon="View" @click="handleAddApp(scope.row)" v-if="scope.row.status && scope.row.status != 'draft'"
|
||||
>查看流程
|
||||
</el-button>
|
||||
<!-- <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['safety:safetyInspection:remove']">
|
||||
删除
|
||||
</el-button>
|
||||
</el-button> -->
|
||||
</el-space>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -191,9 +194,10 @@ const userStore = useUserStoreHook();
|
||||
// 从 store 中获取项目列表和当前选中的项目
|
||||
const currentProject = computed(() => userStore.selectedProject);
|
||||
|
||||
const { safety_inspection_violation_type, safety_inspection_check_type, review_type, safety_inspection_type } = toRefs<any>(
|
||||
useDict('safety_inspection_violation_type', 'safety_inspection_check_type', 'review_type', 'safety_inspection_type')
|
||||
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')
|
||||
);
|
||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||
const safetyInspectionDetail = ref<SafetyInspectionVO>();
|
||||
|
||||
const form = reactive({
|
||||
@ -236,6 +240,18 @@ const handleDetail = async (row) => {
|
||||
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 handleDelete = (row) => {};
|
||||
</script>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<template #header>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" :disabled="addSingle" @click="handleAdd" v-hasPermi="['quality:qualityInspection:add']"
|
||||
<el-button type="primary" plain icon="Plus" :disabled="addSingle" @click="handleAdd" v-hasPermi="['cory:contactnotice:add']"
|
||||
>新增</el-button
|
||||
>
|
||||
</el-col>
|
||||
@ -31,13 +31,7 @@
|
||||
>
|
||||
</el-col> -->
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="Delete"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete()"
|
||||
v-hasPermi="['quality:qualityInspection:remove']"
|
||||
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['cory:contactnotice:remove']"
|
||||
>删除</el-button
|
||||
>
|
||||
</el-col>
|
||||
@ -306,6 +300,7 @@ const selectType = (value: string) => {
|
||||
const resetForm = () => {
|
||||
formRef.value?.resetFields();
|
||||
};
|
||||
|
||||
//监听项目id刷新数据
|
||||
const listeningProject = watch(
|
||||
() => currentProject.value?.id,
|
||||
|
482
src/views/cory/workMessage/indexEdit.vue
Normal 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>
|
@ -11,13 +11,11 @@
|
||||
<el-button type="success" size="large" @click="checkContractType('income')">收入合同</el-button>
|
||||
<el-button type="primary" size="large" @click="checkContractType('expenses')">支出合同</el-button>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<template v-else-if="active == 1">
|
||||
<h1>{{ contract_type == "income" ? "收入合同" : "支出合同" }}</h1>
|
||||
<h1>{{ contract_type == 'income' ? '收入合同' : '支出合同' }}</h1>
|
||||
<template v-if="contract_type == 'income'">
|
||||
<el-form ref="incomeContractFormRef" :model="form" :rules="incomeContractFormRules"
|
||||
label-width="80px">
|
||||
<el-form ref="incomeContractFormRef" :model="form" :rules="incomeContractFormRules" label-width="80px">
|
||||
<!-- <el-form-item label="项目名称">
|
||||
<el-input :model-value="project.name" disabled />
|
||||
</el-form-item> -->
|
||||
@ -26,8 +24,7 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="合同类型" prop="contractType">
|
||||
<el-select v-model="form.contractType" placeholder="请选择合同类型">
|
||||
<el-option v-for="item in income_contract_type" :key="item.value" :label="item.label"
|
||||
:value="item.value" />
|
||||
<el-option v-for="item in income_contract_type" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="业主单位" prop="contractOwner">
|
||||
@ -36,25 +33,26 @@
|
||||
<el-form-item label="承包内容" v-if="contract_type !== 'income'">
|
||||
<editor v-model="form.contractedContent" :min-height="192" />
|
||||
</el-form-item>
|
||||
<el-form-item label="合同内容" v-else">
|
||||
<el-form-item label="合同内容" v-else>
|
||||
<editor v-model="form.contractedContent" :min-height="192" />
|
||||
</el-form-item>
|
||||
<el-form-item label="合同金额" prop="amount">
|
||||
<el-input v-model="form.amount" placeholder="请输入合同金额"
|
||||
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" />
|
||||
<el-input
|
||||
v-model="form.amount"
|
||||
placeholder="请输入合同金额"
|
||||
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" placeholder="请输入备注" />
|
||||
</el-form-item>
|
||||
<el-form-item label="附件">
|
||||
<FileUpload :multiple="true" :fileType="['pdf']" :onUploadSuccess="onUploadSuccess"
|
||||
:ref="fileRef" :defaultFileList="tempFileList" />
|
||||
<FileUpload :multiple="true" :fileType="['pdf']" :onUploadSuccess="onUploadSuccess" :ref="fileRef" :defaultFileList="tempFileList" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</template>
|
||||
<template v-else-if="contract_type == 'expenses'">
|
||||
<el-form ref="expensesContractFormRef" :model="form" :rules="expensesContractFormRules"
|
||||
label-width="80px">
|
||||
<el-form ref="expensesContractFormRef" :model="form" :rules="expensesContractFormRules" label-width="80px">
|
||||
<!-- <el-form-item label="项目名称">
|
||||
<el-input :model-value="projectName" placeholder="请输入项目ID" disabled />
|
||||
</el-form-item> -->
|
||||
@ -63,35 +61,35 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="合同类型" prop="contractType">
|
||||
<el-select v-model="form.contractType" placeholder="请选择合同类型">
|
||||
<el-option v-for="item in expenses_contract_type" :key="item.value" :label="item.label"
|
||||
:value="item.value" />
|
||||
<el-option v-for="item in expenses_contract_type" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="招标计划" prop="tenderId">
|
||||
<!-- <el-input v-model="form.tenderId" placeholder="请输入招标Id" /> -->
|
||||
<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 label="供应商" prop="contractSupplier">
|
||||
<el-input v-model="form.contractSupplier" placeholder="请输入供应商" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item label="分包内容">
|
||||
<!-- <editor v-model="form.contractedContent" :min-height="192" disabled /> -->
|
||||
<el-input v-model="form.contractedContent" style="width: 300px"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }" type="textarea" disabled />
|
||||
<el-input v-model="form.contractedContent" style="width: 300px" :autosize="{ minRows: 2, maxRows: 4 }" type="textarea" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item label="合同金额" prop="amount">
|
||||
<el-input
|
||||
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')"
|
||||
v-model="form.amount" placeholder="请输入合同金额" disabled />
|
||||
v-model="form.amount"
|
||||
placeholder="请输入合同金额"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" placeholder="请输入备注" />
|
||||
</el-form-item>
|
||||
<el-form-item label="合同附件">
|
||||
<FileUpload :multiple="true" :fileType="['pdf']" :onUploadSuccess="onUploadSuccess"
|
||||
:ref="fileRef" :defaultFileList="tempFileList" />
|
||||
<FileUpload :multiple="true" :fileType="['pdf']" :onUploadSuccess="onUploadSuccess" :ref="fileRef" :defaultFileList="tempFileList" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</template>
|
||||
@ -101,7 +99,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<template v-else-if="active == 2">
|
||||
<h1>{{ contract_type == "income" ? "收入合同" : "支出合同" }}</h1>
|
||||
<h1>{{ contract_type == 'income' ? '收入合同' : '支出合同' }}</h1>
|
||||
<el-form :model="form" :rules="payMentRules" label-width="150" ref="payMentRef">
|
||||
<el-form-item label="支付方式" placeholder="请选择支付方式" prop="payType">
|
||||
<el-select v-model="form.payType">
|
||||
@ -145,9 +143,7 @@
|
||||
</el-table>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button type="primary" @click="dialogVisible = false">
|
||||
关闭
|
||||
</el-button>
|
||||
<el-button type="primary" @click="dialogVisible = false"> 关闭 </el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
@ -160,18 +156,16 @@ import { addIncomeContract, getInfoByProjectId } from '@/api/ctr/incomeContrac
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
|
||||
const active = ref(0);
|
||||
const contract_type = ref("")
|
||||
const form = ref({ payType: 1 })
|
||||
const fileList = ref([])
|
||||
const tempFileList = ref([])
|
||||
const contract_type = ref('');
|
||||
const form = ref({ payType: 1 });
|
||||
const fileList = ref([]);
|
||||
const tempFileList = ref([]);
|
||||
const { proxy } = getCurrentInstance();
|
||||
const userStore = useUserStore();
|
||||
const planList = ref([]);
|
||||
const dialogVisible = ref(false);
|
||||
|
||||
const { expenses_contract_type, income_contract_type } = toRefs(
|
||||
proxy?.useDict('income_contract_type', 'expenses_contract_type')
|
||||
);
|
||||
const { expenses_contract_type, income_contract_type } = toRefs(proxy?.useDict('income_contract_type', 'expenses_contract_type'));
|
||||
const fileRef = ref(null);
|
||||
const incomeContractFormRef = ref(null);
|
||||
const expensesContractFormRef = ref(null);
|
||||
@ -181,7 +175,7 @@ const incomeContractFormRules = {
|
||||
contractType: [{ required: true, message: '请选择合同类型', trigger: 'change' }],
|
||||
contractOwner: [{ required: true, message: '请输入业主单位', trigger: 'blur' }],
|
||||
amount: [{ required: true, message: '请输入合同金额', trigger: 'blur' }],
|
||||
remark: [{ required: false, message: '请输入备注', trigger: 'blur' }],
|
||||
remark: [{ required: false, message: '请输入备注', trigger: 'blur' }]
|
||||
};
|
||||
const expensesContractFormRules = {
|
||||
contractCode: [{ required: true, message: '请输入合同编号', trigger: 'blur' }],
|
||||
@ -191,20 +185,19 @@ const expensesContractFormRules = {
|
||||
amount: [{ required: true, message: '请输入合同金额', trigger: 'blur' }],
|
||||
tenderId: [{ required: true, message: '请选择招标计划', trigger: 'blur' }],
|
||||
|
||||
remark: [{ required: false, message: '请输入备注', trigger: 'blur' }],
|
||||
remark: [{ required: false, message: '请输入备注', trigger: 'blur' }]
|
||||
};
|
||||
const payMentRules = {
|
||||
payType: [{ required: true, message: '请选择支付方式', trigger: 'change' }],
|
||||
advancePayRatio: [{ required: true, message: '请输入预付款比例', trigger: 'blur' }],
|
||||
balancePayRatio: [{ required: true, message: '请输入尾款比例', trigger: 'blur' }],
|
||||
assuranceDepositRatio: [{ required: true, message: '请输入质保金比例', trigger: 'blur' }],
|
||||
|
||||
assuranceDepositRatio: [{ required: true, message: '请输入质保金比例', trigger: 'blur' }]
|
||||
};
|
||||
|
||||
const project = computed(() => {
|
||||
console.log(111);
|
||||
|
||||
return JSON.parse(localStorage.getItem("selectedProject"))
|
||||
return JSON.parse(localStorage.getItem('selectedProject'));
|
||||
});
|
||||
|
||||
const payRatioComputed = computed({
|
||||
@ -224,8 +217,8 @@ const checkContractType = (type) => {
|
||||
form.value.step = active.value;
|
||||
};
|
||||
const onUploadSuccess = (data) => {
|
||||
fileList.value = data
|
||||
}
|
||||
fileList.value = data;
|
||||
};
|
||||
const back = async (reset) => {
|
||||
console.log(active.value);
|
||||
|
||||
@ -233,11 +226,13 @@ const back = async (reset) => {
|
||||
await ElMessageBox.confirm('返回上一步将清空目前填写的内容,确定返回?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
}).then(() => {
|
||||
type: 'warning'
|
||||
})
|
||||
.then(() => {
|
||||
resetForm();
|
||||
active.value--;
|
||||
}).catch(() => {
|
||||
})
|
||||
.catch(() => {
|
||||
return;
|
||||
});
|
||||
} else {
|
||||
@ -246,7 +241,6 @@ const back = async (reset) => {
|
||||
console.log(active.value);
|
||||
|
||||
form.value.step = active.value;
|
||||
|
||||
};
|
||||
const next = async () => {
|
||||
if (contract_type.value === 'income') {
|
||||
@ -288,16 +282,14 @@ const resetForm = () => {
|
||||
tempFileList.value = [];
|
||||
contract_type.value = '';
|
||||
setTimeout(() => {
|
||||
localStorage.removeItem("tempContractForm");
|
||||
localStorage.removeItem('tempContractForm');
|
||||
}, 0);
|
||||
};
|
||||
|
||||
const submitForm = async () => {
|
||||
await payMentRef.value.validate(async (valid) => {
|
||||
if (valid) {
|
||||
|
||||
if (payRatioComputed.value < 0) {
|
||||
|
||||
ElMessage.error('四项付款比例之和必须等于100%');
|
||||
return;
|
||||
}
|
||||
@ -311,9 +303,9 @@ const submitForm = async () => {
|
||||
return {
|
||||
...data,
|
||||
fileName: data.name,
|
||||
fileUrl: data.url,
|
||||
}
|
||||
})
|
||||
fileUrl: data.url
|
||||
};
|
||||
});
|
||||
if (contract_type.value === 'income') {
|
||||
await addIncomeContract({ ...form.value });
|
||||
} else if (contract_type.value === 'expenses') {
|
||||
@ -321,7 +313,7 @@ const submitForm = async () => {
|
||||
}
|
||||
resetForm();
|
||||
ElMessage.success('合同提交成功');
|
||||
// active.value = 0; // 重置步骤
|
||||
active.value = 0; // 重置步骤
|
||||
if (contract_type.value === 'income') {
|
||||
proxy.$router.push('/ctr/incomeContract');
|
||||
} else {
|
||||
@ -358,7 +350,7 @@ const submitForm = async () => {
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
}
|
||||
};
|
||||
const handleChoose = async () => {
|
||||
if (!form.value.contractType) {
|
||||
ElMessage.error('请先选择合同类型');
|
||||
@ -367,17 +359,16 @@ const handleChoose = async () => {
|
||||
const formData = {
|
||||
projectId: userStore.selectedProject.id,
|
||||
dictName: form.value.contractType,
|
||||
status: 1,
|
||||
}
|
||||
const { data } = await getTenderPlan(formData)
|
||||
status: 1
|
||||
};
|
||||
const { data } = await getTenderPlan(formData);
|
||||
if (data.length === 0) {
|
||||
ElMessage.warning('当前没有招标计划,请先创建招标计划');
|
||||
return;
|
||||
}
|
||||
planList.value = data
|
||||
planList.value = data;
|
||||
dialogVisible.value = true;
|
||||
|
||||
}
|
||||
};
|
||||
const handleChooseData = (row) => {
|
||||
form.value.tenderId = row.id;
|
||||
form.value.name = row.name;
|
||||
@ -387,28 +378,37 @@ const handleChooseData = (row) => {
|
||||
form.value.amount = row.contractPrice;
|
||||
dialogVisible.value = false;
|
||||
};
|
||||
watch(form, (val) => {
|
||||
localStorage.setItem("tempContractForm", JSON.stringify({ ...val, fileList: fileList.value }));
|
||||
}, { deep: true });
|
||||
watch(fileList, (val) => {
|
||||
localStorage.setItem("tempContractForm", JSON.stringify({ ...form.value, fileList: val }));
|
||||
}, { deep: true });
|
||||
watch(
|
||||
form,
|
||||
(val) => {
|
||||
localStorage.setItem('tempContractForm', JSON.stringify({ ...val, fileList: fileList.value }));
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
watch(
|
||||
fileList,
|
||||
(val) => {
|
||||
localStorage.setItem('tempContractForm', JSON.stringify({ ...form.value, fileList: val }));
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
// 获取投标列表
|
||||
const getInfoByProjectIdList = async () => {
|
||||
const res = await getInfoByProjectId({ projectId: userStore.selectedProject.id, });
|
||||
const res = await getInfoByProjectId({ projectId: userStore.selectedProject.id });
|
||||
console.log(res);
|
||||
form.value.contractOwner = res.data.planDuration;
|
||||
}
|
||||
};
|
||||
onMounted(() => {
|
||||
getInfoByProjectIdList();
|
||||
|
||||
const tempForm = localStorage.getItem("tempContractForm");
|
||||
const tempForm = localStorage.getItem('tempContractForm');
|
||||
if (tempForm) {
|
||||
ElMessageBox.confirm('检测到有未完成的合同录入,是否继续?', '提示', {
|
||||
confirmButtonText: '继续',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
}).then(() => {
|
||||
type: 'warning'
|
||||
})
|
||||
.then(() => {
|
||||
const t = JSON.parse(tempForm);
|
||||
const { fileList: files, ...rest } = JSON.parse(tempForm);
|
||||
form.value = rest;
|
||||
@ -416,11 +416,10 @@ onMounted(() => {
|
||||
tempFileList.value = files || [];
|
||||
contract_type.value = form.value.contract_type;
|
||||
active.value = form.value.step || 0;
|
||||
|
||||
}).catch(() => {
|
||||
localStorage.removeItem("tempContractForm");
|
||||
})
|
||||
.catch(() => {
|
||||
localStorage.removeItem('tempContractForm');
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@ -14,7 +14,8 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="合同类型" prop="contractType">
|
||||
<el-select v-model="form.contractType" placeholder="请选择合同类型">
|
||||
<el-option v-for="item in income_contract_type" :key="item.value" :label="item.label" :value="item.value" />
|
||||
<el-option v-for="item in income_contract_type" :key="item.value" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="业主单位" prop="contractOwner">
|
||||
@ -27,17 +28,15 @@
|
||||
<editor v-model="form.contractedContent" :min-height="192" />
|
||||
</el-form-item>
|
||||
<el-form-item label="合同金额" prop="amount">
|
||||
<el-input
|
||||
v-model="form.amount"
|
||||
placeholder="请输入合同金额"
|
||||
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')"
|
||||
/>
|
||||
<el-input v-model="form.amount" placeholder="请输入合同金额"
|
||||
oninput="value=value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" placeholder="请输入备注" />
|
||||
</el-form-item>
|
||||
<el-form-item label="附件">
|
||||
<FileUpload :multiple="true" :fileType="['pdf']" :onUploadSuccess="onUploadSuccess" :ref="fileRef" :defaultFileList="tempFileList" />
|
||||
<FileUpload :multiple="true" :fileType="['pdf']" :onUploadSuccess="onUploadSuccess"
|
||||
:ref="fileRef" :defaultFileList="tempFileList" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div>
|
||||
@ -208,7 +207,16 @@ const handleChoose = async () => {
|
||||
dialogVisible.value = true;
|
||||
};
|
||||
|
||||
onMounted(async () => {});
|
||||
onMounted(async () => {
|
||||
const id = route.query.id;
|
||||
if (id) {
|
||||
const { data } = await getIncomeContract(id);
|
||||
form.value.id = data.id;
|
||||
form.value.contractOwner = data.contractOwner
|
||||
} else {
|
||||
router.push('/ctr/incomeContract');
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
.container {
|
||||
|
128
src/views/demo/components/1.html
Normal file
@ -0,0 +1,128 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<!-- 引入图标(这里用的是阿里图标库示例,实际可替换成自己的图标资源) -->
|
||||
<link rel="stylesheet" href="https://at.alicdn.com/t/c/font_4245527_xxxxxx.css">
|
||||
<!-- <link rel="stylesheet" href="style.css"> -->
|
||||
<style>
|
||||
/* 初始化样式 */
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
background: #eef5ff;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
/* 时间轴容器 */
|
||||
.weather-timeline {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
overflow-x: auto;
|
||||
/* 适配小屏幕横向滚动 */
|
||||
}
|
||||
|
||||
/* 每个时间项 */
|
||||
.time-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin: 0 12px;
|
||||
min-width: 80px;
|
||||
/* 保证 item 最小宽度 */
|
||||
}
|
||||
|
||||
/* 当前时间项特殊样式 */
|
||||
.time-item.current {
|
||||
background: #e3f0ff;
|
||||
border-radius: 8px;
|
||||
padding: 10px;
|
||||
transform: scale(1.1);
|
||||
/* 稍微放大突出 */
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
/* 时间文本 */
|
||||
.time {
|
||||
font-size: 14px;
|
||||
color: #333;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
/* 温度文本 */
|
||||
.temp {
|
||||
font-size: 16px;
|
||||
color: #666;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
/* 图标样式(基于阿里图标库,可替换成自己的图标字体或图片) */
|
||||
.iconfont {
|
||||
font-size: 24px;
|
||||
color: #f9b115;
|
||||
/* 太阳/主色调 */
|
||||
}
|
||||
|
||||
.icon-rain {
|
||||
color: #9ec8f2;
|
||||
/* 雨/蓝色系 */
|
||||
}
|
||||
|
||||
.icon-cloud-moon {
|
||||
color: #c9d6e5;
|
||||
/* 多云 moon/浅灰蓝 */
|
||||
}
|
||||
</style>
|
||||
<title>天气时间轴</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="weather-timeline">
|
||||
<div class="time-item">
|
||||
<div class="time">16:00</div>
|
||||
<div class="temp">30°C</div>
|
||||
<i class="iconfont icon-sun"></i> <!-- 太阳图标 -->
|
||||
</div>
|
||||
<div class="time-item">
|
||||
<div class="time">17:00</div>
|
||||
<div class="temp">29°C</div>
|
||||
<i class="iconfont icon-sun"></i>
|
||||
</div>
|
||||
<div class="time-item">
|
||||
<div class="time">18:00</div>
|
||||
<div class="temp">25°C</div>
|
||||
<i class="iconfont icon-rain"></i> <!-- 小雨图标 -->
|
||||
</div>
|
||||
<div class="time-item current">
|
||||
<div class="time">现在</div>
|
||||
<div class="temp">25°C</div>
|
||||
<i class="iconfont icon-rain"></i>
|
||||
</div>
|
||||
<div class="time-item">
|
||||
<div class="time">20:00</div>
|
||||
<div class="temp">25°C</div>
|
||||
<i class="iconfont icon-cloud-moon"></i> <!-- 多云 moon 图标 -->
|
||||
</div>
|
||||
<div class="time-item">
|
||||
<div class="time">21:00</div>
|
||||
<div class="temp">20°C</div>
|
||||
<i class="iconfont icon-cloud-moon"></i>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
311
src/views/demo/components/ChartBox.vue
Normal file
@ -0,0 +1,311 @@
|
||||
<template>
|
||||
<div class="chart-container">
|
||||
<!-- 图表标题和时间范围选择器 -->
|
||||
<div class="chart-header">
|
||||
<h2>功率与效率趋势</h2>
|
||||
<div class="chart-actions">
|
||||
<button @click="timeRange = 'day'" :class="{ active: timeRange === 'day' }">今日</button>
|
||||
<button @click="timeRange = 'week'" :class="{ active: timeRange === 'week' }">本周</button>
|
||||
<button @click="timeRange = 'month'" :class="{ active: timeRange === 'month' }">本月</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 图表内容区域 -->
|
||||
<div ref="chartRef" class="chart-content"></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch } from 'vue';
|
||||
import * as echarts from 'echarts';
|
||||
|
||||
// 图表DOM引用
|
||||
const chartRef = ref(null);
|
||||
// 时间范围状态
|
||||
const timeRange = ref('day');
|
||||
// 图表实例
|
||||
let chartInstance = null;
|
||||
|
||||
// 定义颜色常量
|
||||
const POWER_COLOR = 'rgba(42, 130, 228, 1)';
|
||||
const EFFICIENCY_COLOR = 'rgba(67, 207, 124, 1)';
|
||||
|
||||
// 生成指定范围内的随机数(用于模拟数据)
|
||||
const getRandomValue = (min, max) => {
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
};
|
||||
|
||||
// 生成指定范围内的随机浮点数(用于效率数据)
|
||||
const getRandomFloat = (min, max, decimalPlaces = 1) => {
|
||||
const value = Math.random() * (max - min) + min;
|
||||
return parseFloat(value.toFixed(decimalPlaces));
|
||||
};
|
||||
|
||||
// 获取当前月份的天数
|
||||
const getDaysInCurrentMonth = () => {
|
||||
const now = new Date();
|
||||
const year = now.getFullYear();
|
||||
const month = now.getMonth() + 1; // 月份从0开始,所以+1
|
||||
return new Date(year, month, 0).getDate();
|
||||
};
|
||||
|
||||
// 根据时间范围返回对应的数据
|
||||
const getChartData = () => {
|
||||
if (timeRange.value === 'day') {
|
||||
return {
|
||||
xAxis: ['00:00', '03:00', '06:00', '09:00', '12:00', '15:00', '18:00', '21:00'],
|
||||
powerData: [320, 380, 350, 420, 580, 630, 550, 480],
|
||||
efficiencyData: [85.2, 86.5, 87.1, 88.3, 89.5, 89.2, 88.7, 88.1]
|
||||
};
|
||||
} else if (timeRange.value === 'week') {
|
||||
return {
|
||||
xAxis: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
|
||||
powerData: [4200, 4800, 5100, 4900, 5300, 3800, 3200],
|
||||
efficiencyData: [86.2, 87.5, 88.1, 87.8, 89.0, 88.5, 87.9]
|
||||
};
|
||||
} else {
|
||||
// 本月数据 - 按天显示
|
||||
const daysInMonth = getDaysInCurrentMonth();
|
||||
const xAxis = [];
|
||||
const powerData = [];
|
||||
const efficiencyData = [];
|
||||
|
||||
// 生成每天的数据
|
||||
for (let i = 1; i <= daysInMonth; i++) {
|
||||
xAxis.push(`${i}日`);
|
||||
// 生成合理范围内的功率数据(10000-25000之间)
|
||||
powerData.push(getRandomValue(10000, 25000));
|
||||
// 生成合理范围内的效率数据(85-90之间,保留1位小数)
|
||||
efficiencyData.push(getRandomFloat(85, 90));
|
||||
}
|
||||
|
||||
return {
|
||||
xAxis,
|
||||
powerData,
|
||||
efficiencyData
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 初始化图表
|
||||
const initChart = () => {
|
||||
if (chartRef.value && !chartInstance) {
|
||||
chartInstance = echarts.init(chartRef.value);
|
||||
}
|
||||
|
||||
const data = getChartData();
|
||||
|
||||
const option = {
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: { type: 'cross' }
|
||||
},
|
||||
legend: {
|
||||
data: ['总功率(kW)', '平均效率(%)'],
|
||||
top: 0
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '3%',
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: data.xAxis,
|
||||
// 当月天数较多时,优化X轴标签显示
|
||||
axisLabel: {
|
||||
interval: timeRange.value === 'month' ? 'auto' : 0,
|
||||
rotate: timeRange.value === 'month' ? 45 : 0
|
||||
}
|
||||
},
|
||||
yAxis: [
|
||||
{
|
||||
type: 'value',
|
||||
name: '总功率(kW)',
|
||||
axisLabel: {
|
||||
formatter: '{value}'
|
||||
}
|
||||
},
|
||||
{
|
||||
type: 'value',
|
||||
name: '平均效率(%)',
|
||||
min: 80,
|
||||
max: 95,
|
||||
axisLabel: {
|
||||
formatter: '{value}%'
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: '总功率(kW)',
|
||||
type: 'line',
|
||||
data: data.powerData,
|
||||
smooth: true,
|
||||
lineStyle: {
|
||||
width: 3,
|
||||
color: POWER_COLOR
|
||||
},
|
||||
symbol: 'circle',
|
||||
symbolSize: 8,
|
||||
itemStyle: {
|
||||
color: POWER_COLOR
|
||||
},
|
||||
markPoint: {
|
||||
data: [
|
||||
{ type: 'max', name: '最大值' },
|
||||
{ type: 'min', name: '最小值' }
|
||||
],
|
||||
itemStyle: {
|
||||
color: POWER_COLOR
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '平均效率(%)',
|
||||
type: 'line',
|
||||
yAxisIndex: 1,
|
||||
data: data.efficiencyData,
|
||||
smooth: true,
|
||||
lineStyle: {
|
||||
width: 3,
|
||||
type: 'dashed',
|
||||
color: EFFICIENCY_COLOR
|
||||
},
|
||||
symbol: 'diamond',
|
||||
symbolSize: 8,
|
||||
itemStyle: {
|
||||
color: EFFICIENCY_COLOR
|
||||
},
|
||||
markPoint: {
|
||||
data: [
|
||||
{ type: 'max', name: '最大值' },
|
||||
{ type: 'min', name: '最小值' }
|
||||
],
|
||||
itemStyle: {
|
||||
color: EFFICIENCY_COLOR
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
chartInstance.setOption(option);
|
||||
};
|
||||
|
||||
// 响应窗口大小变化
|
||||
const handleResize = () => {
|
||||
if (chartInstance) {
|
||||
chartInstance.resize();
|
||||
}
|
||||
};
|
||||
|
||||
// 生命周期钩子
|
||||
onMounted(() => {
|
||||
initChart();
|
||||
window.addEventListener('resize', handleResize);
|
||||
|
||||
// 清理函数
|
||||
return () => {
|
||||
window.removeEventListener('resize', handleResize);
|
||||
if (chartInstance) {
|
||||
chartInstance.dispose();
|
||||
chartInstance = null;
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
// 监听时间范围变化,更新图表
|
||||
watch(timeRange, () => {
|
||||
initChart();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.chart-container {
|
||||
background-color: #fff;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
||||
overflow: hidden;
|
||||
height: 400px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.chart-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 15px 20px;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.chart-header h2 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.chart-actions button {
|
||||
background: none;
|
||||
border: 1px solid #e0e0e0;
|
||||
padding: 5px 12px;
|
||||
border-radius: 4px;
|
||||
margin-left: 8px;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.chart-actions button.active {
|
||||
background-color: #1890ff;
|
||||
color: white;
|
||||
border-color: #1890ff;
|
||||
}
|
||||
|
||||
.chart-content {
|
||||
width: 100%;
|
||||
height: calc(100% - 54px);
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.chart-container {
|
||||
height: 350px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.chart-container {
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
.chart-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.chart-actions {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.chart-actions button {
|
||||
margin: 0;
|
||||
flex: 1;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.chart-actions button:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.model {
|
||||
padding: 20px;
|
||||
background-color: rgba(242, 248, 252, 1);
|
||||
}
|
||||
</style>
|
30
src/views/demo/components/TitleComponent.vue
Normal file
@ -0,0 +1,30 @@
|
||||
<template>
|
||||
<el-row>
|
||||
<el-col>
|
||||
<div style="color: rgba(0, 30, 59, 1);;font-family: 'Alibaba-PuHuiTi-Bold';margin: 10px 0 0 0;"
|
||||
:style="{ fontSize: fontLevelMap[props.fontLevel] }">
|
||||
{{ props.title }}
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col>
|
||||
<p style="color: rgba(154, 154, 154, 1);font-size: 14px;">
|
||||
{{ props.subtitle }}
|
||||
</p>
|
||||
</el-col>
|
||||
|
||||
</el-row>
|
||||
</template>
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
title: String,
|
||||
subtitle: String,
|
||||
fontLevel: {
|
||||
type: Number,
|
||||
default: 1
|
||||
}
|
||||
})
|
||||
const fontLevelMap = {
|
||||
1: "24px",
|
||||
2: "18px"
|
||||
}
|
||||
</script>
|
210
src/views/demo/components/gaojing.vue
Normal file
@ -0,0 +1,210 @@
|
||||
<template>
|
||||
<el-card shadow="never" style="border-radius: 10px;">
|
||||
<div style="margin-bottom: 20px;display: flex;align-items: center;justify-content: right;">
|
||||
<span style="margin-right: 5px;color: rgba(113, 128, 150, 1);font-size: 14px;">
|
||||
查看全部告警信息
|
||||
</span>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="8" height="8"
|
||||
viewBox="0 0 8 8" fill="none">
|
||||
<path
|
||||
d="M5.94575 4.15722C5.94975 4.14947 5.95624 4.14298 5.95975 4.13497C6.0285 3.99197 6.00599 3.81697 5.88425 3.70197L3.1245 1.09172C2.97399 0.949466 2.73676 0.956216 2.59425 1.10648C2.45199 1.25698 2.4585 1.49422 2.60901 1.63673L5.08526 3.97922L2.61875 6.35647C2.46975 6.50021 2.46525 6.73746 2.60901 6.88672C2.6825 6.96321 2.78076 7.00148 2.87901 7.00148C2.97276 7.00148 3.06651 6.96648 3.13926 6.89648L5.87401 4.26073C5.87927 4.25547 5.88125 4.24823 5.88651 4.24274C5.89052 4.23899 5.89476 4.23623 5.89875 4.23224C5.92 4.20997 5.93124 4.18272 5.94575 4.15722Z"
|
||||
fill="#718096">
|
||||
</path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="notice">
|
||||
<div class="item">
|
||||
<div class="icon">
|
||||
<img src="/assets/demo/zgjxx.png" alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<p>总告警信息</p>
|
||||
<p style="color: rgba(42, 130, 228, 1);">1,921条</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="icon">
|
||||
<img src="/assets/demo/ycl.png" alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<p>已处理</p>
|
||||
<p style="color:rgba(0, 184, 122, 1);">500条</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="icon">
|
||||
<img src="/assets/demo/zzcl.png" alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<p>正在处理</p>
|
||||
<p style="color: rgba(255, 141, 26, 1);">200条</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="icon">
|
||||
<img src="/assets/demo/wcl.png" alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<p>未处理</p>
|
||||
<p style="color: rgba(227, 39, 39, 1);">1,221</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="list">
|
||||
<div class="item waring">
|
||||
<div class="left">
|
||||
<p class="title">
|
||||
逆变器温度过高
|
||||
</p>
|
||||
<p class="text">INV-2023-003 温度达到52℃,超过阈值48℃</p>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="time">
|
||||
10分钟前
|
||||
</div>
|
||||
<el-text type="warning" size="small">正在处理</el-text>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item danger">
|
||||
<div class="left">
|
||||
<p class="title">
|
||||
通信中断
|
||||
</p>
|
||||
<p class="text">INV-2023-003 与监控系统通信中断</p>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="time">
|
||||
20分钟前
|
||||
</div>
|
||||
<el-text type="primary" size="small">查看详情</el-text>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item danger">
|
||||
<div class="left">
|
||||
<p class="title">
|
||||
通信中断
|
||||
</p>
|
||||
<p class="text">INV-2023-003 与监控系统通信中断</p>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="time">
|
||||
1小时前
|
||||
</div>
|
||||
<el-text type="primary" size="small">查看详情</el-text>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item grey">
|
||||
<div class="left">
|
||||
<p class="title">
|
||||
逆变器温度过高
|
||||
</p>
|
||||
<p class="text">INV-2023-003 温度达到52℃,超过阈值48℃</p>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="time">
|
||||
2小时前
|
||||
</div>
|
||||
<!-- <el-text type="primary" size="small">查看详情</el-text> -->
|
||||
<el-button type="info" size="small" disabled>已处理</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
.notice {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
border-bottom: 1px solid rgba(32, 32, 32, 0.05);
|
||||
padding-bottom: 20px;
|
||||
|
||||
.item {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
margin-right: 10px;
|
||||
|
||||
img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.content p:nth-child(2) {
|
||||
font-size: 14px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
.item {
|
||||
border-radius: 10px;
|
||||
padding: 0 20px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
|
||||
.text {
|
||||
color: rgba(125, 133, 146, 1);
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.right {
|
||||
font-size: 12px;
|
||||
color: rgba(125, 133, 146, 1);
|
||||
|
||||
.time {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.waring {
|
||||
background-color: #FFFCE6;
|
||||
border: 1px solid #FFF0E1;
|
||||
|
||||
.title {
|
||||
color: #FFA408;
|
||||
}
|
||||
}
|
||||
|
||||
.danger {
|
||||
background-color: #FFE9E5;
|
||||
border: 1px solid #FFEFEB;
|
||||
|
||||
.title {
|
||||
color: rgba(255, 87, 51, 1);
|
||||
}
|
||||
}
|
||||
|
||||
.grey {
|
||||
background-color: #F3F3F3;
|
||||
border: 1px solid #FCFCFC;
|
||||
|
||||
.right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.title {
|
||||
color: rgba(102, 102, 102, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<script setup></script>
|
224
src/views/demo/components/qixiang.vue
Normal file
@ -0,0 +1,224 @@
|
||||
<template>
|
||||
<div class="cardItem">
|
||||
<el-card>
|
||||
<div class="tianqi"
|
||||
style="display: flex;flex-direction: column;align-items: center;background-color: #FAFAFA;border-radius: 10px;padding-bottom: 40px;">
|
||||
<div>
|
||||
<img src="/assets/demo/Sunny.png" style="display: block; width: 100px;height: 100px;" alt="">
|
||||
</div>
|
||||
<div style="font-family: 'Alibaba-PuHuiTi-Bold';font-size: 24px;">
|
||||
31℃
|
||||
</div>
|
||||
<div>晴朗</div>
|
||||
<div style="color: rgba(154, 154, 154, 1);font-size: 14px;">
|
||||
紫外线强度:<span>高</span>
|
||||
</div>
|
||||
<div class="tianqi2">
|
||||
<div class="item">
|
||||
<div>
|
||||
<img src="/assets/demo/shidu.png" alt="">
|
||||
</div>
|
||||
<div class="text">相对湿度: <span>45%</span></div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div>
|
||||
<img src="/assets/demo/qiangdu.png" alt="">
|
||||
</div>
|
||||
<div class="text">光照强度: <span>45%</span></div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div>
|
||||
<img src="/assets/demo/fengshu.png" alt="">
|
||||
</div>
|
||||
<div class="text">风速: <span>2.3m/s</span></div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div>
|
||||
<img src="/assets/demo/riluo.png" alt="">
|
||||
</div>
|
||||
<div class="text">日落时间: <span>19.45</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="weather-timeline">
|
||||
<div class="time-box">
|
||||
<div class="time-item">
|
||||
<div class="time">16:00</div>
|
||||
<div class="temp">30°C</div>
|
||||
<div class="img-box">
|
||||
<img src="/assets/demo/sunny_s.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="time-item">
|
||||
<div class="time">17:00</div>
|
||||
<div class="temp">29°C</div>
|
||||
<div class="img-box">
|
||||
<img src="/assets/demo/sunny_s.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="time-item">
|
||||
<div class="child">
|
||||
<div class="time">18:00</div>
|
||||
<div class="temp">25°C</div>
|
||||
<div class="img-box">
|
||||
<img src="/assets/demo/rain.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="time-item show">
|
||||
<div class="time">现在</div>
|
||||
<div class="temp">25°C</div>
|
||||
<div class="img-box">
|
||||
<img src="/assets/demo/rain_show.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="time-item">
|
||||
<div class="time">20:00</div>
|
||||
<div class="temp">25°C</div>
|
||||
<div class="img-box">
|
||||
<img src="/assets/demo/yin.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="time-item">
|
||||
<div class="time">21:00</div>
|
||||
<div class="temp">20°C</div>
|
||||
<div class="img-box">
|
||||
<img src="/assets/demo/yin.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
.cardItem {
|
||||
padding: -20px !important;
|
||||
}
|
||||
|
||||
.tianqi2 {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
margin-top: 50px;
|
||||
|
||||
img {
|
||||
width: 40px;
|
||||
height: 40x;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
font-size: 14px;
|
||||
|
||||
.text {
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.weather-timeline {
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
margin: 15px 0;
|
||||
|
||||
.time {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.img-box {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
// img[src*='Sunny'] {
|
||||
// width: 50px;
|
||||
// height: 50px;
|
||||
// }
|
||||
|
||||
// img[src*='rain'] {
|
||||
// width: 60px;
|
||||
// height: 60px;
|
||||
// }
|
||||
|
||||
|
||||
padding: 15px;
|
||||
background: linear-gradient(to right, #D6E2FF, #DEEBFF);
|
||||
border-radius: 15px;
|
||||
|
||||
.time-box {
|
||||
background: linear-gradient(to right, #447BFF, #67A3FD);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
border-radius: 10px;
|
||||
padding: 10px 20px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.time-item.show {
|
||||
color: rgba(24, 109, 245, 1);
|
||||
position: relative;
|
||||
// z-index: 888;
|
||||
background-color: #fff;
|
||||
padding: 0 5px;
|
||||
|
||||
}
|
||||
|
||||
.show::after {
|
||||
// color: rgba(24, 109, 245, 1);
|
||||
// position: relative;
|
||||
// z-index: 888;
|
||||
// background-color: #fff;
|
||||
content: '';
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 25px;
|
||||
// background-color: red;
|
||||
background-color: #fff;
|
||||
left: 0;
|
||||
border-radius: 0 0 25px 25px;
|
||||
}
|
||||
|
||||
.show::before {
|
||||
// color: rgba(24, 109, 245, 1);
|
||||
// position: relative;
|
||||
// z-index: 888;
|
||||
// background-color: #fff;
|
||||
content: '';
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 25px;
|
||||
// background-color: red;
|
||||
background-color: #fff;
|
||||
left: 0;
|
||||
top: -25px;
|
||||
border-radius: 25px 25px 0 0;
|
||||
}
|
||||
|
||||
// .show::after {
|
||||
// content: '';
|
||||
// position: absolute;
|
||||
// height: 155px;
|
||||
// background-color: #fff;
|
||||
// z-index: 999;
|
||||
// width: 100%;
|
||||
// top: -25px;
|
||||
// left: 0;
|
||||
// border-radius: 20px;
|
||||
// }
|
||||
}
|
||||
</style>
|
||||
<script setup>
|
||||
</script>
|
107
src/views/demo/components/status.vue
Normal file
@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<el-card shadow="never" style="border-radius: 10px;">
|
||||
<el-form :inline="true" :model="formInline" label-width="120" style="display: flex; justify-content: center;">
|
||||
<el-form-item label="规则编号">
|
||||
<el-input v-model="formInline.user" placeholder="请输入规则编号" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<el-select v-model="formInline.region" placeholder="请输入状态" clearable>
|
||||
<el-option label="Zone one" value="shanghai" />
|
||||
<el-option label="Zone two" value="beijing" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="更新时间">
|
||||
<el-date-picker v-model="formInline.date" type="date" placeholder="请选择时间" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="search" type="primary" @click="onSubmit">搜索</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="refresh" type="default" @click="onSubmit">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table v-loading="loading" :data="listData" @selection-change="handleSelectionChange">
|
||||
<!-- <el-table-column type="index" width="50" label="序号" /> -->
|
||||
<el-table-column label="逆变器编号" align="center" prop="id" />
|
||||
<!-- <el-table-column label="合同类型" align="center" prop="contractType">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="income_contract_type" :value="scope.row.contractType" />
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<el-table-column label="输出功率" align="center" prop="shuchu" />
|
||||
<el-table-column label="效率" align="center" prop="xiaolv" />
|
||||
<el-table-column label="温度" align="center" prop="wendu" />
|
||||
<el-table-column label="今日发电量" align="center" prop="fadian" />
|
||||
<el-table-column label="状态" align="center" prop="status">
|
||||
<template #default="scope">
|
||||
<!-- <el-button link type="primary">详情</el-button>
|
||||
<el-button link type="danger">处理</el-button>
|
||||
<el-button link type="warning">维护记录</el-button> -->
|
||||
<el-tag :type="statusMap[scope.row.status].type">{{ statusMap[scope.row.status].label }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary">详情</el-button>
|
||||
<el-button link type="danger">处理</el-button>
|
||||
<el-button link type="warning">维护记录</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
|
||||
v-model:limit="queryParams.pageSize" @pagination="getList" /> -->
|
||||
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
|
||||
@pagination="getList" />
|
||||
</el-card>
|
||||
</template>
|
||||
<script setup>
|
||||
const formInline = ref({})
|
||||
const total = ref(0);
|
||||
const loading = ref(false);
|
||||
const listData = [
|
||||
{ id: "INV-2023-001", shuchu: "12.8kw", xiaolv: "98.2%", wendu: "42℃", fadian: "158.5kWh", status: 1 },
|
||||
{ id: "INV-2023-001", shuchu: "12.8kw", xiaolv: "98.2%", wendu: "42℃", fadian: "158.5kWh", status: 1 },
|
||||
{ id: "INV-2023-001", shuchu: "12.8kw", xiaolv: "98.2%", wendu: "42℃", fadian: "158.5kWh", status: 2 },
|
||||
{ id: "INV-2023-001", shuchu: "12.8kw", xiaolv: "98.2%", wendu: "42℃", fadian: "158.5kWh", status: 2 },
|
||||
{ id: "INV-2023-001", shuchu: "12.8kw", xiaolv: "98.2%", wendu: "42℃", fadian: "158.5kWh", status: 3 },
|
||||
{ id: "INV-2023-001", shuchu: "12.8kw", xiaolv: "98.2%", wendu: "42℃", fadian: "158.5kWh", status: 3 }
|
||||
]
|
||||
const statusMap = {
|
||||
1: {
|
||||
label: "正常运行",
|
||||
type: "success"
|
||||
},
|
||||
2: {
|
||||
label: "异常",
|
||||
type: "danger"
|
||||
},
|
||||
3: {
|
||||
label: "维护中",
|
||||
type: "warning"
|
||||
}
|
||||
}
|
||||
const initFormData = {
|
||||
|
||||
};
|
||||
const data = reactive({
|
||||
form: { ...initFormData },
|
||||
queryParams: {
|
||||
|
||||
},
|
||||
});
|
||||
const { queryParams, form, rules } = toRefs(data);
|
||||
|
||||
/** 多选框选中数据 */
|
||||
const handleSelectionChange = (selection) => {
|
||||
ids.value = selection.map((item) => item.id);
|
||||
single.value = selection.length != 1;
|
||||
multiple.value = !selection.length;
|
||||
};
|
||||
const getList = async () => {
|
||||
// loading.value = true;
|
||||
// const res = await listIncomeContract(queryParams.value);
|
||||
// incomeContractList.value = res.rows;
|
||||
// total.value = res.total;
|
||||
// loading.value = false;
|
||||
};
|
||||
</script>
|
148
src/views/demo/components/zhiban.vue
Normal file
226
src/views/demo/index.vue
Normal file
186
src/views/demo1/components/sbqk.vue
Normal file
@ -0,0 +1,186 @@
|
||||
<template>
|
||||
<el-card>
|
||||
<div class="container">
|
||||
<div class="item">
|
||||
<div class="top">
|
||||
<div class="icon">
|
||||
<img src="/assets/demo/sb1.png" alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<p class="t1">运行中</p>
|
||||
<p class="t2">当前状态</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<span class="icon"><svg xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" width="17.4462890625" height="4.361663818359375"
|
||||
viewBox="0 0 17.4462890625 4.361663818359375" fill="none">
|
||||
<path
|
||||
d="M14.43 2.05L14.43 0.4C14.43 0.32495 14.5049 0.25 14.58 0.25L14.66 0.25L17.14 2.05C17.2151 2.12505 17.2151 2.20495 17.14 2.28L14.66 4.08C14.585 4.15505 14.505 4.08 14.43 4.08L14.43 2.5L0.55 2.5C0.399897 2.6501 0.25 2.4301 0.25 2.28C0.25 2.12988 0.399897 1.98 0.55 1.98L14.43 1.98L14.43 2.05Z"
|
||||
stroke="rgba(67, 207, 124, 1)" stroke-width="0.5" fill="#43CF7C">
|
||||
</path>
|
||||
</svg>
|
||||
</span>
|
||||
<span class="t1">平稳运行</span>
|
||||
<span class="t2">(30 days)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="top">
|
||||
<div class="icon">
|
||||
<img src="/assets/demo/sb2.png" alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<p class="t1">128小时</p>
|
||||
<p class="t2">运行时长</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<span class="icon"><svg xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" width="17.4462890625" height="4.361663818359375"
|
||||
viewBox="0 0 17.4462890625 4.361663818359375" fill="none">
|
||||
<path
|
||||
d="M14.43 2.05L14.43 0.4C14.43 0.32495 14.5049 0.25 14.58 0.25L14.66 0.25L17.14 2.05C17.2151 2.12505 17.2151 2.20495 17.14 2.28L14.66 4.08C14.585 4.15505 14.505 4.08 14.43 4.08L14.43 2.5L0.55 2.5C0.399897 2.6501 0.25 2.4301 0.25 2.28C0.25 2.12988 0.399897 1.98 0.55 1.98L14.43 1.98L14.43 2.05Z"
|
||||
stroke="rgba(67, 207, 124, 1)" stroke-width="0.5" fill="#43CF7C">
|
||||
</path>
|
||||
</svg>
|
||||
</span>
|
||||
<span class="t1">平稳运行</span>
|
||||
<span class="t2">(30 days)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="top">
|
||||
<div class="icon">
|
||||
<img src="/assets/demo/sb3.png" alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<p class="t1">5/8</p>
|
||||
<p class="t2">已完成步骤</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<span class="icon"><svg xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" width="12.393798828125" height="7.42498779296875"
|
||||
viewBox="0 0 12.393798828125 7.42498779296875" fill="none">
|
||||
<path
|
||||
d="M12.2438 0.225L12.2438 0.150012L12.2438 0.0750058L12.1688 0.0750058C12.1688 0.0750058 12.0937 0.0750058 12.0188 0L8.34376 0C7.96876 0 7.66876 0.300006 7.66876 0.675C7.66876 1.05001 7.96876 1.35 8.34376 1.35L10.2188 1.35L6.61876 4.95L4.81876 3.15C4.44375 2.775 3.69376 2.775 3.31875 3.15L0.16875 6.3C-0.05625 6.525 -0.05625 6.975 0.16875 7.2C0.318762 7.35001 0.468756 7.425 0.61875 7.425C0.768762 7.425 0.918756 7.425 1.06875 7.2L3.99375 4.275L5.79375 6.075C6.16876 6.45001 6.91875 6.45001 7.29376 6.075L11.0438 2.32501L11.0438 4.20001C11.0438 4.575 11.3438 4.87501 11.7188 4.87501C12.0937 4.87501 12.3938 4.575 12.3938 4.20001L12.3938 0.825011L12.3938 0.600011L12.2438 0.225Z"
|
||||
fill="#00B87A">
|
||||
</path>
|
||||
</svg>
|
||||
|
||||
</span>
|
||||
<span class="t1">完成率98%</span>
|
||||
<span class="t2">(30 days)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="top">
|
||||
<div class="icon">
|
||||
<img src="/assets/demo/sb4.png" alt="">
|
||||
</div>
|
||||
<div class="content">
|
||||
<p class="t1" style="color: rgba(255, 153, 0, 1);">2条</p>
|
||||
<p class="t2">告警信息</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<span class="icon"><svg xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" width="12.393798828125" height="7.42498779296875"
|
||||
viewBox="0 0 12.393798828125 7.42498779296875" fill="none">
|
||||
<path
|
||||
d="M12.2438 0.225L12.2438 0.150012L12.2438 0.0750058L12.1688 0.0750058C12.1688 0.0750058 12.0937 0.0750058 12.0188 0L8.34376 0C7.96876 0 7.66876 0.300006 7.66876 0.675C7.66876 1.05001 7.96876 1.35 8.34376 1.35L10.2188 1.35L6.61876 4.95L4.81876 3.15C4.44375 2.775 3.69376 2.775 3.31875 3.15L0.16875 6.3C-0.05625 6.525 -0.05625 6.975 0.16875 7.2C0.318762 7.35001 0.468756 7.425 0.61875 7.425C0.768762 7.425 0.918756 7.425 1.06875 7.2L3.99375 4.275L5.79375 6.075C6.16876 6.45001 6.91875 6.45001 7.29376 6.075L11.0438 2.32501L11.0438 4.20001C11.0438 4.575 11.3438 4.87501 11.7188 4.87501C12.0937 4.87501 12.3938 4.575 12.3938 4.20001L12.3938 0.825011L12.3938 0.600011L12.2438 0.225Z"
|
||||
fill="#00B87A">
|
||||
</path>
|
||||
</svg>
|
||||
|
||||
</span>
|
||||
<span class="t1">4%</span>
|
||||
<span class="t2">(30 days)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="back">
|
||||
<span>34522天</span>
|
||||
<span>已安全运行</span>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
.content {
|
||||
font-family: "Alibaba-PuHuiTi-Bold";
|
||||
}
|
||||
|
||||
.container {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
.item {
|
||||
background-color: rgba(240, 249, 255, 1);
|
||||
padding: 20px 40px 20px 20px;
|
||||
border-radius: 20px;
|
||||
text-align: center;
|
||||
|
||||
.top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: left;
|
||||
|
||||
.icon {
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
margin-top: -20px;
|
||||
}
|
||||
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.t1 {
|
||||
font-size: 26px;
|
||||
}
|
||||
|
||||
.t2 {
|
||||
font-size: 18px;
|
||||
color: rgba(62, 73, 84, 1);
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 10px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.bottom {
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
.icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.t1 {
|
||||
color: rgba(0, 184, 122, 1);
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
.t2 {
|
||||
color: rgba(150, 155, 160, 1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.back {
|
||||
position: relative;
|
||||
}
|
||||
</style>
|
||||
<script setup>
|
||||
|
||||
</script>
|
23
src/views/demo1/index.vue
Normal file
@ -0,0 +1,23 @@
|
||||
<template>
|
||||
<div style="padding: 20px;">
|
||||
<el-row>
|
||||
<el-col :span="15">
|
||||
<TitleComponent title="设备情况" subtitle="电站一次监控数据" />
|
||||
<sbqk />
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<style scoped>
|
||||
.el-card {
|
||||
border-radius: 10px;
|
||||
}
|
||||
</style>
|
||||
<script setup>
|
||||
import TitleComponent from '@/views/demo/components/TitleComponent.vue';
|
||||
import sbqk from './components/sbqk.vue';
|
||||
|
||||
</script>
|
@ -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"
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
};
|
||||
//提交回调
|
||||
|
@ -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 {
|
||||
|
@ -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 || '';
|
||||
|
@ -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>
|
||||
|
@ -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();
|
||||
}
|
||||
);
|
||||
|
@ -47,16 +47,16 @@
|
||||
<template #header>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<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"
|
||||
><el-tooltip class="box-item" effect="dark" content="从原有模板列表选择新增" placement="top">
|
||||
<el-icon color="#409efc"><WarningFilled /></el-icon> </el-tooltip
|
||||
></span>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="addTemplate()" v-hasPermi="['formalities:formalitiesAreConsolidated:addFormalities']"
|
||||
>新增数据</el-button
|
||||
>
|
||||
<el-col :span="1.5" v-hasPermi="['formalities:listOfFormalities:list']">
|
||||
<el-button type="primary" plain icon="Plus" @click="addTemplate()">新增数据</el-button>
|
||||
<span style="margin-left: 10px">
|
||||
<el-tooltip class="box-item" effect="dark" content="创建新模板并添加数据" placement="top">
|
||||
<el-icon color="#409efc"><WarningFilled /></el-icon>
|
||||
@ -198,6 +198,7 @@
|
||||
v-model="file"
|
||||
ref="uploadRef"
|
||||
uploadUrl="/formalities/formalitiesAnnex"
|
||||
v-hasPermi="['formalities:formalitiesAnnex:add']"
|
||||
:data="{ formalitiesId: form.id }"
|
||||
:fileType="['pdf']"
|
||||
:auto-upload="false"
|
||||
|
@ -10,7 +10,7 @@
|
||||
@click="isDisabled = false"
|
||||
class="px-8 py-2.5 transition-all duration-300 font-medium"
|
||||
v-if="isDisabled"
|
||||
v-hasPermi="['ailiaoshebei:purchaseUser:byProject']"
|
||||
v-hasPermi="['cailiaoshebei:purchaseUser:addOrUpdate']"
|
||||
>
|
||||
点击编辑
|
||||
</el-button>
|
||||
@ -38,7 +38,7 @@
|
||||
@click="submitForm"
|
||||
icon="Check"
|
||||
class="px-8 py-2.5 transition-all duration-300 transform hover:scale-105 bg-blue-500 hover:bg-blue-600 text-white font-medium"
|
||||
v-hasPermi="['cailiaoshebei:purchaseUser:add']"
|
||||
v-hasPermi="['cailiaoshebei:purchaseUser:addOrUpdate']"
|
||||
>
|
||||
确认提交
|
||||
</el-button>
|
||||
@ -121,6 +121,7 @@ const designUser = async () => {
|
||||
return;
|
||||
}
|
||||
Object.assign(form, res.data);
|
||||
// form.userId = res.data.userId;
|
||||
isDisabled.value = true;
|
||||
}
|
||||
} catch (error) {
|
||||
|
@ -7,13 +7,7 @@
|
||||
<template #header>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5" :offset="0">
|
||||
<el-button
|
||||
type="primary"
|
||||
v-hasPermi="['cailiaoshebei:materialbatchdemandplan:add']"
|
||||
size="default"
|
||||
@click="handleAdd"
|
||||
icon="FolderAdd"
|
||||
plain
|
||||
<el-button type="primary" v-hasPermi="['cailiaoshebei:mrpBase:addbatch']" size="default" @click="handleAdd" icon="FolderAdd" plain
|
||||
>新增</el-button
|
||||
>
|
||||
</el-col>
|
||||
@ -21,7 +15,7 @@
|
||||
<el-button
|
||||
type="danger"
|
||||
size="default"
|
||||
v-hasPermi="['cailiaoshebei:materialbatchdemandplan:remove']"
|
||||
v-hasPermi="['cailiaoshebei:mrpBase:remove']"
|
||||
@click="handleDeleteBatch"
|
||||
:disabled="form.mrpBaseBo.status != 'draft'"
|
||||
icon="FolderDelete"
|
||||
@ -66,9 +60,7 @@
|
||||
<template #header>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5" v-if="form.mrpBaseBo.status == 'draft'">
|
||||
<el-button type="primary" plain icon="Edit" @click="handleUpdata" v-hasPermi="['cailiaoshebei:materialbatchdemandplan:edit']"
|
||||
>修改</el-button
|
||||
>
|
||||
<el-button type="primary" plain icon="Edit" @click="handleUpdata" v-hasPermi="['cailiaoshebei:mrpBase:addbatch']">修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5" v-if="form.mrpBaseBo.status == 'draft'">
|
||||
<el-button plain type="primary" icon="Finished" @click="handleAudit()">审核</el-button>
|
||||
@ -133,7 +125,7 @@
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 物资名称列 -->
|
||||
<!-- 物资名称列(核心修改:动态过滤已选选项) -->
|
||||
<el-table-column prop="name" align="center" label="物资名称" width="160">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.name" v-if="scope.row.mrpBaseId" placeholder="请输入物资名称" disabled />
|
||||
@ -144,7 +136,13 @@
|
||||
placeholder="请选择"
|
||||
@change="(val) => selectName(val, scope.row, scope.$index)"
|
||||
>
|
||||
<el-option v-for="item in nameList" :key="item.id" :label="item.name" :value="item.id" />
|
||||
<!-- 动态过滤:排除当前行外已选中的物资ID -->
|
||||
<el-option
|
||||
v-for="item in getAvailableNameList(scope.$index)"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -152,24 +150,21 @@
|
||||
<el-table-column align="center" label="剩余量" width="80">
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.Remaining }}</span>
|
||||
<!-- <el-input disabled v-model="scope.row.Remaining" placeholder="剩余量" /> -->
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 规格型号列 -->
|
||||
<el-table-column prop="specification" align="center" label="规格型号" width="100">
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.specification }}</span>
|
||||
<!-- <el-input v-model="scope.row.specification" placeholder="请输入规格型号" disabled /> -->
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 单位列 -->
|
||||
<el-table-column prop="unit" align="center" label="单位" width="80">
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.unit }}</span>
|
||||
<!-- <el-input v-model="scope.row.unit" placeholder="请输入单位" disabled /> -->
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 数量列(新增错误提示展示) -->
|
||||
<!-- 数量列 -->
|
||||
<el-table-column prop="demandQuantity" align="center" label="数量" width="140">
|
||||
<template #default="scope">
|
||||
<el-input
|
||||
@ -181,7 +176,7 @@
|
||||
type="number"
|
||||
min="0"
|
||||
/>
|
||||
<!-- 数量错误提示(红色小字体) -->
|
||||
<!-- 数量错误提示 -->
|
||||
<div v-if="scope.row.quantityError" class="text-red-500 text-xs mt-1">{{ scope.row.quantityError }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -239,7 +234,7 @@ import {
|
||||
} from '@/api/materials/batchPlan';
|
||||
import { CailiaoshebeiVO, CailiaoshebeiQuery, CailiaoshebeiForm } from '@/api/materials/batchPlan/types';
|
||||
import { useUserStoreHook } from '@/store/modules/user';
|
||||
import { getCurrentInstance, ComponentInternalInstance, watch, onMounted, onUnmounted } from 'vue';
|
||||
import { getCurrentInstance, ComponentInternalInstance, watch, onMounted, onUnmounted, computed } from 'vue';
|
||||
import type { ElFormInstance } from 'element-plus';
|
||||
|
||||
// 类型定义补充
|
||||
@ -302,7 +297,7 @@ const dialog = reactive<DialogOption>({
|
||||
title: ''
|
||||
});
|
||||
|
||||
// 初始化表单数据(补充版本号、重复错误提示字段)
|
||||
// 初始化表单数据
|
||||
const initFormData: FormData = {
|
||||
mrpBaseBo: {
|
||||
id: undefined,
|
||||
@ -323,10 +318,10 @@ const initFormData: FormData = {
|
||||
qs: undefined,
|
||||
arrivalTime: undefined,
|
||||
remark: undefined,
|
||||
Remaining: 0, // 初始化剩余量
|
||||
quantityError: '', // 初始化数量错误提示
|
||||
batchNumber: undefined, // 初始化版本号
|
||||
duplicateError: '', // 初始化重复错误提示
|
||||
Remaining: 0,
|
||||
quantityError: '',
|
||||
batchNumber: undefined,
|
||||
duplicateError: '',
|
||||
mrpBaseId: undefined
|
||||
}
|
||||
]
|
||||
@ -390,7 +385,7 @@ const validateDemandQuantity = (row: PlanListItem, index: number) => {
|
||||
// 1. 清除之前的错误信息
|
||||
row.quantityError = '';
|
||||
|
||||
// 2. 处理空值(若需必填可补充:row.quantityError = '数量不能为空')
|
||||
// 2. 处理空值
|
||||
if (row.demandQuantity === null || row.demandQuantity === undefined || row.demandQuantity === '') {
|
||||
return;
|
||||
}
|
||||
@ -426,42 +421,20 @@ const getMrpBaseRemaining = async (suppliespriceId: number, row: PlanListItem) =
|
||||
}
|
||||
};
|
||||
|
||||
/** 校验重复数据:版本号+物资名称不能重复 */
|
||||
const checkDuplicate = () => {
|
||||
const planList = form.value.planList;
|
||||
let hasDuplicate = false;
|
||||
/** 获取可用物资列表(过滤已选选项) */
|
||||
const getAvailableNameList = (currentIndex: number) => {
|
||||
// 收集除当前行外已选中的物资ID
|
||||
const selectedIds = form.value.planList
|
||||
.filter((_, index) => index !== currentIndex)
|
||||
.map(item => item.suppliespriceId)
|
||||
.filter(id => id !== undefined && id !== null);
|
||||
|
||||
// 1. 清除所有重复错误提示
|
||||
planList.forEach((item) => {
|
||||
item.duplicateError = '';
|
||||
});
|
||||
|
||||
// 2. 遍历校验重复(只校验版本号和物资名称都存在的行)
|
||||
for (let i = 0; i < planList.length; i++) {
|
||||
const current = planList[i];
|
||||
// 跳过版本号或物资名称为空的行
|
||||
if (!current.batchNumber || !current.suppliespriceId) continue;
|
||||
|
||||
for (let j = i + 1; j < planList.length; j++) {
|
||||
const compare = planList[j];
|
||||
if (!compare.batchNumber || !compare.suppliespriceId) continue;
|
||||
|
||||
// 版本号和物资ID都相同则判定为重复
|
||||
if (current.batchNumber === compare.batchNumber && current.suppliespriceId === compare.suppliespriceId) {
|
||||
current.duplicateError = `与第${j + 1}行重复(同版本+同物资)`;
|
||||
compare.duplicateError = `与第${i + 1}行重复(同版本+同物资)`;
|
||||
hasDuplicate = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return hasDuplicate;
|
||||
// 过滤掉已选中的物资
|
||||
return nameList.value.filter(item => !selectedIds.includes(item.id));
|
||||
};
|
||||
|
||||
/** 选择物资名称触发(新增索引参数,用于触发重复校验) */
|
||||
/** 选择物资名称触发 */
|
||||
const selectName = (val: number, row: PlanListItem, index: number) => {
|
||||
console.log(row);
|
||||
|
||||
// 1. 获取剩余量并更新基础信息
|
||||
getMrpBaseRemaining(val, row).then(() => {
|
||||
const selected = nameList.value.find((item: any) => item.id === val);
|
||||
@ -473,9 +446,6 @@ const selectName = (val: number, row: PlanListItem, index: number) => {
|
||||
row.remark = selected.remark || '';
|
||||
row.arrivalTime = selected.arrivalTime || '';
|
||||
}
|
||||
|
||||
// 2. 触发重复校验
|
||||
checkDuplicate();
|
||||
});
|
||||
};
|
||||
|
||||
@ -514,8 +484,6 @@ const delRow = (index: number) => {
|
||||
return proxy?.$modal.msgWarning('请至少保留一项物资数据');
|
||||
}
|
||||
form.value.planList.splice(index, 1);
|
||||
// 删除后重新校验重复(避免删除重复行后错误提示残留)
|
||||
checkDuplicate();
|
||||
};
|
||||
|
||||
/** 新增表格行 */
|
||||
@ -577,15 +545,15 @@ const handleUpdata = () => {
|
||||
if (!queryParams.value.mainData.mrpBaseId) {
|
||||
return proxy?.$modal.msgError('请先选择批次');
|
||||
}
|
||||
// 1. 获取对应版本的物资列表
|
||||
// 获取对应版本的物资列表
|
||||
reset();
|
||||
loading.value = true;
|
||||
getCailiaoshebei(queryParams.value.mainData.mrpBaseId)
|
||||
.then((res: any) => {
|
||||
// 1. 更新基础信息
|
||||
// 更新基础信息
|
||||
form.value.mrpBaseBo = res.data.mrpBaseBo || initFormData.mrpBaseBo;
|
||||
|
||||
// 2. 更新表格数据(补充缺失字段)
|
||||
// 更新表格数据(补充缺失字段)
|
||||
form.value.planList = (res.data.planList || []).map((item: any) => ({
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
@ -597,13 +565,12 @@ const handleUpdata = () => {
|
||||
arrivalTime: item.arrivalTime,
|
||||
remark: item.remark,
|
||||
Remaining: Number(item.remaining) || 0,
|
||||
// remaining:
|
||||
quantityError: '',
|
||||
batchNumber: item.batchNumber,
|
||||
duplicateError: '',
|
||||
mrpBaseId: item.mrpBaseId
|
||||
}));
|
||||
// 3. 打开对话框
|
||||
// 打开对话框
|
||||
dialog.visible = true;
|
||||
dialog.title = '修改物资-需求';
|
||||
})
|
||||
@ -617,38 +584,32 @@ const handleUpdata = () => {
|
||||
|
||||
/** 提交数据(整合所有校验) */
|
||||
const submitTransferForm = async () => {
|
||||
// 1. 先校验重复数据
|
||||
const hasDuplicate = checkDuplicate();
|
||||
if (hasDuplicate) {
|
||||
return proxy?.$modal.msgError('存在重复的版本号+物资组合,请修正后提交');
|
||||
}
|
||||
|
||||
// 2. 校验数量合法性(检查是否有数量错误)
|
||||
// 1. 校验数量合法性(检查是否有数量错误)
|
||||
const hasQuantityError = form.value.planList.some((row) => row.quantityError);
|
||||
if (hasQuantityError) {
|
||||
return proxy?.$modal.msgError('存在非法数量,请修正后提交');
|
||||
}
|
||||
|
||||
// 3. 执行表单基础验证
|
||||
// 2. 执行表单基础验证
|
||||
const result = validateAndClean(form.value.planList);
|
||||
if (!result.valid) {
|
||||
return proxy?.$modal.msgError(result.message);
|
||||
}
|
||||
|
||||
// 4. 表单组件验证
|
||||
// 3. 表单组件验证
|
||||
cailiaoshebeiFormRef.value?.validate(async (valid: boolean) => {
|
||||
if (!valid) return;
|
||||
|
||||
buttonLoading.value = true;
|
||||
try {
|
||||
// 5. 提交数据
|
||||
// 4. 提交数据
|
||||
await updateCailiaoshebei({
|
||||
...form.value,
|
||||
planList: result.data // 使用清洗后的数据
|
||||
});
|
||||
proxy?.$modal.msgSuccess('操作成功');
|
||||
dialog.visible = false;
|
||||
// 6. 刷新列表
|
||||
// 5. 刷新列表
|
||||
await getList();
|
||||
} catch (error) {
|
||||
proxy?.$modal.msgError('操作失败,请重试');
|
||||
@ -773,7 +734,7 @@ const getVersion = () => {
|
||||
});
|
||||
};
|
||||
|
||||
/** 选择版本号触发(新增索引参数,用于触发重复校验) */
|
||||
/** 选择版本号触发 */
|
||||
const selectNameVersion = (val: string, row: PlanListItem, index: number) => {
|
||||
row.batchNumber = val;
|
||||
row.suppliespriceId = undefined; // 切换版本号时清空物资选择
|
||||
@ -788,11 +749,8 @@ const selectNameVersion = (val: string, row: PlanListItem, index: number) => {
|
||||
row.duplicateError = '';
|
||||
row.mrpBaseId = '';
|
||||
|
||||
// 1. 获取对应版本的物资列表
|
||||
// 获取对应版本的物资列表
|
||||
getNameList(val);
|
||||
|
||||
// 2. 触发重复校验(清空物资后可能消除重复)
|
||||
checkDuplicate();
|
||||
};
|
||||
|
||||
/** 页面挂载时初始化 */
|
||||
|
@ -1,11 +1,13 @@
|
||||
<template>
|
||||
<div class="p-2">
|
||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter"
|
||||
:leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||
<div v-show="showSearch" class="mb-[10px]">
|
||||
<el-card shadow="hover">
|
||||
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="auto">
|
||||
<el-form-item label="材料名称" prop="materialsName">
|
||||
<el-input v-model="queryParams.materialsName" placeholder="请输入材料名称" clearable @keyup.enter="handleQuery" />
|
||||
<el-input v-model="queryParams.materialsName" placeholder="请输入材料名称" clearable
|
||||
@keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="材料提供商" prop="companyId">
|
||||
<el-select v-model="queryParams.companyId" clearable placeholder="全部">
|
||||
@ -25,20 +27,22 @@
|
||||
<template #header>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['materials:materials:add']"> 新增 </el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['materials:materials:edit']"
|
||||
>修改
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['materials:materials:add']"> 新增
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['materials:materials:remove']"
|
||||
>删除
|
||||
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
|
||||
v-hasPermi="['materials:materials:edit']">修改
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['materials:materials:export']">导出 </el-button>
|
||||
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
|
||||
v-hasPermi="['materials:materials:remove']">删除
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="Download" @click="handleExport"
|
||||
v-hasPermi="['materials:materials:export']">导出 </el-button>
|
||||
</el-col>
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
@ -68,20 +72,25 @@
|
||||
<el-table-column fixed="right" label="操作" align="center" class-name="small-padding fixed-width" width="320">
|
||||
<template #default="scope">
|
||||
<el-space>
|
||||
<el-button link type="primary" icon="View" @click="handleShowDrawer(scope.row)" v-hasPermi="['materials:materials:query']">
|
||||
<el-button link type="primary" icon="View" @click="handleShowDrawer(scope.row)"
|
||||
v-hasPermi="['materials:materials:query']">
|
||||
详情
|
||||
</el-button>
|
||||
<el-button link type="success" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['materials:materials:edit']"> 修改 </el-button>
|
||||
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['materials:materials:remove']">
|
||||
<el-button link type="success" icon="Edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['materials:materials:edit']"> 修改 </el-button>
|
||||
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['materials:materials:remove']">
|
||||
删除
|
||||
</el-button>
|
||||
<el-button link type="primary" icon="Plus" @click="handleAddMaterialsInventory(scope.row)"> 出入库 </el-button>
|
||||
<el-button v-hasPermi="['materials:materialsInventory:edit']" link type="primary" icon="Plus"
|
||||
@click="handleAddMaterialsInventory(scope.row)"> 出入库 </el-button>
|
||||
</el-space>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</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" />
|
||||
</el-card>
|
||||
<!-- 添加或修改材料名称对话框 -->
|
||||
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
|
||||
@ -112,17 +121,12 @@
|
||||
<el-form-item label="材料文件" prop="fileOssIdMap">
|
||||
<div :key="item.value" v-for="item in materials_file_type">
|
||||
<h3>{{ item.label }}</h3>
|
||||
<file-upload
|
||||
v-model="ossIdMap[item.value]"
|
||||
:limit="1"
|
||||
:file-size="50"
|
||||
:file-type="['pdf']"
|
||||
<file-upload v-model="ossIdMap[item.value]" :limit="1" :file-size="50" :file-type="['pdf']"
|
||||
@update:model-value="
|
||||
(args) => {
|
||||
handleOssUpdate(args, item.value);
|
||||
}
|
||||
"
|
||||
/>
|
||||
" />
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
@ -133,7 +137,8 @@
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<materials-inventory-add-dialog :materials-id="currentMaterialsId" :project-id="currentProject.id" ref="dialogRef" @submit="getList" />
|
||||
<materials-inventory-add-dialog :materials-id="currentMaterialsId" :project-id="currentProject.id" ref="dialogRef"
|
||||
@submit="getList" />
|
||||
<el-dialog title="材料详情" v-model="showDetailDrawer" width="700px">
|
||||
<materials-detail-drawer :materials-id="currentMaterialsId" />
|
||||
</el-dialog>
|
||||
|
@ -7,9 +7,6 @@
|
||||
<el-form-item label="表单编号" prop="formCode">
|
||||
<el-input v-model="queryParams.formCode" placeholder="请输入表单编号" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="工程名称" prop="projectName">
|
||||
<el-input v-model="queryParams.projectName" placeholder="请输入工程名称" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="材料名称" prop="materialName">
|
||||
<el-input v-model="queryParams.materialName" placeholder="请输入设备材料名称" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
@ -45,7 +42,6 @@
|
||||
<el-table v-loading="loading" :data="materialIssueList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="index" width="60" label="序号" align="center" />
|
||||
<el-table-column label="表单编号" align="center" prop="formCode" />
|
||||
<el-table-column label="工程名称" align="center" prop="projectName" />
|
||||
<el-table-column label="设备材料名称" align="center" prop="materialName" />
|
||||
<el-table-column label="订货单位" align="center" prop="orderingUnit" />
|
||||
<el-table-column label="供货单位" align="center" prop="supplierUnit" />
|
||||
@ -82,7 +78,7 @@
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="工程名称" prop="projectName">
|
||||
<el-input v-model="form.projectName" placeholder="请输入工程名称" />
|
||||
<el-input v-model="form.projectName" disabled placeholder="请输入工程名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
@ -206,28 +202,25 @@
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<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-col>
|
||||
<el-col :span="12">
|
||||
<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-col>
|
||||
<el-col :span="12">
|
||||
<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-col>
|
||||
<el-col :span="12">
|
||||
<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-col>
|
||||
<el-col :span="24">
|
||||
<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"> <span style="color: #ff0000ab; margin-bottom: 10px; display: block">注意:pdf/png/jpg/jpeg格式文件</span> </el-col
|
||||
><el-col :span="24">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
|
||||
@ -295,7 +288,7 @@ const getInitFormData = () => {
|
||||
projectId: currentProject.value?.id,
|
||||
materialSource: '1',
|
||||
formCode: undefined,
|
||||
projectName: undefined,
|
||||
projectName: currentProject.value?.name,
|
||||
materialName: '', // 初始化为空字符串
|
||||
orderingUnit: undefined,
|
||||
supplierUnit: undefined,
|
||||
|
@ -1,20 +1,23 @@
|
||||
<template>
|
||||
<div class="p-2">
|
||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter"
|
||||
:leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||
<div v-show="showSearch" class="mb-[10px]">
|
||||
<el-card shadow="hover">
|
||||
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
||||
<el-form-item label="表单编号" prop="formCode">
|
||||
<el-input v-model="queryParams.formCode" placeholder="请输入表单编号" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="工程名称" prop="projectName">
|
||||
<el-input v-model="queryParams.projectName" placeholder="请输入工程名称" clearable @keyup.enter="handleQuery" />
|
||||
<el-form-item label="材料来源" prop="materialSource">
|
||||
<el-select v-model="queryParams.materialSource" filterable placeholder="请选择材料来源">
|
||||
<el-option label="全部" value="0"></el-option>
|
||||
<el-option label="甲供材料" value="1"></el-option>
|
||||
<el-option label="乙供材料" value="2"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="材料名称" prop="materialName">
|
||||
<el-input v-model="queryParams.materialName" placeholder="请输入设备材料名称" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="合同编号" prop="contractName">
|
||||
<el-input v-model="queryParams.contractName" placeholder="请输入合同编号" clearable @keyup.enter="handleQuery" />
|
||||
<el-input v-model="queryParams.materialName" placeholder="请输入设备材料名称" clearable
|
||||
@keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="订货单位" prop="orderingUnit">
|
||||
<el-input v-model="queryParams.orderingUnit" placeholder="请输入订货单位" clearable @keyup.enter="handleQuery" />
|
||||
@ -35,7 +38,8 @@
|
||||
<template #header>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['materials:materialReceive:add']">新增</el-button>
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd"
|
||||
v-hasPermi="['materials:materialReceive:add']">新增</el-button>
|
||||
</el-col>
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
@ -44,11 +48,24 @@
|
||||
<el-table v-loading="loading" :data="materialReceiveList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="index" width="60" label="序号" align="center" />
|
||||
<el-table-column label="表单编号" align="center" prop="formCode" />
|
||||
<el-table-column label="工程名称" align="center" prop="projectName" />
|
||||
<el-table-column label="材料来源" align="center" prop="projectName">
|
||||
<template #default="scope">
|
||||
<el-tag :type="scope.row.materialSource == '1' ? 'success' : 'warning'">{{ scope.row.materialSource == '1' ?
|
||||
'甲供材料' : '乙供材料' }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="设备材料名称" align="center" prop="materialName" />
|
||||
<el-table-column label="合同名称" align="center" prop="contractName" />
|
||||
<el-table-column label="订货单位" align="center" prop="orderingUnit" />
|
||||
<el-table-column label="供货单位" align="center" prop="supplierUnit" />
|
||||
<el-table-column label="订货单位" align="center" prop="orderingUnit">
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.orderingUnit || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="供货单位" align="center" prop="supplierUnit">
|
||||
<template #default="scope">
|
||||
<span>{{ scope.row.supplierUnit || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="设备材料入库/移交" align="center" prop="storageType">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="storage_type" :value="scope.row.storageType" />
|
||||
@ -60,28 +77,20 @@
|
||||
<!-- <el-button link type="primary" icon="edit" @click="handleUpdate(scope.row)" v-hasPermi="['materials:materialReceive:edit']"
|
||||
>修改</el-button
|
||||
> -->
|
||||
<el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['materials:materialReceive:query']"
|
||||
>查看</el-button
|
||||
>
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['materials:materialReceive:remove']"
|
||||
>删除</el-button
|
||||
>
|
||||
<el-button link type="primary" icon="View" @click="handleView(scope.row)"
|
||||
v-hasPermi="['materials:materialReceive:query']">查看</el-button>
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['materials:materialReceive:remove']">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</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" />
|
||||
</el-card>
|
||||
|
||||
<!-- 添加或修改物料接收单对话框 -->
|
||||
<el-dialog
|
||||
:close-on-click-modal="false"
|
||||
:close-on-press-escape="false"
|
||||
draggable
|
||||
:title="dialog.title"
|
||||
v-model="dialog.visible"
|
||||
width="800px"
|
||||
append-to-body
|
||||
>
|
||||
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" draggable :title="dialog.title"
|
||||
v-model="dialog.visible" width="800px" append-to-body>
|
||||
<el-form ref="materialReceiveFormRef" :model="form" :rules="rules" label-width="110px">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
@ -99,8 +108,10 @@
|
||||
</el-col>
|
||||
<el-col v-if="form.materialSource == '2'" :span="12">
|
||||
<el-form-item label="采购单编号" prop="docId">
|
||||
<el-select @change="handleSelect" v-model="form.docId" filterable placeholder="请选择采购单" style="width: 100%">
|
||||
<el-option v-for="item in purchaseDocList" :key="item.id" :label="item.docCode" :value="item.id"></el-option>
|
||||
<el-select @change="handleSelect" v-model="form.docId" filterable placeholder="请选择采购单"
|
||||
style="width: 100%">
|
||||
<el-option v-for="item in purchaseDocList" :key="item.id" :label="item.docCode"
|
||||
:value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -119,15 +130,11 @@
|
||||
<el-input disabled v-model="form.projectName" placeholder="请输入工程名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-col :span="12" v-if="form.materialSource == '2'">
|
||||
<el-form-item label="合同编号" prop="contractName">
|
||||
<el-select v-model="form.contractName" filterable placeholder="请选择合同" style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in contractNameList"
|
||||
:key="item.contractCode"
|
||||
:label="item.contractCode"
|
||||
:value="item.contractCode"
|
||||
></el-option>
|
||||
<el-option v-for="item in contractNameList" :key="item.contractCode" :label="item.contractCode"
|
||||
:value="item.contractCode"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -142,59 +149,48 @@
|
||||
<div class="detail">
|
||||
<div class="detail-header">
|
||||
<span>数量验收</span>
|
||||
<el-button type="primary" v-if="form.materialSource == '1'" link @click="addItem" icon="Plus">添加数量验收</el-button>
|
||||
<el-button type="primary" v-if="form.materialSource == '1'" link @click="addItem"
|
||||
icon="Plus">添加数量验收</el-button>
|
||||
</div>
|
||||
<div v-for="(item, index) in form.itemList" :key="item.id" class="detail-item">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="名称" :prop="`itemList.${index}.name`" :rules="{ required: true, message: '名称不能为空', trigger: 'blur' }">
|
||||
<el-form-item label="名称" :prop="`itemList.${index}.name`"
|
||||
:rules="{ required: true, message: '名称不能为空', trigger: 'blur' }">
|
||||
<el-input :disabled="form.materialSource == '2'" v-model="item.name" placeholder="请输入名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
label="规格"
|
||||
:prop="`itemList.${index}.specification`"
|
||||
:rules="{ required: true, message: '规格不能为空', trigger: 'blur' }"
|
||||
>
|
||||
<el-input :disabled="form.materialSource == '2'" v-model="item.specification" placeholder="请输入规格" />
|
||||
<el-form-item label="规格" :prop="`itemList.${index}.specification`"
|
||||
:rules="{ required: true, message: '规格不能为空', trigger: 'blur' }">
|
||||
<el-input :disabled="form.materialSource == '2'" v-model="item.specification"
|
||||
placeholder="请输入规格" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="单位" :prop="`itemList.${index}.unit`" :rules="{ required: true, message: '单位不能为空', trigger: 'blur' }">
|
||||
<el-form-item label="单位" :prop="`itemList.${index}.unit`"
|
||||
:rules="{ required: true, message: '单位不能为空', trigger: 'blur' }">
|
||||
<el-input :disabled="form.materialSource == '2'" v-model="item.unit" placeholder="请输入单位" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="数量" :prop="`itemList.${index}.quantity`" :rules="rules.quantityRule" ref="quantityFormItemRefs[index]">
|
||||
<el-input
|
||||
:disabled="form.materialSource == '2'"
|
||||
type="number"
|
||||
v-model.number="item.quantity"
|
||||
placeholder="请输入数量"
|
||||
min="0"
|
||||
@input="handleQuantityInput(index)"
|
||||
@blur="handleQuantityBlur(index)"
|
||||
/>
|
||||
<el-form-item label="数量" :prop="`itemList.${index}.quantity`" :rules="rules.quantityRule"
|
||||
ref="quantityFormItemRefs[index]">
|
||||
<el-input :disabled="form.materialSource == '2'" type="number" v-model.number="item.quantity"
|
||||
placeholder="请输入数量" min="0" @input="handleQuantityInput(index)"
|
||||
@blur="handleQuantityBlur(index)" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="验收" :prop="`itemList.${index}.acceptedQuantity`" :rules="rules.acceptedQuantityRule">
|
||||
<el-input
|
||||
type="number"
|
||||
v-model.number="item.acceptedQuantity"
|
||||
placeholder="请输入验收"
|
||||
min="0"
|
||||
@input="handleAcceptedInput(index)"
|
||||
/>
|
||||
<el-form-item label="验收" :prop="`itemList.${index}.acceptedQuantity`"
|
||||
:rules="rules.acceptedQuantityRule">
|
||||
<el-input type="number" v-model.number="item.acceptedQuantity" placeholder="请输入验收" min="0"
|
||||
@input="handleAcceptedInput(index)" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
label="缺件"
|
||||
:prop="`itemList.${index}.shortageQuantity`"
|
||||
:rules="{ required: true, message: '缺件数量不能为空', trigger: 'blur' }"
|
||||
>
|
||||
<el-form-item label="缺件" :prop="`itemList.${index}.shortageQuantity`"
|
||||
:rules="{ required: true, message: '缺件数量不能为空', trigger: 'blur' }">
|
||||
<el-input type="number" min="0" v-model="item.shortageQuantity" placeholder="自动计算" readonly />
|
||||
<span class="tips">*自动计算(数量-验收数量)</span>
|
||||
</el-form-item>
|
||||
@ -216,22 +212,26 @@
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="合格证文件" prop="certCountFileId">
|
||||
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.certCountFileId" />
|
||||
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']"
|
||||
v-model="form.certCountFileId" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="出厂报告文件" prop="reportCountFileId">
|
||||
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.reportCountFileId" />
|
||||
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']"
|
||||
v-model="form.reportCountFileId" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="技术资料文件" prop="techDocCountFileId">
|
||||
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.techDocCountFileId" />
|
||||
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']"
|
||||
v-model="form.techDocCountFileId" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="厂家资质文件" prop="licenseCountFileId">
|
||||
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']" v-model="form.licenseCountFileId" />
|
||||
<file-upload :isShowTip="false" :fileType="['pdf', 'png', 'jpg', 'jpeg']"
|
||||
v-model="form.licenseCountFileId" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
@ -357,7 +357,7 @@ const data = reactive({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectId: currentProject.value?.id,
|
||||
materialSource: '1',
|
||||
materialSource: '0',
|
||||
formCode: undefined,
|
||||
projectName: undefined,
|
||||
materialName: undefined,
|
||||
@ -412,6 +412,9 @@ const { queryParams, form, rules } = toRefs(data);
|
||||
const getList = async () => {
|
||||
loading.value = true;
|
||||
try {
|
||||
if(queryParams.value.materialSource=='0'){
|
||||
delete queryParams.value.materialSource;
|
||||
}
|
||||
const res = await listMaterialReceive(queryParams.value);
|
||||
materialReceiveList.value = res.rows;
|
||||
total.value = res.total;
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<el-dialog v-model="isShowDialog" title="材料设备详情" draggable width="1200px" :close-on-click-modal="false" :destroy-on-close="true">
|
||||
<el-card :body-style="{ padding: '20px' }" style="border: none; box-shadow: none">
|
||||
<div class="dialog-footer">
|
||||
<div class="dialog-footer" v-hasPermi="['materials:materialReceive:exportWord']">
|
||||
<div class="btn-item" @click="onLoad">
|
||||
<img src="./icon/down.png" />
|
||||
<span>导出</span>
|
||||
|
@ -11,6 +11,25 @@
|
||||
<el-form-item v-if="state.masterData.status == 'waiting' || state.masterData.status == 'finish'">
|
||||
<el-button icon="view" @click="lookApprovalFlow()" type="warning">查看流程</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<file-upload
|
||||
upload-url="/design/totalsupplyplan/import"
|
||||
v-model="file"
|
||||
:limit="1"
|
||||
:file-type="['xls', 'xlsx']"
|
||||
:on-upload-success="handleSuccess"
|
||||
>
|
||||
<el-button :disabled="state.masterData.status == 'finish'" type="primary" plain icon="upload">导入</el-button>
|
||||
</file-upload>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" plain icon="Download" @click="handleExport">导出</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="Finished" @click="editApprovalSheet()" type="success" :disabled="state.masterData.status == 'finish'"
|
||||
>一键全部保存</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<right-toolbar @queryTable="getMasterDataList"></right-toolbar>
|
||||
</el-row>
|
||||
@ -23,25 +42,83 @@
|
||||
style="width: 100%; margin-bottom: 20px; height: calc(100vh - 230px)"
|
||||
row-key="id"
|
||||
border
|
||||
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
|
||||
>
|
||||
<el-table-column prop="num" label="编号" />
|
||||
<el-table-column align="center" prop="num" label="编号" />
|
||||
<el-table-column prop="name" label="工程或费用名称" width="180" />
|
||||
<el-table-column prop="unit" label="单位" />
|
||||
<el-table-column prop="specification" label="规格型号" />
|
||||
<el-table-column prop="quantity" label="数量" width="60" />
|
||||
<el-table-column prop="specification" label="规格型号" width="80" />
|
||||
<el-table-column prop="quantity" label="数量" width="100" />
|
||||
<el-table-column prop="batchNumber" label="批次号" width="200" />
|
||||
<el-table-column prop="brand" label="品牌" />
|
||||
<el-table-column prop="texture" label="材质" />
|
||||
<el-table-column prop="qualityStandard" label="质量标准" />
|
||||
<el-table-column prop="partUsed" label="使用部位" />
|
||||
<el-table-column prop="deliveryPoints" label="交货地点" />
|
||||
<el-table-column label="预计使用日期">
|
||||
<el-table-column prop="brand" label="品牌">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.dateService ? row.dateService.split(' ')[0] : '' }}</span>
|
||||
<el-input
|
||||
v-model="row.brand"
|
||||
:disabled="state.masterData.status != 'draft'"
|
||||
v-if="!(row.children && row.children.length > 0)"
|
||||
placeholder=""
|
||||
clearable
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="texture" label="材质">
|
||||
<template #default="{ row }">
|
||||
<el-input
|
||||
v-model="row.texture"
|
||||
:disabled="state.masterData.status != 'draft'"
|
||||
v-if="!(row.children && row.children.length > 0)"
|
||||
placeholder=""
|
||||
clearable
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="qualityStandard" label="质量标准">
|
||||
<template #default="{ row }">
|
||||
<el-input
|
||||
:disabled="state.masterData.status != 'draft'"
|
||||
v-model="row.qualityStandard"
|
||||
v-if="!(row.children && row.children.length > 0)"
|
||||
placeholder=""
|
||||
clearable
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="partUsed" label="使用部位">
|
||||
<template #default="{ row }">
|
||||
<el-input
|
||||
:disabled="state.masterData.status != 'draft'"
|
||||
v-model="row.partUsed"
|
||||
v-if="!(row.children && row.children.length > 0)"
|
||||
placeholder=""
|
||||
clearable
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="deliveryPoints" label="交货地点">
|
||||
<template #default="{ row }">
|
||||
<el-input
|
||||
:disabled="state.masterData.status != 'draft'"
|
||||
v-model="row.deliveryPoints"
|
||||
v-if="!(row.children && row.children.length > 0)"
|
||||
placeholder=""
|
||||
clearable
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="预计使用日期" width="150">
|
||||
<template #default="{ row }">
|
||||
<el-date-picker
|
||||
v-model="row.dateService"
|
||||
v-if="!(row.children && row.children.length > 0)"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD"
|
||||
:disabled="state.masterData.status != 'draft'"
|
||||
placeholder="请选择日期"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="remark" label="备注" />
|
||||
<el-table-column label="操作">
|
||||
<!-- <el-table-column label="操作">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
:disabled="state.masterData.status == 'waiting' || state.masterData.status == 'finish'"
|
||||
@ -51,7 +128,7 @@
|
||||
>修改</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column> -->
|
||||
</el-table>
|
||||
<!-- 编辑 -->
|
||||
<el-dialog v-model="visible" title="修改物料信息" :width="800" :close-on-click-modal="false" @close="handleClose">
|
||||
@ -124,7 +201,8 @@ import {
|
||||
obtainMasterDataList,
|
||||
totalsupplyplan,
|
||||
totalSupplyplanDetails,
|
||||
materialChangeSupplyplan
|
||||
materialChangeSupplyplan,
|
||||
totalSupplyplanBatchEdit
|
||||
} from '@/api/materials/overallPlanMaterialSupply/index';
|
||||
import { useUserStoreHook } from '@/store/modules/user';
|
||||
const userStore = useUserStoreHook();
|
||||
@ -210,7 +288,8 @@ async function getMasterDataList() {
|
||||
|
||||
// 处理结果
|
||||
if (supplyPlanRes.list == null) {
|
||||
state.tableData = supplyPlanRes.rows || [];
|
||||
// state.tableData = supplyPlanRes.rows || [];
|
||||
state.tableData = proxy?.handleTree(supplyPlanRes.rows, 'sid', 'pid');
|
||||
console.log('state.tableData', state.tableData);
|
||||
} else {
|
||||
// 根据实际业务逻辑处理有list的情况
|
||||
@ -261,11 +340,13 @@ async function totalSupplyplanDetail(id) {
|
||||
}
|
||||
}
|
||||
// 修改
|
||||
function editApprovalSheet(row) {
|
||||
console.log(row);
|
||||
totalSupplyplanDetail(row.id);
|
||||
visible.value = true;
|
||||
}
|
||||
const editApprovalSheet = async () => {
|
||||
state.loading.list = true;
|
||||
await totalSupplyplanBatchEdit(state.tableData);
|
||||
proxy.$modal.msgSuccess('修改成功');
|
||||
|
||||
state.loading.list = false;
|
||||
};
|
||||
// 提交表单
|
||||
const handleSubmit = async () => {
|
||||
try {
|
||||
@ -292,6 +373,17 @@ function editMaterialSupply(formData) {
|
||||
});
|
||||
}
|
||||
|
||||
const handleExport = async () => {
|
||||
proxy?.download(
|
||||
'/design/totalsupplyplan/export',
|
||||
{
|
||||
projectId: currentProject.value?.id
|
||||
},
|
||||
`物资供应总计划.xlsx`,
|
||||
true
|
||||
);
|
||||
};
|
||||
|
||||
// 关闭弹窗
|
||||
const handleClose = () => {
|
||||
visible.value = false;
|
||||
|
@ -16,7 +16,7 @@
|
||||
<!-- 表单区域 -->
|
||||
<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>
|
||||
<h3 class="text-lg font-semibold text-gray-800">物质供应总计划</h3>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<!-- <el-form ref="leaveFormRef" v-loading="loading" :disabled="routeParams.type === 'view' || form.status == 'waiting' || routeParams.type === 'update'" :model="form"
|
||||
@ -148,7 +148,7 @@ const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
|
||||
const flowCodeOptions = [
|
||||
{
|
||||
value: currentProject.value?.id + '_totalsupplyplan',
|
||||
label: '物资总计划审核'
|
||||
label: '物质供应总计划审核'
|
||||
}
|
||||
];
|
||||
|
||||
@ -214,7 +214,7 @@ const getInfo = () => {
|
||||
console.log('res.data', masterDataRes);
|
||||
Object.assign(form.value, masterDataRes?.data[0]);
|
||||
// console.log('form', form.value);
|
||||
tableData.value = res.rows;
|
||||
tableData.value = res.rows.reverse();//翻转
|
||||
loading.value = false;
|
||||
buttonLoading.value = false;
|
||||
});
|
||||
|
@ -10,9 +10,9 @@
|
||||
<el-form-item label="设备统称" prop="name">
|
||||
<el-input v-model="queryParams.name" placeholder="请输入设备统称" clearable @keyup.enter="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="到货日期" prop="arrivalDate">
|
||||
<!-- <el-form-item label="到货日期" prop="arrivalDate">
|
||||
<el-date-picker clearable v-model="queryParams.arrivalDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择到货日期" />
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
<el-form-item>
|
||||
<el-button type="primary" v-hasPermi="['cailiaoshebei:purchaseDoc:list']" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
|
||||
@ -116,7 +116,7 @@
|
||||
<el-button link type="primary" icon="View" @click="handleDetail(scope.row)" v-hasPermi="['cailiaoshebei:purchaseDoc:remove']"
|
||||
>详情</el-button
|
||||
>
|
||||
<el-button link type="primary" icon="Download" @click="handleDownload(scope.row)" v-hasPermi="['cailiaoshebei:purchaseDoc:downloadWord']"
|
||||
<el-button link type="primary" icon="Download" @click="handleDownload(scope.row)" v-hasPermi="['cailiaoshebei:purchaseDoc:exportWord']"
|
||||
>下载</el-button
|
||||
>
|
||||
</template>
|
||||
|
@ -1,23 +1,12 @@
|
||||
<template>
|
||||
<div style="padding: 20px">
|
||||
<el-card class="mb-5">
|
||||
<el-button
|
||||
type="primary"
|
||||
v-hasPermi="['cailiaoshebei:physicalsupply:add']"
|
||||
icon="Plus"
|
||||
@click="handleAdd"
|
||||
class="transition-all duration-200 hover:shadow-md"
|
||||
>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-hasPermi="['cailiaoshebei:physicalsupply:list']"
|
||||
icon="Refresh"
|
||||
@click="refreshData"
|
||||
class="transition-all duration-200 hover:shadow-md"
|
||||
>
|
||||
刷新
|
||||
</el-button>
|
||||
<el-card class="mb-5" shadow="never">
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
|
||||
</el-col>
|
||||
<right-toolbar @queryTable="refreshData"></right-toolbar>
|
||||
</el-row>
|
||||
</el-card>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
@ -258,7 +247,6 @@ const formRules = reactive({
|
||||
const queryParams = reactive({
|
||||
pageSize: 10,
|
||||
pageNum: 1,
|
||||
findType: 1,
|
||||
projectId: currentProject.value?.id
|
||||
});
|
||||
|
||||
|
@ -58,7 +58,19 @@
|
||||
<!-- 添加或修改施工产值对话框 -->
|
||||
<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-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
|
||||
:options="matrixOptions"
|
||||
placeholder="请选择"
|
||||
@ -81,7 +93,7 @@
|
||||
clearable
|
||||
>
|
||||
</el-cascader>
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="计划日期" prop="reportDateId" v-if="!form.id">
|
||||
<el-cascader
|
||||
:options="progressTimeList"
|
||||
@ -129,6 +141,7 @@ import {
|
||||
updateConstructionValue
|
||||
} from '@/api/out/constructionValue';
|
||||
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 { ProgressCategoryVO } from '@/api/progress/plan/types';
|
||||
|
||||
@ -216,7 +229,7 @@ const data = reactive<PageData<ConstructionValueForm, ConstructionValueQuery>>({
|
||||
});
|
||||
|
||||
const { queryParams, form, rules } = toRefs(data);
|
||||
|
||||
const ProjectStructureList = ref([]);
|
||||
/** 查询施工产值列表 */
|
||||
const getList = async () => {
|
||||
loading.value = true;
|
||||
@ -260,19 +273,19 @@ const handleSelectionChange = (selection: ConstructionValueVO[]) => {
|
||||
/** 新增按钮操作 */
|
||||
const handleAdd = async () => {
|
||||
reset();
|
||||
const res = await getProjectSquare(currentProject.value?.id);
|
||||
if (res.data.length === 0) return proxy?.$modal.msgWarning('当前项目下没有方阵,请先创建方阵');
|
||||
const isFangzhen = res.data.some((item) => item.children && item.children.length);
|
||||
console.log('🚀 ~ handleAdd ~ isFangzhen:', isFangzhen);
|
||||
// const res = await getProjectSquare(currentProject.value?.id);
|
||||
// if (res.data.length === 0) return proxy?.$modal.msgWarning('当前项目下没有方阵,请先创建方阵');
|
||||
// const isFangzhen = res.data.some((item) => item.children && item.children.length);
|
||||
// console.log('🚀 ~ handleAdd ~ isFangzhen:', isFangzhen);
|
||||
|
||||
if (!isFangzhen) return proxy?.$modal.msgWarning('当前项目下没有方阵,请先创建方阵');
|
||||
let matrixList = res.data.map((item) => {
|
||||
return {
|
||||
...item,
|
||||
matrixId: item?.projectId
|
||||
};
|
||||
});
|
||||
matrixOptions.value = matrixList;
|
||||
// if (!isFangzhen) return proxy?.$modal.msgWarning('当前项目下没有方阵,请先创建方阵');
|
||||
// let matrixList = res.data.map((item) => {
|
||||
// return {
|
||||
// ...item,
|
||||
// matrixId: item?.projectId
|
||||
// };
|
||||
// });
|
||||
// matrixOptions.value = matrixList;
|
||||
dialog.visible = true;
|
||||
dialog.title = '添加施工产值';
|
||||
};
|
||||
@ -304,6 +317,18 @@ const submitTime = async (value: string) => {
|
||||
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) => {
|
||||
if (index) {
|
||||
@ -370,6 +395,7 @@ const handleExport = () => {
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
getProjectStructureList();
|
||||
getList();
|
||||
});
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
<el-date-picker v-model="queryParams.planMonth" type="month" value-format="YYYY-MM" placeholder="请选择计划月份" />
|
||||
</el-form-item>
|
||||
<el-form-item label="产值类型" prop="valueType">
|
||||
<el-select v-model="queryParams.valueType" placeholder="请选择产值类型">
|
||||
<el-select v-model="queryParams.valueType" placeholder="全部">
|
||||
<el-option v-for="item in out_value_type" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
@ -40,9 +40,9 @@
|
||||
<el-table v-loading="loading" :data="monthPlanList">
|
||||
<el-table-column type="index" label="序号" width="55" align="center" />
|
||||
<el-table-column label="计划月份" align="center" prop="planMonth" />
|
||||
<el-table-column label="计划产值" align="center" prop="planValue" />
|
||||
<el-table-column label="完成产值" align="center" prop="completeValue" />
|
||||
<el-table-column label="差额" align="center" prop="differenceValue" />
|
||||
<el-table-column label="计划产值(元)" align="center" prop="planValue" />
|
||||
<el-table-column label="完成产值(元)" align="center" prop="completeValue" />
|
||||
<el-table-column label="差额(元)" align="center" prop="differenceValue" />
|
||||
<el-table-column label="产值类型" align="center" prop="valueType">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="out_value_type" :value="scope.row.valueType" />
|
||||
@ -72,17 +72,17 @@
|
||||
</el-card>
|
||||
<!-- 添加或修改月度产值计划对话框 -->
|
||||
<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="120px">
|
||||
<el-form-item label="类型" prop="planValue">
|
||||
<el-select v-model="form.type" placeholder="请选择类型">
|
||||
<el-option label="对甲" value="1" />
|
||||
<el-option label="对乙" value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="计划产值" prop="planValue">
|
||||
<el-form-item label="计划产值(元)" prop="planValue">
|
||||
<el-input v-model="form.planValue" placeholder="请输入计划产值" type="number" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划月份" prop="planMonth">
|
||||
<el-form-item label="计划月份(元)" prop="planMonth">
|
||||
<el-date-picker v-model="form.planMonth" type="month" value-format="YYYY-MM" placeholder="请选择计划月份" />
|
||||
</el-form-item>
|
||||
<el-form-item label="产值类型" prop="valueType">
|
||||
@ -113,6 +113,13 @@ import { useUserStoreHook } from '@/store/modules/user';
|
||||
const userStore = useUserStoreHook();
|
||||
// 从 store 中获取项目列表和当前选中的项目
|
||||
const currentProject = computed(() => userStore.selectedProject);
|
||||
const month = computed(() => {
|
||||
const now = new Date();
|
||||
const year = now.getFullYear();
|
||||
const month = String(now.getMonth() + 1).padStart(2, '0'); // getMonth() 从0开始
|
||||
const currentMonth = `${year}-${month}`;
|
||||
return currentMonth;
|
||||
});
|
||||
const monthPlanList = ref<MonthPlanVO[]>([]);
|
||||
const buttonLoading = ref(false);
|
||||
const loading = ref(true);
|
||||
@ -152,7 +159,8 @@ const data = reactive({
|
||||
planValue: undefined,
|
||||
completeValue: undefined,
|
||||
differenceValue: undefined,
|
||||
planMonth: undefined,
|
||||
planMonth: month.value,
|
||||
|
||||
valueType: undefined,
|
||||
planAuditStatus: undefined,
|
||||
completeAuditStatus: undefined,
|
||||
|
@ -32,10 +32,10 @@
|
||||
|
||||
<el-table v-loading="loading" :data="monthPlanAuditList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="设计产值" align="center" prop="designValue" />
|
||||
<el-table-column label="采购产值" align="center" prop="purchaseValue" />
|
||||
<el-table-column label="施工产值" align="center" prop="constructionValue" />
|
||||
<el-table-column label="总产值" align="center" prop="totalValue" />
|
||||
<el-table-column label="设计产值(元)" align="center" prop="designValue" />
|
||||
<el-table-column label="采购产值(元)" align="center" prop="purchaseValue" />
|
||||
<el-table-column label="施工产值(元)" align="center" prop="constructionValue" />
|
||||
<el-table-column label="总产值(元)" align="center" prop="totalValue" />
|
||||
<el-table-column label="计划月份" align="center" prop="planMonth" />
|
||||
</el-table>
|
||||
|
||||
@ -44,16 +44,16 @@
|
||||
<!-- 添加或修改审核通过月度产值计划对话框 -->
|
||||
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
|
||||
<el-form ref="monthPlanAuditFormRef" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="设计产值" prop="designValue">
|
||||
<el-form-item label="设计产值(元)" prop="designValue">
|
||||
<el-input v-model="form.designValue" placeholder="请输入设计产值" />
|
||||
</el-form-item>
|
||||
<el-form-item label="采购产值" prop="purchaseValue">
|
||||
<el-form-item label="采购产值(元)" prop="purchaseValue">
|
||||
<el-input v-model="form.purchaseValue" placeholder="请输入采购产值" />
|
||||
</el-form-item>
|
||||
<el-form-item label="施工产值" prop="constructionValue">
|
||||
<el-form-item label="施工产值(元)" prop="constructionValue">
|
||||
<el-input v-model="form.constructionValue" placeholder="请输入施工产值" />
|
||||
</el-form-item>
|
||||
<el-form-item label="总产值" prop="totalValue">
|
||||
<el-form-item label="总产值(元)" prop="totalValue">
|
||||
<el-input v-model="form.totalValue" placeholder="请输入总产值" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划月份" prop="planMonth">
|
||||
@ -80,6 +80,13 @@ import { useUserStoreHook } from '@/store/modules/user';
|
||||
const userStore = useUserStoreHook();
|
||||
// 从 store 中获取项目列表和当前选中的项目
|
||||
const currentProject = computed(() => userStore.selectedProject);
|
||||
const month = computed(() => {
|
||||
const now = new Date();
|
||||
const year = now.getFullYear();
|
||||
const month = String(now.getMonth() + 1).padStart(2, '0'); // getMonth() 从0开始
|
||||
const currentMonth = `${year}-${month}`;
|
||||
return currentMonth;
|
||||
});
|
||||
const monthPlanAuditList = ref<MonthPlanAuditVO[]>([]);
|
||||
const buttonLoading = ref(false);
|
||||
const loading = ref(true);
|
||||
@ -116,7 +123,7 @@ const data = reactive<PageData<MonthPlanAuditForm, MonthPlanAuditQuery>>({
|
||||
purchaseValue: undefined,
|
||||
constructionValue: undefined,
|
||||
totalValue: undefined,
|
||||
planMonth: undefined,
|
||||
planMonth: month.value,
|
||||
params: {}
|
||||
},
|
||||
rules: {
|
||||
|
@ -24,8 +24,8 @@
|
||||
<!-- 添加或修改月度产值计划对话框 -->
|
||||
<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-item label="金额" prop="unitPrice">
|
||||
<el-input v-model="form.unitPrice" placeholder="请输入金额" type="number" />
|
||||
<el-form-item label="接收数量" prop="acceptedQuantity">
|
||||
<el-input v-model="form.acceptedQuantity" placeholder="请输入接收数量" type="number" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
@ -76,7 +76,8 @@ const initFormData = {
|
||||
valueType: undefined,
|
||||
planAuditStatus: undefined,
|
||||
completeAuditStatus: undefined,
|
||||
unitPrice: undefined
|
||||
unitPrice: undefined,
|
||||
acceptedQuantity: undefined
|
||||
};
|
||||
const data = reactive({
|
||||
form: { ...initFormData },
|
||||
|
@ -93,7 +93,14 @@
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="140">
|
||||
<template #default="scope">
|
||||
<el-tooltip content="修改进度" placement="top">
|
||||
<el-button link type="primary" icon="Edit" size="small" @click="handleProgressUpdate(scope.row)"></el-button>
|
||||
<el-button
|
||||
link
|
||||
type="primary"
|
||||
v-hasPermi="['patch:master:editProgress']"
|
||||
icon="Edit"
|
||||
size="small"
|
||||
@click="handleProgressUpdate(scope.row)"
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip content="删除进度" placement="top">
|
||||
<el-button
|
||||
|
@ -1,7 +1,6 @@
|
||||
<template>
|
||||
<div class="p-2">
|
||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter"
|
||||
:leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||
<div v-show="showSearch" class="mb-[10px]">
|
||||
<el-card shadow="hover">
|
||||
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
||||
@ -10,8 +9,7 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
|
||||
<el-option v-for="dict in project_construction_status" :key="dict.value" :label="dict.label"
|
||||
:value="dict.value" />
|
||||
<el-option v-for="dict in project_construction_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
@ -27,8 +25,7 @@
|
||||
<template #header>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd()"
|
||||
v-hasPermi="['progress:constructionSchedulePlan:add']">新增</el-button>
|
||||
<el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['progress:constructionSchedulePlan:add']">新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<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>
|
||||
</el-row>
|
||||
</template>
|
||||
<el-table ref="constructionSchedulePlanTableRef" v-loading="loading" :data="constructionSchedulePlanList"
|
||||
row-key="id" :default-expand-all="isExpandAll"
|
||||
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
|
||||
<el-table
|
||||
ref="constructionSchedulePlanTableRef"
|
||||
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="节点名称" prop="nodeName" />
|
||||
<el-table-column label="对应项目结构" align="center" prop="projectStructureName" />
|
||||
@ -71,16 +73,19 @@
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template #default="scope">
|
||||
<el-tooltip content="修改" placement="top">
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['progress:constructionSchedulePlan:edit']" />
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['progress:constructionSchedulePlan:edit']" />
|
||||
</el-tooltip>
|
||||
<el-tooltip content="新增" placement="top">
|
||||
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)"
|
||||
v-hasPermi="['progress:constructionSchedulePlan:add']" />
|
||||
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['progress:constructionSchedulePlan:add']" />
|
||||
</el-tooltip>
|
||||
<el-tooltip content="删除" placement="top">
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['progress:constructionSchedulePlan:remove']" />
|
||||
<el-button
|
||||
link
|
||||
type="primary"
|
||||
icon="Delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['progress:constructionSchedulePlan:remove']"
|
||||
/>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -90,39 +95,57 @@
|
||||
<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-item label="父节点" prop="parentId">
|
||||
<el-tree-select v-model="form.parentId" :data="constructionSchedulePlanOptions"
|
||||
:props="{ value: 'id', label: 'nodeName', children: 'children' }" value-key="id" placeholder="请选择父节点"
|
||||
check-strictly />
|
||||
<el-tree-select
|
||||
v-model="form.parentId"
|
||||
:data="constructionSchedulePlanOptions"
|
||||
:props="{ value: 'id', label: 'nodeName', children: 'children' }"
|
||||
value-key="id"
|
||||
placeholder="请选择父节点"
|
||||
check-strictly
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="节点名称" prop="nodeName">
|
||||
<el-input v-model="form.nodeName" placeholder="请输入节点名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="对应项目结构" prop="projectStructure">
|
||||
<el-tree-select v-model="form.projectStructure" :data="ProjectStructureList" @node-click="handleCheckChange"
|
||||
:props="{ value: 'id', label: 'name', children: 'children' }" value-key="id" placeholder="请选择项目结构"
|
||||
check-strictly />
|
||||
<el-tree-select
|
||||
v-model="form.projectStructure"
|
||||
: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-form-item>
|
||||
<el-form-item label="预计开始时间" prop="planStartDate">
|
||||
<el-date-picker clearable v-model="form.planStartDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="选择预计开始时间" />
|
||||
<el-date-picker clearable v-model="form.planStartDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择预计开始时间" />
|
||||
</el-form-item>
|
||||
<el-form-item label="预计结束时间" prop="planEndDate">
|
||||
<el-date-picker clearable v-model="form.planEndDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="选择预计结束时间" />
|
||||
<el-date-picker clearable v-model="form.planEndDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择预计结束时间" />
|
||||
</el-form-item>
|
||||
<el-form-item label="实际开始时间" prop="practicalStartDate">
|
||||
<el-date-picker clearable v-model="form.practicalStartDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="选择实际开始时间" />
|
||||
<el-date-picker
|
||||
clearable
|
||||
v-model="form.practicalStartDate"
|
||||
type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="选择实际开始时间"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="实际结束时间" prop="practicalEndDate">
|
||||
<el-date-picker clearable v-model="form.practicalEndDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="选择实际结束时间" />
|
||||
<el-date-picker
|
||||
clearable
|
||||
v-model="form.practicalEndDate"
|
||||
type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="选择实际结束时间"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="form.status" placeholder="请选择状态">
|
||||
<el-option v-for="dict in project_construction_status" :key="dict.value" :label="dict.label"
|
||||
:value="dict.value" />
|
||||
<el-option v-for="dict in project_construction_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
@ -145,7 +168,8 @@ import {
|
||||
getConstructionSchedulePlan,
|
||||
delConstructionSchedulePlan,
|
||||
addConstructionSchedulePlan,
|
||||
updateConstructionSchedulePlan, getProjectStructure
|
||||
updateConstructionSchedulePlan,
|
||||
getProjectStructure
|
||||
} from '@/api/progress/constructionSchedulePlan';
|
||||
import {
|
||||
ConstructionSchedulePlanVO,
|
||||
@ -196,7 +220,6 @@ const initFormData = {
|
||||
status: undefined,
|
||||
remark: undefined,
|
||||
projectStructureName: undefined
|
||||
|
||||
};
|
||||
|
||||
const data = reactive<PageData<ConstructionSchedulePlanForm, ConstructionSchedulePlanQuery>>({
|
||||
@ -243,7 +266,7 @@ const handleCheckChange = (val) => {
|
||||
|
||||
/** 查询施工进度计划下拉树结构 */
|
||||
const getTreeselect = async () => {
|
||||
const res = await listConstructionSchedulePlan();
|
||||
const res = await listConstructionSchedulePlan({ projectId: currentProject.value?.id });
|
||||
constructionSchedulePlanOptions.value = [];
|
||||
const data: ConstructionSchedulePlanOption = { id: 0, nodeName: '顶级节点', children: [] };
|
||||
data.children = proxy?.handleTree<ConstructionSchedulePlanOption>(res.data, 'id', 'parentId');
|
||||
|
@ -345,7 +345,6 @@ const getWorkList = (bool = false) => {
|
||||
if (res.code === 200) {
|
||||
state.tableData = res.rows.map((item: any, i: number) => {
|
||||
item.index = i + 1;
|
||||
item.aiFill = item.detailList?.reduce((sum: number, child: any) => sum + child.aiFill, 0) || 0;
|
||||
return item;
|
||||
});
|
||||
state.total = res.total;
|
||||
|
@ -34,7 +34,7 @@
|
||||
:file-type="['xls', 'xlsx']"
|
||||
:on-upload-success="handleSuccess"
|
||||
>
|
||||
<el-button type="primary" plain icon="Compass">导入</el-button>
|
||||
<el-button type="primary" plain icon="upload">导入</el-button>
|
||||
</file-upload>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
@ -140,10 +140,10 @@
|
||||
<el-input v-model="form.unit" placeholder="请输入计量单位" />
|
||||
</el-form-item>
|
||||
<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 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 label="数量" prop="total" v-if="!form.workType && form.unitType != '0'">
|
||||
<el-input v-model="form.total" placeholder="请输入数量" />
|
||||
@ -249,6 +249,7 @@ const initFormData: ProgressCategoryForm = {
|
||||
status: undefined,
|
||||
remark: undefined
|
||||
};
|
||||
const labelTitle = ref('测试方阵');
|
||||
|
||||
const data = reactive<PageData<ProgressCategoryForm, ProgressCategoryQuery>>({
|
||||
form: { ...initFormData },
|
||||
@ -323,7 +324,8 @@ const getList = async () => {
|
||||
if (data) {
|
||||
progressCategoryList.value = data;
|
||||
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);
|
||||
console.log('🚀 ~ getList ~ progressCategoryOptions.value:', progressCategoryOptions.value);
|
||||
loading.value = false;
|
||||
@ -336,6 +338,7 @@ const getList = async () => {
|
||||
const handleSuccess = () => {
|
||||
console.log(111);
|
||||
proxy.$modal.msgSuccess('操作成功');
|
||||
getList();
|
||||
};
|
||||
|
||||
/** 查询分项工程单价下拉树结构 */
|
||||
@ -355,6 +358,8 @@ const cancel = () => {
|
||||
};
|
||||
|
||||
const handleTabClick = (tab: any) => {
|
||||
console.log(tab);
|
||||
labelTitle.value = tab.props.label;
|
||||
const id = tab.props.name; // 实际上就是 item.id
|
||||
const current = tabList.value.find((item) => item.id === id);
|
||||
if (current.matrixStructureList && current.matrixStructureList.length > 0) {
|
||||
|
@ -106,7 +106,7 @@
|
||||
<el-input v-model="form.name" placeholder="请输入类别名称" />
|
||||
</el-form-item>
|
||||
<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-select>
|
||||
</el-form-item>
|
||||
|