材料管理 变更清单

This commit is contained in:
Teo
2025-08-08 20:03:00 +08:00
parent f37ca487f6
commit 93a3ea764e
28 changed files with 1973 additions and 432 deletions

View File

@ -5,7 +5,7 @@ VITE_APP_TITLE = 新能源项目管理平台
VITE_APP_ENV = 'development' VITE_APP_ENV = 'development'
# 开发环境 # 开发环境
VITE_APP_BASE_API = 'http://192.168.110.119:8898' VITE_APP_BASE_API = 'http://192.168.110.159:8898'
# 无人机接口地址 # 无人机接口地址

View File

@ -97,3 +97,14 @@ export const delBatch = (ids: string | number | Array<string | number>) => {
method: 'delete' method: 'delete'
}); });
}; };
/**
* 查询物资-材料设备批次详情
* @param id
*/
export const getPcDetail = (id: string | number): AxiosPromise<CailiaoshebeiVO> => {
return request({
url: '/cailiaoshebei/materialbatchdemandplan/spQuery/' + id,
method: 'get'
});
};

View File

@ -97,3 +97,14 @@ export const delBatch = (ids: string | number | Array<string | number>) => {
method: 'delete' method: 'delete'
}); });
}; };
/**
* 查询物资-材料设备批次详情
* @param id
*/
export const getPcDetail = (id: string | number): AxiosPromise<CailiaoshebeiVO> => {
return request({
url: '/cailiaoshebei/cailiaoshebei/spQuery/' + id,
method: 'get'
});
};

View File

@ -83,6 +83,9 @@ export interface CailiaoshebeiForm extends BaseEntity {
projectId?: string | number; projectId?: string | number;
batchNumber?: string | number; batchNumber?: string | number;
approvalDesign?: string; approvalDesign?: string;
bo: any;
file: string;
/** /**
* 批次ID * 批次ID
*/ */

View File

@ -97,3 +97,14 @@ export const delBatch = (ids: string | number | Array<string | number>) => {
method: 'delete' method: 'delete'
}); });
}; };
/**
* 查询物资-材料设备批次详情
* @param id
*/
export const getPcDetail = (id: string | number): AxiosPromise<CailiaoshebeiVO> => {
return request({
url: '/cailiaoshebei/materialsorder/spQuery/' + id,
method: 'get'
});
};

View File

@ -45,7 +45,7 @@ export const addCailiaoshebei = (data: CailiaoshebeiForm) => {
*/ */
export const updateCailiaoshebei = (data: CailiaoshebeiForm) => { export const updateCailiaoshebei = (data: CailiaoshebeiForm) => {
return request({ return request({
url: '/cailiaoshebei/cailiaoshebei', url: '/cailiaoshebei/materialsorder/changeTheStatusOfTheMaterials',
method: 'put', method: 'put',
data: data data: data
}); });

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { RepertoryVO, RepertoryForm, RepertoryQuery } from '@/api/materials/repertory/types';
/**
* 查询物资-库存详情列表
* @param query
* @returns {*}
*/
export const listRepertory = (query?: RepertoryQuery): AxiosPromise<RepertoryVO[]> => {
return request({
url: '/cailiaoshebei/repertory/list',
method: 'get',
params: query
});
};
/**
* 查询物资-库存详情详细
* @param id
*/
export const getRepertory = (id: string | number): AxiosPromise<RepertoryVO> => {
return request({
url: '/cailiaoshebei/repertory/' + id,
method: 'get'
});
};
/**
* 新增物资-库存详情
* @param data
*/
export const addRepertory = (data: RepertoryForm) => {
return request({
url: '/cailiaoshebei/repertory',
method: 'post',
data: data
});
};
/**
* 修改物资-库存详情
* @param data
*/
export const updateRepertory = (data: RepertoryForm) => {
return request({
url: '/cailiaoshebei/repertory',
method: 'put',
data: data
});
};
/**
* 删除物资-库存详情
* @param id
*/
export const delRepertory = (id: string | number | Array<string | number>) => {
return request({
url: '/cailiaoshebei/repertory/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,81 @@
export interface RepertoryVO {
/**
* ID
*/
id: string | number;
/**
* 项目ID
*/
projectId: string | number;
/**
* 设备材料名称
*/
name: string;
/**
* 规格型号
*/
specification: string;
/**
* 备注
*/
remark: string;
}
export interface RepertoryForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* 项目ID
*/
projectId?: string | number;
/**
* 设备材料名称
*/
name?: string;
/**
* 规格型号
*/
specification?: string;
/**
* 备注
*/
remark?: string;
}
export interface RepertoryQuery extends PageQuery {
/**
* 项目ID
*/
projectId?: string | number;
/**
* 设备材料名称
*/
name?: string;
/**
* 规格型号
*/
specification?: string;
/**
* 日期范围参数
*/
params?: any;
}

View File

@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { RepertoryDetailsVO, RepertoryDetailsForm, RepertoryDetailsQuery } from '@/api/materials/repertoryDetails/types';
/**
* 查询物资-库存列表
* @param query
* @returns {*}
*/
export const listRepertoryDetails = (query?: RepertoryDetailsQuery): AxiosPromise<RepertoryDetailsVO[]> => {
return request({
url: '/cailiaoshebei/repertoryDetails/list',
method: 'get',
params: query
});
};
/**
* 查询物资-库存详细
* @param id
*/
export const getRepertoryDetails = (id: string | number): AxiosPromise<RepertoryDetailsVO> => {
return request({
url: '/cailiaoshebei/repertoryDetails/' + id,
method: 'get'
});
};
/**
* 新增物资-库存
* @param data
*/
export const addRepertoryDetails = (data: RepertoryDetailsForm) => {
return request({
url: '/cailiaoshebei/repertoryDetails',
method: 'post',
data: data
});
};
/**
* 修改物资-库存
* @param data
*/
export const updateRepertoryDetails = (data: RepertoryDetailsForm) => {
return request({
url: '/cailiaoshebei/repertoryDetails',
method: 'put',
data: data
});
};
/**
* 删除物资-库存
* @param id
*/
export const delRepertoryDetails = (id: string | number | Array<string | number>) => {
return request({
url: '/cailiaoshebei/repertoryDetails/' + id,
method: 'delete'
});
};

View File

@ -0,0 +1,187 @@
export interface RepertoryDetailsVO {
/**
* ID
*/
id: string | number;
/**
* 项目ID
*/
projectId: string | number;
/**
* 库存ID
*/
repertoryId: string | number;
/**
* 数据来源ID
*/
materialsorderId: string | number;
/**
* 物料编码
*/
materialCode: string;
/**
* 原始数量
*/
originalQuantity: number;
/**
* 变更原因
*/
changeReasons: string;
/**
* 变更数量
*/
changeQuantity: number;
/**
* 最终数量
*/
finalNumber: number;
/**
* 操作状态(字典)
*/
operationStatus: string;
/**
* 操作人
*/
operationName: string;
/**
* 操作人联系电话
*/
operationPhone: string;
}
export interface RepertoryDetailsForm extends BaseEntity {
/**
* ID
*/
id?: string | number;
/**
* 项目ID
*/
projectId?: string | number;
/**
* 库存ID
*/
repertoryId?: string | number;
/**
* 数据来源ID
*/
materialsorderId?: string | number;
/**
* 物料编码
*/
materialCode?: string;
/**
* 原始数量
*/
originalQuantity?: number;
/**
* 变更原因
*/
changeReasons?: string;
/**
* 变更数量
*/
changeQuantity?: number;
/**
* 最终数量
*/
finalNumber?: number;
/**
* 操作状态(字典)
*/
operationStatus?: string;
/**
* 操作人
*/
operationName?: string;
/**
* 操作人联系电话
*/
operationPhone?: string;
}
export interface RepertoryDetailsQuery extends PageQuery {
/**
* 项目ID
*/
projectId?: string | number;
id?: string | number;
name?: string;
/**
* 库存ID
*/
repertoryId?: string | number;
/**
* 数据来源ID
*/
materialsorderId?: string | number;
/**
* 物料编码
*/
materialCode?: string;
/**
* 原始数量
*/
originalQuantity?: number;
/**
* 变更原因
*/
changeReasons?: string;
/**
* 变更数量
*/
changeQuantity?: number;
/**
* 最终数量
*/
finalNumber?: number;
/**
* 操作状态(字典)
*/
operationStatus?: string;
/**
* 操作人
*/
operationName?: string;
/**
* 操作人联系电话
*/
operationPhone?: string;
/**
* 日期范围参数
*/
params?: any;
}

View File

@ -97,3 +97,14 @@ export const delBatch = (ids: string | number | Array<string | number>) => {
method: 'delete' method: 'delete'
}); });
}; };
/**
* 查询物资-材料设备批次详情
* @param id
*/
export const getPcDetail = (id: string | number): AxiosPromise<CailiaoshebeiVO> => {
return request({
url: '/cailiaoshebei/cailiaoshebei/spQueryPlan/' + id,
method: 'get'
});
};

View File

@ -140,7 +140,10 @@ export interface SafetyInspectionForm extends BaseEntity {
* 主键ID * 主键ID
*/ */
id?: string | number; id?: string | number;
/**
* 整改单位类型
*/
rectificationUnit?: string;
/** /**
* 父id默认为0 * 父id默认为0
*/ */

View File

@ -112,6 +112,11 @@ const props = defineProps({
type: Function as PropType<(files: any[]) => void>, type: Function as PropType<(files: any[]) => void>,
default: undefined default: undefined
}, },
// 失败回调
onUploadError: {
type: Function as PropType<(err: any, file: any, fileList: any) => void>,
default: undefined
},
params: { params: {
type: Object, type: Object,
default: () => ({}) default: () => ({})

View File

@ -47,6 +47,9 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="success" plain icon="Check" @click="submitForm" v-hasPermi="['cailiaoshebei:cailiaoshebei:delete']">保存</el-button> <el-button type="success" plain icon="Check" @click="submitForm" v-hasPermi="['cailiaoshebei:cailiaoshebei:delete']">保存</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button plain type="warning" icon="Finished" @click="handleAudit()" v-hasPermi="['out:monthPlan:remove']">审核</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
@ -78,11 +81,6 @@
<dict-tag :options="wf_business_status" :value="scope.row.planAuditStatus" /> <dict-tag :options="wf_business_status" :value="scope.row.planAuditStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="150">
<template #default="scope">
<el-button link type="primary" icon="Finished" @click="handleAudit(scope.row)" v-hasPermi="['out:monthPlan:remove']">审核</el-button>
</template>
</el-table-column>
</el-table> </el-table>
</el-card> </el-card>
</el-col> </el-col>
@ -205,6 +203,7 @@ const { queryParams, form, rules } = toRefs(data);
/** 查询物资-材料设备列表 */ /** 查询物资-材料设备列表 */
const getList = async () => { const getList = async () => {
if (!queryParams.value.batchNumber) return;
loading.value = true; loading.value = true;
const res = await listCailiaoshebei(queryParams.value); const res = await listCailiaoshebei(queryParams.value);
cailiaoshebeiList.value = res.rows; cailiaoshebeiList.value = res.rows;
@ -215,15 +214,16 @@ const getList = async () => {
//查询批次列表 //查询批次列表
const getBatchList = async () => { const getBatchList = async () => {
const res = await listBatch(queryParams.value); const res = await listBatch(queryParams.value);
console.log('🚀 ~ getBatchList ~ res:', res);
batchOptions.value = res.rows; batchOptions.value = res.rows;
total.value = res.total; total.value = res.total;
try { try {
queryParams.value.batchNumber = res.rows[0].batchNumber;
batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber); batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber);
form.value.batchNumber = res.rows[0].batchNumber; form.value.batchNumber = res.rows[0].batchNumber;
form.value.approvalProject = res.rows[0].approvalProject; form.value.approvalProject = res.rows[0].approvalProject;
} catch (error) { } catch (error) {
form.value.batchNumber = ''; form.value.batchNumber = '';
queryParams.value.batchNumber = '';
} }
getList(); getList();
}; };
@ -286,17 +286,6 @@ const handleAdd = () => {
dialog.title = '选择物资-材料设备'; dialog.title = '选择物资-材料设备';
}; };
/** 修改按钮操作 */
// const handleUpdate = async (row?: CailiaoshebeiVO) => {
// reset();
// const _id = row?.id || ids.value[0];
// const res = await getCailiaoshebei(_id);
// Object.assign(form.value, res.data);
// selectValue.value = (form.value.supplierId as string).split(',');
// dialog.visible = true;
// dialog.title = '修改物资-材料设备';
// };
/** 提交按钮 */ /** 提交按钮 */
const submitForm = async () => { const submitForm = async () => {
buttonLoading.value = true; buttonLoading.value = true;
@ -351,14 +340,15 @@ const handleDelete = async (row?: CailiaoshebeiVO) => {
}; };
/** 审核按钮操作 */ /** 审核按钮操作 */
const handleAudit = async (row?: CailiaoshebeiVO) => { const handleAudit = async () => {
const data = { if (!form.value.approvalProject) {
...row, proxy?.$modal.msgError('请选择批次号');
approvalProject: form.value.approvalProject return;
}; }
proxy?.$tab.closePage(proxy.$route);
proxy?.$tab.openPage('/materials-management/batchPlan/indexEdit', '审核物资设备批次需求计划', { proxy?.$tab.openPage('/materials-management/batchPlan/indexEdit', '审核物资设备批次需求计划', {
id: row?.id, id: form.value.batchNumber,
data: JSON.stringify(data), approvalProject: form.value.approvalProject + '_batchRequirements',
type: 'update' type: 'update'
}); });
}; };

View File

@ -16,58 +16,29 @@
<!-- 表单区域 --> <!-- 表单区域 -->
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden"> <el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100"> <div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
<h3 class="text-lg font-semibold text-gray-800">施工产值</h3> <h3 class="text-lg font-semibold text-gray-800">物资设备批次需求计划</h3>
</div> </div>
<div class="p-6"> <div class="p-6">
<el-form <el-table v-loading="loading" :data="cailiaoshebeiList">
ref="leaveFormRef" <el-table-column label="供货商" align="center" prop="supplierCompany" />
v-loading="loading" <el-table-column label="设备材料名称" align="center" prop="name" />
:disabled="routeParams.type === 'view'" <el-table-column label="规格型号" align="center" prop="specification" />
:model="form" <el-table-column label="物料编码" align="center" prop="materialCode" width="200" />
:rules="rules" <el-table-column label="计量单位" align="center" prop="unit" width="80" />
label-width="120px" <el-table-column label="供应周期(天)" align="center" prop="estimatedCycle" />
class="space-y-4" <el-table-column label="需求数量" align="center" prop="demandQuantity">
> <template #default="scope">
<el-row :gutter="20" justify="center"> <el-input v-model="scope.row.demandQuantity" type="number" />
<el-col :span="12" :offset="0"> </template>
<el-form-item label="计划到场时间" prop="arrivalTime"> </el-table-column>
<el-date-picker <el-table-column label="计划到场时间" align="center" prop="arrivalTime" width="250">
clearable <template #default="scope">
v-model="form.arrivalTime" <div class="flex justify-center w100%">
disabled <el-date-picker v-model="scope.row.arrivalTime" type="date" value-format="YYYY-MM-DD" />
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择计划到场时间"
>
</el-date-picker>
</el-form-item>
<el-form-item label="计划完成时间" prop="finishTime">
<el-date-picker clearable v-model="form.finishTime" disabled type="date" value-format="YYYY-MM-DD" placeholder="请选择计划完成时间">
</el-date-picker>
</el-form-item>
<div v-for="(item, index) in selectValue" :key="index">
<el-divider content-position="center"
><el-text tag="b">{{ item }}</el-text></el-divider
>
<el-form-item label="单价" prop="unitPrice">
<el-input v-model="form.listOfMaterialInventory[index].unitPrice" type="number" disabled placeholder="请输入单价" />
</el-form-item>
<el-form-item label="数量" prop="num">
<el-input v-model="form.listOfMaterialInventory[index].num" type="number" disabled placeholder="请输入数量" />
</el-form-item>
<el-form-item label="合同号" prop="contractNum">
<el-input v-model="form.listOfMaterialInventory[index].contractNum" disabled placeholder="请输入合同号" />
</el-form-item>
<el-form-item label="预估供应周期" prop="estimatedCycle">
<el-input v-model="form.listOfMaterialInventory[index].estimatedCycle" disabled type="number" placeholder="请输入预估供应周期" />
</el-form-item>
<el-form-item label="供货公司" prop="supplierCompany">
<el-input v-model="form.listOfMaterialInventory[index].supplierCompany" disabled placeholder="请输入供货公司" />
</el-form-item>
</div> </div>
</el-col> </template>
</el-row> </el-table-column>
</el-form> </el-table>
</div> </div>
</el-card> </el-card>
<!-- 提交组件 --> <!-- 提交组件 -->
@ -117,6 +88,8 @@ import { getKnowledgeDocument } from '@/api/design/technicalStandard';
import { getConstructionValue } from '@/api/out/constructionValue'; import { getConstructionValue } from '@/api/out/constructionValue';
import { workScheduleListDetail } from '@/api/progress/plan'; import { workScheduleListDetail } from '@/api/progress/plan';
import { getCailiaoshebei } from '@/api/materials/suppliesprice'; import { getCailiaoshebei } from '@/api/materials/suppliesprice';
import { getPcDetail, listCailiaoshebei } from '@/api/materials/batchPlan';
import { CailiaoshebeiVO } from '@/api/materials/batchPlan/types';
// 获取用户 store // 获取用户 store
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目 // 从 store 中获取项目列表和当前选中的项目
@ -156,25 +129,11 @@ const submitFormData = ref<StartProcessBo>({
}); });
const taskVariables = ref<Record<string, any>>({}); const taskVariables = ref<Record<string, any>>({});
const selectValue = ref<string[]>([]); const selectValue = ref<string[]>([]);
const cailiaoshebeiList = ref<CailiaoshebeiVO[]>([]);
const initFormData = { const initFormData = {
id: undefined, id: undefined,
batchNumber: undefined, approvalProject: undefined
supplierId: undefined,
supplier: undefined,
name: undefined,
supply: undefined,
specification: undefined,
signalment: undefined,
materialCode: undefined,
arrivalTime: undefined,
finishTime: undefined,
unit: undefined,
plan: undefined,
realQuantity: undefined,
projectId: currentProject.value.id,
listOfMaterialInventory: [],
remark: undefined
}; };
const data = reactive({ const data = reactive({
form: { ...initFormData }, form: { ...initFormData },
@ -199,20 +158,19 @@ const getInfo = () => {
loading.value = true; loading.value = true;
buttonLoading.value = false; buttonLoading.value = false;
nextTick(async () => { nextTick(async () => {
const res = JSON.parse(routeParams.value.data); const id = routeParams.value.id.split('_')[0];
Object.assign(form.value, res.data); const res = await listCailiaoshebei({ pageNum: 1, pageSize: 10, batchNumber: id });
selectValue.value = (form.value.supplier as string).split(','); cailiaoshebeiList.value = res.rows;
if (!form.value.listOfMaterialInventory.length) { if (!form.value.approvalProject) {
form.value.listOfMaterialInventory = selectValue.value.map((item) => { const res = await getPcDetail(id);
return { form.value.approvalProject = res.data.approvalProject;
supplierCompany: item, } else {
estimatedCycle: '', form.value.approvalProject = routeParams.value.approvalProject;
contractNum: '',
num: '',
unitPrice: ''
};
});
} }
console.log('🚀 ~ getInfo ~ form.value.approvalProject:', form.value.approvalProject);
form.value.id = routeParams.value.id;
loading.value = false; loading.value = false;
buttonLoading.value = false; buttonLoading.value = false;
}); });

View File

@ -333,6 +333,8 @@ const { queryParams, form, rules } = toRefs(data);
/** 查询物资-材料设备列表 */ /** 查询物资-材料设备列表 */
const getList = async () => { const getList = async () => {
if (!queryParams.value.batchNumber) return;
loading.value = true; loading.value = true;
const res = await listCailiaoshebei(queryParams.value); const res = await listCailiaoshebei(queryParams.value);
cailiaoshebeiList.value = res.rows; cailiaoshebeiList.value = res.rows;
@ -347,14 +349,13 @@ const getBatchList = async () => {
batchOptions.value = res.rows; batchOptions.value = res.rows;
total.value = res.total; total.value = res.total;
try { try {
batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber);
queryParams.value.batchNumber = res.rows[0].batchNumber; queryParams.value.batchNumber = res.rows[0].batchNumber;
batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber);
form.value.batchNumber = res.rows[0].batchNumber; form.value.batchNumber = res.rows[0].batchNumber;
form.value.batchId = res.rows[0].id; form.value.approvalDesign = res.rows[0].approvalDesign;
} catch (error) { } catch (error) {
form.value.batchNumber = ''; form.value.batchNumber = '';
} }
getList(); getList();
}; };
@ -362,7 +363,8 @@ const getBatchList = async () => {
const handleNodeClick = (data: any) => { const handleNodeClick = (data: any) => {
queryParams.value.batchNumber = data.batchNumber; queryParams.value.batchNumber = data.batchNumber;
form.value.batchNumber = data.batchNumber; form.value.batchNumber = data.batchNumber;
form.value.batchId = data.id; form.value.approvalDesign = data.approvalDesign;
if (data.batchNumber === '0') { if (data.batchNumber === '0') {
queryParams.value.batchNumber = ''; queryParams.value.batchNumber = '';
} }
@ -378,7 +380,9 @@ const cancel = () => {
/** 表单重置 */ /** 表单重置 */
const reset = () => { const reset = () => {
const preservedBatchId = form.value.batchNumber; // 先保存当前的 batchNumber const preservedBatchId = form.value.batchNumber; // 先保存当前的 batchNumber
form.value = { ...initFormData, batchNumber: preservedBatchId }; // 重置但保留 const approvalDesigndBatchId = form.value.approvalDesign; // 先保存当前的 batchNumber
form.value = { ...initFormData, batchNumber: preservedBatchId, approvalDesign: approvalDesigndBatchId }; // 重置但保留
cailiaoshebeiFormRef.value?.resetFields(); cailiaoshebeiFormRef.value?.resetFields();
}; };
@ -421,9 +425,14 @@ const handleUpdate = async (row?: CailiaoshebeiVO) => {
/** 审核按钮操作 */ /** 审核按钮操作 */
const handleAudit = async () => { const handleAudit = async () => {
if (!form.value.batchNumber) {
proxy?.$modal.msgError('请选择批次');
return;
}
proxy?.$tab.closePage(proxy.$route);
proxy?.$tab.openPage('/materials-management/cailiaoshebei/indexEdit', '审核材料设备设计', { proxy?.$tab.openPage('/materials-management/cailiaoshebei/indexEdit', '审核材料设备设计', {
id: form.value.batchId, id: form.value.batchNumber + '_materialDesign',
number: form.value.batchNumber, approvalDesign: form.value.approvalDesign,
type: 'update' type: 'update'
}); });
}; };

View File

@ -19,55 +19,21 @@
<h3 class="text-lg font-semibold text-gray-800">设计材料设备</h3> <h3 class="text-lg font-semibold text-gray-800">设计材料设备</h3>
</div> </div>
<div class="p-6"> <div class="p-6">
<el-form <el-table v-loading="loading" :data="cailiaoshebeiList">
ref="leaveFormRef" <el-table-column label="供货商" align="center" prop="supplier" />
v-loading="loading" <el-table-column label="设备材料名称" align="center" prop="name" />
:disabled="routeParams.type === 'view'" <el-table-column label="供货来源" align="center" prop="supply">
:model="form" <template #default="scope">
:rules="rules" <dict-tag :options="supply" :value="scope.row.supply" />
label-width="120px" </template>
class="space-y-4" </el-table-column>
> <el-table-column label="规格型号" align="center" prop="specification" />
<el-row :gutter="20" justify="center"> <el-table-column label="特征描述" align="center" prop="signalment" />
<el-col :span="12" :offset="0"> <el-table-column label="物料编码" align="center" prop="materialCode" width="200" />
<el-form-item label="批次号" prop="batchNumber"> <el-table-column label="计量单位" align="center" prop="unit" />
<el-input v-model="form.batchNumber" placeholder="请输入批次ID" disabled /> <el-table-column label="计划数量" align="center" prop="plan" />
</el-form-item> <el-table-column label="备注" align="center" prop="remark" />
<!-- <el-form-item label="供货商ID" prop="supplierId"> </el-table>
<el-input v-model="form.supplierId" placeholder="请输入供货商ID" />
</el-form-item> -->
<el-form-item label="供货商" prop="supplier">
<el-input v-model="form.supplier" disabled></el-input>
</el-form-item>
<el-form-item label="设备材料名称" prop="name">
<el-input v-model="form.name" placeholder="请输入设备材料名称" disabled />
</el-form-item>
<el-form-item label="供货来源" prop="supply">
<el-select v-model="form.supply" value-key="value" placeholder="请选择供货来源" clearable filterable @change="" disabled>
<el-option v-for="item in supply" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</el-form-item>
<el-form-item label="规格型号" prop="specification">
<el-input v-model="form.specification" placeholder="请输入规格型号" disabled />
</el-form-item>
<el-form-item label="特征描述" prop="signalment">
<el-input v-model="form.signalment" placeholder="请输入特征描述" disabled />
</el-form-item>
<el-form-item label="物料编码" prop="materialCode">
<el-input v-model="form.materialCode" placeholder="请输入物料编码" disabled />
</el-form-item>
<el-form-item label="计量单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入计量单位" disabled />
</el-form-item>
<el-form-item label="计划数量" prop="plan">
<el-input v-model="form.plan" placeholder="请输入计划数量" type="number" disabled />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入内容" disabled />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div> </div>
</el-card> </el-card>
<!-- 提交组件 --> <!-- 提交组件 -->
@ -112,7 +78,8 @@ import ApprovalButton from '@/components/Process/approvalButton.vue';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types'; import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
import { getCailiaoshebei, listCailiaoshebei } from '@/api/materials/cailiaoshebei'; import { getCailiaoshebei, getPcDetail, listCailiaoshebei } from '@/api/materials/cailiaoshebei';
import { CailiaoshebeiVO } from '@/api/materials/cailiaoshebei/types';
// 获取用户 store // 获取用户 store
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目 // 从 store 中获取项目列表和当前选中的项目
@ -154,8 +121,12 @@ const submitFormData = ref<StartProcessBo>({
}); });
const taskVariables = ref<Record<string, any>>({}); const taskVariables = ref<Record<string, any>>({});
const selectValue = ref<string[]>([]); const selectValue = ref<string[]>([]);
const cailiaoshebeiList = ref<CailiaoshebeiVO[]>([]);
const initFormData = []; const initFormData = {
approvalDesign: undefined,
id: undefined
};
const data = reactive({ const data = reactive({
form: { ...initFormData }, form: { ...initFormData },
rules: {} rules: {}
@ -179,8 +150,16 @@ const getInfo = () => {
loading.value = true; loading.value = true;
buttonLoading.value = false; buttonLoading.value = false;
nextTick(async () => { nextTick(async () => {
const res = await listCailiaoshebei({ pageNum: 1, pageSize: 10, batchNumber: routeParams.value.batchNumber }); const id = routeParams.value.id.split('_')[0];
form.value = res.rows; const res = await listCailiaoshebei({ pageNum: 1, pageSize: 10, batchNumber: id });
cailiaoshebeiList.value = res.rows;
if (!form.value.approvalDesign) {
const res = await getPcDetail(id);
form.value.approvalDesign = res.data.approvalDesign;
} else {
form.value.approvalDesign = routeParams.value.approvalDesign;
}
form.value.id = routeParams.value.id;
loading.value = false; loading.value = false;
buttonLoading.value = false; buttonLoading.value = false;
}); });

View File

@ -35,6 +35,7 @@
</el-col> --> </el-col> -->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="success" plain icon="Check" @click="submitForm" v-hasPermi="['cailiaoshebei:cailiaoshebei:delete']">保存</el-button> <el-button type="success" plain icon="Check" @click="submitForm" v-hasPermi="['cailiaoshebei:cailiaoshebei:delete']">保存</el-button>
<el-button plain type="warning" icon="Finished" @click="handleAudit()" v-hasPermi="['out:monthPlan:remove']">审核</el-button>
</el-col> </el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
@ -256,8 +257,10 @@ const getBatchList = async () => {
batchOptions.value = res.rows; batchOptions.value = res.rows;
total.value = res.total; total.value = res.total;
try { try {
queryParams.value.batchNumber = res.rows[0].batchNumber;
batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber); batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber);
form.value.batchNumber = res.rows[0].batchNumber; form.value.batchNumber = res.rows[0].batchNumber;
form.value.approvalOrder = res.rows[0].approvalOrder;
} catch (error) { } catch (error) {
form.value.batchNumber = ''; form.value.batchNumber = '';
} }
@ -268,7 +271,7 @@ const getBatchList = async () => {
const handleNodeClick = (data: any) => { const handleNodeClick = (data: any) => {
queryParams.value.batchNumber = data.batchNumber; queryParams.value.batchNumber = data.batchNumber;
form.value.batchNumber = data.batchNumber; form.value.batchNumber = data.batchNumber;
console.log('🚀 ~ handleNodeClick ~ form.value:', form.value); form.value.approvalOrder = data.approvalOrder;
if (data.batchNumber === '0') { if (data.batchNumber === '0') {
queryParams.value.batchNumber = ''; queryParams.value.batchNumber = '';
} }
@ -348,6 +351,21 @@ const submitForm = async () => {
dialog.visible = false; dialog.visible = false;
}; };
/** 审核按钮操作 */
const handleAudit = async () => {
if (!form.value.batchNumber) {
proxy?.$modal.msgError('请选择批次');
return;
}
proxy?.$tab.closePage(proxy.$route);
proxy?.$tab.openPage('/materials-management/orderEquipment/indexEdit', '审核物资订货', {
id: form.value.batchNumber,
approvalOrder: form.value.approvalOrder + '_equipmentOrdering',
type: 'update'
});
};
/** 提交穿梭框数据 */ /** 提交穿梭框数据 */
const submitTransferForm = async () => { const submitTransferForm = async () => {
cailiaoshebeiList.value = cailiaoshebeiSelectedList.value.map((id) => { cailiaoshebeiList.value = cailiaoshebeiSelectedList.value.map((id) => {

View File

@ -0,0 +1,346 @@
<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.approvalOrder"
: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">
<el-table v-loading="loading" :data="cailiaoshebeiList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="供货商ID" align="center" prop="supplierId" /> -->
<!-- <el-table-column label="供货商" align="center" prop="supplierCompany" /> -->
<el-table-column label="设备材料名称" align="center" prop="name" />
<el-table-column label="规格型号" align="center" prop="specification" />
<el-table-column label="物料编码" align="center" prop="materialCode" width="200" />
<el-table-column label="需求数量" align="center" prop="demandQuantity" width="80" />
<el-table-column label="验收数量" align="center" prop="acceptanceQuantity" />
<el-table-column label="订货量" align="center" prop="orderQuantity" />
<el-table-column label="预计到货时间" align="center" prop="expectedArrival" width="250" />
<el-table-column label="预计生产完成时间" align="center" prop="productionTime" width="250" />
</el-table>
</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 { getPcDetail, listCailiaoshebei } from '@/api/materials/orderEquipment';
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
const buttonLoading = ref(false);
const loading = ref(true);
//路由参数
const routeParams = ref<Record<string, any>>({});
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 flowCodeOptions = [
{
value: currentProject.value?.id + '_equipmentOrdering',
label: '物资-设备订货审批'
}
];
const { supply } = toRefs<any>(proxy?.useDict('supply'));
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 selectValue = ref<string[]>([]);
const cailiaoshebeiList = ref([]);
const initFormData = {
approvalOrder: undefined,
id: undefined
};
const data = reactive({
form: { ...initFormData },
rules: {}
});
const handleClose = () => {
dialogVisible.visible = false;
flowCode.value = '';
buttonLoading.value = false;
};
const { form, rules } = toRefs(data);
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
leaveFormRef.value?.resetFields();
};
/** 获取详情 */
const getInfo = () => {
loading.value = true;
buttonLoading.value = false;
nextTick(async () => {
const id = routeParams.value.id.split('_')[0];
const res = await listCailiaoshebei({ pageNum: 1, pageSize: 10, batchNumber: id });
cailiaoshebeiList.value = res.rows;
if (!form.value.approvalOrder) {
const res = await getPcDetail(id);
form.value.approvalOrder = (res.data as any).approvalOrder;
} else {
form.value.approvalOrder = routeParams.value.approvalOrder;
}
console.log('🚀 ~ getInfo ~ form.value.approvalOrder:', form.value.approvalOrder);
form.value.id = routeParams.value.id;
loading.value = false;
buttonLoading.value = false;
});
};
/** 提交按钮 */
const submitForm = (status1: string) => {
status.value = status1;
submit(status.value, form.value);
};
const submitFlow = async () => {
handleStartWorkFlow(form.value);
dialogVisible.visible = false;
};
//提交申请
const handleStartWorkFlow = async (data: LeaveForm) => {
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 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.approvalOrder === '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';
}
await handleStartWorkFlow(data);
}
};
onMounted(() => {
nextTick(async () => {
routeParams.value = proxy.$route.query;
console.log('🚀 ~ proxy.$route.query:', proxy.$route.query);
reset();
loading.value = false;
if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
getInfo();
}
});
});
</script>
<style scoped lang="scss">
/* 全局样式 */
:root {
--primary: #409eff;
--primary-light: #66b1ff;
--primary-dark: #3a8ee6;
--success: #67c23a;
--warning: #e6a23c;
--danger: #f56c6c;
--info: #909399;
}
/* 表单样式优化 */
.el-form-item {
.el-form-item__label {
color: #606266;
font-weight: 500;
}
.el-input__inner,
.el-select .el-input__inner {
border-radius: 4px;
transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus {
border-color: var(--primary-light);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
}
.el-textarea__inner {
border-radius: 4px;
transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus {
border-color: var(--primary-light);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
}
}
/* 按钮样式优化 */
.el-button {
border-radius: 4px;
transition: all 0.2s;
&.is-primary {
background-color: var(--primary);
border-color: var(--primary);
&:hover {
background-color: var(--primary-light);
border-color: var(--primary-light);
}
&:active {
background-color: var(--primary-dark);
border-color: var(--primary-dark);
}
}
&.is-text {
color: var(--primary);
&:hover {
color: var(--primary-light);
background-color: rgba(64, 158, 255, 0.05);
}
}
}
/* 卡片样式优化 */
.el-card {
transition: all 0.3s ease;
&:hover {
/* transform: translateY(-2px); */
}
}
/* 对话框样式优化 */
.el-dialog {
.el-dialog__header {
background-color: #f5f7fa;
border-bottom: 1px solid #ebeef5;
padding: 15px 20px;
}
.el-dialog__title {
font-size: 16px;
font-weight: 600;
color: #303133;
}
.el-dialog__footer {
padding: 15px 20px;
border-top: 1px solid #ebeef5;
}
}
</style>

View File

@ -30,40 +30,42 @@
<el-card shadow="never"> <el-card shadow="never">
<el-table v-loading="loading" :data="cailiaoshebeiList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="cailiaoshebeiList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="供货商ID" align="center" prop="supplierId" /> --> <el-table-column label="设备材料名称" align="center" prop="name" width="110" />
<el-table-column label="供货商" align="center" prop="supplier" />
<el-table-column label="设备材料名称" align="center" prop="name" />
<el-table-column label="供货来源" align="center" prop="supply">
<template #default="scope">
<dict-tag :options="supply" :value="scope.row.supply" />
</template>
</el-table-column>
<el-table-column label="规格型号" align="center" prop="specification" /> <el-table-column label="规格型号" align="center" prop="specification" />
<el-table-column label="特征描述" align="center" prop="signalment" /> <el-table-column label="需求数量" align="center" prop="demandQuantity" />
<el-table-column label="物料编码" align="center" prop="materialCode" width="200" /> <el-table-column label="物料编码" align="center" prop="materialCode" width="200" />
<el-table-column label="计量单位" align="center" prop="unit" /> <el-table-column label="计量单位" align="center" prop="unit" />
<el-table-column label="计划数量" align="center" prop="plan" /> <el-table-column label="计划到场时间" align="center" prop="arrivalTime" width="110" />
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="订货数量" align="center" prop="orderQuantity" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="预计到货时间" align="center" prop="expectedArrival" width="110" />
<el-table-column label="预计生产完成时间" align="center" prop="productionTime" width="130" />
<el-table-column label="验收数量" align="center" prop="acceptanceQuantity" />
<el-table-column label="实际到货时间" align="center" prop="actualArrival" width="110" />
<el-table-column label="需求提交时间" align="center" prop="requiredTime" width="110" />
<el-table-column label="订货时间" align="center" prop="orderTime" width="110" />
<el-table-column label="验收时间" align="center" prop="receptionTime" width="110" />
<el-table-column label="物资执行状态" align="center" prop="materialStatus" width="110">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <dict-tag :options="material_status" :value="scope.row.materialStatus" />
<el-button </template>
link </el-table-column>
type="primary" <el-table-column label="物资逾期类型" align="center" prop="overdueType" width="110">
icon="Edit" <template #default="scope">
@click="handleUpdate(scope.row)" <dict-tag :options="overdue_type" :value="scope.row.overdueType" />
v-hasPermi="['cailiaoshebei:cailiaoshebei:edit']" </template>
></el-button> </el-table-column>
</el-tooltip> <el-table-column label="逾期原因" align="center" prop="cause" />
<el-tooltip content="删除" placement="top"> <el-table-column label="签收单据" align="center" prop="signature" />
<el-button <el-table-column label="退货单据" align="center" prop="returnedSalesReport" />
link <el-table-column label="备注" align="center" prop="remark" />
type="primary" <el-table-column label="操作" align="center" width="150" fixed="right">
icon="Delete" <template #default="scope">
@click="handleDelete(scope.row)" <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['cailiaoshebei:cailiaoshebei:edit']"
v-hasPermi="['cailiaoshebei:cailiaoshebei:remove']" >修改</el-button
></el-button> >
</el-tooltip> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['cailiaoshebei:cailiaoshebei:remove']"
>删除</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -73,56 +75,72 @@
<!-- 添加或修改物资-材料设备对话框 --> <!-- 添加或修改物资-材料设备对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="cailiaoshebeiFormRef" :model="form" :rules="rules" label-width="110px"> <el-form ref="cailiaoshebeiFormRef" :model="form" :rules="rules" label-width="130px">
<el-form-item label="批次号" prop="batchNumber"> <el-form-item label="物资执行状态" prop="materialStatus">
<el-input v-model="form.batchNumber" placeholder="请输入批次ID" disabled /> <el-select v-model="form.bo.materialStatus" placeholder="请选择物资执行状态" clearable filterable @change="handleChange">
</el-form-item> <el-option v-for="item in material_status" :key="item.value" :label="item.label" :value="item.value" />
<!-- <el-form-item label="供货商ID" prop="supplierId">
<el-input v-model="form.supplierId" placeholder="请输入供货商ID" />
</el-form-item> -->
<el-form-item label="供货商" prop="supplier">
<el-select v-model="selectValue" value-key="id" multiple placeholder="请选择供货商" clearable filterable>
<el-option v-for="item in supplierOptions" :key="item.id" :label="item.name" :value="item.id"> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="设备材料名称" prop="name"> <el-form-item label="物资逾期类型" prop="overdueType" v-if="form.bo.materialStatus == 3">
<el-input v-model="form.name" placeholder="请输入设备材料名称" /> <el-select v-model="form.bo.overdueType" placeholder="请选择物资逾期类型" clearable filterable>
</el-form-item> <el-option v-for="item in overdue_type" :key="item.value" :label="item.label" :value="item.value" />
<el-form-item label="供货来源" prop="supply">
<el-select v-model="form.supply" value-key="value" placeholder="请选择供货来源" clearable filterable @change="">
<el-option v-for="item in supply" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="规格型号" prop="specification"> <el-form-item label="逾期原因" prop="cause" v-if="form.bo.materialStatus == 3">
<el-input v-model="form.specification" placeholder="请输入规格型号" /> <el-input v-model="form.bo.cause" placeholder="请输入逾期原因" />
</el-form-item> </el-form-item>
<el-form-item label="特征描述" prop="signalment"> <el-form-item label="实际到货时间" prop="actualArrival" v-if="form.bo.materialStatus < 4">
<el-input v-model="form.signalment" placeholder="请输入特征描述" /> <el-date-picker clearable v-model="form.bo.actualArrival" type="date" value-format="YYYY-MM-DD" placeholder="请选择实际到货时间" />
</el-form-item> </el-form-item>
<el-form-item label="物料编码" prop="materialCode"> <el-form-item label="验收时间" prop="receptionTime" v-if="form.bo.materialStatus < 4">
<el-input v-model="form.materialCode" placeholder="请输入物料编码" /> <el-date-picker clearable v-model="form.bo.receptionTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择验收时间" />
</el-form-item> </el-form-item>
<!-- <el-form-item label="计划到场时间" prop="arrivalTime"> <el-form-item label="验收数量" prop="acceptanceQuantity" v-if="form.bo.materialStatus < 4">
<el-date-picker clearable v-model="form.arrivalTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择计划到场时间"> <el-input v-model="form.bo.acceptanceQuantity" type="number" placeholder="请输入验收数量" />
</el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="计划完成时间" prop="finishTime"> <el-form-item label="需求提交时间" prop="requiredTime">
<el-date-picker clearable v-model="form.finishTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择计划完成时间"> <el-date-picker clearable v-model="form.bo.requiredTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择需求提交时间" />
</el-date-picker>
</el-form-item> -->
<el-form-item label="计量单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入计量单位" />
</el-form-item> </el-form-item>
<el-form-item label="计划数量" prop="plan">
<el-input v-model="form.plan" placeholder="请输入计划数量" type="number" /> <el-form-item label="订货时间" prop="orderTime">
<el-date-picker clearable v-model="form.bo.orderTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择订货时间" />
</el-form-item>
<el-form-item label="操作状态" prop="operationStatus" v-if="form.bo.materialStatus <= 4 || form.bo.materialStatus == 10">
<el-select v-model="form.bo.operationStatus" placeholder="请选择物资执行状态" clearable filterable @change="handleChange">
<el-option v-for="item in operation_s" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="单据类型" prop="billType" v-if="form.bo.materialStatus < 4 || form.bo.materialStatus == 10">
<el-select v-model="form.bo.billType" placeholder="请选择单据类型" clearable filterable>
<el-option label="签收单" value="1" />
<el-option label="退货单" value="2" />
</el-select>
</el-form-item>
<el-form-item label="上传文件" prop="file" v-if="form.bo.materialStatus < 4 || form.bo.materialStatus == 10">
<file-upload
v-model="form.file"
:fileType="['doc', 'docx']"
:autoUpload="false"
ref="fileUploadRef"
:data="{ ...form.bo }"
uploadUrl="/cailiaoshebei/materialsorder/changeTheStatusOfTheMaterials"
:onUploadError="
(err, file, fileList) => {
buttonLoading = false;
}
"
:limit="1"
:onUploadSuccess="handleUploadSuccess"
showFileList
/>
</el-form-item> </el-form-item>
<!-- <el-form-item label="实际数量" prop="realQuantity">
<el-input v-model="form.realQuantity" placeholder="请输入实际数量" />
</el-form-item> -->
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
@ -149,7 +167,9 @@ import { listContractor } from '@/api/project/contractor';
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { supply } = toRefs<any>(proxy?.useDict('supply')); const { supply, overdue_type, material_status, operation_status } = toRefs<any>(
proxy?.useDict('supply', 'material_status', 'overdue_type', 'operation_status')
);
// 获取用户 store // 获取用户 store
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目 // 从 store 中获取项目列表和当前选中的项目
@ -164,6 +184,7 @@ const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const batchOptions = ref<any[]>([]); const batchOptions = ref<any[]>([]);
const fileUploadRef = ref();
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const cailiaoshebeiFormRef = ref<ElFormInstance>(); const cailiaoshebeiFormRef = ref<ElFormInstance>();
@ -188,7 +209,18 @@ const initFormData: CailiaoshebeiForm = {
unit: undefined, unit: undefined,
plan: undefined, plan: undefined,
realQuantity: undefined, realQuantity: undefined,
file: undefined,
projectId: currentProject.value.id, projectId: currentProject.value.id,
bo: {
requiredTime: undefined,
orderTime: undefined,
receptionTime: undefined,
materialStatus: undefined,
overdueType: undefined,
cause: undefined,
billType: undefined,
remark: undefined
},
remark: undefined remark: undefined
}; };
const data = reactive<PageData<CailiaoshebeiForm, CailiaoshebeiQuery>>({ const data = reactive<PageData<CailiaoshebeiForm, CailiaoshebeiQuery>>({
@ -295,12 +327,13 @@ const handleAdd = () => {
}; };
/** 修改按钮操作 */ /** 修改按钮操作 */
const operation_s = ref([]);
const handleUpdate = async (row?: CailiaoshebeiVO) => { const handleUpdate = async (row?: CailiaoshebeiVO) => {
reset(); reset();
const _id = row?.id || ids.value[0]; operation_s.value = operation_status.value.slice(0, 2);
const res = await getCailiaoshebei(_id); Object.assign(form.value.bo, row);
Object.assign(form.value, res.data); console.log('🚀 ~ handleUpdate ~ form.value:', form.value);
selectValue.value = (form.value.supplierId as string).split(','); // selectValue.value = (form.value.supplierId as string).split(',');
dialog.visible = true; dialog.visible = true;
dialog.title = '修改物资-材料设备'; dialog.title = '修改物资-材料设备';
}; };
@ -311,14 +344,7 @@ const submitForm = () => {
cailiaoshebeiFormRef.value?.validate(async (valid: boolean) => { cailiaoshebeiFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
buttonLoading.value = true; buttonLoading.value = true;
if (form.value.id) { fileUploadRef.value!.submitUpload();
await updateCailiaoshebei(form.value).finally(() => (buttonLoading.value = false));
} else {
await addCailiaoshebei(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
} }
}); });
}; };
@ -353,15 +379,21 @@ const handleDelete = async (row?: CailiaoshebeiVO) => {
await getList(); await getList();
}; };
/** 导出按钮操作 */ const handleUploadSuccess = () => {
const handleExport = () => { proxy?.$modal.msgSuccess('操作成功');
proxy?.download( dialog.visible = false;
'cailiaoshebei/cailiaoshebei/export', buttonLoading.value = false;
{ getList();
...queryParams.value };
},
`cailiaoshebei_${new Date().getTime()}.xlsx` const handleChange = (value: number) => {
); if (!(value < 4 || value == 10)) {
form.value.bo.billType = '';
form.value.file = '';
} else if (value == 3) {
form.value.bo.overdueType = '';
form.value.bo.cause = '';
}
}; };
/** 查询供货商列表 */ /** 查询供货商列表 */

View File

@ -0,0 +1,257 @@
<template>
<div class="p-2">
<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="name" :inline="true">
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:repertoryDetails:add']">新增</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="repertoryDetailsList">
<el-table-column label="名称" align="center" prop="name" />
<el-table-column label="规格" align="center" prop="specification" />
<el-table-column label="物料编码" align="center" prop="materialCode" />
<el-table-column label="原始数量" align="center" prop="originalQuantity" />
<el-table-column label="变更原因" align="center" prop="changeReasons" />
<el-table-column label="变更数量" align="center" prop="changeQuantity" />
<el-table-column label="操作状态" align="center" prop="operationStatus">
<template #default="scope">
<dict-tag :options="operation_status" :value="scope.row.operationStatus" />
</template>
</el-table-column>
<el-table-column label="操作人" align="center" prop="operationName" />
<el-table-column label="操作人联系电话" align="center" prop="operationPhone" />
</el-table>
<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>
<el-form ref="repertoryDetailsFormRef" :model="form" :rules="rules" label-width="80px">
<!-- <el-form-item label="库存ID" prop="repertoryId">
<el-input v-model="form.repertoryId" placeholder="请输入库存ID" />
</el-form-item>
<el-form-item label="数据来源ID" prop="materialsorderId">
<el-input v-model="form.materialsorderId" placeholder="请输入数据来源ID" />
</el-form-item> -->
<el-form-item label="物料编码" prop="materialCode">
<el-input v-model="form.materialCode" placeholder="请输入物料编码" />
</el-form-item>
<el-form-item label="变更原因" prop="changeReasons">
<el-input v-model="form.changeReasons" placeholder="请输入变更原因" />
</el-form-item>
<el-form-item label="变更数量" prop="changeQuantity">
<el-input v-model="form.changeQuantity" placeholder="请输入变更数量" />
</el-form-item>
<el-form-item label="操作人" prop="operationName">
<el-input v-model="form.operationName" placeholder="请输入操作人" />
</el-form-item>
<el-form-item label="操作状态" prop="operationStatus">
<el-select v-model="form.operationStatus" placeholder="请选择操作状态">
<el-option v-for="item in operation_s" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="联系电话" prop="operationPhone">
<el-input v-model="form.operationPhone" placeholder="请输入操作人联系电话" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="RepertoryDetails" lang="ts">
import {
listRepertoryDetails,
getRepertoryDetails,
delRepertoryDetails,
addRepertoryDetails,
updateRepertoryDetails
} from '@/api/materials/repertoryDetails';
import { RepertoryDetailsVO, RepertoryDetailsQuery, RepertoryDetailsForm } from '@/api/materials/repertoryDetails/types';
import { useUserStoreHook } from '@/store/modules/user';
import { useRoute } from 'vue-router';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const operation_s = ref([]);
const repertoryDetailsList = ref<RepertoryDetailsVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const total = ref(0);
const { operation_status } = toRefs(proxy?.useDict('operation_status'));
const queryFormRef = ref<ElFormInstance>();
const repertoryDetailsFormRef = ref<ElFormInstance>();
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const route = useRoute();
const initFormData: RepertoryDetailsForm = {
id: undefined,
projectId: currentProject.value.id,
repertoryId: undefined,
materialsorderId: undefined,
materialCode: undefined,
originalQuantity: undefined,
changeReasons: undefined,
changeQuantity: undefined,
finalNumber: undefined,
operationStatus: undefined,
operationName: undefined,
operationPhone: undefined
};
const data = reactive<PageData<RepertoryDetailsForm, RepertoryDetailsQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: currentProject.value.id,
repertoryId: undefined,
materialsorderId: undefined,
materialCode: undefined,
name: undefined,
id: undefined,
originalQuantity: undefined,
changeReasons: undefined,
changeQuantity: undefined,
finalNumber: undefined,
operationStatus: undefined,
operationName: undefined,
operationPhone: undefined,
params: {}
},
rules: {
id: [{ required: true, message: 'ID不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询物资-库存列表 */
const getList = async () => {
loading.value = true;
const res = await listRepertoryDetails(queryParams.value);
repertoryDetailsList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
repertoryDetailsFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
operation_s.value = operation_status.value.slice(-2);
console.log('🚀 ~ handleAdd ~ operation_s.value:', operation_s.value, operation_status);
dialog.visible = true;
dialog.title = '添加物资-库存';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: RepertoryDetailsVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getRepertoryDetails(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改物资-库存';
};
/** 提交按钮 */
const submitForm = () => {
repertoryDetailsFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
form.value.repertoryId = route.query.id as string;
await addRepertoryDetails(form.value).finally(() => (buttonLoading.value = false));
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
watch(
() => route.query.id,
(nid: string, oid) => {
console.log(nid);
queryParams.value.repertoryId = nid;
form.value.repertoryId = nid;
getList();
}
);
onMounted(() => {
queryParams.value.repertoryId = route.query.id as string;
form.value.repertoryId = route.query.id as string;
getList();
});
//监听项目id刷新数据
const listeningProject = watch(
() => currentProject.value.id,
(nid, oid) => {
queryParams.value.projectId = nid;
form.value.projectId = nid;
getList();
}
);
onUnmounted(() => {
listeningProject();
});
</script>

View File

@ -0,0 +1,167 @@
<template>
<div class="p-2">
<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="name" label-width="100">
<el-input v-model="queryParams.name" placeholder="请输入设备材料名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<!-- <template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:repertory:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:repertory:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:repertory:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:repertory:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template> -->
<el-table v-loading="loading" :data="repertoryList">
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="设备材料名称" align="center" prop="name" />
<el-table-column label="规格型号" align="center" prop="specification" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleUpdate(scope.row)" v-hasPermi="['system:repertory:edit']">详情</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" />
</el-card>
</div>
</template>
<script setup name="Repertory" lang="ts">
import { listRepertory, getRepertory, delRepertory, addRepertory, updateRepertory } from '@/api/materials/repertory';
import { RepertoryVO, RepertoryQuery, RepertoryForm } from '@/api/materials/repertory/types';
import { useUserStoreHook } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const repertoryList = ref<RepertoryVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
const queryFormRef = ref<ElFormInstance>();
const repertoryFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: RepertoryForm = {
id: undefined,
projectId: undefined,
name: undefined,
specification: undefined,
remark: undefined
};
const data = reactive<PageData<RepertoryForm, RepertoryQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: undefined,
name: undefined,
specification: undefined,
params: {}
},
rules: {
id: [{ required: true, message: 'ID不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询物资-库存详情列表 */
const getList = async () => {
loading.value = true;
const res = await listRepertory(queryParams.value);
repertoryList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
repertoryFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 修改按钮操作 */
const handleUpdate = async (row?: RepertoryVO) => {
proxy?.$tab.openPage('/materials-management/repertoryDetail', '物资清单详情', {
id: row.id
});
};
onMounted(() => {
getList();
});
//监听项目id刷新数据
const listeningProject = watch(
() => currentProject.value.id,
(nid, oid) => {
queryParams.value.projectId = nid;
form.value.projectId = nid;
getList();
}
);
onUnmounted(() => {
listeningProject();
});
</script>

View File

@ -39,6 +39,14 @@
</el-col> </el-col>
<el-col :span="19"> <el-col :span="19">
<el-card shadow="never"> <el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button plain type="warning" icon="Finished" @click="handleAudit()" v-hasPermi="['out:monthPlan:remove']">审核</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="cailiaoshebeiList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="cailiaoshebeiList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="供货商" align="center" prop="supplier" /> <el-table-column label="供货商" align="center" prop="supplier" />
@ -75,7 +83,6 @@
><el-button link type="primary" icon="View" @click="handleDelete(scope.row)" v-hasPermi="['cailiaoshebei:cailiaoshebei:remove']" ><el-button link type="primary" icon="View" @click="handleDelete(scope.row)" v-hasPermi="['cailiaoshebei:cailiaoshebei:remove']"
>详情</el-button >详情</el-button
> >
<el-button link type="primary" icon="Finished" @click="handleAudit(scope.row)" v-hasPermi="['out:monthPlan:remove']">审核</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -321,6 +328,8 @@ const { queryParams, form, rules } = toRefs(data);
/** 查询物资-材料设备列表 */ /** 查询物资-材料设备列表 */
const getList = async () => { const getList = async () => {
if (!queryParams.value.batchNumber) return;
loading.value = true; loading.value = true;
const res = await listCailiaoshebei(queryParams.value); const res = await listCailiaoshebei(queryParams.value);
cailiaoshebeiList.value = res.rows; cailiaoshebeiList.value = res.rows;
@ -335,6 +344,7 @@ const getBatchList = async () => {
batchOptions.value = res.rows; batchOptions.value = res.rows;
total.value = res.total; total.value = res.total;
try { try {
queryParams.value.batchNumber = res.rows[0].batchNumber;
batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber); batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber);
form.value.batchNumber = res.rows[0].batchNumber; form.value.batchNumber = res.rows[0].batchNumber;
form.value.approvalPlan = res.rows[0].approvalPlan; form.value.approvalPlan = res.rows[0].approvalPlan;
@ -351,7 +361,6 @@ const handleNodeClick = (data: any) => {
queryParams.value.batchNumber = data.batchNumber; queryParams.value.batchNumber = data.batchNumber;
form.value.batchNumber = data.batchNumber; form.value.batchNumber = data.batchNumber;
form.value.approvalPlan = data.approvalPlan; form.value.approvalPlan = data.approvalPlan;
console.log('🚀 ~ handleNodeClick ~ form.value:', form.value); console.log('🚀 ~ handleNodeClick ~ form.value:', form.value);
if (data.batchNumber === '0') { if (data.batchNumber === '0') {
queryParams.value.batchNumber = ''; queryParams.value.batchNumber = '';
@ -399,7 +408,6 @@ const handleUpdate = async (row?: CailiaoshebeiVO) => {
const res = await getCailiaoshebei(_id); const res = await getCailiaoshebei(_id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
selectValue.value = (form.value.supplier as string).split(','); selectValue.value = (form.value.supplier as string).split(',');
if (!form.value.listOfMaterialInventory.length) { if (!form.value.listOfMaterialInventory.length) {
form.value.listOfMaterialInventory = selectValue.value.map((item) => { form.value.listOfMaterialInventory = selectValue.value.map((item) => {
return { return {
@ -452,14 +460,16 @@ const handleDelete = async (row?: CailiaoshebeiVO) => {
}; };
/** 审核按钮操作 */ /** 审核按钮操作 */
const handleAudit = async (row?: CailiaoshebeiVO) => { const handleAudit = async () => {
const data = { if (!form.value.batchNumber) {
...row, proxy?.$modal.msgError('请选择批次');
approvalPlan: form.value.approvalPlan return;
}; }
proxy?.$tab.closePage(proxy.$route);
proxy?.$tab.openPage('/materials-management/suppliesprice/indexEdit', '审核物资供应总计划', { proxy?.$tab.openPage('/materials-management/suppliesprice/indexEdit', '审核物资供应总计划', {
id: row?.id, id: form.value.batchNumber,
data: JSON.stringify(data), approvalPlan: form.value.approvalPlan + '_materialsPlans',
type: 'update' type: 'update'
}); });
}; };

View File

@ -16,58 +16,34 @@
<!-- 表单区域 --> <!-- 表单区域 -->
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden"> <el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100"> <div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
<h3 class="text-lg font-semibold text-gray-800">施工产值</h3> <h3 class="text-lg font-semibold text-gray-800">物资供应总计划</h3>
</div> </div>
<div class="p-6"> <div class="p-6">
<el-form <el-table v-loading="loading" :data="cailiaoshebeiList">
ref="leaveFormRef" <el-table-column type="selection" width="55" align="center" />
v-loading="loading" <el-table-column label="供货商" align="center" prop="supplier" />
:disabled="routeParams.type === 'view'" <el-table-column label="设备材料名称" align="center" prop="name" />
:model="form" <el-table-column label="供货来源" align="center" prop="supply">
:rules="rules" <template #default="scope">
label-width="120px" <dict-tag :options="supply" :value="scope.row.supply" />
class="space-y-4" </template>
> </el-table-column>
<el-row :gutter="20" justify="center"> <el-table-column label="规格型号" align="center" prop="specification" />
<el-col :span="12" :offset="0"> <el-table-column label="特征描述" align="center" prop="signalment" />
<el-form-item label="计划到场时间" prop="arrivalTime"> <el-table-column label="物料编码" align="center" prop="materialCode" width="200" />
<el-date-picker <el-table-column label="计划到场时间" align="center" prop="arrivalTime" width="180">
clearable <template #default="scope">
v-model="form.arrivalTime" <span>{{ parseTime(scope.row.arrivalTime, '{y}-{m}-{d}') }}</span>
disabled </template>
type="date" </el-table-column>
value-format="YYYY-MM-DD" <el-table-column label="计划完成时间" align="center" prop="finishTime" width="180">
placeholder="请选择计划到场时间" <template #default="scope">
> <span>{{ parseTime(scope.row.finishTime, '{y}-{m}-{d}') }}</span>
</el-date-picker> </template>
</el-form-item> </el-table-column>
<el-form-item label="计划完成时间" prop="finishTime"> <el-table-column label="计量单位" align="center" prop="unit" />
<el-date-picker clearable v-model="form.finishTime" disabled type="date" value-format="YYYY-MM-DD" placeholder="请选择计划完成时间"> <el-table-column label="计划数量" align="center" prop="plan" />
</el-date-picker> </el-table>
</el-form-item>
<div v-for="(item, index) in selectValue" :key="index">
<el-divider content-position="center"
><el-text tag="b">{{ item }}</el-text></el-divider
>
<el-form-item label="单价" prop="unitPrice">
<el-input v-model="form.listOfMaterialInventory[index].unitPrice" type="number" disabled placeholder="请输入单价" />
</el-form-item>
<el-form-item label="数量" prop="num">
<el-input v-model="form.listOfMaterialInventory[index].num" type="number" disabled placeholder="请输入数量" />
</el-form-item>
<el-form-item label="合同号" prop="contractNum">
<el-input v-model="form.listOfMaterialInventory[index].contractNum" disabled placeholder="请输入合同号" />
</el-form-item>
<el-form-item label="预估供应周期" prop="estimatedCycle">
<el-input v-model="form.listOfMaterialInventory[index].estimatedCycle" disabled type="number" placeholder="请输入预估供应周期" />
</el-form-item>
<el-form-item label="供货公司" prop="supplierCompany">
<el-input v-model="form.listOfMaterialInventory[index].supplierCompany" disabled placeholder="请输入供货公司" />
</el-form-item>
</div>
</el-col>
</el-row>
</el-form>
</div> </div>
</el-card> </el-card>
<!-- 提交组件 --> <!-- 提交组件 -->
@ -116,7 +92,7 @@ const { design_change_reason_type } = toRefs<any>(proxy?.useDict('design_change_
import { getKnowledgeDocument } from '@/api/design/technicalStandard'; import { getKnowledgeDocument } from '@/api/design/technicalStandard';
import { getConstructionValue } from '@/api/out/constructionValue'; import { getConstructionValue } from '@/api/out/constructionValue';
import { workScheduleListDetail } from '@/api/progress/plan'; import { workScheduleListDetail } from '@/api/progress/plan';
import { getCailiaoshebei } from '@/api/materials/suppliesprice'; import { getCailiaoshebei, getPcDetail, listCailiaoshebei } from '@/api/materials/suppliesprice';
// 获取用户 store // 获取用户 store
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目 // 从 store 中获取项目列表和当前选中的项目
@ -139,9 +115,10 @@ const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const flowCodeOptions = [ const flowCodeOptions = [
{ {
value: currentProject.value?.id + '_materialsPlans', value: currentProject.value?.id + '_materialsPlans',
label: '批次需求计划审批' label: '材料总计划审批'
} }
]; ];
const { supply } = toRefs<any>(proxy?.useDict('supply'));
const leaveFormRef = ref<ElFormInstance>(); const leaveFormRef = ref<ElFormInstance>();
const dialog = reactive({ const dialog = reactive({
@ -156,25 +133,11 @@ const submitFormData = ref<StartProcessBo>({
}); });
const taskVariables = ref<Record<string, any>>({}); const taskVariables = ref<Record<string, any>>({});
const selectValue = ref<string[]>([]); const selectValue = ref<string[]>([]);
const cailiaoshebeiList = ref([]);
const initFormData = { const initFormData = {
id: undefined, approvalPlan: undefined,
batchNumber: undefined, id: undefined
supplierId: undefined,
supplier: undefined,
name: undefined,
supply: undefined,
specification: undefined,
signalment: undefined,
materialCode: undefined,
arrivalTime: undefined,
finishTime: undefined,
unit: undefined,
plan: undefined,
realQuantity: undefined,
projectId: currentProject.value.id,
listOfMaterialInventory: [],
remark: undefined
}; };
const data = reactive({ const data = reactive({
form: { ...initFormData }, form: { ...initFormData },
@ -199,20 +162,18 @@ const getInfo = () => {
loading.value = true; loading.value = true;
buttonLoading.value = false; buttonLoading.value = false;
nextTick(async () => { nextTick(async () => {
const res = JSON.parse(routeParams.value.data); const id = routeParams.value.id.split('_')[0];
Object.assign(form.value, res.data); const res = await listCailiaoshebei({ pageNum: 1, pageSize: 10, batchNumber: id });
selectValue.value = (form.value.supplier as string).split(','); cailiaoshebeiList.value = res.rows;
if (!form.value.listOfMaterialInventory.length) { if (!form.value.approvalPlan) {
form.value.listOfMaterialInventory = selectValue.value.map((item) => { const res = await getPcDetail(id);
return { form.value.approvalPlan = res.data.approvalPlan;
supplierCompany: item, } else {
estimatedCycle: '', form.value.approvalPlan = routeParams.value.approvalPlan;
contractNum: '',
num: '',
unitPrice: ''
};
});
} }
console.log('🚀 ~ getInfo ~ form.value.approvalDesign:', form.value.approvalPlan);
form.value.id = routeParams.value.id;
loading.value = false; loading.value = false;
buttonLoading.value = false; buttonLoading.value = false;
}); });

View File

@ -26,6 +26,9 @@
<el-card shadow="never"> <el-card shadow="never">
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button> <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
</el-col> </el-col>
@ -86,7 +89,7 @@
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="progressCategoryFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="progressCategoryFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="类别名称" prop="name"> <el-form-item label="类别名称" prop="name">
<el-input v-model="form.name" placeholder="请输入类别名称" disabled /> <el-input v-model="form.name" placeholder="请输入类别名称" :disabled="form.id != null" />
</el-form-item> </el-form-item>
<el-form-item label="计量单位" prop="unit"> <el-form-item label="计量单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入计量单位" /> <el-input v-model="form.unit" placeholder="请输入计量单位" />
@ -312,7 +315,7 @@ const toggleExpandAll = (data: ProgressCategoryVO[], status: boolean) => {
const isDisabled = ref<boolean>(false); const isDisabled = ref<boolean>(false);
const handleUpdate = async (row: ProgressCategoryVO) => { const handleUpdate = async (row: ProgressCategoryVO) => {
reset(); reset();
if (row.unitType == '2') { if (!row.unitType) {
isDisabled.value = true; isDisabled.value = true;
} }
await getTreeselect(); await getTreeselect();

View File

@ -0,0 +1,310 @@
<template>
<div class="p-2">
<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="name">
<el-input v-model="queryParams.name" placeholder="请输入类别名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="施工类型" prop="constructionType">
<el-select v-model="queryParams.constructionType" placeholder="请选择施工类型" clearable @change="getList">
<el-option v-for="dict in project_category_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<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:progressCategoryTemplate:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table
ref="progressCategoryTemplateTableRef"
v-loading="loading"
:data="progressCategoryTemplateList"
row-key="id"
:default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<el-table-column label="类别名称" prop="name" />
<el-table-column label="计量方式" align="center" prop="unitType" width="100">
<template #default="{ row }">
<dict-tag :options="progress_unit_type" :value="row.unitType" />
</template>
</el-table-column>
<el-table-column label="关联数据" align="center" prop="workType">
<template #default="{ row }">
<dict-tag :options="progress_work_type" :value="row.workType" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<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:progressCategoryTemplate:edit']" />
</el-tooltip>
<el-tooltip content="新增" placement="top">
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['progress:progressCategoryTemplate:add']" />
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['progress:progressCategoryTemplate:remove']"
/>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 添加或修改进度类别模版对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="progressCategoryTemplateFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="父类别id" prop="parentId">
<el-tree-select
v-model="form.parentId"
:data="progressCategoryTemplateOptions"
:props="{ value: 'id', label: 'name', children: 'children' }"
value-key="id"
placeholder="请选择父类别id"
check-strictly
/>
</el-form-item>
<el-form-item label="施工类型" prop="constructionType">
<el-select v-model="form.constructionType" placeholder="请选择施工类型" disabled>
<el-option v-for="dict in project_category_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="计量方式" prop="unitType">
<el-select v-model="form.unitType" placeholder="请选择关联数据">
<el-option v-for="dict in progress_unit_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="类别名称" prop="name">
<el-input v-model="form.name" placeholder="请输入类别名称" />
</el-form-item>
<el-form-item label="关联数据" prop="workType">
<el-select v-model="form.workType" placeholder="请选择关联数据">
<el-option v-for="dict in progress_work_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="ProgressCategoryTemplate" lang="ts">
import {
addProgressCategoryTemplate,
delProgressCategoryTemplate,
getProgressCategoryTemplate,
listProgressCategoryTemplate,
updateProgressCategoryTemplate
} from '@/api/progress/progressCategoryTemplate';
import {
ProgressCategoryTemplateForm,
ProgressCategoryTemplateQuery,
ProgressCategoryTemplateVO
} from '@/api/progress/progressCategoryTemplate/types';
type ProgressCategoryTemplateOption = {
id: number;
name: string;
children?: ProgressCategoryTemplateOption[];
};
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { progress_work_type, progress_unit_type, project_category_type } = toRefs<any>(
proxy?.useDict('progress_work_type', 'progress_unit_type', 'project_category_type')
);
const progressCategoryTemplateList = ref<ProgressCategoryTemplateVO[]>([]);
const progressCategoryTemplateOptions = ref<ProgressCategoryTemplateOption[]>([]);
const buttonLoading = ref(false);
const showSearch = ref(true);
const isExpandAll = ref(true);
const loading = ref(false);
const queryFormRef = ref<ElFormInstance>();
const progressCategoryTemplateFormRef = ref<ElFormInstance>();
const progressCategoryTemplateTableRef = ref<ElTableInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: ProgressCategoryTemplateForm = {
id: undefined,
parentId: undefined,
name: undefined,
unitType: undefined,
workType: undefined,
constructionType: undefined,
projectId: 0,
remark: undefined
};
const data = reactive<PageData<ProgressCategoryTemplateForm, ProgressCategoryTemplateQuery>>({
form: { ...initFormData },
queryParams: {
parentId: undefined,
name: undefined,
unitType: undefined,
workType: undefined,
constructionType: '1',
projectId: 0,
params: {}
},
rules: {
id: [{ required: true, message: '主键id不能为空', trigger: 'blur' }],
parentId: [{ required: true, message: '父类别id不能为空', trigger: 'blur' }],
name: [{ required: true, message: '类别名称不能为空', trigger: 'blur' }],
unitType: [{ required: true, message: '计量方式不能为空', trigger: 'change' }],
projectId: [{ required: true, message: '项目id不能为空', trigger: 'blur' }],
constructionType: [{ required: true, message: '施工类型不能为空', trigger: 'change' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询进度类别模版列表 */
const getList = async () => {
loading.value = true;
const res = await listProgressCategoryTemplate(queryParams.value);
const data = proxy?.handleTree<ProgressCategoryTemplateVO>(res.data, 'id', 'parentId');
if (data) {
progressCategoryTemplateList.value = data;
loading.value = false;
}
};
/** 查询进度类别模版下拉树结构 */
const getTreeselect = async () => {
const res = await listProgressCategoryTemplate();
progressCategoryTemplateOptions.value = [];
const data: ProgressCategoryTemplateOption = { id: 0, name: '顶级节点', children: [] };
data.children = proxy?.handleTree<ProgressCategoryTemplateOption>(res.data, 'id', 'parentId');
progressCategoryTemplateOptions.value.push(data);
};
// 取消按钮
const cancel = () => {
reset();
dialog.visible = false;
};
// 表单重置
const reset = () => {
form.value = { ...initFormData };
progressCategoryTemplateFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 新增按钮操作 */
const handleAdd = (row?: ProgressCategoryTemplateVO) => {
reset();
form.value.constructionType = queryParams.value.constructionType;
getTreeselect();
if (row != null && row.id) {
form.value.parentId = row.id;
} else {
form.value.parentId = 0;
}
dialog.visible = true;
dialog.title = '添加进度类别模版';
};
/** 展开/折叠操作 */
const handleToggleExpandAll = () => {
isExpandAll.value = !isExpandAll.value;
toggleExpandAll(progressCategoryTemplateList.value, isExpandAll.value);
};
/** 展开/折叠操作 */
const toggleExpandAll = (data: ProgressCategoryTemplateVO[], status: boolean) => {
data.forEach((item) => {
progressCategoryTemplateTableRef.value?.toggleRowExpansion(item, status);
if (item.children && item.children.length > 0) toggleExpandAll(item.children, status);
});
};
/** 修改按钮操作 */
const handleUpdate = async (row: ProgressCategoryTemplateVO) => {
reset();
await getTreeselect();
if (row != null) {
form.value.parentId = row.parentId;
}
const res = await getProgressCategoryTemplate(row.id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改进度类别模版';
};
/** 提交按钮 */
const submitForm = () => {
progressCategoryTemplateFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateProgressCategoryTemplate(form.value).finally(() => (buttonLoading.value = false));
} else {
await addProgressCategoryTemplate(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row: ProgressCategoryTemplateVO) => {
await proxy?.$modal.confirm('是否确认删除进度类别模版编号为"' + row.id + '"的数据项?');
loading.value = true;
await delProgressCategoryTemplate(row.id).finally(() => (loading.value = false));
await getList();
proxy?.$modal.msgSuccess('删除成功');
};
onMounted(() => {
getList();
});
</script>

View File

@ -4,15 +4,14 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="父类别id" prop="pid"> <el-form-item label="选择项目" prop="projectId" width="100">
<el-input v-model="queryParams.pid" placeholder="请输入父类别id" clearable @keyup.enter="handleQuery" /> <el-select v-model="queryParams.projectId" @change="getList">
<el-option v-for="item in projectSon" :label="item.projectName" :value="item.id" :key="item.id"></el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="类别名称" prop="name"> <el-form-item label="类别名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入类别名称" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.name" placeholder="请输入类别名称" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="项目id" prop="projectId">
<el-input v-model="queryParams.projectId" placeholder="请输入项目id" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -42,10 +41,17 @@
:default-expand-all="isExpandAll" :default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
> >
<el-table-column label="类别名称" align="center" prop="name" /> <el-table-column label="类别名称" prop="name" />
<el-table-column label="计量方式" align="center" prop="unitType" /> <el-table-column label="计量方式" align="center" prop="unitType" width="100">
<el-table-column label="工作类型" align="center" prop="workType" /> <template #default="{ row }">
<el-table-column label="项目id" align="center" prop="projectId" /> <dict-tag :options="progress_unit_type" :value="row.unitType" />
</template>
</el-table-column>
<el-table-column label="关联数据" align="center" prop="workType">
<template #default="{ row }">
<dict-tag :options="progress_work_type" :value="row.workType" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
@ -56,7 +62,13 @@
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['progress:progressCategoryTemplate:add']" /> <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['progress:progressCategoryTemplate:add']" />
</el-tooltip> </el-tooltip>
<el-tooltip content="删除" placement="top"> <el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['progress:progressCategoryTemplate:remove']" /> <el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['progress:progressCategoryTemplate:remove']"
/>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
@ -65,9 +77,9 @@
<!-- 添加或修改进度类别模版对话框 --> <!-- 添加或修改进度类别模版对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="progressCategoryTemplateFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="progressCategoryTemplateFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="父类别id" prop="pid"> <el-form-item label="父类别id" prop="parentId">
<el-tree-select <el-tree-select
v-model="form.pid" v-model="form.parentId"
:data="progressCategoryTemplateOptions" :data="progressCategoryTemplateOptions"
:props="{ value: 'id', label: 'name', children: 'children' }" :props="{ value: 'id', label: 'name', children: 'children' }"
value-key="id" value-key="id"
@ -75,11 +87,18 @@
check-strictly check-strictly
/> />
</el-form-item> </el-form-item>
<el-form-item label="计量方式" prop="unitType">
<el-select v-model="form.unitType" placeholder="请选择关联数据">
<el-option v-for="dict in progress_unit_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="类别名称" prop="name"> <el-form-item label="类别名称" prop="name">
<el-input v-model="form.name" placeholder="请输入类别名称" /> <el-input v-model="form.name" placeholder="请输入类别名称" />
</el-form-item> </el-form-item>
<el-form-item label="项目id" prop="projectId"> <el-form-item label="关联数据" prop="workType">
<el-input v-model="form.projectId" placeholder="请输入项目id" /> <el-select v-model="form.workType" placeholder="请选择关联数据">
<el-option v-for="dict in progress_work_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
@ -96,18 +115,36 @@
</template> </template>
<script setup name="ProgressCategoryTemplate" lang="ts"> <script setup name="ProgressCategoryTemplate" lang="ts">
import { listProgressCategoryTemplate, getProgressCategoryTemplate, delProgressCategoryTemplate, addProgressCategoryTemplate, updateProgressCategoryTemplate } from "@/api/progress/progressCategoryTemplate"; import {
import { ProgressCategoryTemplateVO, ProgressCategoryTemplateQuery, ProgressCategoryTemplateForm } from '@/api/progress/progressCategoryTemplate/types'; addProgressCategoryTemplate,
delProgressCategoryTemplate,
getProgressCategoryTemplate,
listProgressCategoryTemplate,
updateProgressCategoryTemplate
} from '@/api/progress/progressCategoryTemplate';
import {
ProgressCategoryTemplateForm,
ProgressCategoryTemplateQuery,
ProgressCategoryTemplateVO
} from '@/api/progress/progressCategoryTemplate/types';
import { useUserStoreHook } from '@/store/modules/user';
import { getChildProject } from '@/api/project/project';
type ProgressCategoryTemplateOption = { type ProgressCategoryTemplateOption = {
id: number; id: number;
name: string; name: string;
children?: ProgressCategoryTemplateOption[]; children?: ProgressCategoryTemplateOption[];
} };
const { proxy } = getCurrentInstance() as ComponentInternalInstance;;
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { progress_work_type, progress_unit_type, project_category_type } = toRefs<any>(
proxy?.useDict('progress_work_type', 'progress_unit_type', 'project_category_type')
);
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
const progressCategoryTemplateList = ref<ProgressCategoryTemplateVO[]>([]); const progressCategoryTemplateList = ref<ProgressCategoryTemplateVO[]>([]);
const progressCategoryTemplateOptions = ref<ProgressCategoryTemplateOption[]>([]); const progressCategoryTemplateOptions = ref<ProgressCategoryTemplateOption[]>([]);
const buttonLoading = ref(false); const buttonLoading = ref(false);
@ -117,51 +154,41 @@ const loading = ref(false);
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const progressCategoryTemplateFormRef = ref<ElFormInstance>(); const progressCategoryTemplateFormRef = ref<ElFormInstance>();
const progressCategoryTemplateTableRef = ref<ElTableInstance>() const progressCategoryTemplateTableRef = ref<ElTableInstance>();
const projectSon = ref<any>([]);
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
title: '' title: ''
}); });
const initFormData: ProgressCategoryTemplateForm = { const initFormData: ProgressCategoryTemplateForm = {
id: undefined, id: undefined,
pid: undefined, parentId: undefined,
name: undefined, name: undefined,
unitType: undefined, unitType: undefined,
workType: undefined, workType: undefined,
projectId: undefined, projectId: undefined,
remark: undefined, constructionType: undefined,
} remark: undefined
};
const data = reactive<PageData<ProgressCategoryTemplateForm, ProgressCategoryTemplateQuery>>({ const data = reactive<PageData<ProgressCategoryTemplateForm, ProgressCategoryTemplateQuery>>({
form: {...initFormData}, form: { ...initFormData },
queryParams: { queryParams: {
pid: undefined, parentId: undefined,
name: undefined, name: undefined,
unitType: undefined, unitType: undefined,
workType: undefined, workType: undefined,
projectId: undefined, projectId: undefined,
params: { constructionType: undefined,
} params: {}
}, },
rules: { rules: {
id: [ id: [{ required: true, message: '主键id不能为空', trigger: 'blur' }],
{ required: true, message: "主键id不能为空", trigger: "blur" } parentId: [{ required: true, message: '父类别id不能为空', trigger: 'blur' }],
], name: [{ required: true, message: '类别名称不能为空', trigger: 'blur' }],
pid: [ unitType: [{ required: true, message: '计量方式不能为空', trigger: 'change' }],
{ required: true, message: "父类别id不能为空", trigger: "blur" } projectId: [{ required: true, message: '项目id不能为空', trigger: 'blur' }]
],
name: [
{ required: true, message: "类别名称不能为空", trigger: "blur" }
],
unitType: [
{ required: true, message: "计量方式不能为空", trigger: "change" }
],
projectId: [
{ required: true, message: "项目id不能为空", trigger: "blur" }
],
} }
}); });
@ -171,112 +198,124 @@ const { queryParams, form, rules } = toRefs(data);
const getList = async () => { const getList = async () => {
loading.value = true; loading.value = true;
const res = await listProgressCategoryTemplate(queryParams.value); const res = await listProgressCategoryTemplate(queryParams.value);
const data = proxy?.handleTree<ProgressCategoryTemplateVO>(res.data, "id", "pid"); const data = proxy?.handleTree<ProgressCategoryTemplateVO>(res.data, 'id', 'parentId');
if (data) { if (data) {
progressCategoryTemplateList.value = data; progressCategoryTemplateList.value = data;
loading.value = false; loading.value = false;
} }
} };
/** 查询进度类别模版下拉树结构 */ /** 查询进度类别模版下拉树结构 */
const getTreeselect = async () => { const getTreeselect = async () => {
const res = await listProgressCategoryTemplate(); const res = await listProgressCategoryTemplate();
progressCategoryTemplateOptions.value = []; progressCategoryTemplateOptions.value = [];
const data: ProgressCategoryTemplateOption = { id: 0, name: '顶级节点', children: [] }; const data: ProgressCategoryTemplateOption = { id: 0, name: '顶级节点', children: [] };
data.children = proxy?.handleTree<ProgressCategoryTemplateOption>(res.data, "id", "pid"); data.children = proxy?.handleTree<ProgressCategoryTemplateOption>(res.data, 'id', 'parentId');
progressCategoryTemplateOptions.value.push(data); progressCategoryTemplateOptions.value.push(data);
} };
// 取消按钮 // 取消按钮
const cancel = () => { const cancel = () => {
reset(); reset();
dialog.visible = false; dialog.visible = false;
} };
// 表单重置 // 表单重置
const reset = () => { const reset = () => {
form.value = {...initFormData} form.value = { ...initFormData };
progressCategoryTemplateFormRef.value?.resetFields(); progressCategoryTemplateFormRef.value?.resetFields();
} };
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {
getList(); getList();
} };
/** 重置按钮操作 */ /** 重置按钮操作 */
const resetQuery = () => { const resetQuery = () => {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.value.projectId = projectSon.value[0]?.id;
handleQuery(); handleQuery();
} };
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = (row?: ProgressCategoryTemplateVO) => { const handleAdd = (row?: ProgressCategoryTemplateVO) => {
reset(); reset();
getTreeselect(); getTreeselect();
if (row != null && row.id) { if (row != null && row.id) {
form.value.pid = row.id; form.value.parentId = row.id;
} else { } else {
form.value.pid = 0; form.value.parentId = 0;
} }
dialog.visible = true; dialog.visible = true;
dialog.title = "添加进度类别模版"; dialog.title = '添加进度类别模版';
} };
/** 展开/折叠操作 */ /** 展开/折叠操作 */
const handleToggleExpandAll = () => { const handleToggleExpandAll = () => {
isExpandAll.value = !isExpandAll.value; isExpandAll.value = !isExpandAll.value;
toggleExpandAll(progressCategoryTemplateList.value, isExpandAll.value) toggleExpandAll(progressCategoryTemplateList.value, isExpandAll.value);
} };
/** 展开/折叠操作 */ /** 展开/折叠操作 */
const toggleExpandAll = (data: ProgressCategoryTemplateVO[], status: boolean) => { const toggleExpandAll = (data: ProgressCategoryTemplateVO[], status: boolean) => {
data.forEach((item) => { data.forEach((item) => {
progressCategoryTemplateTableRef.value?.toggleRowExpansion(item, status) progressCategoryTemplateTableRef.value?.toggleRowExpansion(item, status);
if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) if (item.children && item.children.length > 0) toggleExpandAll(item.children, status);
}) });
} };
/** 修改按钮操作 */ /** 修改按钮操作 */
const handleUpdate = async (row: ProgressCategoryTemplateVO) => { const handleUpdate = async (row: ProgressCategoryTemplateVO) => {
reset(); reset();
await getTreeselect(); await getTreeselect();
if (row != null) { if (row != null) {
form.value.pid = row.pid; form.value.parentId = row.parentId;
} }
const res = await getProgressCategoryTemplate(row.id); const res = await getProgressCategoryTemplate(row.id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
dialog.visible = true; dialog.visible = true;
dialog.title = "修改进度类别模版"; dialog.title = '修改进度类别模版';
} };
/** 提交按钮 */ /** 提交按钮 */
const submitForm = () => { const submitForm = () => {
progressCategoryTemplateFormRef.value?.validate(async (valid: boolean) => { progressCategoryTemplateFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
buttonLoading.value = true; buttonLoading.value = true;
form.value.projectId = queryParams.value.projectId;
if (form.value.id) { if (form.value.id) {
await updateProgressCategoryTemplate(form.value).finally(() => buttonLoading.value = false); await updateProgressCategoryTemplate(form.value).finally(() => (buttonLoading.value = false));
} else { } else {
await addProgressCategoryTemplate(form.value).finally(() => buttonLoading.value = false); await addProgressCategoryTemplate(form.value).finally(() => (buttonLoading.value = false));
} }
proxy?.$modal.msgSuccess("操作成功"); proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false; dialog.visible = false;
getList(); getList();
} }
}); });
} };
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (row: ProgressCategoryTemplateVO) => { const handleDelete = async (row: ProgressCategoryTemplateVO) => {
await proxy?.$modal.confirm('是否确认删除进度类别模版编号为"' + row.id + '"的数据项?'); await proxy?.$modal.confirm('是否确认删除进度类别模版编号为"' + row.id + '"的数据项?');
loading.value = true; loading.value = true;
await delProgressCategoryTemplate(row.id).finally(() => loading.value = false); await delProgressCategoryTemplate(row.id).finally(() => (loading.value = false));
await getList(); await getList();
proxy?.$modal.msgSuccess("删除成功"); proxy?.$modal.msgSuccess('删除成功');
} };
/**
* 获取子项目列表
*/
const getSubProjectList = async () => {
const res = await getChildProject(currentProject.value.id);
projectSon.value = res.data;
queryParams.value.projectId = projectSon.value[0]?.id;
getList();
};
onMounted(() => { onMounted(() => {
getList(); getSubProjectList();
}); });
</script> </script>

View File

@ -122,6 +122,11 @@
<el-form-item label="巡检结果" prop="inspectionResult"> <el-form-item label="巡检结果" prop="inspectionResult">
<el-input v-model="form.inspectionResult" placeholder="请输入巡检结果" /> <el-input v-model="form.inspectionResult" placeholder="请输入巡检结果" />
</el-form-item> </el-form-item>
<el-form-item label="工单整改单位" prop="rectificationUnit">
<el-select v-model="form.rectificationUnit" placeholder="请选择整改单位类型">
<el-option v-for="dict in rectification_unit_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="整改班组" prop="teamId"> <el-form-item label="整改班组" prop="teamId">
<el-select v-model="form.teamId" placeholder="请选择整改班组"> <el-select v-model="form.teamId" placeholder="请选择整改班组">
<el-option v-for="item in teamOpt" :key="item.value" :label="item.label" :value="item.value" @click="changeForeman(item.value)" /> <el-option v-for="item in teamOpt" :key="item.value" :label="item.label" :value="item.value" @click="changeForeman(item.value)" />
@ -179,8 +184,14 @@ import { listProjectTeamForeman } from '@/api/project/projectTeam';
import { foremanQuery, ProjectTeamForemanResp } from '@/api/project/projectTeam/types'; import { foremanQuery, ProjectTeamForemanResp } from '@/api/project/projectTeam/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { safety_inspection_violation_type, review_type, safety_inspection_type, safety_inspection_check_type } = toRefs<any>( const { rectification_unit_type, safety_inspection_violation_type, review_type, safety_inspection_type, safety_inspection_check_type } = toRefs<any>(
proxy?.useDict('safety_inspection_violation_type', 'review_type', 'safety_inspection_type', 'safety_inspection_check_type') proxy?.useDict(
'rectification_unit_type',
'safety_inspection_violation_type',
'review_type',
'safety_inspection_type',
'safety_inspection_check_type'
)
); );
// 获取用户 store // 获取用户 store
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
@ -222,6 +233,8 @@ const initFormData: SafetyInspectionForm = {
reviewType: undefined, reviewType: undefined,
checkTime: undefined, checkTime: undefined,
rectificationTime: undefined, rectificationTime: undefined,
rectificationUnit: undefined,
reviewTime: undefined, reviewTime: undefined,
checkFile: undefined, checkFile: undefined,
rectificationFile: undefined, rectificationFile: undefined,