Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
W
wms
Project
Project
Details
Activity
Releases
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
wuhao
wms
Commits
dc8eebf1
Commit
dc8eebf1
authored
Jul 12, 2022
by
wuhao
🎯
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
jkuier
parent
a5f936be
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
994 additions
and
96 deletions
+994
-96
routes.js
config/routes.js
+15
-0
index.jsx
src/components/TreeRender/index.jsx
+120
-67
global.less
src/global.less
+13
-0
index.jsx
src/pages/findstore/Storesearch/index.jsx
+63
-20
fields.js
src/pages/historystore/Histore/fields.js
+652
-0
index.jsx
src/pages/historystore/Histore/index.jsx
+108
-0
index.less
src/pages/historystore/Histore/index.less
+10
-0
index.jsx
src/pages/outsetstore/Outstore/index.jsx
+13
-9
No files found.
config/routes.js
View file @
dc8eebf1
...
@@ -78,6 +78,21 @@ export default [
...
@@ -78,6 +78,21 @@ export default [
},
},
],
],
},
},
{
path
:
"/historystore"
,
name
:
"出入库明细"
,
icon
:
"search"
,
routes
:
[
{
path
:
"/historystore/histore"
,
name
:
"出入库明细"
,
component
:
"./historystore/Histore"
,
},
{
component
:
"./404"
,
},
],
},
{
{
path
:
"/system"
,
path
:
"/system"
,
name
:
"系统基础管理"
,
name
:
"系统基础管理"
,
...
...
src/components/TreeRender/index.jsx
View file @
dc8eebf1
import
React
,
{
useState
,
useMemo
,
useRef
,
createContext
}
from
'react'
;
import
React
,
{
useState
,
useMemo
,
useRef
,
createContext
}
from
'react'
;
import
{
Tree
,
Input
,
Popconfirm
,
Tooltip
,
Divider
,
Modal
,
message
}
from
'antd'
;
import
{
Tree
,
Input
,
Popconfirm
,
Tooltip
,
Divider
,
Modal
,
message
}
from
'antd'
;
import
{
MinusSquareOutlined
,
FormOutlined
,
PlusSquareOutlined
}
from
'@ant-design/icons'
;
import
{
MinusSquareOutlined
,
FormOutlined
,
PlusSquareOutlined
,
ArrowDownOutlined
,
ArrowRightOutlined
}
from
'@ant-design/icons'
;
import
getPrem
from
'@/utils/getPrem'
;
import
getPrem
from
'@/utils/getPrem'
;
import
{
useRequest
}
from
'ahooks'
;
import
{
useRequest
}
from
'ahooks'
;
import
{
doFetch
}
from
'@/utils/doFetch'
;
import
{
doFetch
}
from
'@/utils/doFetch'
;
...
@@ -12,17 +12,34 @@ let { Search } = Input,
...
@@ -12,17 +12,34 @@ let { Search } = Input,
function
TreeRender
({
url
,
deleteurl
,
saveurl
,
onselected
})
{
function
TreeRender
({
url
,
deleteurl
,
saveurl
,
onselected
,
params
,
noaction
,
maxWidth
})
{
const
[
search
,
setsearch
]
=
useState
(
""
);
const
[
search
,
setsearch
]
=
useState
(
""
);
const
[
savetitle
,
setsavetitle
]
=
useState
(
null
);
const
[
savetitle
,
setsavetitle
]
=
useState
(
null
);
const
[
modal
,
setModal
]
=
useState
({
const
[
modal
,
setModal
]
=
useState
({
visible
:
false
visible
:
false
});
});
const
[
expandall
,
setexpandall
]
=
useState
(
false
);
const
[
expandedKeys
,
onExpand
]
=
useState
();
const
{
data
,
loading
,
refresh
}
=
useRequest
(()
=>
{
const
{
data
,
loading
,
refresh
}
=
useRequest
(()
=>
{
return
doFetch
({
url
,
params
:
{
title
:
search
}
})
return
doFetch
({
url
,
params
:
params
??
{
title
:
search
}
})
},
{
},
{
refreshDeps
:
[
search
]
refreshDeps
:
[
search
]
});
});
const
allkeys
=
useMemo
(()
=>
{
let
res
=
[];
const
fn
=
(
source
)
=>
{
source
.
map
(
el
=>
{
res
.
push
(
el
)
el
.
children
&&
el
.
children
.
length
>
0
?
fn
(
el
.
children
)
:
""
// 子级递归
})
}
fn
(
data
?.
data
?.
dataList
??
[]);
return
res
.
filter
(
it
=>
it
.
children
).
map
(
it
=>
it
.
key
)
},
[
data
])
const
ref1
=
useRef
(),
ref2
=
useRef
();
const
ref1
=
useRef
(),
ref2
=
useRef
();
const
treeData
=
useMemo
(()
=>
{
const
treeData
=
useMemo
(()
=>
{
let
res
=
data
?.
data
?.
dataList
??
[];
let
res
=
data
?.
data
?.
dataList
??
[];
...
@@ -35,14 +52,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
...
@@ -35,14 +52,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
]
]
},
[
data
]);
},
[
data
]);
const
loop
=
data
=>
data
.
map
(
item
=>
{
const
loop
=
data
=>
data
.
map
(
item
=>
{
const
index
=
item
.
title
.
indexOf
(
search
);
const
index
=
item
.
title
.
indexOf
(
search
);
const
beforeStr
=
item
.
title
.
substr
(
0
,
index
);
const
beforeStr
=
item
.
title
.
substr
(
0
,
index
);
const
afterStr
=
item
.
title
.
substr
(
index
+
search
.
length
);
const
afterStr
=
item
.
title
.
substr
(
index
+
search
.
length
);
cons
t
title
=
le
t
title
=
index
>
-
1
?
(
index
>
-
1
?
(
<
Tooltip
title=
{
item
.
title
}
placement=
"bottom"
>
<
Tooltip
title=
{
item
.
title
}
placement=
"bottom"
>
<
span
style=
{
{
display
:
"inline-block"
,
maxWidth
:
88
,
overflow
:
"hidden"
,
textOverflow
:
"ellipsis"
,
whiteSpace
:
"nowrap"
}
}
>
<
span
style=
{
{
display
:
"inline-block"
,
maxWidth
:
maxWidth
??
88
,
overflow
:
"hidden"
,
textOverflow
:
"ellipsis"
,
whiteSpace
:
"nowrap"
}
}
>
{
beforeStr
}
{
beforeStr
}
<
span
style=
{
{
color
:
'#f50'
}
}
>
{
search
}
</
span
>
<
span
style=
{
{
color
:
'#f50'
}
}
>
{
search
}
</
span
>
{
afterStr
}
{
afterStr
}
...
@@ -50,88 +68,117 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
...
@@ -50,88 +68,117 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
</
Tooltip
>
</
Tooltip
>
)
:
(
)
:
(
<
Tooltip
title=
{
item
.
title
}
placement=
"bottom"
>
<
Tooltip
title=
{
item
.
title
}
placement=
"bottom"
>
<
span
style=
{
{
display
:
"inline-block"
,
maxWidth
:
88
,
overflow
:
"hidden"
,
textOverflow
:
"ellipsis"
,
whiteSpace
:
"nowrap"
}
}
>
{
item
.
title
}
</
span
>
<
span
style=
{
{
display
:
"inline-block"
,
maxWidth
:
maxWidth
??
88
,
overflow
:
"hidden"
,
textOverflow
:
"ellipsis"
,
whiteSpace
:
"nowrap"
}
}
>
{
item
.
title
}
</
span
>
</
Tooltip
>
</
Tooltip
>
);
);
const
actiontitle
=
(
const
actiontitle
=
(
<
div
style=
{
{
display
:
"flex"
,
alignItems
:
"center"
}
}
>
<
div
style=
{
{
display
:
"flex"
,
alignItems
:
"center"
,
justifyContent
:
"space-between"
}
}
>
{
title
}
{
title
}
{
<
div
>
item
.
key
!=
"0"
&&
<
Divider
type=
'vertical'
style=
{
{
margin
:
"0 6px"
}
}
></
Divider
>
{
}
item
.
key
!=
"0"
&&
<
Divider
type=
'vertical'
style=
{
{
margin
:
"0 6px"
}
}
></
Divider
>
{
}
item
.
key
!=
"0"
&&
<
Tooltip
title=
"编辑"
onClick=
{
(
e
)
=>
{
{
e
.
stopPropagation
();
item
.
key
!=
"0"
&&
<
Tooltip
title=
"编辑"
onClick=
{
(
e
)
=>
{
setsavetitle
(
null
)
if
(
getPrem
(
"enElectricityMeterType_save"
,
"ifs"
))
{
setModal
({
visible
:
true
,
closable
:
true
,
title
:
"修改节点名称"
,
okText
:
"修改"
,
cancelText
:
"取消"
,
placeholder
:
item
.
title
,
key
:
item
.
key
})
}
}
}
>
<
FormOutlined
style=
{
{
color
:
"#1890ff"
}
}
/>
</
Tooltip
>
}
<
Divider
type=
'vertical'
style=
{
{
margin
:
"0 6px"
}
}
></
Divider
>
<
Tooltip
title=
"新增"
>
<
PlusSquareOutlined
disabled=
{
!
getPrem
(
"enElectricityMeterType_save"
,
"ifs"
)
}
onClick=
{
(
e
)
=>
{
e
.
stopPropagation
();
e
.
stopPropagation
();
setsavetitle
(
null
)
setsavetitle
(
null
)
if
(
getPrem
(
"enElectricityMeterType_save"
,
"ifs"
))
{
if
(
getPrem
(
"enElectricityMeterType_save"
,
"ifs"
))
{
setModal
({
setModal
({
visible
:
true
,
visible
:
true
,
closable
:
true
,
closable
:
true
,
title
:
"
新增子结构
"
,
title
:
"
修改节点名称
"
,
okText
:
"
新增
"
,
okText
:
"
修改
"
,
cancelText
:
"取消"
,
cancelText
:
"取消"
,
placeholder
:
item
.
title
,
placeholder
:
item
.
title
,
key
:
item
.
key
key
:
item
.
key
})
})
}
}
}
}
}
}
>
style=
{
{
color
:
`${getPrem("enElectricityMeterType_save", "ifs") ? "green" : ""}`
}
}
<
FormOutlined
style=
{
{
color
:
"#1890ff"
}
}
/>
/>
</
Tooltip
>
</
Tooltip
>
{
}
(
!
item
.
children
||
item
.
children
.
length
==
0
)
&&
<
Divider
type=
'vertical'
style=
{
{
margin
:
"0 6px"
}
}
></
Divider
>
<
Divider
type=
'vertical'
style=
{
{
margin
:
"0 6px"
}
}
></
Divider
>
}
<
Tooltip
title=
"新增"
>
{
<
PlusSquareOutlined
(
!
item
.
children
||
item
.
children
.
length
==
0
)
&&
(
item
.
key
!=
"0"
)
&&
disabled=
{
!
getPrem
(
"enElectricityMeterType_save"
,
"ifs"
)
}
<
Popconfirm
onClick=
{
(
e
)
=>
{
placement=
'bottom'
e
.
stopPropagation
();
title=
"是否删除该节点?"
setsavetitle
(
null
)
okText=
"删除"
if
(
getPrem
(
"enElectricityMeterType_save"
,
"ifs"
))
{
cancelText=
"取消"
setModal
({
onConfirm=
{
()
=>
{
visible
:
true
,
doFetch
({
url
:
deleteurl
,
params
:
{
id
:
item
.
key
}
}).
then
(
res
=>
{
closable
:
true
,
if
(
res
.
code
==
'0000'
)
{
title
:
"新增子结构"
,
message
.
success
(
"操作成功"
)
okText
:
"新增"
,
refresh
();
cancelText
:
"取消"
,
placeholder
:
item
.
title
,
key
:
item
.
key
})
}
}
})
}
}
}
}
style=
{
{
color
:
`${getPrem("enElectricityMeterType_save", "ifs") ? "green" : ""}`
}
}
disabled=
{
!
getPrem
(
"enElectricityMeterType_deleteById"
,
"ifs"
)
}
/></
Tooltip
>
>
{
<
Tooltip
title=
"删除"
>
(
!
item
.
children
||
item
.
children
.
length
==
0
)
&&
<
MinusSquareOutlined
onClick=
{
(
e
)
=>
{
e
.
stopPropagation
()
}
}
style=
{
{
color
:
"red"
}
}
/>
<
Divider
type=
'vertical'
style=
{
{
margin
:
"0 6px"
}
}
></
Divider
>
}
{
(
!
item
.
children
||
item
.
children
.
length
==
0
)
&&
(
item
.
key
!=
"0"
)
&&
<
Popconfirm
placement=
'bottom'
title=
"是否删除该节点?"
okText=
"删除"
cancelText=
"取消"
onConfirm=
{
()
=>
{
doFetch
({
url
:
deleteurl
,
params
:
{
id
:
item
.
key
}
}).
then
(
res
=>
{
if
(
res
.
code
==
'0000'
)
{
message
.
success
(
"操作成功"
)
refresh
();
}
})
}
}
disabled=
{
!
getPrem
(
"enElectricityMeterType_deleteById"
,
"ifs"
)
}
>
<
Tooltip
title=
"删除"
>
<
MinusSquareOutlined
onClick=
{
(
e
)
=>
{
e
.
stopPropagation
()
}
}
style=
{
{
color
:
"red"
}
}
/>
</
Tooltip
>
</
Popconfirm
>
}
{
item
.
key
===
""
&&
<
Divider
type=
'vertical'
style=
{
{
margin
:
"0 6px"
}
}
></
Divider
>
}
{
item
.
key
===
""
&&
<
Tooltip
title=
{
expandall
?
"收起"
:
"展开"
}
onClick=
{
(
e
)
=>
{
e
.
stopPropagation
();
setexpandall
(
!
expandall
)
onExpand
(
expandall
?
[]
:
allkeys
)
}
}
>
{
expandall
?
<
ArrowDownOutlined
/>
:
<
ArrowRightOutlined
/>
}
</
Tooltip
>
</
Tooltip
>
</
Popconfirm
>
}
</
div
>
}
</
div
>
</
div
>
)
)
if
(
item
.
key
===
""
)
{
title
=
(
<
div
style=
{
{
display
:
"flex"
,
alignItems
:
"center"
,
justifyContent
:
"space-between"
,
flex
:
1
}
}
>
{
title
}
<
Tooltip
title=
{
expandall
?
"收起"
:
"展开"
}
onClick=
{
(
e
)
=>
{
e
.
stopPropagation
();
setexpandall
(
!
expandall
)
onExpand
(
expandall
?
[]
:
allkeys
)
}
}
>
{
expandall
?
<
ArrowDownOutlined
/>
:
<
ArrowRightOutlined
/>
}
</
Tooltip
>
</
div
>
)
}
// if (item.children) {
// if (item.children) {
// return (
// return (
// <TreeNode key={item.key} title={actiontitle}>
// <TreeNode key={item.key} title={actiontitle}>
...
@@ -141,7 +188,7 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
...
@@ -141,7 +188,7 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
// }
// }
// return <TreeNode key={item.key} title={title} />;
// return <TreeNode key={item.key} title={title} />;
return
(
return
(
<
TreeNode
key=
{
item
.
key
}
title=
{
actiontitle
}
>
<
TreeNode
key=
{
item
.
key
}
title=
{
noaction
?
title
:
actiontitle
}
>
{
item
.
children
&&
loop
(
item
.
children
)
}
{
item
.
children
&&
loop
(
item
.
children
)
}
</
TreeNode
>
</
TreeNode
>
);
);
...
@@ -234,9 +281,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
...
@@ -234,9 +281,15 @@ function TreeRender({ url, deleteurl, saveurl, onselected }) {
<
Tree
<
Tree
onSelect=
{
(
selectedKeys
,
e
)
=>
{
onSelect=
{
(
selectedKeys
,
e
)
=>
{
onselected
?.(
selectedKeys
)
onselected
?.(
selectedKeys
,
e
)
}
}
}
}
autoExpandParent=
{
true
}
autoExpandParent=
{
true
}
defaultExpandAll=
{
true
}
expandedKeys=
{
expandedKeys
}
onExpand=
{
(
expandedKeys
)
=>
{
console
.
log
(
expandedKeys
);
onExpand
(
expandedKeys
)
}
}
>
>
{
loop
(
treeData
?
treeData
:
[])
}
{
loop
(
treeData
?
treeData
:
[])
}
</
Tree
>
</
Tree
>
...
...
src/global.less
View file @
dc8eebf1
...
@@ -321,4 +321,17 @@ table {
...
@@ -321,4 +321,17 @@ table {
}
}
.ant-select-selector{
.ant-select-selector{
overflow: hidden !important;
overflow: hidden !important;
}
.ant-breadcrumb{
span{
>span{
max-width: 600px !important;
}
}
}
.ant-tree .ant-tree-treenode{
width: 100%;
>span:last-child{
flex:1
}
}
}
\ No newline at end of file
src/pages/findstore/Storesearch/index.jsx
View file @
dc8eebf1
...
@@ -6,16 +6,63 @@ import {
...
@@ -6,16 +6,63 @@ import {
import
{
Breadcrumb
,
Layout
,
Menu
,
Input
,
Tooltip
,
Tree
}
from
'antd'
;
import
{
Breadcrumb
,
Layout
,
Menu
,
Input
,
Tooltip
,
Tree
}
from
'antd'
;
import
React
,
{
useState
}
from
'react'
;
import
React
,
{
useState
}
from
'react'
;
import
styles
from
'./index.less'
import
styles
from
'./index.less'
import
TreeRender
from
'@/components/TreeRender'
;
import
AutoTable
from
"@/components/AutoTable"
;
const
{
Header
,
Content
,
Footer
,
Sider
}
=
Layout
,
const
{
Header
,
Content
,
Footer
,
Sider
}
=
Layout
,
{
Search
}
=
Input
{
Search
}
=
Input
const
Storesearch
=
()
=>
{
const
Storesearch
=
(
props
)
=>
{
const
[
collapsed
,
setCollapsed
]
=
useState
(
false
);
const
[
collapsed
,
setCollapsed
]
=
useState
(
false
);
const
[
search
,
setsearch
]
=
useState
();
const
[
search
,
setsearch
]
=
useState
();
const
[
select
,
setselect
]
=
useState
({});
const
[
select
,
setselect
]
=
useState
({});
const
columns
=
[
{
"title"
:
"物料编码"
,
"dataIndex"
:
"materieCode"
,
"key"
:
"materieCode"
},
{
"title"
:
"物料名称"
,
"dataIndex"
:
"materieName"
,
"key"
:
"materieName"
},
{
"title"
:
"物料类型"
,
"dataIndex"
:
"materieTypeName"
,
"key"
:
"materieTypeName"
},
{
"title"
:
"库存数量"
,
"dataIndex"
:
"stockNum"
,
"key"
:
"stockNum"
,
"search"
:
false
},
{
"title"
:
"可用库存"
,
"dataIndex"
:
"usableNum"
,
"key"
:
"usableNum"
,
"search"
:
false
},
{
"title"
:
"库存单位"
,
"dataIndex"
:
"productionUnitName"
,
"key"
:
"productionUnitName"
,
"search"
:
false
}
]
const
tableprops
=
{
...
props
,
pageextra
:
"none"
,
columns
,
path
:
"/ngic-workmanship/wmsMaterieStock/queryStockList"
}
return
(
return
(
<
Layout
<
Layout
style=
{
{
style=
{
{
...
@@ -45,25 +92,15 @@ const Storesearch = () => {
...
@@ -45,25 +92,15 @@ const Storesearch = () => {
/>
/>
)
}
)
}
</
div
>
</
div
>
{
!
collapsed
&&
<
div
style=
{
{
padding
:
12
,
paddingBottom
:
collapsed
?
12
:
0
}
}
>
<
Search
value=
{
search
}
onChange=
{
e
=>
setsearch
(
e
.
target
.
value
)
}
style=
{
{
marginRight
:
10
}
}
></
Search
>
</
div
>
}
{
{
!
collapsed
?
!
collapsed
?
<
div
style=
{
{
padding
:
collapsed
?
0
:
12
}
}
>
<
div
style=
{
{
padding
:
collapsed
?
0
:
12
}
}
>
<
Tree
<
TreeRender
treeData=
{
[
url=
"/ngic-auth/sysStore/queryTreeList"
{
title
:
'全部仓库'
,
key
:
'0'
},
// 菜单项务必填写 key
params=
{
{}
}
{
title
:
'菜单项二'
,
key
:
'item-2'
},
noaction=
{
true
}
{
maxWidth=
{
140
}
title
:
'子菜单'
,
onselected=
{
(
selectedKeys
,
e
)
=>
{
key
:
'submenu'
,
children
:
[{
title
:
'子菜单项'
,
key
:
'submenu-item-1'
}],
},
]
}
onSelect=
{
(
selectedKeys
,
e
)
=>
{
setselect
(
selectedKeys
[
0
]
?
{
setselect
(
selectedKeys
[
0
]
?
{
title
:
e
.
node
.
title
,
title
:
e
.
node
.
title
,
selectedKeys
:
selectedKeys
[
0
]
selectedKeys
:
selectedKeys
[
0
]
...
@@ -71,7 +108,9 @@ const Storesearch = () => {
...
@@ -71,7 +108,9 @@ const Storesearch = () => {
})
})
}
}
}
}
/>
>
</
TreeRender
>
</
div
>
:
</
div
>
:
<
div
onDoubleClick=
{
()
=>
{
<
div
onDoubleClick=
{
()
=>
{
setCollapsed
(
false
)
setCollapsed
(
false
)
...
@@ -97,7 +136,7 @@ const Storesearch = () => {
...
@@ -97,7 +136,7 @@ const Storesearch = () => {
}
}
}
}
>
>
<
Breadcrumb
.
Item
>
物料库存
</
Breadcrumb
.
Item
>
<
Breadcrumb
.
Item
>
物料库存
</
Breadcrumb
.
Item
>
<
Breadcrumb
.
Item
>
{
select
.
title
}
</
Breadcrumb
.
Item
>
<
Breadcrumb
.
Item
style=
{
{
maxWidth
:
600
}
}
>
{
select
.
title
}
</
Breadcrumb
.
Item
>
</
Breadcrumb
>
</
Breadcrumb
>
<
div
<
div
className=
{
styles
.
sitelayoutbackground
}
className=
{
styles
.
sitelayoutbackground
}
...
@@ -107,7 +146,11 @@ const Storesearch = () => {
...
@@ -107,7 +146,11 @@ const Storesearch = () => {
flex
:
1
flex
:
1
}
}
}
}
>
>
Bill is a cat.
<
AutoTable
{
...
tableprops
}
></
AutoTable
>
</
div
>
</
div
>
</
Content
>
</
Content
>
</
Layout
>
</
Layout
>
...
...
src/pages/historystore/Histore/fields.js
0 → 100644
View file @
dc8eebf1
import
{
factorySelect
,
shopSelectByFactory
}
from
"@/services/system"
;
import
{
doFetch
}
from
"@/utils/doFetch"
;
import
{
Table
}
from
"antd"
;
const
one
=
{
"materieInstoreNo"
:
{
"value"
:
null
,
"type"
:
"input"
,
"title"
:
"入库单号"
,
"name"
:
[
"materieInstoreNo"
],
"required"
:
false
},
"storeId"
:
{
"value"
:
null
,
"type"
:
"select"
,
"title"
:
"仓库"
,
"name"
:
[
"storeId"
],
"required"
:
true
,
"options"
:
{
database
:
()
=>
doFetch
({
url
:
"/ngic-auth/sysStore/selectionBox"
,
params
:
{
factoryIdList
:
[]
}
}),
params
:
{}
},
},
"supplierId"
:
{
"value"
:
null
,
"type"
:
"select"
,
"title"
:
"供应商"
,
"name"
:
[
"supplierId"
],
"required"
:
true
,
"options"
:
{
database
:
()
=>
doFetch
({
url
:
"/ngic-auth/sysSupplier/query/selection"
,
params
:
{}
}),
params
:
{}
},
},
"businessNo"
:
{
"value"
:
null
,
"type"
:
"input"
,
"title"
:
"相关单号"
,
"name"
:
[
"businessNo"
],
"required"
:
false
},
"remark"
:
{
"value"
:
null
,
"type"
:
"textarea"
,
"title"
:
"备注"
,
"name"
:
[
"remark"
],
"required"
:
false
,
"col"
:
{
"span"
:
24
}
},
"materialList"
:
{
value
:
[],
title
:
"物料信息"
,
type
:
"table"
,
col
:
{
span
:
24
},
name
:
[
"materialList"
],
required
:
true
,
linkconfig
:
{
urlchangeval
:
{
//根据url接口 改变某个value
database
:
(
params
)
=>
doFetch
({
url
:
"/ngic-workmanship/pmMaterie/queryUnitByMaterieId"
,
params
}),
params
:
{
"materieId"
:
"linked"
},
effectresult
:
{
"productionUnit"
:
"productionUnit"
,
//key 为列表更新值 value为response 返回值
"productionUnitName"
:
"productionUnitName"
}
}
},
columns
:
[
{
"title"
:
<
span
>
物料编码
-
名称
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"materieId"
,
"key"
:
"materieId"
,
"valueType"
:
"select"
,
"width"
:
300
,
"request"
:
async
()
=>
{
let
res
=
await
doFetch
({
url
:
"/ngic-workmanship/pmMaterie/query/selectbox"
,
params
:
{}
})
return
res
?.
data
?.
dataList
},
"fieldProps"
:
{
allowClear
:
false
,
showSearch
:
true
},
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
"批次号/SN号"
,
"dataIndex"
:
"materieControlNo"
,
"key"
:
"materieControlNo"
},
{
"title"
:
<
span
>
入库数量
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"instroeNum"
,
"key"
:
"instroeNum"
,
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
"单位"
,
"dataIndex"
:
"productionUnitName"
,
"key"
:
"productionUnitName"
,
"readonly"
:
'productionUnitName'
,
"width"
:
60
},
{
title
:
"操作"
,
valueType
:
"option"
,
width
:
70
,
render
:
(
text
,
record
,
_
,
action
)
=>
[
<
a
key
=
"delete"
onClick
=
{()
=>
{
}}
>
删除
<
/a>
,
],
},
],
rowKey
:
"id"
,
}
},
two
=
{
"materieInstoreNo"
:
{
"value"
:
null
,
"type"
:
"input"
,
"title"
:
"入库单号"
,
"name"
:
[
"materieInstoreNo"
],
"required"
:
false
},
"storeId"
:
{
"value"
:
null
,
"type"
:
"select"
,
"title"
:
"仓库"
,
"name"
:
[
"storeId"
],
"required"
:
true
,
"options"
:
{
database
:
()
=>
doFetch
({
url
:
"/ngic-auth/sysStore/selectionBox"
,
params
:
{
factoryIdList
:
[]
}
}),
params
:
{}
},
},
"supplierId"
:
{
"value"
:
"2022070124566476657"
,
"type"
:
"select"
,
"title"
:
"供应商"
,
"name"
:
[
"supplierId"
],
"required"
:
true
,
"disabled"
:
true
,
"options"
:
[
{
value
:
"2022070124566476657"
,
label
:
"南高(默认)"
}
],
},
"businessNo"
:
{
"value"
:
null
,
"type"
:
"input"
,
"title"
:
"相关单号"
,
"name"
:
[
"businessNo"
],
"required"
:
false
},
"remark"
:
{
"value"
:
null
,
"type"
:
"textarea"
,
"title"
:
"备注"
,
"name"
:
[
"remark"
],
"required"
:
false
,
"col"
:
{
"span"
:
24
}
},
"materialList"
:
{
value
:
[],
title
:
"物料信息"
,
type
:
"table"
,
col
:
{
span
:
24
},
name
:
[
"materialList"
],
required
:
true
,
linkconfig
:
{
urlchangeval
:
{
//根据url接口 改变某个value
database
:
(
params
)
=>
doFetch
({
url
:
"/ngic-workmanship/pmMaterie/queryUnitByMaterieId"
,
params
}),
params
:
{
"materieId"
:
"linked"
},
effectresult
:
{
"productionUnit"
:
"productionUnit"
,
//key 为列表更新值 value为response 返回值
"productionUnitName"
:
"productionUnitName"
}
}
},
columns
:
[
{
"title"
:
<
span
>
物料编码
-
名称
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"materieId"
,
"key"
:
"materieId"
,
"valueType"
:
"select"
,
"width"
:
300
,
"request"
:
async
()
=>
{
let
res
=
await
doFetch
({
url
:
"/ngic-workmanship/pmMaterie/query/selectbox"
,
params
:
{}
})
return
res
?.
data
?.
dataList
},
"fieldProps"
:
{
allowClear
:
false
,
showSearch
:
true
},
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
"批次号/SN号"
,
"dataIndex"
:
"materieControlNo"
,
"key"
:
"materieControlNo"
},
{
"title"
:
<
span
>
入库数量
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"instroeNum"
,
"key"
:
"instroeNum"
,
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
"单位"
,
"dataIndex"
:
"productionUnitName"
,
"key"
:
"productionUnitName"
,
"readonly"
:
'productionUnitName'
,
"width"
:
60
},
{
title
:
"操作"
,
valueType
:
"option"
,
width
:
70
,
render
:
(
text
,
record
,
_
,
action
)
=>
[
<
a
key
=
"delete"
onClick
=
{()
=>
{
}}
>
删除
<
/a>
,
],
},
],
rowKey
:
"id"
,
}
},
three
=
{
"materieInstoreNo"
:
{
"value"
:
null
,
"type"
:
"input"
,
"title"
:
"入库单号"
,
"name"
:
[
"materieInstoreNo"
],
"required"
:
false
},
"storeId"
:
{
"value"
:
null
,
"type"
:
"select"
,
"title"
:
"仓库"
,
"name"
:
[
"storeId"
],
"required"
:
true
,
"options"
:
{
database
:
()
=>
doFetch
({
url
:
"/ngic-auth/sysStore/selectionBox"
,
params
:
{
factoryIdList
:
[]
}
}),
params
:
{}
},
},
"businessNo"
:
{
"value"
:
null
,
"type"
:
"input"
,
"title"
:
"相关单号"
,
"name"
:
[
"businessNo"
],
"required"
:
false
},
"remark"
:
{
"value"
:
null
,
"type"
:
"textarea"
,
"title"
:
"备注"
,
"name"
:
[
"remark"
],
"required"
:
false
,
"col"
:
{
"span"
:
24
}
},
"materialList"
:
{
value
:
[],
title
:
"物料信息"
,
type
:
"table"
,
col
:
{
span
:
24
},
name
:
[
"materialList"
],
required
:
true
,
linkconfig
:
{
urlchangeval
:
{
//根据url接口 改变某个value
database
:
(
params
)
=>
doFetch
({
url
:
"/ngic-workmanship/pmMaterie/queryUnitByMaterieId"
,
params
}),
params
:
{
"materieId"
:
"linked"
},
effectresult
:
{
"productionUnit"
:
"productionUnit"
,
//key 为列表更新值 value为response 返回值
"productionUnitName"
:
"productionUnitName"
}
}
},
columns
:
[
{
"title"
:
<
span
>
物料编码
-
名称
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"materieId"
,
"key"
:
"materieId"
,
"valueType"
:
"select"
,
"width"
:
300
,
"request"
:
async
()
=>
{
let
res
=
await
doFetch
({
url
:
"/ngic-workmanship/pmMaterie/query/selectbox"
,
params
:
{}
})
return
res
?.
data
?.
dataList
},
"fieldProps"
:
{
allowClear
:
false
,
showSearch
:
true
},
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
<
span
>
供应商编号
-
名称
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"supplierId"
,
"key"
:
"supplierId"
,
"valueType"
:
"select"
,
"width"
:
300
,
"request"
:
async
()
=>
{
let
res
=
await
doFetch
({
url
:
"/ngic-auth/sysSupplier/query/selection/withNo"
,
params
:
{}
})
return
res
?.
data
?.
dataList
},
"fieldProps"
:
{
allowClear
:
false
,
showSearch
:
true
},
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
"批次号/SN号"
,
"dataIndex"
:
"materieControlNo"
,
"key"
:
"materieControlNo"
},
{
"title"
:
<
span
>
入库数量
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"instroeNum"
,
"key"
:
"instroeNum"
,
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
"单位"
,
"dataIndex"
:
"productionUnitName"
,
"key"
:
"productionUnitName"
,
"readonly"
:
'productionUnitName'
,
"width"
:
60
},
{
title
:
"操作"
,
valueType
:
"option"
,
width
:
70
,
render
:
(
text
,
record
,
_
,
action
)
=>
[
<
a
key
=
"delete"
onClick
=
{()
=>
{
}}
>
删除
<
/a>
,
],
},
],
rowKey
:
"id"
,
}
},
four
=
{
"materieInstoreNo"
:
{
"value"
:
null
,
"type"
:
"input"
,
"title"
:
"入库单号"
,
"name"
:
[
"materieInstoreNo"
],
"required"
:
false
},
"storeId"
:
{
"value"
:
null
,
"type"
:
"select"
,
"title"
:
"仓库"
,
"name"
:
[
"storeId"
],
"required"
:
true
,
"options"
:
{
database
:
()
=>
doFetch
({
url
:
"/ngic-auth/sysStore/selectionBox"
,
params
:
{
factoryIdList
:
[]
}
}),
params
:
{}
},
},
"businessNo"
:
{
"value"
:
null
,
"type"
:
"input"
,
"title"
:
"相关单号"
,
"name"
:
[
"businessNo"
],
"required"
:
false
},
"remark"
:
{
"value"
:
null
,
"type"
:
"textarea"
,
"title"
:
"备注"
,
"name"
:
[
"remark"
],
"required"
:
false
,
"col"
:
{
"span"
:
24
}
},
"materialList"
:
{
value
:
[],
title
:
"物料信息"
,
type
:
"table"
,
col
:
{
span
:
24
},
name
:
[
"materialList"
],
required
:
true
,
linkconfig
:
{
urlchangeval
:
{
//根据url接口 改变某个value
database
:
(
params
)
=>
doFetch
({
url
:
"/ngic-workmanship/pmMaterie/queryUnitByMaterieId"
,
params
}),
params
:
{
"materieId"
:
"linked"
},
effectresult
:
{
"productionUnit"
:
"productionUnit"
,
//key 为列表更新值 value为response 返回值
"productionUnitName"
:
"productionUnitName"
}
}
},
columns
:
[
{
"title"
:
<
span
>
物料编码
-
名称
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"materieId"
,
"key"
:
"materieId"
,
"valueType"
:
"select"
,
"width"
:
300
,
"request"
:
async
()
=>
{
let
res
=
await
doFetch
({
url
:
"/ngic-workmanship/pmMaterie/query/selectbox"
,
params
:
{}
})
return
res
?.
data
?.
dataList
},
"fieldProps"
:
{
allowClear
:
false
,
showSearch
:
true
},
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
<
span
>
供应商编号
-
名称
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"supplierId"
,
"key"
:
"supplierId"
,
"valueType"
:
"select"
,
"width"
:
300
,
"request"
:
async
()
=>
{
let
res
=
await
doFetch
({
url
:
"/ngic-auth/sysSupplier/query/selection/withNo"
,
params
:
{}
})
return
res
?.
data
?.
dataList
},
"fieldProps"
:
{
allowClear
:
false
,
showSearch
:
true
},
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
"批次号/SN号"
,
"dataIndex"
:
"materieControlNo"
,
"key"
:
"materieControlNo"
},
{
"title"
:
<
span
>
入库数量
<
b
style
=
{{
color
:
"red"
}}
>*<
/b></
span
>
,
"dataIndex"
:
"instroeNum"
,
"key"
:
"instroeNum"
,
"formItemProps"
:
()
=>
{
return
{
rules
:
[{
required
:
true
,
message
:
'此项为必填项'
}],
};
},
},
{
"title"
:
"单位"
,
"dataIndex"
:
"productionUnitName"
,
"key"
:
"productionUnitName"
,
"readonly"
:
'productionUnitName'
,
"width"
:
60
},
{
title
:
"操作"
,
valueType
:
"option"
,
width
:
70
,
render
:
(
text
,
record
,
_
,
action
)
=>
[
<
a
key
=
"delete"
onClick
=
{()
=>
{
}}
>
删除
<
/a>
,
],
},
],
rowKey
:
"id"
,
}
},
detail
=
{
totalCard
:
[
//物料详情
{
cardTitle
:
"基本信息"
,
itemData
:
[
{
title
:
"入库单号"
,
key
:
"materieInstoreNo"
,
},
{
title
:
"入库类型"
,
key
:
"instoreTypeName"
,
},
{
title
:
"入库仓库"
,
key
:
"storeName"
,
},
{
title
:
"相关单号"
,
key
:
"businessNo"
,
},
{
title
:
"备注"
,
key
:
"remark"
,
},
{
title
:
"创建人"
,
key
:
"createUserName"
,
},
{
title
:
"创建时间"
,
key
:
"createTime"
,
},
],
},
{
cardTitle
:
"物料信息列表"
,
itemData
:
[
{
key
:
"materialList"
,
type
:
"table"
,
col
:
{
span
:
24
},
columns
:
[
{
title
:
"物料名称"
,
dataIndex
:
"materieName"
,
key
:
"materieName"
,
search
:
false
,
},
{
title
:
"物料编码"
,
dataIndex
:
"materieCode"
,
key
:
"materieCode"
,
search
:
false
,
},
{
title
:
"入库数量"
,
dataIndex
:
"instroeNum"
,
key
:
"instroeNum"
,
search
:
false
,
},
{
title
:
"单位"
,
dataIndex
:
"productionUnitName"
,
key
:
"productionUnitName"
,
search
:
false
,
},
],
expandable
:
{
expandedRowRender
:
record
=>
<
Table
style
=
{{
marginLeft
:
48
}}
columns
=
{[
{
title
:
"库位名称"
,
dataIndex
:
"storeName"
,
key
:
"storeName"
,
search
:
false
,
},
{
title
:
"上架数量"
,
dataIndex
:
"instroeNum"
,
key
:
"instroeNum"
,
search
:
false
,
}
]}
dataSource
=
{
record
.
uploadList
}
pagination
=
{
false
}
/>
,
}
},
],
},
]
};
export
default
{
one
,
two
,
three
,
four
,
detail
};
src/pages/historystore/Histore/index.jsx
0 → 100644
View file @
dc8eebf1
import
React
,
{
useEffect
,
useMemo
,
useRef
,
useState
}
from
"react"
;
import
{
Dropdown
,
Menu
,
Button
,
message
,
}
from
"antd"
;
import
AutoTable
from
"@/components/AutoTable"
;
import
defaultFields
from
"./fields"
;
import
{
doFetch
}
from
"@/utils/doFetch"
;
import
DrawInitForm
from
"@/components/DrawInitForm"
;
import
getPrem
from
'@/utils/getPrem'
;
//权限判断fn
function
Instore
(
props
)
{
const
actionRef
=
useRef
(),
ChildRef
=
null
;
const
columns
=
[
{
"title"
:
"操作时间"
,
"dataIndex"
:
"operateTime"
,
"key"
:
"operateTimeList"
,
"valueType"
:
"dateRange"
,
"render"
:
(
_
,
row
)
=>
{
return
(<
div
>
{
row
.
operateTime
}
</
div
>)},
},
{
"title"
:
"操作人"
,
"dataIndex"
:
"operateUserName"
,
"key"
:
"operateUserName"
},
{
"title"
:
"物料编码"
,
"dataIndex"
:
"materieCode"
,
"key"
:
"materieCode"
},
{
"title"
:
"物料名称"
,
"dataIndex"
:
"materieName"
,
"key"
:
"materieName"
},
{
"title"
:
"批次号/SN号"
,
"dataIndex"
:
"materieControlNo"
,
"key"
:
"materieControlNo"
},
{
"title"
:
"当时库存数量"
,
"dataIndex"
:
"currentNum"
,
"key"
:
"currentNum"
,
"search"
:
false
},
{
"title"
:
"操作数量"
,
"dataIndex"
:
"operateNum"
,
"key"
:
"operateNum"
,
"search"
:
false
},
{
"title"
:
"库存单位"
,
"dataIndex"
:
"productionUnitName"
,
"key"
:
"productionUnitName"
,
"search"
:
false
},
{
"title"
:
"操作类型"
,
"dataIndex"
:
"stockTypeName"
,
"key"
:
"stockTypeName"
,
},
{
"title"
:
"仓库名称"
,
"dataIndex"
:
"storeName"
,
"key"
:
"storeName"
},
{
"title"
:
"库位"
,
"dataIndex"
:
"storePositionName"
,
"key"
:
"storePositionName"
},
{
"title"
:
"相关单号"
,
"dataIndex"
:
"relatedNo"
,
"key"
:
"relatedNo"
}
]
const
tableprops
=
{
...
props
,
pageextra
:
"none"
,
columns
,
path
:
"/ngic-workmanship/wmsMaterieStockRecord/queryList"
}
return
(
<
div
>
<
AutoTable
{
...
tableprops
}
actionRef=
{
actionRef
}
onRef=
{
(
node
)
=>
(
ChildRef
=
node
)
}
></
AutoTable
>
</
div
>
);
}
export
default
Instore
;
\ No newline at end of file
src/pages/historystore/Histore/index.less
0 → 100644
View file @
dc8eebf1
.sitelayout {
min-height: calc(100vh - 98px) !important;
.sitelayoutbackground {
background: #fff;
}
}
.title{
margin: 0px;
}
\ No newline at end of file
src/pages/outsetstore/Outstore/index.jsx
View file @
dc8eebf1
...
@@ -19,10 +19,10 @@ const keytoval = {
...
@@ -19,10 +19,10 @@ const keytoval = {
"four"
:
4
"four"
:
4
},
items
=
[
},
items
=
[
{
{
key
:
'one'
,
key
:
'one'
,
label
:
(
label
:
(
<
a
>
<
a
>
采购
出库
生产领料
出库
</
a
>
</
a
>
),
),
},
},
...
@@ -30,7 +30,7 @@ const keytoval = {
...
@@ -30,7 +30,7 @@ const keytoval = {
key
:
'two'
,
key
:
'two'
,
label
:
(
label
:
(
<
a
>
<
a
>
生产
出库
销售
出库
</
a
>
</
a
>
),
),
},
},
...
@@ -38,7 +38,7 @@ const keytoval = {
...
@@ -38,7 +38,7 @@ const keytoval = {
key
:
'three'
,
key
:
'three'
,
label
:
(
label
:
(
<
a
>
<
a
>
退料
出库
报废
出库
</
a
>
</
a
>
),
),
},
},
...
@@ -97,7 +97,7 @@ function Instore(props) {
...
@@ -97,7 +97,7 @@ function Instore(props) {
val
:
"detail"
,
val
:
"detail"
,
title
:
`查看详情`
,
title
:
`查看详情`
,
...
defaultFields
?.
detail
,
...
defaultFields
?.
detail
,
totalPath
:
"/ngic-workmanship/wms
materieOutstore/getIn
StoreInfoById"
,
totalPath
:
"/ngic-workmanship/wms
MaterieOutstore/getOut
StoreInfoById"
,
totalParams
:
{
id
:
record
.
id
}
totalParams
:
{
id
:
record
.
id
}
}))
}))
}
}
}
}
...
@@ -241,7 +241,7 @@ function Instore(props) {
...
@@ -241,7 +241,7 @@ function Instore(props) {
val
:
"detail"
,
val
:
"detail"
,
title
:
`查看详情`
,
title
:
`查看详情`
,
...
defaultFields
?.
detail
,
...
defaultFields
?.
detail
,
totalPath
:
"/ngic-workmanship/wms
materieOutstoreHis/getIn
StoreInfoById"
,
totalPath
:
"/ngic-workmanship/wms
MaterieOutstoreHis/getOut
StoreInfoById"
,
totalParams
:
{
id
:
record
.
id
}
totalParams
:
{
id
:
record
.
id
}
}))
}))
}
}
}
}
...
@@ -255,15 +255,15 @@ function Instore(props) {
...
@@ -255,15 +255,15 @@ function Instore(props) {
"valueType"
:
"select"
,
"valueType"
:
"select"
,
"options"
:
[
"options"
:
[
{
{
"label"
:
"
采购
出库"
,
"label"
:
"
生产领料
出库"
,
"value"
:
"1"
"value"
:
"1"
},
},
{
{
"label"
:
"
生产
出库"
,
"label"
:
"
销售
出库"
,
"value"
:
"2"
"value"
:
"2"
},
},
{
{
"label"
:
"
退料
出库"
,
"label"
:
"
报废
出库"
,
"value"
:
"3"
"value"
:
"3"
},
},
{
{
...
@@ -404,6 +404,10 @@ function Instore(props) {
...
@@ -404,6 +404,10 @@ function Instore(props) {
{
...
drawprops
}
{
...
drawprops
}
submitData=
{
async
(
value
)
=>
{
submitData=
{
async
(
value
)
=>
{
if
(
drawprops
.
val
==
"add"
)
{
if
(
drawprops
.
val
==
"add"
)
{
value
.
materialList
=
value
.
materialList
?.
map
(
it
=>
{
delete
it
.
usableNum
;
return
it
})
//usableNum
let
res
=
await
doFetch
({
url
:
"/ngic-workmanship/wmsMaterieOutstore/saveOutStore"
,
params
:
{
...
value
,
outstoreType
:
drawprops
.
outstoreType
}
})
let
res
=
await
doFetch
({
url
:
"/ngic-workmanship/wmsMaterieOutstore/saveOutStore"
,
params
:
{
...
value
,
outstoreType
:
drawprops
.
outstoreType
}
})
if
(
res
.
code
==
"0000"
)
{
if
(
res
.
code
==
"0000"
)
{
reload
();
reload
();
...
...
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