Commit a014954c by zhangtw

SapId替代materialCode

batchCode更换为batchId
页面bug修复
materialCode替换为materialId
新增inventory增删改查api
新增批量添加inventory
修改页面
新增入库明细联查物料名称api
parent 4f51b614
......@@ -8,7 +8,14 @@ export function listInbound_items(query) {
params: query
})
}
// 查询入库单明细列表联查materialname
export function listInbound_itemsAndMname(query) {
return request({
url: '/inventory/inbound_items/listAndMname',
method: 'get',
params: query
})
}
// 查询入库单明细详细
export function getInbound_items(id) {
return request({
......
import request from '@/utils/request'
// 查询库存列表
export function listInventory(query) {
return request({
url: '/inventory/inventory/list',
method: 'get',
params: query
})
}
// 查询库存详细
export function getInventory(id) {
return request({
url: '/inventory/inventory/' + id,
method: 'get'
})
}
// 新增库存
export function addInventory(data) {
return request({
url: '/inventory/inventory',
method: 'post',
data: data
})
}
// 批量新增库存
export function batchAddInventory(data){
return request({
url: '/inventory/inventory/batchAdd',
method: 'post',
data: data
})
}
// 修改库存
export function updateInventory(data) {
return request({
url: '/inventory/inventory',
method: 'put',
data: data
})
}
// 删除库存
export function delInventory(id) {
return request({
url: '/inventory/inventory/' + id,
method: 'delete'
})
}
<template>
<div class="app-container">
<!-- 修改查询表单,将 form 改为 queryParams -->
<!-- 查询表单 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="入库单号" prop="orderId">
<el-input
......@@ -18,9 +18,9 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="批次ID" prop="batchCode">
<el-form-item label="批次ID" prop="batchId">
<el-input
v-model="queryParams.batchCode"
v-model="queryParams.batchId"
placeholder="请输入批次ID"
clearable
@keyup.enter.native="handleQuery"
......@@ -63,7 +63,7 @@
</el-form-item>
</el-form>
<!-- 工具栏保持不变 -->
<!-- 工具栏 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
......@@ -130,7 +130,7 @@
</el-tag>
</template>
</el-table-column>
<el-table-column label="批次ID" align="center" prop="batchCode" />
<el-table-column label="批次ID" align="center" prop="batchId" />
<el-table-column label="入库单状态" align="center" prop="orderStatus">
<!-- 状态显示 -->
<template slot-scope="scope">
......@@ -155,6 +155,7 @@
icon="el-icon-success"
@click="handleConfirm(scope.row)"
v-hasPermi="['inventory:inbound:confirm']"
v-show="!(scope.row.orderStatus === 2)"
>确认入库</el-button>
<el-button
size="mini"
......@@ -169,6 +170,7 @@
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['inventory:inbound:edit']"
v-show="!(scope.row.orderStatus === 2)"
>修改</el-button>
<el-button
size="mini"
......@@ -176,6 +178,7 @@
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['inventory:inbound:remove']"
v-show="!(scope.row.orderStatus === 2)"
>删除</el-button>
</template>
</el-table-column>
......@@ -199,8 +202,8 @@
<el-form-item label="入库单号" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入入库单号" />
</el-form-item>
<el-form-item label="批次ID" prop="batchCode">
<el-input v-model="form.batchCode" placeholder="请输入批次ID" />
<el-form-item label="批次ID" prop="batchId">
<el-input v-model="form.batchId" placeholder="请输入批次ID" />
</el-form-item>
<el-form-item label="入库类型" prop="orderTypeId">
<el-select v-model="form.orderTypeId" placeholder="请选择入库类型" clearable>
......@@ -318,7 +321,7 @@
<el-descriptions :column="2" border class="mb20">
<el-descriptions-item label="入库单号">{{ detailForm.orderId || '-' }}</el-descriptions-item>
<el-descriptions-item label="系统编号">{{ detailForm.systemNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="批次ID">{{ detailForm.batchCode || '-' }}</el-descriptions-item>
<el-descriptions-item label="批次ID">{{ detailForm.batchId || '-' }}</el-descriptions-item>
<el-descriptions-item label="货主ID">{{ detailForm.ownerId || '-' }}</el-descriptions-item>
<el-descriptions-item label="入库类型">
{{ getInBoundTypeName(detailForm.orderTypeId) }}
......@@ -345,6 +348,7 @@
v-model="detailForm.inboundOrderItemsList"
:embedded="true"
:order-id="detailForm.orderId"
:isEditable=isEditable
:show-search-form="false"
:show-pagination="false"
:show-toolbar="false"
......@@ -383,6 +387,8 @@
<script>
import { listInbound, getInbound, delInbound, addInbound, updateInbound } from "@/api/inventory/inbound"
import { listInbound_items } from "@/api/inventory/inbound_items"
import { batchAddInventory } from "@/api/inventory/inventory"
import InboundItems from "@/views/inventory/inbound_items/index.vue"
import RightToolbar from "@/components/RightToolbar" // 确保导入这个组件
import MaterialSelector from "@/views/inventory/materials/materialsSeletor.vue";
......@@ -408,9 +414,11 @@ export default {
{ orderType: '1', orderTypeName: '订单类型1' },
{ orderType: '2', orderTypeName: '订单类型2' }
],
isEditable: true,
// 物料组件显示
materialSelectOpen: false,
selectedMaterialIds: [],
inboundItemsUpdateStatus: false,
// 组件带来的选中的物料详情(code、name)
selectedMaterials: [],
detailOpen: false,
......@@ -444,7 +452,7 @@ export default {
orderId: null,
orderTypeId: null,
systemNo: null,
batchCode: null,
batchId: null,
warehouseId: null,
ownerId: null,
orderStatus: null,
......@@ -455,7 +463,7 @@ export default {
id: null,
orderId: null,
orderTypeId: null,
batchCode: null,
batchId: null,
warehouseId: null,
ownerId: null,
orderStatus: 1,
......@@ -487,7 +495,7 @@ export default {
systemNo: [
{ required: true, message: "系统编号不能为空", trigger: "blur" }
],
batchCode: [
batchId: [
{ required: true, message: "批次ID不能为空", trigger: "blur" }
]
}
......@@ -569,6 +577,20 @@ export default {
this.title = "修改入库单"
})
},
/** 查看详情 */
handleDetail(row) {
this.reset()
const id = row.id || this.ids
this.isEditable = false
getInbound(id).then(response => {
this.detailForm = response.data
// 加载明细数据到详情
if (this.$refs.detailItemsRef) {
this.$refs.detailItemsRef.loadRelatedData(this.detailForm.orderId)
}
this.detailOpen = true
})
},
// 打开物料选择弹窗
showMaterials(status) {
this.materialSelectOpen = status;
......@@ -598,56 +620,69 @@ export default {
this.selectedMaterials.forEach(material => {
// 检查是否已存在该物料,避免重复添加
const exists = this.form.inboundOrderItemsList.some(
item => item.materialCode === material.materialCode
item => item.sapNo === material.sapNo
);
if (!exists) {
this.form.inboundOrderItemsList.push({
materialId: material.materialCode, // 存储物料编码
materialId: material.sapNo, // 存储物料编码
materialName: material.materialName, // 仅用于展示
// 其他需要的字段...
});
}
});
console.log(this.form.inboundOrderItemsList)
this.materialSelectOpen = false;
this.$refs.inboundItemsRef.handleAddItem(this.selectedMaterials)
this.$message.success(`成功添加 ${this.selectedMaterials.length} 个物料`);
},
/** 确认入库操作 */
handleConfirm(row) {
this.$confirm('确认要入库吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 调用确认入库API
// confirmInbound(row.id).then(() => {
// this.$modal.msgSuccess("确认成功")
// this.getList()
// })
this.$message.success('确认入库成功')
this.getList()
})
},
async handleConfirm(row) { // 标记为 async 函数
try {
// 第一步:确认弹窗
await this.$confirm('确认要入库吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
});
/** 查看详情 */
handleDetail(row) {
const id = row.id || this.ids
getInbound(id).then(response => {
this.detailForm = response.data
// 加载明细数据到详情
if (this.$refs.detailItemsRef) {
this.$refs.detailItemsRef.loadRelatedData(this.detailForm.orderId)
// 第二步:等待 listInbound_items 执行完成
const queryForm = {
pageNum: 1,
pageSize: 9999,
orderId: row.orderId
};
const response = await listInbound_items(queryForm);
row.inboundOrderItemsList = response.rows;
// 第三步:确保数据存在后调用入库接口
if (!row.inboundOrderItemsList || row.inboundOrderItemsList.length === 0) {
this.$message.warning('暂无入库明细数据,无法确认入库');
return;
}
this.detailOpen = true
})
await batchAddInventory(row.inboundOrderItemsList);
// 第四步:操作成功提示
this.$modal.msgSuccess("确认成功");
this.$message.success('确认入库成功');
row.orderStatus = 2
updateInbound(row).then(() => {
this.getList();
})
} catch (error) {
// 捕获取消确认/接口失败的异常
if (error !== 'cancel') {
this.$message.error('确认入库失败:' + (error.msg || '网络异常'));
}
}
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$confirm('是否确认删除入库编号为"' + ids + '"的数据项?', '提示', {
const ids = row.orderId || this.ids.length
this.$confirm((row.orderId ? '是否确认删除入库单编号为"' + ids + '"的数据项?' : '是否确认删除选中的' + ids + '条入库单'),'提示', {
type: 'warning'
}).then(() => {
return delInbound(ids)
......@@ -715,7 +750,7 @@ export default {
id: null,
orderId: null,
orderTypeId: null,
batchCode: null,
batchId: null,
warehouseId: null,
ownerId: null,
orderStatus: 1,
......
<template>
<div class="inbound-items-container">
<!-- 查询表单-->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="130px">
<el-form-item label="货物ID" prop="materialId">
<el-input
v-model="queryParams.materialId"
placeholder="请输入货物ID"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="仓库ID" prop="warehouseId">
<el-input
v-model="queryParams.warehouseId"
placeholder="请输入仓库ID"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="库位ID" prop="locationId">
<el-input
v-model="queryParams.locationId"
placeholder="请输入库位ID"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标签颜色" prop="labelColor">
<el-select v-model="queryParams.labelColor" placeholder="请选择标签颜色" clearable>
<el-option
v-for="item in inLabelColorOptions"
:key="item.colorId"
:label="item.colorLabel"
:value="item.colorId"
/>
</el-select>
</el-form-item>
<el-form-item label="凭证号" prop="voucherNumber">
<el-input
v-model="queryParams.voucherNumber"
placeholder="请输入凭证号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<br></br>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作按钮区域 -->
<div class="toolbar-container mb8">
<el-row :gutter="10">
<el-col :span="1.5">
<el-col :span="1.5" v-if="isEditable">
<el-button
type="primary"
plain
......@@ -12,7 +63,7 @@
@click="handleAddItemClick"
>新增物料</el-button>
</el-col>
<el-col :span="1.5">
<el-col :span="1.5" v-if="isEditable">
<el-button
type="danger"
plain
......@@ -22,7 +73,7 @@
@click="handleBatchDelete"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-col :span="1.5" v-if="isEditable">
<el-button
type="warning"
plain
......@@ -106,6 +157,9 @@
/>
</el-select>
</template>
<template v-else-if="column.prop === 'labelColor'">
{{ dict.type.label_color[scope.row.labelColor] || scope.row.labelColor }}
</template>
<template v-else-if="column.type === 'number'">
<el-input-number
v-model="scope.row[column.prop]"
......@@ -154,6 +208,7 @@
align="center"
width="150"
fixed="right"
v-if="isEditable"
>
<template slot-scope="scope">
<el-button
......@@ -202,12 +257,16 @@
</template>
<script>
import { listInbound_items, delInbound_items } from "@/api/inventory/inbound_items"
import { listInbound_items, delInbound_items , listInbound_itemsAndMname} from "@/api/inventory/inbound_items"
import { getDicts } from "@/api/system/dict/data";
import ImportExcel from "@/components/ImportExcel/index"
// 使用默认的dict实例,不需要单独实例化Dict类
// 使用默认的dict实例,无需导入DictMeta和DictData
export default {
name: "InboundItems",
inheritAttrs: false,
dicts: ['label_color'],
components: { ImportExcel },
props: {
// 数据源
......@@ -215,6 +274,10 @@ export default {
type: Array,
default: () => []
},
isEditable: {
type: Boolean,
default: true
},
// 主表ID
orderId: {
type: [String, Number],
......@@ -224,30 +287,35 @@ export default {
columns: {
type: Array,
default: () => [
{ prop: 'materialId', label: '货物ID', width: '120', editable: false},
{ prop: 'materialName', label: '货物名称', width: '120', editable: false},
{ prop: 'materialId', label: '货物ID', width: '150', editable: false},
{ prop: 'materialName', label: '货物名称', width: '150', editable: false},
// { prop: 'batchId', label: '批次ID', width: '120', editable: true },
{ prop: 'warehouseId', label: '仓库ID', width: '120', editable: true,
{ prop: 'warehouseId', label: '仓库ID', width: '150', editable: true,
type: 'select', // 指定类型为select
options: [ // 下拉选项列表
{ label: '仓库A', value: 'WH001' },
{ label: '仓库B', value: 'WH002' },
{ label: '仓库C', value: 'WH003' }
]
]
},
{ prop: 'locationId', label: '库位ID', width: '120', editable: true ,
{ prop: 'locationId', label: '库位ID', width: '150', editable: true ,
type: 'select', // 指定类型为select
options: [ // 下拉选项列表
{ label: '库位A1', value: 'LOC001' },
{ label: '库位A2', value: 'LOC002' },
{ label: '库位B1', value: 'LOC003' }
]
]
},
{ prop: 'plannedQuantity', label: '计划数量', width: '100', type: 'number', editable: true },
{ prop: 'actualQuantity', label: '实际数量', width: '100', type: 'number', editable: true },
{ prop: 'plannedPackages', label: '计划件数', width: '100', type: 'number', editable: true },
{ prop: 'actualPackages', label: '实际件数', width: '100', type: 'number', editable: true },
{ prop: 'unitPrice', label: '单价', width: '100', type: 'number', editable: true },
{ prop: 'divisor', label: '约数', width: '100', type: 'number', editable: true },
{ prop: 'labelColor', label: '标签颜色', width: '100', type: 'number', editable: true },
{ prop: 'voucherNumber', label: '凭证号', width: '150', editable: true },
{ prop: 'unitPrice', label: '单价', width: '100', type: 'number', editable: true },
{ prop: 'receivedBy', label: '收货人', width: '150', editable: true },
// { prop: 'sortNo', label: 'p排序', width: '150', editable: true },
{ prop: 'remark', label: '备注', minWidth: '150', editable: true },
]
},
......@@ -259,6 +327,9 @@ export default {
},
data() {
return {
inLabelColorOptions: [], // 入库类型下拉选项
showSearch: true,
selectedMaterials: [],
loading: false,
selectedRows: [],
......@@ -267,6 +338,12 @@ export default {
pagedDisplayData: [],
queryParams: {
pageNum: 1,
materialId: null,
warehouseId: null,
locationId: null,
labelColor: null,
voucherNumber: null,
receivedBy: null,
pageSize: this.pageSize,
orderId: this.orderId
},
......@@ -288,6 +365,23 @@ export default {
}
},
watch: {
'dict.label.label_color': {
handler(newVal) {
if (!newVal || (typeof newVal !== 'object' && !Array.isArray(newVal))) {
this.inLabelColorOptions = []; // 兜底空数组
console.warn("字典数据未加载或格式错误:", newVal);
return;
}
// 若依框架的字典数据格式
if (!Array.isArray(newVal)) {
this.inLabelColorOptions = Object.entries(newVal).map(([value, label]) => ({
colorId: value,
colorLabel: label
}));
}
},
immediate: true
},
value: {
immediate: true,
handler(newVal) {
......@@ -347,7 +441,8 @@ export default {
this.loading = true
this.queryParams.orderId = orderId
listInbound_items(this.queryParams).then(response => {
listInbound_itemsAndMname(this.queryParams).then(response => {
console.log(response.rows)
this.displayData = response.rows.map(item => ({
...item,
editable: false,
......@@ -359,6 +454,7 @@ export default {
}).catch(() => {
this.loading = false
})
console.log(this.displayData)
},
// 分页处理
handlePagination() {
......@@ -394,6 +490,32 @@ export default {
getRowKey(row) {
return row.id || row.tempId
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.$refs.queryForm.resetFields()
this.handleQuery()
},
getList() {
this.loading = true
listInbound_itemsAndMname(this.queryParams).then(response => {
this.displayData = response.rows.map(item => ({
...item,
editable: false,
tempId: item.id || Date.now() + Math.random()
}))
this.total = response.total
this.handlePagination()
this.loading = false
}).catch(() => {
this.loading = false
})
},
// 新增物料
handleAddItemClick() {
this.$emit('show-materials',true)
......@@ -403,7 +525,7 @@ export default {
const newItem = {
id: null,
orderId: this.orderId,
materialId: material.materialId,
materialId: material.sapNo,
materialName: material.materialName,
batchId: null,
warehouseId: null,
......@@ -491,7 +613,7 @@ export default {
handleImportSuccess() {
this.$message.success('导入成功')
this.loading = true
listInbound_items(this.queryParams).then(response => {
listInbound_itemsAndMname(this.queryParams).then(response => {
this.displayData = response.rows.map(item => ({
...item,
editable: false,
......
......@@ -13,7 +13,7 @@
:default-expand-all="true"
:highlight-current="true"
:loading="loadingTree"
@selected-change="handleCategoryChange"
@node-click="handleTreeClick"
>
<!-- 自定义节点内容插槽 -->
<template #node-content="{ node, data }">
......@@ -29,30 +29,31 @@
<!-- 右侧内容保持不变 -->
<div style="padding: 10px; display: flex; flex-direction: column;">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
<el-form-item label="物料编码" prop="materialCode">
<!-- <el-form-item label="物料编码" prop="materialCode">
<el-input
v-model="queryParams.materialCode"
placeholder="请输入物料编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
</el-form-item> -->
<el-form-item label="SAP物料号" prop="sapNo">
<el-input
v-model="queryParams.materialName"
placeholder="请输入物料名称"
v-model="queryParams.sapNo"
placeholder="请输入SAP物料号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="SAP物料号" prop="sapNo">
<el-form-item label="物料名称" prop="materialName">
<el-input
v-model="queryParams.sapNo"
placeholder="请输入SAP物料号"
v-model="queryParams.materialName"
placeholder="请输入物料名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="TS Code" prop="tsCode">
<el-input
v-model="queryParams.tsCode"
......@@ -143,9 +144,9 @@
<!-- 表格列保持不变 -->
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="index" label="序号" align="center"/>
<el-table-column label="物料编码" align="center" prop="materialCode" width="120"/>
<el-table-column label="物料名称" align="center" prop="materialName" width="150"/>
<el-table-column label="SAP物料号" align="center" prop="sapNo" />
<!-- <el-table-column label="物料编码" align="center" prop="materialCode" /> -->
<el-table-column label="物料名称" align="center" prop="materialName" />
<el-table-column label="TS Code" align="center" prop="tsCode" />
<el-table-column label="物料分类" align="center" prop="categoryCode" >
<template slot-scope="scope">
......@@ -227,12 +228,15 @@
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="物料编码" prop="materialCode">
<!-- <el-form-item label="物料编码" prop="materialCode">
<el-input v-model="form.materialCode" placeholder="请输入物料编码" />
</el-form-item>
</el-form-item> -->
<el-form-item label="SAP物料号" prop="sapNo">
<el-input v-model="form.sapNo" placeholder="请输入SAP物料号" />
</el-form-item>
<el-form-item label="TS Code" prop="tsCode">
<el-input v-model="form.tsCode" placeholder="请输入TS Code" />
</el-form-item>
<el-form-item label="物料分类" prop="categoryCode">
<el-select v-model="form.categoryCode" placeholder="请选择物料分类" clearable>
<el-option
......@@ -268,17 +272,14 @@
<el-form-item label="最高库存" prop="maxStockLevel">
<el-input v-model="form.maxStockLevel" placeholder="请输入最高库存" />
</el-form-item>
<el-form-item label="风险等级" prop="riskLevel">
<el-input v-model="form.riskLevel" placeholder="请输入风险等级" />
<el-form-item label="排序" prop="sortNo">
<el-input v-model="form.sortNo" placeholder="请输入排序" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="物料名称" prop="materialName">
<el-input v-model="form.materialName" placeholder="请输入物料名称" />
</el-form-item>
<el-form-item label="TS Code" prop="tsCode">
<el-input v-model="form.tsCode" placeholder="请输入TS Code" />
</el-form-item>
<el-form-item label="危险类别ID" prop="hazardId">
<el-input v-model="form.hazardId" placeholder="请输入危险类别ID" />
</el-form-item>
......@@ -309,8 +310,8 @@
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="排序" prop="sortNo">
<el-input v-model="form.sortNo" placeholder="请输入排序" />
<el-form-item label="风险等级" prop="riskLevel">
<el-input v-model="form.riskLevel" placeholder="请输入风险等级" />
</el-form-item>
</el-col>
</el-row>
......@@ -341,7 +342,6 @@ import 'splitpanes/dist/splitpanes.css'
import Treeselect from "@riophae/vue-treeselect"
import "@riophae/vue-treeselect/dist/vue-treeselect.css"
import ImportExcel from "@/components/ImportExcel/index"
import request from '@/utils/request'
export default {
name: "Materials",
......@@ -388,29 +388,28 @@ export default {
// 是否显示弹出层
open: false,
// 当前选中的分类列表
selectedCategories: [],
// 当前选中的树节点ID
currentNodeId: null,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
materialCode: null,
// materialCode: null,
materialName: null,
sapNo: null,
tsCode: null,
categoryCode: null,
categoryNameInput: null,
specification: null,
categoryCodes: []
},
// 表单参数
form: {
id: null,
materialCode: null,
materialName: null,
// materialCode: null,
sapNo: null,
materialName: null,
tsCode: null,
categoryCode: null,
hazardId: null,
......@@ -437,7 +436,7 @@ export default {
// 表单校验
rules: {
materialCode: [{ required: true, message: '请输入物料编码', trigger: 'blur' }],
// materialCode: [{ required: true, message: '请输入物料编码', trigger: 'blur' }],
materialName: [{ required: true, message: '请输入物料名称', trigger: 'blur' }],
sapNo: [{ required: true, message: '请输入SAP物料号', trigger: 'blur' }],
tsCode: [{ required: true, message: '请输入TS Code', trigger: 'blur' }]
......@@ -547,85 +546,38 @@ export default {
return result
},
/** 处理分类选择变化 */
handleCategoryChange(selectedData) {
console.log('选择分类变化:', selectedData)
this.selectedCategories = selectedData;
/** 处理树节点点击 */
handleTreeClick(data) {
console.log('点击树节点:', data)
this.currentNodeId = data.sid
// 更新查询参数,按选中的分类筛选物料
if (selectedData.length > 0) {
// 获取所有选中分类的编码
this.queryParams.categoryCodes = selectedData.map(item => item.categoryCode);
// 清空单个分类编码和名称输入
this.queryParams.categoryCode = null;
this.queryParams.categoryNameInput = null;
} else {
// 未选中任何分类,清空所有分类相关参数
this.queryParams.categoryCodes = [];
this.queryParams.categoryCode = null;
}
this.queryParams.pageNum = 1;
this.getList();
this.queryParams.categoryCode = data.categoryCode
this.queryParams.categoryNameInput = null // 清空名称输入
this.queryParams.pageNum = 1
this.getList()
},
/** 查询物料列表 */
async getList() {
this.loading = true
try {
let materialsList = [];
let total = 0;
// 检查是否有多个分类编码
if (this.queryParams.categoryCodes && this.queryParams.categoryCodes.length > 0) {
// 使用getMaterial接口并行获取每个分类的物料
const promises = this.queryParams.categoryCodes.map(categoryCode =>
request({
url: `/inventory/materials/getMaterial/${categoryCode}`,
method: 'get'
})
);
const results = await Promise.all(promises);
// 合并所有物料并去重
const materialMap = new Map();
results.forEach(result => {
if (result && result.data) {
const materials = Array.isArray(result.data) ? result.data : [result.data];
materials.forEach(material => {
if (!materialMap.has(material.id)) {
materialMap.set(material.id, material);
materialsList.push(material);
}
});
}
});
total = materialsList.length;
} else {
// 单分类或无分类查询,使用原接口
const response = await listMaterials(this.queryParams);
materialsList = response.rows;
total = response.total;
}
/** 查询物料列表 */
getList() {
this.loading = true
listMaterials(this.queryParams).then(response => {
// 对物料列表中的分类字段做映射处理
this.materialsList = materialsList
.filter(item => item.isUsed !== 0 && item.isUsed !== '0')
.map(item => ({
...item,
// 兜底:如果映射表中没有,显示原始code并标注
displayCategory: this.categoryMap[item.categoryCode] || `${item.categoryCode}(未匹配分类)`
}));
this.total = total;
} catch (error) {
console.error('获取物料列表失败:', error);
this.materialsList = [];
this.total = 0;
} finally {
this.materialsList = response.rows
.filter(item => item.isUsed !== 0 && item.isUsed !== '0')
.map(item => ({
...item,
// 兜底:如果映射表中没有,显示原始code并标注
displayCategory: this.categoryMap[item.categoryCode] || `${item.categoryCode}(未匹配分类)`
}));
this.total = response.total;
}).catch(() => {
this.loading = false;
}
}).finally(() => {
this.loading = false;
})
},
// 取消按钮
......@@ -638,7 +590,7 @@ export default {
reset() {
this.form = {
id: null,
materialCode: null,
// materialCode: null,
materialName: null,
sapNo: null,
tsCode: null,
......@@ -701,21 +653,19 @@ export default {
this.queryParams = {
pageNum: 1,
pageSize: 10,
materialCode: null,
// materialCode: null,
materialName: null,
sapNo: null,
tsCode: null,
categoryCode: null,
categoryNameInput: null,
specification: null,
categoryCodes: []
};
this.selectedCategories = [];
this.currentNodeId = null;
// 修复树形高亮重置:直接操作 TreeComponent 内部的 el-tree
if (this.$refs.treeComponent && this.$refs.treeComponent.$refs.tree) {
this.$refs.treeComponent.$refs.tree.setCurrentKey(null); // 清空选中
this.$refs.treeComponent.$refs.tree.setCheckedKeys([]); // 清空勾选
} else if (this.$refs.treeComponent) {
// 如果 TreeComponent 有自定义重置方法
this.$refs.treeComponent.resetTree();
......@@ -771,7 +721,7 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm(row.id ? '是否确认删除编号为"' + row.materialCode + '"的数据项?' : '是否确认删除选中数量为"' + ids.length + '"的数据项?' ).then(() => {
this.$modal.confirm(row.id ? '是否确认删除编号为"' + row.sapNo + '"的数据项?' : '是否确认删除选中数量为"' + ids.length + '"的数据项?' ).then(() => {
return delMaterials(ids)
}).then(() => {
this.getList()
......
......@@ -20,32 +20,32 @@
</template>
</TreeComponent>
</pane>
<!-- 右侧物料列表(仅展示和查询) -->
<pane size="84" style="overflow: auto;">
<div style="padding: 10px; display: flex; flex-direction: column;">
<!-- 查询表单 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="88px">
<el-form-item label="物料编码" prop="materialCode">
<!-- <el-form-item label="物料编码" prop="materialCode">
<el-input
v-model="queryParams.materialCode"
placeholder="请输入物料编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
</el-form-item> -->
<el-form-item label="SAP物料号" prop="sapNo">
<el-input
v-model="queryParams.materialName"
placeholder="请输入物料名称"
v-model="queryParams.sapNo"
placeholder="请输入SAP物料号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="SAP物料号" prop="sapNo">
<el-form-item label="物料名称" prop="materialName">
<el-input
v-model="queryParams.sapNo"
placeholder="请输入SAP物料号"
v-model="queryParams.materialName"
placeholder="请输入物料名称"
clearable
@keyup.enter.native="handleQuery"
/>
......@@ -65,20 +65,20 @@
</el-form>
<!-- 物料表格(隐藏操作列,保留选择功能) -->
<el-table
<el-table
ref="materialTable"
v-loading="loading"
:data="materialsList"
@selection-change="handleSelectionChange"
v-loading="loading"
:data="materialsList"
@selection-change="handleSelectionChange"
:scroll-x="true"
:row-key="row => row.id"
@row-click="handleRowClick"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="index" label="序号" align="center"/>
<el-table-column label="物料编码" align="center" prop="materialCode" width="120"/>
<el-table-column label="物料名称" align="center" prop="materialName" width="150"/>
<!-- <el-table-column label="物料编码" align="center" prop="materialCode" width="120"/> -->
<el-table-column label="SAP物料号" align="center" prop="sapNo" />
<el-table-column label="物料名称" align="center" prop="materialName" width="150"/>
<el-table-column label="TS Code" align="center" prop="tsCode" />
<el-table-column label="物料分类" align="center" prop="categoryCode" >
<template slot-scope="scope">
......@@ -91,11 +91,11 @@
<template slot-scope="scope">
<el-tag :type="scope.row.isBatchManaged === 1 ? 'success' : 'info'" size="mini">
{{ scope.row.isBatchManaged === 1 ? '是' : '否' }}
</el-tag>
</el-tag>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="total>0"
......@@ -144,9 +144,9 @@ export default {
queryParams: {
pageNum: 1,
pageSize: 10,
materialCode: null,
materialName: null,
// materialCode: null,
sapNo: null,
materialName: null,
tsCode: null,
categoryCode: null,
categoryNameInput: null,
......@@ -224,16 +224,16 @@ export default {
},
buildTreeData(list, parentId = null) {
return list
.filter(item => parentId === null
? (!item.parentId || item.parentId === 0 || item.parentId === '0')
.filter(item => parentId === null
? (!item.parentId || item.parentId === 0 || item.parentId === '0')
: item.parentId == parentId
)
.map(item => ({
...item,
sid: String(item.id),
label: item.categoryName,
children: this.buildTreeData(list, item.id).length
? this.buildTreeData(list, item.id)
children: this.buildTreeData(list, item.id).length
? this.buildTreeData(list, item.id)
: undefined
}));
},
......@@ -280,9 +280,9 @@ export default {
this.queryParams = {
pageNum: 1,
pageSize: 10,
materialCode: null,
materialName: null,
// materialCode: null,
sapNo: null,
materialName: null,
tsCode: null,
categoryCode: null,
categoryNameInput: null,
......@@ -298,7 +298,7 @@ export default {
this.selectedRows = selection;
const selectedData = selection.map(item => ({
id: item.id,
materialCode: item.materialCode,
sapNo: item.sapNo,
materialName: item.materialName,
// specification: item.specification, // 可选:规格型号
// materialUnit: item.materialUnit // 可选:计量单位
......@@ -340,4 +340,4 @@ export default {
.custom-tree-node {
font-size: 14px;
}
</style>
\ No newline at end of file
</style>
......@@ -3,6 +3,8 @@ package com.ruoyi.web.controller.inventory;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.core.domain.entity.Materials;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -21,6 +23,7 @@ import com.ruoyi.inventory.domain.InboundOrderItems;
import com.ruoyi.inventory.service.IInboundOrderItemsService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 入库单明细Controller
......@@ -46,6 +49,17 @@ public class InboundOrderItemsController extends BaseController
List<InboundOrderItems> list = inboundOrderItemsService.selectInboundOrderItemsList(inboundOrderItems);
return getDataTable(list);
}
/**
* 查询入库单明细列表
*/
@PreAuthorize("@ss.hasPermi('inventory:inbound_items:list')")
@GetMapping("/listAndMname")
public TableDataInfo listAndMname(InboundOrderItems inboundOrderItems)
{
startPage();
List<InboundOrderItems> list = inboundOrderItemsService.selectInboundOrderItemsListAndMaterialName(inboundOrderItems);
return getDataTable(list);
}
/**
* 导出入库单明细列表
......@@ -79,7 +93,6 @@ public class InboundOrderItemsController extends BaseController
public AjaxResult add(@RequestBody InboundOrderItems inboundOrderItems)
{
inboundOrderItems.setId(UUID.randomUUID().toString());
System.out.println(inboundOrderItems.toString());
return toAjax(inboundOrderItemsService.insertInboundOrderItems(inboundOrderItems));
}
......@@ -104,4 +117,18 @@ public class InboundOrderItemsController extends BaseController
{
return toAjax(inboundOrderItemsService.deleteInboundOrderItemsByIds(ids));
}
/**
* 导入入库单物料明细
*/
@PreAuthorize("@ss.hasPermi('inventory:inbound_items:import')")
@Log(title = "物料信息导入", businessType = BusinessType.IMPORT)
@PostMapping("/import")
public AjaxResult importTemplate(MultipartFile file , boolean updateSupport) throws Exception
{
ExcelUtil<InboundOrderItems> util = new ExcelUtil<InboundOrderItems>(InboundOrderItems.class);
List<InboundOrderItems> inboundOrderItems = util.importExcel(file.getInputStream());
String operName = getUsername();
String message = inboundOrderItemsService.importInboundOrderItems(inboundOrderItems, updateSupport, operName);
return success(message);
}
}
......@@ -122,7 +122,9 @@ public class MaterialsController extends BaseController
ExcelUtil<Materials> util = new ExcelUtil<Materials>(Materials.class);
util.importTemplateExcel(response, "物料信息");
}
/**
* 导入物料
*/
@PreAuthorize("@ss.hasPermi('inventory:materials:import')")
@Log(title = "物料信息导入", businessType = BusinessType.IMPORT)
@PostMapping("/import")
......
package com.ruoyi.inventory.controller;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
......@@ -77,6 +79,7 @@ public class InventoryController extends BaseController
@PostMapping
public AjaxResult add(@RequestBody Inventory inventory)
{
inventory.setId(UUID.randomUUID().toString());
return toAjax(inventoryService.insertInventory(inventory));
}
......@@ -101,4 +104,15 @@ public class InventoryController extends BaseController
{
return toAjax(inventoryService.deleteInventoryByIds(ids));
}
/**
* 批量新增库存
*/
@PreAuthorize("@ss.hasPermi('inventory:inventory:add')")
@Log(title = "库存", businessType = BusinessType.INSERT)
@PostMapping("/batchAdd")
public AjaxResult batchAdd(@Validated @RequestBody List<Inventory> inventoryList)
{
return toAjax(inventoryService.insertInventoryList(inventoryList));
}
}
......@@ -55,7 +55,7 @@ public class InboundOrderItems extends BaseEntity
private Long actualPackages;
/** 约数 */
@Excel(name = "约数")
// @Excel(name = "约数")
private Long divisor;
/** 标签颜色 字典,检索条件 */
......@@ -71,7 +71,7 @@ public class InboundOrderItems extends BaseEntity
private Long unitPrice;
/** 状态1-待收货 2-部分收货 3-已完成 暂无用 */
@Excel(name = "状态")
// @Excel(name = "状态")
private Long itemStatus;
/** 收货时间 暂无用 */
......@@ -83,19 +83,19 @@ public class InboundOrderItems extends BaseEntity
private String receivedBy;
/** 应用数据1使用0删除 删除用 */
@Excel(name = "应用数据")
// @Excel(name = "应用数据")
private Long isUsed;
/** 排序 */
@Excel(name = "排序")
// @Excel(name = "排序")
private Long sortNo;
/** 创建日期 */
@Excel(name = "创建日期")
// @Excel(name = "创建日期")
private String createUserCode;
/** 排序号 */
@Excel(name = "排序号")
// @Excel(name = "排序号")
private String updateUserCode;
public void setId(String id)
......
......@@ -35,7 +35,7 @@ public class InboundOrders extends BaseEntity
/** 批次ID 检索条件 */
@Excel(name = "批次ID 检索条件")
private String batchCode;
private String batchId;
/** 仓库ID 暂无用 */
@Excel(name = "仓库ID 暂无用")
......@@ -133,14 +133,14 @@ public class InboundOrders extends BaseEntity
return orderTypeId;
}
public void setBatchCode(String batchCode)
public void setBatchId(String batchId)
{
this.batchCode = batchCode;
this.batchId = batchId;
}
public String getBatchCode()
public String getBatchId()
{
return batchCode;
return batchId;
}
public void setWarehouseId(String warehouseId)
......@@ -290,7 +290,7 @@ public class InboundOrders extends BaseEntity
.append("orderId", getOrderId())
.append("systemNo", getSystemNo())
.append("orderTypeId", getOrderTypeId())
.append("batchCode", getBatchCode())
.append("batchCode", getBatchId())
.append("warehouseId", getWarehouseId())
.append("ownerId", getOwnerId())
.append("orderStatus", getOrderStatus())
......
package com.ruoyi.inventory.domain.TO;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 入库单明细对象 inbound_order_items
*
* @author ruoyi
* @date 2025-12-02
*/
public class InboundItemsAndMaterialName extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 编号 */
private String id;
/** 入库单号 检索条件 */
@Excel(name = "入库单号")
private String orderId;
/** 货物ID 字典,检索条件 */
@Excel(name = "货物ID")
private String materialId;
/** 批次ID 检索条件 */
@Excel(name = "批次ID")
private String batchId;
/** 仓库ID 检索条件 */
@Excel(name = "仓库ID")
private String warehouseId;
/** 库位ID 检索条件 */
@Excel(name = "库位ID")
private String locationId;
/** 计划数量 */
@Excel(name = "计划数量")
private Long plannedQuantity;
/** 实际数量 */
@Excel(name = "实际数量")
private Long actualQuantity;
/** 计划件数 暂无用 */
@Excel(name = "计划件数")
private Long plannedPackages;
/** 实际件数 */
@Excel(name = "实际件数")
private Long actualPackages;
/** 约数 */
// @Excel(name = "约数")
private Long divisor;
/** 标签颜色 字典,检索条件 */
@Excel(name = "标签颜色")
private Long labelColor;
/** 凭证号 检索条件 */
@Excel(name = "凭证号")
private String voucherNumber;
/** 单价 */
@Excel(name = "单价")
private Long unitPrice;
/** 状态1-待收货 2-部分收货 3-已完成 暂无用 */
// @Excel(name = "状态")
private Long itemStatus;
/** 收货时间 暂无用 */
@Excel(name = "收货时间")
private Long receivedAt;
/** 收货人 */
@Excel(name = "收货人")
private String receivedBy;
/** 应用数据1使用0删除 删除用 */
// @Excel(name = "应用数据")
private Long isUsed;
/** 排序 */
// @Excel(name = "排序")
private Long sortNo;
/** 创建日期 */
// @Excel(name = "创建日期")
private String createUserCode;
/** 排序号 */
// @Excel(name = "排序号")
private String updateUserCode;
private String materialName;
public void setId(String id)
{
this.id = id;
}
public String getId()
{
return id;
}
public void setOrderId(String orderId)
{
this.orderId = orderId;
}
public String getOrderId()
{
return orderId;
}
public void setMaterialId(String materialId)
{
this.materialId = materialId;
}
public String getMaterialId()
{
return materialId;
}
public void setBatchId(String batchId)
{
this.batchId = batchId;
}
public String getBatchId()
{
return batchId;
}
public void setWarehouseId(String warehouseId)
{
this.warehouseId = warehouseId;
}
public String getWarehouseId()
{
return warehouseId;
}
public void setLocationId(String locationId)
{
this.locationId = locationId;
}
public String getLocationId()
{
return locationId;
}
public void setPlannedQuantity(Long plannedQuantity)
{
this.plannedQuantity = plannedQuantity;
}
public Long getPlannedQuantity()
{
return plannedQuantity;
}
public void setActualQuantity(Long actualQuantity)
{
this.actualQuantity = actualQuantity;
}
public Long getActualQuantity()
{
return actualQuantity;
}
public void setPlannedPackages(Long plannedPackages)
{
this.plannedPackages = plannedPackages;
}
public Long getPlannedPackages()
{
return plannedPackages;
}
public void setActualPackages(Long actualPackages)
{
this.actualPackages = actualPackages;
}
public Long getActualPackages()
{
return actualPackages;
}
public void setDivisor(Long divisor)
{
this.divisor = divisor;
}
public Long getDivisor()
{
return divisor;
}
public void setLabelColor(Long labelColor)
{
this.labelColor = labelColor;
}
public Long getLabelColor()
{
return labelColor;
}
public void setVoucherNumber(String voucherNumber)
{
this.voucherNumber = voucherNumber;
}
public String getVoucherNumber()
{
return voucherNumber;
}
public void setUnitPrice(Long unitPrice)
{
this.unitPrice = unitPrice;
}
public Long getUnitPrice()
{
return unitPrice;
}
public void setItemStatus(Long itemStatus)
{
this.itemStatus = itemStatus;
}
public Long getItemStatus()
{
return itemStatus;
}
public void setReceivedAt(Long receivedAt)
{
this.receivedAt = receivedAt;
}
public Long getReceivedAt()
{
return receivedAt;
}
public void setReceivedBy(String receivedBy)
{
this.receivedBy = receivedBy;
}
public String getReceivedBy()
{
return receivedBy;
}
public void setIsUsed(Long isUsed)
{
this.isUsed = isUsed;
}
public Long getIsUsed()
{
return isUsed;
}
public void setSortNo(Long sortNo)
{
this.sortNo = sortNo;
}
public Long getSortNo()
{
return sortNo;
}
public void setCreateUserCode(String createUserCode)
{
this.createUserCode = createUserCode;
}
public String getCreateUserCode()
{
return createUserCode;
}
public void setUpdateUserCode(String updateUserCode)
{
this.updateUserCode = updateUserCode;
}
public String getUpdateUserCode()
{
return updateUserCode;
}
public String getMaterialName() {
return materialName;
}
public void setMaterialName(String materialName) {
this.materialName = materialName;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("orderId", getOrderId())
.append("materialId", getMaterialId())
.append("batchId", getBatchId())
.append("warehouseId", getWarehouseId())
.append("locationId", getLocationId())
.append("plannedQuantity", getPlannedQuantity())
.append("actualQuantity", getActualQuantity())
.append("plannedPackages", getPlannedPackages())
.append("actualPackages", getActualPackages())
.append("divisor", getDivisor())
.append("labelColor", getLabelColor())
.append("voucherNumber", getVoucherNumber())
.append("unitPrice", getUnitPrice())
.append("itemStatus", getItemStatus())
.append("receivedAt", getReceivedAt())
.append("receivedBy", getReceivedBy())
.append("remark", getRemark())
.append("isUsed", getIsUsed())
.append("sortNo", getSortNo())
.append("createTime", getCreateTime())
.append("createUserCode", getCreateUserCode())
.append("updateTime", getUpdateTime())
.append("updateUserCode", getUpdateUserCode())
.append("materialName", getMaterialName())
.toString();
}
}
......@@ -28,6 +28,14 @@ public interface InboundOrderItemsMapper
public List<InboundOrderItems> selectInboundOrderItemsList(InboundOrderItems inboundOrderItems);
/**
* 查询入库单明细列表联查materialName
*
* @param inboundOrderItems 入库单明细
* @return 入库单明细集合
*/
public List<InboundOrderItems> selectInboundOrderItemsListAndMaterialName(InboundOrderItems inboundOrderItems);
/**
* 新增入库单明细
*
* @param inboundOrderItems 入库单明细
......
package com.ruoyi.inventory.service;
import java.util.List;
import com.ruoyi.common.core.domain.entity.Materials;
import com.ruoyi.inventory.domain.InboundOrderItems;
/**
......@@ -26,7 +28,7 @@ public interface IInboundOrderItemsService
* @return 入库单明细集合
*/
public List<InboundOrderItems> selectInboundOrderItemsList(InboundOrderItems inboundOrderItems);
public List<InboundOrderItems> selectInboundOrderItemsListAndMaterialName(InboundOrderItems inboundOrderItems);
/**
* 新增入库单明细
*
......@@ -58,4 +60,12 @@ public interface IInboundOrderItemsService
* @return 结果
*/
public int deleteInboundOrderItemsById(String id);
/**
* 导入入库单明细信息
*
* @param inboundOrderItems,isUpdateSupport,operName 入库单数据信息
* @return 结果
*/
public String importInboundOrderItems(List<InboundOrderItems> inboundOrderItems, Boolean isUpdateSupport, String operName);
}
......@@ -38,6 +38,13 @@ public interface IInventoryService
public int insertInventory(Inventory inventory);
/**
* 批量新增库存
*
* @param inventoryList 库存
* @return 结果
*/
public int insertInventoryList(List<Inventory> inventoryList);
/**
* 修改库存
*
* @param inventory 库存
......
package com.ruoyi.inventory.service.impl;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import com.ruoyi.common.core.domain.entity.Materials;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.inventory.mapper.InboundOrderItemsMapper;
......@@ -44,6 +52,11 @@ public class InboundOrderItemsServiceImpl implements IInboundOrderItemsService
return inboundOrderItemsMapper.selectInboundOrderItemsList(inboundOrderItems);
}
@Override
public List<InboundOrderItems> selectInboundOrderItemsListAndMaterialName(InboundOrderItems inboundOrderItems) {
return inboundOrderItemsMapper.selectInboundOrderItemsListAndMaterialName(inboundOrderItems);
}
/**
* 新增入库单明细
*
......@@ -93,4 +106,71 @@ public class InboundOrderItemsServiceImpl implements IInboundOrderItemsService
{
return inboundOrderItemsMapper.deleteInboundOrderItemsById(id);
}
/**
* 导入入库单明细信息
*
* @param inboundOrderItemsList,isUpdateSupport,operName 入库单数据信息
* @return 结果
*/
@Override
public String importInboundOrderItems(List<InboundOrderItems> inboundOrderItemsList, Boolean isUpdateSupport, String operName)
{
if (StringUtils.isNull(inboundOrderItemsList) || inboundOrderItemsList.size() == 0)
{
throw new ServiceException("导入用户数据不能为空!");
}
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
Date now = DateUtils.getNowDate();
Long userId = SecurityUtils.getUserId();
String operId = userId.toString();
for (InboundOrderItems inboundOrderItems : inboundOrderItemsList)
{
try
{
inboundOrderItems.setId(UUID.randomUUID().toString());
// 填充创建人、创建时间、修改人、修改时间
inboundOrderItems.setCreateBy(operId);
inboundOrderItems.setCreateTime(now);
// 填充创建用户编码和更新用户编码
inboundOrderItems.setCreateUserCode(operId);
// 设置默认值
if (inboundOrderItems.getItemStatus() == null)
{
inboundOrderItems.setItemStatus(1L); // 默认激活
}
if (inboundOrderItems.getIsUsed() == null)
{
inboundOrderItems.setIsUsed(1L); // 默认未删除
}
if (inboundOrderItems.getSortNo() == null)
{
inboundOrderItems.setSortNo(0L); // 默认排序号
}
inboundOrderItemsMapper.insertInboundOrderItems(inboundOrderItems);
successNum++;
successMsg.append("<br/>" + inboundOrderItems.getOrderId() + "入库单的" + successNum + "条入库单物料 " + inboundOrderItems.getMaterialId() + " 导入成功");
}
catch (Exception e)
{
failureNum++;
String msg = "<br/>" + inboundOrderItems.getOrderId() + "入库单的" + failureNum + "条物料 " + inboundOrderItems.getMaterialId() + " 导入失败:";
failureMsg.append(msg + e.getMessage());
}
}
if (failureNum > 0)
{
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确");
throw new ServiceException(failureMsg.toString());
}
else
{
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
}
package com.ruoyi.inventory.service.impl;
import java.util.List;
import java.util.UUID;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.inventory.domain.OutboundOrderLog;
import com.ruoyi.inventory.mapper.OutboundOrderLogMapper;
......@@ -72,6 +74,17 @@ public class InventoryServiceImpl implements IInventoryService
return inventoryMapper.insertInventory(inventory);
}
@Override
public int insertInventoryList(List<Inventory> inventoryList) {
int count = 0;
for (Inventory inventory : inventoryList) {
inventory.setCreateTime(DateUtils.getNowDate());
inventory.setId(UUID.randomUUID().toString());
count = inventoryMapper.insertInventory(inventory);
}
return count;
}
/**
* 修改库存
*
......
......@@ -31,6 +31,8 @@
<result property="updateUserCode" column="update_user_code" />
</resultMap>
<sql id="selectInboundOrderItemsVo">
select id, order_id, material_id, batch_id, warehouse_id, location_id, planned_quantity, actual_quantity, planned_packages, actual_packages, divisor, label_color, voucher_number, unit_price, item_status, received_at, received_by, remark, is_used, sort_no, create_time, create_user_code, update_time, update_user_code from inbound_order_items
</sql>
......@@ -66,6 +68,102 @@
where id = #{id}
</select>
<select id="selectInboundOrderItemsListAndMaterialName"
parameterType="InboundOrderItems"
resultMap="InboundOrderItemsAndMnameResult">
SELECT
ii.id,
ii.order_id,
ii.material_id,
ii.batch_id,
ii.warehouse_id,
ii.location_id,
ii.planned_quantity,
ii.actual_quantity,
ii.planned_packages,
ii.actual_packages,
ii.divisor,
ii.label_color,
ii.voucher_number,
ii.unit_price,
ii.item_status,
ii.received_at,
ii.received_by,
ii.remark,
ii.is_used,
ii.sort_no,
ii.create_time,
ii.create_user_code,
ii.update_time,
ii.update_user_code,
m.material_name
FROM inbound_order_items ii
LEFT JOIN materials m ON ii.material_id = m.sap_no
<where>
<!-- 移除条件前的and,<where>标签会自动处理首个条件的and/or -->
<if test="orderId != null and orderId != ''">
order_id = #{orderId}
</if>
<if test="materialId != null and materialId != ''">
and material_id = #{materialId}
</if>
<if test="batchId != null and batchId != ''">
and batch_id = #{batchId}
</if>
<if test="warehouseId != null and warehouseId != ''">
and warehouse_id = #{warehouseId}
</if>
<if test="locationId != null and locationId != ''">
and location_id = #{locationId}
</if>
<if test="plannedQuantity != null">
and planned_quantity = #{plannedQuantity}
</if>
<if test="actualQuantity != null">
and actual_quantity = #{actualQuantity}
</if>
<if test="plannedPackages != null">
and planned_packages = #{plannedPackages}
</if>
<if test="actualPackages != null">
and actual_packages = #{actualPackages}
</if>
<if test="divisor != null">
and divisor = #{divisor}
</if>
<if test="labelColor != null">
and label_color = #{labelColor}
</if>
<if test="voucherNumber != null and voucherNumber != ''">
and voucher_number = #{voucherNumber}
</if>
<if test="unitPrice != null">
and unit_price = #{unitPrice}
</if>
<if test="itemStatus != null">
and item_status = #{itemStatus}
</if>
<if test="receivedAt != null">
and received_at = #{receivedAt}
</if>
<if test="receivedBy != null and receivedBy != ''">
and received_by = #{receivedBy}
</if>
<if test="isUsed != null">
and is_used = #{isUsed}
</if>
<if test="sortNo != null">
and sort_no = #{sortNo}
</if>
<if test="createUserCode != null and createUserCode != ''">
and create_user_code = #{createUserCode}
</if>
<if test="updateUserCode != null and updateUserCode != ''">
and update_user_code = #{updateUserCode}
</if>
</where>
</select>
<insert id="insertInboundOrderItems" parameterType="InboundOrderItems">
insert into inbound_order_items
<trim prefix="(" suffix=")" suffixOverrides=",">
......@@ -162,4 +260,32 @@
#{id}
</foreach>
</delete>
<resultMap type="com.ruoyi.inventory.domain.TO.InboundItemsAndMaterialName" id="InboundOrderItemsAndMnameResult">
<result property="id" column="id" />
<result property="orderId" column="order_id" />
<result property="materialId" column="material_id" />
<result property="batchId" column="batch_id" />
<result property="warehouseId" column="warehouse_id" />
<result property="locationId" column="location_id" />
<result property="plannedQuantity" column="planned_quantity" />
<result property="actualQuantity" column="actual_quantity" />
<result property="plannedPackages" column="planned_packages" />
<result property="actualPackages" column="actual_packages" />
<result property="divisor" column="divisor" />
<result property="labelColor" column="label_color" />
<result property="voucherNumber" column="voucher_number" />
<result property="unitPrice" column="unit_price" />
<result property="itemStatus" column="item_status" />
<result property="receivedAt" column="received_at" />
<result property="receivedBy" column="received_by" />
<result property="remark" column="remark" />
<result property="isUsed" column="is_used" />
<result property="sortNo" column="sort_no" />
<result property="createTime" column="create_time" />
<result property="createUserCode" column="create_user_code" />
<result property="updateTime" column="update_time" />
<result property="updateUserCode" column="update_user_code" />
<result property="materialName" column="material_name" />
</resultMap>
</mapper>
\ No newline at end of file
......@@ -9,7 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="orderId" column="order_id" />
<result property="systemNo" column="system_no" />
<result property="orderTypeId" column="order_type_id" />
<result property="batchCode" column="batch_code" />
<result property="batchId" column="batch_id" />
<result property="warehouseId" column="warehouse_id" />
<result property="ownerId" column="owner_id" />
<result property="orderStatus" column="order_status" />
......@@ -60,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectInboundOrdersVo">
select id, order_id, system_no, order_type_id, batch_code, warehouse_id, owner_id, order_status, inbound_date, order_type, total_planned_quantity, total_actual_quantity, total_packages, remark, op_user_name, is_used, sort_no, create_time, create_user_code, update_time, update_user_code from inbound_orders
select id, order_id, system_no, order_type_id, batch_id, warehouse_id, owner_id, order_status, inbound_date, order_type, total_planned_quantity, total_actual_quantity, total_packages, remark, op_user_name, is_used, sort_no, create_time, create_user_code, update_time, update_user_code from inbound_orders
</sql>
<select id="selectInboundOrdersList" parameterType="InboundOrders" resultMap="InboundOrdersResult">
......@@ -69,7 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="id != null and id != ''"> and id = #{id}</if>
<if test="systemNo != null and systemNo != ''"> and system_no = #{systemNo}</if>
<if test="orderTypeId != null and orderTypeId != ''"> and order_type_id = #{orderTypeId}</if>
<if test="batchCode != null and batchCode != ''"> and batch_code = #{batchCode}</if>
<if test="batchId != null and batchId != ''"> and batch_id = #{batchId}</if>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
<if test="ownerId != null and ownerId != ''"> and owner_id = #{ownerId}</if>
<if test="orderStatus != null "> and order_status = #{orderStatus}</if>
......@@ -87,7 +87,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectInboundOrdersById" parameterType="String" resultMap="InboundOrdersInboundOrderItemsResult">
select id, order_id, system_no, order_type_id, batch_code, warehouse_id, owner_id, order_status, inbound_date, order_type, total_planned_quantity, total_actual_quantity, total_packages, remark, op_user_name, is_used, sort_no, create_time, create_user_code, update_time, update_user_code
select id, order_id, system_no, order_type_id, batch_id, warehouse_id, owner_id, order_status, inbound_date, order_type, total_planned_quantity, total_actual_quantity, total_packages, remark, op_user_name, is_used, sort_no, create_time, create_user_code, update_time, update_user_code
from inbound_orders
where id = #{id}
</select>
......@@ -105,7 +105,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="orderId != null">order_id,</if>
<if test="systemNo != null">system_no,</if>
<if test="orderTypeId != null">order_type_id,</if>
<if test="batchCode != null">batch_code,</if>
<if test="batchId != null">batch_id,</if>
<if test="warehouseId != null">warehouse_id,</if>
<if test="ownerId != null">owner_id,</if>
<if test="orderStatus != null">order_status,</if>
......@@ -128,7 +128,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="orderId != null">#{orderId},</if>
<if test="systemNo != null">#{systemNo},</if>
<if test="orderTypeId != null">#{orderTypeId},</if>
<if test="batchCode != null">#{batchCode},</if>
<if test="batchId != null">#{batchId},</if>
<if test="warehouseId != null">#{warehouseId},</if>
<if test="ownerId != null">#{ownerId},</if>
<if test="orderStatus != null">#{orderStatus},</if>
......@@ -154,7 +154,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="orderId != null">order_id = #{orderId},</if>
<if test="systemNo != null">system_no = #{systemNo},</if>
<if test="orderTypeId != null">order_type_id = #{orderTypeId},</if>
<if test="batchCode != null">batch_code = #{batchCode},</if>
<if test="batchId != null">batch_id = #{batchId},</if>
<if test="warehouseId != null">warehouse_id = #{warehouseId},</if>
<if test="ownerId != null">owner_id = #{ownerId},</if>
<if test="orderStatus != null">order_status = #{orderStatus},</if>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论