材料管理 变更清单
This commit is contained in:
@ -5,7 +5,7 @@ VITE_APP_TITLE = 新能源项目管理平台
|
||||
VITE_APP_ENV = 'development'
|
||||
|
||||
# 开发环境
|
||||
VITE_APP_BASE_API = 'http://192.168.110.119:8898'
|
||||
VITE_APP_BASE_API = 'http://192.168.110.159:8898'
|
||||
|
||||
# 无人机接口地址
|
||||
|
||||
|
@ -97,3 +97,14 @@ export const delBatch = (ids: string | number | Array<string | number>) => {
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询物资-材料设备批次详情
|
||||
* @param id
|
||||
*/
|
||||
export const getPcDetail = (id: string | number): AxiosPromise<CailiaoshebeiVO> => {
|
||||
return request({
|
||||
url: '/cailiaoshebei/materialbatchdemandplan/spQuery/' + id,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
@ -97,3 +97,14 @@ export const delBatch = (ids: string | number | Array<string | number>) => {
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询物资-材料设备批次详情
|
||||
* @param id
|
||||
*/
|
||||
export const getPcDetail = (id: string | number): AxiosPromise<CailiaoshebeiVO> => {
|
||||
return request({
|
||||
url: '/cailiaoshebei/cailiaoshebei/spQuery/' + id,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
@ -83,6 +83,9 @@ export interface CailiaoshebeiForm extends BaseEntity {
|
||||
projectId?: string | number;
|
||||
batchNumber?: string | number;
|
||||
approvalDesign?: string;
|
||||
bo: any;
|
||||
file: string;
|
||||
|
||||
/**
|
||||
* 批次ID
|
||||
*/
|
||||
|
@ -97,3 +97,14 @@ export const delBatch = (ids: string | number | Array<string | number>) => {
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询物资-材料设备批次详情
|
||||
* @param id
|
||||
*/
|
||||
export const getPcDetail = (id: string | number): AxiosPromise<CailiaoshebeiVO> => {
|
||||
return request({
|
||||
url: '/cailiaoshebei/materialsorder/spQuery/' + id,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
@ -45,7 +45,7 @@ export const addCailiaoshebei = (data: CailiaoshebeiForm) => {
|
||||
*/
|
||||
export const updateCailiaoshebei = (data: CailiaoshebeiForm) => {
|
||||
return request({
|
||||
url: '/cailiaoshebei/cailiaoshebei',
|
||||
url: '/cailiaoshebei/materialsorder/changeTheStatusOfTheMaterials',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
|
63
src/api/materials/repertory/index.ts
Normal file
63
src/api/materials/repertory/index.ts
Normal 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'
|
||||
});
|
||||
};
|
81
src/api/materials/repertory/types.ts
Normal file
81
src/api/materials/repertory/types.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
|
63
src/api/materials/repertoryDetails/index.ts
Normal file
63
src/api/materials/repertoryDetails/index.ts
Normal 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'
|
||||
});
|
||||
};
|
187
src/api/materials/repertoryDetails/types.ts
Normal file
187
src/api/materials/repertoryDetails/types.ts
Normal 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;
|
||||
}
|
@ -97,3 +97,14 @@ export const delBatch = (ids: string | number | Array<string | number>) => {
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询物资-材料设备批次详情
|
||||
* @param id
|
||||
*/
|
||||
export const getPcDetail = (id: string | number): AxiosPromise<CailiaoshebeiVO> => {
|
||||
return request({
|
||||
url: '/cailiaoshebei/cailiaoshebei/spQueryPlan/' + id,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
@ -140,7 +140,10 @@ export interface SafetyInspectionForm extends BaseEntity {
|
||||
* 主键ID
|
||||
*/
|
||||
id?: string | number;
|
||||
|
||||
/**
|
||||
* 整改单位类型
|
||||
*/
|
||||
rectificationUnit?: string;
|
||||
/**
|
||||
* 父id(默认为0)
|
||||
*/
|
||||
|
@ -112,6 +112,11 @@ const props = defineProps({
|
||||
type: Function as PropType<(files: any[]) => void>,
|
||||
default: undefined
|
||||
},
|
||||
// 失败回调
|
||||
onUploadError: {
|
||||
type: Function as PropType<(err: any, file: any, fileList: any) => void>,
|
||||
default: undefined
|
||||
},
|
||||
params: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
|
@ -47,6 +47,9 @@
|
||||
<el-col :span="1.5">
|
||||
<el-button type="success" plain icon="Check" @click="submitForm" v-hasPermi="['cailiaoshebei:cailiaoshebei:delete']">保存</el-button>
|
||||
</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>
|
||||
</el-row>
|
||||
@ -78,11 +81,6 @@
|
||||
<dict-tag :options="wf_business_status" :value="scope.row.planAuditStatus" />
|
||||
</template>
|
||||
</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-card>
|
||||
</el-col>
|
||||
@ -205,6 +203,7 @@ const { queryParams, form, rules } = toRefs(data);
|
||||
|
||||
/** 查询物资-材料设备列表 */
|
||||
const getList = async () => {
|
||||
if (!queryParams.value.batchNumber) return;
|
||||
loading.value = true;
|
||||
const res = await listCailiaoshebei(queryParams.value);
|
||||
cailiaoshebeiList.value = res.rows;
|
||||
@ -215,15 +214,16 @@ const getList = async () => {
|
||||
//查询批次列表
|
||||
const getBatchList = async () => {
|
||||
const res = await listBatch(queryParams.value);
|
||||
console.log('🚀 ~ getBatchList ~ res:', res);
|
||||
batchOptions.value = res.rows;
|
||||
total.value = res.total;
|
||||
try {
|
||||
queryParams.value.batchNumber = res.rows[0].batchNumber;
|
||||
batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber);
|
||||
form.value.batchNumber = res.rows[0].batchNumber;
|
||||
form.value.approvalProject = res.rows[0].approvalProject;
|
||||
} catch (error) {
|
||||
form.value.batchNumber = '';
|
||||
queryParams.value.batchNumber = '';
|
||||
}
|
||||
getList();
|
||||
};
|
||||
@ -286,17 +286,6 @@ const handleAdd = () => {
|
||||
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 () => {
|
||||
buttonLoading.value = true;
|
||||
@ -351,14 +340,15 @@ const handleDelete = async (row?: CailiaoshebeiVO) => {
|
||||
};
|
||||
|
||||
/** 审核按钮操作 */
|
||||
const handleAudit = async (row?: CailiaoshebeiVO) => {
|
||||
const data = {
|
||||
...row,
|
||||
approvalProject: form.value.approvalProject
|
||||
};
|
||||
const handleAudit = async () => {
|
||||
if (!form.value.approvalProject) {
|
||||
proxy?.$modal.msgError('请选择批次号');
|
||||
return;
|
||||
}
|
||||
proxy?.$tab.closePage(proxy.$route);
|
||||
proxy?.$tab.openPage('/materials-management/batchPlan/indexEdit', '审核物资设备批次需求计划', {
|
||||
id: row?.id,
|
||||
data: JSON.stringify(data),
|
||||
id: form.value.batchNumber,
|
||||
approvalProject: form.value.approvalProject + '_batchRequirements',
|
||||
type: 'update'
|
||||
});
|
||||
};
|
||||
|
@ -16,58 +16,29 @@
|
||||
<!-- 表单区域 -->
|
||||
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
|
||||
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
|
||||
<h3 class="text-lg font-semibold text-gray-800">施工产值</h3>
|
||||
<h3 class="text-lg font-semibold text-gray-800">物资设备批次需求计划</h3>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<el-form
|
||||
ref="leaveFormRef"
|
||||
v-loading="loading"
|
||||
:disabled="routeParams.type === 'view'"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-width="120px"
|
||||
class="space-y-4"
|
||||
>
|
||||
<el-row :gutter="20" justify="center">
|
||||
<el-col :span="12" :offset="0">
|
||||
<el-form-item label="计划到场时间" prop="arrivalTime">
|
||||
<el-date-picker
|
||||
clearable
|
||||
v-model="form.arrivalTime"
|
||||
disabled
|
||||
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>
|
||||
<el-table v-loading="loading" :data="cailiaoshebeiList">
|
||||
<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="unit" width="80" />
|
||||
<el-table-column label="供应周期(天)" align="center" prop="estimatedCycle" />
|
||||
<el-table-column label="需求数量" align="center" prop="demandQuantity">
|
||||
<template #default="scope">
|
||||
<el-input v-model="scope.row.demandQuantity" type="number" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="计划到场时间" align="center" prop="arrivalTime" width="250">
|
||||
<template #default="scope">
|
||||
<div class="flex justify-center w100%">
|
||||
<el-date-picker v-model="scope.row.arrivalTime" type="date" value-format="YYYY-MM-DD" />
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-card>
|
||||
<!-- 提交组件 -->
|
||||
@ -117,6 +88,8 @@ import { getKnowledgeDocument } from '@/api/design/technicalStandard';
|
||||
import { getConstructionValue } from '@/api/out/constructionValue';
|
||||
import { workScheduleListDetail } from '@/api/progress/plan';
|
||||
import { getCailiaoshebei } from '@/api/materials/suppliesprice';
|
||||
import { getPcDetail, listCailiaoshebei } from '@/api/materials/batchPlan';
|
||||
import { CailiaoshebeiVO } from '@/api/materials/batchPlan/types';
|
||||
// 获取用户 store
|
||||
const userStore = useUserStoreHook();
|
||||
// 从 store 中获取项目列表和当前选中的项目
|
||||
@ -156,25 +129,11 @@ const submitFormData = ref<StartProcessBo>({
|
||||
});
|
||||
const taskVariables = ref<Record<string, any>>({});
|
||||
const selectValue = ref<string[]>([]);
|
||||
const cailiaoshebeiList = ref<CailiaoshebeiVO[]>([]);
|
||||
|
||||
const initFormData = {
|
||||
id: undefined,
|
||||
batchNumber: 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
|
||||
approvalProject: undefined
|
||||
};
|
||||
const data = reactive({
|
||||
form: { ...initFormData },
|
||||
@ -199,20 +158,19 @@ const getInfo = () => {
|
||||
loading.value = true;
|
||||
buttonLoading.value = false;
|
||||
nextTick(async () => {
|
||||
const res = JSON.parse(routeParams.value.data);
|
||||
Object.assign(form.value, res.data);
|
||||
selectValue.value = (form.value.supplier as string).split(',');
|
||||
if (!form.value.listOfMaterialInventory.length) {
|
||||
form.value.listOfMaterialInventory = selectValue.value.map((item) => {
|
||||
return {
|
||||
supplierCompany: item,
|
||||
estimatedCycle: '',
|
||||
contractNum: '',
|
||||
num: '',
|
||||
unitPrice: ''
|
||||
};
|
||||
});
|
||||
const id = routeParams.value.id.split('_')[0];
|
||||
const res = await listCailiaoshebei({ pageNum: 1, pageSize: 10, batchNumber: id });
|
||||
cailiaoshebeiList.value = res.rows;
|
||||
if (!form.value.approvalProject) {
|
||||
const res = await getPcDetail(id);
|
||||
form.value.approvalProject = res.data.approvalProject;
|
||||
} else {
|
||||
form.value.approvalProject = routeParams.value.approvalProject;
|
||||
}
|
||||
|
||||
console.log('🚀 ~ getInfo ~ form.value.approvalProject:', form.value.approvalProject);
|
||||
form.value.id = routeParams.value.id;
|
||||
|
||||
loading.value = false;
|
||||
buttonLoading.value = false;
|
||||
});
|
||||
|
@ -333,6 +333,8 @@ const { queryParams, form, rules } = toRefs(data);
|
||||
|
||||
/** 查询物资-材料设备列表 */
|
||||
const getList = async () => {
|
||||
if (!queryParams.value.batchNumber) return;
|
||||
|
||||
loading.value = true;
|
||||
const res = await listCailiaoshebei(queryParams.value);
|
||||
cailiaoshebeiList.value = res.rows;
|
||||
@ -347,14 +349,13 @@ const getBatchList = async () => {
|
||||
batchOptions.value = res.rows;
|
||||
total.value = res.total;
|
||||
try {
|
||||
batchTreeRef.value.setCurrentKey(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.batchId = res.rows[0].id;
|
||||
form.value.approvalDesign = res.rows[0].approvalDesign;
|
||||
} catch (error) {
|
||||
form.value.batchNumber = '';
|
||||
}
|
||||
|
||||
getList();
|
||||
};
|
||||
|
||||
@ -362,7 +363,8 @@ const getBatchList = async () => {
|
||||
const handleNodeClick = (data: any) => {
|
||||
queryParams.value.batchNumber = data.batchNumber;
|
||||
form.value.batchNumber = data.batchNumber;
|
||||
form.value.batchId = data.id;
|
||||
form.value.approvalDesign = data.approvalDesign;
|
||||
|
||||
if (data.batchNumber === '0') {
|
||||
queryParams.value.batchNumber = '';
|
||||
}
|
||||
@ -378,7 +380,9 @@ const cancel = () => {
|
||||
/** 表单重置 */
|
||||
const reset = () => {
|
||||
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();
|
||||
};
|
||||
|
||||
@ -421,9 +425,14 @@ const handleUpdate = async (row?: CailiaoshebeiVO) => {
|
||||
|
||||
/** 审核按钮操作 */
|
||||
const handleAudit = async () => {
|
||||
if (!form.value.batchNumber) {
|
||||
proxy?.$modal.msgError('请选择批次');
|
||||
return;
|
||||
}
|
||||
proxy?.$tab.closePage(proxy.$route);
|
||||
proxy?.$tab.openPage('/materials-management/cailiaoshebei/indexEdit', '审核材料设备设计', {
|
||||
id: form.value.batchId,
|
||||
number: form.value.batchNumber,
|
||||
id: form.value.batchNumber + '_materialDesign',
|
||||
approvalDesign: form.value.approvalDesign,
|
||||
type: 'update'
|
||||
});
|
||||
};
|
||||
|
@ -19,55 +19,21 @@
|
||||
<h3 class="text-lg font-semibold text-gray-800">设计材料设备</h3>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<el-form
|
||||
ref="leaveFormRef"
|
||||
v-loading="loading"
|
||||
:disabled="routeParams.type === 'view'"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-width="120px"
|
||||
class="space-y-4"
|
||||
>
|
||||
<el-row :gutter="20" justify="center">
|
||||
<el-col :span="12" :offset="0">
|
||||
<el-form-item label="批次号" prop="batchNumber">
|
||||
<el-input v-model="form.batchNumber" placeholder="请输入批次ID" disabled />
|
||||
</el-form-item>
|
||||
<!-- <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-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>
|
||||
<el-table v-loading="loading" :data="cailiaoshebeiList">
|
||||
<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="signalment" />
|
||||
<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="plan" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
</el-table>
|
||||
</div>
|
||||
</el-card>
|
||||
<!-- 提交组件 -->
|
||||
@ -112,7 +78,8 @@ 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 { getCailiaoshebei, listCailiaoshebei } from '@/api/materials/cailiaoshebei';
|
||||
import { getCailiaoshebei, getPcDetail, listCailiaoshebei } from '@/api/materials/cailiaoshebei';
|
||||
import { CailiaoshebeiVO } from '@/api/materials/cailiaoshebei/types';
|
||||
// 获取用户 store
|
||||
const userStore = useUserStoreHook();
|
||||
// 从 store 中获取项目列表和当前选中的项目
|
||||
@ -154,8 +121,12 @@ const submitFormData = ref<StartProcessBo>({
|
||||
});
|
||||
const taskVariables = ref<Record<string, any>>({});
|
||||
const selectValue = ref<string[]>([]);
|
||||
const cailiaoshebeiList = ref<CailiaoshebeiVO[]>([]);
|
||||
|
||||
const initFormData = [];
|
||||
const initFormData = {
|
||||
approvalDesign: undefined,
|
||||
id: undefined
|
||||
};
|
||||
const data = reactive({
|
||||
form: { ...initFormData },
|
||||
rules: {}
|
||||
@ -179,8 +150,16 @@ const getInfo = () => {
|
||||
loading.value = true;
|
||||
buttonLoading.value = false;
|
||||
nextTick(async () => {
|
||||
const res = await listCailiaoshebei({ pageNum: 1, pageSize: 10, batchNumber: routeParams.value.batchNumber });
|
||||
form.value = res.rows;
|
||||
const id = routeParams.value.id.split('_')[0];
|
||||
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;
|
||||
buttonLoading.value = false;
|
||||
});
|
||||
|
@ -35,6 +35,7 @@
|
||||
</el-col> -->
|
||||
<el-col :span="1.5">
|
||||
<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>
|
||||
|
||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||
@ -256,8 +257,10 @@ const getBatchList = async () => {
|
||||
batchOptions.value = res.rows;
|
||||
total.value = res.total;
|
||||
try {
|
||||
queryParams.value.batchNumber = res.rows[0].batchNumber;
|
||||
batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber);
|
||||
form.value.batchNumber = res.rows[0].batchNumber;
|
||||
form.value.approvalOrder = res.rows[0].approvalOrder;
|
||||
} catch (error) {
|
||||
form.value.batchNumber = '';
|
||||
}
|
||||
@ -268,7 +271,7 @@ const getBatchList = async () => {
|
||||
const handleNodeClick = (data: any) => {
|
||||
queryParams.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') {
|
||||
queryParams.value.batchNumber = '';
|
||||
}
|
||||
@ -348,6 +351,21 @@ const submitForm = async () => {
|
||||
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 () => {
|
||||
cailiaoshebeiList.value = cailiaoshebeiSelectedList.value.map((id) => {
|
||||
|
346
src/views/materials/orderEquipment/indexEdit.vue
Normal file
346
src/views/materials/orderEquipment/indexEdit.vue
Normal 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>
|
@ -30,40 +30,42 @@
|
||||
<el-card shadow="never">
|
||||
<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="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="name" width="110" />
|
||||
<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="unit" />
|
||||
<el-table-column label="计划数量" align="center" prop="plan" />
|
||||
<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" prop="arrivalTime" width="110" />
|
||||
<el-table-column label="订货数量" align="center" prop="orderQuantity" />
|
||||
<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">
|
||||
<el-tooltip content="修改" placement="top">
|
||||
<el-button
|
||||
link
|
||||
type="primary"
|
||||
icon="Edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['cailiaoshebei:cailiaoshebei:edit']"
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip content="删除" placement="top">
|
||||
<el-button
|
||||
link
|
||||
type="primary"
|
||||
icon="Delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['cailiaoshebei:cailiaoshebei:remove']"
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<dict-tag :options="material_status" :value="scope.row.materialStatus" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="物资逾期类型" align="center" prop="overdueType" width="110">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="overdue_type" :value="scope.row.overdueType" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="逾期原因" align="center" prop="cause" />
|
||||
<el-table-column label="签收单据" align="center" prop="signature" />
|
||||
<el-table-column label="退货单据" align="center" prop="returnedSalesReport" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="操作" align="center" width="150" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['cailiaoshebei:cailiaoshebei:edit']"
|
||||
>修改</el-button
|
||||
>
|
||||
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['cailiaoshebei:cailiaoshebei:remove']"
|
||||
>删除</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@ -73,56 +75,72 @@
|
||||
|
||||
<!-- 添加或修改物资-材料设备对话框 -->
|
||||
<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-item label="批次号" prop="batchNumber">
|
||||
<el-input v-model="form.batchNumber" placeholder="请输入批次ID" disabled />
|
||||
</el-form-item>
|
||||
<!-- <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-form ref="cailiaoshebeiFormRef" :model="form" :rules="rules" label-width="130px">
|
||||
<el-form-item label="物资执行状态" prop="materialStatus">
|
||||
<el-select v-model="form.bo.materialStatus" placeholder="请选择物资执行状态" clearable filterable @change="handleChange">
|
||||
<el-option v-for="item in material_status" :key="item.value" :label="item.label" :value="item.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="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-form-item label="物资逾期类型" prop="overdueType" v-if="form.bo.materialStatus == 3">
|
||||
<el-select v-model="form.bo.overdueType" placeholder="请选择物资逾期类型" clearable filterable>
|
||||
<el-option v-for="item in overdue_type" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="规格型号" prop="specification">
|
||||
<el-input v-model="form.specification" placeholder="请输入规格型号" />
|
||||
<el-form-item label="逾期原因" prop="cause" v-if="form.bo.materialStatus == 3">
|
||||
<el-input v-model="form.bo.cause" placeholder="请输入逾期原因" />
|
||||
</el-form-item>
|
||||
<el-form-item label="特征描述" prop="signalment">
|
||||
<el-input v-model="form.signalment" placeholder="请输入特征描述" />
|
||||
<el-form-item label="实际到货时间" prop="actualArrival" v-if="form.bo.materialStatus < 4">
|
||||
<el-date-picker clearable v-model="form.bo.actualArrival" type="date" value-format="YYYY-MM-DD" placeholder="请选择实际到货时间" />
|
||||
</el-form-item>
|
||||
<el-form-item label="物料编码" prop="materialCode">
|
||||
<el-input v-model="form.materialCode" placeholder="请输入物料编码" />
|
||||
<el-form-item label="验收时间" prop="receptionTime" v-if="form.bo.materialStatus < 4">
|
||||
<el-date-picker clearable v-model="form.bo.receptionTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择验收时间" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="计划到场时间" prop="arrivalTime">
|
||||
<el-date-picker clearable v-model="form.arrivalTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择计划到场时间">
|
||||
</el-date-picker>
|
||||
<el-form-item label="验收数量" prop="acceptanceQuantity" v-if="form.bo.materialStatus < 4">
|
||||
<el-input v-model="form.bo.acceptanceQuantity" type="number" placeholder="请输入验收数量" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划完成时间" prop="finishTime">
|
||||
<el-date-picker clearable v-model="form.finishTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择计划完成时间">
|
||||
</el-date-picker>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="计量单位" prop="unit">
|
||||
<el-input v-model="form.unit" placeholder="请输入计量单位" />
|
||||
<el-form-item label="需求提交时间" prop="requiredTime">
|
||||
<el-date-picker clearable v-model="form.bo.requiredTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择需求提交时间" />
|
||||
</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 label="实际数量" prop="realQuantity">
|
||||
<el-input v-model="form.realQuantity" placeholder="请输入实际数量" />
|
||||
</el-form-item> -->
|
||||
<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>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<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';
|
||||
|
||||
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
|
||||
const userStore = useUserStoreHook();
|
||||
// 从 store 中获取项目列表和当前选中的项目
|
||||
@ -164,6 +184,7 @@ const single = ref(true);
|
||||
const multiple = ref(true);
|
||||
const total = ref(0);
|
||||
const batchOptions = ref<any[]>([]);
|
||||
const fileUploadRef = ref();
|
||||
|
||||
const queryFormRef = ref<ElFormInstance>();
|
||||
const cailiaoshebeiFormRef = ref<ElFormInstance>();
|
||||
@ -188,7 +209,18 @@ const initFormData: CailiaoshebeiForm = {
|
||||
unit: undefined,
|
||||
plan: undefined,
|
||||
realQuantity: undefined,
|
||||
file: undefined,
|
||||
projectId: currentProject.value.id,
|
||||
bo: {
|
||||
requiredTime: undefined,
|
||||
orderTime: undefined,
|
||||
receptionTime: undefined,
|
||||
materialStatus: undefined,
|
||||
overdueType: undefined,
|
||||
cause: undefined,
|
||||
billType: undefined,
|
||||
remark: undefined
|
||||
},
|
||||
remark: undefined
|
||||
};
|
||||
const data = reactive<PageData<CailiaoshebeiForm, CailiaoshebeiQuery>>({
|
||||
@ -295,12 +327,13 @@ const handleAdd = () => {
|
||||
};
|
||||
|
||||
/** 修改按钮操作 */
|
||||
const operation_s = ref([]);
|
||||
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(',');
|
||||
operation_s.value = operation_status.value.slice(0, 2);
|
||||
Object.assign(form.value.bo, row);
|
||||
console.log('🚀 ~ handleUpdate ~ form.value:', form.value);
|
||||
// selectValue.value = (form.value.supplierId as string).split(',');
|
||||
dialog.visible = true;
|
||||
dialog.title = '修改物资-材料设备';
|
||||
};
|
||||
@ -311,14 +344,7 @@ const submitForm = () => {
|
||||
cailiaoshebeiFormRef.value?.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
buttonLoading.value = true;
|
||||
if (form.value.id) {
|
||||
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();
|
||||
fileUploadRef.value!.submitUpload();
|
||||
}
|
||||
});
|
||||
};
|
||||
@ -353,15 +379,21 @@ const handleDelete = async (row?: CailiaoshebeiVO) => {
|
||||
await getList();
|
||||
};
|
||||
|
||||
/** 导出按钮操作 */
|
||||
const handleExport = () => {
|
||||
proxy?.download(
|
||||
'cailiaoshebei/cailiaoshebei/export',
|
||||
{
|
||||
...queryParams.value
|
||||
},
|
||||
`cailiaoshebei_${new Date().getTime()}.xlsx`
|
||||
);
|
||||
const handleUploadSuccess = () => {
|
||||
proxy?.$modal.msgSuccess('操作成功');
|
||||
dialog.visible = false;
|
||||
buttonLoading.value = false;
|
||||
getList();
|
||||
};
|
||||
|
||||
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 = '';
|
||||
}
|
||||
};
|
||||
|
||||
/** 查询供货商列表 */
|
||||
|
257
src/views/materials/repertory/index.vue
Normal file
257
src/views/materials/repertory/index.vue
Normal 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>
|
167
src/views/materials/repertoryDetails/index.vue
Normal file
167
src/views/materials/repertoryDetails/index.vue
Normal 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>
|
@ -39,6 +39,14 @@
|
||||
</el-col>
|
||||
<el-col :span="19">
|
||||
<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-column type="selection" width="55" align="center" />
|
||||
<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
|
||||
>
|
||||
<el-button link type="primary" icon="Finished" @click="handleAudit(scope.row)" v-hasPermi="['out:monthPlan:remove']">审核</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@ -321,6 +328,8 @@ const { queryParams, form, rules } = toRefs(data);
|
||||
|
||||
/** 查询物资-材料设备列表 */
|
||||
const getList = async () => {
|
||||
if (!queryParams.value.batchNumber) return;
|
||||
|
||||
loading.value = true;
|
||||
const res = await listCailiaoshebei(queryParams.value);
|
||||
cailiaoshebeiList.value = res.rows;
|
||||
@ -335,6 +344,7 @@ const getBatchList = async () => {
|
||||
batchOptions.value = res.rows;
|
||||
total.value = res.total;
|
||||
try {
|
||||
queryParams.value.batchNumber = res.rows[0].batchNumber;
|
||||
batchTreeRef.value.setCurrentKey(res.rows[0].batchNumber);
|
||||
form.value.batchNumber = res.rows[0].batchNumber;
|
||||
form.value.approvalPlan = res.rows[0].approvalPlan;
|
||||
@ -351,7 +361,6 @@ const handleNodeClick = (data: any) => {
|
||||
queryParams.value.batchNumber = data.batchNumber;
|
||||
form.value.batchNumber = data.batchNumber;
|
||||
form.value.approvalPlan = data.approvalPlan;
|
||||
|
||||
console.log('🚀 ~ handleNodeClick ~ form.value:', form.value);
|
||||
if (data.batchNumber === '0') {
|
||||
queryParams.value.batchNumber = '';
|
||||
@ -399,7 +408,6 @@ const handleUpdate = async (row?: CailiaoshebeiVO) => {
|
||||
const res = await getCailiaoshebei(_id);
|
||||
Object.assign(form.value, res.data);
|
||||
selectValue.value = (form.value.supplier as string).split(',');
|
||||
|
||||
if (!form.value.listOfMaterialInventory.length) {
|
||||
form.value.listOfMaterialInventory = selectValue.value.map((item) => {
|
||||
return {
|
||||
@ -452,14 +460,16 @@ const handleDelete = async (row?: CailiaoshebeiVO) => {
|
||||
};
|
||||
|
||||
/** 审核按钮操作 */
|
||||
const handleAudit = async (row?: CailiaoshebeiVO) => {
|
||||
const data = {
|
||||
...row,
|
||||
approvalPlan: form.value.approvalPlan
|
||||
};
|
||||
const handleAudit = async () => {
|
||||
if (!form.value.batchNumber) {
|
||||
proxy?.$modal.msgError('请选择批次');
|
||||
return;
|
||||
}
|
||||
|
||||
proxy?.$tab.closePage(proxy.$route);
|
||||
proxy?.$tab.openPage('/materials-management/suppliesprice/indexEdit', '审核物资供应总计划', {
|
||||
id: row?.id,
|
||||
data: JSON.stringify(data),
|
||||
id: form.value.batchNumber,
|
||||
approvalPlan: form.value.approvalPlan + '_materialsPlans',
|
||||
type: 'update'
|
||||
});
|
||||
};
|
||||
|
@ -16,58 +16,34 @@
|
||||
<!-- 表单区域 -->
|
||||
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
|
||||
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
|
||||
<h3 class="text-lg font-semibold text-gray-800">施工产值</h3>
|
||||
<h3 class="text-lg font-semibold text-gray-800">物资供应总计划</h3>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<el-form
|
||||
ref="leaveFormRef"
|
||||
v-loading="loading"
|
||||
:disabled="routeParams.type === 'view'"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-width="120px"
|
||||
class="space-y-4"
|
||||
>
|
||||
<el-row :gutter="20" justify="center">
|
||||
<el-col :span="12" :offset="0">
|
||||
<el-form-item label="计划到场时间" prop="arrivalTime">
|
||||
<el-date-picker
|
||||
clearable
|
||||
v-model="form.arrivalTime"
|
||||
disabled
|
||||
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>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<el-table v-loading="loading" :data="cailiaoshebeiList">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<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="signalment" />
|
||||
<el-table-column label="物料编码" align="center" prop="materialCode" width="200" />
|
||||
<el-table-column label="计划到场时间" align="center" prop="arrivalTime" width="180">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.arrivalTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="计划完成时间" align="center" prop="finishTime" width="180">
|
||||
<template #default="scope">
|
||||
<span>{{ parseTime(scope.row.finishTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="计量单位" align="center" prop="unit" />
|
||||
<el-table-column label="计划数量" align="center" prop="plan" />
|
||||
</el-table>
|
||||
</div>
|
||||
</el-card>
|
||||
<!-- 提交组件 -->
|
||||
@ -116,7 +92,7 @@ const { design_change_reason_type } = toRefs<any>(proxy?.useDict('design_change_
|
||||
import { getKnowledgeDocument } from '@/api/design/technicalStandard';
|
||||
import { getConstructionValue } from '@/api/out/constructionValue';
|
||||
import { workScheduleListDetail } from '@/api/progress/plan';
|
||||
import { getCailiaoshebei } from '@/api/materials/suppliesprice';
|
||||
import { getCailiaoshebei, getPcDetail, listCailiaoshebei } from '@/api/materials/suppliesprice';
|
||||
// 获取用户 store
|
||||
const userStore = useUserStoreHook();
|
||||
// 从 store 中获取项目列表和当前选中的项目
|
||||
@ -139,9 +115,10 @@ const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
|
||||
const flowCodeOptions = [
|
||||
{
|
||||
value: currentProject.value?.id + '_materialsPlans',
|
||||
label: '批次需求计划审批'
|
||||
label: '材料总计划审批'
|
||||
}
|
||||
];
|
||||
const { supply } = toRefs<any>(proxy?.useDict('supply'));
|
||||
|
||||
const leaveFormRef = ref<ElFormInstance>();
|
||||
const dialog = reactive({
|
||||
@ -156,25 +133,11 @@ const submitFormData = ref<StartProcessBo>({
|
||||
});
|
||||
const taskVariables = ref<Record<string, any>>({});
|
||||
const selectValue = ref<string[]>([]);
|
||||
const cailiaoshebeiList = ref([]);
|
||||
|
||||
const initFormData = {
|
||||
id: undefined,
|
||||
batchNumber: 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
|
||||
approvalPlan: undefined,
|
||||
id: undefined
|
||||
};
|
||||
const data = reactive({
|
||||
form: { ...initFormData },
|
||||
@ -199,20 +162,18 @@ const getInfo = () => {
|
||||
loading.value = true;
|
||||
buttonLoading.value = false;
|
||||
nextTick(async () => {
|
||||
const res = JSON.parse(routeParams.value.data);
|
||||
Object.assign(form.value, res.data);
|
||||
selectValue.value = (form.value.supplier as string).split(',');
|
||||
if (!form.value.listOfMaterialInventory.length) {
|
||||
form.value.listOfMaterialInventory = selectValue.value.map((item) => {
|
||||
return {
|
||||
supplierCompany: item,
|
||||
estimatedCycle: '',
|
||||
contractNum: '',
|
||||
num: '',
|
||||
unitPrice: ''
|
||||
};
|
||||
});
|
||||
const id = routeParams.value.id.split('_')[0];
|
||||
const res = await listCailiaoshebei({ pageNum: 1, pageSize: 10, batchNumber: id });
|
||||
cailiaoshebeiList.value = res.rows;
|
||||
if (!form.value.approvalPlan) {
|
||||
const res = await getPcDetail(id);
|
||||
form.value.approvalPlan = res.data.approvalPlan;
|
||||
} else {
|
||||
form.value.approvalPlan = routeParams.value.approvalPlan;
|
||||
}
|
||||
console.log('🚀 ~ getInfo ~ form.value.approvalDesign:', form.value.approvalPlan);
|
||||
form.value.id = routeParams.value.id;
|
||||
|
||||
loading.value = false;
|
||||
buttonLoading.value = false;
|
||||
});
|
||||
|
@ -26,6 +26,9 @@
|
||||
<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">新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
|
||||
</el-col>
|
||||
@ -86,7 +89,7 @@
|
||||
<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-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 label="计量单位" prop="unit">
|
||||
<el-input v-model="form.unit" placeholder="请输入计量单位" />
|
||||
@ -312,7 +315,7 @@ const toggleExpandAll = (data: ProgressCategoryVO[], status: boolean) => {
|
||||
const isDisabled = ref<boolean>(false);
|
||||
const handleUpdate = async (row: ProgressCategoryVO) => {
|
||||
reset();
|
||||
if (row.unitType == '2') {
|
||||
if (!row.unitType) {
|
||||
isDisabled.value = true;
|
||||
}
|
||||
await getTreeselect();
|
||||
|
310
src/views/progress/progressCategorySystemTemplate/index.vue
Normal file
310
src/views/progress/progressCategorySystemTemplate/index.vue
Normal 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>
|
@ -4,15 +4,14 @@
|
||||
<div v-show="showSearch" class="mb-[10px]">
|
||||
<el-card shadow="hover">
|
||||
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
||||
<el-form-item label="父类别id" prop="pid">
|
||||
<el-input v-model="queryParams.pid" placeholder="请输入父类别id" clearable @keyup.enter="handleQuery" />
|
||||
<el-form-item label="选择项目" prop="projectId" width="100">
|
||||
<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 label="类别名称" prop="name">
|
||||
<el-input v-model="queryParams.name" placeholder="请输入类别名称" clearable @keyup.enter="handleQuery" />
|
||||
</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-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
@ -42,10 +41,17 @@
|
||||
:default-expand-all="isExpandAll"
|
||||
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
|
||||
>
|
||||
<el-table-column label="类别名称" align="center" prop="name" />
|
||||
<el-table-column label="计量方式" align="center" prop="unitType" />
|
||||
<el-table-column label="工作类型" align="center" prop="workType" />
|
||||
<el-table-column label="项目id" align="center" prop="projectId" />
|
||||
<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">
|
||||
@ -56,7 +62,13 @@
|
||||
<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-button
|
||||
link
|
||||
type="primary"
|
||||
icon="Delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['progress:progressCategoryTemplate:remove']"
|
||||
/>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -65,9 +77,9 @@
|
||||
<!-- 添加或修改进度类别模版对话框 -->
|
||||
<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="pid">
|
||||
<el-form-item label="父类别id" prop="parentId">
|
||||
<el-tree-select
|
||||
v-model="form.pid"
|
||||
v-model="form.parentId"
|
||||
:data="progressCategoryTemplateOptions"
|
||||
:props="{ value: 'id', label: 'name', children: 'children' }"
|
||||
value-key="id"
|
||||
@ -75,11 +87,18 @@
|
||||
check-strictly
|
||||
/>
|
||||
</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="项目id" prop="projectId">
|
||||
<el-input v-model="form.projectId" placeholder="请输入项目id" />
|
||||
<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="请输入内容" />
|
||||
@ -96,18 +115,36 @@
|
||||
</template>
|
||||
|
||||
<script setup name="ProgressCategoryTemplate" lang="ts">
|
||||
import { listProgressCategoryTemplate, getProgressCategoryTemplate, delProgressCategoryTemplate, addProgressCategoryTemplate, updateProgressCategoryTemplate } from "@/api/progress/progressCategoryTemplate";
|
||||
import { ProgressCategoryTemplateVO, ProgressCategoryTemplateQuery, ProgressCategoryTemplateForm } from '@/api/progress/progressCategoryTemplate/types';
|
||||
import {
|
||||
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 = {
|
||||
id: number;
|
||||
name: string;
|
||||
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 progressCategoryTemplateOptions = ref<ProgressCategoryTemplateOption[]>([]);
|
||||
const buttonLoading = ref(false);
|
||||
@ -117,51 +154,41 @@ const loading = ref(false);
|
||||
|
||||
const queryFormRef = ref<ElFormInstance>();
|
||||
const progressCategoryTemplateFormRef = ref<ElFormInstance>();
|
||||
const progressCategoryTemplateTableRef = ref<ElTableInstance>()
|
||||
|
||||
const progressCategoryTemplateTableRef = ref<ElTableInstance>();
|
||||
const projectSon = ref<any>([]);
|
||||
const dialog = reactive<DialogOption>({
|
||||
visible: false,
|
||||
title: ''
|
||||
});
|
||||
|
||||
|
||||
const initFormData: ProgressCategoryTemplateForm = {
|
||||
id: undefined,
|
||||
pid: undefined,
|
||||
parentId: undefined,
|
||||
name: undefined,
|
||||
unitType: undefined,
|
||||
workType: undefined,
|
||||
projectId: undefined,
|
||||
remark: undefined,
|
||||
}
|
||||
constructionType: undefined,
|
||||
remark: undefined
|
||||
};
|
||||
|
||||
const data = reactive<PageData<ProgressCategoryTemplateForm, ProgressCategoryTemplateQuery>>({
|
||||
form: { ...initFormData },
|
||||
queryParams: {
|
||||
pid: undefined,
|
||||
parentId: undefined,
|
||||
name: undefined,
|
||||
unitType: undefined,
|
||||
workType: undefined,
|
||||
projectId: undefined,
|
||||
params: {
|
||||
}
|
||||
constructionType: undefined,
|
||||
params: {}
|
||||
},
|
||||
rules: {
|
||||
id: [
|
||||
{ required: true, message: "主键id不能为空", trigger: "blur" }
|
||||
],
|
||||
pid: [
|
||||
{ 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" }
|
||||
],
|
||||
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' }]
|
||||
}
|
||||
});
|
||||
|
||||
@ -171,112 +198,124 @@ 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", "pid");
|
||||
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", "pid");
|
||||
data.children = proxy?.handleTree<ProgressCategoryTemplateOption>(res.data, 'id', 'parentId');
|
||||
progressCategoryTemplateOptions.value.push(data);
|
||||
}
|
||||
};
|
||||
|
||||
// 取消按钮
|
||||
const cancel = () => {
|
||||
reset();
|
||||
dialog.visible = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 表单重置
|
||||
const reset = () => {
|
||||
form.value = {...initFormData}
|
||||
form.value = { ...initFormData };
|
||||
progressCategoryTemplateFormRef.value?.resetFields();
|
||||
}
|
||||
};
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
const handleQuery = () => {
|
||||
getList();
|
||||
}
|
||||
};
|
||||
|
||||
/** 重置按钮操作 */
|
||||
const resetQuery = () => {
|
||||
queryFormRef.value?.resetFields();
|
||||
queryParams.value.projectId = projectSon.value[0]?.id;
|
||||
handleQuery();
|
||||
}
|
||||
};
|
||||
|
||||
/** 新增按钮操作 */
|
||||
const handleAdd = (row?: ProgressCategoryTemplateVO) => {
|
||||
reset();
|
||||
getTreeselect();
|
||||
if (row != null && row.id) {
|
||||
form.value.pid = row.id;
|
||||
form.value.parentId = row.id;
|
||||
} else {
|
||||
form.value.pid = 0;
|
||||
form.value.parentId = 0;
|
||||
}
|
||||
dialog.visible = true;
|
||||
dialog.title = "添加进度类别模版";
|
||||
}
|
||||
dialog.title = '添加进度类别模版';
|
||||
};
|
||||
|
||||
/** 展开/折叠操作 */
|
||||
const handleToggleExpandAll = () => {
|
||||
isExpandAll.value = !isExpandAll.value;
|
||||
toggleExpandAll(progressCategoryTemplateList.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)
|
||||
})
|
||||
}
|
||||
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.pid = row.pid;
|
||||
form.value.parentId = row.parentId;
|
||||
}
|
||||
const res = await getProgressCategoryTemplate(row.id);
|
||||
Object.assign(form.value, res.data);
|
||||
dialog.visible = true;
|
||||
dialog.title = "修改进度类别模版";
|
||||
}
|
||||
dialog.title = '修改进度类别模版';
|
||||
};
|
||||
|
||||
/** 提交按钮 */
|
||||
const submitForm = () => {
|
||||
progressCategoryTemplateFormRef.value?.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
buttonLoading.value = true;
|
||||
form.value.projectId = queryParams.value.projectId;
|
||||
if (form.value.id) {
|
||||
await updateProgressCategoryTemplate(form.value).finally(() => buttonLoading.value = false);
|
||||
await updateProgressCategoryTemplate(form.value).finally(() => (buttonLoading.value = false));
|
||||
} 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;
|
||||
getList();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/** 删除按钮操作 */
|
||||
const handleDelete = async (row: ProgressCategoryTemplateVO) => {
|
||||
await proxy?.$modal.confirm('是否确认删除进度类别模版编号为"' + row.id + '"的数据项?');
|
||||
loading.value = true;
|
||||
await delProgressCategoryTemplate(row.id).finally(() => loading.value = false);
|
||||
await delProgressCategoryTemplate(row.id).finally(() => (loading.value = false));
|
||||
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(() => {
|
||||
getList();
|
||||
getSubProjectList();
|
||||
});
|
||||
</script>
|
||||
|
@ -122,6 +122,11 @@
|
||||
<el-form-item label="巡检结果" prop="inspectionResult">
|
||||
<el-input v-model="form.inspectionResult" placeholder="请输入巡检结果" />
|
||||
</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-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)" />
|
||||
@ -179,8 +184,14 @@ import { listProjectTeamForeman } from '@/api/project/projectTeam';
|
||||
import { foremanQuery, ProjectTeamForemanResp } from '@/api/project/projectTeam/types';
|
||||
|
||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||
const { 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')
|
||||
const { rectification_unit_type, safety_inspection_violation_type, review_type, safety_inspection_type, safety_inspection_check_type } = toRefs<any>(
|
||||
proxy?.useDict(
|
||||
'rectification_unit_type',
|
||||
'safety_inspection_violation_type',
|
||||
'review_type',
|
||||
'safety_inspection_type',
|
||||
'safety_inspection_check_type'
|
||||
)
|
||||
);
|
||||
// 获取用户 store
|
||||
const userStore = useUserStoreHook();
|
||||
@ -222,6 +233,8 @@ const initFormData: SafetyInspectionForm = {
|
||||
reviewType: undefined,
|
||||
checkTime: undefined,
|
||||
rectificationTime: undefined,
|
||||
rectificationUnit: undefined,
|
||||
|
||||
reviewTime: undefined,
|
||||
checkFile: undefined,
|
||||
rectificationFile: undefined,
|
||||
|
Reference in New Issue
Block a user