Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 3e8bc470
由
zshaohui
编写于
2022-12-14 15:01:49 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1.内仓出入库白夜班报表修改
2.手动出库增加料箱查找出库 3.内仓喂料报表,增加楼层选择
1 个父辈
73004c2a
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
168 行增加
和
27 行删除
src/main/java/com/neotel/smfcore/common/utils/DateUtil.java
src/main/java/com/neotel/smfcore/core/report/ReportController.java
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
src/main/java/com/neotel/smfcore/core/storage/rest/query/StoragePosFindCriteria.java
src/main/java/com/neotel/smfcore/core/system/service/manager/IDataLogManager.java
src/main/java/com/neotel/smfcore/core/system/service/manager/impl/DataLogManagerImpl.java
src/main/java/com/neotel/smfcore/custom/lizhen/report/inner/InnerReportController.java
src/main/resources/config/application.yml
src/main/java/com/neotel/smfcore/common/utils/DateUtil.java
查看文件 @
3e8bc47
...
@@ -160,6 +160,21 @@ public class DateUtil {
...
@@ -160,6 +160,21 @@ public class DateUtil {
return
c
.
getTime
();
return
c
.
getTime
();
}
}
/**
* 添加小时
* @param date 日期
* @param hours 小时
* @return
*/
public
static
Date
addHours
(
Date
date
,
int
hours
)
{
Calendar
c
=
Calendar
.
getInstance
();
c
.
setTime
(
date
);
c
.
add
(
Calendar
.
HOUR_OF_DAY
,
hours
);
return
c
.
getTime
();
}
public
static
Date
getMinDate
(
Date
date0
,
Date
date1
){
public
static
Date
getMinDate
(
Date
date0
,
Date
date1
){
return
date0
.
before
(
date1
)?
date0
:
date1
;
return
date0
.
before
(
date1
)?
date0
:
date1
;
}
}
...
...
src/main/java/com/neotel/smfcore/core/report/ReportController.java
查看文件 @
3e8bc47
package
com
.
neotel
.
smfcore
.
core
.
report
;
package
com
.
neotel
.
smfcore
.
core
.
report
;
import
com.neotel.smfcore.common.utils.DateUtil
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.common.utils.SecurityUtils
;
import
com.neotel.smfcore.core.device.enums.OP
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.core.report.bean.ChartItem
;
import
com.neotel.smfcore.core.report.bean.ChartItem
;
import
com.neotel.smfcore.core.report.rest.dto.InoutDataDto
;
import
com.neotel.smfcore.core.report.rest.dto.InoutDataDto
;
...
@@ -12,6 +14,7 @@ import com.neotel.smfcore.core.report.rest.query.ReportQuery;
...
@@ -12,6 +14,7 @@ import com.neotel.smfcore.core.report.rest.query.ReportQuery;
import
com.neotel.smfcore.core.storage.bean.UsageItem
;
import
com.neotel.smfcore.core.storage.bean.UsageItem
;
import
com.neotel.smfcore.core.storage.service.manager.IStorageManager
;
import
com.neotel.smfcore.core.storage.service.manager.IStorageManager
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.storage.service.po.Storage
;
import
com.neotel.smfcore.core.system.service.manager.IDataLogManager
;
import
com.neotel.smfcore.security.service.manager.IGroupManager
;
import
com.neotel.smfcore.security.service.manager.IGroupManager
;
import
com.neotel.smfcore.security.service.manager.IUserManager
;
import
com.neotel.smfcore.security.service.manager.IUserManager
;
import
com.neotel.smfcore.security.service.po.Group
;
import
com.neotel.smfcore.security.service.po.Group
;
...
@@ -26,6 +29,8 @@ import org.springframework.web.bind.annotation.GetMapping;
...
@@ -26,6 +29,8 @@ import org.springframework.web.bind.annotation.GetMapping;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.*
;
@Slf4j
@Slf4j
...
@@ -49,6 +54,9 @@ public class ReportController {
...
@@ -49,6 +54,9 @@ public class ReportController {
@Autowired
@Autowired
DataCache
dataCache
;
DataCache
dataCache
;
@Autowired
private
IDataLogManager
dataLogManager
;
@ApiOperation
(
"获取出入库数据"
)
@ApiOperation
(
"获取出入库数据"
)
@GetMapping
(
value
=
"/inOutData"
)
@GetMapping
(
value
=
"/inOutData"
)
@PreAuthorize
(
"@el.check('inOutData')"
)
@PreAuthorize
(
"@el.check('inOutData')"
)
...
@@ -123,4 +131,58 @@ public class ReportController {
...
@@ -123,4 +131,58 @@ public class ReportController {
}
}
return
groupDtos
;
return
groupDtos
;
}
}
@ApiOperation
(
"获取白夜班出入库数据"
)
@GetMapping
(
value
=
"/dayNightInOutData"
)
public
InoutDataDto
dayNightInOutData
(
ReportQuery
query
)
throws
ParseException
{
Date
date
=
query
.
getUpdateDate
().
getFrom
();
if
(
date
==
null
)
{
date
=
new
Date
();
}
String
format
=
"yyyy-MM-dd HH:mm:ss"
;
String
initFormat
=
"yyyy-MM-dd"
;
String
dayStartTime
=
" 07:00:00"
;
date
=
initDate
(
date
,
initFormat
,
format
,
dayStartTime
);
//得到白班的开始与结束时间
Date
dayStartDate
=
DateUtil
.
addHours
(
date
,
-
8
);
Date
dayEndDate
=
DateUtil
.
addHours
(
dayStartDate
,
12
);
//得到白班的入库数据
int
dayInCount
=
dataLogManager
.
getInOutDate
(
dayStartDate
,
dayEndDate
,
OP
.
PUT_IN
,
query
.
getPn
());
//得到白班的出库库数据
int
dayOutCount
=
dataLogManager
.
getInOutDate
(
dayStartDate
,
dayEndDate
,
OP
.
CHECKOUT
,
query
.
getPn
());
//得到夜班的开始与结束时间
Date
nightStartDate
=
dayEndDate
;
Date
nightEndDate
=
DateUtil
.
addHours
(
nightStartDate
,
12
);
//得到夜班班的入库数据
int
nightInCount
=
dataLogManager
.
getInOutDate
(
nightStartDate
,
nightEndDate
,
OP
.
PUT_IN
,
query
.
getPn
());
//得到白班的出库库数据
int
nightOutCount
=
dataLogManager
.
getInOutDate
(
nightStartDate
,
nightEndDate
,
OP
.
CHECKOUT
,
query
.
getPn
());
//构造返回数据
List
<
String
>
labelList
=
new
ArrayList
<>();
labelList
.
add
(
"白班"
);
labelList
.
add
(
"夜班"
);
List
<
Integer
>
putInValueList
=
new
ArrayList
<>();
putInValueList
.
add
(
dayInCount
);
putInValueList
.
add
(
nightInCount
);
List
<
Integer
>
checkOutValueList
=
new
ArrayList
<>();
checkOutValueList
.
add
(
dayOutCount
);
checkOutValueList
.
add
(
nightOutCount
);
InoutDataDto
inoutDataDto
=
new
InoutDataDto
();
inoutDataDto
.
setLabelList
(
labelList
);
inoutDataDto
.
setPutInValueList
(
putInValueList
);
inoutDataDto
.
setCheckOutValueList
(
checkOutValueList
);
return
inoutDataDto
;
}
private
Date
initDate
(
Date
date
,
String
initFormat
,
String
format
,
String
startTime
)
throws
ParseException
{
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
initFormat
);
String
dateStr
=
sdf
.
format
(
date
);
dateStr
=
dateStr
+
startTime
;
sdf
=
new
SimpleDateFormat
(
format
);
return
sdf
.
parse
(
dateStr
);
}
}
}
src/main/java/com/neotel/smfcore/core/storage/rest/StoragePosController.java
查看文件 @
3e8bc47
...
@@ -204,7 +204,7 @@ public class StoragePosController {
...
@@ -204,7 +204,7 @@ public class StoragePosController {
// QisdaApi.ClearStockBy(storagePos.getPosName());
// QisdaApi.ClearStockBy(storagePos.getPosName());
Barcode
barcode
=
storagePos
.
getBarcode
();
Barcode
barcode
=
storagePos
.
getBarcode
();
if
(
barcode
!=
null
)
{
if
(
barcode
!=
null
)
{
barcode
=
barcodeManager
.
get
(
barcode
.
getId
());
barcode
=
barcodeManager
.
findByBarcode
(
barcode
.
getBarcode
());
log
.
info
(
"清理库位["
+
storagePos
.
getPosName
()
+
"]中的库存"
+
barcode
.
getBarcode
());
log
.
info
(
"清理库位["
+
storagePos
.
getPosName
()
+
"]中的库存"
+
barcode
.
getBarcode
());
String
opUser
=
SecurityUtils
.
getCurrentUsername
();
String
opUser
=
SecurityUtils
.
getCurrentUsername
();
log
.
info
(
opUser
+
"清理库位["
+
storagePos
.
getPosName
()
+
"]中的库存"
+
barcode
.
getBarcode
());
log
.
info
(
opUser
+
"清理库位["
+
storagePos
.
getPosName
()
+
"]中的库存"
+
barcode
.
getBarcode
());
...
@@ -371,7 +371,12 @@ public class StoragePosController {
...
@@ -371,7 +371,12 @@ public class StoragePosController {
if
(
StringUtils
.
isBlank
(
stationName
))
{
if
(
StringUtils
.
isBlank
(
stationName
))
{
return
ResultBean
.
newErrorResult
(-
1
,
""
,
"请选择对应的工位"
);
return
ResultBean
.
newErrorResult
(-
1
,
""
,
"请选择对应的工位"
);
}
}
if
(
StringUtils
.
isBlank
(
partNumber
)
&&
StringUtils
.
isBlank
(
provider
)
&&
StringUtils
.
isBlank
(
batch
)
&&
StringUtils
.
isBlank
(
dateCode
)
&&
StringUtils
.
isBlank
(
warehouseCode
))
{
if
(
StringUtils
.
isBlank
(
partNumber
)
&&
StringUtils
.
isBlank
(
provider
)
&&
StringUtils
.
isBlank
(
batch
)
&&
StringUtils
.
isBlank
(
dateCode
)
&&
StringUtils
.
isBlank
(
warehouseCode
)
&&
StringUtils
.
isBlank
(
box
))
{
return
ResultBean
.
newErrorResult
(-
1
,
""
,
"请核实查询条件是否为空"
);
return
ResultBean
.
newErrorResult
(-
1
,
""
,
"请核实查询条件是否为空"
);
}
}
Query
query
=
getPosFindCriteria
(
criteria
);
Query
query
=
getPosFindCriteria
(
criteria
);
...
...
src/main/java/com/neotel/smfcore/core/storage/rest/query/StoragePosFindCriteria.java
查看文件 @
3e8bc47
...
@@ -100,6 +100,7 @@ public class StoragePosFindCriteria {
...
@@ -100,6 +100,7 @@ public class StoragePosFindCriteria {
private
String
warehouseCode
;
private
String
warehouseCode
;
@ApiModelProperty
(
"料箱号"
)
@ApiModelProperty
(
"料箱号"
)
@QueryCondition
(
propName
=
"barcode.barcode"
)
private
String
box
;
private
String
box
;
public
int
getComponentType
(){
public
int
getComponentType
(){
...
...
src/main/java/com/neotel/smfcore/core/system/service/manager/IDataLogManager.java
查看文件 @
3e8bc47
...
@@ -3,8 +3,11 @@ package com.neotel.smfcore.core.system.service.manager;
...
@@ -3,8 +3,11 @@ package com.neotel.smfcore.core.system.service.manager;
import
com.neotel.smfcore.common.base.IBaseManager
;
import
com.neotel.smfcore.common.base.IBaseManager
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
public
interface
IDataLogManager
extends
IBaseManager
<
DataLog
>
{
public
interface
IDataLogManager
extends
IBaseManager
<
DataLog
>
{
List
<
DataLog
>
findUnFinishedTasks
();
List
<
DataLog
>
findUnFinishedTasks
();
int
getInOutDate
(
Date
startDate
,
Date
endDate
,
int
type
,
String
partNumber
);
}
}
src/main/java/com/neotel/smfcore/core/system/service/manager/impl/DataLogManagerImpl.java
查看文件 @
3e8bc47
...
@@ -6,6 +6,7 @@ import com.neotel.smfcore.core.device.enums.OP_STATUS;
...
@@ -6,6 +6,7 @@ import com.neotel.smfcore.core.device.enums.OP_STATUS;
import
com.neotel.smfcore.core.system.service.dao.IDataLogDao
;
import
com.neotel.smfcore.core.system.service.dao.IDataLogDao
;
import
com.neotel.smfcore.core.system.service.manager.IDataLogManager
;
import
com.neotel.smfcore.core.system.service.manager.IDataLogManager
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
com.neotel.smfcore.core.system.service.po.DataLog
;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Criteria
;
...
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Service;
...
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Service;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Calendar
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
@Service
@Service
...
@@ -63,4 +65,16 @@ public class DataLogManagerImpl implements IDataLogManager {
...
@@ -63,4 +65,16 @@ public class DataLogManagerImpl implements IDataLogManager {
}
}
return
unFinishedTasks
;
return
unFinishedTasks
;
}
}
@Override
public
int
getInOutDate
(
Date
startDate
,
Date
endDate
,
int
type
,
String
partNumber
)
{
Query
query
=
new
Query
();
Criteria
criteria
=
new
Criteria
().
andOperator
(
Criteria
.
where
(
"updateDate"
).
gte
(
startDate
),
Criteria
.
where
(
"updateDate"
).
lt
(
endDate
)).
and
(
"type"
).
is
(
type
);
criteria
.
and
(
"status"
).
in
(
OP_STATUS
.
END
.
name
(),
OP_STATUS
.
FINISHED
.
name
());
if
(
Strings
.
isNotBlank
(
partNumber
))
{
criteria
.
and
(
"partNumber"
).
is
(
partNumber
);
}
return
dataLogDao
.
countByQuery
(
query
.
addCriteria
(
criteria
));
}
}
}
src/main/java/com/neotel/smfcore/custom/lizhen/report/inner/InnerReportController.java
查看文件 @
3e8bc47
...
@@ -17,6 +17,7 @@ import com.neotel.smfcore.security.annotation.AnonymousAccess;
...
@@ -17,6 +17,7 @@ import com.neotel.smfcore.security.annotation.AnonymousAccess;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Criteria
;
import
org.springframework.data.mongodb.core.query.Query
;
import
org.springframework.data.mongodb.core.query.Query
;
...
@@ -32,6 +33,15 @@ import java.util.stream.Collectors;
...
@@ -32,6 +33,15 @@ import java.util.stream.Collectors;
@RestController
@RestController
public
class
InnerReportController
{
public
class
InnerReportController
{
@Value
(
"${lizhen.F2.name}"
)
private
String
F2
;
@Value
(
"${lizhen.F3.name}"
)
private
String
F3
;
@Value
(
"${lizhen.F5.name}"
)
private
String
F5
;
@Autowired
@Autowired
private
ILiteOrderManager
liteOrderManager
;
private
ILiteOrderManager
liteOrderManager
;
...
@@ -45,12 +55,8 @@ public class InnerReportController {
...
@@ -45,12 +55,8 @@ public class InnerReportController {
private
OrderMapper
orderMapper
;
private
OrderMapper
orderMapper
;
@Autowired
@Autowired
private
TaskService
taskService
;
@Autowired
private
DataCache
dataCache
;
private
DataCache
dataCache
;
@ApiOperation
(
"喂料"
)
@ApiOperation
(
"喂料"
)
@RequestMapping
(
"/feeding"
)
@RequestMapping
(
"/feeding"
)
//@AnonymousAccess
//@AnonymousAccess
...
@@ -91,23 +97,39 @@ public class InnerReportController {
...
@@ -91,23 +97,39 @@ public class InnerReportController {
return
ResultBean
.
newOkResult
(
orderItemMapper
.
toDto
(
orderItems
));
return
ResultBean
.
newOkResult
(
orderItemMapper
.
toDto
(
orderItems
));
}
}
@ApiOperation
(
"楼层下拉"
)
@RequestMapping
(
"floorPullDown"
)
@AnonymousAccess
public
ResultBean
floorPullDown
(){
Map
<
String
,
String
>
resultMap
=
new
LinkedHashMap
<>();
resultMap
.
put
(
F2
,
F2
);
resultMap
.
put
(
F3
,
F3
);
resultMap
.
put
(
F5
,
F5
);
return
ResultBean
.
newOkResult
(
resultMap
);
}
@ApiOperation
(
"线别下拉"
)
@ApiOperation
(
"线别下拉"
)
@RequestMapping
(
"linePullDown"
)
@RequestMapping
(
"linePullDown"
)
//
@AnonymousAccess
@AnonymousAccess
public
ResultBean
linePullDown
()
{
public
ResultBean
linePullDown
(
String
floor
)
{
//得到每一个楼层的线体
//得到每一个楼层的线体
String
f2Line
=
dataCache
.
getCache
(
"F2Line"
).
toString
();
String
f2Line
=
dataCache
.
getCache
(
"F2Line"
).
toString
();
String
f3Line
=
dataCache
.
getCache
(
"F3Line"
).
toString
();
String
f3Line
=
dataCache
.
getCache
(
"F3Line"
).
toString
();
String
f5Line
=
dataCache
.
getCache
(
"F5Line"
).
toString
();
String
f5Line
=
dataCache
.
getCache
(
"F5Line"
).
toString
();
Map
<
String
,
String
>
resultMap
=
new
LinkedHashMap
<>();
String
resultLine
=
""
;
for
(
String
line
:
f2Line
.
split
(
","
))
{
if
(
F2
.
equals
(
floor
))
{
resultMap
.
put
(
line
,
line
);
resultLine
=
f2Line
;
}
}
else
if
(
F3
.
equals
(
floor
))
{
for
(
String
line
:
f3Line
.
split
(
","
))
{
resultLine
=
f3Line
;
resultMap
.
put
(
line
,
line
);
}
else
if
(
F5
.
equals
(
floor
))
{
resultLine
=
f5Line
;
}
else
{
resultLine
=
f2Line
+
","
+
f3Line
+
","
+
f5Line
;
}
}
for
(
String
line
:
f5Line
.
split
(
","
))
{
Map
<
String
,
String
>
resultMap
=
new
LinkedHashMap
<>();
resultMap
.
put
(
line
,
line
);
for
(
String
line
:
resultLine
.
split
(
","
))
{
resultMap
.
put
(
line
,
line
);
}
}
return
ResultBean
.
newOkResult
(
resultMap
);
return
ResultBean
.
newOkResult
(
resultMap
);
}
}
...
...
src/main/resources/config/application.yml
查看文件 @
3e8bc47
...
@@ -2,11 +2,31 @@ server:
...
@@ -2,11 +2,31 @@ server:
port
:
8800
port
:
8800
api
:
api
:
#name: Neotel
name
:
Lizhen
#inCheckUrl:
inCheckUrl
:
#http://172.30.170.148:8001/Npm/WmsCheckReelfob #禁用料
#outNotifyUrl: https://matlabel-tool.com:4434/SMD_BOXAPI/OutBox
outNotifyUrl
:
#http://172.30.70.187:8082/SmtAutoWH/Save2DReelInfo #保存物料(外仓配置)
#inNotifyUrl: https://matlabel-tool.com:4434/SMD_BOXAPI/InBox
inNotifyUrl
:
#http://172.30.170.148:8082/SmtAutoWH/Save2DReelInfo #保存物料(内仓配置)
fetchOrderUrl
:
#http://172.30.170.148:8082/SmtAutoWH/GetWoPickingList #获取工单
barcodeInfoUrl
:
#http://172.30.170.148:8001/Sct/GetReelInfo #mes数量
fetchGRUrl
:
#http://10.42.25.18:8082/api/wcs/fetchGR #gr标签
brandQtyUrl
:
#http://10.42.25.18:8082/api/wcs/brandQty #gr标签满卷数
plant
:
W337
werks
:
W337
#缺料预警对应的地址
lizhen
:
F2
:
name
:
2F
line
:
A05-2FSMT-16S,A05-2FSMT-17S,A05-2FSMT-06S,A05-2FSMT-07S
url
:
#http://172.30.88.19:8001/smf-core/api/Mes/machineCallMaterial
F3
:
name
:
3F
line
:
A05-3FSMT-04S,A05-3FSMT-14S,A05-3FSMT-15S,A05-3FSMT-05S
url
:
#http://172.30.97.99:8001/smf-core/api/Mes/machineCallMaterial
F5
:
name
:
5F
line
:
A05-5FSMT-13S,A05-5FSMT-03S
#,A05-5FARF-06,A05-5FSMT-01S,A05-5FSMT-11S,A05-5FSMT-02S,A05-5FSMT-12S
url
:
#http://172.30.97.63:8001/smf-core/api/Mes/machineCallMaterial
# 文件存储路径
# 文件存储路径
file
:
file
:
...
@@ -22,10 +42,10 @@ spring:
...
@@ -22,10 +42,10 @@ spring:
jackson
:
jackson
:
time-zone
:
GMT+8
time-zone
:
GMT+8
data
:
data
:
mongodb
:
mongodb
:
host
:
localhost
# 主机地址
host
:
localhost
# 主机地址
port
:
27017
# 端口
port
:
27017
# 端口
database
:
smf
# 数据库
database
:
smf
# 数据库
messages
:
messages
:
encoding
:
utf-8
encoding
:
utf-8
main
:
main
:
...
@@ -41,6 +61,5 @@ app:
...
@@ -41,6 +61,5 @@ app:
type
:
"
"
type
:
"
"
menu
:
menu
:
show
:
show
:
#workOrder,menu,feeding
hide
:
hide
:
\ No newline at end of file
\ No newline at end of file
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论