Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
M
mini-wms
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Members
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
周海峰
mini-wms
Commits
e57792fc
Commit
e57792fc
authored
Dec 15, 2025
by
zhangtw
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
入库单导入按照客户模板进行字段匹配
parent
0cee0a3f
隐藏空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
668 行增加
和
500 行删除
+668
-500
ruoyi-admin-vue/src/components/ImportExcel/index.vue
+1
-1
ruoyi-admin-vue/src/views/inventory/inbound/index.vue
+12
-3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/inventory/InboundOrdersController.java
+78
-46
ruoyi-inventory/src/main/java/com/ruoyi/inventory/controller/OutboundOrderItemsController.java
+1
-1
ruoyi-inventory/src/main/java/com/ruoyi/inventory/controller/OutboundOrdersController.java
+1
-1
ruoyi-inventory/src/main/java/com/ruoyi/inventory/domain/vo/InboundTemplateVO.java
+0
-395
ruoyi-inventory/src/main/java/com/ruoyi/inventory/domain/vo/inboundVO/InboundFinishTemplateVO.java
+139
-0
ruoyi-inventory/src/main/java/com/ruoyi/inventory/domain/vo/inboundVO/InboundTRDCTemplateVO.java
+136
-0
ruoyi-inventory/src/main/java/com/ruoyi/inventory/domain/vo/inboundVO/InboundTemplateVO.java
+143
-0
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/IInboundOrdersService.java
+2
-3
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/IOutboundOrderItemsService.java
+0
-3
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/impl/InboundOrdersServiceImpl.java
+147
-42
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/impl/OutboundOrderItemsServiceImpl.java
+1
-1
ruoyi-inventory/src/main/resources/mapper/inventory/InboundOrdersMapper.xml
+7
-4
没有找到文件。
ruoyi-admin-vue/src/components/ImportExcel/index.vue
View file @
e57792fc
...
...
@@ -151,7 +151,7 @@ export default {
},
/** 下载模板操作 */
importTemplate
()
{
this
.
download
(
this
.
templateUrl
,
{},
`
${
this
.
templateName
}
_
${
new
Date
().
getTime
()}
.xlsx`
)
this
.
download
(
this
.
templateUrl
,
{
orderType
:
this
.
upload
.
orderType
},
`
${
this
.
templateName
}
_
${
new
Date
().
getTime
()}
.xlsx`
)
},
// 文件上传中处理
handleFileUploadProgress
(
event
,
file
,
fileList
)
{
...
...
ruoyi-admin-vue/src/views/inventory/inbound/index.vue
View file @
e57792fc
...
...
@@ -443,7 +443,7 @@
title
=
"导入"
import
-
url
=
"/inventory/inbound/import"
template
-
url
=
"/inventory/inbound/importTemplate"
template
-
name
=
"入库单导入模板
"
:
template
-
name
=
"getTemplateName()
"
@
success
=
"getList"
:
show
-
trdc
-
checkbox
=
"true"
@
orderTypeChange
=
"handleOrderTypeChange"
...
...
@@ -703,14 +703,14 @@ export default {
/** 修改按钮操作 */
handleUpdate
(
row
)
{
this
.
reset
();
let
id
=
row
.
id
;
if
(
id
===
undefined
){
id
=
this
.
ids
[
0
]
}
getInbound
(
id
).
then
(
response
=>
{
if
(
response
.
data
.
orderStatus
===
2
){
this
.
$modal
.
msgWarning
(
"该入库单已提交,不能修改"
);
this
.
$modal
.
msgWarning
(
"该入库单已提交,不能修改"
);
return
;
}
this
.
form
=
response
.
data
||
{
}
;
...
...
@@ -1051,6 +1051,15 @@ export default {
handleImport() {
this.$refs.import.show()
}
,
getTemplateName(){
if(this.form.orderTypeId === '1'){
return "入库单导入模板"
}
else if(this.form.orderTypeId === '2'){
return "成品入库单导入模板"
}
else if(this.form.orderTypeId === '3'){
return "退料TRDC入库单导入模板"
}
}
,
/** 处理明细项选择变化 */
handleItemsSelectionChange(selection) {
this.selectedItems = selection
...
...
ruoyi-admin/src/main/java/com/ruoyi/web/controller/inventory/InboundOrdersController.java
View file @
e57792fc
package
com
.
ruoyi
.
web
.
controller
.
inventory
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.stream.Collectors
;
import
com.ruoyi.common.core.domain.entity.Materials
;
import
com.ruoyi.common.utils.uuid.UUID
;
import
javax.servlet.http.HttpServletResponse
;
import
com.ruoyi.inventory.domain.
InboundOrderItems
;
import
com.ruoyi.inventory.domain.
vo.inboundVO.InboundFinishTemplateVO
;
import
com.ruoyi.inventory.domain.vo.InboundMaterialTotalVO
;
import
com.ruoyi.inventory.domain.vo.InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.inboundVO.InboundTRDCTemplateVO
;
import
com.ruoyi.inventory.domain.vo.inboundVO.InboundTemplateVO
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.util.CollectionUtils
;
...
...
@@ -113,10 +112,22 @@ public class InboundOrdersController extends BaseController
@PreAuthorize
(
"@ss.hasPermi('inventory:inbound:importTemplate')"
)
@Log
(
title
=
"入库导入模板"
,
businessType
=
BusinessType
.
IMPORT
)
@PostMapping
(
"/importTemplate"
)
public
void
importTemplate
(
HttpServletResponse
response
)
public
void
importTemplate
(
HttpServletResponse
response
,
@RequestParam
(
"orderType"
)
Integer
orderType
)
{
ExcelUtil
<
InboundTemplateVO
>
util
=
new
ExcelUtil
<
InboundTemplateVO
>(
InboundTemplateVO
.
class
);
util
.
importTemplateExcel
(
response
,
"入库单及入库物料明细信息"
);
switch
(
orderType
){
case
1
:
ExcelUtil
<
InboundTemplateVO
>
util
=
new
ExcelUtil
<
InboundTemplateVO
>(
InboundTemplateVO
.
class
);
util
.
importTemplateExcel
(
response
,
"入库单及入库物料明细信息"
);
break
;
case
2
:
ExcelUtil
<
InboundFinishTemplateVO
>
util1
=
new
ExcelUtil
<
InboundFinishTemplateVO
>(
InboundFinishTemplateVO
.
class
);
util1
.
importTemplateExcel
(
response
,
"成品入库单及入库物料明细信息"
);
break
;
case
3
:
ExcelUtil
<
InboundTRDCTemplateVO
>
util2
=
new
ExcelUtil
<
InboundTRDCTemplateVO
>(
InboundTRDCTemplateVO
.
class
);
util2
.
importTemplateExcel
(
response
,
"TRDC退库入库单及入库物料明细信息"
);
break
;
}
}
/**
...
...
@@ -139,46 +150,67 @@ public class InboundOrdersController extends BaseController
if
(!
fileName
.
endsWith
(
".xlsx"
)
&&
!
fileName
.
endsWith
(
".xls"
))
{
return
error
(
"仅支持Excel格式文件(.xlsx/.xls)!"
);
}
// 第二步:校验Excel列名是否匹配模板(核心!拦截非模板数据)
List
<
String
>
templateColumns
=
Arrays
.
asList
(
"入库日期"
,
"SAP No"
,
"物料名称"
,
"TS Code"
,
"货主"
,
"批号"
,
"计划数量"
,
"单号"
,
"系统编号"
,
"件重"
,
"约数"
,
"实际件数"
,
"实发数量"
,
"仓库"
,
"库位"
,
"标签颜色"
,
"凭证号"
,
"单价"
,
"备注"
,
"订单类型"
,
"收货人"
,
"物料备注"
);
List
<
String
>
excelColumns
=
ExcelUtil
.
getExcelHeader
(
file
.
getInputStream
());
// 自定义方法读取表头
if
(
CollectionUtils
.
isEmpty
(
excelColumns
)
||
!
excelColumns
.
containsAll
(
templateColumns
))
{
return
AjaxResult
.
error
(
"导入文件不是标准模板!请下载官方模板后填写(缺失列:"
+
getMissingColumns
(
templateColumns
,
excelColumns
)
+
")"
);
}
ExcelUtil
<
InboundTemplateVO
>
util
=
new
ExcelUtil
<
InboundTemplateVO
>(
InboundTemplateVO
.
class
);
List
<
InboundTemplateVO
>
inboundOrders
=
util
.
importExcel
(
file
.
getInputStream
());
// 防护3:拦截空列表,避免 Service 层处理空数据
if
(
CollectionUtils
.
isEmpty
(
inboundOrders
))
{
return
error
(
"Excel中未解析到有效数据,请检查模板是否正确!"
);
}
// // 第二步:校验Excel列名是否匹配模板(核心!拦截非模板数据)
// List<String> templateColumns = Arrays.asList(
// "入库日期",
// "SAP No",
// "物料名称",
// "TS Code",
// "货主",
// "批号",
// "计划数量",
// "单号",
// "系统编号",
// "件重",
// "约数",
// "实际件数",
// "实发数量",
// "仓库",
// "库位",
// "标签颜色",
// "凭证号",
// "单价",
// "备注",
// "订单类型",
// "收货人",
// "物料备注"
// );
// List<String> excelColumns = ExcelUtil.getExcelHeader(file.getInputStream()); // 自定义方法读取表头
// if (CollectionUtils.isEmpty(excelColumns) || !excelColumns.containsAll(templateColumns)) {
// return AjaxResult.error("导入文件不是标准模板!请下载官方模板后填写(缺失列:"
// + getMissingColumns(templateColumns, excelColumns) + ")");
// }
String
message
=
null
;
String
operName
=
getUsername
();
String
message
=
inboundOrdersService
.
importInboundOrders
(
inboundOrders
,
updateSupport
,
operName
,
orderType
);
switch
(
orderType
){
case
1
:
ExcelUtil
<
InboundTemplateVO
>
util
=
new
ExcelUtil
<
InboundTemplateVO
>(
InboundTemplateVO
.
class
);
List
<
InboundTemplateVO
>
inboundOrders
=
util
.
importExcel
(
file
.
getInputStream
());
// 防护3:拦截空列表,避免 Service 层处理空数据
if
(
CollectionUtils
.
isEmpty
(
inboundOrders
))
{
return
error
(
"Excel中未解析到有效数据,请检查模板是否正确!"
);
}
message
=
inboundOrdersService
.
importInboundOrders
(
inboundOrders
,
updateSupport
,
operName
,
orderType
);
break
;
case
2
:
ExcelUtil
<
InboundFinishTemplateVO
>
util1
=
new
ExcelUtil
<
InboundFinishTemplateVO
>(
InboundFinishTemplateVO
.
class
);
List
<
InboundFinishTemplateVO
>
inboundOrders1
=
util1
.
importExcel
(
file
.
getInputStream
());
// 防护3:拦截空列表,避免 Service 层处理空数据
if
(
CollectionUtils
.
isEmpty
(
inboundOrders1
))
{
return
error
(
"Excel中未解析到有效数据,请检查模板是否正确!"
);
}
message
=
inboundOrdersService
.
importInboundOrders
(
inboundOrders1
,
updateSupport
,
operName
,
orderType
);
break
;
case
3
:
ExcelUtil
<
InboundTRDCTemplateVO
>
util2
=
new
ExcelUtil
<
InboundTRDCTemplateVO
>(
InboundTRDCTemplateVO
.
class
);
List
<
InboundTRDCTemplateVO
>
inboundOrders2
=
util2
.
importExcel
(
file
.
getInputStream
());
// 防护3:拦截空列表,避免 Service 层处理空数据
if
(
CollectionUtils
.
isEmpty
(
inboundOrders2
))
{
return
error
(
"Excel中未解析到有效数据,请检查模板是否正确!"
);
}
message
=
inboundOrdersService
.
importInboundOrders
(
inboundOrders2
,
updateSupport
,
operName
,
orderType
);
break
;
}
return
success
(
message
);
}
// 辅助方法:获取缺失的列名
...
...
ruoyi-inventory/src/main/java/com/ruoyi/inventory/controller/OutboundOrderItemsController.java
View file @
e57792fc
...
...
@@ -3,7 +3,7 @@ package com.ruoyi.inventory.controller;
import
java.util.List
;
import
javax.servlet.http.HttpServletResponse
;
import
com.ruoyi.inventory.domain.vo.InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.
inboundVO.
InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.OutboundOrdersSummaryVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
org.springframework.security.access.prepost.PreAuthorize
;
...
...
ruoyi-inventory/src/main/java/com/ruoyi/inventory/controller/OutboundOrdersController.java
View file @
e57792fc
...
...
@@ -6,7 +6,7 @@ import javax.servlet.http.HttpServletResponse;
import
com.alibaba.fastjson2.JSONObject
;
import
com.ruoyi.inventory.domain.Inventory
;
import
com.ruoyi.inventory.domain.vo.InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.
inboundVO.
InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
ruoyi-inventory/src/main/java/com/ruoyi/inventory/domain/vo/InboundTemplateVO.java
deleted
100644 → 0
View file @
0cee0a3f
package
com
.
ruoyi
.
inventory
.
domain
.
vo
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.ruoyi.common.annotation.Excel
;
import
com.ruoyi.common.core.domain.BaseEntity
;
import
java.util.Date
;
/**
* 入库单导入对象 inboundTemplate
*
* @author ruoyi
* @date 2025-12-02
*/
public
class
InboundTemplateVO
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
1L
;
/** 编号 */
private
String
id
;
/** 入库日期 日期无时间 */
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
@Excel
(
name
=
"入库日期"
,
width
=
30
,
dateFormat
=
"yyyy-MM-dd"
)
private
Date
inboundDate
;
/** 货物ID 字典,检索条件 */
@Excel
(
name
=
"SAP No"
)
private
String
sapNo
;
/** 货物名称 */
@Excel
(
name
=
"物料名称"
)
private
String
materialName
;
/** 货物名称 */
@Excel
(
name
=
"TS Code"
)
private
String
tsCode
;
/** 货主ID */
@Excel
(
name
=
"货主"
)
private
String
ownerId
;
/** 批次ID 检索条件 */
@Excel
(
name
=
"批号"
)
private
String
batchId
;
/** 计划数量 */
@Excel
(
name
=
"计划数量"
)
private
Long
plannedQuantity
;
/** 入库单号 检索条件 */
@Excel
(
name
=
"单号"
)
private
String
orderId
;
/** 系统编号 检索条件 */
@Excel
(
name
=
"系统编号"
)
private
String
systemNo
;
/** 入库类型 字典,检索条件 */
// @Excel(name = "入库类型")
private
String
orderTypeId
;
@Excel
(
name
=
"件重"
)
private
Double
unitWeight
;
/** 约数 */
@Excel
(
name
=
"约数"
)
private
Long
divisor
;
/** 实际件数 */
@Excel
(
name
=
"实际件数"
)
private
Long
actualPackages
;
/** 实际数量 */
@Excel
(
name
=
"实发数量"
)
private
Long
actualQuantity
;
/** 仓库ID 暂无用 */
@Excel
(
name
=
"仓库"
)
private
String
warehouseId
;
/** 库位ID 检索条件 */
@Excel
(
name
=
"库位"
)
private
String
locationId
;
/** 标签颜色 字典,检索条件 */
@Excel
(
name
=
"标签颜色"
)
private
Long
labelColor
;
/** 凭证号 检索条件 */
@Excel
(
name
=
"凭证号"
)
private
String
voucherNumber
;
/** 单价 */
@Excel
(
name
=
"单价"
)
private
Long
unitPrice
;
/** 备注 */
@Excel
(
name
=
"备注"
)
private
String
remark
;
/** 订单类型 字典,检索条件 */
@Excel
(
name
=
"订单类型"
)
private
String
orderType
;
/** 收货人 */
@Excel
(
name
=
"收货人"
)
private
String
receivedBy
;
/** 物料备注 */
@Excel
(
name
=
"物料备注"
)
private
String
remark2
;
/** 负责人 暂无用 */
// @Excel(name = "负责人 暂无用")
private
String
opUserName
;
/** 计划件数 暂无用 */
// @Excel(name = "件数")
private
Long
plannedPackages
;
/** 排序号 */
private
Long
sortNo
;
/** 创建日期 */
private
String
createUserCode
;
private
String
updateUserCode
;
public
String
getId
()
{
return
id
;
}
public
void
setId
(
String
id
)
{
this
.
id
=
id
;
}
public
String
getOrderId
()
{
return
orderId
;
}
public
void
setOrderId
(
String
orderId
)
{
this
.
orderId
=
orderId
;
}
public
String
getSystemNo
()
{
return
systemNo
;
}
public
void
setSystemNo
(
String
systemNo
)
{
this
.
systemNo
=
systemNo
;
}
public
String
getOrderTypeId
()
{
return
orderTypeId
;
}
public
void
setOrderTypeId
(
String
orderTypeId
)
{
this
.
orderTypeId
=
orderTypeId
;
}
public
String
getBatchId
()
{
return
batchId
;
}
public
void
setBatchId
(
String
batchId
)
{
this
.
batchId
=
batchId
;
}
public
Date
getInboundDate
()
{
return
inboundDate
;
}
public
void
setInboundDate
(
Date
inboundDate
)
{
this
.
inboundDate
=
inboundDate
;
}
public
String
getOrderType
()
{
return
orderType
;
}
public
void
setOrderType
(
String
orderType
)
{
this
.
orderType
=
orderType
;
}
public
String
getRemark
()
{
return
remark
;
}
public
void
setRemark
(
String
remark
)
{
this
.
remark
=
remark
;
}
public
String
getOwnerId
()
{
return
ownerId
;
}
public
void
setOwnerId
(
String
ownerId
)
{
this
.
ownerId
=
ownerId
;
}
public
String
getWarehouseId
()
{
return
warehouseId
;
}
public
void
setWarehouseId
(
String
warehouseId
)
{
this
.
warehouseId
=
warehouseId
;
}
public
String
getLocationId
()
{
return
locationId
;
}
public
void
setLocationId
(
String
locationId
)
{
this
.
locationId
=
locationId
;
}
public
String
getRemark2
()
{
return
remark2
;
}
public
void
setRemark2
(
String
remark2
)
{
this
.
remark2
=
remark2
;
}
public
String
getSapNo
()
{
return
sapNo
;
}
public
void
setSapNo
(
String
sapNo
)
{
this
.
sapNo
=
sapNo
;
}
public
String
getMaterialName
()
{
return
materialName
;
}
public
void
setMaterialName
(
String
materialName
)
{
this
.
materialName
=
materialName
;
}
public
String
getOpUserName
()
{
return
opUserName
;
}
public
void
setOpUserName
(
String
opUserName
)
{
this
.
opUserName
=
opUserName
;
}
public
Long
getPlannedQuantity
()
{
return
plannedQuantity
;
}
public
void
setPlannedQuantity
(
Long
plannedQuantity
)
{
this
.
plannedQuantity
=
plannedQuantity
;
}
public
Long
getActualQuantity
()
{
return
actualQuantity
;
}
public
void
setActualQuantity
(
Long
actualQuantity
)
{
this
.
actualQuantity
=
actualQuantity
;
}
public
Long
getPlannedPackages
()
{
return
plannedPackages
;
}
public
void
setPlannedPackages
(
Long
plannedPackages
)
{
this
.
plannedPackages
=
plannedPackages
;
}
public
Long
getActualPackages
()
{
return
actualPackages
;
}
public
void
setActualPackages
(
Long
actualPackages
)
{
this
.
actualPackages
=
actualPackages
;
}
public
Long
getDivisor
()
{
return
divisor
;
}
public
void
setDivisor
(
Long
divisor
)
{
this
.
divisor
=
divisor
;
}
public
Long
getLabelColor
()
{
return
labelColor
;
}
public
void
setLabelColor
(
Long
labelColor
)
{
this
.
labelColor
=
labelColor
;
}
public
String
getVoucherNumber
()
{
return
voucherNumber
;
}
public
void
setVoucherNumber
(
String
voucherNumber
)
{
this
.
voucherNumber
=
voucherNumber
;
}
public
Long
getUnitPrice
()
{
return
unitPrice
;
}
public
void
setUnitPrice
(
Long
unitPrice
)
{
this
.
unitPrice
=
unitPrice
;
}
public
String
getReceivedBy
()
{
return
receivedBy
;
}
public
void
setReceivedBy
(
String
receivedBy
)
{
this
.
receivedBy
=
receivedBy
;
}
public
String
getCreateUserCode
()
{
return
createUserCode
;
}
public
void
setCreateUserCode
(
String
createUserCode
)
{
this
.
createUserCode
=
createUserCode
;
}
public
String
getUpdateUserCode
()
{
return
updateUserCode
;
}
public
void
setUpdateUserCode
(
String
updateUserCode
)
{
this
.
updateUserCode
=
updateUserCode
;
}
public
Long
getSortNo
()
{
return
sortNo
;
}
public
void
setSortNo
(
Long
sortNo
)
{
this
.
sortNo
=
sortNo
;
}
public
String
getTsCode
()
{
return
tsCode
;
}
public
void
setTsCode
(
String
tsCode
)
{
this
.
tsCode
=
tsCode
;
}
public
Double
getUnitWeight
()
{
return
unitWeight
;
}
public
void
setUnitWeight
(
Double
unitWeight
)
{
this
.
unitWeight
=
unitWeight
;
}
@Override
public
String
toString
()
{
return
"InboundTemplateVO{"
+
"id='"
+
id
+
'\''
+
", inboundDate="
+
inboundDate
+
", sapNo='"
+
sapNo
+
'\''
+
", materialName='"
+
materialName
+
'\''
+
", tsCode='"
+
tsCode
+
'\''
+
", batchId='"
+
batchId
+
'\''
+
", plannedQuantity="
+
plannedQuantity
+
", orderId='"
+
orderId
+
'\''
+
", systemNo='"
+
systemNo
+
'\''
+
", orderTypeId='"
+
orderTypeId
+
'\''
+
", unitWeight="
+
unitWeight
+
", divisor="
+
divisor
+
", actualPackages="
+
actualPackages
+
", actualQuantity="
+
actualQuantity
+
", warehouseId='"
+
warehouseId
+
'\''
+
", locationId='"
+
locationId
+
'\''
+
", labelColor="
+
labelColor
+
", voucherNumber='"
+
voucherNumber
+
'\''
+
", unitPrice="
+
unitPrice
+
", remark='"
+
remark
+
'\''
+
", orderType='"
+
orderType
+
'\''
+
", receivedBy='"
+
receivedBy
+
'\''
+
", remark2='"
+
remark2
+
'\''
+
", ownerId='"
+
ownerId
+
'\''
+
", opUserName='"
+
opUserName
+
'\''
+
", plannedPackages="
+
plannedPackages
+
", sortNo="
+
sortNo
+
", createUserCode='"
+
createUserCode
+
'\''
+
", updateUserCode='"
+
updateUserCode
+
'\''
+
'}'
;
}
}
ruoyi-inventory/src/main/java/com/ruoyi/inventory/domain/vo/inboundVO/InboundFinishTemplateVO.java
0 → 100644
View file @
e57792fc
package
com
.
ruoyi
.
inventory
.
domain
.
vo
.
inboundVO
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.ruoyi.common.annotation.Excel
;
import
com.ruoyi.common.core.domain.BaseEntity
;
import
lombok.Data
;
import
java.util.Date
;
@Data
public
class
InboundFinishTemplateVO
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
1L
;
/** 编号 */
private
String
id
;
/** 入库日期 日期无时间 */
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
@Excel
(
name
=
"日期"
,
width
=
30
,
dateFormat
=
"yyyy-MM-dd"
)
private
Date
inboundDate
;
/** 货物ID 字典,检索条件 */
@Excel
(
name
=
"SAP No"
)
private
String
sapNo
;
/** 货物名称 */
@Excel
(
name
=
"物料名称"
)
private
String
materialName
;
/** 货物名称 */
@Excel
(
name
=
"TS Code"
)
private
String
tsCode
;
/** 批次ID 检索条件 */
@Excel
(
name
=
"批号"
)
private
String
batchId
;
/** 计划数量 */
@Excel
(
name
=
"计划数量"
)
private
Long
plannedQuantity
;
@Excel
(
name
=
"件重"
)
private
Double
packageWeight
;
/** 约数 */
@Excel
(
name
=
"约数"
)
private
Long
divisor
;
@Excel
(
name
=
"件数"
)
private
Long
actualPackages
;
@Excel
(
name
=
"重量"
)
private
Double
unitWeight
;
/** 实际数量 */
// @Excel(name = "实发数量")
private
Long
actualQuantity
;
/** 库位 */
@Excel
(
name
=
"库位"
)
private
String
locationId
;
/** 仓库ID 暂无用 */
@Excel
(
name
=
"仓库"
)
private
String
warehouseId
;
/** 成品表里的第二个 "库位" */
@Excel
(
name
=
"库位"
)
private
String
remark2
;
/** 库位ID 检索条件 */
// @Excel(name = "收货库位")
private
String
relocationId
;
/** 标签颜色 字典,检索条件 */
@Excel
(
name
=
"标签颜色"
)
private
Long
labelColor
;
/** 凭证号 检索条件 */
@Excel
(
name
=
"凭证号"
)
private
String
voucherNumber
;
@Excel
(
name
=
"保温"
)
private
String
keepWarm
;
@Excel
(
name
=
"危险类别"
)
private
String
hazardId
;
/** 入库单号 检索条件 */
@Excel
(
name
=
"智观(客户订单号)"
)
private
String
orderId
;
/** 系统编号 检索条件 */
@Excel
(
name
=
"客户订单号/PO号"
)
private
String
systemNo
;
/** 货主ID */
@Excel
(
name
=
"货主"
)
private
String
ownerId
;
/** 入库类型 字典,检索条件 */
@Excel
(
name
=
"贴标数量"
)
private
String
labelQuantity
;
/** 订单类型 字典,检索条件 */
@Excel
(
name
=
"订单类型"
)
private
String
orderType
;
@Excel
(
name
=
"单个件重"
)
private
Double
packageWeight2
;
/** 单价 */
// @Excel(name = "单价")
private
Long
unitPrice
;
/** 收货人 */
// @Excel(name = "收货人")
private
String
receivedBy
;
/** 物料备注 */
// @Excel(name = "物料备注")
private
String
remark1
;
/** 负责人 暂无用 */
// @Excel(name = "负责人 暂无用")
private
String
opUserName
;
/** 计划件数 暂无用 */
// @Excel(name = "件数")
private
Long
plannedPackages
;
/** 排序号 */
private
Long
sortNo
;
/** 创建日期 */
private
String
createUserCode
;
private
String
updateUserCode
;
}
ruoyi-inventory/src/main/java/com/ruoyi/inventory/domain/vo/inboundVO/InboundTRDCTemplateVO.java
0 → 100644
View file @
e57792fc
package
com
.
ruoyi
.
inventory
.
domain
.
vo
.
inboundVO
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.ruoyi.common.annotation.Excel
;
import
com.ruoyi.common.core.domain.BaseEntity
;
import
lombok.Data
;
import
java.util.Date
;
@Data
public
class
InboundTRDCTemplateVO
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
1L
;
/** 编号 */
private
String
id
;
/** 入库日期 日期无时间 */
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
@Excel
(
name
=
"日期"
,
width
=
30
,
dateFormat
=
"yyyy-MM-dd"
)
private
Date
inboundDate
;
/** 货物ID 字典,检索条件 */
@Excel
(
name
=
"SAP No"
)
private
String
sapNo
;
/** 货物名称 */
@Excel
(
name
=
"物料名称"
)
private
String
materialName
;
/** 货物名称 */
@Excel
(
name
=
"TS Code"
)
private
String
tsCode
;
/** 批次ID 检索条件 */
@Excel
(
name
=
"批号"
)
private
String
batchId
;
/** 计划数量 */
@Excel
(
name
=
"计划数量"
)
private
Long
plannedQuantity
;
@Excel
(
name
=
"件重"
)
private
Double
unitWeight
;
/** 约数 */
@Excel
(
name
=
"约数"
)
private
Long
divisor
;
/** 实际件数 */
@Excel
(
name
=
"件数"
)
private
Long
actualPackages
;
/** 实际数量 */
@Excel
(
name
=
"实发数量"
)
private
Long
actualQuantity
;
/** 库位ID 检索条件 */
@Excel
(
name
=
"库位"
)
private
String
locationId
;
/** 仓库ID 暂无用 */
@Excel
(
name
=
"仓库"
)
private
String
warehouseId
;
/** 备注 */
@Excel
(
name
=
"备注"
)
private
String
remark
;
/** 库位ID 检索条件 */
// @Excel(name = "收货库位")
private
String
relocationId
;
/** 标签颜色 字典,检索条件 */
@Excel
(
name
=
"标签颜色"
)
private
Long
labelColor
;
/** 凭证号 检索条件 */
@Excel
(
name
=
"凭证号"
)
private
String
voucherNumber
;
@Excel
(
name
=
"保温"
)
private
String
keepWarm
;
@Excel
(
name
=
"危险类别"
)
private
String
hazardId
;
/** 入库单号 检索条件 */
@Excel
(
name
=
"单号"
)
private
String
orderId
;
/** 系统编号 检索条件 */
@Excel
(
name
=
"系统编号"
)
private
String
systemNo
;
/** 货主ID */
@Excel
(
name
=
"货主"
)
private
String
ownerId
;
/** 入库类型 字典,检索条件 */
@Excel
(
name
=
"贴标数量"
)
private
String
labelQuantity
;
/** 订单类型 字典,检索条件 */
@Excel
(
name
=
"订单类型"
)
private
String
orderType
;
@Excel
(
name
=
"单件重量"
)
private
Double
packageWeight
;
/** 单价 */
// @Excel(name = "单价")
private
Long
unitPrice
;
/** 收货人 */
// @Excel(name = "收货人")
private
String
receivedBy
;
/** 物料备注 */
// @Excel(name = "物料备注")
private
String
remark2
;
/** 负责人 暂无用 */
// @Excel(name = "负责人 暂无用")
private
String
opUserName
;
/** 计划件数 暂无用 */
// @Excel(name = "件数")
private
Long
plannedPackages
;
/** 排序号 */
private
Long
sortNo
;
/** 创建日期 */
private
String
createUserCode
;
private
String
updateUserCode
;
}
ruoyi-inventory/src/main/java/com/ruoyi/inventory/domain/vo/inboundVO/InboundTemplateVO.java
0 → 100644
View file @
e57792fc
package
com
.
ruoyi
.
inventory
.
domain
.
vo
.
inboundVO
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.ruoyi.common.annotation.Excel
;
import
com.ruoyi.common.core.domain.BaseEntity
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 入库单导入对象 inboundTemplate
*
* @author ZTW
* @date 2025-12-02
*/
@Data
public
class
InboundTemplateVO
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
1L
;
/** 编号 */
private
String
id
;
/** 入库日期 日期无时间 */
@JsonFormat
(
pattern
=
"yyyy-MM-dd"
)
@Excel
(
name
=
"日期"
,
width
=
30
,
dateFormat
=
"yyyy-MM-dd"
)
private
Date
inboundDate
;
/** 货物ID 字典,检索条件 */
@Excel
(
name
=
"SAP No"
)
private
String
sapNo
;
/** 货物名称 */
@Excel
(
name
=
"物料名称"
)
private
String
materialName
;
/** 货物名称 */
@Excel
(
name
=
"TS Code"
)
private
String
tsCode
;
/** 批次ID 检索条件 */
@Excel
(
name
=
"批号"
)
private
String
batchId
;
/** 计划数量 */
@Excel
(
name
=
"计划数量"
)
private
Long
plannedQuantity
;
@Excel
(
name
=
"件重"
)
private
Double
unitWeight
;
/** 约数 */
@Excel
(
name
=
"约数"
)
private
Long
divisor
;
/** 实际件数 */
@Excel
(
name
=
"件数"
)
private
Long
actualPackages
;
/** 实际数量 */
@Excel
(
name
=
"实发数量"
)
private
Long
actualQuantity
;
/** 库位ID 检索条件 */
@Excel
(
name
=
"库位"
)
private
String
locationId
;
/** 仓库ID 暂无用 */
@Excel
(
name
=
"仓库"
)
private
String
warehouseId
;
/** 备注 */
// @Excel(name = "备注")
private
String
remark
;
/** 库位ID 检索条件 */
@Excel
(
name
=
"收货库位"
)
private
String
relocationId
;
/** 标签颜色 字典,检索条件 */
@Excel
(
name
=
"标签颜色"
)
private
Long
labelColor
;
/** 凭证号 检索条件 */
@Excel
(
name
=
"凭证号"
)
private
String
voucherNumber
;
@Excel
(
name
=
"保温"
)
private
String
keepWarm
;
@Excel
(
name
=
"危险类别"
)
private
String
hazardId
;
/** 入库单号 检索条件 */
@Excel
(
name
=
"单号"
)
private
String
orderId
;
/** 系统编号 检索条件 */
@Excel
(
name
=
"系统编号"
)
private
String
systemNo
;
/** 货主ID */
@Excel
(
name
=
"货主"
)
private
String
ownerId
;
/** 入库类型 字典,检索条件 */
@Excel
(
name
=
"贴标数量"
)
private
String
labelQuantity
;
/** 订单类型 字典,检索条件 */
@Excel
(
name
=
"订单类型"
)
private
String
orderType
;
@Excel
(
name
=
"单件重量"
)
private
Double
packageWeight
;
/** 单价 */
// @Excel(name = "单价")
private
Long
unitPrice
;
/** 收货人 */
// @Excel(name = "收货人")
private
String
receivedBy
;
/** 物料备注 */
// @Excel(name = "物料备注")
private
String
remark2
;
/** 负责人 暂无用 */
// @Excel(name = "负责人 暂无用")
private
String
opUserName
;
/** 计划件数 暂无用 */
// @Excel(name = "件数")
private
Long
plannedPackages
;
/** 排序号 */
private
Long
sortNo
;
/** 创建日期 */
private
String
createUserCode
;
private
String
updateUserCode
;
}
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/IInboundOrdersService.java
View file @
e57792fc
...
...
@@ -2,10 +2,9 @@ package com.ruoyi.inventory.service;
import
java.util.List
;
import
com.ruoyi.inventory.domain.InboundOrderItems
;
import
com.ruoyi.inventory.domain.InboundOrders
;
import
com.ruoyi.inventory.domain.vo.InboundMaterialTotalVO
;
import
com.ruoyi.inventory.domain.vo.InboundTemplateVO
;
/**
* 入库单主Service接口
...
...
@@ -69,7 +68,7 @@ public interface IInboundOrdersService
* @param inboundOrders,isUpdateSupport,operName 入库单数据信息
* @return 结果
*/
public
String
importInboundOrders
(
List
<
InboundTemplateVO
>
inboundOrders
,
Integer
isUpdateSupport
,
String
operName
,
Integer
orderType
);
public
<
T
>
String
importInboundOrders
(
List
<
T
>
inboundOrders
,
Integer
isUpdateSupport
,
String
operName
,
Integer
orderType
);
/**
...
...
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/IOutboundOrderItemsService.java
View file @
e57792fc
...
...
@@ -2,10 +2,7 @@ package com.ruoyi.inventory.service;
import
java.util.List
;
import
com.ruoyi.inventory.domain.OutboundOrderItems
;
import
com.ruoyi.inventory.domain.vo.InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.OutboundOrdersSummaryVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
org.springframework.transaction.annotation.Transactional
;
/**
* 出库单明细Service接口
...
...
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/impl/InboundOrdersServiceImpl.java
View file @
e57792fc
package
com
.
ruoyi
.
inventory
.
service
.
impl
;
import
java.lang.reflect.Method
;
import
java.time.LocalDate
;
import
java.time.format.DateTimeFormatter
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
com.ruoyi.common.exception.ServiceException
;
import
com.ruoyi.inventory.domain.*
;
import
com.ruoyi.inventory.domain.vo.InboundMaterialTotalVO
;
import
com.ruoyi.inventory.mapper.*
;
import
org.apache.commons.lang3.SystemUtils
;
import
org.springframework.transaction.interceptor.TransactionAspectSupport
;
import
org.springframework.util.CollectionUtils
;
import
com.ruoyi.common.exception.ServiceException
;
import
com.ruoyi.common.utils.DateUtils
;
import
com.ruoyi.common.utils.SecurityUtils
;
import
com.ruoyi.common.utils.bean.BeanUtils
;
import
com.ruoyi.inventory.domain.vo.InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.
inboundVO.
InboundTemplateVO
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -27,12 +29,12 @@ import com.ruoyi.inventory.service.IInboundOrdersService;
/**
* 入库单主Service业务层处理
*
*
* @author ruoyi
* @date 2025-12-02
*/
@Service
public
class
InboundOrdersServiceImpl
implements
IInboundOrdersService
public
class
InboundOrdersServiceImpl
implements
IInboundOrdersService
{
@Autowired
private
InboundOrdersMapper
inboundOrdersMapper
;
...
...
@@ -49,7 +51,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
InboundOrdersServiceImpl
.
class
);
/**
* 查询入库单主
*
*
* @param id 入库单主主键
* @return 入库单主
*/
...
...
@@ -61,7 +63,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
/**
* 查询入库单主列表
*
*
* @param inboundOrders 入库单主
* @return 入库单主
*/
...
...
@@ -73,7 +75,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
/**
* 新增入库单主
*
*
* @param inboundOrders 入库单主
* @return 结果
*/
...
...
@@ -91,7 +93,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
/**
* 修改入库单主
*
*
* @param inboundOrders 入库单主
* @return 结果
*/
...
...
@@ -109,7 +111,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
/**
* 批量删除入库单主
*
*
* @param ids 需要删除的入库单主主键
* @return 结果
*/
...
...
@@ -123,7 +125,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
/**
* 删除入库单主信息
*
*
* @param id 入库单主主键
* @return 结果
*/
...
...
@@ -137,7 +139,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
/**
* 新增入库单明细信息
*
*
* @param inboundOrders 入库单主对象
*/
public
void
insertInboundOrderItems
(
InboundOrders
inboundOrders
)
...
...
@@ -174,7 +176,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
String
importInboundOrders
(
List
<
InboundTemplateVO
>
inboundOrdersList
,
Integer
isUpdateSupport
,
String
operName
,
Integer
orderType
)
{
public
<
T
>
String
importInboundOrders
(
List
<
T
>
inboundOrdersList
,
Integer
isUpdateSupport
,
String
operName
,
Integer
orderType
)
{
if
(
StringUtils
.
isNull
(
inboundOrdersList
)
||
inboundOrdersList
.
size
()
==
0
)
{
throw
new
ServiceException
(
"导入数据不能为空!"
);
}
...
...
@@ -196,22 +198,53 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
Map
<
String
,
String
>
warehouseNameIdMap
=
loadWarehouseNameIdMap
();
// 预加载库位名称-ID映射
Map
<
String
,
String
>
storageLocationNameIdMap
=
loadStorageLocationNameIdMap
();
// 3. 按入库单号分组(核心:同一入库单的多条明细归为一组)
Map
<
String
,
List
<
InboundTemplateVO
>>
orderGroupMap
=
Optional
.
ofNullable
(
inboundOrdersList
)
// 3. 按入库单号分组(核心:通过反射处理泛型T的orderId字段)
Map
<
String
,
List
<
T
>>
orderGroupMap
=
Optional
.
ofNullable
(
inboundOrdersList
)
.
orElse
(
Collections
.
emptyList
())
// 空列表兜底,避免NPE
.
stream
()
.
filter
(
Objects:
:
nonNull
)
// 过滤null的VO对象
.
map
(
vo
->
{
// 预处理:入库单号去空格,统一格式
String
orderId
=
Optional
.
ofNullable
(
vo
.
getOrderId
())
.
map
(
String:
:
trim
)
// 去除首尾空格
.
orElse
(
""
);
vo
.
setOrderId
(
orderId
);
// 把处理后的单号回写,保证后续使用一致
// 预处理:入库单号去空格,统一格式(反射调用get/setOrderId)
try
{
// 反射获取getOrderId方法
Method
getOrderIdMethod
=
vo
.
getClass
().
getMethod
(
"getOrderId"
);
String
orderId
=
Optional
.
ofNullable
(
getOrderIdMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
map
(
String:
:
trim
)
// 去除首尾空格
.
orElse
(
""
);
// 反射调用setOrderId方法回写处理后的单号
Method
setOrderIdMethod
=
vo
.
getClass
().
getMethod
(
"setOrderId"
,
String
.
class
);
setOrderIdMethod
.
invoke
(
vo
,
orderId
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"实体类缺少orderId的getter/setter方法"
+
e
);
}
return
vo
;
})
.
filter
(
vo
->
StringUtils
.
isNotBlank
(
vo
.
getOrderId
()))
// 过滤无/空白入库单号的无效行
.
filter
(
vo
->
{
// 反射过滤无/空白入库单号的无效行
try
{
Method
getOrderIdMethod
=
vo
.
getClass
().
getMethod
(
"getOrderId"
);
String
orderId
=
Optional
.
ofNullable
(
getOrderIdMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
orElse
(
""
);
return
StringUtils
.
isNotBlank
(
orderId
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"获取orderId失败"
+
e
);
}
})
.
collect
(
Collectors
.
groupingBy
(
InboundTemplateVO:
:
getOrderId
,
// 分组Key:处理后的入库单号
vo
->
{
// 反射获取分组Key:处理后的入库单号
try
{
Method
getOrderIdMethod
=
vo
.
getClass
().
getMethod
(
"getOrderId"
);
return
Optional
.
ofNullable
(
getOrderIdMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
orElse
(
""
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"分组获取orderId失败"
+
e
);
}
},
Collectors
.
collectingAndThen
(
Collectors
.
toList
(),
list
->
Collections
.
unmodifiableList
(
list
)
// 生成不可变列表,防止后续篡改
...
...
@@ -219,16 +252,17 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
));
// 兜底:若分组结果为空,返回空的不可变Map(避免后续判空)
orderGroupMap
=
Optional
.
ofNullable
(
orderGroupMap
).
orElse
(
Collections
.
emptyMap
());
// 4. 遍历每个入库单分组处理
for
(
Map
.
Entry
<
String
,
List
<
InboundTemplateVO
>>
entry
:
orderGroupMap
.
entrySet
())
{
for
(
Map
.
Entry
<
String
,
List
<
T
>>
entry
:
orderGroupMap
.
entrySet
())
{
String
orderId
=
entry
.
getKey
();
List
<
InboundTemplateVO
>
voList
=
entry
.
getValue
();
List
<
T
>
voList
=
entry
.
getValue
();
InboundOrders
mainDO
=
null
;
List
<
InboundOrderItems
>
itemDOList
=
new
ArrayList
<>();
try
{
// 4.1 处理主表(每个入库单号只处理一次主表)
InboundTemplateVO
firstVO
=
voList
.
get
(
0
);
// 取第一条VO的主表信息
T
firstVO
=
voList
.
get
(
0
);
// 取第一条VO的主表信息
// 检查入库单是否已存在
InboundOrders
existMain
=
inboundOrdersMapper
.
selectInboundOrdersByOrderId
(
orderId
);
...
...
@@ -242,7 +276,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
// 支持更新,复用已有主表ID
mainDO
=
existMain
;
// 复制VO中的主表字段到已有主表(只更新可修改的字段)
//
反射
复制VO中的主表字段到已有主表(只更新可修改的字段)
BeanUtils
.
copyProperties
(
firstVO
,
mainDO
,
"id"
,
"createBy"
,
"createTime"
);
// 排除不可更新字段
mainDO
.
setUpdateBy
(
operId
);
mainDO
.
setUpdateTime
(
now
);
...
...
@@ -255,7 +289,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
else
{
// 新增主表
mainDO
=
new
InboundOrders
();
// 复制主表字段(只复制主表相关字段,避免物料字段污染)
//
反射
复制主表字段(只复制主表相关字段,避免物料字段污染)
BeanUtils
.
copyProperties
(
firstVO
,
mainDO
,
"sapNo"
,
"materialName"
,
"plannedQuantity"
,
"actualQuantity"
,
"plannedPackages"
,
"materialUnit"
,
"materialRemark"
);
// 排除子表字段
...
...
@@ -274,9 +308,18 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
mainDO
.
setOrderStatus
(
1L
);
// 默认草稿状态
}
// ========== 货主查询 ==========
// ========== 货主查询(反射获取ownerId) ==========
String
ownerName
=
""
;
try
{
Method
getOwnerIdMethod
=
firstVO
.
getClass
().
getMethod
(
"getOwnerId"
);
ownerName
=
Optional
.
ofNullable
(
getOwnerIdMethod
.
invoke
(
firstVO
))
.
map
(
Object:
:
toString
)
.
orElse
(
""
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"获取货主名称失败"
+
e
);
}
Owners
owners
=
new
Owners
();
owners
.
setOwnerName
(
mainDO
.
getOwnerId
()
);
owners
.
setOwnerName
(
ownerName
);
List
<
Owners
>
olist
=
ownersMapper
.
selectOwnersList
(
owners
);
if
(
CollectionUtils
.
isEmpty
(
olist
))
{
// 抛业务异常,携带具体单号/条件,方便排查
...
...
@@ -291,11 +334,10 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
// 4.2 处理子表明细(每条VO对应一条明细)
for
(
InboundTemplateVO
vo
:
voList
)
{
for
(
T
vo
:
voList
)
{
try
{
InboundOrderItems
itemDO
=
new
InboundOrderItems
();
// 复制子表字段(物料相关)
//
反射
复制子表字段(物料相关)
BeanUtils
.
copyProperties
(
vo
,
itemDO
,
"orderId"
,
"systemNo"
,
"orderTypeId"
,
"batchId"
);
// 排除主表字段
// 填充明细必填字段
...
...
@@ -304,13 +346,45 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
itemDO
.
setCreateTime
(
now
);
itemDO
.
setCreateUserCode
(
operId
);
itemDO
.
setOrderId
(
orderId
);
// 关联入库单号
itemDO
.
setBatchId
(
mainDO
.
getBatchId
());
// 反射获取batchId并设置
String
batchId
=
""
;
try
{
Method
getBatchIdMethod
=
vo
.
getClass
().
getMethod
(
"getBatchId"
);
batchId
=
Optional
.
ofNullable
(
getBatchIdMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
orElse
(
""
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"获取批号失败"
+
e
);
}
itemDO
.
setBatchId
(
batchId
);
itemDO
.
setInboundOrderId
(
mainDO
.
getId
());
// 关联主表ID(核心!)
itemDO
.
setSortNo
(
0L
);
itemDO
.
setRemark
(
vo
.
getRemark2
());
// ========== 物料SAPNO校验 ==========
String
sapNo
=
Optional
.
ofNullable
(
vo
.
getSapNo
()).
map
(
String:
:
trim
).
orElse
(
""
);
// 反射获取remark2并设置
String
remark2
=
""
;
try
{
Method
getRemark2Method
=
vo
.
getClass
().
getMethod
(
"getRemark2"
);
remark2
=
Optional
.
ofNullable
(
getRemark2Method
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
orElse
(
""
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"获取明细备注失败"
+
e
);
}
itemDO
.
setRemark
(
remark2
);
// ========== 物料SAPNO校验(反射获取sapNo) ==========
String
sapNo
=
""
;
try
{
Method
getSapNoMethod
=
vo
.
getClass
().
getMethod
(
"getSapNo"
);
sapNo
=
Optional
.
ofNullable
(
getSapNoMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
map
(
String:
:
trim
)
.
orElse
(
""
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"获取物料SAP号失败"
+
e
);
}
if
(
StringUtils
.
isBlank
(
sapNo
))
{
throw
new
ServiceException
(
"物料SAP号为空"
);
}
...
...
@@ -320,18 +394,39 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
itemDO
.
setMaterialId
(
sapAndId
.
get
(
"id"
));
// ========== 仓库/库位查询 ==========
String
warehouseName
=
Optional
.
ofNullable
(
itemDO
.
getWarehouseId
()).
map
(
String:
:
trim
).
orElse
(
""
);
// ========== 仓库/库位查询(反射获取) ==========
// 1. 仓库名称转ID
String
warehouseName
=
""
;
try
{
Method
getWarehouseIdMethod
=
vo
.
getClass
().
getMethod
(
"getWarehouseId"
);
warehouseName
=
Optional
.
ofNullable
(
getWarehouseIdMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
map
(
String:
:
trim
)
.
orElse
(
""
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"获取仓库名称失败"
+
e
);
}
String
warehouseId
=
warehouseNameIdMap
.
get
(
warehouseName
);
if
(
StringUtils
.
isBlank
(
warehouseId
))
{
throw
new
ServiceException
(
"仓库【"
+
warehouseName
+
"】不存在
"
);
log
.
info
(
"仓库【"
+
warehouseName
+
"】不存在,可能为成品入库
"
);
}
itemDO
.
setWarehouseId
(
warehouseId
);
String
locationName
=
Optional
.
ofNullable
(
itemDO
.
getLocationId
()).
map
(
String:
:
trim
).
orElse
(
""
);
// 2. 库位名称转ID
String
locationName
=
""
;
try
{
Method
getLocationIdMethod
=
vo
.
getClass
().
getMethod
(
"getLocationId"
);
locationName
=
Optional
.
ofNullable
(
getLocationIdMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
map
(
String:
:
trim
)
.
orElse
(
""
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
"获取库位名称失败"
+
e
);
}
String
locationId
=
storageLocationNameIdMap
.
get
(
locationName
);
if
(
StringUtils
.
isBlank
(
locationId
))
{
throw
new
ServiceException
(
"库位【"
+
locationName
+
"】不存在
"
);
log
.
info
(
"库位【"
+
locationName
+
"】不存在,可能为成品入库
"
);
}
itemDO
.
setLocationId
(
locationId
);
...
...
@@ -339,9 +434,19 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
catch
(
Exception
e
)
{
// 单个明细失败:仅统计,不影响整单
totalItemFailure
++;
// 反射获取sapNo用于错误提示
String
sapNo
=
""
;
try
{
Method
getSapNoMethod
=
vo
.
getClass
().
getMethod
(
"getSapNo"
);
sapNo
=
Optional
.
ofNullable
(
getSapNoMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
orElse
(
"未知"
);
}
catch
(
Exception
ex
)
{
sapNo
=
"未知"
;
}
failureMsg
.
append
(
String
.
format
(
"入库单号【%s】的物料明细【%s】处理失败:%s;\n"
,
orderId
,
vo
.
getSapNo
()
,
e
.
getMessage
()));
log
.
error
(
"导入明细失败-入库单【{}】-SAP【{}】"
,
orderId
,
vo
.
getSapNo
()
,
e
);
orderId
,
sapNo
,
e
.
getMessage
()));
log
.
error
(
"导入明细失败-入库单【{}】-SAP【{}】"
,
orderId
,
sapNo
,
e
);
}
}
...
...
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/impl/OutboundOrderItemsServiceImpl.java
View file @
e57792fc
...
...
@@ -11,7 +11,7 @@ import com.ruoyi.common.utils.StringUtils;
import
com.ruoyi.common.utils.bean.BeanUtils
;
import
com.ruoyi.inventory.domain.InboundOrderItems
;
import
com.ruoyi.inventory.domain.InboundOrders
;
import
com.ruoyi.inventory.domain.vo.InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.
inboundVO.
InboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.OutboundOrdersSummaryVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
ruoyi-inventory/src/main/resources/mapper/inventory/InboundOrdersMapper.xml
View file @
e57792fc
...
...
@@ -255,8 +255,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join inbound_orders as io
on io.id = ioi.inbound_order_id
and io.order_status = 2
group by m.id, m.material_name
order by total_quantity desc
where m.is_used = 1 and m.is_active = 1
group by m.id
order by total_quantity
</select>
<select
id=
"countInboundMaterialMoney"
resultMap=
"InboundMaterialTotalResultMap"
parameterType=
"String"
>
select m.material_name,
...
...
@@ -267,7 +268,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join inbound_orders as io
on io.id = ioi.inbound_order_id
and io.order_status = 2
group by m.id, m.material_name
order by total_money desc
where m.is_used = 1 and m.is_active = 1
group by m.id
order by total_money
</select>
</mapper>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论