|
@@ -0,0 +1,726 @@
|
|
|
+<template>
|
|
|
+ <div class="p-5">
|
|
|
+ <el-form :model="queryParams" class="main-search" :inline="true">
|
|
|
+ <el-form-item label="订单编号" prop="orderNo">
|
|
|
+ <el-input
|
|
|
+ v-model="queryParams.orderNo"
|
|
|
+ placeholder="请输入订单编号"
|
|
|
+ clearable
|
|
|
+ @keyup.enter.native="getList"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="采购时间" prop="purchaseTime">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="queryParams.purchaseTime"
|
|
|
+ type="date"
|
|
|
+ placeholder="选择日期"
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
+ format="yyyy-MM-dd"
|
|
|
+ >
|
|
|
+ </el-date-picker>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" size="mini" @click="getList">搜索</el-button>
|
|
|
+ <el-button size="mini" @click="resetQuery">重置</el-button>
|
|
|
+ <el-button type="primary" plain @click="handleAdd">
|
|
|
+ 新增订单
|
|
|
+ </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <el-table ref="tables" v-loading="loading" :data="list" @selection-change="handleSelectionChange">
|
|
|
+ <el-table-column :show-overflow-tooltip="true" label="序号" prop="id" min-width="80" />
|
|
|
+ <el-table-column :show-overflow-tooltip="true" label="订单编号" prop="orderNo" min-width="80" />
|
|
|
+ <el-table-column label="采购方" prop="puchaseSource" min-width="80" />
|
|
|
+ <el-table-column label="联系方式" prop="contactWay" min-width="120" />
|
|
|
+ <el-table-column label="负责人" prop="responsible" min-width="80" />
|
|
|
+ <el-table-column label="商品采购总数" prop="totalQuantity" min-width="100" />
|
|
|
+ <el-table-column label="采购总 kg" prop="totalWeight" min-width="100" />
|
|
|
+ <el-table-column label="总价" prop="totalPrice" min-width="80" />
|
|
|
+ <el-table-column label="支付金额" prop="actualPrice" min-width="80" />
|
|
|
+ <el-table-column label="支付方式" prop="purchaseType" min-width="80" />
|
|
|
+ <el-table-column label="采购时间" prop="purchaseTime" min-width="100" />
|
|
|
+ <el-table-column label="录入时间" prop="createTime" min-width="100" />
|
|
|
+ <el-table-column label="操作" align="left" width="130" fixed="right">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button size="mini" type="text" @click="handleDetail(row)">
|
|
|
+ 详情
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <el-pagination
|
|
|
+ :total="total"
|
|
|
+ :page.sync="queryParams.pageNo"
|
|
|
+ :limit.sync="queryParams.pageSize"
|
|
|
+ @pagination="getList"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 新增订单弹窗 -->
|
|
|
+ <el-dialog v-model="addDialogVisible" title="新增订单" width="80%">
|
|
|
+ <Paragraph title="基础信息">
|
|
|
+ <!-- 添加 :rules="rules" 绑定验证规则 -->
|
|
|
+ <el-form ref="addForm" size="mini" :model="addFormData" :disabled="false" :rules="rules">
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="采购订单号" prop="orderNo" required>
|
|
|
+ <el-input v-model="addFormData.orderNo" placeholder="输入采购订单号"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="采购方" prop="puchaseSource" required>
|
|
|
+ <el-input v-model="addFormData.puchaseSource" placeholder="输入采购方"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="联系电话" prop="contactWay" required>
|
|
|
+ <el-input v-model="addFormData.contactWay" placeholder="输入联系电话"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="负责人" prop="responsible" required>
|
|
|
+ <el-input v-model="addFormData.responsible" placeholder="输入负责人"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="商品采购总数" prop="totalQuantity" required>
|
|
|
+ <el-input v-model="addFormData.totalQuantity" placeholder="输入商品采购总数"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="采购总KG数" prop="totalWeight" required>
|
|
|
+ <el-input v-model="addFormData.totalWeight" placeholder="输入采购总KG数"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="总价" prop="totalPrice" required>
|
|
|
+ <el-input v-model="addFormData.totalPrice" placeholder="输入总价"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="支付金额" prop="actualPrice" required>
|
|
|
+ <el-input v-model="addFormData.actualPrice" placeholder="输入支付金额"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="支付方式" prop="purchaseType" required>
|
|
|
+ <el-input v-model="addFormData.purchaseType" placeholder="输入支付方式"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="采购时间" prop="purchaseTime" required>
|
|
|
+ <el-date-picker
|
|
|
+ v-model="addFormData.purchaseTime"
|
|
|
+ format="yyyy-MM-dd HH:mm:ss"
|
|
|
+ value-format="yyyy-MM-dd HH:mm:ss"
|
|
|
+ type="datetime"
|
|
|
+ placeholder="选择日期时间">
|
|
|
+ </el-date-picker>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="发票截图" prop="fileId">
|
|
|
+ <ImageUpload @input="inputAdd" :value="addImgList" :isShowTip="false" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ </Paragraph>
|
|
|
+ <Paragraph title="商品信息">
|
|
|
+ <div style="display: flex;align-items: center">
|
|
|
+ <el-button type="primary" @click="handleAddGoods">增加商品</el-button>
|
|
|
+ <div style="display: flex;margin-left: auto">总价:<span style="font-size: 20px;color: #ff0000">¥{{addTotalAmount}}</span></div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-table :data="addSelectedItems" style="width: 100%">
|
|
|
+ <!-- 商品名称 -->
|
|
|
+ <el-table-column label="商品名称" prop="materialName" min-width="120"></el-table-column>
|
|
|
+ <!-- 单价(数字输入) -->
|
|
|
+ <el-table-column label="单价(元)" min-width="120">
|
|
|
+ <template v-slot="scope">
|
|
|
+ <div>
|
|
|
+ <el-input-number
|
|
|
+ v-if="scope.row.editing.status"
|
|
|
+ v-model="scope.row.editUnitPrice"
|
|
|
+ :precision="2"
|
|
|
+ :min="0"
|
|
|
+ size="mini"
|
|
|
+ controls-position="right"
|
|
|
+ />
|
|
|
+ <span v-else>¥ {{ scope.row.unitPrice.toFixed(2) }}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ <!-- 总数(数字输入) -->
|
|
|
+ <el-table-column label="总数" min-width="100">
|
|
|
+ <template v-slot="scope">
|
|
|
+ <div>
|
|
|
+ <el-input-number
|
|
|
+ v-if="scope.row.editing.status"
|
|
|
+ v-model="scope.row.editTotalQuantity"
|
|
|
+ :min="1"
|
|
|
+ :max="9999"
|
|
|
+ size="mini"
|
|
|
+ controls-position="right"
|
|
|
+ />
|
|
|
+ <span v-else>{{ scope.row.totalQuantity }}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <!-- 总价(自动计算) -->
|
|
|
+ <el-table-column label="总价" min-width="120">
|
|
|
+ <template v-slot="scope">
|
|
|
+ ¥ {{ (scope.row.totalQuantity * scope.row.unitPrice).toFixed(2) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <!-- 操作列 -->
|
|
|
+ <el-table-column label="操作" width="150" fixed="right">
|
|
|
+ <template v-slot="scope">
|
|
|
+ <el-button
|
|
|
+ v-if="!scope.row.editing.status"
|
|
|
+ type="text"
|
|
|
+ size="mini"
|
|
|
+ @click="startRowEdit(scope.row)">
|
|
|
+ 编辑
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ v-if="!scope.row.editing.status"
|
|
|
+ type="text"
|
|
|
+ size="mini"
|
|
|
+ @click="deleteSelectedItems(scope.row, 'add')">
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ <div v-else>
|
|
|
+ <el-button
|
|
|
+ type="text"
|
|
|
+ size="mini"
|
|
|
+ @click="saveRowEdit(scope.row, 'add')"
|
|
|
+ >
|
|
|
+ 保存
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ type="text"
|
|
|
+ size="mini"
|
|
|
+ @click="cancelRowEdit(scope.row, 'add')"
|
|
|
+ >
|
|
|
+ 取消
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </Paragraph>
|
|
|
+ <!-- 材料列表弹出层 -->
|
|
|
+ <el-dialog
|
|
|
+ title="材料列表"
|
|
|
+ :visible.sync="addMaterialDialog"
|
|
|
+ class="common-dialog"
|
|
|
+ width="80%">
|
|
|
+ <!-- 使用 el-table 替代 PagingTable -->
|
|
|
+ <el-table :data="materialList" v-loading="materialLoading">
|
|
|
+ <el-table-column label="序号" prop="id" min-width="80" />
|
|
|
+ <el-table-column label="原材料名称" prop="name" min-width="80" />
|
|
|
+ <el-table-column label="规格" prop="specification" min-width="80" />
|
|
|
+ <el-table-column label="原材料编号" prop="materialNo" min-width="80" />
|
|
|
+ <el-table-column
|
|
|
+ fixed="right"
|
|
|
+ label="操作"
|
|
|
+ width="100">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-button v-if="!isSelected(scope.row.id, 'add')" @click="addMaterial(scope.row, 'add')" type="text" size="small"><i class="el-icon-plus"></i>选择材料</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="closeAddMaterialDialog">关闭</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="addDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="saveNewOrder">保存</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 订单详情弹窗 -->
|
|
|
+ <el-dialog v-model="detailDialogVisible" title="订单详情" width="80%">
|
|
|
+ <Paragraph title="基础信息">
|
|
|
+ <!-- 添加 :rules="rules" 绑定验证规则 -->
|
|
|
+ <el-form ref="detailForm" size="mini" :model="detailFormData" :disabled="true" :rules="rules">
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="采购订单号" prop="orderNo" required>
|
|
|
+ <el-input v-model="detailFormData.orderNo" placeholder="输入采购订单号"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="采购方" prop="puchaseSource" required>
|
|
|
+ <el-input v-model="detailFormData.puchaseSource" placeholder="输入采购方"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="联系电话" prop="contactWay" required>
|
|
|
+ <el-input v-model="detailFormData.contactWay" placeholder="输入联系电话"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="负责人" prop="responsible" required>
|
|
|
+ <el-input v-model="detailFormData.responsible" placeholder="输入负责人"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="商品采购总数" prop="totalQuantity" required>
|
|
|
+ <el-input v-model="detailFormData.totalQuantity" placeholder="输入商品采购总数"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="采购总KG数" prop="totalWeight" required>
|
|
|
+ <el-input v-model="detailFormData.totalWeight" placeholder="输入采购总KG数"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="总价" prop="totalPrice" required>
|
|
|
+ <el-input v-model="detailFormData.totalPrice" placeholder="输入总价"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="支付金额" prop="actualPrice" required>
|
|
|
+ <el-input v-model="detailFormData.actualPrice" placeholder="输入支付金额"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="支付方式" prop="purchaseType" required>
|
|
|
+ <el-input v-model="detailFormData.purchaseType" placeholder="输入支付方式"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="采购时间" prop="purchaseTime" required>
|
|
|
+ <el-date-picker
|
|
|
+ v-model="detailFormData.purchaseTime"
|
|
|
+ format="yyyy-MM-dd HH:mm:ss"
|
|
|
+ value-format="yyyy-MM-dd HH:mm:ss"
|
|
|
+ type="datetime"
|
|
|
+ placeholder="选择日期时间">
|
|
|
+ </el-date-picker>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="发票截图" prop="fileId">
|
|
|
+ <ImageUpload @input="inputDetail" :value="detailImgList" :isShowTip="false" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ </Paragraph>
|
|
|
+ <Paragraph title="商品信息">
|
|
|
+ <div style="display: flex;align-items: center">
|
|
|
+ <div style="display: flex;margin-left: auto">总价:<span style="font-size: 20px;color: #ff0000">¥{{detailTotalAmount}}</span></div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-table :data="detailSelectedItems" style="width: 100%">
|
|
|
+ <!-- 商品名称 -->
|
|
|
+ <el-table-column label="商品名称" prop="materialName" min-width="120"></el-table-column>
|
|
|
+ <!-- 单价(数字输入) -->
|
|
|
+ <el-table-column label="单价(元)" min-width="120">
|
|
|
+ <template v-slot="scope">
|
|
|
+ <div>
|
|
|
+ <span >¥ {{ scope.row.unitPrice.toFixed(2) }}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ <!-- 总数(数字输入) -->
|
|
|
+ <el-table-column label="总数" min-width="100">
|
|
|
+ <template v-slot="scope">
|
|
|
+ <div>
|
|
|
+ <span >{{ scope.row.totalQuantity }}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <!-- 总价(自动计算) -->
|
|
|
+ <el-table-column label="总价" min-width="120">
|
|
|
+ <template v-slot="scope">
|
|
|
+ ¥ {{ (scope.row.totalQuantity * scope.row.unitPrice).toFixed(2) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </Paragraph>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="detailDialogVisible = false">关闭</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <script setup>
|
|
|
+ import { ref, onMounted, computed } from 'vue';
|
|
|
+ import Paragraph from "@/components/Paragraph.vue";
|
|
|
+
|
|
|
+ // 表格引用
|
|
|
+ const tables = ref(null);
|
|
|
+ // 查询参数
|
|
|
+ const queryParams = ref({
|
|
|
+ orderNo: '',
|
|
|
+ purchaseTime: null,
|
|
|
+ pageNo: 1,
|
|
|
+ pageSize: 10
|
|
|
+ });
|
|
|
+ // 加载状态
|
|
|
+ const loading = ref(false);
|
|
|
+ // 列表数据
|
|
|
+ const list = ref([]);
|
|
|
+ // 总数
|
|
|
+ const total = ref(0);
|
|
|
+ // 新增订单弹窗显示状态
|
|
|
+ const addDialogVisible = ref(false);
|
|
|
+ // 订单详情弹窗显示状态
|
|
|
+ const detailDialogVisible = ref(false);
|
|
|
+ // 当前查看详情的订单数据
|
|
|
+ const currentOrder = ref(null);
|
|
|
+
|
|
|
+ // 新增订单表单数据
|
|
|
+ const addFormData = ref({
|
|
|
+ orderNo: '',
|
|
|
+ puchaseSource: '',
|
|
|
+ contactWay: '',
|
|
|
+ responsible: '',
|
|
|
+ totalQuantity: '',
|
|
|
+ totalWeight: '',
|
|
|
+ totalPrice: '',
|
|
|
+ actualPrice: '',
|
|
|
+ purchaseType: '',
|
|
|
+ purchaseTime: null,
|
|
|
+ fileId: []
|
|
|
+ });
|
|
|
+ // 新增订单商品列表
|
|
|
+ const addSelectedItems = ref([]);
|
|
|
+ // 新增订单发票截图列表
|
|
|
+ const addImgList = ref([]);
|
|
|
+ // 新增订单材料列表弹出层显示状态
|
|
|
+ const addMaterialDialog = ref(false);
|
|
|
+
|
|
|
+ // 详情订单表单数据
|
|
|
+ const detailFormData = ref({
|
|
|
+ orderNo: '',
|
|
|
+ puchaseSource: '',
|
|
|
+ contactWay: '',
|
|
|
+ responsible: '',
|
|
|
+ totalQuantity: '',
|
|
|
+ totalWeight: '',
|
|
|
+ totalPrice: '',
|
|
|
+ actualPrice: '',
|
|
|
+ purchaseType: '',
|
|
|
+ purchaseTime: null,
|
|
|
+ fileId: []
|
|
|
+ });
|
|
|
+ // 详情订单商品列表
|
|
|
+ const detailSelectedItems = ref([]);
|
|
|
+ // 详情订单发票截图列表
|
|
|
+ const detailImgList = ref([]);
|
|
|
+
|
|
|
+ // 模拟订单数据
|
|
|
+ const mockOrders = [
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ orderNo: '20240001',
|
|
|
+ puchaseSource: '采购方1',
|
|
|
+ contactWay: '13800138000',
|
|
|
+ responsible: '负责人1',
|
|
|
+ totalQuantity: 100,
|
|
|
+ totalWeight: 500,
|
|
|
+ totalPrice: 5000,
|
|
|
+ actualPrice: 4800,
|
|
|
+ purchaseType: '线上支付',
|
|
|
+ purchaseTime: '2024-01-01',
|
|
|
+ createTime: '2024-01-02'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ orderNo: '20240002',
|
|
|
+ puchaseSource: '采购方2',
|
|
|
+ contactWay: '13900139000',
|
|
|
+ responsible: '负责人2',
|
|
|
+ totalQuantity: 200,
|
|
|
+ totalWeight: 1000,
|
|
|
+ totalPrice: 10000,
|
|
|
+ actualPrice: 9500,
|
|
|
+ purchaseType: '线下支付',
|
|
|
+ purchaseTime: '2024-02-01',
|
|
|
+ createTime: '2024-02-02'
|
|
|
+ }
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 模拟材料数据
|
|
|
+ const mockMaterials = [
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ name: '材料1',
|
|
|
+ specification: '规格1',
|
|
|
+ materialNo: '编号1'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ name: '材料2',
|
|
|
+ specification: '规格2',
|
|
|
+ materialNo: '编号2'
|
|
|
+ }
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 定义表单验证规则
|
|
|
+ const rules = ref({
|
|
|
+ orderNo: [
|
|
|
+ { required: true, message: '请输入采购订单号', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ puchaseSource: [
|
|
|
+ { required: true, message: '请输入采购方', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ contactWay: [
|
|
|
+ { required: true, message: '请输入联系电话', trigger: 'blur' },
|
|
|
+ { pattern: /^[0-9]{11}$/, message: '请输入有效的11位手机号码', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ responsible: [
|
|
|
+ { required: true, message: '请输入负责人', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ totalQuantity: [
|
|
|
+ { required: true, message: '请输入商品采购总数', trigger: 'blur' },
|
|
|
+ { pattern: /^\d+$/, message: '商品采购总数必须为整数', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ totalWeight: [
|
|
|
+ { required: true, message: '请输入采购总KG数', trigger: 'blur' },
|
|
|
+ { pattern: /^\d+(\.\d+)?$/, message: '采购总KG数必须为数字', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ totalPrice: [
|
|
|
+ { required: true, message: '请输入总价', trigger: 'blur' },
|
|
|
+ { pattern: /^\d+(\.\d+)?$/, message: '总价必须为数字', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ actualPrice: [
|
|
|
+ { required: true, message: '请输入支付金额', trigger: 'blur' },
|
|
|
+ { pattern: /^\d+(\.\d+)?$/, message: '支付金额必须为数字', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ purchaseType: [
|
|
|
+ { required: true, message: '请输入支付方式', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ purchaseTime: [
|
|
|
+ { required: true, message: '请选择采购时间', trigger: 'change' }
|
|
|
+ ]
|
|
|
+ });
|
|
|
+
|
|
|
+ // 材料列表数据
|
|
|
+ const materialList = ref([]);
|
|
|
+ // 材料列表加载状态
|
|
|
+ const materialLoading = ref(false);
|
|
|
+
|
|
|
+ // 获取订单列表
|
|
|
+ const getList = () => {
|
|
|
+ loading.value = true;
|
|
|
+ setTimeout(() => {
|
|
|
+ // 模拟过滤逻辑
|
|
|
+ let filteredOrders = mockOrders;
|
|
|
+ if (queryParams.value.orderNo) {
|
|
|
+ filteredOrders = filteredOrders.filter(order =>
|
|
|
+ order.orderNo.includes(queryParams.value.orderNo)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ if (queryParams.value.purchaseTime) {
|
|
|
+ filteredOrders = filteredOrders.filter(order =>
|
|
|
+ order.purchaseTime === queryParams.value.purchaseTime
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ const startIndex = (queryParams.value.pageNo - 1) * queryParams.value.pageSize;
|
|
|
+ const endIndex = startIndex + queryParams.value.pageSize;
|
|
|
+ list.value = filteredOrders.slice(startIndex, endIndex);
|
|
|
+ total.value = filteredOrders.length;
|
|
|
+ loading.value = false;
|
|
|
+ }, 500);
|
|
|
+ };
|
|
|
+
|
|
|
+ // 处理新增订单
|
|
|
+ const handleAdd = () => {
|
|
|
+ addDialogVisible.value = true;
|
|
|
+ addFormData.value = {
|
|
|
+ orderNo: '',
|
|
|
+ puchaseSource: '',
|
|
|
+ contactWay: '',
|
|
|
+ responsible: '',
|
|
|
+ totalQuantity: '',
|
|
|
+ totalWeight: '',
|
|
|
+ totalPrice: '',
|
|
|
+ actualPrice: '',
|
|
|
+ purchaseType: '',
|
|
|
+ purchaseTime: null,
|
|
|
+ fileId: []
|
|
|
+ };
|
|
|
+ addSelectedItems.value = [];
|
|
|
+ addImgList.value = [];
|
|
|
+ };
|
|
|
+
|
|
|
+ // 保存新增订单
|
|
|
+ const saveNewOrder = () => {
|
|
|
+ // 这里可以添加保存订单到模拟数据的逻辑
|
|
|
+ addDialogVisible.value = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 处理查看订单详情
|
|
|
+ const handleDetail = (row) => {
|
|
|
+ currentOrder.value = row;
|
|
|
+ detailDialogVisible.value = true;
|
|
|
+ detailFormData.value = { ...row };
|
|
|
+ // 这里可以根据实际情况获取详情订单的商品列表
|
|
|
+ detailSelectedItems.value = [];
|
|
|
+ detailImgList.value = [];
|
|
|
+ };
|
|
|
+
|
|
|
+ // 重置查询
|
|
|
+ const resetQuery = () => {
|
|
|
+ queryParams.value = {
|
|
|
+ orderNo: '',
|
|
|
+ purchaseTime: null,
|
|
|
+ pageNo: 1,
|
|
|
+ pageSize: 10
|
|
|
+ };
|
|
|
+ getList();
|
|
|
+ };
|
|
|
+
|
|
|
+ // 新增订单增加商品
|
|
|
+ const handleAddGoods = () => {
|
|
|
+ addMaterialDialog.value = true;
|
|
|
+ // 获取材料列表
|
|
|
+ getMaterialList();
|
|
|
+ };
|
|
|
+
|
|
|
+ // 关闭新增订单材料列表弹出层
|
|
|
+ const closeAddMaterialDialog = () => {
|
|
|
+ addMaterialDialog.value = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 获取材料列表
|
|
|
+ const getMaterialList = () => {
|
|
|
+ materialLoading.value = true;
|
|
|
+ setTimeout(() => {
|
|
|
+ materialList.value = mockMaterials;
|
|
|
+ materialLoading.value = false;
|
|
|
+ }, 300);
|
|
|
+ };
|
|
|
+
|
|
|
+ // 添加材料到新增订单商品列表
|
|
|
+ const addMaterial = (item, type) => {
|
|
|
+ let targetList;
|
|
|
+ if (type === 'add') {
|
|
|
+ targetList = addSelectedItems;
|
|
|
+ }
|
|
|
+ // 检查是否已存在(根据唯一ID判断)
|
|
|
+ const isExist = targetList.value.some(
|
|
|
+ selected => selected.materialId === item.id
|
|
|
+ );
|
|
|
+ if (isExist) {
|
|
|
+ // 这里可以使用合适的提示方式,如 ElMessage
|
|
|
+ console.log("该商品已存在,不能重复添加!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var materialItem = {
|
|
|
+ materialId: item.id,
|
|
|
+ materialName: item.name,
|
|
|
+ totalQuantity: 0,
|
|
|
+ unitPrice: 0,
|
|
|
+ editing: {
|
|
|
+ status: false,
|
|
|
+ field: null,
|
|
|
+ original: null
|
|
|
+ },
|
|
|
+ editMaterialName: '',
|
|
|
+ editUnitPrice: 0,
|
|
|
+ editTotalQuantity: 0
|
|
|
+ };
|
|
|
+ // 深拷贝对象避免引用问题
|
|
|
+ const clonedItem = JSON.parse(JSON.stringify(materialItem));
|
|
|
+ targetList.value.push(clonedItem);
|
|
|
+ };
|
|
|
+
|
|
|
+ // 删除商品
|
|
|
+ const deleteSelectedItems = (item, type) => {
|
|
|
+ let targetList;
|
|
|
+ if (type === 'add') {
|
|
|
+ targetList = addSelectedItems;
|
|
|
+ }
|
|
|
+ targetList.value = targetList.value.filter(
|
|
|
+ s => s.materialId !== item.materialId
|
|
|
+ );
|
|
|
+ };
|
|
|
+
|
|
|
+ // 初始化行编辑状态
|
|
|
+ const initRowEdit = (row) => {
|
|
|
+ row.editing = {
|
|
|
+ status: false,
|
|
|
+ field: null,
|
|
|
+ original: {
|
|
|
+ materialName: row.materialName,
|
|
|
+ unitPrice: row.unitPrice,
|
|
|
+ totalQuantity: row.totalQuantity
|
|
|
+ }
|
|
|
+ };
|
|
|
+ row.editMaterialName = row.materialName;
|
|
|
+ row.editUnitPrice = row.unitPrice;
|
|
|
+ row.editTotalQuantity = row.totalQuantity;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 开始行编辑
|
|
|
+ const startRowEdit = (row) => {
|
|
|
+ initRowEdit(row);
|
|
|
+ row.editing.status = true;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 保存行编辑
|
|
|
+ const saveRowEdit = (row, type) => {
|
|
|
+ row.unitPrice = parseFloat(row.editUnitPrice);
|
|
|
+ row.totalQuantity = parseInt(row.editTotalQuantity);
|
|
|
+ row.editing.status = false;
|
|
|
+ // 这里可以使用合适的提示方式,如 ElMessage
|
|
|
+ console.log('修改已保存');
|
|
|
+ };
|
|
|
+
|
|
|
+ // 取消行编辑
|
|
|
+ const cancelRowEdit = (row, type) => {
|
|
|
+ row.unitPrice = row.editing.original.unitPrice;
|
|
|
+ row.totalQuantity = row.editing.original.totalQuantity;
|
|
|
+ row.editing.status = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 判断材料是否已选中
|
|
|
+ const isSelected = (id, type) => {
|
|
|
+ let targetList;
|
|
|
+ if (type === 'add') {
|
|
|
+ targetList = addSelectedItems;
|
|
|
+ }
|
|
|
+ return targetList.value.some(item => item.materialId === id);
|
|
|
+ };
|
|
|
+
|
|
|
+ // 新增订单总价计算
|
|
|
+ const addTotalAmount = computed(() => {
|
|
|
+ var amount = addSelectedItems.value.reduce((sum, item) => sum + (item.totalQuantity * item.unitPrice), 0);
|
|
|
+ return amount.toFixed(2);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 详情订单总价计算
|
|
|
+ const detailTotalAmount = computed(() => {
|
|
|
+ var amount = detailSelectedItems.value.reduce((sum, item) => sum + (item.totalQuantity * item.unitPrice), 0);
|
|
|
+ return amount.toFixed(2);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 新增订单发票截图输入
|
|
|
+ const inputAdd = (urls) => {
|
|
|
+ addFormData.value.fileId = urls;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 详情订单发票截图输入
|
|
|
+ const inputDetail = (urls) => {
|
|
|
+ detailFormData.value.fileId = urls;
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ getList();
|
|
|
+ });
|
|
|
+ </script>
|
|
|
+
|
|
|
+ <style scoped>
|
|
|
+ /* 这里可以添加样式 */
|
|
|
+ </style>
|