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 个修改的文件
包含
648 行增加
和
480 行删除
+648
-480
ruoyi-admin-vue/src/components/ImportExcel/index.vue
+1
-1
ruoyi-admin-vue/src/views/inventory/inbound/index.vue
+10
-1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/inventory/InboundOrdersController.java
+71
-39
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
+136
-31
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 {
...
@@ -151,7 +151,7 @@ export default {
},
},
/** 下载模板操作 */
/** 下载模板操作 */
importTemplate
()
{
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
)
{
handleFileUploadProgress
(
event
,
file
,
fileList
)
{
...
...
ruoyi-admin-vue/src/views/inventory/inbound/index.vue
View file @
e57792fc
...
@@ -443,7 +443,7 @@
...
@@ -443,7 +443,7 @@
title
=
"导入"
title
=
"导入"
import
-
url
=
"/inventory/inbound/import"
import
-
url
=
"/inventory/inbound/import"
template
-
url
=
"/inventory/inbound/importTemplate"
template
-
url
=
"/inventory/inbound/importTemplate"
template
-
name
=
"入库单导入模板
"
:
template
-
name
=
"getTemplateName()
"
@
success
=
"getList"
@
success
=
"getList"
:
show
-
trdc
-
checkbox
=
"true"
:
show
-
trdc
-
checkbox
=
"true"
@
orderTypeChange
=
"handleOrderTypeChange"
@
orderTypeChange
=
"handleOrderTypeChange"
...
@@ -1051,6 +1051,15 @@ export default {
...
@@ -1051,6 +1051,15 @@ export default {
handleImport() {
handleImport() {
this.$refs.import.show()
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) {
handleItemsSelectionChange(selection) {
this.selectedItems = 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
;
package
com
.
ruoyi
.
web
.
controller
.
inventory
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.List
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
import
com.ruoyi.common.core.domain.entity.Materials
;
import
com.ruoyi.common.utils.uuid.UUID
;
import
com.ruoyi.common.utils.uuid.UUID
;
import
javax.servlet.http.HttpServletResponse
;
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.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.security.access.prepost.PreAuthorize
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
...
@@ -113,10 +112,22 @@ public class InboundOrdersController extends BaseController
...
@@ -113,10 +112,22 @@ public class InboundOrdersController extends BaseController
@PreAuthorize
(
"@ss.hasPermi('inventory:inbound:importTemplate')"
)
@PreAuthorize
(
"@ss.hasPermi('inventory:inbound:importTemplate')"
)
@Log
(
title
=
"入库导入模板"
,
businessType
=
BusinessType
.
IMPORT
)
@Log
(
title
=
"入库导入模板"
,
businessType
=
BusinessType
.
IMPORT
)
@PostMapping
(
"/importTemplate"
)
@PostMapping
(
"/importTemplate"
)
public
void
importTemplate
(
HttpServletResponse
response
)
public
void
importTemplate
(
HttpServletResponse
response
,
@RequestParam
(
"orderType"
)
Integer
orderType
)
{
{
switch
(
orderType
){
case
1
:
ExcelUtil
<
InboundTemplateVO
>
util
=
new
ExcelUtil
<
InboundTemplateVO
>(
InboundTemplateVO
.
class
);
ExcelUtil
<
InboundTemplateVO
>
util
=
new
ExcelUtil
<
InboundTemplateVO
>(
InboundTemplateVO
.
class
);
util
.
importTemplateExcel
(
response
,
"入库单及入库物料明细信息"
);
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
...
@@ -139,46 +150,67 @@ public class InboundOrdersController extends BaseController
if
(!
fileName
.
endsWith
(
".xlsx"
)
&&
!
fileName
.
endsWith
(
".xls"
))
{
if
(!
fileName
.
endsWith
(
".xlsx"
)
&&
!
fileName
.
endsWith
(
".xls"
))
{
return
error
(
"仅支持Excel格式文件(.xlsx/.xls)!"
);
return
error
(
"仅支持Excel格式文件(.xlsx/.xls)!"
);
}
}
// 第二步:校验Excel列名是否匹配模板(核心!拦截非模板数据)
// // 第二步:校验Excel列名是否匹配模板(核心!拦截非模板数据)
List
<
String
>
templateColumns
=
Arrays
.
asList
(
// List<String> templateColumns = Arrays.asList(
"入库日期"
,
// "入库日期",
"SAP No"
,
// "SAP No",
"物料名称"
,
// "物料名称",
"TS Code"
,
// "TS Code",
"货主"
,
// "货主",
"批号"
,
// "批号",
"计划数量"
,
// "计划数量",
"单号"
,
// "单号",
"系统编号"
,
// "系统编号",
"件重"
,
// "件重",
"约数"
,
// "约数",
"实际件数"
,
// "实际件数",
"实发数量"
,
// "实发数量",
"仓库"
,
// "仓库",
"库位"
,
// "库位",
"标签颜色"
,
// "标签颜色",
"凭证号"
,
// "凭证号",
"单价"
,
// "单价",
"备注"
,
// "备注",
"订单类型"
,
// "订单类型",
"收货人"
,
// "收货人",
"物料备注"
// "物料备注"
);
// );
List
<
String
>
excelColumns
=
ExcelUtil
.
getExcelHeader
(
file
.
getInputStream
());
// 自定义方法读取表头
// List<String> excelColumns = ExcelUtil.getExcelHeader(file.getInputStream()); // 自定义方法读取表头
if
(
CollectionUtils
.
isEmpty
(
excelColumns
)
||
!
excelColumns
.
containsAll
(
templateColumns
))
{
// if (CollectionUtils.isEmpty(excelColumns) || !excelColumns.containsAll(templateColumns)) {
return
AjaxResult
.
error
(
"导入文件不是标准模板!请下载官方模板后填写(缺失列:"
// return AjaxResult.error("导入文件不是标准模板!请下载官方模板后填写(缺失列:"
+
getMissingColumns
(
templateColumns
,
excelColumns
)
+
")"
);
// + getMissingColumns(templateColumns, excelColumns) + ")");
}
// }
String
message
=
null
;
String
operName
=
getUsername
();
switch
(
orderType
){
case
1
:
ExcelUtil
<
InboundTemplateVO
>
util
=
new
ExcelUtil
<
InboundTemplateVO
>(
InboundTemplateVO
.
class
);
ExcelUtil
<
InboundTemplateVO
>
util
=
new
ExcelUtil
<
InboundTemplateVO
>(
InboundTemplateVO
.
class
);
List
<
InboundTemplateVO
>
inboundOrders
=
util
.
importExcel
(
file
.
getInputStream
());
List
<
InboundTemplateVO
>
inboundOrders
=
util
.
importExcel
(
file
.
getInputStream
());
// 防护3:拦截空列表,避免 Service 层处理空数据
// 防护3:拦截空列表,避免 Service 层处理空数据
if
(
CollectionUtils
.
isEmpty
(
inboundOrders
))
{
if
(
CollectionUtils
.
isEmpty
(
inboundOrders
))
{
return
error
(
"Excel中未解析到有效数据,请检查模板是否正确!"
);
return
error
(
"Excel中未解析到有效数据,请检查模板是否正确!"
);
}
}
message
=
inboundOrdersService
.
importInboundOrders
(
inboundOrders
,
updateSupport
,
operName
,
orderType
);
String
operName
=
getUsername
();
break
;
String
message
=
inboundOrdersService
.
importInboundOrders
(
inboundOrders
,
updateSupport
,
operName
,
orderType
);
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
);
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;
...
@@ -3,7 +3,7 @@ package com.ruoyi.inventory.controller;
import
java.util.List
;
import
java.util.List
;
import
javax.servlet.http.HttpServletResponse
;
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.OutboundOrdersSummaryVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
org.springframework.security.access.prepost.PreAuthorize
;
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;
...
@@ -6,7 +6,7 @@ import javax.servlet.http.HttpServletResponse;
import
com.alibaba.fastjson2.JSONObject
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.ruoyi.inventory.domain.Inventory
;
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
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.beans.factory.annotation.Autowired
;
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;
...
@@ -2,10 +2,9 @@ package com.ruoyi.inventory.service;
import
java.util.List
;
import
java.util.List
;
import
com.ruoyi.inventory.domain.InboundOrderItems
;
import
com.ruoyi.inventory.domain.InboundOrders
;
import
com.ruoyi.inventory.domain.InboundOrders
;
import
com.ruoyi.inventory.domain.vo.InboundMaterialTotalVO
;
import
com.ruoyi.inventory.domain.vo.InboundMaterialTotalVO
;
import
com.ruoyi.inventory.domain.vo.InboundTemplateVO
;
/**
/**
* 入库单主Service接口
* 入库单主Service接口
...
@@ -69,7 +68,7 @@ public interface IInboundOrdersService
...
@@ -69,7 +68,7 @@ public interface IInboundOrdersService
* @param inboundOrders,isUpdateSupport,operName 入库单数据信息
* @param inboundOrders,isUpdateSupport,operName 入库单数据信息
* @return 结果
* @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;
...
@@ -2,10 +2,7 @@ package com.ruoyi.inventory.service;
import
java.util.List
;
import
java.util.List
;
import
com.ruoyi.inventory.domain.OutboundOrderItems
;
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.OutboundOrdersSummaryVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
org.springframework.transaction.annotation.Transactional
;
/**
/**
* 出库单明细Service接口
* 出库单明细Service接口
...
...
ruoyi-inventory/src/main/java/com/ruoyi/inventory/service/impl/InboundOrdersServiceImpl.java
View file @
e57792fc
package
com
.
ruoyi
.
inventory
.
service
.
impl
;
package
com
.
ruoyi
.
inventory
.
service
.
impl
;
import
java.lang.reflect.Method
;
import
java.time.LocalDate
;
import
java.time.LocalDate
;
import
java.time.format.DateTimeFormatter
;
import
java.time.format.DateTimeFormatter
;
import
java.util.*
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
import
com.ruoyi.common.exception.ServiceException
;
import
com.ruoyi.inventory.domain.*
;
import
com.ruoyi.inventory.domain.*
;
import
com.ruoyi.inventory.domain.vo.InboundMaterialTotalVO
;
import
com.ruoyi.inventory.domain.vo.InboundMaterialTotalVO
;
import
com.ruoyi.inventory.mapper.*
;
import
com.ruoyi.inventory.mapper.*
;
import
org.apache.commons.lang3.SystemUtils
;
import
org.apache.commons.lang3.SystemUtils
;
import
org.springframework.transaction.interceptor.TransactionAspectSupport
;
import
org.springframework.transaction.interceptor.TransactionAspectSupport
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
import
com.ruoyi.common.exception.ServiceException
;
import
com.ruoyi.common.utils.DateUtils
;
import
com.ruoyi.common.utils.DateUtils
;
import
com.ruoyi.common.utils.SecurityUtils
;
import
com.ruoyi.common.utils.SecurityUtils
;
import
com.ruoyi.common.utils.bean.BeanUtils
;
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.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
@@ -174,7 +176,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -174,7 +176,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
*/
*/
@Override
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
@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
)
{
if
(
StringUtils
.
isNull
(
inboundOrdersList
)
||
inboundOrdersList
.
size
()
==
0
)
{
throw
new
ServiceException
(
"导入数据不能为空!"
);
throw
new
ServiceException
(
"导入数据不能为空!"
);
}
}
...
@@ -196,22 +198,53 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -196,22 +198,53 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
Map
<
String
,
String
>
warehouseNameIdMap
=
loadWarehouseNameIdMap
();
Map
<
String
,
String
>
warehouseNameIdMap
=
loadWarehouseNameIdMap
();
// 预加载库位名称-ID映射
// 预加载库位名称-ID映射
Map
<
String
,
String
>
storageLocationNameIdMap
=
loadStorageLocationNameIdMap
();
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
.
orElse
(
Collections
.
emptyList
())
// 空列表兜底,避免NPE
.
stream
()
.
stream
()
.
filter
(
Objects:
:
nonNull
)
// 过滤null的VO对象
.
filter
(
Objects:
:
nonNull
)
// 过滤null的VO对象
.
map
(
vo
->
{
.
map
(
vo
->
{
// 预处理:入库单号去空格,统一格式
// 预处理:入库单号去空格,统一格式(反射调用get/setOrderId)
String
orderId
=
Optional
.
ofNullable
(
vo
.
getOrderId
())
try
{
// 反射获取getOrderId方法
Method
getOrderIdMethod
=
vo
.
getClass
().
getMethod
(
"getOrderId"
);
String
orderId
=
Optional
.
ofNullable
(
getOrderIdMethod
.
invoke
(
vo
))
.
map
(
Object:
:
toString
)
.
map
(
String:
:
trim
)
// 去除首尾空格
.
map
(
String:
:
trim
)
// 去除首尾空格
.
orElse
(
""
);
.
orElse
(
""
);
vo
.
setOrderId
(
orderId
);
// 把处理后的单号回写,保证后续使用一致
// 反射调用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
;
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
(
.
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
.
collectingAndThen
(
Collectors
.
toList
(),
Collectors
.
toList
(),
list
->
Collections
.
unmodifiableList
(
list
)
// 生成不可变列表,防止后续篡改
list
->
Collections
.
unmodifiableList
(
list
)
// 生成不可变列表,防止后续篡改
...
@@ -219,16 +252,17 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -219,16 +252,17 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
));
));
// 兜底:若分组结果为空,返回空的不可变Map(避免后续判空)
// 兜底:若分组结果为空,返回空的不可变Map(避免后续判空)
orderGroupMap
=
Optional
.
ofNullable
(
orderGroupMap
).
orElse
(
Collections
.
emptyMap
());
orderGroupMap
=
Optional
.
ofNullable
(
orderGroupMap
).
orElse
(
Collections
.
emptyMap
());
// 4. 遍历每个入库单分组处理
// 4. 遍历每个入库单分组处理
for
(
Map
.
Entry
<
String
,
List
<
InboundTemplateVO
>>
entry
:
orderGroupMap
.
entrySet
())
{
for
(
Map
.
Entry
<
String
,
List
<
T
>>
entry
:
orderGroupMap
.
entrySet
())
{
String
orderId
=
entry
.
getKey
();
String
orderId
=
entry
.
getKey
();
List
<
InboundTemplateVO
>
voList
=
entry
.
getValue
();
List
<
T
>
voList
=
entry
.
getValue
();
InboundOrders
mainDO
=
null
;
InboundOrders
mainDO
=
null
;
List
<
InboundOrderItems
>
itemDOList
=
new
ArrayList
<>();
List
<
InboundOrderItems
>
itemDOList
=
new
ArrayList
<>();
try
{
try
{
// 4.1 处理主表(每个入库单号只处理一次主表)
// 4.1 处理主表(每个入库单号只处理一次主表)
InboundTemplateVO
firstVO
=
voList
.
get
(
0
);
// 取第一条VO的主表信息
T
firstVO
=
voList
.
get
(
0
);
// 取第一条VO的主表信息
// 检查入库单是否已存在
// 检查入库单是否已存在
InboundOrders
existMain
=
inboundOrdersMapper
.
selectInboundOrdersByOrderId
(
orderId
);
InboundOrders
existMain
=
inboundOrdersMapper
.
selectInboundOrdersByOrderId
(
orderId
);
...
@@ -242,7 +276,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -242,7 +276,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
}
// 支持更新,复用已有主表ID
// 支持更新,复用已有主表ID
mainDO
=
existMain
;
mainDO
=
existMain
;
// 复制VO中的主表字段到已有主表(只更新可修改的字段)
//
反射
复制VO中的主表字段到已有主表(只更新可修改的字段)
BeanUtils
.
copyProperties
(
firstVO
,
mainDO
,
"id"
,
"createBy"
,
"createTime"
);
// 排除不可更新字段
BeanUtils
.
copyProperties
(
firstVO
,
mainDO
,
"id"
,
"createBy"
,
"createTime"
);
// 排除不可更新字段
mainDO
.
setUpdateBy
(
operId
);
mainDO
.
setUpdateBy
(
operId
);
mainDO
.
setUpdateTime
(
now
);
mainDO
.
setUpdateTime
(
now
);
...
@@ -255,7 +289,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -255,7 +289,7 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
else
{
}
else
{
// 新增主表
// 新增主表
mainDO
=
new
InboundOrders
();
mainDO
=
new
InboundOrders
();
// 复制主表字段(只复制主表相关字段,避免物料字段污染)
//
反射
复制主表字段(只复制主表相关字段,避免物料字段污染)
BeanUtils
.
copyProperties
(
firstVO
,
mainDO
,
BeanUtils
.
copyProperties
(
firstVO
,
mainDO
,
"sapNo"
,
"materialName"
,
"plannedQuantity"
,
"actualQuantity"
,
"sapNo"
,
"materialName"
,
"plannedQuantity"
,
"actualQuantity"
,
"plannedPackages"
,
"materialUnit"
,
"materialRemark"
);
// 排除子表字段
"plannedPackages"
,
"materialUnit"
,
"materialRemark"
);
// 排除子表字段
...
@@ -274,9 +308,18 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -274,9 +308,18 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
mainDO
.
setOrderStatus
(
1L
);
// 默认草稿状态
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
owners
=
new
Owners
();
owners
.
setOwnerName
(
mainDO
.
getOwnerId
()
);
owners
.
setOwnerName
(
ownerName
);
List
<
Owners
>
olist
=
ownersMapper
.
selectOwnersList
(
owners
);
List
<
Owners
>
olist
=
ownersMapper
.
selectOwnersList
(
owners
);
if
(
CollectionUtils
.
isEmpty
(
olist
))
{
if
(
CollectionUtils
.
isEmpty
(
olist
))
{
// 抛业务异常,携带具体单号/条件,方便排查
// 抛业务异常,携带具体单号/条件,方便排查
...
@@ -291,11 +334,10 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -291,11 +334,10 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
}
// 4.2 处理子表明细(每条VO对应一条明细)
// 4.2 处理子表明细(每条VO对应一条明细)
for
(
InboundTemplateVO
vo
:
voList
)
{
for
(
T
vo
:
voList
)
{
try
{
try
{
InboundOrderItems
itemDO
=
new
InboundOrderItems
();
InboundOrderItems
itemDO
=
new
InboundOrderItems
();
// 复制子表字段(物料相关)
//
反射
复制子表字段(物料相关)
BeanUtils
.
copyProperties
(
vo
,
itemDO
,
BeanUtils
.
copyProperties
(
vo
,
itemDO
,
"orderId"
,
"systemNo"
,
"orderTypeId"
,
"batchId"
);
// 排除主表字段
"orderId"
,
"systemNo"
,
"orderTypeId"
,
"batchId"
);
// 排除主表字段
// 填充明细必填字段
// 填充明细必填字段
...
@@ -304,13 +346,45 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -304,13 +346,45 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
itemDO
.
setCreateTime
(
now
);
itemDO
.
setCreateTime
(
now
);
itemDO
.
setCreateUserCode
(
operId
);
itemDO
.
setCreateUserCode
(
operId
);
itemDO
.
setOrderId
(
orderId
);
// 关联入库单号
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
.
setInboundOrderId
(
mainDO
.
getId
());
// 关联主表ID(核心!)
itemDO
.
setSortNo
(
0L
);
itemDO
.
setSortNo
(
0L
);
itemDO
.
setRemark
(
vo
.
getRemark2
());
// ========== 物料SAPNO校验 ==========
// 反射获取remark2并设置
String
sapNo
=
Optional
.
ofNullable
(
vo
.
getSapNo
()).
map
(
String:
:
trim
).
orElse
(
""
);
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
))
{
if
(
StringUtils
.
isBlank
(
sapNo
))
{
throw
new
ServiceException
(
"物料SAP号为空"
);
throw
new
ServiceException
(
"物料SAP号为空"
);
}
}
...
@@ -320,18 +394,39 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -320,18 +394,39 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
}
itemDO
.
setMaterialId
(
sapAndId
.
get
(
"id"
));
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
);
String
warehouseId
=
warehouseNameIdMap
.
get
(
warehouseName
);
if
(
StringUtils
.
isBlank
(
warehouseId
))
{
if
(
StringUtils
.
isBlank
(
warehouseId
))
{
throw
new
ServiceException
(
"仓库【"
+
warehouseName
+
"】不存在
"
);
log
.
info
(
"仓库【"
+
warehouseName
+
"】不存在,可能为成品入库
"
);
}
}
itemDO
.
setWarehouseId
(
warehouseId
);
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
);
String
locationId
=
storageLocationNameIdMap
.
get
(
locationName
);
if
(
StringUtils
.
isBlank
(
locationId
))
{
if
(
StringUtils
.
isBlank
(
locationId
))
{
throw
new
ServiceException
(
"库位【"
+
locationName
+
"】不存在
"
);
log
.
info
(
"库位【"
+
locationName
+
"】不存在,可能为成品入库
"
);
}
}
itemDO
.
setLocationId
(
locationId
);
itemDO
.
setLocationId
(
locationId
);
...
@@ -339,9 +434,19 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
...
@@ -339,9 +434,19 @@ public class InboundOrdersServiceImpl implements IInboundOrdersService
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
// 单个明细失败:仅统计,不影响整单
// 单个明细失败:仅统计,不影响整单
totalItemFailure
++;
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"
,
failureMsg
.
append
(
String
.
format
(
"入库单号【%s】的物料明细【%s】处理失败:%s;\n"
,
orderId
,
vo
.
getSapNo
()
,
e
.
getMessage
()));
orderId
,
sapNo
,
e
.
getMessage
()));
log
.
error
(
"导入明细失败-入库单【{}】-SAP【{}】"
,
orderId
,
vo
.
getSapNo
()
,
e
);
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;
...
@@ -11,7 +11,7 @@ import com.ruoyi.common.utils.StringUtils;
import
com.ruoyi.common.utils.bean.BeanUtils
;
import
com.ruoyi.common.utils.bean.BeanUtils
;
import
com.ruoyi.inventory.domain.InboundOrderItems
;
import
com.ruoyi.inventory.domain.InboundOrderItems
;
import
com.ruoyi.inventory.domain.InboundOrders
;
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.OutboundOrdersSummaryVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
com.ruoyi.inventory.domain.vo.OutboundTemplateVO
;
import
org.springframework.beans.factory.annotation.Autowired
;
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"
...
@@ -255,8 +255,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join inbound_orders as io
left join inbound_orders as io
on io.id = ioi.inbound_order_id
on io.id = ioi.inbound_order_id
and io.order_status = 2
and io.order_status = 2
group by m.id, m.material_name
where m.is_used = 1 and m.is_active = 1
order by total_quantity desc
group by m.id
order by total_quantity
</select>
</select>
<select
id=
"countInboundMaterialMoney"
resultMap=
"InboundMaterialTotalResultMap"
parameterType=
"String"
>
<select
id=
"countInboundMaterialMoney"
resultMap=
"InboundMaterialTotalResultMap"
parameterType=
"String"
>
select m.material_name,
select m.material_name,
...
@@ -267,7 +268,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
...
@@ -267,7 +268,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join inbound_orders as io
left join inbound_orders as io
on io.id = ioi.inbound_order_id
on io.id = ioi.inbound_order_id
and io.order_status = 2
and io.order_status = 2
group by m.id, m.material_name
where m.is_used = 1 and m.is_active = 1
order by total_money desc
group by m.id
order by total_money
</select>
</select>
</mapper>
</mapper>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论