diff --git a/.env.development b/.env.development index 8849f99..b59befd 100644 --- a/.env.development +++ b/.env.development @@ -5,7 +5,7 @@ VITE_APP_TITLE = 煤科建管平台 VITE_APP_ENV = 'development' # 开发环境 -VITE_APP_BASE_API = 'http://192.168.110.213:8899' +VITE_APP_BASE_API = 'http://192.168.110.180:8899' # 无人机接口地址 diff --git a/public/image/convert_tif.bat b/public/image/convert_tif.bat new file mode 100644 index 0000000..9e00318 --- /dev/null +++ b/public/image/convert_tif.bat @@ -0,0 +1,55 @@ +@echo off +setlocal + +REM 源文件 +set SRC=odm_orthophoto.tif + +REM 中间文件:去掩膜 + 保留 4 波段 +set TMP1=tmp_nomask.tif + +REM 中间文件:gdalwarp 处理透明通道 +set TMP2=tmp_nomask_alpha.tif + +REM 最终输出文件(性能优化:缩放 + 压缩) +set FINAL=clean_no_mask_optimized.tif + +REM 配置参数 +REM -tr 0.25x 分辨率控制(0.25 倍像素,或者每个像素大小扩大4倍),视你项目需要可调 +REM -co 压缩参数:LZW 是无损压缩方式,TILED=YES 支持分块加载 +REM -r average 使用平均值重采样可保持图像质量 + +echo [1/4] gdal_translate:去除掩膜并保留RGBA四波段... +gdal_translate -b 1 -b 2 -b 3 -b 4 -mask none -co PHOTOMETRIC=RGB -co ALPHA=YES %SRC% %TMP1% +if errorlevel 1 ( + echo ❌ gdal_translate 失败 + exit /b 1 +) + +echo [2/4] gdalwarp:强制生成 Alpha 通道... +gdalwarp -dstalpha %TMP1% %TMP2% +if errorlevel 1 ( + echo ❌ gdalwarp 失败 + exit /b 1 +) + +echo [3/4] gdalwarp:降采样并启用压缩优化... +gdalwarp ^ + -r average ^ + -tr 2 2 ^ + -co COMPRESS=LZW ^ + -co TILED=YES ^ + -co PHOTOMETRIC=RGB ^ + -co ALPHA=YES ^ + %TMP2% %FINAL% +if errorlevel 1 ( + echo ❌ gdalwarp 压缩优化失败 + exit /b 1 +) + +echo [4/4] 清理临时文件... +del %TMP1% +del %TMP2% + +echo ✅ 完成!优化后的 GeoTIFF 已生成:%FINAL% +endlocal +pause diff --git a/src/api/design/designChange/index.ts b/src/api/design/designChange/index.ts index 41e1e39..b3a1229 100644 --- a/src/api/design/designChange/index.ts +++ b/src/api/design/designChange/index.ts @@ -61,3 +61,23 @@ export const delDesignChange = (id: string | number | Array) => method: 'delete' }); }; +/** + * 获取卷册号 + * @param id + */ +export const blueprintList = (id) => { + return request({ + url: '/design/designChange/blueprint/' + id, + method: 'get' + }); +}; +/** + * 获取卷册列表 + * @param id + */ +export const catalogList = (id) => { + return request({ + url: '/design/designChange/catalogList/' + id, + method: 'get' + }); +}; diff --git a/src/api/design/drawing/index.ts b/src/api/design/drawing/index.ts index 279df5d..cb4852b 100644 --- a/src/api/design/drawing/index.ts +++ b/src/api/design/drawing/index.ts @@ -82,3 +82,14 @@ export const volumeFileViewerList = (id) => { method: 'get' }); }; +/** + * 查阅图纸列表 + * @param id + */ +export const joinList = (params) => { + return request({ + url: '/design/volumeFile/joinList', + method: 'get', + params + }); +}; diff --git a/src/api/design/volumeCatalog/index.ts b/src/api/design/volumeCatalog/index.ts index ed38967..955d78c 100644 --- a/src/api/design/volumeCatalog/index.ts +++ b/src/api/design/volumeCatalog/index.ts @@ -65,7 +65,7 @@ export const addVolumeCatalog = (data: VolumeCatalogForm) => { * 修改卷册目录 * @param data */ -export const updateVolumeCatalog = (data: VolumeCatalogForm) => { +export const updateVolumeCatalog = (data) => { return request({ url: '/design/volumeCatalog', method: 'put', diff --git a/src/api/materials/batchPlan/index.ts b/src/api/materials/batchPlan/index.ts index 6c1c9f3..8633eee 100644 --- a/src/api/materials/batchPlan/index.ts +++ b/src/api/materials/batchPlan/index.ts @@ -130,3 +130,16 @@ export const listSelectCailiaoshebei = (query?: any): AxiosPromise => { + return request({ + url: '/cailiaoshebei/purchaseDoc/engineeringList', + method: 'get', + params: query + }); +}; diff --git a/src/api/materials/purchaseDoc/index.ts b/src/api/materials/purchaseDoc/index.ts index 699f240..64ec1ab 100644 --- a/src/api/materials/purchaseDoc/index.ts +++ b/src/api/materials/purchaseDoc/index.ts @@ -121,3 +121,10 @@ export const logisticsDetial = (id) => { method: 'get' }); }; + +export const getDetailBASE = (id) => { + return request({ + url: '/cailiaoshebei/purchaseDoc/pic/' + id, + method: 'get' + }); +}; diff --git a/src/api/patch/index.ts b/src/api/patch/index.ts new file mode 100644 index 0000000..b086a80 --- /dev/null +++ b/src/api/patch/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { MasterVO, MasterForm, MasterQuery } from '@/api/patch/master/types'; + +/** + * 查询派单列表 + * @param query + * @returns {*} + */ + +export const listMaster = (query?: MasterQuery): AxiosPromise => { + return request({ + url: '/patch/list', + method: 'get', + params: query + }); +}; + +/** + * 查询派单详细 + * @param id + */ +export const getMaster = (id: string | number): AxiosPromise => { + return request({ + url: '/patch/' + id, + method: 'get' + }); +}; + +/** + * 新增派单 + * @param data + */ +export const addMaster = (data: MasterForm) => { + return request({ + url: '/patch/', + method: 'post', + data: data + }); +}; + +/** + * 修改派单 + * @param data + */ +export const updateMaster = (data: MasterForm) => { + return request({ + url: '/patch/', + method: 'put', + data: data + }); +}; + +/** + * 删除派单 + * @param id + */ +export const delMaster = (id: string | number | Array) => { + return request({ + url: '/patch/' + id, + method: 'delete' + }); +}; diff --git a/src/api/patch/types.ts b/src/api/patch/types.ts new file mode 100644 index 0000000..5a55b96 --- /dev/null +++ b/src/api/patch/types.ts @@ -0,0 +1,141 @@ +export interface MasterVO { + /** + * 主键ID + */ + id: string | number; + + /** + * 项目ID + */ + projectId: string | number; + + /** + * 任务名称 + */ + taskName: string; + + /** + * 任务描述 + */ + describe: string; + + /** + * 计划完成时间 + */ + pcd: string; + + /** + * 实际完成时间 + */ + act: string; + + /** + * 完成进度 + */ + completionProgress: string; + + /** + * 任务状态 + */ + taskStatus: string; + + /** + * 备注 + */ + remark: string; + +} + +export interface MasterForm extends BaseEntity { + /** + * 主键ID + */ + id?: string | number; + + /** + * 项目ID + */ + projectId?: string | number; + + /** + * 任务名称 + */ + taskName?: string; + + /** + * 任务描述 + */ + describe?: string; + + /** + * 计划完成时间 + */ + pcd?: string; + + /** + * 实际完成时间 + */ + act?: string; + + /** + * 完成进度 + */ + completionProgress?: string; + + /** + * 任务状态 + */ + taskStatus?: string; + + /** + * 备注 + */ + remark?: string; + +} + +export interface MasterQuery extends PageQuery { + + /** + * 项目ID + */ + projectId?: string | number; + + /** + * 任务名称 + */ + taskName?: string; + + /** + * 任务描述 + */ + describe?: string; + + /** + * 计划完成时间 + */ + pcd?: string; + + /** + * 实际完成时间 + */ + act?: string; + + /** + * 完成进度 + */ + completionProgress?: string; + + /** + * 任务状态 + */ + taskStatus?: string; + + /** + * 日期范围参数 + */ + params?: any; +} + + + diff --git a/src/api/plan/plan/index.ts b/src/api/plan/plan/index.ts new file mode 100644 index 0000000..12afcd5 --- /dev/null +++ b/src/api/plan/plan/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { PlanVO, PlanForm, PlanQuery } from '@/api/plan/plan/types'; + +/** + * 查询招标计划列表 + * @param query + * @returns {*} + */ + +export const listPlan = (query?: PlanQuery): AxiosPromise => { + return request({ + url: '/plan/plan/list', + method: 'get', + params: query + }); +}; + +/** + * 查询招标计划详细 + * @param id + */ +export const getPlan = (id: string | number): AxiosPromise => { + return request({ + url: '/plan/plan/' + id, + method: 'get' + }); +}; + +/** + * 新增招标计划 + * @param data + */ +export const addPlan = (data: PlanForm) => { + return request({ + url: '/plan/plan', + method: 'post', + data: data + }); +}; + +/** + * 修改招标计划 + * @param data + */ +export const updatePlan = (data: PlanForm) => { + return request({ + url: '/plan/plan', + method: 'put', + data: data + }); +}; + +/** + * 删除招标计划 + * @param id + */ +export const delPlan = (id: string | number | Array) => { + return request({ + url: '/plan/plan/' + id, + method: 'delete' + }); +}; diff --git a/src/api/plan/plan/types.ts b/src/api/plan/plan/types.ts new file mode 100644 index 0000000..2e9928a --- /dev/null +++ b/src/api/plan/plan/types.ts @@ -0,0 +1,161 @@ +export interface PlanVO { + /** + * 招标计划ID + */ + id: string | number; + + /** + * 分包类型 + */ + subpackageType: string; + + /** + * 分包名称 + */ + subpackageName: string; + + /** + * 分包内容 + */ + subpackageContext: string; + + /** + * 限价 + */ + limitPrice: number; + + /** + * 计划招标时间 + */ + planTenderTime: string; + + /** + * 招标方式 + */ + tenderMethod: string; + + /** + * 招标文件(多个) + */ + tenderFile: string; + + /** + * 中标文件(单个) + */ + bidFile: string | number; + + /** + * 合同额 + */ + contract: number; + +} + +export interface PlanForm extends BaseEntity { + /** + * 招标计划ID + */ + id?: string | number; + + /** + * 分包类型 + */ + subpackageType?: string; + + /** + * 分包名称 + */ + subpackageName?: string; + + /** + * 分包内容 + */ + subpackageContext?: string; + + /** + * 限价 + */ + limitPrice?: number; + + /** + * 计划招标时间 + */ + planTenderTime?: string; + + /** + * 招标方式 + */ + tenderMethod?: string; + + /** + * 招标文件(多个) + */ + tenderFile?: string; + + /** + * 中标文件(单个) + */ + bidFile?: string | number; + + /** + * 合同额 + */ + contract?: number; + +} + +export interface PlanQuery extends PageQuery { + + /** + * 分包类型 + */ + subpackageType?: string; + + /** + * 分包名称 + */ + subpackageName?: string; + + /** + * 分包内容 + */ + subpackageContext?: string; + + /** + * 限价 + */ + limitPrice?: number; + + /** + * 计划招标时间 + */ + planTenderTime?: string; + + /** + * 招标方式 + */ + tenderMethod?: string; + + /** + * 招标文件(多个) + */ + tenderFile?: string; + + /** + * 中标文件(单个) + */ + bidFile?: string | number; + + /** + * 合同额 + */ + contract?: number; + + /** + * 日期范围参数 + */ + params?: any; +} + + + diff --git a/src/api/project/project/index.ts b/src/api/project/project/index.ts index 61dcb29..5b76894 100644 --- a/src/api/project/project/index.ts +++ b/src/api/project/project/index.ts @@ -174,3 +174,15 @@ export const getChildProject = (id: string | number): AxiosPromise { + return request({ + url: '/project/project/save/tender/file', + method: 'put', + data: data + }); +}; diff --git a/src/api/project/project/types.ts b/src/api/project/project/types.ts index 4ccb37d..2e21007 100644 --- a/src/api/project/project/types.ts +++ b/src/api/project/project/types.ts @@ -8,6 +8,7 @@ export interface ProjectVO { * 项目名称 */ projectName: string; + tenderFiles: string; /** * 项目简称 @@ -128,10 +129,10 @@ export interface locationType { projectSite: string; } -export interface childProjectQuery{ - projectName:string; - pid:string; - id?:string +export interface childProjectQuery { + projectName: string; + pid: string; + id?: string; } export interface ProjectForm extends BaseEntity { diff --git a/src/api/supplierInput/supplierInput/index.ts b/src/api/supplierInput/supplierInput/index.ts new file mode 100644 index 0000000..719aa11 --- /dev/null +++ b/src/api/supplierInput/supplierInput/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { SupplierInputVO, SupplierInputForm, SupplierInputQuery } from '@/api/supplierInput/supplierInput/types'; + +/** + * 查询供应商入库列表 + * @param query + * @returns {*} + */ + +export const listSupplierInput = (query?: SupplierInputQuery): AxiosPromise => { + return request({ + url: '/supplierInput/supplierInput/list', + method: 'get', + params: query + }); +}; + +/** + * 查询供应商入库详细 + * @param id + */ +export const getSupplierInput = (id: string | number): AxiosPromise => { + return request({ + url: '/supplierInput/supplierInput/' + id, + method: 'get' + }); +}; + +/** + * 新增供应商入库 + * @param data + */ +export const addSupplierInput = (data: SupplierInputForm) => { + return request({ + url: '/supplierInput/supplierInput', + method: 'post', + data: data + }); +}; + +/** + * 修改供应商入库 + * @param data + */ +export const updateSupplierInput = (data: SupplierInputForm) => { + return request({ + url: '/supplierInput/supplierInput', + method: 'put', + data: data + }); +}; + +/** + * 删除供应商入库 + * @param id + */ +export const delSupplierInput = (id: string | number | Array) => { + return request({ + url: '/supplierInput/supplierInput/' + id, + method: 'delete' + }); +}; diff --git a/src/api/supplierInput/supplierInput/types.ts b/src/api/supplierInput/supplierInput/types.ts new file mode 100644 index 0000000..3f86b6e --- /dev/null +++ b/src/api/supplierInput/supplierInput/types.ts @@ -0,0 +1,55 @@ +export interface SupplierInputVO { + /** + * + */ + id: string | number; + + /** + * 供应商类型 + */ + supplierType: string; + + /** + * 入库资料 + */ + inputFile: string; + +} + +export interface SupplierInputForm extends BaseEntity { + /** + * + */ + id?: string | number; + + /** + * 供应商类型 + */ + supplierType?: string; + + /** + * 入库资料 + */ + inputFile?: string; +} + +export interface SupplierInputQuery extends PageQuery { + + /** + * 供应商类型 + */ + supplierType?: string; + + /** + * 入库资料 + */ + inputFile?: string; + + /** + * 日期范围参数 + */ + params?: any; +} + + + diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index 0adc0d8..2fb0c49 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -315,6 +315,11 @@ const uploadedSuccessfully = (res: any) => { fileList.value = []; emit('update:modelValue', ''); // 同步到外部 v-model } + // if (props.autoUpload && props.limit === fileList.value.length) { + // fileUploadRef.value?.clearFiles(); + // fileList.value = []; + // emit('update:modelValue', ''); // 同步到外部 v-model + // } props.onUploadSuccess?.(fileList.value, res); }; diff --git a/src/components/Process/submitVerify.vue b/src/components/Process/submitVerify.vue index 1484570..ab58fbf 100644 --- a/src/components/Process/submitVerify.vue +++ b/src/components/Process/submitVerify.vue @@ -34,7 +34,7 @@ - + + + + - + diff --git a/src/views/design/volumeCatalog/index.vue b/src/views/design/volumeCatalog/index.vue index 7594c60..13c6ff9 100644 --- a/src/views/design/volumeCatalog/index.vue +++ b/src/views/design/volumeCatalog/index.vue @@ -63,23 +63,15 @@ 查看文件 - + @@ -156,21 +149,28 @@ - + - - - @@ -220,6 +213,18 @@ + + + + + + + 注意:请上传pdf格式文件 +
+ 确定 + 取消 +
+
@@ -253,9 +258,14 @@ const TableContentRef = ref>(); const single = ref(true); const multiple = ref(true); const activeName = ref('3'); +const uploadOpinionVisible = ref(false); const design = ref(''); const total = ref(0); const dialogHistory = ref(false); +const opinion = ref(''); +const updateRow = ref({ + opinion: [] +}); // 获取用户 store const userStore = useUserStoreHook(); // 从 store 中获取项目列表和当前选中的项目 @@ -415,6 +425,7 @@ const handleAdd = () => { const handleView = (row?: any) => { fileList.value = row.fileVoList; design.value = row.design; + activeName.value = '3'; getVolumeFileList('3'); viewVisible.value = true; }; @@ -422,7 +433,34 @@ const handleView = (row?: any) => { /** 上传文件按钮操作 */ const uploadVisible = ref(false); const viewVisible = ref(false); +// 上传外部意见 +const handleOpinion = (row) => { + uploadOpinionVisible.value = true; + updateRow.value = row; + opinion.value = ''; +}; +const onSubmitOpinion = async () => { + // 提交外部意见 + if (opinion.value.length == 0) { + proxy.$modal.msgError('请上传外部意见'); + return; + } + await updateVolumeCatalog({ ...updateRow.value }); + proxy?.$modal.msgSuccess('操作成功'); + uploadOpinionVisible.value = false; + await getList(); +}; +const onUploadSuccess = (fileList, res) => { + if (res.code == 200) { + updateRow.value.opinion = res.data.url; + } +}; const handleUpload = async (row?: any) => { + // 判断是否有专业和设计人员 + if (!row?.principalName || !row?.specialtyName) { + proxy?.$modal.warning('请先选择专业和设计人员'); + return; + } resetUploadForm(); uploadForm.volumeCatalogId = row.design; userList.value = row.noViewerList; diff --git a/src/views/materials/batchPlan/index.vue b/src/views/materials/batchPlan/index.vue index 8877d8f..b9ef3fc 100644 --- a/src/views/materials/batchPlan/index.vue +++ b/src/views/materials/batchPlan/index.vue @@ -82,7 +82,7 @@ - + @@ -123,22 +123,25 @@ - + @@ -153,7 +156,7 @@ @@ -175,7 +178,15 @@ diff --git a/src/views/project/project/index.vue b/src/views/project/project/index.vue index 4e6fabe..31a0bbd 100644 --- a/src/views/project/project/index.vue +++ b/src/views/project/project/index.vue @@ -149,6 +149,9 @@ 修改 删除 + 招标文件上传 + @@ -190,9 +193,9 @@ - - - + + + @@ -359,6 +362,15 @@
+ + + + @@ -370,7 +382,7 @@ import { addProjectPilePoint, addProjectSquare, delProject, - getChildProject, + uploadProjectFile, getProject, listProject, updateProject @@ -378,8 +390,8 @@ import { import { ProjectForm, ProjectQuery, ProjectVO, childProjectQuery, locationType } from '@/api/project/project/types'; import amap from '@/components/amap/index.vue'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_normal_disable, project_category_type, project_type } = toRefs( - proxy?.useDict('sys_normal_disable', 'project_category_type', 'project_type') +const { sys_normal_disable, project_category_type, project_type, project_stage } = toRefs( + proxy?.useDict('sys_normal_disable', 'project_category_type', 'project_type', 'project_stage') ); const projectList = ref([]); const buttonLoading = ref(false); @@ -408,6 +420,11 @@ const dialog = reactive({ visible: false, title: '' }); +const fileVisble = ref(false); +const fileForm = ref({ + id: '', + tenderFiles: '' +}); const jsonData = ref(null); const fullscreenLoading = ref(false); @@ -521,48 +538,6 @@ const setPoi = (location: locationType) => { const setCheckedNodes = (nodeList: any) => { nodes.value = nodeList; }; -//上传节点 -// const addFacilities = async () => { -// if (!layerType.value) { -// return proxy?.$modal.msgError('请选择图层类型'); -// } -// if (!nodes.value.length) { -// return proxy?.$modal.msgError('请选择需要上传的图层'); -// } -// const data = { -// projectId: projectId.value, -// nameGeoJson: null, -// locationGeoJson: null, -// pointGeoJson: null -// }; -// loading.value = true; -// if (layerType.value == 1) { -// if (nodes.value[0].option == '名称') { -// data.nameGeoJson = jsonData.value[nodes.value[0].location.index]; -// data.locationGeoJson = jsonData.value[nodes.value[1].location.index]; -// } else { -// data.nameGeoJson = jsonData.value[nodes.value[1].location.index]; -// data.locationGeoJson = jsonData.value[nodes.value[0].location.index]; -// } -// await addProjectFacilities(data); -// await proxy?.$modal.msgSuccess('添加成功'); -// } else if (layerType.value == 2) { -// data.pointGeoJson = jsonData.value[nodes.value[0].location.index]; -// await addProjectPilePoint(data); -// await proxy?.$modal.msgSuccess('添加成功'); -// } else if (layerType.value == 3) { -// if (nodes.value[0].option == '名称') { -// data.nameGeoJson = jsonData.value[nodes.value[0].location.index]; -// data.locationGeoJson = jsonData.value[nodes.value[1].location.index]; -// } else { -// data.nameGeoJson = jsonData.value[nodes.value[1].location.index]; -// data.locationGeoJson = jsonData.value[nodes.value[0].location.index]; -// } -// await addProjectSquare(data); -// await proxy?.$modal.msgSuccess('添加成功'); -// } -// loading.value = false; -// }; /** 搜索按钮操作 */ const handleQuery = () => { queryParams.value.pageNum = 1; @@ -643,6 +618,24 @@ const submitForm = () => { }); }; +/** 上传文件 */ +const handleUpload = async (row?: ProjectVO) => { + fileForm.value.id = row.id; + fileForm.value.tenderFiles = row.tenderFiles; + + fileVisble.value = true; +}; + +const uploadSubmit = async () => { + if (!fileForm.value.tenderFiles) return proxy.$modal.msgError('请上传文件'); + let res = await uploadProjectFile(fileForm.value); + if (res.code == 200) { + proxy.$modal.msgSuccess('上传成功'); + fileVisble.value = false; + await getList(); + } +}; + /** 删除按钮操作 */ const handleDelete = async (row?: ProjectVO) => { const _ids = row?.id || ids.value; diff --git a/src/views/tender/plan/index.vue b/src/views/tender/plan/index.vue new file mode 100644 index 0000000..26408a7 --- /dev/null +++ b/src/views/tender/plan/index.vue @@ -0,0 +1,285 @@ + + + diff --git a/src/views/tender/supplierInput/index.vue b/src/views/tender/supplierInput/index.vue new file mode 100644 index 0000000..69d5f99 --- /dev/null +++ b/src/views/tender/supplierInput/index.vue @@ -0,0 +1,368 @@ + + + +