Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
jinfa-platform
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
黄庭坚
jinfa-platform
Commits
9587e0ca
Commit
9587e0ca
authored
Sep 12, 2020
by
前端-许佳敏
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
采购订单接口对接
parent
16e2254a
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
620 additions
and
79 deletions
+620
-79
linkEnum.ts
src/components/NiceForm/linkages/linkEnum.ts
+1
-1
useRowSelectionTable.ts
src/hooks/useRowSelectionTable.ts
+34
-2
fastModifyPrice.tsx
src/pages/commodity/products/fastModifyPrice.tsx
+1
-1
PositionSetting.tsx
src/pages/repositories/components/PositionSetting.tsx
+13
-2
index.tsx
...ction/purchaseOrder/components/demandModalTable/index.tsx
+2
-2
index.tsx
...tion/purchaseOrder/components/inquiryModalTable/index.tsx
+2
-2
index.tsx
...ction/purchaseOrder/components/memberModalTable/index.tsx
+2
-2
index.tsx
...ction/purchaseOrder/components/payInfoTableCell/index.tsx
+41
-22
index.tsx
...tion/purchaseOrder/components/productModalTable/index.tsx
+39
-5
index.tsx
...ction/purchaseOrder/components/productTableCell/index.tsx
+90
-0
index.ts
...ges/transaction/purchaseOrder/readyAddOrder/apis/index.ts
+1
-1
index.tsx
...ransaction/purchaseOrder/readyAddOrder/constant/index.tsx
+137
-1
detail.tsx
src/pages/transaction/purchaseOrder/readyAddOrder/detail.tsx
+57
-12
index.ts
.../transaction/purchaseOrder/readyAddOrder/effects/index.ts
+56
-4
usePaymentInfo.tsx
...tion/purchaseOrder/readyAddOrder/model/usePaymentInfo.tsx
+69
-11
useProductTable.tsx
...ion/purchaseOrder/readyAddOrder/model/useProductTable.tsx
+58
-0
index.ts
...s/transaction/purchaseOrder/readyAddOrder/schema/index.ts
+14
-10
request.ts
src/utils/request.ts
+3
-1
No files found.
src/components/NiceForm/linkages/linkEnum.ts
View file @
9587e0ca
...
...
@@ -77,7 +77,7 @@ export const useLinkEnumEffect = (childKey, transformFn?, findKey = 'id') => {
}
else
{
if
(
originData
.
length
>
0
)
{
const
result
=
originData
.
find
(
v
=>
v
[
findKey
]
===
state
.
value
)[
childKey
]
||
[]
if
(
state
.
modified
&&
state
.
initialValue
)
{
if
(
state
.
modified
)
{
targetState
.
value
=
undefined
}
targetState
.
originData
=
result
...
...
src/hooks/useRowSelectionTable.ts
View file @
9587e0ca
...
...
@@ -7,7 +7,10 @@ interface useRowSelectionTableCtl {
selectRow
:
any
[],
selectedRowKeys
:
any
[],
setSelectRow
(
rows
:
any
[]),
setSelectedRowKeys
(
rows
:
any
)
setSelectedRowKeys
(
rows
:
any
),
// 新增 追加选项时,需判断是否已经存在
appendSelectRow
(
row
),
appendSelectRowKeys
(
rowKey
)
}
interface
useRowSelectionOptions
{
...
...
@@ -82,5 +85,33 @@ export const useRowSelectionTable = (options: useRowSelectionOptions = {}): [Tab
}
}
return
[
rowSelection
,
{
selectRow
,
setSelectRow
,
selectedRowKeys
,
setSelectedRowKeys
}]
const
appendSelectRow
=
(
row
)
=>
{
if
(
row
[
customKey
])
{
const
newData
=
[...
selectRow
]
const
findIndex
=
newData
.
findIndex
(
v
=>
v
[
customKey
]
===
row
[
customKey
])
if
(
findIndex
!==
-
1
)
{
// 已经存在列表中
newData
.
splice
(
findIndex
,
1
)
}
else
{
newData
.
push
(
row
)
}
setSelectRow
(
newData
)
}
}
const
appendSelectRowKeys
=
(
rowKey
)
=>
{
if
(
rowKey
)
{
const
newData
=
[...
selectedRowKeys
]
const
findIndex
=
newData
.
findIndex
(
v
=>
v
===
rowKey
)
if
(
findIndex
!==
-
1
)
{
// 已经存在列表中
newData
.
splice
(
findIndex
,
1
)
}
else
{
newData
.
push
(
rowKey
)
}
setSelectedRowKeys
(
newData
)
}
}
return
[
rowSelection
,
{
selectRow
,
setSelectRow
,
selectedRowKeys
,
setSelectedRowKeys
,
appendSelectRow
,
appendSelectRowKeys
}]
}
\ No newline at end of file
src/pages/commodity/products/fastModifyPrice.tsx
View file @
9587e0ca
...
...
@@ -179,7 +179,7 @@ const FastModifyPrice: React.FC<{}> = () => {
console
.
log
(
params
,
filterParams
)
return
new
Promise
((
resolve
,
reject
)
=>
{
//@ts-ignore
PublicApi
.
getProductCommodityGetCommodityDetailList
({
...
filterParams
,
...
params
}).
then
(
res
=>
{
PublicApi
.
getProductCommodityGetCommodityDetailList
({
...
filterParams
,
...
params
,
environment
:
1
}).
then
(
res
=>
{
const
{
data
}
=
res
resolve
(
data
)
})
...
...
src/pages/repositories/components/PositionSetting.tsx
View file @
9587e0ca
...
...
@@ -20,6 +20,7 @@ import SearchSelect from '@/components/NiceForm/components/SearchSelect'
import
Search
from
'@/components/NiceForm/components/Search'
import
{
useStateFilterSearchLinkageEffect
}
from
'@/formSchema/effects/useFilterSearch'
import
Submit
from
'@/components/NiceForm/components/Submit'
import
{
SHOP_TYPES
,
MALL_TYPE
}
from
'@/constants'
export
interface
PositionSettingProps
{
addSchemaAction
:
ISchemaFormActions
,
...
...
@@ -33,7 +34,13 @@ const fetchMemberList = async (params) => {
return
res
.
data
}
const
priceTypeMaps
=
{
[
MALL_TYPE
[
0
]]:
[
1
,
2
],
[
MALL_TYPE
[
1
]]:
[
3
],
[
MALL_TYPE
[
2
]]:
[
1
],
[
MALL_TYPE
[
3
]]:
[
1
],
[
MALL_TYPE
[
4
]]:
[
3
]
}
const
PositionSetting
:
React
.
FC
<
PositionSettingProps
>
=
(
props
)
=>
{
const
{
addSchemaAction
,
schema
,
formSubmit
,
onFieldChange
=
()
=>
{}
}
=
props
...
...
@@ -51,9 +58,13 @@ const PositionSetting:React.FC<PositionSettingProps> = (props) => {
useUnitPreview
(
initValue
,
addSchemaAction
)
const
fetchProductList
=
async
(
params
)
=>
{
const
shopType
=
addSchemaAction
.
getFieldValue
(
'shopType'
)
const
res
=
await
PublicApi
.
getProductCommodityCommonGetCommodityDetailList
({
...
params
,
shopType
:
addSchemaAction
.
getFieldValue
(
'shopType'
)
shopType
,
environment
:
1
,
// 根据商城类型手动传输定价类型
priceTypeList
:
priceTypeMaps
[
shopType
]
?
priceTypeMaps
[
shopType
]
:
undefined
})
return
res
.
data
}
...
...
src/pages/transaction/purchaseOrder/components/demandModalTable/index.tsx
View file @
9587e0ca
...
...
@@ -2,12 +2,12 @@ import React, { useEffect } from 'react'
import
ModalTable
,
{
ModalTableProps
}
from
'@/components/ModalTable'
import
{
fetchOrderApi
}
from
'../../readyAddOrder/apis'
import
{
useModalTable
}
from
'../../readyAddOrder/model/useModalTable'
import
{
ISchemaFormActions
}
from
'@formily/antd'
import
{
ISchemaFormActions
,
ISchemaFormAsyncActions
}
from
'@formily/antd'
import
{
inquiryColumns
}
from
'../../readyAddOrder/constant'
export
interface
DemandModalTableProps
extends
ModalTableProps
{
type
?:
'radio'
|
'checkbox'
,
schemaAction
:
ISchemaFormActions
,
schemaAction
:
ISchemaFormActions
|
ISchemaFormAsyncActions
,
currentRef
?:
any
,
confirmModal
?()
}
...
...
src/pages/transaction/purchaseOrder/components/inquiryModalTable/index.tsx
View file @
9587e0ca
...
...
@@ -2,12 +2,12 @@ import React, { useEffect } from 'react'
import
ModalTable
,
{
ModalTableProps
}
from
'@/components/ModalTable'
import
{
fetchOrderApi
}
from
'../../readyAddOrder/apis'
import
{
useModalTable
}
from
'../../readyAddOrder/model/useModalTable'
import
{
ISchemaFormActions
}
from
'@formily/antd'
import
{
ISchemaFormActions
,
ISchemaFormAsyncActions
}
from
'@formily/antd'
import
{
inquiryColumns
}
from
'../../readyAddOrder/constant'
export
interface
InquiryModalTableProps
extends
ModalTableProps
{
type
?:
'radio'
|
'checkbox'
,
schemaAction
:
ISchemaFormActions
,
schemaAction
:
ISchemaFormActions
|
ISchemaFormAsyncActions
,
currentRef
?:
any
,
confirmModal
?()
}
...
...
src/pages/transaction/purchaseOrder/components/memberModalTable/index.tsx
View file @
9587e0ca
...
...
@@ -2,12 +2,12 @@ import React, { useEffect } from 'react'
import
ModalTable
,
{
ModalTableProps
}
from
'@/components/ModalTable'
import
{
fetchOrderApi
}
from
'../../readyAddOrder/apis'
import
{
useModalTable
}
from
'../../readyAddOrder/model/useModalTable'
import
{
ISchemaFormActions
}
from
'@formily/antd'
import
{
ISchemaFormActions
,
ISchemaFormAsyncActions
}
from
'@formily/antd'
import
{
memberColumns
}
from
'../../readyAddOrder/constant'
export
interface
MemberModalTableProps
extends
ModalTableProps
{
type
?:
'radio'
|
'checkbox'
,
schemaAction
:
ISchemaFormActions
,
schemaAction
:
ISchemaFormActions
|
ISchemaFormAsyncActions
,
currentRef
?:
any
,
confirmModal
?()
}
...
...
src/pages/transaction/purchaseOrder/components/payInfoTableCell/index.tsx
View file @
9587e0ca
...
...
@@ -7,7 +7,7 @@ export interface PayInfoCellProps {
children
:
React
.
ReactNode
;
dataIndex
:
string
;
record
:
any
;
handleSave
:
(
record
:
any
)
=>
void
;
handleSave
:
(
record
:
any
)
=>
Promise
<
any
>
;
forceEdit
:
boolean
,
formItem
:
string
,
formItemProps
:
any
...
...
@@ -15,11 +15,20 @@ export interface PayInfoCellProps {
const
EditableContext
=
React
.
createContext
<
any
>
({});
export
const
EditableRow
:
React
.
FC
<
any
>
=
(
{
index
,
...
props
}
)
=>
{
export
const
EditableRow
:
React
.
FC
<
any
>
=
(
props
)
=>
{
const
[
form
]
=
Form
.
useForm
();
const
{
options
=
[]
}
=
props
?.
children
[
5
]?.
props
.
additionalProps
.
formItemProps
||
{}
const
[
childOptions
,
setChildOptions
]
=
useState
<
any
[]
>
([])
const
ctx
=
{
form
,
childOptions
,
setChildOptions
,
originOptions
:
options
}
return
(
<
Form
form=
{
form
}
component=
{
false
}
>
<
EditableContext
.
Provider
value=
{
form
}
>
<
EditableContext
.
Provider
value=
{
ctx
}
>
<
tr
{
...
props
}
/>
</
EditableContext
.
Provider
>
</
Form
>
...
...
@@ -40,25 +49,13 @@ export const PayInfoCell:React.FC<PayInfoCellProps> = ({
formItemProps
=
{},
...
restProps
})
=>
{
const
[
editing
,
setEditing
]
=
useState
(
false
);
const
formItemRef
=
useRef
<
any
>
();
const
form
=
useContext
(
EditableContext
);
useEffect
(()
=>
{
if
(
editing
)
{
formItemRef
.
current
.
focus
();
}
},
[
editing
]);
const
toggleEdit
=
()
=>
{
setEditing
(
!
editing
);
form
.
setFieldsValue
({
[
dataIndex
]:
record
[
dataIndex
]
});
};
const
{
form
,
childOptions
,
setChildOptions
,
originOptions
}
=
useContext
(
EditableContext
);
const
save
=
async
e
=>
{
try
{
const
values
=
await
form
.
validateFields
();
toggleEdit
();
console
.
log
(
values
)
handleSave
({
...
record
,
...
values
});
}
catch
(
errInfo
)
{
console
.
log
(
'Save failed:'
,
errInfo
);
...
...
@@ -71,7 +68,31 @@ export const PayInfoCell:React.FC<PayInfoCellProps> = ({
return
<
Input
ref=
{
formItemRef
}
onPressEnter=
{
save
}
onBlur=
{
save
}
{
...
formItemProps
}
/>
}
case
'select'
:
{
return
<
Select
ref=
{
formItemRef
}
onChange=
{
save
}
{
...
formItemProps
}
/>
const
{
options
,
...
rest
}
=
formItemProps
// 支付方式
if
(
dataIndex
===
'payWay'
)
{
return
<
Select
ref=
{
formItemRef
}
options=
{
originOptions
.
map
(
v
=>
({
label
:
v
.
payVal
,
value
:
v
.
payType
}))
}
onChange=
{
e
=>
{
const
result
=
originOptions
.
find
(
v
=>
e
===
v
.
payType
)
setChildOptions
(
result
.
payList
.
map
(
v
=>
({
label
:
v
.
way
,
value
:
v
.
id
})))
save
(
e
)
}
}
{
...
rest
}
/>
}
// 需联动的内容
if
(
dataIndex
===
'channel'
)
{
return
<
Select
ref=
{
formItemRef
}
onChange=
{
save
}
options=
{
childOptions
}
{
...
rest
}
/>
}
}
}
}
...
...
@@ -79,7 +100,7 @@ export const PayInfoCell:React.FC<PayInfoCellProps> = ({
let
childNode
=
children
;
if
(
editable
)
{
childNode
=
(
forceEdit
||
editing
)
?
(
childNode
=
(
forceEdit
)
?
(
<
Form
.
Item
style=
{
{
margin
:
0
}
}
name=
{
dataIndex
}
...
...
@@ -93,9 +114,7 @@ export const PayInfoCell:React.FC<PayInfoCellProps> = ({
{
chooseFormItem
(
formItem
)
}
</
Form
.
Item
>
)
:
(
<
div
className=
"editable-cell-value-wrap"
style=
{
{
paddingRight
:
24
}
}
onClick=
{
toggleEdit
}
>
{
children
}
</
div
>
null
);
}
...
...
src/pages/transaction/purchaseOrder/components/productModalTable/index.tsx
View file @
9587e0ca
...
...
@@ -3,11 +3,12 @@ import ModalTable, { ModalTableProps } from '@/components/ModalTable'
import
{
useRowSelectionTable
}
from
'@/hooks/useRowSelectionTable'
import
{
fetchOrderApi
}
from
'../../readyAddOrder/apis'
import
{
useModalTable
}
from
'../../readyAddOrder/model/useModalTable'
import
{
ISchemaFormActions
}
from
'@formily/antd'
import
{
ISchemaFormActions
,
ISchemaFormAsyncActions
}
from
'@formily/antd'
import
{
OrderModalType
}
from
'../../readyAddOrder/constant'
export
interface
ProductModalTableProps
extends
ModalTableProps
{
type
?:
'radio'
|
'checkbox'
,
schemaAction
:
ISchemaFormActions
,
schemaAction
:
ISchemaFormActions
|
ISchemaFormAsyncActions
,
currentRef
?:
any
,
confirmModal
?()
}
...
...
@@ -37,8 +38,28 @@ export const productColumns: any[] = [
align
:
'center'
,
key
:
'brandName'
,
},
{
title
:
'单位'
,
dataIndex
:
'unitName'
,
align
:
'center'
,
key
:
'unitName'
},
{
title
:
'库存数量'
,
dataIndex
:
'stockCount'
,
align
:
'center'
,
key
:
'stockCount'
},
]
// 下单类型->商城类型映射
const
orderProductShopTypeMaps
=
{
[
OrderModalType
.
HAND_ORDER
]:
1
,
[
OrderModalType
.
CONSOLIDATED_ORDER
]:
1
,
[
OrderModalType
.
CHANNEL_DIRECT_MINING_ORDER
]:
3
,
[
OrderModalType
.
CHANNEL_SPOT_MANUAL_ORDER
]:
4
}
const
ProductModalTable
:
React
.
FC
<
ProductModalTableProps
>
=
(
props
)
=>
{
const
{
type
=
'checkbox'
,
schemaAction
,
confirmModal
,
currentRef
,
...
restProps
}
=
props
const
{
visible
,
setVisible
,
rowSelection
,
rowSelectionCtl
}
=
useModalTable
({
type
})
...
...
@@ -58,22 +79,35 @@ const ProductModalTable:React.FC<ProductModalTableProps> = (props) => {
confirmModal
&&
confirmModal
()
setVisible
(
false
)
}
const
fetchProductList
=
(
values
)
=>
{
const
modelType
=
schemaAction
.
getFieldValue
(
'orderModel'
)
const
params
=
{
...
values
,
shopType
:
orderProductShopTypeMaps
[
modelType
],
environment
:
1
,
// 手工下单/合并订单下单时,查询现货价格商品
priceTypeList
:
modelType
===
(
OrderModalType
.
CONSOLIDATED_ORDER
||
OrderModalType
.
HAND_ORDER
)
?
[
1
]
:
undefined
}
return
fetchOrderApi
.
getProductList
(
params
)
}
return
(
<
ModalTable
modalTitle=
'选择订单商品'
width=
{
900
}
columns=
{
productColumns
}
visible=
{
visible
}
confirm=
{
handleConfirmProduct
}
cancel=
{
()
=>
setVisible
(
false
)
}
fetchTableData=
{
(
params
)
=>
fetchOrderApi
.
getProductList
(
params
)
}
fetchTableData=
{
fetchProductList
}
rowSelection=
{
rowSelection
}
modalType=
'productByDefault'
tableProps=
{
{
rowKey
:
'id'
,
onRow
:
(
record
)
=>
({
onClick
:
()
=>
{
rowSelectionCtl
.
setSelectRow
([
record
]
);
rowSelectionCtl
.
setSelectedRowKeys
([
record
.
id
]
);
rowSelectionCtl
.
appendSelectRow
(
record
);
rowSelectionCtl
.
appendSelectRowKeys
(
record
.
id
);
},
})
}
}
...
...
src/pages/transaction/purchaseOrder/components/productTableCell/index.tsx
0 → 100644
View file @
9587e0ca
import
React
,
{
useState
,
useRef
,
useContext
,
useEffect
}
from
'react'
import
{
Form
,
Input
,
Select
}
from
'antd'
;
export
interface
ProductTableCellProps
{
title
:
React
.
ReactNode
;
editable
:
boolean
;
children
:
React
.
ReactNode
;
dataIndex
:
string
;
record
:
any
;
handleSave
:
(
record
:
any
)
=>
Promise
<
any
>
;
forceEdit
:
boolean
,
formItem
:
string
,
formItemProps
:
any
}
const
EditableContext
=
React
.
createContext
<
any
>
({});
export
const
ProductEditableRow
:
React
.
FC
<
any
>
=
({...
props
})
=>
{
const
[
form
]
=
Form
.
useForm
();
const
ctx
=
{
form
}
return
(
<
Form
form=
{
form
}
component=
{
false
}
>
<
EditableContext
.
Provider
value=
{
ctx
}
>
<
tr
{
...
props
}
/>
</
EditableContext
.
Provider
>
</
Form
>
);
};
export
const
ProductTableCell
:
React
.
FC
<
ProductTableCellProps
>
=
({
title
,
editable
,
children
,
dataIndex
,
record
,
handleSave
,
forceEdit
,
formItem
,
formItemProps
=
{},
...
restProps
})
=>
{
const
formItemRef
=
useRef
<
any
>
();
const
{
form
}
=
useContext
(
EditableContext
);
const
save
=
async
e
=>
{
try
{
const
values
=
await
form
.
validateFields
();
handleSave
({
...
record
,
...
values
});
}
catch
(
errInfo
)
{
console
.
log
(
'Save failed:'
,
errInfo
);
}
};
const
chooseFormItem
=
(
type
)
=>
{
switch
(
type
)
{
case
'input'
:
{
return
<
Input
style=
{
{
width
:
140
}
}
ref=
{
formItemRef
}
onChange=
{
save
}
{
...
formItemProps
}
/>
}
}
}
let
childNode
=
children
;
if
(
editable
)
{
childNode
=
<
Form
.
Item
style=
{
{
margin
:
0
}
}
name=
{
dataIndex
}
rules=
{
[
{
required
:
true
,
message
:
`${title}必须填写`
,
},
]
}
>
{
chooseFormItem
(
formItem
)
}
</
Form
.
Item
>
}
return
<
td
{
...
restProps
}
>
{
childNode
}
</
td
>;
}
ProductTableCell
.
defaultProps
=
{}
export
default
ProductTableCell
\ No newline at end of file
src/pages/transaction/purchaseOrder/readyAddOrder/apis/index.ts
View file @
9587e0ca
...
...
@@ -3,7 +3,7 @@ import { PublicApi } from '@/services/api'
export
const
fetchOrderApi
=
{
// 弹窗获取商品列表
async
getProductList
(
params
)
{
const
{
data
}
=
await
PublicApi
.
getProductCommodity
GetCommodityDetailList
({...
params
,
shopType
:
1
}
)
const
{
data
}
=
await
PublicApi
.
getProductCommodity
CommonGetCommodityDetailList
(
params
)
return
data
},
...
...
src/pages/transaction/purchaseOrder/readyAddOrder/constant/index.ts
→
src/pages/transaction/purchaseOrder/readyAddOrder/constant/index.ts
x
View file @
9587e0ca
import
React
from
'react'
import
{
formatTimeString
}
from
'@/utils'
import
{
Row
,
Space
,
Popover
}
from
'antd'
import
{
DELIVERY_TYPE
}
from
'@/constants'
import
{
EnvironmentOutlined
}
from
'@ant-design/icons'
import
{
PublicApi
}
from
'@/services/api'
// 简单控制价格区间的组件
// @todo 后续需要优化, 样式,目录文件等。
const
PriceComp
=
(
props
)
=>
{
const
{
priceSection
=
{}
}
=
props
const
priceTransKeys
=
Object
.
keys
(
priceSection
)
// 出现0-0 表示没有单价区间范围
if
(
priceTransKeys
.
length
===
1
&&
priceTransKeys
[
0
]
===
'0-0'
)
{
return
<
span
style=
{
{
color
:
'#E63F3B'
}
}
>
{
'¥'
+
priceSection
[
priceTransKeys
[
0
]]
}
</
span
>
}
return
<
div
>
{
priceTransKeys
.
map
(
v
=>
<
Row
key=
{
v
}
justify=
'space-between'
>
<
span
style=
{
{
color
:
'#606266'
}
}
>
{
v
.
replace
(
'-'
,
'~'
)
}
:
</
span
>
<
span
style=
{
{
color
:
'#E63F3B'
,
marginLeft
:
40
}
}
>
¥
{
priceSection
[
v
]
}
</
span
>
</
Row
>)
}
</
div
>
}
const
AddressPop
=
(
props
)
=>
{
const
{
pickInfo
=
null
,
children
}
=
props
return
pickInfo
&&
pickInfo
.
deliveryType
===
2
?
<
Space
>
<
EnvironmentOutlined
style=
{
{
marginRight
:
8
}
}
/>
<
Popover
content=
{
<
Row
>
<
EnvironmentOutlined
/>
<
div
>
<
h3
>
自提地址
</
h3
>
<
p
>
{
pickInfo
.
receiverName
}
/
{
pickInfo
.
phone
}
</
p
>
<
p
>
{
pickInfo
.
fullAddress
}
</
p
>
</
div
>
</
Row
>
}
>
{
children
}
</
Popover
>
</
Space
>
:
children
}
export
enum
OrderModalType
{
...
...
@@ -218,7 +261,7 @@ export const paymentInformationColumns: any[] = [
editable
:
true
,
forceEdit
:
true
,
formItemProps
:
{
options
:
payTypeLabel
options
:
[]
},
width
:
200
},
...
...
@@ -231,4 +274,96 @@ export const paymentInformationColumns: any[] = [
forceEdit
:
true
,
width
:
200
},
]
// 商品列表
export
const
productInfoColumns
:
any
[]
=
[
{
title
:
'ID'
,
dataIndex
:
'id'
,
align
:
'center'
,
key
:
'id'
,
},
{
title
:
'商品名称'
,
dataIndex
:
'name'
,
align
:
'center'
,
key
:
'name'
,
},
{
title
:
'品类'
,
dataIndex
:
'customerCategoryName'
,
align
:
'center'
,
key
:
'customerCategoryName'
,
},
{
title
:
'品牌'
,
dataIndex
:
'brandName'
,
align
:
'center'
,
key
:
'brandName'
,
},
{
title
:
'单位'
,
dataIndex
:
'unitName'
,
align
:
'center'
,
key
:
'unitName'
,
},
{
title
:
'单价(元)'
,
dataIndex
:
'unitPrice'
,
align
:
'left'
,
key
:
'unitPrice'
,
render
:
text
=>
<
PriceComp
priceSection=
{
text
}
/>
},
{
title
:
'会员折扣'
,
dataIndex
:
'memberPrice'
,
align
:
'center'
,
key
:
'memberPrice'
,
render
:
(
text
,
record
)
=>
record
.
isMemberPrice
?
text
:
null
},
{
title
:
'采购数量'
,
dataIndex
:
'quotationNo'
,
align
:
'center'
,
key
:
'quotationNo'
,
formItem
:
'input'
,
editable
:
true
,
width
:
140
},
{
title
:
'含税'
,
dataIndex
:
'none'
,
align
:
'center'
,
key
:
'none'
,
},
{
title
:
'金额'
,
dataIndex
:
'price'
,
align
:
'center'
,
key
:
'price'
,
},
// 接口调用
{
title
:
'配送方式'
,
dataIndex
:
'logistics'
,
align
:
'center'
,
key
:
'logistics'
,
render
:
async
(
text
,
record
)
=>
{
if
(
text
.
deliveryType
===
2
)
{
const
{
code
,
data
}
=
await
PublicApi
.
getLogisticsShipperAddressGet
({
id
:
text
.
sendAddress
},
{
ttl
:
60
*
1000
,
useCache
:
true
})
return
code
===
1000
?
<
AddressPop
pickInfo=
{
data
}
>
{
DELIVERY_TYPE
[
text
.
deliveryType
]
}
</
AddressPop
>
:
DELIVERY_TYPE
[
text
.
deliveryType
]
}
else
{
return
DELIVERY_TYPE
[
text
.
deliveryType
]
}
}
},
{
title
:
'操作'
,
dataIndex
:
'ctl'
,
align
:
'center'
,
key
:
'ctl'
,
},
]
\ No newline at end of file
src/pages/transaction/purchaseOrder/readyAddOrder/detail.tsx
View file @
9587e0ca
...
...
@@ -3,14 +3,14 @@ import { history } from 'umi'
import
{
PageHeaderWrapper
}
from
'@ant-design/pro-layout'
import
ReutrnEle
from
'@/components/ReturnEle'
import
{
usePageStatus
,
PageStatus
}
from
'@/hooks/usePageStatus'
import
{
Button
,
Card
}
from
'antd'
import
{
createFormActions
}
from
'@formily/antd'
import
{
Button
,
Card
,
Row
,
Col
}
from
'antd'
import
{
createFormActions
,
createAsyncFormActions
,
registerVirtualBox
,
useFormSpy
}
from
'@formily/antd'
import
{
SaveOutlined
,
LinkOutlined
,
PlusOutlined
}
from
'@ant-design/icons'
import
NiceForm
from
'@/components/NiceForm'
import
{
orderDetailSchema
,
orderAddSchema
}
from
'./schema'
import
{
useModelTypeChange
,
useEditHideField
,
useOrderFormInitEffect
,
useProductTableChangeForPay
}
from
'./effects'
import
{
OrderModalType
,
orderTypeLabel
,
orderCombination
,
paymentInformationColumns
}
from
'./constant'
import
ProductModalTable
,
{
productColumns
}
from
'../components/productModalTable'
import
ProductModalTable
from
'../components/productModalTable'
import
MemberModalTable
from
'../components/memberModalTable'
import
InquiryModalTable
from
'../components/inquiryModalTable'
import
DemandModalTable
from
'../components/demandModalTable'
...
...
@@ -19,32 +19,77 @@ import SelectAddress from '../components/selectAddress'
import
TheInvoiceList
from
'../components/theInvoiceList'
import
moment
from
'moment'
import
{
usePaymentInfo
}
from
'./model/usePaymentInfo'
import
{
useProductTable
}
from
'./model/useProductTable'
import
styled
from
'styled-components'
import
{
useUpdate
}
from
'@umijs/hooks'
import
{
fetchOrderApi
}
from
'./apis'
import
{
PublicApi
}
from
'@/services/api'
export
interface
PurchaseOrderDetailProps
{}
const
RowStyle
=
styled
(
props
=>
<
Row
style=
{
{
marginTop
:
12
}
}
justify=
'end'
{
...
props
}
>
{
props
.
children
}
</
Row
>)
`
.ant-col {
text-align: center
}
.ant-col div {
margin-bottom: 12px;
}
`
const
addSchemaAction
=
createFormActions
()
// 总计金额联动框
export
const
MoneyTotalBox
=
registerVirtualBox
(
'moneyTotalBox'
,
props
=>
{
// @todo 由于缺乏商品字段, 目前选用假数据
const
{
form
}
=
useFormSpy
({
selector
:
[[
'onFieldValueChange'
,
'orderProductRequests'
]],
reducer
:
v
=>
v
})
const
data
=
form
.
getFieldValue
(
'orderProductRequests'
)
const
getRowTotalPrice
=
data
.
map
(
v
=>
{
const
numberNo
=
parseInt
(
v
.
quotationNo
)
const
quotationNo
=
(
typeof
numberNo
===
'number'
&&
!
isNaN
(
numberNo
))
?
numberNo
:
0
return
quotationNo
*
100
})
const
sum
=
getRowTotalPrice
.
reduce
((
prev
,
next
)
=>
prev
+
next
,
0
)
return
<
RowStyle
>
<
Col
span=
{
2
}
>
<
div
>
合计金额
</
div
>
<
div
>
{
sum
}
</
div
>
</
Col
>
<
Col
span=
{
2
}
>
<
div
>
运费
</
div
>
<
div
>
{
sum
}
</
div
>
</
Col
>
<
Col
span=
{
2
}
>
<
div
>
总计金额
</
div
>
<
div
>
{
sum
}
</
div
>
</
Col
>
</
RowStyle
>
})
// 采购订单详情页. 包含新增和编辑
const
PurchaseOrderDetail
:
React
.
FC
<
PurchaseOrderDetailProps
>
=
(
props
)
=>
{
const
productRef
=
useRef
<
any
>
({})
const
memberRef
=
useRef
<
any
>
({})
const
inquiryRef
=
useRef
<
any
>
({})
const
demandRef
=
useRef
<
any
>
({})
const
update
=
useUpdate
()
const
[
paymentColumns
,
paymentComponents
,
paymentSave
]
=
usePaymentInfo
(
addSchemaAction
)
const
{
productAddButton
,
productRef
,
productColumns
,
productComponents
}
=
useProductTable
(
addSchemaAction
)
// 页面进入时, 当前所处的下单模式
const
{
pageStatus
}
=
usePageStatus
()
const
handleSubmit
=
(
value
)
=>
{
const
handleSubmit
=
async
(
value
)
=>
{
const
params
=
{
...
value
,
deliveryTime
:
moment
(
value
.
deliveryTime
).
valueOf
()
deliveryTime
:
moment
(
value
.
deliveryTime
).
valueOf
()
,
}
console
.
log
(
params
)
await
PublicApi
.
postOrderProcurementOrderAdd
(
params
)
}
// 唤起报价单弹窗
const
handleOrderNo
=
()
=>
{
const
handleOrderNo
=
async
()
=>
{
// @todo 未完整实现功能, 缺少商品接口
// 询价报价单, 合并订单需要唤起询价弹窗
const
orderModel
=
addSchemaAction
.
getFieldValue
(
'orderModel'
)
...
...
@@ -62,8 +107,6 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
const
orderNoPrice
=
pageStatus
!==
PageStatus
.
PREVIEW
&&
<
div
className=
'connectBtn'
onClick=
{
handleOrderNo
}
><
LinkOutlined
style=
{
{
marginRight
:
4
}
}
/>
选择
</
div
>
const
orderMember
=
pageStatus
!==
PageStatus
.
PREVIEW
&&
<
div
className=
'connectBtn'
onClick=
{
handleOrderMember
}
><
LinkOutlined
style=
{
{
marginRight
:
4
}
}
/>
选择
</
div
>
const
productAddButton
=
<
Button
onClick=
{
()
=>
productRef
.
current
.
setVisible
(
true
)
}
block
type=
'default'
style=
{
{
margin
:
'24px auto'
}
}
>
选择订单商品
</
Button
>
// @todo 未实现金额合计
const
couponAddButton
=
<
Button
onClick=
{
()
=>
productRef
.
current
.
setVisible
(
true
)
}
block
type=
'default'
style=
{
{
margin
:
'24px auto'
}
}
>
选择优惠券
</
Button
>
...
...
@@ -84,7 +127,7 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
formItem
:
col
.
formItem
,
formItemProps
:
col
.
formItemProps
,
forceEdit
:
col
.
forceEdit
,
handleSave
:
paymentSave
,
handleSave
:
paymentSave
}),
};
})
...
...
@@ -152,7 +195,7 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
useEditHideField
()
// 商品信息的改动 驱动支付信息变化
useProductTableChangeForPay
(
ctx
)
useProductTableChangeForPay
(
ctx
,
update
)
}
}
expressionScope=
{
{
orderNoPrice
,
...
...
@@ -161,6 +204,8 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
paymentComponents
,
productColumns
,
productAddButton
,
productComponents
,
// productAfter: afterFix,
couponAddButton
,
orderCombination
,
addNewAddress
,
...
...
src/pages/transaction/purchaseOrder/readyAddOrder/effects/index.ts
View file @
9587e0ca
...
...
@@ -4,8 +4,51 @@ import { useLinkageUtils } from '@/utils/formEffectUtils';
import
{
OrderModalType
,
orderCombination
}
from
'../constant'
;
import
{
history
}
from
'umi'
;
import
{
fetchOrderApi
}
from
'../apis'
;
import
{
useUpdate
}
from
'@umijs/hooks'
;
import
{
PublicApi
}
from
'@/services/api'
;
// 异步填充表格字段
const
asyncPadDataForProduct
=
async
(
ctx
:
ISchemaFormActions
|
ISchemaFormAsyncActions
,
productData
:
any
[])
=>
{
if
(
productData
.
length
===
0
)
{
return
false
}
// 折扣请求
const
asyncPriceRequests
=
await
Promise
.
all
(
productData
.
filter
(
v
=>
v
.
memberPrice
===
undefined
).
map
(
async
v
=>
{
const
{
code
,
data
}
=
await
PublicApi
.
getMemberManageUpperCreditParamGet
({
parentMemberId
:
v
.
memberId
,
parentMemberRoleId
:
v
.
memberRoleId
},
{
ttl
:
60
*
1000
,
useCache
:
true
})
return
code
===
1000
?
(
data
.
parameter
*
100
)
+
'%'
:
''
}
))
// const asyncAddressRequests = await Promise.all(productData.filter(v => v.memberPrice === undefined).map(async v => {
// const {code, data} = await PublicApi.getLogisticsShipperAddressGet({
// id: v.logistics.sendAddress
// }, {ttl: 60 * 1000, useCache: true})
// return code === 1000 ? data : null
// }
// ))
// 存在需要异步请求的, 则进行赋值
if
(
asyncPriceRequests
.
length
>
0
)
{
const
newData
=
productData
.
map
((
v
,
i
)
=>
{
v
.
memberPrice
=
asyncPriceRequests
[
i
]
return
v
})
console
.
log
(
newData
)
ctx
.
setFieldValue
(
'orderProductRequests'
,
newData
)
}
// if (asyncAddressRequests.length > 0) {
// ctx.setFieldValue('orderProductRequests', productData.map((v, i) => {
// v.memberPrice = asyncPriceRequests[i]
// return v
// }))
// }
// 配送方式请求
// const asyncAddressRequests = productData.filter(v => v.distributeMode !== undefined)
}
export
const
createEffects
=
context
=>
()
=>
{
}
...
...
@@ -29,21 +72,30 @@ export const useEditHideField = () => {
})
}
export
const
useProductTableChangeForPay
=
(
ctx
:
ISchemaFormActions
|
ISchemaFormAsyncActions
)
=>
{
export
const
useProductTableChangeForPay
=
(
ctx
:
ISchemaFormActions
|
ISchemaFormAsyncActions
,
update
)
=>
{
FormEffectHooks
.
onFieldValueChange$
(
'orderProductRequests'
).
subscribe
(
state
=>
{
const
{
value
}
=
state
const
payInfoData
=
ctx
.
getFieldValue
(
'paymentInformationResponses'
)
// 强制渲染一次, 用于触发金额总数
update
()
// 已经存在数据 无需请求
if
(
payInfoData
&&
payInfoData
.
length
>
0
)
{
}
else
if
(
state
.
value
&&
state
.
value
.
length
>
0
){
}
else
if
(
value
&&
value
.
length
>
0
){
// 请求一次并复制给支付信息
const
productItem
=
state
.
value
[
0
]
const
productItem
=
value
[
0
]
fetchOrderApi
.
getPayInfoList
({
productId
:
productItem
.
id
}).
then
(
data
=>
{
ctx
.
setFieldValue
(
'paymentInformationResponses'
,
data
)
// ctx.setFieldValue('paymentInformationResponses', data)
}).
catch
(
err
=>
{
})
}
// 确认后 需根据商品id请求会员折扣接口, 以及配送方式
// 由于商品存在多个, 需对接口做一定缓存
console
.
log
(
value
)
asyncPadDataForProduct
(
ctx
,
value
)
})
}
...
...
src/pages/transaction/purchaseOrder/readyAddOrder/model/usePaymentInfo.tsx
View file @
9587e0ca
import
{
paymentInformationColumns
}
from
'../constant'
import
{
PayInfoCell
,
EditableRow
}
from
'../../components/payInfoTableCell'
import
{
ISchemaFormActions
}
from
'@formily/antd'
import
{
ISchemaFormActions
,
ISchemaFormAsyncActions
}
from
'@formily/antd'
import
{
useEffect
,
useState
,
useRef
}
from
'react'
import
{
PublicApi
}
from
'@/services/api'
export
const
usePaymentInfo
=
(
ctx
:
ISchemaFormActions
):
any
=>
{
const
columns
=
paymentInformationColumns
export
const
usePaymentInfo
=
(
ctx
:
ISchemaFormActions
|
ISchemaFormAsyncActions
):
any
=>
{
const
paywayData
=
useRef
<
any
>
({})
const
[
columns
,
setColumns
]
=
useState
<
any
[]
>
(
paymentInformationColumns
)
const
components
=
{
body
:
{
row
:
EditableRow
,
cell
:
PayInfoCell
},
}
const
initPayWayList
=
(
data
)
=>
{
if
(
!
data
)
{
return
[]
}
let
result
=
[]
for
(
let
item
of
data
)
{
if
(
result
.
some
(
tempItem
=>
tempItem
.
payType
===
item
.
payType
))
{
result
=
result
.
map
(
resItem
=>
{
if
(
resItem
.
payType
===
item
.
payType
)
{
resItem
.
payList
=
[...
resItem
.
payList
,
item
]
}
return
resItem
})
}
else
{
let
payVal
=
""
switch
(
item
.
payType
)
{
case
1
:
payVal
=
"线上支付"
break
case
2
:
payVal
=
"线下支付"
break
case
3
:
payVal
=
"授信支付"
break
case
4
:
payVal
=
"货到付款"
break
}
result
.
push
({
payVal
,
payType
:
item
.
payType
,
payList
:
[
item
]
})
}
}
return
result
}
useEffect
(()
=>
{
PublicApi
.
getPayPayWayList
().
then
(
res
=>
{
const
{
code
,
data
}
=
res
if
(
code
===
1000
)
{
const
newColumns
=
[...
columns
]
newColumns
[
5
].
formItemProps
.
options
=
initPayWayList
(
data
)
paywayData
.
current
=
data
setColumns
(
newColumns
)
}
})
},
[])
const
handleSave
=
row
=>
{
const
newData
=
[...
ctx
.
getFieldValue
(
'paymentInformationResponses'
)];
const
index
=
newData
.
findIndex
(
item
=>
row
.
key
===
item
.
key
);
const
item
=
newData
[
index
];
newData
.
splice
(
index
,
1
,
{
...
item
,
...
row
,
});
ctx
.
setFieldValue
(
'paymentInformationResponses'
,
newData
)
return
new
Promise
((
resolve
,
reject
)
=>
{
const
newData
=
[...
ctx
.
getFieldValue
(
'paymentInformationResponses'
)];
const
index
=
newData
.
findIndex
(
item
=>
row
.
key
===
item
.
key
);
const
item
=
newData
[
index
];
newData
.
splice
(
index
,
1
,
{
...
item
,
...
row
,
});
ctx
.
setFieldValue
(
'paymentInformationResponses'
,
newData
)
resolve
({
item
,
newData
})
})
};
return
[
columns
,
...
...
src/pages/transaction/purchaseOrder/readyAddOrder/model/useProductTable.tsx
0 → 100644
View file @
9587e0ca
import
React
,
{
useRef
,
useMemo
,
useState
}
from
'react'
import
{
ISchemaFormActions
,
ISchemaFormAsyncActions
,
createControllerBox
,
useFormSpy
}
from
'@formily/antd'
;
import
{
Button
,
Row
,
Col
}
from
'antd'
;
import
{
productInfoColumns
}
from
'../constant'
;
import
ProductTableCell
,
{
ProductEditableRow
}
from
'../../components/productTableCell'
;
export
const
useProductTable
=
(
ctx
:
ISchemaFormActions
|
ISchemaFormAsyncActions
)
=>
{
const
productRef
=
useRef
<
any
>
({})
const
[
productColumns
,
setProductColumns
]
=
useState
(()
=>
productInfoColumns
)
const
productAddButton
=
<
Button
onClick=
{
()
=>
productRef
.
current
.
setVisible
(
true
)
}
block
type=
'default'
style=
{
{
margin
:
'24px auto'
}
}
>
选择订单商品
</
Button
>
const
productComponents
=
{
body
:
{
row
:
ProductEditableRow
,
cell
:
ProductTableCell
}
}
const
handleSave
=
row
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
const
newData
=
[...
ctx
.
getFieldValue
(
'orderProductRequests'
)];
const
index
=
newData
.
findIndex
(
item
=>
row
.
key
===
item
.
key
);
const
item
=
newData
[
index
];
newData
.
splice
(
index
,
1
,
{
...
item
,
...
row
,
});
console
.
log
(
newData
)
ctx
.
setFieldValue
(
'orderProductRequests'
,
newData
)
resolve
({
item
,
newData
})
})
};
const
paymentEditColumns
=
productColumns
.
map
(
col
=>
{
if
(
!
col
.
editable
)
{
return
col
;
}
return
{
...
col
,
onCell
:
record
=>
({
record
,
editable
:
col
.
editable
,
dataIndex
:
col
.
dataIndex
,
title
:
col
.
title
,
formItem
:
col
.
formItem
,
formItemProps
:
col
.
formItemProps
,
handleSave
}),
};
})
return
{
productRef
,
productAddButton
,
productColumns
:
paymentEditColumns
,
productComponents
}
}
\ No newline at end of file
src/pages/transaction/purchaseOrder/readyAddOrder/schema/index.ts
View file @
9587e0ca
...
...
@@ -214,9 +214,13 @@ const orderProduct: ISchema = {
"x-component-props"
:
{
rowKey
:
'id'
,
columns
:
"{{productColumns}}"
,
// @todo 第一版本暂不做优惠券
// suffix: "{{couponAddButton}}"
}
components
:
"{{productComponents}}"
,
},
// default: [{id: 904}]
},
NO_SUBMIT_SPY
:
{
type
:
'object'
,
"x-component"
:
"moneyTotalBox"
}
}
}
...
...
@@ -236,13 +240,13 @@ const payInfo: ISchema = {
columns
:
"{{paymentColumns}}"
,
components
:
"{{paymentComponents}}"
},
default
:
[
{
payCount
:
1
,
id
:
1
,
payRatio
:
123
}
]
//
default: [
//
{
//
payCount: 1,
//
id: 1,
//
payRatio: 123
//
}
//
]
}
}
}
...
...
src/utils/request.ts
View file @
9587e0ca
...
...
@@ -69,6 +69,8 @@ const baseRequest = extend({
// errorHandler
});
const
cache
=
{}
// 请求拦截器
baseRequest
.
interceptors
.
request
.
use
((
url
:
string
,
options
:
RequestOptionsInit
):
{
url
:
string
,
options
:
RequestOptionsInit
}
=>
{
// 判断是否有权限
...
...
@@ -83,6 +85,7 @@ baseRequest.interceptors.request.use((url: string, options: RequestOptionsInit):
options
.
paramsSerializer
=
params
=>
{
return
qs
.
stringify
(
params
,
{
arrayFormat
:
'brackets'
})
}
return
{
// 前缀如果已经带上api, 跳过自动补前缀
url
:
url
.
startsWith
(
'/api'
)
?
url
:
basePrefix
+
url
,
...
...
@@ -111,7 +114,6 @@ class ApiRequest {
createRequest
<
T
>
(
url
:
string
,
options
:
IApiRequest
=
{
ctlType
:
'none'
}):
Promise
<
IRequestSuccess
<
T
>>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
baseRequest
<
IRequestSuccess
<
T
>>
(
url
,
options
).
then
(
res
=>
{
// 登录验证
if
(
res
.
code
===
1101
)
{
removeAuth
()
...
...
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