Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
mes
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ximai
mes
Commits
5221cc34
Commit
5221cc34
authored
Oct 24, 2024
by
温志超
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
09c3e608
f08dc569
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
430 additions
and
206 deletions
+430
-206
messages_th.properties
admin/src/main/resources/i18n/messages_th.properties
+3
-0
SysUserExcelImport.java
...in/java/com/ximai/common/core/dto/SysUserExcelImport.java
+5
-33
IMdItemService.java
...rc/main/java/com/ximai/mes/md/service/IMdItemService.java
+18
-2
MdItemServiceImpl.java
...java/com/ximai/mes/md/service/impl/MdItemServiceImpl.java
+63
-37
ProWorkOrderBom.java
...om/ximai/mes/pro/domain/proWorkOrder/ProWorkOrderBom.java
+21
-3
ProWorkorderServiceImpl.java
...ro/service/impl/proWorkOrder/ProWorkorderServiceImpl.java
+184
-114
IProWorkorderService.java
...ai/mes/pro/service/proWorkOrder/IProWorkorderService.java
+18
-2
ErpService.java
mes/src/main/java/com/ximai/mes/remote/ErpService.java
+13
-0
MdItemErpQuery.java
...rc/main/java/com/ximai/mes/remote/dto/MdItemErpQuery.java
+6
-2
MdItemSyncMarkUpdate.java
...n/java/com/ximai/mes/remote/dto/MdItemSyncMarkUpdate.java
+25
-0
MdItemWarehouseErpDto.java
.../java/com/ximai/mes/remote/dto/MdItemWarehouseErpDto.java
+4
-0
ProWorkorderBomErpDto.java
.../java/com/ximai/mes/remote/dto/ProWorkorderBomErpDto.java
+9
-9
ProWorkorderErpDto.java
...ain/java/com/ximai/mes/remote/dto/ProWorkorderErpDto.java
+1
-1
ProWorkorderErpQuery.java
...n/java/com/ximai/mes/remote/dto/ProWorkorderErpQuery.java
+13
-0
ProWorkorderSyncMarkUpdate.java
.../com/ximai/mes/remote/dto/ProWorkorderSyncMarkUpdate.java
+28
-0
ProWorkOrderBomMapper.xml
...sources/mapper/pro/proWorkOrder/ProWorkOrderBomMapper.xml
+14
-0
SysUserServiceImpl.java
...ava/com/ximai/system/service/impl/SysUserServiceImpl.java
+5
-3
No files found.
admin/src/main/resources/i18n/messages_th.properties
View file @
5221cc34
...
...
@@ -59,6 +59,8 @@ basic.error.data.exist=\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E21\u0E35\u0E2D\u0
basic.error.data.not.exist
=
\u
0E02
\u
0E49
\u
0E2D
\u
0E21
\u
0E39
\u
0E25
\u
0E44
\u
0E21
\u
0E48
\u
0E21
\u
0E35
\u
0E2D
\u
0E22
\u
0E39
\u
0E48!
basic.import.error
=
\u
0E01
\u
0E32
\u
0E23
\u
0E19
\u
0E4D
\u
0E32
\u
0E40
\u
0E02
\u
0E49
\u
0E32
\u
0E25
\u
0E49
\u
0E21
\u
0E40
\u
0E2B
\u
0E25
\u
0E27:{0}
basic.import.error.not.null
=
\u
0E02
\u
0E49
\u
0E2D
\u
0E21
\u
0E39
\u
0E25
\u
0E19
\u
0E4D
\u
0E32
\u
0E40
\u
0E02
\u
0E49
\u
0E32
\u
0E15
\u
0E49
\u
0E2D
\u
0E07
\u
0E44
\u
0E21
\u
0E48
\u
0E27
\u
0E48
\u
0E32
\u
0E07
\u
0E40
\u
0E1B
\u
0E25
\u
0E48
\u
0E32
basic.excel.error.not.null.DictionaryFormat
=
\u
0E01
\u
0E23
\u
0E38
\u
0E13
\u
0E32
\u
0E1B
\u
0E23
\u
0E31
\u
0E1A
\u
0E41
\u
0E15
\u
0E48
\u
0E07
\u
0E04
\u
0E4D
\u
0E32
\u
0E2D
\u
0E18
\u
0E34
\u
0E1A
\u
0E32
\u
0E22
\u
0E1B
\u
0E23
\u
0E30
\u
0E01
\u
0E2D
\u
0E1A
\u
0E02
\u
0E2D
\u
0E07
\u
0E1E
\u
0E08
\u
0E19
\u
0E32
\u
0E19
\u
0E38
\u
0E01
\u
0E23
\u
0E21DictionaryFormat
basic.excel.error.not.null.StaticDataMappingFormat
=
\u
0E01
\u
0E23
\u
0E38
\u
0E13
\u
0E32
\u
0E1B
\u
0E23
\u
0E31
\u
0E1A
\u
0E41
\u
0E15
\u
0E48
\u
0E07
\u
0E01
\u
0E32
\u
0E23
\u
0E41
\u
0E21
\u
0E1B
\u
0E04
\u
0E4D
\u
0E32
\u
0E2D
\u
0E18
\u
0E34
\u
0E1A
\u
0E32
\u
0E22
\u
0E1B
\u
0E23
\u
0E30
\u
0E01
\u
0E2D
\u
0E1AStaticDataMappingFormat
basic.error.data.cannot.delete
=
\u
0E02
\u
0E49
\u
0E2D
\u
0E21
\u
0E39
\u
0E25
\u
0E27
\u
0E31
\u
0E2A
\u
0E14
\u
0E38
\u
0E19
\u
0E35
\u
0E49
\u
0E16
\u
0E39
\u
0E01
\u
0E43
\u
0E0A
\u
0E49
\u
0E41
\u
0E25
\u
0E49
\u
0E27
\u
0E41
\u
0E25
\u
0E30
\u
0E44
\u
0E21
\u
0E48
\u
0E2A
\u
0E32
\u
0E21
\u
0E32
\u
0E23
\u
0E16
\u
0E25
\u
0E1A
\u
0E44
\u
0E14
\u
0E49!
#md.material
md.material.data.limit.can.not.delete
=
\u
0E02
\u
0E49
\u
0E2D
\u
0E21
\u
0E39
\u
0E25
\u
0E27
\u
0E31
\u
0E2A
\u
0E14
\u
0E38
\u
0E19
\u
0E35
\u
0E49
\u
0E16
\u
0E39
\u
0E01
\u
0E43
\u
0E0A
\u
0E49
\u
0E41
\u
0E25
\u
0E49
\u
0E27
\u
0E41
\u
0E25
\u
0E30
\u
0E44
\u
0E21
\u
0E48
\u
0E2A
\u
0E32
\u
0E21
\u
0E32
\u
0E23
\u
0E16
\u
0E25
\u
0E1A
\u
0E44
\u
0E14
\u
0E49!
...
...
@@ -176,6 +178,7 @@ pro.schedule.error.to.selfmade.quantity.black=\u0E01\u0E32\u0E23\u0E41\u0E1B\u0E
pro.schedule.error.not.null.starttime
=
\u
0E40
\u
0E27
\u
0E25
\u
0E32
\u
0E40
\u
0E23
\u
0E34
\u
0E48
\u
0E21
\u
0E15
\u
0E49
\u
0E2D
\u
0E07
\u
0E44
\u
0E21
\u
0E48
\u
0E27
\u
0E48
\u
0E32
\u
0E07
pro.schedule.error.not.null.duration
=
\u
0E23
\u
0E30
\u
0E22
\u
0E30
\u
0E40
\u
0E27
\u
0E25
\u
0E32
\u
0E01
\u
0E32
\u
0E23
\u
0E1C
\u
0E25
\u
0E34
\u
0E15
\u
0E15
\u
0E49
\u
0E2D
\u
0E07
\u
0E21
\u
0E32
\u
0E01
\u
0E01
\u
0E27
\u
0E48
\u
0E320
pro.schedule.limit.min.duration
=
\u
0E23
\u
0E30
\u
0E22
\u
0E30
\u
0E40
\u
0E27
\u
0E25
\u
0E32
\u
0E01
\u
0E32
\u
0E23
\u
0E1C
\u
0E25
\u
0E34
\u
0E15
\u
0E15
\u
0E49
\u
0E2D
\u
0E07
\u
0E21
\u
0E32
\u
0E01
\u
0E01
\u
0E27
\u
0E48
\u
0E320
pro.schedule.error.not.null.vendor
=
\u
0E15
\u
0E31
\u
0E27
\u
0E1B
\u
0E23
\u
0E30
\u
0E21
\u
0E27
\u
0E25
\u
0E1C
\u
0E25
\u
0E20
\u
0E32
\u
0E22
\u
0E19
\u
0E2D
\u
0E01
\u
0E44
\u
0E21
\u
0E48
\u
0E2A
\u
0E32
\u
0E21
\u
0E32
\u
0E23
\u
0E16
\u
0E27
\u
0E48
\u
0E32
\u
0E07
\u
0E44
\u
0E14
\u
0E49
pro.schedule.error.cannot.use.standardtime
=
\u
0E44
\u
0E21
\u
0E48
\u
0E23
\u
0E2D
\u
0E07
\u
0E23
\u
0E31
\u
0E1A
\u
0E2B
\u
0E19
\u
0E48
\u
0E27
\u
0E22
\u
0E07
\u
0E32
\u
0E19
\u
0E0A
\u
0E31
\u
0E48
\u
0E27
\u
0E42
\u
0E21
\u
0E07{0}
pro.schedule.error.cal.error1
=
\u
0E40
\u
0E27
\u
0E25
\u
0E32
\u
0E2A
\u
0E34
\u
0E49
\u
0E19
\u
0E2A
\u
0E38
\u
0E14
\u
0E02
\u
0E2D
\u
0E07
\u
0E1B
\u
0E0F
\u
0E34
\u
0E17
\u
0E34
\u
0E19
\u
0E15
\u
0E49
\u
0E2D
\u
0E07
\u
0E21
\u
0E32
\u
0E01
\u
0E01
\u
0E27
\u
0E48
\u
0E32
\u
0E40
\u
0E27
\u
0E25
\u
0E32
\u
0E40
\u
0E23
\u
0E34
\u
0E48
\u
0E21
\u
0E15
\u
0E49
\u
0E19
pro.schedule.error.not.exist.solution
=
\u
0E15
\u
0E32
\u
0E23
\u
0E32
\u
0E07
\u
0E07
\u
0E32
\u
0E19
\u
0E01
\u
0E32
\u
0E23
\u
0E1C
\u
0E25
\u
0E34
\u
0E15:{0}
\u
0E44
\u
0E21
\u
0E48
\u
0E1E
\u
0E1A
\u
0E23
\u
0E38
\u
0E48
\u
0E19
\u
0E01
\u
0E32
\u
0E23
\u
0E1C
\u
0E25
\u
0E34
\u
0E15
...
...
common/src/main/java/com/ximai/common/core/dto/SysUserExcelImport.java
View file @
5221cc34
...
...
@@ -14,6 +14,8 @@ import com.ximai.common.core.domain.entity.SysDept;
import
com.ximai.common.core.domain.entity.SysRole
;
import
com.ximai.common.utils.excel.I18nField
;
import
com.ximai.common.utils.excel.converter.LocalDateTimeConverter
;
import
com.ximai.common.utils.excel.converter.StaticDataMappingConverter
;
import
com.ximai.common.utils.excel.converter.StaticDataMappingFormat
;
import
com.ximai.common.xss.Xss
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
...
...
@@ -33,14 +35,7 @@ import java.util.Set;
*/
@Data
@ApiModel
(
"用户导入"
)
public
class
SysUserExcelImport
extends
BaseExcelImport
{
/**
* 部门ID
*/
@ExcelProperty
(
"部门编号"
)
@I18nField
(
"user.jcaptcha.error2"
)
private
Long
deptId
;
public
class
SysUserExcelImport
{
/**
* 用户账号
...
...
@@ -55,7 +50,6 @@ public class SysUserExcelImport extends BaseExcelImport {
@ExcelProperty
(
"用户名称"
)
@I18nField
(
"user.nickName"
)
private
String
nickName
;
/**
* 用户邮箱
*/
...
...
@@ -73,32 +67,10 @@ public class SysUserExcelImport extends BaseExcelImport {
/**
* 用户性别
*/
@ExcelProperty
(
"用户性别"
)
@ExcelProperty
(
value
=
"用户性别"
,
converter
=
StaticDataMappingConverter
.
class
)
@StaticDataMappingFormat
(
value
=
{
"1"
,
"2"
},
excelValue
=
{
"男"
,
"女"
})
private
String
sex
;
/**
* 帐号状态(0正常 1停用)
*/
@ExcelProperty
(
"帐号状态"
)
private
String
status
;
/**
* 删除标志(0代表存在 2代表删除)
*/
private
String
delFlag
;
/**
* 最后登录IP
*/
@ExcelProperty
(
"最后登录IP"
)
private
String
loginIp
;
/**
* 最后登录时间
*/
@ExcelProperty
(
value
=
"最后登录时间"
,
converter
=
LocalDateTimeConverter
.
class
)
private
Date
loginDate
;
@ApiModelProperty
(
"国际化语言"
)
private
String
locale
;
}
mes/src/main/java/com/ximai/mes/md/service/IMdItemService.java
View file @
5221cc34
...
...
@@ -7,9 +7,11 @@ import com.ximai.mes.md.domain.MdItem;
import
com.ximai.mes.md.vo.ItemUpdateMesVo
;
import
com.ximai.mes.md.vo.MdItemVo
;
import
com.ximai.mes.md.vo.SapItemVo
;
import
com.ximai.mes.remote.dto.MdItemErpDto
;
import
java.io.InputStream
;
import
java.util.List
;
import
java.util.Map
;
public
interface
IMdItemService
{
...
...
@@ -113,8 +115,22 @@ public interface IMdItemService {
void
syncErpData
();
/**
* 同步新增ERP数据
* 同步ERP数据
* 查询所有ERP同步标识为未同步数据,同步成功后修改为已同步
* 每次更新1000行,直到所有数据同步完成为止
*/
void
syncEditErpData
();
/**
* 同步ERP数据
* 查询所有ERP同步标识为未同步数据,同步成功后修改为已同步
* 每次更新1000行,直到所有数据同步完成为止
*/
void
syncEditErpData
(
MdItemErpDto
itemErpDto
,
Map
<
Long
,
MdItemType
>
itemTypeMap
);
/**
* 初始同步新增ERP数据
*/
void
s
yncAddErpData
();
void
initS
yncAddErpData
();
}
mes/src/main/java/com/ximai/mes/md/service/impl/MdItemServiceImpl.java
View file @
5221cc34
...
...
@@ -100,6 +100,8 @@ public class MdItemServiceImpl implements IMdItemService {
private
ErpService
erpService
;
@Autowired
private
IMdItemWarehouseService
itemWarehouseService
;
@Autowired
private
IMdItemService
mdItemService
;
@Override
...
...
@@ -469,13 +471,11 @@ public class MdItemServiceImpl implements IMdItemService {
@Override
public
void
syncErpData
()
{
//优先更新修改数据
this
.
syncEditErpData
();
//新增创建数据
this
.
syncAddErpData
();
mdItemService
.
syncEditErpData
();
}
@Transactional
public
void
s
yncAddErpData
(){
public
void
initS
yncAddErpData
(){
MdItemErpQuery
itemErpQuery
=
new
MdItemErpQuery
();
//获取最晚创建时间
Date
maxErpCreateTime
=
mdItemMapper
.
maxErpCreateTime
();
...
...
@@ -515,64 +515,90 @@ public class MdItemServiceImpl implements IMdItemService {
});
//存在数据续断抓取,直到所有数据更新完成
if
(
list
.
size
()==
1000
){
this
.
s
yncAddErpData
();
this
.
initS
yncAddErpData
();
}
}
@Transactional
public
void
syncEditErpData
(){
MdItemErpQuery
itemErpQuery
=
new
MdItemErpQuery
();
//获取最晚修改时间
Date
maxErpUpdateTime
=
mdItemMapper
.
maxErpUpdateTime
();
if
(
maxErpUpdateTime
==
null
){
Calendar
curr
=
Calendar
.
getInstance
();
curr
.
set
(
Calendar
.
YEAR
,
2000
);
maxErpUpdateTime
=
curr
.
getTime
();
}
ErpPageParams
.
Sort
sort
=
new
ErpPageParams
.
Sort
(){{
List
<
ErpPageParams
.
Order
>
orders
=
new
ArrayList
<>();
orders
.
add
(
new
ErpPageParams
.
Order
(
"modiDate"
,
"asc"
));
this
.
setOrders
(
orders
);
}};
itemErpQuery
.
setSyncMarkNe
(
"Y"
);
itemErpQuery
.
setSort
(
sort
);
itemErpQuery
.
setGtEqModiDate
(
maxErpUpdateTime
);
itemErpQuery
.
setCurrent
(
1
);
itemErpQuery
.
setPageSize
(
1000
);
//每次抓取1000行
List
<
MdItemErpDto
>
list
=
erpService
.
getItemList
(
itemErpQuery
).
getData
();
Map
<
Long
,
MdItemType
>
itemTypeMap
=
iItemTypeService
.
selectItemTypeList
(
new
MdItemType
()).
stream
().
collect
(
Collectors
.
toMap
(
s
->
s
.
getItemTypeId
(),
s
->
s
));
list
.
forEach
(
s
->{
List
<
MdItem
>
dbList
=
mdItemMapper
.
selectMdItemByCode
(
s
.
getItemCode
());
if
(
dbList
.
size
()==
0
)
{
if
(
"Y"
.
equalsIgnoreCase
(
s
.
getVerifyStatus
()))
{
MdItem
insertTemp
=
BeanUtil
.
toBean
(
s
,
MdItem
.
class
);
this
.
insertMdItem
(
insertTemp
);
}
}
else
{
BeanUtil
.
copyProperties
(
s
,
dbList
.
get
(
0
));
if
(!
"Y"
.
equalsIgnoreCase
(
s
.
getVerifyStatus
())){
dbList
.
get
(
0
).
setEnableFlag
(
"N"
);
mdItemService
.
syncEditErpData
(
s
,
itemTypeMap
);
});
//存在数据续断抓取,直到所有数据更新完成
if
(
list
.
size
()==
1000
){
this
.
syncEditErpData
();
}
}
@Transactional
@Override
public
void
syncEditErpData
(
MdItemErpDto
s
,
Map
<
Long
,
MdItemType
>
itemTypeMap
)
{
List
<
MdItem
>
dbList
=
mdItemMapper
.
selectMdItemByCode
(
s
.
getItemCode
());
if
(
dbList
.
size
()==
0
)
{
if
(
"Y"
.
equalsIgnoreCase
(
s
.
getVerifyStatus
()))
{
MdItem
insertTemp
=
BeanUtil
.
toBean
(
s
,
MdItem
.
class
);
if
(
itemTypeMap
.
containsKey
(
s
.
getItemTypeId
())){
insertTemp
.
setItemTypeName
(
itemTypeMap
.
get
(
s
.
getItemTypeId
()).
getItemTypeName
());
}
this
.
updateMdItem
(
dbList
.
get
(
0
));
this
.
insertMdItem
(
insertTemp
);
}
}
else
{
BeanUtil
.
copyProperties
(
s
,
dbList
.
get
(
0
));
if
(!
"Y"
.
equalsIgnoreCase
(
s
.
getVerifyStatus
())){
dbList
.
get
(
0
).
setEnableFlag
(
"N"
);
}
if
(
itemTypeMap
.
containsKey
(
s
.
getItemTypeId
())){
dbList
.
get
(
0
).
setItemTypeName
(
itemTypeMap
.
get
(
s
.
getItemTypeId
()).
getItemTypeName
());
}
//更新库房明细
List
<
MdItemWarehouseErpDto
>
detailList
=
s
.
getWarehouseList
();
MdItemWarehouse
itemWarehouseQuery
=
new
MdItemWarehouse
();
itemWarehouseQuery
.
setItemCode
(
s
.
getItemCode
());
List
<
MdItemWarehouseDto
>
detailDblist
=
itemWarehouseService
.
selectMdItemWarehouseList
(
itemWarehouseQuery
);
detailList
.
forEach
(
s2
->{
java
.
util
.
Optional
<
MdItemWarehouseDto
>
itemWarehouseDto
=
detailDblist
.
stream
().
filter
(
temp
->
temp
.
getWarehouseCode
().
equals
(
s2
.
getWarehouseCode
())).
findFirst
();
this
.
updateMdItem
(
dbList
.
get
(
0
));
}
//更新库房明细
List
<
MdItemWarehouseErpDto
>
detailList
=
s
.
getWarehouseList
();
MdItemWarehouse
itemWarehouseQuery
=
new
MdItemWarehouse
();
itemWarehouseQuery
.
setItemCode
(
s
.
getItemCode
());
List
<
MdItemWarehouseDto
>
dbDetaillist
=
itemWarehouseService
.
selectMdItemWarehouseList
(
itemWarehouseQuery
);
detailList
.
forEach
(
s2
->{
QueryWrapper
<
MdItem
>
itemQuery
=
new
QueryWrapper
<>();
itemQuery
.
eq
(
"item_code"
,
s2
.
getItemCode
());
List
<
MdItem
>
itemList
=
mdItemService
.
selectListByQw
(
itemQuery
);
if
(
itemList
.
size
()>
0
){
MdItem
dbItem
=
itemList
.
get
(
0
);
java
.
util
.
Optional
<
MdItemWarehouseDto
>
itemWarehouseDto
=
dbDetaillist
.
stream
().
filter
(
temp
->
temp
.
getWarehouseCode
().
equals
(
s2
.
getWarehouseCode
())).
findFirst
();
if
(
itemWarehouseDto
.
isPresent
()){
MdItemWarehouseUpdate
updateDetail
=
BeanUtil
.
toBean
(
itemWarehouseDto
.
get
(),
MdItemWarehouseUpdate
.
class
);
BeanUtil
.
copyProperties
(
s2
,
updateDetail
);
updateDetail
.
setItemId
(
dbItem
.
getItemId
());
itemWarehouseService
.
updateMdItemWarehouse
(
updateDetail
);
}
else
{
MdItemWarehouseCreate
insertDetail
=
BeanUtil
.
toBeanIgnoreError
(
s2
,
MdItemWarehouseCreate
.
class
);
insertDetail
.
setItemId
(
dbItem
.
getItemId
());
itemWarehouseService
.
insertMdItemWarehouse
(
insertDetail
);
}
}
);
}
});
//存在数据续断抓取,直到所有数据更新完成
if
(
list
.
size
()==
1000
){
this
.
syncEditErpData
();
}
//判断删除关联仓库
dbDetaillist
.
forEach
(
s2
->{
if
(
detailList
.
stream
().
noneMatch
(
temp
->
temp
.
getWarehouseCode
().
equals
(
s2
.
getWarehouseCode
()))){
itemWarehouseService
.
deleteMdItemWarehouseByItemWarehouseId
(
s2
.
getItemWarehouseId
());
}
});
//回写ERP标识
MdItemSyncMarkUpdate
syncMarkUpdate
=
new
MdItemSyncMarkUpdate
();
syncMarkUpdate
.
setItemCode
(
s
.
getItemCode
());
ErpResponseResult
<
Object
>
rst
=
erpService
.
materialSyncMark
(
syncMarkUpdate
);
if
(!
rst
.
isSuccess
()){
log
.
error
(
String
.
format
(
"回写物料同步状态失败:%s,%s"
,
s
.
getItemCode
(),
rst
.
getErrorMessage
()));
throw
new
ServiceException
(
rst
.
getErrorMessage
());
}
}
}
mes/src/main/java/com/ximai/mes/pro/domain/proWorkOrder/ProWorkOrderBom.java
View file @
5221cc34
package
com
.
ximai
.
mes
.
pro
.
domain
.
proWorkOrder
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.ximai.common.annotation.Excel
;
import
com.ximai.common.core.domain.BaseEntity
;
import
com.ximai.mes.pro.domain.sap.SAPDtoProWorkOrderBom
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.math.BigDecimal
;
import
java.util.Date
;
/**
* 生产工单BOM对象 pro_work_order_bom
...
...
@@ -42,10 +46,10 @@ public class ProWorkOrderBom extends BaseEntity {
@Excel
(
name
=
"物料ID"
)
private
Long
itemId
;
/**
* 物料
ID
* 物料
编码
*/
@
Excel
(
name
=
"物料编号"
)
private
Lo
ng
itemCode
;
@
ApiModelProperty
(
"物料编号"
)
private
Stri
ng
itemCode
;
/**
* sap的物料编号
...
...
@@ -133,6 +137,20 @@ public class ProWorkOrderBom extends BaseEntity {
@Excel
(
name
=
"是否倒冲"
)
private
String
isBackflush
;
@ApiModelProperty
(
"工序名"
)
private
String
opName
;
@ApiModelProperty
(
"工单单别"
)
private
String
orderSource
;
@ApiModelProperty
(
"erp创建时间"
)
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
erpCreateTime
;
@ApiModelProperty
(
"erp修改时间"
)
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
erpUpdateTime
;
private
String
itemName
;
...
...
mes/src/main/java/com/ximai/mes/pro/service/impl/proWorkOrder/ProWorkorderServiceImpl.java
View file @
5221cc34
...
...
@@ -95,6 +95,10 @@ import static com.ximai.mes.util.BusinessUtil.getTheStandardTime;
public
class
ProWorkorderServiceImpl
implements
IProWorkorderService
{
@Autowired
private
IProWorkorderService
workorderService
;
@Autowired
private
MdItemMapper
mdItemMapper
;
...
...
@@ -819,64 +823,65 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
ExceptionUtil
.
checkTrueThrowException
(
proWorkorder
==
null
,
MessageUtils
.
message
(
"pro.workOrder.error.not.exist"
));
List
<
ProWorkOrderBom
>
proWorkOrderBomList
=
proWorkOrderBomMapper
.
selectBomByWorkorderCode
(
proWorkorder
.
getWorkorderCode
());
List
<
ProWorkOrderProcessVo
>
proWorkOrderProcessList
=
proWorkOrderProcessMapper
.
selectProWorkOrderProcessByWorkOrderId
(
workorderId
);
ProProductionSolutionVo
productionSolution
=
proProductionSolutionService
.
selectProProductionSolutionByProductionSolutionId
(
proWorkorder
.
getProductionSolutionId
());
String
sapItemCode
=
proWorkorder
.
getSapItemCode
();
String
epItemCode
=
proWorkorder
.
getEpItemCode
();
for
(
ProWorkOrderProcessVo
proWorkOrderProcess
:
proWorkOrderProcessList
)
{
Long
workorderProcessId
=
proWorkOrderProcess
.
getWorkorderProcessId
();
// 获取工序明细
List
<
ProWorkOrderProcessItem
>
processItemList
=
proWorkOrderProcessItemMapper
.
selectProWorkOrderProcessItemByWorkorderProcessId
(
workorderProcessId
);
List
<
Long
>
itemList
=
processItemList
.
stream
().
map
(
ProWorkOrderProcessItem:
:
getItemId
).
filter
(
Objects:
:
nonNull
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtil
.
isNotEmpty
(
itemList
))
{
List
<
MdItem
>
mdItems
=
mdItemService
.
selectListByQw
(
new
QueryWrapper
<
MdItem
>().
in
(
"item_id"
,
itemList
));
Map
<
Long
,
MdItem
>
mdItemMap
=
mdItems
.
stream
().
collect
(
Collectors
.
toMap
(
MdItem:
:
getItemId
,
x
->
x
));
List
<
ProWorkOrderProcessItem
>
pItemList
=
processItemList
.
stream
().
map
(
proWorkOrderProcessItem
->
{
ProWorkOrderProcessItem
item
=
proWorkOrderProcessItem
.
deepCopyObj
();
MdItem
mdItem
=
mdItemMap
.
get
(
item
.
getItemId
());
if
(
mdItem
!=
null
)
{
item
.
setItemCode
(
mdItem
.
getItemCode
());
item
.
setItemName
(
mdItem
.
getItemName
());
item
.
setItemTypeName
(
mdItem
.
getItemTypeName
());
item
.
setProcessCode
(
proWorkOrderProcess
.
getProcessCode
());
item
.
setProcessName
(
proWorkOrderProcess
.
getProcessName
());
return
item
;
}
else
{
return
null
;
ProProductionSolutionVo
productionSolution
=
null
;
if
(
proWorkorder
.
getProductionSolutionId
()!=
null
){
productionSolution
=
proProductionSolutionService
.
selectProProductionSolutionByProductionSolutionId
(
proWorkorder
.
getProductionSolutionId
());
for
(
ProWorkOrderProcessVo
proWorkOrderProcess
:
proWorkOrderProcessList
)
{
Long
workorderProcessId
=
proWorkOrderProcess
.
getWorkorderProcessId
();
// 获取工序明细
List
<
ProWorkOrderProcessItem
>
processItemList
=
proWorkOrderProcessItemMapper
.
selectProWorkOrderProcessItemByWorkorderProcessId
(
workorderProcessId
);
List
<
Long
>
itemList
=
processItemList
.
stream
().
map
(
ProWorkOrderProcessItem:
:
getItemId
).
filter
(
Objects:
:
nonNull
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtil
.
isNotEmpty
(
itemList
))
{
List
<
MdItem
>
mdItems
=
mdItemService
.
selectListByQw
(
new
QueryWrapper
<
MdItem
>().
in
(
"item_id"
,
itemList
));
Map
<
Long
,
MdItem
>
mdItemMap
=
mdItems
.
stream
().
collect
(
Collectors
.
toMap
(
MdItem:
:
getItemId
,
x
->
x
));
List
<
ProWorkOrderProcessItem
>
pItemList
=
processItemList
.
stream
().
map
(
proWorkOrderProcessItem
->
{
ProWorkOrderProcessItem
item
=
proWorkOrderProcessItem
.
deepCopyObj
();
MdItem
mdItem
=
mdItemMap
.
get
(
item
.
getItemId
());
if
(
mdItem
!=
null
)
{
item
.
setItemCode
(
mdItem
.
getItemCode
());
item
.
setItemName
(
mdItem
.
getItemName
());
item
.
setItemTypeName
(
mdItem
.
getItemTypeName
());
item
.
setProcessCode
(
proWorkOrderProcess
.
getProcessCode
());
item
.
setProcessName
(
proWorkOrderProcess
.
getProcessName
());
return
item
;
}
else
{
return
null
;
}
}).
filter
(
Objects:
:
nonNull
).
collect
(
Collectors
.
toList
());
proWorkOrderProcess
.
setProcessItemList
(
pItemList
);
}
else
{
proWorkOrderProcess
.
setProcessItemList
(
processItemList
);
}
// 获取质检
List
<
ProWorkOrderProcessQcindex
>
processQcindexList
=
proWorkOrderProcessQcindexMapper
.
selectProWorkOrderProcessQcindexByWorkorderProcessId
(
workorderProcessId
);
proWorkOrderProcess
.
setQcindexList
(
processQcindexList
);
// 获取工装
List
<
ProWorkOrderProcessTool
>
processToolList
=
proWorkOrderProcessToolMapper
.
selectProWorkOrderProcessToolByWorkorderProcessId
(
workorderProcessId
);
proWorkOrderProcess
.
setToolList
(
processToolList
);
if
(
proWorkOrderProcess
.
getWorkorderId
()
!=
null
&&
proWorkOrderProcess
.
getProcessId
()
!=
null
)
{
ProTask
proTask
=
proTaskService
.
selectByArrangeCodeAndProcessId
(
proWorkorder
.
getArrangeCode
(),
proWorkOrderProcess
.
getProcessId
());
if
(
proTask
!=
null
)
{
proWorkOrderProcess
.
setStartTime
(
proTask
.
getScheduleStartDate
());
proWorkOrderProcess
.
setEndTime
(
proTask
.
getScheduleEndDate
());
proWorkOrderProcess
.
setWorkunitCode
(
proTask
.
getWorkunitCode
());
proWorkOrderProcess
.
setWorkunitName
(
proTask
.
getWorkunitName
());
}
}).
filter
(
Objects:
:
nonNull
).
collect
(
Collectors
.
toList
());
proWorkOrderProcess
.
setProcessItemList
(
pItemList
);
}
else
{
proWorkOrderProcess
.
setProcessItemList
(
processItemList
);
}
// 获取质检
List
<
ProWorkOrderProcessQcindex
>
processQcindexList
=
proWorkOrderProcessQcindexMapper
.
selectProWorkOrderProcessQcindexByWorkorderProcessId
(
workorderProcessId
);
proWorkOrderProcess
.
setQcindexList
(
processQcindexList
);
// 获取工装
List
<
ProWorkOrderProcessTool
>
processToolList
=
proWorkOrderProcessToolMapper
.
selectProWorkOrderProcessToolByWorkorderProcessId
(
workorderProcessId
);
proWorkOrderProcess
.
setToolList
(
processToolList
);
if
(
proWorkOrderProcess
.
getWorkorderId
()
!=
null
&&
proWorkOrderProcess
.
getProcessId
()
!=
null
)
{
ProTask
proTask
=
proTaskService
.
selectByArrangeCodeAndProcessId
(
proWorkorder
.
getArrangeCode
(),
proWorkOrderProcess
.
getProcessId
());
if
(
proTask
!=
null
)
{
proWorkOrderProcess
.
setStartTime
(
proTask
.
getScheduleStartDate
());
proWorkOrderProcess
.
setEndTime
(
proTask
.
getScheduleEndDate
());
proWorkOrderProcess
.
setWorkunitCode
(
proTask
.
getWorkunitCode
());
proWorkOrderProcess
.
setWorkunitName
(
proTask
.
getWorkunitName
());
}
}
if
(
Objects
.
nonNull
(
productionSolution
))
{
ProProductionSolutionProcess
qa
=
new
ProProductionSolutionProcess
();
qa
.
setProductionSolutionId
(
productionSolution
.
getProductionSolutionId
());
qa
.
setProcessId
(
proWorkOrderProcess
.
getProcessId
());
qa
.
setWorkstationId
(
proWorkOrderProcess
.
getWorkstationId
());
List
<
ProProductionSolutionProcessVo
>
proProductionSolutionProcessVos
=
proProductionSolutionProcessService
.
selectProProductionSolutionProcessList
(
qa
);
if
(
CollectionUtil
.
isNotEmpty
(
proProductionSolutionProcessVos
))
{
ProProductionSolutionProcessVo
proProductionSolutionProcessVo
=
proProductionSolutionProcessVos
.
get
(
0
);
ProProductionSolutionProcess
proProductionSolutionProcess
=
proProductionSolutionProcessVo
.
deepCopyObj
(
ProProductionSolutionProcess
.
class
);
proWorkOrderProcess
.
setProProductionSolutionProcess
(
proProductionSolutionProcess
);
if
(
Objects
.
nonNull
(
productionSolution
))
{
ProProductionSolutionProcess
qa
=
new
ProProductionSolutionProcess
();
qa
.
setProductionSolutionId
(
productionSolution
.
getProductionSolutionId
());
qa
.
setProcessId
(
proWorkOrderProcess
.
getProcessId
());
qa
.
setWorkstationId
(
proWorkOrderProcess
.
getWorkstationId
());
List
<
ProProductionSolutionProcessVo
>
proProductionSolutionProcessVos
=
proProductionSolutionProcessService
.
selectProProductionSolutionProcessList
(
qa
);
if
(
CollectionUtil
.
isNotEmpty
(
proProductionSolutionProcessVos
))
{
ProProductionSolutionProcessVo
proProductionSolutionProcessVo
=
proProductionSolutionProcessVos
.
get
(
0
);
ProProductionSolutionProcess
proProductionSolutionProcess
=
proProductionSolutionProcessVo
.
deepCopyObj
(
ProProductionSolutionProcess
.
class
);
proWorkOrderProcess
.
setProProductionSolutionProcess
(
proProductionSolutionProcess
);
}
}
}
}
...
...
@@ -897,15 +902,9 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
proWorkorderVo
.
setProProductionSolution
(
solution
);
proWorkorderVo
.
setProductionSolutionCode
(
productionSolution
.
getProductionSolutionCode
());
}
if
(
proWorkorder
.
getWorkorderType
().
equals
(
"product"
))
{
proWorkorderVo
.
setProductCode
(
sapItemCode
);
}
if
(
proWorkorder
.
getWorkorderType
().
equals
(
"prototype"
))
{
proWorkorderVo
.
setProductCode
(
epItemCode
);
}
if
(
proWorkorder
.
getWorkorderType
().
equals
(
"complements"
))
{
proWorkorderVo
.
setProductCode
(
sapItemCode
);
}
proWorkorderVo
.
setBomList
(
proWorkOrderBomList
);
proWorkorderVo
.
setProcessList
(
proWorkOrderProcessList
);
return
proWorkorderVo
;
...
...
@@ -1643,14 +1642,13 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
@Override
public
void
syncErpData
()
{
//优先更新修改数据
this
.
syncEditErpData
();
//新增创建数据
this
.
syncAddErpData
();
//更新修改数据
workorderService
.
syncEditErpData
();
}
@Transactional
public
void
syncAddErpData
(){
@Override
public
void
initSyncAddErpData
(){
ProWorkorderErpQuery
workorderErpQuery
=
new
ProWorkorderErpQuery
();
//获取最晚创建时间
Date
maxErpCreateTime
=
proWorkorderMapper
.
maxErpCreateTime
();
...
...
@@ -1667,22 +1665,44 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
QueryWrapper
<
ProWorkorder
>
workorderQuery
=
new
QueryWrapper
<>();
workorderQuery
.
eq
(
"t1.erp_create_time"
,
maxErpCreateTime
);
List
<
ProWorkorder
>
existList
=
proWorkorderMapper
.
selectListByQw
(
workorderQuery
);
Map
<
String
,
ProWorkorder
>
existMap
=
existList
.
stream
().
collect
(
Collectors
.
toMap
(
s
->
s
.
getOrderSource
()+
s
.
getWorkorderCode
(),
s
->
s
));
Map
<
String
,
ProWorkorder
>
existMap
=
existList
.
stream
().
collect
(
Collectors
.
toMap
(
s
->
s
.
getWorkorderType
()+
s
.
getWorkorderCode
(),
s
->
s
));
workorderErpQuery
.
setSort
(
sort
);
workorderErpQuery
.
setGtEqCreateDate
(
maxErpCreateTime
);
workorderErpQuery
.
setCurrent
(
1
);
workorderErpQuery
.
setPageSize
(
1000
);
//每次抓取1000行
List
<
ProWorkorderErpDto
>
list
=
erpService
.
getWorkorderList
(
workorderErpQuery
).
getData
();
QueryWrapper
<
MdItem
>
itemQuery
=
new
QueryWrapper
<>();
itemQuery
.
in
(
"item_code"
,
list
.
stream
().
map
(
s
->
s
.
getProductCode
()).
collect
(
Collectors
.
toList
()));
Map
<
String
,
MdItem
>
itemMap
=
mdItemService
.
selectListByQw
(
itemQuery
).
stream
().
collect
(
Collectors
.
toMap
(
s
->
s
.
getItemCode
(),
s
->
s
));
itemQuery
.
clear
();
List
<
String
>
codes
=
new
ArrayList
<>();
list
.
forEach
(
s
->{
if
(
"Y"
.
equalsIgnoreCase
(
s
.
getVerifyStatus
())){
if
(
StringUtils
.
isNotEmpty
(
s
.
getWorkorderCode
())
&&
!
existMap
.
containsKey
(
s
.
getOrderSource
()+
s
.
getWorkorderCode
())){
s
.
getWorkorderBomList
().
forEach
(
s2
->{
codes
.
add
(
s2
.
getItemCode
());
});
});
itemQuery
.
in
(
"item_code"
,
codes
);
Map
<
String
,
MdItem
>
bomItemMap
=
mdItemService
.
selectListByQw
(
itemQuery
).
stream
().
collect
(
Collectors
.
toMap
(
s
->
s
.
getItemCode
(),
s
->
s
));
list
.
forEach
(
s
->{
if
(
"Y"
.
equalsIgnoreCase
(
s
.
getVerifyStatus
())
&&
!
s
.
getErpStatus
().
equalsIgnoreCase
(
"Y"
)){
if
(
StringUtils
.
isNotEmpty
(
s
.
getWorkorderCode
())
&&
!
existMap
.
containsKey
(
s
.
getWorkorderType
()+
s
.
getWorkorderCode
())){
ProWorkorder
insertTemp
=
BeanUtil
.
toBean
(
s
,
ProWorkorder
.
class
);
if
(!
itemMap
.
containsKey
(
insertTemp
.
getProductCode
())){
log
.
error
(
String
.
format
(
"未找到工单对应物料基础数据:%s"
,
insertTemp
.
getProductCode
()));
return
;
}
insertTemp
.
setProductId
(
itemMap
.
get
(
insertTemp
.
getProductCode
()).
getItemId
());
this
.
insertProWorkorder
(
insertTemp
);
//保存
库房
明细
//保存
BOM
明细
List
<
ProWorkorderBomErpDto
>
detailList
=
s
.
getWorkorderBomList
();
detailList
.
forEach
(
s2
->{
ProWorkOrderBom
insertDetail
=
BeanUtil
.
toBeanIgnoreError
(
s2
,
ProWorkOrderBom
.
class
);
if
(!
bomItemMap
.
containsKey
(
insertDetail
.
getItemCode
())){
log
.
error
(
String
.
format
(
"未找到工单BOM对应物料基础数据:%s"
,
insertDetail
.
getItemCode
()));
return
;
}
insertDetail
.
setItemId
(
bomItemMap
.
get
(
insertDetail
.
getItemCode
()).
getItemId
());
insertDetail
.
setWorkorderId
(
insertTemp
.
getWorkorderId
());
proWorkOrderBomService
.
insertProWorkOrderBom
(
insertDetail
);
});
...
...
@@ -1691,70 +1711,120 @@ public class ProWorkorderServiceImpl implements IProWorkorderService {
});
//存在数据续断抓取,直到所有数据更新完成
if
(
list
.
size
()==
1000
){
this
.
s
yncAddErpData
();
this
.
initS
yncAddErpData
();
}
}
@Transactional
@Override
public
void
syncEditErpData
(){
ProWorkorderErpQuery
workorderErpQuery
=
new
ProWorkorderErpQuery
();
//获取最晚创建时间
Date
maxErpUpdateTime
=
proWorkorderMapper
.
maxErpUpdateTime
();
if
(
maxErpUpdateTime
==
null
){
Calendar
curr
=
Calendar
.
getInstance
();
curr
.
set
(
Calendar
.
YEAR
,
2000
);
maxErpUpdateTime
=
curr
.
getTime
();
}
ErpPageParams
.
Sort
sort
=
new
ErpPageParams
.
Sort
(){{
List
<
ErpPageParams
.
Order
>
orders
=
new
ArrayList
<>();
orders
.
add
(
new
ErpPageParams
.
Order
(
"createDate"
,
"asc"
));
this
.
setOrders
(
orders
);
}};
workorderErpQuery
.
setSort
(
sort
);
workorderErpQuery
.
set
GtEqModiDate
(
maxErpUpdateTime
);
workorderErpQuery
.
set
NeSyncMark
(
"Y"
);
workorderErpQuery
.
setCurrent
(
1
);
workorderErpQuery
.
setPageSize
(
1000
);
//每次抓取1000行
List
<
ProWorkorderErpDto
>
list
=
erpService
.
getWorkorderList
(
workorderErpQuery
).
getData
();
Set
<
String
>
codes
=
new
HashSet
<>();
list
.
forEach
(
s
->{
QueryWrapper
<
ProWorkorder
>
workorderQuery
=
new
QueryWrapper
<>();
workorderQuery
.
eq
(
"workorder_code"
,
s
.
getWorkorderCode
());
workorderQuery
.
eq
(
"order_source"
,
s
.
getOrderSource
());
List
<
ProWorkorder
>
dbList
=
proWorkorderService
.
selectListByQw
(
workorderQuery
);
Long
workorderId
=
null
;
if
(
dbList
.
size
()==
0
){
if
(
"Y"
.
equalsIgnoreCase
(
s
.
getVerifyStatus
())){
if
(
StringUtils
.
isNotEmpty
(
s
.
getWorkorderCode
())){
ProWorkorder
insertTemp
=
BeanUtil
.
toBean
(
s
,
ProWorkorder
.
class
);
this
.
insertProWorkorder
(
insertTemp
);
workorderId
=
insertTemp
.
getWorkorderId
();
codes
.
add
(
s
.
getProductCode
());
s
.
getWorkorderBomList
().
forEach
(
s2
->{
codes
.
add
(
s2
.
getItemCode
());
});
});
if
(
list
.
size
()==
0
){
return
;
}
QueryWrapper
<
MdItem
>
itemQuery
=
new
QueryWrapper
<>();
itemQuery
.
in
(
"item_code"
,
codes
);
Map
<
String
,
MdItem
>
itemMap
=
mdItemService
.
selectListByQw
(
itemQuery
).
stream
().
collect
(
Collectors
.
toMap
(
s
->
s
.
getItemCode
(),
s
->
s
));
list
.
forEach
(
s
->{
try
{
workorderService
.
syncEditErpData
(
s
,
itemMap
);
}
catch
(
Exception
e
){
log
.
error
(
String
.
format
(
"同步工单失败%s"
,
s
.
getWorkorderCode
()),
e
);
}
});
//存在数据续断抓取,直到所有数据更新完成
if
(
list
.
size
()==
1000
){
this
.
syncEditErpData
();
}
}
@Transactional
@Override
public
void
syncEditErpData
(
ProWorkorderErpDto
s
,
Map
<
String
,
MdItem
>
itemMap
)
{
QueryWrapper
<
ProWorkorder
>
workorderQuery
=
new
QueryWrapper
<>();
workorderQuery
.
eq
(
"workorder_code"
,
s
.
getWorkorderCode
());
workorderQuery
.
eq
(
"workorder_type"
,
s
.
getWorkorderType
());
List
<
ProWorkorder
>
dbList
=
proWorkorderService
.
selectListByQw
(
workorderQuery
);
Long
workorderId
=
null
;
if
(
dbList
.
size
()==
0
){
if
(
"Y"
.
equalsIgnoreCase
(
s
.
getVerifyStatus
())){
if
(
StringUtils
.
isNotEmpty
(
s
.
getWorkorderCode
())){
ProWorkorder
insertTemp
=
BeanUtil
.
toBean
(
s
,
ProWorkorder
.
class
);
if
(
itemMap
.
containsKey
(
s
.
getProductCode
())){
MdItem
mdItem
=
itemMap
.
get
(
s
.
getProductCode
());
insertTemp
.
setProductId
(
mdItem
.
getItemId
());
}
this
.
insertProWorkorder
(
insertTemp
);
workorderId
=
insertTemp
.
getWorkorderId
();
}
}
else
{
BeanUtil
.
copyProperties
(
s
,
dbList
.
get
(
0
));
this
.
updateProWorkorder
(
dbList
.
get
(
0
));
workorderId
=
dbList
.
get
(
0
).
getWorkorderId
();
}
//保存库房明细
List
<
ProWorkorderBomErpDto
>
detailList
=
s
.
getWorkorderBomList
();
ProWorkOrderBom
workOrderBomQuery
=
new
ProWorkOrderBom
();
workOrderBomQuery
.
setWorkorderId
(
workorderId
);
List
<
ProWorkOrderBom
>
dbBomList
=
proWorkOrderBomService
.
selectProWorkOrderBomList
(
workOrderBomQuery
);
detailList
.
forEach
(
s2
->{
java
.
util
.
Optional
<
ProWorkOrderBom
>
workOrderBom
=
dbBomList
.
stream
().
filter
(
temp
->
temp
.
getItemCode
().
equals
(
s2
.
getItemCode
())).
findFirst
();
if
(
workOrderBom
.
isPresent
())
{
ProWorkOrderBom
dbWorkOrderBom
=
workOrderBom
.
get
();
BeanUtil
.
copyProperties
(
s2
,
dbWorkOrderBom
);
proWorkOrderBomService
.
updateProWorkOrderBom
(
dbWorkOrderBom
);
}
else
{
ProWorkOrderBom
insertDetail
=
BeanUtil
.
toBeanIgnoreError
(
s2
,
ProWorkOrderBom
.
class
);
insertDetail
.
setWorkorderId
(
workOrderBomQuery
.
getWorkorderId
());
proWorkOrderBomService
.
insertProWorkOrderBom
(
insertDetail
);
}
else
{
//已存在工单,主表仅更新数量字段,
// 数量增加直接修改,
ProWorkorder
dbWorkorder
=
dbList
.
get
(
0
);
if
(!
dbWorkorder
.
getQuantity
().
equals
(
s
.
getQuantity
())){
if
(
s
.
getQuantity
().
compareTo
(
dbWorkorder
.
getQuantity
())>
0
){
dbWorkorder
.
setQuantity
(
s
.
getQuantity
());
this
.
updateProWorkorder
(
dbWorkorder
);
// 数量减小时,判断减少数量 < 未排产数量时才进行更改
}
else
if
(
dbWorkorder
.
getQuantity
().
subtract
(
s
.
getQuantity
())
.
compareTo
(
dbWorkorder
.
getQuantity
().
subtract
(
dbWorkorder
.
getQuantityScheduled
()))<
0
){
dbWorkorder
.
setQuantity
(
s
.
getQuantity
());
this
.
updateProWorkorder
(
dbWorkorder
);
}
});
//存在数据续断抓取,直到所有数据更新完成
if
(
list
.
size
()==
1000
){
this
.
syncEditErpData
();
}
workorderId
=
dbList
.
get
(
0
).
getWorkorderId
();
}
//保存BOM明细
List
<
ProWorkorderBomErpDto
>
detailList
=
s
.
getWorkorderBomList
();
ProWorkOrderBom
workOrderBomQuery
=
new
ProWorkOrderBom
();
workOrderBomQuery
.
setWorkorderId
(
workorderId
);
List
<
ProWorkOrderBom
>
dbBomList
=
proWorkOrderBomService
.
selectProWorkOrderBomList
(
workOrderBomQuery
);
detailList
.
forEach
(
s2
->{
java
.
util
.
Optional
<
ProWorkOrderBom
>
workOrderBom
=
dbBomList
.
stream
().
filter
(
temp
->
temp
.
getItemCode
().
equals
(
s2
.
getItemCode
())).
findFirst
();
if
(
workOrderBom
.
isPresent
())
{
ProWorkOrderBom
dbWorkOrderBom
=
workOrderBom
.
get
();
BeanUtil
.
copyProperties
(
s2
,
dbWorkOrderBom
);
proWorkOrderBomService
.
updateProWorkOrderBom
(
dbWorkOrderBom
);
}
else
{
ProWorkOrderBom
insertDetail
=
BeanUtil
.
toBeanIgnoreError
(
s2
,
ProWorkOrderBom
.
class
);
insertDetail
.
setWorkorderId
(
workOrderBomQuery
.
getWorkorderId
());
if
(
itemMap
.
containsKey
(
s2
.
getItemCode
())){
MdItem
mdItem
=
itemMap
.
get
(
s2
.
getItemCode
());
insertDetail
.
setItemId
(
mdItem
.
getItemId
());
}
proWorkOrderBomService
.
insertProWorkOrderBom
(
insertDetail
);
}
});
//判断删除关联BOM
dbBomList
.
forEach
(
s2
->{
if
(
detailList
.
stream
().
noneMatch
(
temp
->
temp
.
getItemCode
().
equals
(
s2
.
getItemCode
()))){
proWorkOrderBomService
.
deleteProWorkOrderBomByBomItemId
(
s2
.
getBomItemId
());
}
});
ProWorkorderSyncMarkUpdate
syncMarkUpdate
=
new
ProWorkorderSyncMarkUpdate
();
syncMarkUpdate
.
setWorkorderType
(
s
.
getWorkorderType
());
syncMarkUpdate
.
setWorkorderCode
(
s
.
getWorkorderCode
());
ErpResponseResult
<
Object
>
rst
=
erpService
.
workorderSyncMark
(
syncMarkUpdate
);
if
(!
rst
.
isSuccess
()){
log
.
error
(
String
.
format
(
"回写工单同步状态失败:%s,%s"
,
s
.
getWorkorderCode
(),
rst
.
getErrorMessage
()));
throw
new
ServiceException
(
rst
.
getErrorMessage
());
}
}
}
mes/src/main/java/com/ximai/mes/pro/service/proWorkOrder/IProWorkorderService.java
View file @
5221cc34
...
...
@@ -2,6 +2,7 @@ package com.ximai.mes.pro.service.proWorkOrder;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.ximai.mes.constant.WorkorderStatusEnum
;
import
com.ximai.mes.md.domain.MdItem
;
import
com.ximai.mes.pro.domain.ep.EPDtoProWorkOrder
;
import
com.ximai.mes.pro.domain.proWorkOrder.ProWorkorder
;
import
com.ximai.mes.pro.domain.sap.SAPDtoProWorkOrder
;
...
...
@@ -9,6 +10,7 @@ import com.ximai.mes.pro.domain.vo.ProWorkOrderProcessToolLoseVo;
import
com.ximai.mes.pro.domain.vo.ProWorkorderQuery
;
import
com.ximai.mes.pro.domain.vo.ProWorkorderVo
;
import
com.ximai.mes.pro.domain.vo.proWorkOrder.*
;
import
com.ximai.mes.remote.dto.ProWorkorderErpDto
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.web.multipart.MultipartFile
;
...
...
@@ -187,7 +189,21 @@ public interface IProWorkorderService {
void
syncErpData
();
/**
*
同步新增
ERP数据
*
首次新增同步
ERP数据
*/
void
syncAddErpData
();
void
initSyncAddErpData
();
/**
* 同步修改ERP数据
* 查询所有ERP同步标识为未同步数据,同步成功后修改为已同步
* 每次更新1000行,直到所有数据同步完成为止
*/
void
syncEditErpData
();
/**
* 同步修改ERP数据
* 查询所有ERP同步标识为未同步数据,同步成功后修改为已同步
* 每次更新1000行,直到所有数据同步完成为止
*/
void
syncEditErpData
(
ProWorkorderErpDto
workorderErpDto
,
Map
<
String
,
MdItem
>
itemMap
);
}
mes/src/main/java/com/ximai/mes/remote/ErpService.java
View file @
5221cc34
...
...
@@ -42,4 +42,17 @@ public interface ErpService {
@PostMapping
(
value
=
"/mocta/getMoctaList"
)
ErpResponseResult
<
List
<
ProWorkorderErpDto
>>
getWorkorderList
(
ProWorkorderErpQuery
workorderErpQuery
);
/**
* 工单更新状态标识
*/
@PostMapping
(
value
=
"/mocta/syncMark"
)
ErpResponseResult
<
Object
>
workorderSyncMark
(
ProWorkorderSyncMarkUpdate
syncMarkUpdate
);
/**
* 物料更新状态标识
*/
@PostMapping
(
value
=
"/invmb/syncMark"
)
ErpResponseResult
<
Object
>
materialSyncMark
(
MdItemSyncMarkUpdate
syncMarkUpdate
);
}
mes/src/main/java/com/ximai/mes/remote/dto/MdItemErpQuery.java
View file @
5221cc34
...
...
@@ -25,15 +25,19 @@ public class MdItemErpQuery extends ErpPageParams
@ApiModelProperty
(
"品名"
)
private
String
itemName
;
@JsonProperty
(
"neUdf08"
)
@ApiModelProperty
(
"同步标识状态-不等于"
)
private
String
syncMarkNe
;
@JsonProperty
(
"mb109"
)
@ApiModelProperty
(
"核准状态"
)
private
String
verifyStatus
;
@ApiModelProperty
(
"创建日期"
)
@ApiModelProperty
(
"创建日期
-大于等于
"
)
@JsonFormat
(
pattern
=
"yyyyMMddHHmmssSSS"
)
private
Date
gtEqCreateDate
;
@ApiModelProperty
(
"修改日期"
)
@ApiModelProperty
(
"修改日期
-大于等于
"
)
@JsonFormat
(
pattern
=
"yyyyMMddHHmmssSSS"
)
private
Date
gtEqModiDate
;
}
mes/src/main/java/com/ximai/mes/remote/dto/MdItemSyncMarkUpdate.java
0 → 100644
View file @
5221cc34
package
com
.
ximai
.
mes
.
remote
.
dto
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 物料对象 MdItemErpQuery
*
* @date 2024-10-18
*/
@Data
public
class
MdItemSyncMarkUpdate
{
@ApiModelProperty
(
"品号"
)
@JsonProperty
(
"mb001"
)
private
String
itemCode
;
@ApiModelProperty
(
"MES同步标识"
)
@JsonProperty
(
"udf08"
)
private
String
syncMark
=
"Y"
;
}
mes/src/main/java/com/ximai/mes/remote/dto/MdItemWarehouseErpDto.java
View file @
5221cc34
...
...
@@ -2,6 +2,7 @@ package com.ximai.mes.remote.dto;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
com.fasterxml.jackson.databind.annotation.JsonDeserialize
;
import
com.ximai.mes.config.EmptyStringToLongDeserializer
;
import
com.ximai.mes.config.TrimStringDeserializer
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
...
...
@@ -20,10 +21,12 @@ public class MdItemWarehouseErpDto
@JsonProperty
(
"mc002"
)
@ApiModelProperty
(
"仓库编号"
)
@JsonDeserialize
(
using
=
TrimStringDeserializer
.
class
)
private
String
warehouseCode
;
@JsonProperty
(
"mc001"
)
@ApiModelProperty
(
"物料编号"
)
@JsonDeserialize
(
using
=
TrimStringDeserializer
.
class
)
private
String
itemCode
;
@JsonProperty
(
"mc004"
)
...
...
@@ -32,6 +35,7 @@ public class MdItemWarehouseErpDto
@JsonProperty
(
"mc015"
)
@ApiModelProperty
(
"库位"
)
@JsonDeserialize
(
using
=
TrimStringDeserializer
.
class
)
private
String
location
;
}
mes/src/main/java/com/ximai/mes/remote/dto/ProWorkorderBomErpDto.java
View file @
5221cc34
...
...
@@ -18,20 +18,20 @@ public class ProWorkorderBomErpDto
{
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
"
材料品号
"
)
@JsonProperty
(
"tb00
3
"
)
@ApiModelProperty
(
"
工单单别
"
)
@JsonProperty
(
"tb00
1
"
)
@JsonDeserialize
(
using
=
TrimStringDeserializer
.
class
)
private
String
itemCod
e
;
private
String
orderSourc
e
;
@ApiModelProperty
(
"
材料品名
"
)
@JsonProperty
(
"tb0
1
2"
)
@ApiModelProperty
(
"
工单单号
"
)
@JsonProperty
(
"tb0
0
2"
)
@JsonDeserialize
(
using
=
TrimStringDeserializer
.
class
)
private
String
itemNam
e
;
private
String
workorderCod
e
;
@ApiModelProperty
(
"材料
规格
"
)
@JsonProperty
(
"tb0
1
3"
)
@ApiModelProperty
(
"材料
品号
"
)
@JsonProperty
(
"tb0
0
3"
)
@JsonDeserialize
(
using
=
TrimStringDeserializer
.
class
)
private
String
item
Spc
;
private
String
item
Code
;
@ApiModelProperty
(
"工艺"
)
@JsonProperty
(
"tb006"
)
...
...
mes/src/main/java/com/ximai/mes/remote/dto/ProWorkorderErpDto.java
View file @
5221cc34
...
...
@@ -26,7 +26,7 @@ public class ProWorkorderErpDto
@ApiModelProperty
(
"工单单别"
)
@JsonProperty
(
"ta001"
)
@JsonDeserialize
(
using
=
TrimStringDeserializer
.
class
)
private
String
orderSourc
e
;
private
String
workorderTyp
e
;
@ApiModelProperty
(
"工单单号"
)
@JsonProperty
(
"ta002"
)
...
...
mes/src/main/java/com/ximai/mes/remote/dto/ProWorkorderErpQuery.java
View file @
5221cc34
...
...
@@ -22,6 +22,19 @@ public class ProWorkorderErpQuery extends ErpPageParams
@ApiModelProperty
(
"审核码"
)
@JsonProperty
(
"ta013"
)
private
String
verifyStatus
;
@ApiModelProperty
(
"工单单别"
)
@JsonProperty
(
"ta001"
)
private
String
orderSource
;
@JsonProperty
(
"neUdf07"
)
@ApiModelProperty
(
"同步标识状态-不等于"
)
private
String
neSyncMark
;
@ApiModelProperty
(
"工单单号"
)
@JsonProperty
(
"ta002"
)
private
String
workorderCode
;
@JsonFormat
(
pattern
=
"yyyyMMddHHmmssSSS"
)
@ApiModelProperty
(
"创建日期"
)
private
Date
gtEqCreateDate
;
...
...
mes/src/main/java/com/ximai/mes/remote/dto/ProWorkorderSyncMarkUpdate.java
0 → 100644
View file @
5221cc34
package
com
.
ximai
.
mes
.
remote
.
dto
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 工单对象 ProWorkorderErpQuery
*
* @date 2024-10-18
*/
@Data
public
class
ProWorkorderSyncMarkUpdate
{
@ApiModelProperty
(
"工单单别"
)
@JsonProperty
(
"ta001"
)
private
String
workorderType
;
@ApiModelProperty
(
"工单单号"
)
@JsonProperty
(
"ta002"
)
private
String
workorderCode
;
@ApiModelProperty
(
"同步标识"
)
@JsonProperty
(
"udf07"
)
private
String
syncMark
=
"Y"
;
}
mes/src/main/resources/mapper/pro/proWorkOrder/ProWorkOrderBomMapper.xml
View file @
5221cc34
...
...
@@ -29,6 +29,9 @@
<result
property=
"createBy"
column=
"create_by"
/>
<result
property=
"updateTime"
column=
"update_time"
/>
<result
property=
"updateBy"
column=
"update_by"
/>
<result
property=
"opName"
column=
"op_name"
/>
<result
property=
"erpCreateTime"
column=
"erp_create_time"
/>
<result
property=
"erpUpdateTime"
column=
"erp_update_time"
/>
</resultMap>
<sql
id=
"selectProWorkOrderBomVo"
>
...
...
@@ -104,6 +107,10 @@
<if
test=
"createBy != null"
>
create_by,
</if>
<if
test=
"updateTime != null"
>
update_time,
</if>
<if
test=
"updateBy != null"
>
update_by,
</if>
<if
test=
"opName != null"
>
op_name,
</if>
<if
test=
"orderSource != null"
>
order_source,
</if>
<if
test=
"erpCreateTime !=null"
>
erp_create_time,
</if>
<if
test=
"erpUpdateTime !=null"
>
erp_update_time,
</if>
</trim>
<trim
prefix=
"values ("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"workorderId != null"
>
#{workorderId},
</if>
...
...
@@ -129,6 +136,10 @@
<if
test=
"createBy != null"
>
#{createBy},
</if>
<if
test=
"updateTime != null"
>
#{updateTime},
</if>
<if
test=
"updateBy != null"
>
#{updateBy},
</if>
<if
test=
"opName != null"
>
#{opName},
</if>
<if
test=
"orderSource != null"
>
#{orderSource},
</if>
<if
test=
"erpCreateTime != null"
>
#{erpCreateTime},
</if>
<if
test=
"erpUpdateTime != null"
>
#{erpUpdateTime},
</if>
</trim>
</insert>
...
...
@@ -157,6 +168,9 @@
<if
test=
"createBy != null"
>
create_by = #{createBy},
</if>
<if
test=
"updateTime != null"
>
update_time = #{updateTime},
</if>
<if
test=
"updateBy != null"
>
update_by = #{updateBy},
</if>
<if
test=
"opName != null"
>
op_name = #{opName},
</if>
<if
test=
"orderSource != null"
>
order_source = #{orderSource},
</if>
<if
test=
"erpUpdateTime != null"
>
erp_update_time = #{erpUpdateTime},
</if>
</trim>
where bom_item_id = #{bomItemId}
</update>
...
...
system/src/main/java/com/ximai/system/service/impl/SysUserServiceImpl.java
View file @
5221cc34
...
...
@@ -532,10 +532,10 @@ public class SysUserServiceImpl implements ISysUserService {
@Override
public
void
importUser
(
InputStream
in
,
Boolean
isUpdateSupport
)
{
ExcelReader
.
read
(
in
,
SysUserExcelImport
.
class
,
this
::
importUser
);
ExcelReader
.
read
(
in
,
SysUserExcelImport
.
class
,
this
::
importUser
Impl
,
isUpdateSupport
);
}
private
void
importUser
(
SysUserExcelImport
userExcelIm
port
){
private
void
importUser
Impl
(
SysUserExcelImport
userExcelImport
,
Boolean
isUpdateSup
port
){
SysUser
user
=
BeanUtil
.
copyProperties
(
userExcelImport
,
SysUser
.
class
);
String
password
=
configService
.
selectConfigByKey
(
"sys.user.initPassword"
);
// 验证是否存在这个用户
...
...
@@ -544,9 +544,11 @@ public class SysUserServiceImpl implements ISysUserService {
BeanValidators
.
validateWithException
(
validator
,
user
);
user
.
setPassword
(
SecurityUtils
.
encryptPassword
(
password
));
user
.
setCreateBy
(
SecurityUtils
.
getUsername
());
user
.
setStatus
(
"0"
);
this
.
insertUser
(
user
);
}
else
if
(
userExcelImport
.
getUpdateSupport
()
)
{
}
else
if
(
isUpdateSupport
)
{
BeanValidators
.
validateWithException
(
validator
,
user
);
user
.
setUserId
(
u
.
getUserId
());
user
.
setUpdateBy
(
SecurityUtils
.
getUsername
());
this
.
updateUser
(
user
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment