feat(inventory): 优化入库管理功能并增强采购订单集成
- 新增PO订单入库和服务入库两个独立的入口按钮 - 区分导出软硬件产品与服务产品的功能按钮 - 重构入库单表单结构,增加产品类型、入库类型等字段展示 - 优化产品信息表格,支持序号显示和行内修改操作 - 引入采购订单选择对话框组件,实现订单数据联动填充 - 增强SN码处理逻辑,支持批量生成连续SN码序列 - 调整添加产品流程,通过弹窗方式输入起始SN码 - 更新系统合作伙伴认证级别校验规则,针对不同等级控制必填项 - 扩展采购订单接口,新增基于订单项的数据查询能力 - 完善采购订单实体类,补充制造商编码等关键属性 - 新增采购订单项DTO用于库存模块数据交互 - 实现采购订单项数据库映射及查询SQL配置 - 提供前端API调用封装以支持新采购订单项列表获取 - 修复原文件上传相关方法位置错乱问题,确保功能正常运行dev_1.0.0
parent
d775904dc3
commit
5f3c8b3463
|
|
@ -8,6 +8,13 @@ export function listPurchaseorder(query) {
|
|||
params: query
|
||||
})
|
||||
}
|
||||
export function listPurchaseOrderItem(query) {
|
||||
return request({
|
||||
url: '/sip/purchaseorder/item/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
export function listVendorPurchaseorder(query) {
|
||||
return request({
|
||||
url: '/sip/purchaseorder/vendor/list',
|
||||
|
|
|
|||
|
|
@ -31,10 +31,24 @@
|
|||
<!-- 操作按钮 -->
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="el-icon-plus" @click="handleAdd" v-hasPermi="['inventory:inner:add']">新增</el-button>
|
||||
<el-button type="primary" plain icon="el-icon-plus" @click="handleAdd" v-hasPermi="['inventory:inner:add']">
|
||||
PO订单入库
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="el-icon-download" @click="handleExport" v-hasPermi="['inventory:inner:export']">导出</el-button>
|
||||
<el-button type="primary" plain icon="el-icon-plus" @click="handleAdd" v-hasPermi="['inventory:inner:add']">
|
||||
服务入库
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="el-icon-download" @click="handleExport"
|
||||
v-hasPermi="['inventory:inner:export']">导出软硬件产品
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="el-icon-download" @click="handleExport"
|
||||
v-hasPermi="['inventory:inner:export']">导出服务产品
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
|
@ -64,54 +78,79 @@
|
|||
|
||||
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList"/>
|
||||
|
||||
<purchase-order-select-dialog :visible.sync="purchaseOrderSelectVisible" @select="handlePurchaseOrderSelect"/>
|
||||
|
||||
<!-- 新增/修改 Dialog -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body :close-on-click-modal="false">
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<!-- <el-row>-->
|
||||
<!-- <el-col :span="24"><h3>入库信息</h3></el-col>-->
|
||||
<!-- <el-col :span="8">-->
|
||||
<!-- <el-form-item label="入库单号" prop="innerCode">-->
|
||||
<!-- <el-input v-model="form.innerCode" placeholder="保存后自动生成" readonly />-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="8">-->
|
||||
<!-- <el-form-item label="制造商" prop="vendorCode">-->
|
||||
<!-- <el-select v-model="form.vendorCode" placeholder="请选择制造商" style="width:100%">-->
|
||||
<!-- <el-option v-for="item in vendorOptions" :key="item.vendorCode" :label="item.vendorName" :value="item.vendorCode"></el-option>-->
|
||||
<!-- </el-select>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="8">-->
|
||||
<!-- <el-form-item label="入库时间" prop="createTime">-->
|
||||
<!-- <el-input v-model="form.createTime" readonly />-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="8">-->
|
||||
<!-- <el-form-item label="备注" prop="remark">-->
|
||||
<!-- <el-input v-model="form.remark" placeholder="请输入备注"/>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="8">-->
|
||||
<!-- <el-form-item label="附件信息">-->
|
||||
<!-- <el-upload-->
|
||||
<!-- :action="upload.url"-->
|
||||
<!-- :headers="upload.headers"-->
|
||||
<!-- :on-success="handleFileSuccess"-->
|
||||
<!-- :on-remove="handleFileRemove"-->
|
||||
<!-- :before-upload="beforeUpload"-->
|
||||
<!-- :file-list="upload.fileList"-->
|
||||
<!-- >-->
|
||||
<!-- <el-button size="small" type="primary">点击上传</el-button>-->
|
||||
<!-- </el-upload>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- </el-row>-->
|
||||
<el-row>
|
||||
<el-col :span="24"><h3>入库信息</h3></el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="入库单号" prop="innerCode">
|
||||
<el-input v-model="form.innerCode" placeholder="保存后自动生成" readonly />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="制造商" prop="vendorCode">
|
||||
<el-select v-model="form.vendorCode" placeholder="请选择制造商" style="width:100%">
|
||||
<el-option v-for="item in vendorOptions" :key="item.vendorCode" :label="item.vendorName" :value="item.vendorCode"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="入库时间" prop="createTime">
|
||||
<el-input v-model="form.createTime" readonly />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" placeholder="请输入备注"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="附件信息">
|
||||
<el-upload
|
||||
:action="upload.url"
|
||||
:headers="upload.headers"
|
||||
:on-success="handleFileSuccess"
|
||||
:on-remove="handleFileRemove"
|
||||
:before-upload="beforeUpload"
|
||||
:file-list="upload.fileList"
|
||||
>
|
||||
<el-button size="small" type="primary">点击上传</el-button>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24"><h3>入库信息</h3></el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产品类型" prop="productType">
|
||||
<dict-tag :options="dict.type.product_type" :value="form.productType"></dict-tag>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="入库类型" prop="warehouseType">
|
||||
<dict-tag :options="dict.type.warehouse_type" :value="form.warehouseType"></dict-tag>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="仓库" prop="warehouseName">
|
||||
<el-input v-model="form.warehouseName" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="制造商" prop="vendorName">
|
||||
<el-input v-model="form.vendorName" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24"><h3>产品信息</h3></el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="info" plain icon="el-icon-plus" @click="handleProductAdd">添加</el-button>
|
||||
<el-button type="info" plain icon="el-icon-plus" @click="handleProductAddNew('add')">添加</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-upload
|
||||
|
|
@ -129,14 +168,18 @@
|
|||
</el-row>
|
||||
|
||||
<el-table :data="form.inventoryInfoList">
|
||||
<el-table-column type="index"/>
|
||||
<el-table-column label="SN码" prop="productSn" />
|
||||
<el-table-column label="产品编码" prop="productCode" />
|
||||
<el-table-column label="产品型号" prop="model" />
|
||||
<el-table-column label="产品描述" prop="productDesc" width="200" show-overflow-tooltip/>
|
||||
<el-table-column label="入库价(含税)" prop="innerPrice" />
|
||||
<el-table-column label="仓库" prop="warehouseName" />
|
||||
<!-- <el-table-column label="入库价(含税)" prop="innerPrice" />-->
|
||||
<!-- <el-table-column label="仓库" prop="warehouseName" />-->
|
||||
<el-table-column label="操作" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="text" icon="el-icon-delete"
|
||||
@click="handleProductAddNew('update',scope.row)">修改
|
||||
</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleProductDelete(scope.$index)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
|
@ -148,6 +191,19 @@
|
|||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog :title="snTitle" :visible.sync="snOpen">
|
||||
<el-row>
|
||||
<el-col :span="8"><span>{{ snLabel }}</span><span style="color: red">*</span></el-col>
|
||||
<el-col :span="16">
|
||||
<el-input v-model="inputSn" placeholder=""/>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitSn">确 定</el-button>
|
||||
<el-button @click="snOpen=false">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 查看详情 Drawer -->
|
||||
<el-drawer :title="title" :visible.sync="drawerOpen" direction="rtl" size="70%">
|
||||
<div style="padding: 20px;">
|
||||
|
|
@ -191,81 +247,89 @@
|
|||
</el-drawer>
|
||||
|
||||
<!-- 添加产品 Dialog -->
|
||||
<el-dialog title="添加产品" :visible.sync="productOpen" width="60%" append-to-body>
|
||||
<el-form :model="productQuery" ref="productQueryForm" :inline="true" label-width="88px">
|
||||
<el-form-item label="产品编码" prop="productCodeQuery">
|
||||
<el-input v-model="productQuery.productCodeQuery" placeholder="请输入产品编码" clearable @keyup.enter.native="handleProductQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" @click="handleProductQuery">查询</el-button>
|
||||
<el-button icon="el-icon-refresh" @click="resetProductQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form :model="productForm" ref="productForm" :rules="productRules" label-width="140px">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产品编码" prop="productCode">
|
||||
<el-input v-model="productForm.productCode" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="产品型号" prop="model">
|
||||
<el-input v-model="productForm.model" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="产品描述" prop="productDesc">
|
||||
<el-input v-model="productForm.productDesc" readonly/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="入库价(含税)" prop="innerPrice">
|
||||
<el-input-number v-model="productForm.innerPrice" :precision="2" :step="0.1" :min="0"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="数量" prop="quantity">
|
||||
<el-input-number v-model="productForm.quantity" @change="calcSn" :min="1" :max="3000" step="1"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="入库仓" prop="warehouseId">
|
||||
<el-select v-model="productForm.warehouseId" placeholder="请选择仓库" style="width:100%">
|
||||
<el-option v-for="item in warehouseOptions" :key="item.id" :label="item.warehouseName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="该批次起始SN码" prop="productSn">
|
||||
<el-input v-model="productForm.productSn" @input="calcSn" placeholder="只能输入数字和字母"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="SN码范围">
|
||||
<span>{{ snRange }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitProductForm">确 定</el-button>
|
||||
<el-button @click="cancelProduct">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<!-- <el-dialog title="添加产品" :visible.sync="productOpen" width="60%" append-to-body>-->
|
||||
<!-- <el-form :model="productQuery" ref="productQueryForm" :inline="true" label-width="88px">-->
|
||||
<!-- <el-form-item label="产品编码" prop="productCodeQuery">-->
|
||||
<!-- <el-input v-model="productQuery.productCodeQuery" placeholder="请输入产品编码" clearable @keyup.enter.native="handleProductQuery"/>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- <el-form-item>-->
|
||||
<!-- <el-button type="primary" icon="el-icon-search" @click="handleProductQuery">查询</el-button>-->
|
||||
<!-- <el-button icon="el-icon-refresh" @click="resetProductQuery">重置</el-button>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-form>-->
|
||||
<!-- <el-form :model="productForm" ref="productForm" :rules="productRules" label-width="140px">-->
|
||||
<!-- <el-row>-->
|
||||
<!-- <el-col :span="12">-->
|
||||
<!-- <el-form-item label="产品编码" prop="productCode">-->
|
||||
<!-- <el-input v-model="productForm.productCode" readonly/>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="12">-->
|
||||
<!-- <el-form-item label="产品型号" prop="model">-->
|
||||
<!-- <el-input v-model="productForm.model" readonly/>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="24">-->
|
||||
<!-- <el-form-item label="产品描述" prop="productDesc">-->
|
||||
<!-- <el-input v-model="productForm.productDesc" readonly/>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="12">-->
|
||||
<!-- <el-form-item label="入库价(含税)" prop="innerPrice">-->
|
||||
<!-- <el-input-number v-model="productForm.innerPrice" :precision="2" :step="0.1" :min="0"></el-input-number>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="12">-->
|
||||
<!-- <el-form-item label="数量" prop="quantity">-->
|
||||
<!-- <el-input-number v-model="productForm.quantity" @change="calcSn" :min="1" :max="3000" :step="1"></el-input-number>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="12">-->
|
||||
<!-- <el-form-item label="入库仓" prop="warehouseId">-->
|
||||
<!-- <el-select v-model="productForm.warehouseId" placeholder="请选择仓库" style="width:100%">-->
|
||||
<!-- <el-option v-for="item in warehouseOptions" :key="item.id" :label="item.warehouseName" :value="item.id"></el-option>-->
|
||||
<!-- </el-select>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="12">-->
|
||||
<!-- <el-form-item label="该批次起始SN码" prop="productSn">-->
|
||||
<!-- <el-input v-model="productForm.productSn" @input="calcSn" placeholder="只能输入数字和字母"/>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- <el-col :span="24">-->
|
||||
<!-- <el-form-item label="SN码范围">-->
|
||||
<!-- <span>{{ snRange }}</span>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
<!-- </el-row>-->
|
||||
<!-- </el-form>-->
|
||||
<!-- <div slot="footer" class="dialog-footer">-->
|
||||
<!-- <el-button type="primary" @click="submitProductForm">确 定</el-button>-->
|
||||
<!-- <el-button @click="cancelProduct">取 消</el-button>-->
|
||||
<!-- </div>-->
|
||||
<!-- </el-dialog>-->
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {getPurchaseorder} from "@/api/sip/purchaseorder";
|
||||
import { listInner, getInner, addInner, updateInner, delInner, exportInner, importProductData, downloadTemplate } from "@/api/inventory/inner";
|
||||
import { listAllVendor } from "@/api/base/vendor";
|
||||
import { listAllWarehouse } from "@/api/base/warehouse";
|
||||
import { getProductByCode } from "@/api/system/product";
|
||||
import { getToken } from "@/utils/auth";
|
||||
import {exportProject} from "@/api/project/info";
|
||||
import PurchaseOrderSelectDialog from '../../purchaseorder/components/PurchaseOrderSelectDialog.vue';
|
||||
import Dict from "@/views/system/dict/index.vue";
|
||||
|
||||
export default {
|
||||
name: "Inner",
|
||||
components: {
|
||||
Dict,
|
||||
PurchaseOrderSelectDialog
|
||||
},
|
||||
dicts: ['product_type', 'warehouse_type'],
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
|
|
@ -278,8 +342,14 @@ export default {
|
|||
innerList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
inputSn: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
snRow: {},
|
||||
snOpen: false,
|
||||
snTitle: '添加SN码',
|
||||
snLabel: '该批次起始SN码',
|
||||
snInput: false,
|
||||
// 是否显示详情抽屉
|
||||
drawerOpen: false,
|
||||
// 是否为查看模式
|
||||
|
|
@ -335,7 +405,8 @@ export default {
|
|||
warehouseId: [{ required: true, message: "入库仓不能为空", trigger: "change" }],
|
||||
productSn: [{ required: true, message: "起始SN码不能为空", trigger: "blur" }],
|
||||
},
|
||||
snRange: ''
|
||||
snRange: '',
|
||||
purchaseOrderSelectVisible: false,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
|
|
@ -353,6 +424,49 @@ export default {
|
|||
this.loading = false;
|
||||
});
|
||||
},
|
||||
submitSn() {
|
||||
if (this.snRow) {
|
||||
this.snRow.productSn = this.inputSn;
|
||||
this.snOpen = false;
|
||||
return;
|
||||
}
|
||||
|
||||
let quantity = Number(this.form.quantity);
|
||||
let productSn = this.inputSn;
|
||||
let snPrefix = "";
|
||||
let snNumber = "";
|
||||
for (let i = productSn.length - 1; i >= 0; i--) {
|
||||
if (!isNaN(productSn[i]) && productSn[i] !== ' ') {
|
||||
snNumber = productSn[i] + snNumber;
|
||||
} else {
|
||||
snPrefix = productSn.substring(0, i + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (snNumber.length === 0) {
|
||||
this.$modal.msgError("SN码最后一位必须为数字");
|
||||
return;
|
||||
}
|
||||
let startNumber = parseInt(snNumber);
|
||||
|
||||
let productsToAdd = [];
|
||||
for (let i = 0; i < quantity; i++) {
|
||||
let currentNumber = startNumber + i;
|
||||
let formattedNumber = String(currentNumber).padStart(snNumber.length, '0');
|
||||
let currentSn = snPrefix + formattedNumber;
|
||||
productsToAdd.push({
|
||||
productSn: currentSn,
|
||||
productCode: this.form.productCode,
|
||||
model: this.form.productModel,
|
||||
productDesc: this.form.productDesc,
|
||||
innerPrice: this.form.price,
|
||||
warehouseId: this.form.warehouseId,
|
||||
warehouseName: this.form.warehouseName
|
||||
});
|
||||
}
|
||||
this.form.inventoryInfoList.push(...productsToAdd);
|
||||
this.snOpen = false;
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
|
|
@ -380,6 +494,21 @@ export default {
|
|||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.purchaseOrderSelectVisible = true;
|
||||
},
|
||||
handlePurchaseOrderSelect(order) {
|
||||
this.form.vendorCode = order.vendorCode
|
||||
this.form.vendorName = order.vendorName
|
||||
this.form.productType = order.productType
|
||||
this.form.productCode = order.productCode
|
||||
this.form.productModel = order.productModel
|
||||
this.form.price = order.price
|
||||
this.form.quantity = order.quantity
|
||||
this.form.warehouseId = order.warehouseId
|
||||
const warehouse = this.warehouseOptions.find(w => w.id === this.form.warehouseId);
|
||||
this.form.warehouseName = warehouse.warehouseName || '';
|
||||
this.form.warehouseType = warehouse.warehouseType
|
||||
this.form.productDesc = order.productDesc
|
||||
this.open = true;
|
||||
this.isView = false;
|
||||
this.title = "添加入库单";
|
||||
|
|
@ -466,25 +595,7 @@ export default {
|
|||
this.warehouseOptions = res.data;
|
||||
})
|
||||
},
|
||||
// 文件上传相关
|
||||
handleFileSuccess(res, file, fileList) {
|
||||
if (res.code === 0) {
|
||||
this.form.fileId = res.id || res.data.id;
|
||||
this.form.originalFilename = res.originalFilename || res.data.originalFilename; // Store filename
|
||||
this.upload.fileList = fileList;
|
||||
} else {
|
||||
this.$modal.msgError(res.msg);
|
||||
}
|
||||
},
|
||||
handleFileRemove(file, fileList) {
|
||||
this.form.fileId = null;
|
||||
this.form.originalFilename = null; // Clear filename
|
||||
this.upload.fileList = fileList;
|
||||
},
|
||||
beforeUpload(file) {
|
||||
// Add file type/size validation if needed
|
||||
return true;
|
||||
},
|
||||
|
||||
handleDownloadFile() {
|
||||
if (this.form.fileId) {
|
||||
window.location.href = process.env.VUE_APP_BASE_API + "/common/file/download?id=" + this.form.fileId;
|
||||
|
|
@ -492,10 +603,13 @@ export default {
|
|||
this.$modal.msgWarning("文件ID不存在,无法下载");
|
||||
}
|
||||
},
|
||||
// 产品信息相关
|
||||
handleProductAdd() {
|
||||
this.resetProductForm();
|
||||
this.productOpen = true;
|
||||
|
||||
handleProductAddNew(type, row) {
|
||||
this.snTitle = type === 'add' ? '添加SN码' : '修改SN码'
|
||||
this.snLabel = type === 'add' ? '该批次起始SN码' : 'SN码'
|
||||
this.inputSn = row?.productSn
|
||||
this.snRow = row
|
||||
this.snOpen = true
|
||||
},
|
||||
handleImportSuccess(res, file) {
|
||||
if (res.code === 0) {
|
||||
|
|
@ -506,13 +620,15 @@ export default {
|
|||
}
|
||||
},
|
||||
handleDownloadTemplate() {
|
||||
downloadTemplate().then(res => {
|
||||
this.download(res, "入库数据模板.xlsx");
|
||||
})
|
||||
this.download('/inventory/inner/vue/export/template', {}, "入库数据模板.xlsx");
|
||||
},
|
||||
handleProductDelete(index) {
|
||||
this.form.inventoryInfoList.splice(index, 1);
|
||||
},
|
||||
|
||||
//废弃 保留原方法
|
||||
|
||||
|
||||
// 添加产品弹窗方法
|
||||
resetProductForm() {
|
||||
this.productForm = {
|
||||
|
|
@ -625,7 +741,31 @@ export default {
|
|||
cancelProduct() {
|
||||
this.productOpen = false;
|
||||
this.resetProductForm();
|
||||
}
|
||||
},
|
||||
// 产品信息相关
|
||||
handleProductAdd() {
|
||||
this.resetProductForm();
|
||||
this.productOpen = true;
|
||||
},
|
||||
// 文件上传相关
|
||||
handleFileSuccess(res, file, fileList) {
|
||||
if (res.code === 0) {
|
||||
this.form.fileId = res.id || res.data.id;
|
||||
this.form.originalFilename = res.originalFilename || res.data.originalFilename; // Store filename
|
||||
this.upload.fileList = fileList;
|
||||
} else {
|
||||
this.$modal.msgError(res.msg);
|
||||
}
|
||||
},
|
||||
handleFileRemove(file, fileList) {
|
||||
this.form.fileId = null;
|
||||
this.form.originalFilename = null; // Clear filename
|
||||
this.upload.fileList = fileList;
|
||||
},
|
||||
beforeUpload(file) {
|
||||
// Add file type/size validation if needed
|
||||
return true;
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -297,7 +297,19 @@ export default {
|
|||
{ required: true, message: "认证级别不能为空", trigger: "change" }
|
||||
],
|
||||
systemUserName: [
|
||||
{ required: true, message: "系统用户不能为空", trigger: "blur" }
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (this.form.level === '04') {
|
||||
callback();
|
||||
} else {
|
||||
if (!value) {
|
||||
callback(new Error("系统用户不能为空"));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
}, trigger: "blur"
|
||||
}
|
||||
],
|
||||
contactEmail: [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import com.ruoyi.common.enums.ApproveStatusEnum;
|
|||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.sip.domain.OmsPurchaseOrder;
|
||||
import com.ruoyi.sip.dto.inventory.OmsPurchaseOrderItemDto;
|
||||
import com.ruoyi.sip.flowable.domain.Todo;
|
||||
import com.ruoyi.sip.flowable.service.TodoService;
|
||||
import com.ruoyi.sip.service.IOmsPurchaseOrderHistoryService;
|
||||
|
|
@ -55,6 +56,17 @@ public class OmsPurchaseOrderController extends BaseController
|
|||
* 查询采购单主表列表
|
||||
*/
|
||||
@RequiresPermissions("sip:purchaseorder:list")
|
||||
@GetMapping("/item/list")
|
||||
public TableDataInfo listItem(OmsPurchaseOrderItemDto omsPurchaseOrder)
|
||||
{
|
||||
startPage();
|
||||
List<OmsPurchaseOrderItemDto> list = omsPurchaseOrderService.listItem(omsPurchaseOrder);
|
||||
return getDataTable(list);
|
||||
}
|
||||
/**
|
||||
* 查询采购单主表列表
|
||||
*/
|
||||
@RequiresPermissions("sip:purchaseorder:list")
|
||||
@GetMapping("/vendor/list")
|
||||
public TableDataInfo listVendor(OmsPurchaseOrder omsPurchaseOrder)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ public class OmsPurchaseOrder extends BaseEntity
|
|||
/** 制造商ID */
|
||||
private Long vendorId;
|
||||
|
||||
private String vendorCode;
|
||||
private String vendorName;
|
||||
private String vendorUser;
|
||||
private String vendorPhone;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
package com.ruoyi.sip.dto.inventory;
|
||||
|
||||
|
||||
import com.ruoyi.common.annotation.DataScope;
|
||||
import com.ruoyi.sip.domain.OmsPurchaseOrder;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author : ch
|
||||
* @version : 1.0
|
||||
* @ClassName : OmsPurchaseOrderItemDto
|
||||
* @Description :
|
||||
* @DATE : Created in 15:02 2025/11/28
|
||||
* <pre> Copyright: Copyright(c) 2025 </pre>
|
||||
* <pre> Company : 紫光汇智信息技术有限公司 </pre>
|
||||
* Modification History:
|
||||
* Date Author Version Discription
|
||||
* --------------------------------------------------------------------------
|
||||
* 2025/11/28 ch 1.0 Why & What is modified: <修改原因描述> *
|
||||
*/
|
||||
@Data
|
||||
@ToString
|
||||
public class OmsPurchaseOrderItemDto extends OmsPurchaseOrder {
|
||||
/** 产品CODE */
|
||||
private String productCode;
|
||||
/** 数量 */
|
||||
private BigDecimal quantity;
|
||||
private BigDecimal innerQuantity;
|
||||
|
||||
|
||||
/** 单价 */
|
||||
private BigDecimal price;
|
||||
private String productType;
|
||||
private String productModel;
|
||||
private String productDesc;
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@ package com.ruoyi.sip.mapper;
|
|||
import java.util.List;
|
||||
import com.ruoyi.sip.domain.OmsPurchaseOrder;
|
||||
import com.ruoyi.sip.domain.OmsPurchaseOrderItem;
|
||||
import com.ruoyi.sip.dto.inventory.OmsPurchaseOrderItemDto;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
/**
|
||||
|
|
@ -100,4 +101,5 @@ public interface OmsPurchaseOrderMapper
|
|||
|
||||
List<OmsPurchaseOrder> listByCodeList(List<String> businessKeyList);
|
||||
|
||||
List<OmsPurchaseOrderItemDto> listItem(OmsPurchaseOrderItemDto omsPurchaseOrder);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.ruoyi.sip.service;
|
|||
|
||||
import java.util.List;
|
||||
import com.ruoyi.sip.domain.OmsPurchaseOrder;
|
||||
import com.ruoyi.sip.dto.inventory.OmsPurchaseOrderItemDto;
|
||||
import com.ruoyi.sip.flowable.domain.Todo;
|
||||
|
||||
/**
|
||||
|
|
@ -87,4 +88,6 @@ public interface IOmsPurchaseOrderService
|
|||
List<OmsPurchaseOrder> listApprove(OmsPurchaseOrder omsPurchaseOrder);
|
||||
|
||||
List<OmsPurchaseOrder> listApproved(OmsPurchaseOrder omsPurchaseOrder);
|
||||
|
||||
List<OmsPurchaseOrderItemDto> listItem(OmsPurchaseOrderItemDto omsPurchaseOrder);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import com.ruoyi.common.exception.ServiceException;
|
|||
import com.ruoyi.common.utils.DateUtils;
|
||||
import com.ruoyi.common.utils.ShiroUtils;
|
||||
import com.ruoyi.sip.domain.*;
|
||||
import com.ruoyi.sip.dto.inventory.OmsPurchaseOrderItemDto;
|
||||
import com.ruoyi.sip.flowable.domain.Todo;
|
||||
import com.ruoyi.sip.flowable.service.DeleteFlowableProcessInstanceCmd;
|
||||
import com.ruoyi.sip.flowable.service.TodoCommonTemplate;
|
||||
|
|
@ -273,6 +274,11 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService, To
|
|||
return omsPurchaseOrderMapper.listApprove(omsPurchaseOrder,"bu_todo_completed");
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OmsPurchaseOrderItemDto> listItem(OmsPurchaseOrderItemDto omsPurchaseOrder) {
|
||||
return omsPurchaseOrderMapper.listItem(omsPurchaseOrder);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 新增采购单明细表信息
|
||||
|
|
|
|||
|
|
@ -148,6 +148,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
#{item}
|
||||
</foreach>
|
||||
</select>
|
||||
<select id="listItem" resultType="com.ruoyi.sip.dto.inventory.OmsPurchaseOrderItemDto">
|
||||
SELECT
|
||||
t2.purchase_no,
|
||||
t2.buyer_name,
|
||||
t4.vendor_code,
|
||||
t4.vendor_name,
|
||||
t4.vendor_user,
|
||||
t4.vendor_phone,
|
||||
t2.create_time,
|
||||
t2.owner_name,
|
||||
t3.type as product_type,
|
||||
t1.product_code,
|
||||
t3.model as product_model,
|
||||
t1.inner_quantity,
|
||||
t1.quantity,
|
||||
t1.price,
|
||||
t1.amount_total,
|
||||
t2.warehouse_id,
|
||||
t3.description as product_desc
|
||||
|
||||
FROM
|
||||
oms_purchase_order_item t1
|
||||
LEFT JOIN oms_purchase_order t2 ON t1.purchase_id = t2.id
|
||||
left join product_info t3 on t1.product_code=t3.product_code
|
||||
left join oms_vendor_info t4 on t2.vendor_id=t4.vendor_id
|
||||
<where>
|
||||
<if test="purchaseNo != null and purchaseNo != ''">and t2.purchase_no = #{purchaseNo}</if>
|
||||
<if test="productCode != null and productCode != '' ">and t1.product_code = #{productCode}</if>
|
||||
<if test="productType != null">and t3.type = #{productType}</if>
|
||||
<if test="vendorName != null and vendorName != ''">and t4.vendor_name = #{vendorName}</if>
|
||||
</where>
|
||||
|
||||
|
||||
</select>
|
||||
|
||||
<insert id="insertOmsPurchaseOrder" parameterType="OmsPurchaseOrder" useGeneratedKeys="true" keyProperty="id">
|
||||
insert into oms_purchase_order
|
||||
|
|
|
|||
Loading…
Reference in New Issue