Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
jinfa-admin
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
linweijiong
jinfa-admin
Commits
ff6064b7
Commit
ff6064b7
authored
Oct 21, 2020
by
XieZhiXiong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
对接完评论相关已有接口
parent
28439d0a
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
738 additions
and
239 deletions
+738
-239
commentRoutes.ts
config/routes/commentRoutes.ts
+10
-6
index.ts
config/routes/index.ts
+16
-3
interface.d.ts
src/components/PolymericTable/interface.d.ts
+2
-2
menu.ts
src/locales/zh-CN/menu.ts
+2
-2
index.tsx
src/pages/comment/manage/detailed/index.tsx
+34
-12
index.tsx
src/pages/comment/manage/index.tsx
+28
-12
index.tsx
src/pages/comment/manage/schema/index.tsx
+24
-5
index.tsx
...omment/query/detailed/components/EvaluationList/index.tsx
+5
-10
index.tsx
...es/comment/query/detailed/components/RecordList/index.tsx
+370
-48
index.ts
...ment/query/detailed/components/RecordList/schema/index.ts
+26
-5
index.tsx
src/pages/comment/query/detailed/index.tsx
+170
-71
index.tsx
src/pages/comment/query/index.tsx
+19
-4
index.tsx
src/pages/comment/query/schema/index.tsx
+0
-59
index.ts
src/utils/index.ts
+32
-0
No files found.
config/routes/commentRoutes.ts
View file @
ff6064b7
...
...
@@ -2,33 +2,37 @@
* @Author: XieZhiXiong
* @Date: 2020-09-23 09:55:40
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-
09-23 11:12:37
* @Description:
* @LastEditTime: 2020-
10-21 14:58:09
* @Description:
评价管理相关路由
*/
const
commentRoutes
=
{
path
:
'/comment'
,
name
:
'comment'
,
icon
:
'SmileOutlined'
,
routes
:
[
// 会员评价查询
{
path
:
'/comment/query'
,
name
:
'query'
,
component
:
'@/pages/comment/query/index'
,
},
// 会员评价详情
{
path
:
'/comment/query/detail
ed
'
,
name
:
'queryDetail
ed
'
,
path
:
'/comment/query/detail'
,
name
:
'queryDetail'
,
component
:
'@/pages/comment/query/detailed/index'
,
hideInMenu
:
true
,
},
// 评价管理
{
path
:
'/comment/manage'
,
name
:
'manage'
,
component
:
'@/pages/comment/manage/index'
,
},
// 评价管理-详情
{
path
:
'/comment/manage/detail
ed
'
,
name
:
'manageDetail
ed
'
,
path
:
'/comment/manage/detail'
,
name
:
'manageDetail'
,
component
:
'@/pages/comment/manage/detailed/index'
,
hideInMenu
:
true
,
hidePageHeader
:
true
,
...
...
config/routes/index.ts
View file @
ff6064b7
/*
* @Author: LeeJiancong
* @Date: 2020-08-04 15:47:40
* @LastEditors:
Please set LastEditors
* @LastEditTime: 2020-10-2
0 18:19:02
* @LastEditors:
XieZhiXiong
* @LastEditTime: 2020-10-2
1 14:48:29
*/
/**
...
...
@@ -19,8 +19,21 @@ import memberAbility from './memberAbility'
import
ruleSettingRoutes
from
'./ruleSettingRoutes'
import
authConfig
from
'./authConfig'
import
rfqRoute
from
'./rfqRoute'
// 询价单路由
import
commentRoutes
from
'./commentRoutes'
;
import
contentRoute
from
'./contentRoute'
;
const
routeList
=
[
pageCustomized
,
calssPropertyRoute
,
trademarkRoute
,
commodity
,
rfqRoute
,
logisticsRoutes
,
memberAbility
,
ruleSettingRoutes
,
authConfig
,
contentRoute
]
const
routeList
=
[
pageCustomized
,
calssPropertyRoute
,
trademarkRoute
,
commodity
,
rfqRoute
,
logisticsRoutes
,
memberAbility
,
ruleSettingRoutes
,
authConfig
,
commentRoutes
,
contentRoute
,
]
const
router
=
[
{
path
:
'/login'
,
...
...
src/components/PolymericTable/interface.d.ts
View file @
ff6064b7
...
...
@@ -2,13 +2,13 @@
* @Author: XieZhiXiong
* @Date: 2020-08-21 11:13:55
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-
08-25 10:05:19
* @LastEditTime: 2020-
10-21 16:39:54
* @Description:
*/
import
{
TableProps
,
TablePaginationConfig
,
ColumnType
}
from
'antd/lib/table'
;
export
interface
StandardTableProps
extends
TableProps
<
any
>
{
pagination
?:
TablePaginationConfig
;
pagination
?:
TablePaginationConfig
|
false
;
onPaginationChange
?:
(
page
:
number
,
size
:
number
)
=>
void
;
}
...
...
src/locales/zh-CN/menu.ts
View file @
ff6064b7
...
...
@@ -159,9 +159,9 @@ export default {
// 评论管理
'menu.comment'
:
'评论管理'
,
'menu.comment.query'
:
'会员评价查询'
,
'menu.comment.queryDetail
ed
'
:
'评价统计'
,
'menu.comment.queryDetail'
:
'评价统计'
,
'menu.comment.manage'
:
'评价管理'
,
'menu.comment.manageDetail
ed
'
:
'评价管理'
,
'menu.comment.manageDetail'
:
'评价管理'
,
// 订单管理
'menu.orderSystem'
:
'订单管理'
,
...
...
src/pages/comment/manage/detailed/index.tsx
View file @
ff6064b7
...
...
@@ -2,7 +2,7 @@
* @Author: XieZhiXiong
* @Date: 2020-09-23 11:02:03
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-10-2
0 14:26:49
* @LastEditTime: 2020-10-2
1 15:19:00
* @Description:
*/
import
React
,
{
useState
,
useEffect
}
from
'react'
;
...
...
@@ -16,6 +16,7 @@ import {
}
from
'antd'
;
import
{
history
}
from
'umi'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
{
GetOrderPlatformOrderDetailsResponse
}
from
'@/services/OrderApi'
;
import
{
PageHeaderWrapper
}
from
'@ant-design/pro-layout'
;
import
{
createFormActions
}
from
'@formily/antd'
;
import
{
usePageStatus
}
from
'@/hooks/usePageStatus'
;
...
...
@@ -31,27 +32,48 @@ import styles from './evaluate.less';
const
formActions
=
createFormActions
();
const
CommentManageDetailed
:
React
.
FC
=
()
=>
{
const
{
id
}
=
usePageStatus
();
const
[
commentInfo
,
seCommentInfo
]
=
useState
<
Unevaluated
[]
>
([]);
const
[
infoLoading
,
setInfoLoading
]
=
useState
(
false
);
const
{
id
,
orderId
}
=
usePageStatus
();
const
[
orderInfo
,
setOrderInfo
]
=
useState
<
GetOrderPlatformOrderDetailsResponse
>
();
const
[
orderInfoLoading
,
setOrderInfoLoading
]
=
useState
(
false
);
const
[
commentInfo
,
setCommentInfo
]
=
useState
<
Unevaluated
[]
>
([]);
const
[
commentInfoLoading
,
setCommentInfoLoading
]
=
useState
(
false
);
// 获取订单详情
const
getOrderInfo
=
()
=>
{
if
(
!
orderId
||
orderId
===
'undefined'
)
{
return
;
}
setOrderInfoLoading
(
true
);
PublicApi
.
getOrderPlatformOrderDetails
({
id
:
orderId
,
}).
then
(
res
=>
{
if
(
res
.
code
===
1000
)
{
setOrderInfo
(
res
.
data
);
}
}).
finally
(()
=>
{
setOrderInfoLoading
(
false
);
});
};
// 获取评论详情
const
getCommentInfo
=
()
=>
{
if
(
!
id
)
{
return
;
}
setInfoLoading
(
true
);
set
Comment
InfoLoading
(
true
);
PublicApi
.
getMemberPlatformCommentOrderTradeHistoryGet
({
id
,
}).
then
(
res
=>
{
if
(
res
.
code
===
1000
)
{
se
CommentInfo
(
normalizeUnevaluatedList
(
res
.
data
));
se
tCommentInfo
(
normalizeUnevaluatedList
([
res
.
data
]
));
}
}).
finally
(()
=>
{
setInfoLoading
(
false
);
set
Comment
InfoLoading
(
false
);
});
};
useEffect
(()
=>
{
getOrderInfo
();
getCommentInfo
();
},
[]);
...
...
@@ -78,7 +100,7 @@ const CommentManageDetailed: React.FC = () => {
);
return
(
<
Spin
spinning=
{
i
nfoLoading
}
>
<
Spin
spinning=
{
commentInfoLoading
||
orderI
nfoLoading
}
>
<
PageHeaderWrapper
title=
{
<>
...
...
@@ -88,8 +110,8 @@ const CommentManageDetailed: React.FC = () => {
title=
{
<
AvatarWrap
info=
{
{
aloneTxt
:
'单'
,
name
:
'订单号:DPTY12'
aloneTxt
:
'单'
,
name
:
orderInfo
?
orderInfo
.
orderNo
:
''
,
}
}
/>
}
...
...
@@ -101,8 +123,7 @@ const CommentManageDetailed: React.FC = () => {
padding
:
'0 32px'
,
}
}
>
<
Descriptions
.
Item
label=
"采购会员"
>
BPTY12
</
Descriptions
.
Item
>
<
Descriptions
.
Item
label=
"下单时间"
span=
{
2
}
>
2020-08-25 08:49
</
Descriptions
.
Item
>
<
Descriptions
.
Item
label=
"下单时间"
span=
{
2
}
>
{
orderInfo
?.
createTime
}
</
Descriptions
.
Item
>
</
Descriptions
>
</
PageHeader
>
</>
...
...
@@ -113,6 +134,7 @@ const CommentManageDetailed: React.FC = () => {
initialValues=
{
{
comments
:
commentInfo
,
}
}
editable=
{
false
}
expressionScope=
{
{
UploadTip
,
beforeUpload
,
...
...
src/pages/comment/manage/index.tsx
View file @
ff6064b7
...
...
@@ -5,10 +5,12 @@ import { Link } from 'umi';
import
{
StandardTable
}
from
'god'
;
import
{
ColumnType
}
from
'antd/lib/table/interface'
;
import
{
createFormActions
}
from
'@formily/antd'
;
import
moment
from
'moment'
;
import
{
useStateFilterSearchLinkageEffect
}
from
'@/formSchema/effects/useFilterSearch'
;
import
{
FORM_FILTER_PATH
}
from
'@/formSchema/const'
;
import
{
useAsyncInitSelect
}
from
'@/formSchema/effects/useAsyncInitSelect'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
{
isJSONStr
}
from
'@/utils'
;
import
EyePreview
from
'@/components/EyePreview'
;
import
NiceForm
from
'@/components/NiceForm'
;
import
{
listSearchSchema
}
from
'./schema'
;
...
...
@@ -28,7 +30,7 @@ const CommentManage: React.FC = () => {
align
:
'center'
,
render
:
(
text
,
record
)
=>
(
<
EyePreview
url=
{
`/comment/manage/detail
ed
`
}
url=
{
`/comment/manage/detail
?orderId=${record.orderId}&id=${record.id}
`
}
>
{
text
}
</
EyePreview
>
...
...
@@ -38,15 +40,22 @@ const CommentManage: React.FC = () => {
title
:
'交易商品/交易时间'
,
dataIndex
:
'product'
,
align
:
'center'
,
render
:
(
text
,
record
)
=>
(
<>
<
div
>
{
text
}
</
div
>
<
div
>
<
ClockCircleOutlined
/>
{
record
.
dealTime
}
</
div
>
</>
),
render
:
(
text
,
record
)
=>
{
const
product
=
isJSONStr
(
text
)
||
{};
return
(
<>
<
div
>
{
product
.
productName
}
</
div
>
<
div
style=
{
{
marginTop
:
4
,
}
}
>
<
ClockCircleOutlined
/>
{
` ${record.dealTime}`
}
</
div
>
</>
)
},
},
{
title
:
'被评价方'
,
...
...
@@ -89,8 +98,15 @@ const CommentManage: React.FC = () => {
];
const
fetchListData
=
(
params
:
any
)
=>
{
const
{
createTimeStart
,
createTimeEnd
,
dealTimeStart
,
dealTimeEnd
,
...
rest
}
=
params
;
return
new
Promise
((
resolve
,
reject
)
=>
{
PublicApi
.
getMemberPlatformCommentOrderTradeHistoryPage
(
params
)
PublicApi
.
getMemberPlatformCommentOrderTradeHistoryPage
({
...
rest
,
createTimeStart
:
createTimeStart
?
moment
(
+
createTimeStart
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
:
null
,
createTimeEnd
:
createTimeEnd
?
moment
(
+
createTimeEnd
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
:
null
,
dealTimeStart
:
dealTimeStart
?
moment
(
+
dealTimeStart
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
:
null
,
dealTimeEnd
:
dealTimeEnd
?
moment
(
+
dealTimeEnd
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
:
null
,
})
.
then
(
res
=>
{
if
(
res
.
code
===
1000
)
{
resolve
(
res
.
data
);
...
...
@@ -125,7 +141,7 @@ const CommentManage: React.FC = () => {
<
Card
>
<
StandardTable
tableProps=
{
{
rowKey
:
'
orderNo
'
,
rowKey
:
'
id
'
,
}
}
columns=
{
columns
}
currentRef=
{
ref
}
...
...
src/pages/comment/manage/schema/index.tsx
View file @
ff6064b7
...
...
@@ -44,25 +44,44 @@ export const listSearchSchema: ISchema = {
subMemberName
:
{
type
:
'string'
,
default
:
undefined
,
enum
:
[],
'x-component-props'
:
{
placeholder
:
'被评价方
(全部)
'
,
placeholder
:
'被评价方'
,
allowClear
:
true
,
},
},
memberName
:
{
type
:
'string'
,
default
:
undefined
,
enum
:
[],
'x-component-props'
:
{
placeholder
:
'评价方
(全部)
'
,
placeholder
:
'评价方'
,
allowClear
:
true
,
},
},
star
:
{
type
:
'string'
,
default
:
undefined
,
enum
:
[],
enum
:
[
{
label
:
'一星'
,
value
:
1
,
},
{
label
:
'二星'
,
value
:
2
,
},
{
label
:
'三星'
,
value
:
3
,
},
{
label
:
'四星'
,
value
:
4
,
},
{
label
:
'五星'
,
value
:
5
,
},
],
'x-component-props'
:
{
placeholder
:
'评价星级(全部)'
,
allowClear
:
true
,
...
...
src/pages/comment/query/detailed/components/EvaluationList/index.tsx
View file @
ff6064b7
...
...
@@ -135,28 +135,23 @@ const EvaluationList = props => {
return
(
<
RowStyleLayout
{
...
componentProps
}
key=
{
index
}
>
<
Row
align=
"middle"
>
<
Col
span=
{
10
}
>
<
Col
span=
{
8
}
>
<
div
className=
"goodInfo"
>
<
div
className=
"goodInfo-left"
>
<
img
src=
{
item
.
good
?
item
.
good
.
pic
:
''
}
/>
</
div
>
<
div
className=
"goodInfo-right"
>
<
div
className=
"goodInfo-title"
>
进口头层黄牛皮荔枝纹/红色/XL
</
div
>
<
div
className=
"goodInfo-desc"
>
20 平方英尺
</
div
>
<
div
className=
"goodInfo-price"
>
¥ 400.00
</
div
>
<
div
className=
"goodInfo-title"
>
{
item
.
good
.
productName
}
</
div
>
<
div
className=
"goodInfo-desc"
>
X
{
item
.
good
.
purchaseCount
||
''
}
</
div
>
<
div
className=
"goodInfo-price"
>
{
`¥ ${item.good.price}`
}
</
div
>
</
div
>
</
div
>
</
Col
>
<
Col
span=
{
1
0
}
>
<
Col
span=
{
1
6
}
>
<
div
className=
"main"
>
<
SchemaField
path=
{
FormPath
.
parse
(
path
).
concat
(
index
)
}
/>
</
div
>
</
Col
>
<
Col
span=
{
4
}
>
<
div
style=
{
{
textAlign
:
'right'
}
}
>
<
SmilingFace
value=
{
2
}
/>
</
div
>
</
Col
>
</
Row
>
</
RowStyleLayout
>
)
...
...
src/pages/comment/query/detailed/components/RecordList/index.tsx
View file @
ff6064b7
import
React
from
'react'
;
import
{
Button
,
Rate
}
from
'antd'
;
import
React
,
{
useState
,
useEffect
}
from
'react'
;
import
{
Button
,
Rate
,
Spin
,
Pagination
}
from
'antd'
;
import
{
createFormActions
}
from
'@formily/antd'
;
import
moment
from
'moment'
;
import
NiceForm
from
'@/components/NiceForm'
;
import
{
checkMore
}
from
'@/utils'
;
import
{
searchSchema
}
from
'./schema'
;
import
styles
from
'./index.less'
;
interface
RecordListProps
{
list
:
[];
const
formActions
=
createFormActions
();
const
PAGE_SIZE
=
2
;
export
interface
Search
{
/**
* 评价星级(1-5)
*/
star
:
string
|
null
/**
* 交易时间开始
*/
dealTimeStart
:
string
|
null
/**
* 交易时间结束
*/
dealTimeEnd
:
string
|
null
/**
* 评价方名称
*/
memberName
:
string
|
null
};
const
RecordList
:
React
.
FC
<
RecordListProps
>
=
()
=>
{
export
interface
ListParams
extends
Search
{
/**
* 当前页
*/
current
:
string
/**
* 每页行数
*/
pageSize
:
string
};
return
(
<
ul
className=
{
styles
.
record
}
>
<
li
className=
{
styles
[
'record-item'
]
}
>
<
div
className=
{
styles
[
'record-item-good'
]
}
>
<
div
className=
{
styles
[
'record-item-good-name'
]
}
>
进口头层黄牛皮荔枝纹/红色/XL
</
div
>
<
div
>
<
span
className=
{
styles
[
'record-item-good-price'
]
}
>
¥400.00
</
span
>
<
span
className=
{
styles
[
'record-item-good-desc'
]
}
>
20 平方英尺
</
span
>
</
div
>
</
div
>
<
div
className=
{
styles
[
'record-item-extra'
]
}
>
<
div
className=
{
styles
[
'record-item-extra-item'
]
}
>
<
div
className=
{
styles
[
'record-item-extra-item-label'
]
}
>
交易时间:
</
div
>
<
div
className=
{
styles
[
'record-item-extra-item-control'
]
}
>
2020-05-20 17:09
</
div
>
</
div
>
<
div
className=
{
styles
[
'record-item-extra-item'
]
}
>
<
div
className=
{
styles
[
'record-item-extra-item-label'
]
}
>
评价方:
</
div
>
<
div
className=
{
styles
[
'record-item-extra-item-control'
]
}
>
温州龙昌手袋有限公司
</
div
>
</
div
>
</
div
>
<
div
className=
{
styles
[
'record-item-comment'
]
}
>
<
Rate
value=
{
2
}
disabled
/>
<
div
className=
{
styles
[
'record-item-comment-main'
]
}
>
付款准时,合作愉快。付款准时,合作愉快。付款准时,合作愉快。付款准时,合作愉快。付款准时…
</
div
>
</
div
>
</
li
>
</
ul
>
);
export
interface
RecordItem
{
/**
* 记录id
*/
id
?:
number
/**
* 评价星级(1-5)
*/
star
:
number
/**
* 评价内容
*/
comment
:
string
/**
* 商品名称
*/
productName
:
string
/**
* 商品价格
*/
price
:
number
/**
* 商品数量
*/
quantity
:
number
/**
* 交易时间
*/
created
:
string
/**
* 评价方/被评价方
*/
target
:
string
/**
* 订单id
*/
orderId
:
string
};
export
default
RecordList
;
\ No newline at end of file
export
interface
RecordRes
{
data
:
RecordItem
[];
totalCount
:
number
;
};
interface
RecordListProps
{
// 分页器类型
paginationType
?:
'pagination'
|
'button'
;
// 是否需要检索
searchable
?:
boolean
;
// 是否是查看收到的品论
opposite
?:
boolean
;
// 是否可编辑的
editable
?:
boolean
;
// 是否可查看的
viewable
?
:
boolean
;
fetchList
:
(
params
:
ListParams
)
=>
Promise
<
RecordRes
>
;
onCheck
?:
(
record
:
RecordItem
)
=>
void
;
onEdit
?:
(
record
:
RecordItem
)
=>
void
;
};
interface
RecordListState
{
hasMore
:
boolean
;
page
:
number
;
size
:
number
|
undefined
;
searchVal
:
Search
;
receivedList
:
RecordRes
;
loading
:
boolean
;
};
export
default
class
RecordList
extends
React
.
Component
<
RecordListProps
,
RecordListState
>
{
constructor
(
props
)
{
super
(
props
);
this
.
state
=
{
hasMore
:
false
,
page
:
1
,
size
:
PAGE_SIZE
,
searchVal
:
{
star
:
null
,
dealTimeStart
:
null
,
dealTimeEnd
:
null
,
memberName
:
null
,
},
receivedList
:
{
data
:
[],
totalCount
:
0
},
loading
:
false
,
};
}
componentDidMount
()
{
this
.
getRecordList
().
then
(
res
=>
{
const
{
page
,
size
}
=
this
.
state
;
this
.
setState
({
hasMore
:
checkMore
(
page
,
size
,
res
.
data
.
length
,
res
.
totalCount
),
receivedList
:
res
,
});
});
};
// 获取列表数据
getRecordList
=
():
Promise
<
RecordRes
>
=>
{
const
{
fetchList
}
=
this
.
props
;
if
(
!
fetchList
)
{
return
Promise
.
reject
();
}
this
.
setState
({
loading
:
true
});
return
new
Promise
((
resolve
,
reject
)
=>
{
const
{
searchVal
,
page
,
size
}
=
this
.
state
;
const
{
dealTimeStart
,
dealTimeEnd
}
=
searchVal
;
fetchList
({
...
searchVal
,
dealTimeStart
:
dealTimeStart
?
moment
(
+
dealTimeStart
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
:
null
,
dealTimeEnd
:
dealTimeEnd
?
moment
(
+
dealTimeEnd
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
:
null
,
current
:
`
${
page
}
`
,
pageSize
:
`
${
size
}
`
,
}).
then
(
res
=>
{
resolve
(
res
);
}).
catch
(
err
=>
{
reject
(
err
);
}).
finally
(()
=>
{
this
.
setState
({
loading
:
false
});
});
});
};
// 查询列表
handleSearch
=
values
=>
{
this
.
setState
({
page
:
1
,
receivedList
:
{
data
:
[],
totalCount
:
0
,
},
searchVal
:
values
,
},
()
=>
{
const
{
page
,
size
}
=
this
.
state
;
this
.
getRecordList
().
then
(
res
=>
{
this
.
setState
({
receivedList
:
res
,
hasMore
:
checkMore
(
page
,
size
,
res
.
data
.
length
,
res
.
totalCount
),
});
});
});
};
// 加载更多
handleLoadMore
=
()
=>
{
const
{
hasMore
,
loading
}
=
this
.
state
;
if
(
!
hasMore
||
loading
)
{
return
;
}
this
.
setState
((
prevState
)
=>
({
size
:
prevState
.
size
+
1
,
}));
this
.
getRecordList
().
then
(
res
=>
{
const
{
receivedList
,
page
,
size
}
=
this
.
state
;
this
.
setState
({
receivedList
:
{
...
receivedList
,
data
:
receivedList
.
data
.
concat
(
res
.
data
),
},
hasMore
:
checkMore
(
page
,
size
,
res
.
data
.
length
,
res
.
totalCount
),
});
});
};
handlePaginationChange
=
(
current
:
number
,
pageSize
:
number
|
undefined
)
=>
{
this
.
setState
({
page
:
current
,
size
:
pageSize
,
},
()
=>
{
this
.
getRecordList
().
then
(
res
=>
{
const
{
page
,
size
}
=
this
.
state
;
this
.
setState
({
receivedList
:
res
,
hasMore
:
checkMore
(
page
,
size
,
res
.
data
.
length
,
res
.
totalCount
),
});
});
});
};
handleCheck
=
record
=>
{
const
{
onCheck
}
=
this
.
props
;
if
(
onCheck
)
{
onCheck
(
record
);
}
};
handleEdit
=
record
=>
{
const
{
onEdit
}
=
this
.
props
;
if
(
onEdit
)
{
onEdit
(
record
);
}
};
render
()
{
const
{
paginationType
=
'pagination'
,
searchable
=
true
,
opposite
=
true
,
editable
=
false
,
viewable
=
false
,
}
=
this
.
props
;
const
{
page
,
size
,
loading
,
receivedList
,
hasMore
}
=
this
.
state
;
return
(
<>
{
searchable
&&
(
<
NiceForm
actions=
{
formActions
}
onSubmit=
{
this
.
handleSearch
}
effects=
{
(
$
,
actions
)
=>
{
}
}
schema=
{
searchSchema
}
/>
)
}
<
Spin
spinning=
{
paginationType
===
'pagination'
&&
loading
}
>
<
ul
className=
{
styles
.
record
}
style=
{
{
minHeight
:
loading
?
69
:
'auto'
,
}
}
>
{
receivedList
.
data
.
map
((
item
,
index
)
=>
(
<
li
className=
{
styles
[
'record-item'
]
}
key=
{
index
}
>
<
div
className=
{
styles
[
'record-item-good'
]
}
>
<
div
className=
{
styles
[
'record-item-good-name'
]
}
>
{
item
.
productName
}
</
div
>
<
div
>
<
span
className=
{
styles
[
'record-item-good-price'
]
}
>
¥
{
item
.
price
}
</
span
>
<
span
className=
{
styles
[
'record-item-good-desc'
]
}
>
X
{
item
.
quantity
}
</
span
>
</
div
>
</
div
>
<
div
className=
{
styles
[
'record-item-extra'
]
}
>
<
div
className=
{
styles
[
'record-item-extra-item'
]
}
>
<
div
className=
{
styles
[
'record-item-extra-item-label'
]
}
>
交易时间:
</
div
>
<
div
className=
{
styles
[
'record-item-extra-item-control'
]
}
>
{
item
.
created
?
moment
(
item
.
created
).
format
(
'YYYY-MM-DD HH:mm:ss'
)
:
''
}
</
div
>
</
div
>
<
div
className=
{
styles
[
'record-item-extra-item'
]
}
>
<
div
className=
{
styles
[
'record-item-extra-item-label'
]
}
>
{
opposite
?
'评价方'
:
'被评价方'
}
:
</
div
>
<
div
className=
{
styles
[
'record-item-extra-item-control'
]
}
>
{
item
.
target
}
</
div
>
</
div
>
</
div
>
<
div
className=
{
styles
[
'record-item-comment'
]
}
>
<
Rate
value=
{
item
.
star
}
disabled
/>
<
div
className=
{
styles
[
'record-item-comment-main'
]
}
title=
{
item
.
comment
}
>
{
item
.
comment
}
</
div
>
</
div
>
<
div
className=
{
styles
[
'record-item-actions'
]
}
>
{
editable
&&
(
<
Button
type=
"link"
onClick=
{
()
=>
this
.
handleEdit
(
item
)
}
>
编辑
</
Button
>
)
}
{
viewable
&&
(
<
Button
type=
"link"
onClick=
{
()
=>
this
.
handleCheck
(
item
)
}
>
查看
</
Button
>
)
}
</
div
>
</
li
>
))
}
</
ul
>
</
Spin
>
{
paginationType
===
'button'
?
(
<>
{
(
hasMore
&&
!
loading
)
&&
(
<
div
style=
{
{
padding
:
'24px 0'
,
textAlign
:
'center'
,
}
}
>
<
Button
onClick=
{
this
.
handleLoadMore
}
>
查看更多评论
</
Button
>
</
div
>
)
}
{
loading
&&
(
<
div
style=
{
{
padding
:
'24px 0'
,
textAlign
:
'center'
,
}
}
>
<
Spin
/>
</
div
>
)
}
</>
)
:
(
<>
{
receivedList
.
data
.
length
>
0
&&
(
<
div
style=
{
{
padding
:
'24px 0'
,
textAlign
:
'right'
,
}
}
>
<
Pagination
current=
{
page
}
pageSize=
{
size
}
total=
{
receivedList
.
totalCount
}
onChange=
{
this
.
handlePaginationChange
}
/>
</
div
>
)
}
</>
)
}
{
(
!
receivedList
.
data
.
length
&&
!
loading
)
&&
(
<
div
style=
{
{
textAlign
:
'center'
}
}
>
暂无数据~
</
div
>
)
}
</>
);
};
};
\ No newline at end of file
src/pages/comment/query/detailed/schema/index.ts
→
src/pages/comment/query/detailed/
components/RecordList/
schema/index.ts
View file @
ff6064b7
/*
* @Author: XieZhiXiong
* @Date: 2020-
09-22 20:34:49
* @Date: 2020-
10-19 18:08:51
* @LastEditors: XieZhiXiong
* @LastEditTime: 2020-
09-22 20:52:53
* @LastEditTime: 2020-
10-21 13:58:50
* @Description:
*/
import
{
ISchema
}
from
'@formily/antd'
;
...
...
@@ -19,7 +19,28 @@ export const searchSchema: ISchema = {
properties
:
{
star
:
{
type
:
'string'
,
enum
:
[],
enum
:
[
{
label
:
'一星'
,
value
:
1
,
},
{
label
:
'二星'
,
value
:
2
,
},
{
label
:
'三星'
,
value
:
3
,
},
{
label
:
'四星'
,
value
:
4
,
},
{
label
:
'五星'
,
value
:
5
,
},
],
'x-component-props'
:
{
placeholder
:
'评论星级'
,
allowClear
:
true
,
...
...
@@ -28,7 +49,7 @@ export const searchSchema: ISchema = {
},
},
},
'[
startDate, endDate
]'
:
{
'[
dealTimeStart, dealTimeEnd
]'
:
{
type
:
'string'
,
default
:
''
,
'x-component'
:
'dateSelect'
,
...
...
@@ -40,7 +61,7 @@ export const searchSchema: ISchema = {
},
},
},
n
ame
:
{
memberN
ame
:
{
type
:
'string'
,
'x-component'
:
'Search'
,
'x-component-props'
:
{
...
...
src/pages/comment/query/detailed/index.tsx
View file @
ff6064b7
import
React
from
'react'
;
import
React
,
{
useState
,
useEffect
}
from
'react'
;
import
{
Tabs
,
Row
,
Col
,
Button
}
from
'antd'
;
import
{
createFormActions
}
from
'@formily/antd'
;
import
{
history
}
from
'umi'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
{
isJSONStr
}
from
'@/utils'
;
import
MellowCard
from
'@/components/MellowCard'
;
import
PolymericTable
from
'@/components/PolymericTable'
;
import
{
EditableColumns
}
from
'@/components/PolymericTable/interface'
;
import
{
Pie
}
from
'@/components/Charts'
;
import
Mood
from
'@/components/Mood'
;
import
NiceForm
from
'@/components/NiceForm'
;
import
{
searchSchema
}
from
'./schema'
;
import
Shelves
from
'./components/Shelves'
;
import
RecordList
from
'./components/RecordList'
;
import
RecordList
,
{
ListParams
,
RecordRes
}
from
'./components/RecordList'
;
import
styles
from
'./index.less'
;
const
{
TabPane
}
=
Tabs
;
const
receivedFormActions
=
createFormActions
();
interface
EstimateSumItems
{
id
?:
number
,
title
?:
JSX
.
Element
,
star
?:
number
,
last7days
?:
number
,
last30days
?:
number
,
last180days
?:
number
,
before180days
?:
number
,
sum
?:
number
,
};
const
CommentDetailed
:
React
.
FC
=
()
=>
{
const
[
evaluateSum
,
setEvaluateSum
]
=
useState
<
EstimateSumItems
[]
>
([]);
const
[
evaluatePie
,
setEvaluatePie
]
=
useState
<
{
x
:
string
,
y
:
number
}[]
>
([]);
const
summaryEvaluate
=
(
items
:
EstimateSumItems
[]):
EstimateSumItems
[]
=>
{
// 顺序写死的 1:表示好评,2:表示中评,3:表示差评
// 根据 1、2星级为差评,3星级为中评,4、5星级为好评往里边塞数据
const
source
=
items
||
[];
const
ret
=
[
{
id
:
1
,
title
:
(<
Mood
type=
"smile"
/>),
},
{
id
:
2
,
title
:
(<
Mood
type=
"notBad"
/>),
},
{
id
:
3
,
title
:
(<
Mood
type=
"sad"
/>),
},
];
for
(
let
i
=
0
;
i
<
source
.
length
;
i
++
)
{
const
item
=
source
[
i
];
const
{
star
,
...
rest
}
=
item
;
let
target
=
{};
switch
(
item
.
star
)
{
case
1
:
case
2
:
{
target
=
ret
[
0
];
break
;
}
case
3
:
{
target
=
ret
[
1
];
break
;
}
case
4
:
case
5
:
{
target
=
ret
[
2
];
break
;
}
default
:
break
;
}
if
(
!
target
)
{
continue
;
}
// 大于 2 表示已经添加过一次数据,之后就累加上去,否则直接赋值
if
(
Object
.
keys
(
target
).
length
<=
2
)
{
target
=
Object
.
assign
(
target
,
rest
);
}
else
{
for
(
const
key
in
target
)
{
if
(
!
Object
.
prototype
.
hasOwnProperty
.
call
(
target
,
key
))
{
continue
;
}
// 排除 id、title 固定的 key
if
(
key
!==
'id'
&&
key
!==
'title'
)
{
target
[
key
]
+=
item
[
key
];
}
}
}
}
return
ret
;
};
// 取得评价统计 Pie 饼图数据
const
getSummaryEvaluatePie
=
(
data
:
EstimateSumItems
[])
=>
{
const
source
=
data
||
[];
const
count
=
source
.
reduce
((
pre
,
now
:
any
)
=>
now
.
sum
+
pre
,
0
);
const
good
=
source
[
0
]
&&
source
[
0
].
sum
?
source
[
0
].
sum
:
0
;
const
notBad
=
source
[
1
]
&&
source
[
1
].
sum
?
source
[
1
].
sum
:
0
;
const
bad
=
source
[
2
]
&&
source
[
2
].
sum
?
source
[
2
].
sum
:
0
;
const
ret
=
[
{
x
:
`好评
${
count
>
0
?
(
good
/
count
*
100
).
toFixed
(
2
)
:
'0'
}
%`
,
y
:
good
,
},
{
x
:
`中评
${
count
>
0
?
(
notBad
/
count
*
100
).
toFixed
(
2
)
:
0
}
%`
,
y
:
notBad
,
},
{
x
:
`差评
${
count
>
0
?
(
bad
/
count
*
100
).
toFixed
(
2
)
:
0
}
%`
,
y
:
bad
,
},
];
return
ret
;
};
// 获取评价汇总
const
getTradeSummary
=
()
=>
{
PublicApi
.
getMemberPlatformCommentCountSupplyTradeSummary
().
then
(
res
=>
{
if
(
res
.
code
===
1000
)
{
const
evaluate
=
summaryEvaluate
(
res
.
data
.
rows
);
const
evaluatePieData
=
getSummaryEvaluatePie
(
evaluate
);
setEvaluateSum
(
evaluate
);
setEvaluatePie
(
evaluatePieData
);
}
});
};
// 获取评价记录
const
getTradeHistory
=
(
params
:
ListParams
):
Promise
<
RecordRes
>
=>
{
const
{
star
,
...
rest
}
=
params
;
return
new
Promise
((
resolve
,
reject
)
=>
{
PublicApi
.
getMemberPlatformCommentCountSupplyTradeHistoryPage
({
...
rest
,
starLevel
:
params
.
star
,
}).
then
(
res
=>
{
if
(
res
.
code
===
1000
)
{
const
{
data
,
totalCount
}
=
res
.
data
;
resolve
({
data
:
data
.
map
(
item
=>
{
const
product
=
isJSONStr
(
item
.
product
)
||
{};
return
{
id
:
item
.
id
,
star
:
item
.
star
,
comment
:
item
.
comment
,
productName
:
product
.
productName
||
''
,
price
:
product
.
price
,
quantity
:
product
.
purchaseCount
,
created
:
item
.
createTime
,
target
:
item
.
byMemberName
,
orderId
:
product
.
orderId
,
};
}),
totalCount
,
});
}
reject
(
res
.
data
);
}).
catch
(
err
=>
{
reject
(
err
);
});
});
};
const
evaluateColumns
:
EditableColumns
[]
=
[
{
title
:
' '
,
...
...
@@ -45,47 +199,9 @@ const CommentDetailed: React.FC = () => {
},
];
const
evaluatePie
=
[
{
x
:
`好评 30%`
,
y
:
100
,
},
{
x
:
`中评 20%`
,
y
:
50
,
},
{
x
:
`差评 10%`
,
y
:
10
,
},
];
const
evaluate
=
[
{
id
:
1
,
title
:
(<
Mood
type=
"smile"
/>),
last7days
:
10
,
last30days
:
20
,
last180days
:
30
,
before180days
:
30
,
},
{
id
:
2
,
title
:
(<
Mood
type=
"notBad"
/>),
last7days
:
10
,
last30days
:
20
,
last180days
:
30
,
before180days
:
30
,
},
{
id
:
3
,
title
:
(<
Mood
type=
"sad"
/>),
last7days
:
10
,
last30days
:
20
,
last180days
:
30
,
before180days
:
30
,
},
];
useEffect
(()
=>
{
getTradeSummary
();
},
[]);
return
(
<
MellowCard
...
...
@@ -113,10 +229,10 @@ const CommentDetailed: React.FC = () => {
<
Col
flex=
"auto"
>
<
PolymericTable
dataSource=
{
evaluate
}
dataSource=
{
evaluate
Sum
}
columns=
{
evaluateColumns
}
loading=
{
false
}
pagination=
{
null
}
pagination=
{
false
}
rowClassName=
{
()
=>
styles
[
'record-row'
]
}
/>
</
Col
>
...
...
@@ -124,30 +240,13 @@ const CommentDetailed: React.FC = () => {
</
Shelves
>
<
Shelves
title=
"评价记录"
>
<
RecordList
list=
{
[]
}
/>
<
div
style=
{
{
padding
:
'24px 0'
,
textAlign
:
'center'
,
}
}
>
<
Button
>
查看更多评论
</
Button
>
</
div
>
<
RecordList
fetchList=
{
getTradeHistory
}
paginationType=
"button"
searchable=
{
false
}
/>
</
Shelves
>
</
TabPane
>
<
TabPane
tab=
"收到的评价"
key=
"2"
>
<
NiceForm
actions=
{
receivedFormActions
}
onSubmit=
{
values
=>
{}
}
effects=
{
(
$
,
actions
)
=>
{
}
}
schema=
{
searchSchema
}
/>
<
RecordList
list=
{
[]
}
/>
</
TabPane
>
</
Tabs
>
</
MellowCard
>
);
...
...
src/pages/comment/query/index.tsx
View file @
ff6064b7
...
...
@@ -7,6 +7,7 @@ import { createFormActions } from '@formily/antd';
import
{
useStateFilterSearchLinkageEffect
}
from
'@/formSchema/effects/useFilterSearch'
;
import
{
FORM_FILTER_PATH
}
from
'@/formSchema/const'
;
import
{
useAsyncInitSelect
}
from
'@/formSchema/effects/useAsyncInitSelect'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
{
Link
}
from
'umi'
;
import
EyePreview
from
'@/components/EyePreview'
;
import
NiceForm
from
'@/components/NiceForm'
;
...
...
@@ -55,7 +56,7 @@ const CommentQuery = () => {
align
:
'center'
,
render
:
(
text
,
record
)
=>
(
<
EyePreview
url=
{
`/comment/query/detail
ed
`
}
url=
{
`/comment/query/detail`
}
>
{
text
}
</
EyePreview
>
...
...
@@ -102,9 +103,23 @@ const CommentQuery = () => {
];
const
fetchListData
=
(
params
:
any
)
=>
{
return
Promise
.
resolve
({
total
:
2
,
data
:
mock
,
// return new Promise((resolve, reject) => {
// PublicApi.getMemberPlatformCommentOrderTradeHistoryPage(params)
// .then(res => {
// if (res.code === 1000) {
// resolve(res.data);
// }
// reject();
// })
// .catch(() => {
// reject();
// });
// });
return
new
Promise
((
resolve
,
reject
)
=>
{
resolve
({
data
:
mock
,
totalCount
:
2
,
});
});
};
...
...
src/pages/comment/query/schema/index.tsx
View file @
ff6064b7
...
...
@@ -75,62 +75,4 @@ export const listSearchSchema: ISchema = {
},
},
},
};
export
const
evaluateSchema
:
ISchema
=
{
type
:
'object'
,
properties
:
{
comments
:
{
type
:
'array'
,
'x-component'
:
'EvaluationList'
,
default
:
[
{
name
:
'杰尼'
,
age
:
24
,
small
:
1
,
},
],
items
:
{
type
:
'object'
,
properties
:
{
MEGA_LADYOUT
:
{
type
:
'object'
,
'x-component'
:
'Mega-Layout'
,
'x-component-props'
:
{
labelCol
:
6
,
labelAlign
:
'left'
,
},
properties
:
{
star
:
{
title
:
'满意程度'
,
required
:
true
,
'x-component'
:
'Rating'
,
'x-component-props'
:
{
allowHalf
:
false
,
},
},
comment
:
{
type
:
'string'
,
title
:
'评价'
,
required
:
true
,
'x-component'
:
'TextArea'
,
'x-component-props'
:
{
rows
:
4
,
},
},
picture
:
{
type
:
'string'
,
title
:
'图片'
,
required
:
true
,
'x-component'
:
'CustomUpload'
,
'x-component-props'
:
{
},
},
},
},
},
},
},
},
};
\ No newline at end of file
src/utils/index.ts
View file @
ff6064b7
...
...
@@ -304,6 +304,38 @@ export function normalizeFiledata(url: any): any {
};
};
/**
* 检查是否还有更多
* @param {Number} curPage 当前页码
* @param {Number} curSize 当前页数
* @param {Number} dataLen 当前数据长度
* @param {Number} dataTotal 数据总长度
*/
export
const
checkMore
=
(
curPage
:
number
,
curSize
:
number
,
dataLen
:
number
,
dataTotal
:
number
)
=>
{
let
hasMore
=
true
;
if
(
!
dataLen
||
dataLen
+
(
curPage
-
1
)
*
curSize
>=
+
dataTotal
)
{
hasMore
=
false
;
}
return
hasMore
;
};
/**
*
* @param {string} str 需要判断是否是 JSON字符串的 字符串
*/
export
const
isJSONStr
=
str
=>
{
if
(
typeof
str
===
'string'
)
{
try
{
const
complete
=
JSON
.
parse
(
str
);
return
complete
;
}
catch
(
e
)
{
return
null
;
}
}
return
str
;
}
export
default
{
isArray
,
isObject
,
...
...
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