This commit is contained in:
2025-08-15 00:22:06 +08:00
parent 802fd82d02
commit b8c9dd5be5
2 changed files with 282 additions and 255 deletions

View File

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

View File

@ -1,98 +1,129 @@
<template> <template>
<div class="overall-plan-material-supply"> <div class="overall-plan-material-supply">
<!-- tabPosition="left" --> <!-- tabPosition="left" -->
<el-card shadow="always"> <el-card shadow="always">
<el-form :inline="true"> <template #header>
<el-form-item v-if="state.masterData.status == 'draft'"> <el-row :gutter="10" class="mb8">
<el-button type="primary" icon="edit" @click="clickApprovalSheet1()">审批</el-button> <el-form :inline="true">
</el-form-item> <el-form-item v-if="state.masterData.status == 'draft'">
<el-form-item v-if="state.masterData.status == 'waiting' || state.masterData.status == 'finish'"> <el-button type="primary" icon="edit" @click="clickApprovalSheet1()">审批</el-button>
<el-button icon="view" @click="lookApprovalFlow()" type="warning">查看流程</el-button> </el-form-item>
</el-form-item> <el-form-item v-if="state.masterData.status == 'waiting' || state.masterData.status == 'finish'">
</el-form> <el-button icon="view" @click="lookApprovalFlow()" type="warning">查看流程</el-button>
</el-card> </el-form-item>
<el-table :data="state.tableData" v-loading="state.loading.list" stripe </el-form>
style="width: 100%; margin-bottom: 20px; height: calc(100vh - 230px)" row-key="id" border> <right-toolbar @queryTable="getMasterDataList"></right-toolbar>
<el-table-column prop="num" label="编号" /> </el-row>
<el-table-column prop="name" label="工程或费用名称" /> </template>
<el-table-column prop="unit" label="单位" /> </el-card>
<el-table-column prop="quantity" label="数量" /> <el-table
<el-table-column prop="remark" label="备注" /> :data="state.tableData"
<el-table-column label="操作"> v-loading="state.loading.list"
<template #default="{ row }"> stripe
<el-button :disabled="state.masterData.status == 'waiting' || state.masterData.status == 'finish'" type="primary" @click="editApprovalSheet(row)">修改</el-button> style="width: 100%; margin-bottom: 20px; height: calc(100vh - 230px)"
</template> row-key="id"
</el-table-column> border
</el-table> >
<!-- 编辑 --> <el-table-column prop="num" label="编号" />
<el-dialog v-model="visible" title="修改物料信息" :width="800" :close-on-click-modal="false" @close="handleClose"> <el-table-column prop="name" label="工程或费用名称" />
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" class="space-y-4"> <el-table-column prop="unit" label="单位" />
<el-row :gutter="20"> <el-table-column prop="quantity" label="数量" width="60" />
<el-col :span="12"> <el-table-column prop="batchNumber" label="批次号" width="200" />
<el-form-item label="批次号" prop="batchNumber"> <el-table-column prop="brand" label="品牌" />
<el-input disabled v-model="formData.batchNumber" placeholder="请输入批次号" clearable /> <el-table-column prop="texture" label="材质" />
</el-form-item> <el-table-column prop="qualityStandard" label="质量标准" />
</el-col> <el-table-column prop="partUsed" label="使用部位" />
<el-col :span="12"> <el-table-column prop="deliveryPoints" label="交货地点" />
<el-form-item label="品牌" prop="brand"> <el-table-column label="预计使用日期">
<el-input v-model="formData.brand" placeholder="请输入品牌" clearable /> <template #default="{ row }">
</el-form-item> <span>{{ row.dateService ? row.dateService.split(' ')[0] : '' }}</span>
</el-col> </template>
</el-row> </el-table-column>
<!-- 物料属性区域 --> <el-table-column prop="remark" label="备注" />
<el-row :gutter="20"> <el-table-column label="操作">
<el-col :span="12"> <template #default="{ row }">
<el-form-item label="材质" prop="texture"> <el-button
<el-input v-model="formData.texture" placeholder="请输入材质" clearable /> :disabled="state.masterData.status == 'waiting' || state.masterData.status == 'finish'"
</el-form-item> type="primary"
</el-col> @click="editApprovalSheet(row)"
<el-col :span="12"> >修改</el-button
<el-form-item label="质量标准" prop="qualityStandard"> >
<el-input v-model="formData.qualityStandard" placeholder="请输入质量标准" clearable /> </template>
</el-form-item> </el-table-column>
</el-col> </el-table>
</el-row> <!-- 编辑 -->
<!-- 日期与状态区域 --> <el-dialog v-model="visible" title="修改物料信息" :width="800" :close-on-click-modal="false" @close="handleClose">
<el-row :gutter="20"> <el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" class="space-y-4">
<el-col :span="12"> <el-row :gutter="20">
<el-form-item label="使用部位" prop="partUsed"> <el-col :span="12">
<el-input v-model="formData.partUsed" placeholder="请输入使用部位" clearable /> <el-form-item label="批次号" prop="batchNumber">
</el-form-item> <el-input disabled v-model="formData.batchNumber" placeholder="请输入批次号" clearable />
</el-col> </el-form-item>
<el-col :span="12"> </el-col>
<el-form-item label="交货地点" prop="deliveryPoints"> <el-col :span="12">
<el-input v-model="formData.deliveryPoints" placeholder="请输入交货地点" clearable /> <el-form-item label="品牌" prop="brand">
</el-form-item> <el-input v-model="formData.brand" placeholder="请输入品牌" clearable />
</el-col> </el-form-item>
</el-row> </el-col>
<!-- 其他信息区域 --> </el-row>
<el-row :gutter="20"> <!-- 物料属性区域 -->
<el-col :span="12"> <el-row :gutter="20">
<el-form-item label="预计使用日期" prop="dateService"> <el-col :span="12">
<el-date-picker v-model="formData.dateService" type="date" placeholder="选择预计使用日期" <el-form-item label="材质" prop="texture">
format="YYYY-MM-DD" /> <el-input v-model="formData.texture" placeholder="请输入材质" clearable />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="12">
<el-row> <el-form-item label="质量标准" prop="qualityStandard">
<el-col :span="24"> <el-input v-model="formData.qualityStandard" placeholder="请输入质量标准" clearable />
<el-form-item label="备注" prop="remark"> </el-form-item>
<el-input v-model="formData.remark" placeholder="请输入备注信息" type="textarea" rows="3" /> </el-col>
</el-form-item> </el-row>
</el-col> <!-- 日期与状态区域 -->
</el-row> <el-row :gutter="20">
</el-form> <el-col :span="12">
<template #footer> <el-form-item label="使用部位" prop="partUsed">
<el-button @click="handleClose">取消</el-button> <el-input v-model="formData.partUsed" placeholder="请输入使用部位" clearable />
<el-button type="primary" @click="handleSubmit">确定</el-button> </el-form-item>
</template> </el-col>
</el-dialog> <el-col :span="12">
</div> <el-form-item label="交货地点" prop="deliveryPoints">
<el-input v-model="formData.deliveryPoints" placeholder="请输入交货地点" clearable />
</el-form-item>
</el-col>
</el-row>
<!-- 其他信息区域 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="预计使用日期" prop="dateService">
<el-date-picker v-model="formData.dateService" type="date" placeholder="选择预计使用日期" format="YYYY-MM-DD" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注信息" type="textarea" rows="3" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="billofQuantities"> <script setup name="billofQuantities">
import { ref, reactive, onMounted, computed, getCurrentInstance } from 'vue'; import { ref, reactive, onMounted, computed, getCurrentInstance } from 'vue';
import { obtainMasterDataList, totalsupplyplan, totalSupplyplanDetails, materialChangeSupplyplan } from '@/api/materials/overallPlanMaterialSupply/index'; import {
obtainMasterDataList,
totalsupplyplan,
totalSupplyplanDetails,
materialChangeSupplyplan
} from '@/api/materials/overallPlanMaterialSupply/index';
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
const currentProject = computed(() => userStore.selectedProject); const currentProject = computed(() => userStore.selectedProject);
@ -100,215 +131,211 @@ const { proxy } = getCurrentInstance();
const visible = ref(false); const visible = ref(false);
const formRef = ref(null); const formRef = ref(null);
const state = reactive({ const state = reactive({
tableData: [], tableData: [],
queryForm: { queryForm: {
projectId: currentProject.value?.id, projectId: currentProject.value?.id,
versions: '', versions: '',
sheet: '', sheet: '',
pageSize: 20, pageSize: 20,
pageNum: 1 pageNum: 1
}, },
loading: { loading: {
versions: false, versions: false,
sheets: false, sheets: false,
list: false list: false
}, },
// 主id // 主id
masterData: {} masterData: {}
}); });
// 表单数据 // 表单数据
const formData = reactive({ const formData = reactive({
batchNumber: '', batchNumber: '',
brand: '', brand: '',
compileDate: '', compileDate: '',
dateService: '', dateService: '',
deliveryPoints: '', deliveryPoints: '',
id: undefined, id: undefined,
name: '', name: '',
num: '', num: '',
partUsed: '', partUsed: '',
planNumber: '', planNumber: '',
projectId: undefined, projectId: undefined,
qualityStandard: '', qualityStandard: '',
quantity: 0, quantity: 0,
remark: '', remark: '',
specification: '', specification: '',
status: '', status: '',
texture: '', texture: '',
unit: '' unit: ''
}); });
// 表单验证规则 // 表单验证规则
const formRules = reactive({ const formRules = reactive({
name: [ name: [
{ required: true, message: '请输入名称', trigger: 'blur' }, { required: true, message: '请输入名称', trigger: 'blur' },
{ max: 100, message: '名称长度不能超过100个字符', trigger: 'blur' } { max: 100, message: '名称长度不能超过100个字符', trigger: 'blur' }
], ],
num: [ num: [
{ required: true, message: '请输入编号', trigger: 'blur' }, { required: true, message: '请输入编号', trigger: 'blur' },
{ max: 50, message: '编号长度不能超过50个字符', trigger: 'blur' } { max: 50, message: '编号长度不能超过50个字符', trigger: 'blur' }
], ],
quantity: [ quantity: [
{ required: true, message: '请输入数量', trigger: 'blur' }, { required: true, message: '请输入数量', trigger: 'blur' },
{ type: 'number', min: 0, message: '数量不能为负数', trigger: 'blur' } { type: 'number', min: 0, message: '数量不能为负数', trigger: 'blur' }
], ],
compileDate: [ compileDate: [{ required: true, message: '请选择编制日期', trigger: 'change' }]
{ required: true, message: '请选择编制日期', trigger: 'change' }
]
}); });
// 获取主表数据 // 获取主表数据
async function getMasterDataList() { async function getMasterDataList() {
try { try {
// 获取主数据列表 // 获取主数据列表
state.loading.list = true; state.loading.list = true;
const masterDataRes = await obtainMasterDataList({ const masterDataRes = await obtainMasterDataList({
projectId: currentProject.value?.id projectId: currentProject.value?.id
}); });
const { data: masterData } = masterDataRes; const { data: masterData } = masterDataRes;
console.log('masterData', masterData); console.log('masterData', masterData);
if (!masterData[0].id) { if (!masterData[0].id) {
console.warn('未获取到有效的主数据ID'); console.warn('未获取到有效的主数据ID');
state.tableData = []; state.tableData = [];
return; return;
}
state.masterData = masterData[0];
// 获取供应计划
const supplyPlanRes = await totalsupplyplan({ id: masterData[0].id });
// 处理结果
if (supplyPlanRes.list == null) {
state.tableData = supplyPlanRes.rows || [];
console.log('state.tableData', state.tableData);
} else {
// 根据实际业务逻辑处理有list的情况
state.tableData = [];
}
} catch (error) {
console.error('获取主数据列表失败:', error);
// 错误情况下给默认值,避免页面出错
state.tableData = [];
} finally {
state.loading.list = false;
} }
state.masterData = masterData[0];
// 获取供应计划
const supplyPlanRes = await totalsupplyplan({ id: masterData[0].id });
// 处理结果
if (supplyPlanRes.list == null) {
state.tableData = supplyPlanRes.rows || [];
console.log('state.tableData', state.tableData);
} else {
// 根据实际业务逻辑处理有list的情况
state.tableData = [];
}
} catch (error) {
console.error('获取主数据列表失败:', error);
// 错误情况下给默认值,避免页面出错
state.tableData = [];
} finally {
state.loading.list = false;
}
} }
// 获取详情 // 获取详情
// 修改获取详情的方法 // 修改获取详情的方法
async function totalSupplyplanDetail(id) { async function totalSupplyplanDetail(id) {
try { try {
const result = await totalSupplyplanDetails(id); const result = await totalSupplyplanDetails(id);
if (result?.code === 200) { if (result?.code === 200) {
const detailData = result.data || {}; const detailData = result.data || {};
// 1. 清空原有表单数据 // 1. 清空原有表单数据
Object.keys(formData).forEach(key => { Object.keys(formData).forEach((key) => {
formData[key] = undefined; formData[key] = undefined;
}); });
// 2. 处理日期格式假设接口返回的是Date对象或ISO字符串 // 2. 处理日期格式假设接口返回的是Date对象或ISO字符串
const formatDate = (date) => { const formatDate = (date) => {
if (!date) return ''; if (!date) return '';
// 若为字符串先转为Date对象 // 若为字符串先转为Date对象
const d = typeof date === 'string' ? new Date(date) : date; const d = typeof date === 'string' ? new Date(date) : date;
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`; return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
}; };
// 3. 合并数据到formData响应式赋值 // 3. 合并数据到formData响应式赋值
Object.assign(formData, { Object.assign(formData, {
...detailData, ...detailData,
// 单独处理日期字段,转为表单可识别的字符串格式 // 单独处理日期字段,转为表单可识别的字符串格式
compileDate: formatDate(detailData.compileDate), compileDate: formatDate(detailData.compileDate),
dateService: formatDate(detailData.dateService) dateService: formatDate(detailData.dateService)
}); });
console.log('表单数据已更新:', formData); console.log('表单数据已更新:', formData);
} else { } else {
ElMessage.error(`获取详情失败: ${result?.msg || '未知错误'}`); ElMessage.error(`获取详情失败: ${result?.msg || '未知错误'}`);
}
} catch (err) {
ElMessage.error(`接口请求失败: ${err.message}`);
console.error('详情接口错误:', err);
} finally {
state.loading.list = false;
} }
} catch (err) {
ElMessage.error(`接口请求失败: ${err.message}`);
console.error('详情接口错误:', err);
} finally {
state.loading.list = false;
}
} }
// 修改 // 修改
function editApprovalSheet(row) { function editApprovalSheet(row) {
console.log(row); console.log(row);
totalSupplyplanDetail(row.id) totalSupplyplanDetail(row.id);
visible.value = true; visible.value = true;
} }
// 提交表单 // 提交表单
const handleSubmit = async () => { const handleSubmit = async () => {
try { try {
// 表单验证 // 表单验证
await formRef.value.validate(); await formRef.value.validate();
// 触发提交事件 // 触发提交事件
console.log('submitData:', formData); editMaterialSupply(formData);
editMaterialSupply(formData); handleClose();
handleClose(); } catch (error) {
} catch (error) { // 验证失败不提交
// 验证失败不提交 console.error('表单验证失败:', error);
console.error('表单验证失败:', error); return;
return; }
}
}; };
// 修改物资 // 修改物资
function editMaterialSupply(formData) { function editMaterialSupply(formData) {
materialChangeSupplyplan(formData).then(res => { materialChangeSupplyplan(formData).then((res) => {
if (res.code === 200) { if (res.code === 200) {
ElMessage.success('修改成功'); ElMessage.success('修改成功');
} else { getMasterDataList();
ElMessage.error('修改失败'); } else {
} ElMessage.error('修改失败');
}); }
});
} }
// 关闭弹窗 // 关闭弹窗
const handleClose = () => { const handleClose = () => {
visible.value = false; visible.value = false;
// 清空表单数据 // 清空表单数据
Object.keys(formData).forEach(key => { Object.keys(formData).forEach((key) => {
formData[key] = undefined; formData[key] = undefined;
}); });
// 重置表单验证状态 // 重置表单验证状态
formRef.value?.resetFields(); formRef.value?.resetFields();
}; };
// 审批 // 审批
function clickApprovalSheet1() { function clickApprovalSheet1() {
proxy.$tab.closePage(proxy.$route); proxy.$tab.closePage(proxy.$route);
proxy.$router.push({ proxy.$router.push({
path: `/materials/overallPlanMaterialSupply/indexEdit`, path: `/materials/overallPlanMaterialSupply/indexEdit`,
query: { query: {
id: state.masterData.id, id: state.masterData.id,
type: 'update' type: 'update'
} }
}); });
} }
// 审核流程 // 审核流程
function lookApprovalFlow() { function lookApprovalFlow() {
proxy.$router.push({ proxy.$router.push({
path: `/materials/overallPlanMaterialSupply/indexEdit`, path: `/materials/overallPlanMaterialSupply/indexEdit`,
query: { query: {
id: state.masterData.id, id: state.masterData.id,
type: 'view' type: 'view'
} }
}); });
} }
onMounted(() => { onMounted(() => {
getMasterDataList(); getMasterDataList();
}) });
</script> </script>
<style> <style>
.overall-plan-material-supply { .overall-plan-material-supply {
padding: 20px; padding: 20px;
} }
.space-y-4>.el-row { .space-y-4 > .el-row {
margin-bottom: 16px; margin-bottom: 16px;
} }
.space-y-4>.el-row:last-child { .space-y-4 > .el-row:last-child {
margin-bottom: 0; margin-bottom: 0;
} }
</style> </style>