Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
basic-api-boot
概览
概览
详情
活动
周期分析
版本库
存储库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Basic
basic-api-boot
Commits
7773af7b
提交
7773af7b
authored
5月 06, 2022
作者:
Administrator
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat : 播报设备,图标基本功能实现
上级
35c83a1b
隐藏空白字符变更
内嵌
并排
正在显示
17 个修改的文件
包含
1155 行增加
和
0 行删除
+1155
-0
Broadcast.java
.../main/java/com/yiring/app/domain/broadcast/Broadcast.java
+73
-0
BroadcastRepository.java
.../com/yiring/app/domain/broadcast/BroadcastRepository.java
+15
-0
Icon.java
app/src/main/java/com/yiring/app/domain/icon/Icon.java
+67
-0
IconRepository.java
.../main/java/com/yiring/app/domain/icon/IconRepository.java
+14
-0
BroadcastExportExcel.java
.../com/yiring/app/excel/broadcast/BroadcastExportExcel.java
+43
-0
BroadcastImportExcel.java
.../com/yiring/app/excel/broadcast/BroadcastImportExcel.java
+44
-0
BroadcastParam.java
...n/java/com/yiring/app/param/broadcast/BroadcastParam.java
+55
-0
BroadcastQueryParam.java
...a/com/yiring/app/param/broadcast/BroadcastQueryParam.java
+42
-0
IconParam.java
app/src/main/java/com/yiring/app/param/icon/IconParam.java
+46
-0
BroadcastService.java
...va/com/yiring/app/service/broadcast/BroadcastService.java
+87
-0
BroadcastServiceImpl.java
...ring/app/service/broadcast/impl/BroadcastServiceImpl.java
+309
-0
IconService.java
...rc/main/java/com/yiring/app/service/icon/IconService.java
+49
-0
IconServiceImpl.java
...ava/com/yiring/app/service/icon/impl/IconServiceImpl.java
+97
-0
BroadcastVo.java
...rc/main/java/com/yiring/app/vo/broadcast/BroadcastVo.java
+43
-0
IconVo.java
app/src/main/java/com/yiring/app/vo/icon/IconVo.java
+17
-0
BroadcastController.java
...ava/com/yiring/app/web/broadcast/BroadcastController.java
+93
-0
IconController.java
...src/main/java/com/yiring/app/web/icon/IconController.java
+61
-0
没有找到文件。
app/src/main/java/com/yiring/app/domain/broadcast/Broadcast.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
domain
.
broadcast
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.time.LocalDateTime
;
import
javax.persistence.Entity
;
import
javax.persistence.GeneratedValue
;
import
javax.persistence.Id
;
import
javax.persistence.Table
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
import
lombok.experimental.FieldNameConstants
;
import
org.hibernate.annotations.Comment
;
import
org.hibernate.annotations.CreationTimestamp
;
import
org.hibernate.annotations.GenericGenerator
;
import
org.hibernate.annotations.UpdateTimestamp
;
import
org.hibernate.snowflake.SnowflakeId
;
import
org.locationtech.jts.geom.Point
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 17:06
*/
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@Comment
(
"播报设备表"
)
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
@Entity
@Table
(
name
=
"BS_BROADCAST"
)
public
class
Broadcast
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
2856845594409003209L
;
@Comment
(
"编号"
)
@Id
@GeneratedValue
(
generator
=
SnowflakeId
.
GENERATOR
)
@GenericGenerator
(
name
=
SnowflakeId
.
GENERATOR
,
strategy
=
SnowflakeId
.
Strategy
.
LONG
)
Long
id
;
@Comment
(
"播报设备编号"
)
String
broadcastNum
;
@Comment
(
"播报设备名称"
)
String
broadcastName
;
@Comment
(
"坐标点信息"
)
Point
point
;
@Comment
(
"播报设备地址"
)
String
broadcastAdd
;
@Comment
(
"备注"
)
String
remark
;
@Comment
(
"是否启用"
)
String
status
;
@Comment
(
"创建时间"
)
@CreationTimestamp
LocalDateTime
createTime
;
@Comment
(
"修改时间"
)
@UpdateTimestamp
LocalDateTime
updateTime
;
}
app/src/main/java/com/yiring/app/domain/broadcast/BroadcastRepository.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
domain
.
broadcast
;
import
java.io.Serializable
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
import
org.springframework.stereotype.Repository
;
/**
* @author tzl
* 2022/5/5 17:13
*/
@Repository
public
interface
BroadcastRepository
extends
JpaRepository
<
Broadcast
,
Serializable
>,
JpaSpecificationExecutor
<
Broadcast
>
{}
app/src/main/java/com/yiring/app/domain/icon/Icon.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
domain
.
icon
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.time.LocalDateTime
;
import
javax.persistence.Entity
;
import
javax.persistence.GeneratedValue
;
import
javax.persistence.Id
;
import
javax.persistence.Table
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
import
lombok.experimental.FieldNameConstants
;
import
org.hibernate.annotations.Comment
;
import
org.hibernate.annotations.GenericGenerator
;
import
org.hibernate.snowflake.SnowflakeId
;
/**
*
* @author tzl
* @version 1.0
* @description: 图标
* @date 2022/4/29 11:08
*/
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
@Entity
@Table
(
name
=
"BS_ICON"
)
@Comment
(
"图标"
)
public
class
Icon
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
7848846860889883431L
;
@Comment
(
"编号"
)
@Id
@GeneratedValue
(
generator
=
SnowflakeId
.
GENERATOR
)
@GenericGenerator
(
name
=
SnowflakeId
.
GENERATOR
,
strategy
=
SnowflakeId
.
Strategy
.
LONG
)
Long
id
;
@Comment
(
"图标名称"
)
String
iconName
;
@Comment
(
"图标类型"
)
String
iconType
;
@Comment
(
"图标分类"
)
String
iconSort
;
@Comment
(
"在线图标"
)
String
iconOnline
;
@Comment
(
"离线图标"
)
String
iconOffline
;
@Comment
(
"创建时间"
)
LocalDateTime
createTime
;
@Comment
(
"修改时间"
)
LocalDateTime
updateTime
;
}
app/src/main/java/com/yiring/app/domain/icon/IconRepository.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
domain
.
icon
;
import
java.io.Serializable
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
import
org.springframework.stereotype.Repository
;
/**
* @author tzl
* 2022/4/29 13:49
*/
@Repository
public
interface
IconRepository
extends
JpaRepository
<
Icon
,
Serializable
>,
JpaSpecificationExecutor
<
Icon
>
{}
app/src/main/java/com/yiring/app/excel/broadcast/BroadcastExportExcel.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
excel
.
broadcast
;
import
com.github.liaochong.myexcel.core.annotation.ExcelColumn
;
import
com.github.liaochong.myexcel.core.annotation.ExcelModel
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
import
org.locationtech.jts.geom.Point
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/6 9:04
*/
@ExcelModel
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
BroadcastExportExcel
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
2342047029622668894L
;
@ExcelColumn
(
title
=
"编号"
,
width
=
10
)
String
broadcastNum
;
@ExcelColumn
(
title
=
"设备名称"
,
width
=
10
)
String
broadcastName
;
@ExcelColumn
(
title
=
"坐标点信息(经度,纬度)"
,
width
=
10
)
Point
point
;
@ExcelColumn
(
title
=
"音柱地址"
,
width
=
10
)
String
broadcastAdd
;
@ExcelColumn
(
title
=
"备注"
,
width
=
15
)
String
remark
;
}
app/src/main/java/com/yiring/app/excel/broadcast/BroadcastImportExcel.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
excel
.
broadcast
;
import
com.github.liaochong.myexcel.core.annotation.ExcelColumn
;
import
com.github.liaochong.myexcel.core.annotation.ExcelModel
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
/**
* @author tzl
* 2022/5/6 09:12
*/
@ExcelModel
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
BroadcastImportExcel
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
5422685189135254189L
;
@ExcelColumn
(
title
=
"编号"
)
String
broadcastNum
;
@ExcelColumn
(
title
=
"设备名称"
)
String
broadcastName
;
@ExcelColumn
(
title
=
"经度"
)
double
lon
;
@ExcelColumn
(
title
=
"纬度"
)
double
lat
;
@ExcelColumn
(
title
=
"音柱地址"
)
String
broadcastAdd
;
@ExcelColumn
(
title
=
"备注"
)
String
remark
;
// String status;
}
app/src/main/java/com/yiring/app/param/broadcast/BroadcastParam.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
param
.
broadcast
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
javax.validation.constraints.NotEmpty
;
import
javax.validation.constraints.NotNull
;
import
javax.validation.constraints.Size
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
/**
* 播报设备入参
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 17:14
*/
@ApiModel
(
"BroadcastParam"
)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
BroadcastParam
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
-
2629601722942495674L
;
@ApiModelProperty
(
value
=
"编号"
,
example
=
"1"
,
required
=
true
)
@NotNull
(
message
=
"编号"
)
String
broadcastNum
;
@ApiModelProperty
(
value
=
"经度"
,
example
=
"1.00"
,
required
=
true
)
@NotNull
(
message
=
"经度"
)
Double
lon
;
@ApiModelProperty
(
value
=
"纬度"
,
example
=
"1.00"
,
required
=
true
)
@NotNull
(
message
=
"纬度"
)
Double
lat
;
@ApiModelProperty
(
value
=
"备注"
,
example
=
"厂区喇叭"
)
@Size
(
max
=
100
,
message
=
"备注不能超过100字"
)
String
remark
;
@ApiModelProperty
(
value
=
"音柱地址"
,
example
=
"音柱地址"
,
required
=
true
)
@NotEmpty
(
message
=
"音柱地址不能为空"
)
String
broadcastAdd
;
@ApiModelProperty
(
value
=
"播报设备地址名称"
,
example
=
"喇叭1"
,
required
=
true
)
@NotEmpty
(
message
=
"播报设备地址名称不能为空"
)
String
broadcastName
;
}
app/src/main/java/com/yiring/app/param/broadcast/BroadcastQueryParam.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
param
.
broadcast
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 17:22
*/
@ApiModel
(
"BroadcastQueryParam"
)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
BroadcastQueryParam
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
-
7181714985511069309L
;
@ApiModelProperty
(
value
=
"编号"
,
example
=
"1"
)
String
broadcastNum
;
@ApiModelProperty
(
value
=
"播报设备地址名称"
,
example
=
"喇叭1"
)
String
broadcastName
;
@ApiModelProperty
(
value
=
"状态"
,
example
=
"1"
)
String
status
;
@ApiModelProperty
(
value
=
"分页条数"
,
example
=
"10"
,
required
=
true
)
Integer
pageSize
;
@ApiModelProperty
(
value
=
"当前页数"
,
example
=
"1"
,
required
=
true
)
Integer
pageNo
;
}
app/src/main/java/com/yiring/app/param/icon/IconParam.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
param
.
icon
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
javax.validation.constraints.NotEmpty
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 9:30
*/
@ApiModel
(
"IconParam"
)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
IconParam
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
666028441935810972L
;
@ApiModelProperty
(
value
=
"图标名称"
,
example
=
"访客头像"
,
required
=
true
)
@NotEmpty
(
message
=
"图标名称不能为空"
)
String
iconName
;
@ApiModelProperty
(
value
=
"图标类型"
,
example
=
"1"
,
required
=
true
)
@NotEmpty
(
message
=
"图标类型不能为空"
)
String
iconType
;
@ApiModelProperty
(
value
=
"图标分类"
,
example
=
"1"
,
required
=
true
)
@NotEmpty
(
message
=
"图标类型不能为空"
)
String
iconSort
;
@ApiModelProperty
(
value
=
"在线图标地址"
,
required
=
true
)
String
iconOnline
;
@ApiModelProperty
(
value
=
"离线图标地址"
,
required
=
true
)
String
iconOffline
;
}
app/src/main/java/com/yiring/app/service/broadcast/BroadcastService.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
service
.
broadcast
;
import
com.yiring.app.param.broadcast.BroadcastParam
;
import
com.yiring.app.param.broadcast.BroadcastQueryParam
;
import
com.yiring.app.vo.broadcast.BroadcastVo
;
import
com.yiring.common.core.Result
;
import
com.yiring.common.param.IdParam
;
import
com.yiring.common.param.IndexParam
;
import
com.yiring.common.vo.PageVo
;
import
javax.servlet.http.HttpServletResponse
;
import
org.locationtech.jts.geom.Point
;
import
org.springframework.web.multipart.MultipartFile
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 17:31
*/
public
interface
BroadcastService
{
/**
* 新增播报设备
* @author tzl
* @date 2022/5/5 17:33
* @param broadcastParam BroadcastParam
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result
<
String
>
saveBroadcast
(
BroadcastParam
broadcastParam
);
/**
* 修改播报设备
* @author tzl
* @date 2022/5/5 17:34
* @param broadcastParam BroadcastParam
* @param idParam IdParam
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result
<
String
>
updateBroadcast
(
BroadcastParam
broadcastParam
,
IdParam
idParam
);
/**
* 删除播报设备
* @author tzl
* @date 2022/5/5 17:35
* @param idParam IdParam
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result
<
String
>
deleteBroadcast
(
IdParam
idParam
);
/**
* 查看设备位置
* @author tzl
* @date 2022/5/5 17:47
* @param idParam IdParam
* @return com.yiring.common.core.Result<org.locationtech.jts.geom.Point>
*/
Result
<
Point
>
selectPoint
(
IdParam
idParam
);
/**
* 分页查询设备
* @author tzl
* @date 2022/5/5 17:49
* @param broadcastQueryParam BroadcastQueryParam
* @return com.yiring.common.core.Result<com.yiring.app.vo.broadcast.BroadcastVo>
*/
Result
<
PageVo
<
BroadcastVo
>>
pageBroadcast
(
BroadcastQueryParam
broadcastQueryParam
);
/**
* 导出播报设备
* @author tzl
* @date 2022/5/6 8:56
* @param broadcastQueryParam BroadcastQueryParam
* @param response HttpServletResponse
*/
void
exportBroadcast
(
BroadcastQueryParam
broadcastQueryParam
,
HttpServletResponse
response
);
/**
* 播报设备导入
* @author tzl
* @date 2022/5/6 10:00
* @param file 文件
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result
<
String
>
importBroadcast
(
MultipartFile
file
);
/**
* 根据名字检索
* @author tzl
* @date 2022/5/6 10:26
* @param indexParam 入参
* @return com.yiring.common.core.Result<com.yiring.common.vo.PageVo<com.yiring.app.vo.broadcast.BroadcastVo>>
*/
Result
<
PageVo
<
BroadcastVo
>>
selectBroadcastName
(
IndexParam
indexParam
);
}
app/src/main/java/com/yiring/app/service/broadcast/impl/BroadcastServiceImpl.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
service
.
broadcast
.
impl
;
import
cn.hutool.core.util.StrUtil
;
import
com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder
;
import
com.github.liaochong.myexcel.core.SaxExcelReader
;
import
com.yiring.app.domain.broadcast.Broadcast
;
import
com.yiring.app.domain.broadcast.BroadcastRepository
;
import
com.yiring.app.excel.broadcast.BroadcastExportExcel
;
import
com.yiring.app.excel.broadcast.BroadcastImportExcel
;
import
com.yiring.app.param.broadcast.BroadcastParam
;
import
com.yiring.app.param.broadcast.BroadcastQueryParam
;
import
com.yiring.app.service.broadcast.BroadcastService
;
import
com.yiring.app.util.GeoUtils
;
import
com.yiring.app.vo.broadcast.BroadcastVo
;
import
com.yiring.common.core.Result
;
import
com.yiring.common.core.Status
;
import
com.yiring.common.param.IdParam
;
import
com.yiring.common.param.IndexParam
;
import
com.yiring.common.vo.PageVo
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.net.URLEncoder
;
import
java.nio.charset.StandardCharsets
;
import
java.time.LocalDateTime
;
import
java.util.*
;
import
java.util.concurrent.Executors
;
import
java.util.stream.Collectors
;
import
javax.annotation.Resource
;
import
javax.persistence.criteria.Predicate
;
import
javax.servlet.http.HttpServletResponse
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.locationtech.jts.geom.Point
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.data.domain.*
;
import
org.springframework.data.jpa.domain.Specification
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.web.multipart.MultipartFile
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 17:32
*/
@Slf4j
@Transactional
(
rollbackFor
=
RuntimeException
.
class
)
@Service
public
class
BroadcastServiceImpl
implements
BroadcastService
{
@Resource
BroadcastRepository
broadcastRepository
;
@Override
public
Result
<
String
>
saveBroadcast
(
BroadcastParam
broadcastParam
)
{
if
(
has
(
broadcastParam
.
getBroadcastNum
()))
{
return
Result
.
no
(
Status
.
BAD_REQUEST
,
"播报设备编号已存在"
);
}
Broadcast
broadcast
=
new
Broadcast
();
BeanUtils
.
copyProperties
(
broadcastParam
,
broadcast
);
broadcast
.
setPoint
(
GeoUtils
.
createPoint
(
broadcastParam
.
getLon
(),
broadcastParam
.
getLat
()));
broadcastRepository
.
saveAndFlush
(
broadcast
);
return
Result
.
ok
();
}
@Override
public
Result
<
String
>
updateBroadcast
(
BroadcastParam
broadcastParam
,
IdParam
idParam
)
{
Optional
<
Broadcast
>
byId
=
broadcastRepository
.
findById
(
idParam
.
getId
());
if
(
byId
.
isEmpty
())
{
return
Result
.
no
(
Status
.
NOT_FOUND
);
}
Broadcast
broadcast
=
byId
.
get
();
if
(!
broadcast
.
getBroadcastNum
().
equals
(
broadcastParam
.
getBroadcastNum
()))
{
if
(
has
(
broadcastParam
.
getBroadcastNum
()))
{
return
Result
.
no
(
Status
.
BAD_REQUEST
,
"播报设备编号已存在"
);
}
}
BeanUtils
.
copyProperties
(
broadcastParam
,
broadcast
);
broadcast
.
setPoint
(
GeoUtils
.
createPoint
(
broadcastParam
.
getLon
(),
broadcastParam
.
getLat
()));
broadcastRepository
.
saveAndFlush
(
broadcast
);
return
Result
.
ok
();
}
@Override
public
Result
<
String
>
deleteBroadcast
(
IdParam
idParam
)
{
Optional
<
Broadcast
>
byId
=
broadcastRepository
.
findById
(
idParam
.
getId
());
if
(
byId
.
isEmpty
())
{
return
Result
.
no
(
Status
.
NOT_FOUND
);
}
Broadcast
broadcast
=
byId
.
get
();
broadcastRepository
.
delete
(
broadcast
);
return
Result
.
ok
();
}
@Override
public
Result
<
Point
>
selectPoint
(
IdParam
idParam
)
{
Optional
<
Broadcast
>
byId
=
broadcastRepository
.
findById
(
idParam
.
getId
());
if
(
byId
.
isEmpty
())
{
return
Result
.
no
(
Status
.
NOT_FOUND
);
}
Broadcast
broadcast
=
byId
.
get
();
return
Result
.
ok
(
broadcast
.
getPoint
());
}
@Override
public
Result
<
PageVo
<
BroadcastVo
>>
pageBroadcast
(
BroadcastQueryParam
broadcastQueryParam
)
{
PageVo
<
BroadcastVo
>
resultVo
;
//排序
Sort
sort
=
Sort
.
by
(
Sort
.
Order
.
desc
(
Broadcast
.
Fields
.
updateTime
));
if
(
Objects
.
nonNull
(
broadcastQueryParam
.
getPageNo
())
&&
Objects
.
nonNull
(
broadcastQueryParam
.
getPageSize
()))
{
//分页
Pageable
pageable
=
PageRequest
.
of
(
broadcastQueryParam
.
getPageNo
()
-
1
,
broadcastQueryParam
.
getPageSize
());
Page
<
Broadcast
>
all
=
broadcastRepository
.
findAll
(
condition
(
broadcastQueryParam
),
pageable
);
List
<
BroadcastVo
>
data
=
all
.
get
()
.
map
(
invitation
->
{
BroadcastVo
vo
=
new
BroadcastVo
();
BeanUtils
.
copyProperties
(
invitation
,
vo
);
return
vo
;
})
.
collect
(
Collectors
.
toList
());
resultVo
=
PageVo
.
build
(
data
,
all
.
getTotalElements
());
}
else
{
List
<
Broadcast
>
all
=
broadcastRepository
.
findAll
(
condition
(
broadcastQueryParam
),
sort
);
List
<
BroadcastVo
>
data
=
all
.
stream
()
.
map
(
invitation
->
{
BroadcastVo
vo
=
new
BroadcastVo
();
BeanUtils
.
copyProperties
(
invitation
,
vo
);
return
vo
;
})
.
collect
(
Collectors
.
toList
());
resultVo
=
PageVo
.
build
(
data
,
data
.
size
());
}
return
Result
.
ok
(
resultVo
);
}
@Override
public
Result
<
String
>
importBroadcast
(
MultipartFile
file
)
{
if
(
file
.
isEmpty
())
{
throw
new
RuntimeException
(
"请选择文件"
);
}
List
<
BroadcastImportExcel
>
broadcastImportExcels
;
try
(
InputStream
inputStream
=
file
.
getInputStream
())
{
broadcastImportExcels
=
SaxExcelReader
.
of
(
BroadcastImportExcel
.
class
)
.
rowFilter
(
row
->
row
.
getRowNum
()
>
0
)
.
ignoreBlankRow
()
.
read
(
inputStream
);
}
catch
(
IOException
e
)
{
log
.
info
(
e
.
getMessage
());
throw
new
RuntimeException
(
"文件导入异常"
);
}
List
<
Broadcast
>
broadcasts
=
broadcastImportExcels
.
stream
()
.
map
(
broadcastImportExcel
->
{
Broadcast
broadcast
=
new
Broadcast
();
BeanUtils
.
copyProperties
(
broadcastImportExcel
,
broadcast
);
broadcast
.
setPoint
(
GeoUtils
.
createPoint
(
broadcastImportExcel
.
getLon
(),
broadcastImportExcel
.
getLat
()));
broadcast
.
setCreateTime
(
LocalDateTime
.
now
());
return
broadcast
;
})
.
toList
();
//检查是否有编号重复的数据
if
(
broadcasts
!=
null
)
{
broadcasts
.
forEach
(
broadcast
->
broadcastRepository
.
findOne
((
root
,
cq
,
cb
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
if
(
StrUtil
.
isNotBlank
(
broadcast
.
getBroadcastNum
()))
{
predicates
.
add
(
cb
.
equal
(
root
.
get
(
Broadcast
.
Fields
.
broadcastNum
).
as
(
String
.
class
),
broadcast
.
getBroadcastNum
()
)
);
}
return
cq
.
where
(
predicates
.
toArray
(
new
Predicate
[
0
])).
getRestriction
();
})
.
ifPresent
(
one
->
{
//如果存在则操作修改
broadcast
.
setId
(
one
.
getId
());
})
);
//根据编号去重
broadcasts
=
broadcasts
.
stream
()
.
collect
(
Collectors
.
collectingAndThen
(
Collectors
.
toCollection
(()
->
new
TreeSet
<>(
Comparator
.
comparing
(
Broadcast:
:
getBroadcastNum
))
),
ArrayList:
:
new
)
);
broadcastRepository
.
saveAllAndFlush
(
broadcasts
);
}
return
Result
.
ok
();
}
@Override
public
Result
<
PageVo
<
BroadcastVo
>>
selectBroadcastName
(
IndexParam
indexParam
)
{
Sort
sort
=
Sort
.
by
(
Sort
.
Order
.
desc
(
Broadcast
.
Fields
.
updateTime
));
List
<
Broadcast
>
all
=
broadcastRepository
.
findAll
(
condition
(
BroadcastQueryParam
.
builder
().
broadcastName
(
indexParam
.
getStr
()).
build
()),
sort
);
List
<
BroadcastVo
>
data
=
all
.
stream
()
.
map
(
invitation
->
{
BroadcastVo
vo
=
new
BroadcastVo
();
BeanUtils
.
copyProperties
(
invitation
,
vo
);
return
vo
;
})
.
collect
(
Collectors
.
toList
());
PageVo
<
BroadcastVo
>
resultVo
=
PageVo
.
build
(
data
,
data
.
size
());
return
Result
.
ok
(
resultVo
);
}
@Override
public
void
exportBroadcast
(
BroadcastQueryParam
broadcastQueryParam
,
HttpServletResponse
response
)
{
List
<
Broadcast
>
broadcasts
=
broadcastRepository
.
findAll
(
condition
(
broadcastQueryParam
));
List
<
BroadcastExportExcel
>
broadcastExportExcels
=
broadcasts
.
stream
()
.
map
(
broadcast
->
{
BroadcastExportExcel
broadcastExportExcel
=
new
BroadcastExportExcel
();
BeanUtils
.
copyProperties
(
broadcast
,
broadcastExportExcel
);
return
broadcastExportExcel
;
})
.
toList
();
try
(
DefaultStreamExcelBuilder
<
BroadcastExportExcel
>
defaultStreamExcelBuilder
=
DefaultStreamExcelBuilder
.
of
(
BroadcastExportExcel
.
class
)
.
threadPool
(
Executors
.
newFixedThreadPool
(
2
))
.
rowHeight
(
14
)
.
titleRowHeight
(
14
)
.
widths
(
8
)
.
style
(
"cell->vertical-align:center;text-align:center"
,
"title->vertical-align:center;text-align:center;font-weight:bold;font-family:等线"
)
.
start
()
)
{
defaultStreamExcelBuilder
.
append
(
broadcastExportExcels
);
String
fileName
=
URLEncoder
.
encode
(
"播报信息信息.xlsx"
,
StandardCharsets
.
UTF_8
);
response
.
setContentType
(
"application/octet-stream"
);
response
.
setHeader
(
"Content-Disposition"
,
"attachment;filename="
+
fileName
);
OutputStream
out
=
response
.
getOutputStream
();
Workbook
workbook
=
defaultStreamExcelBuilder
.
fixedTitles
().
build
();
workbook
.
write
(
out
);
workbook
.
close
();
out
.
flush
();
out
.
close
();
}
catch
(
Exception
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
throw
new
RuntimeException
(
"导出播报信息信息失败: "
+
e
.
getMessage
());
}
}
public
Specification
<
Broadcast
>
condition
(
BroadcastQueryParam
broadcastQueryParam
)
{
return
(
root
,
query
,
criteriaBuilder
)
->
{
List
<
Predicate
>
list
=
new
ArrayList
<>();
if
(
StrUtil
.
isNotBlank
(
broadcastQueryParam
.
getBroadcastName
()))
{
list
.
add
(
criteriaBuilder
.
like
(
root
.
get
(
Broadcast
.
Fields
.
broadcastName
).
as
(
String
.
class
),
"%"
+
broadcastQueryParam
.
getBroadcastName
()
+
"%"
)
);
}
if
(
StrUtil
.
isNotBlank
(
broadcastQueryParam
.
getBroadcastNum
()))
{
list
.
add
(
criteriaBuilder
.
like
(
root
.
get
(
Broadcast
.
Fields
.
broadcastNum
).
as
(
String
.
class
),
"%"
+
broadcastQueryParam
.
getBroadcastNum
()
+
"%"
)
);
}
if
(
StrUtil
.
isNotBlank
(
broadcastQueryParam
.
getStatus
()))
{
list
.
add
(
criteriaBuilder
.
like
(
root
.
get
(
Broadcast
.
Fields
.
status
).
as
(
String
.
class
),
"%"
+
broadcastQueryParam
.
getStatus
()
+
"%"
)
);
}
Predicate
[]
predicates
=
new
Predicate
[
list
.
size
()];
query
.
where
(
list
.
toArray
(
predicates
));
return
criteriaBuilder
.
and
(
list
.
toArray
(
predicates
));
};
}
boolean
has
(
String
param
)
{
Broadcast
broadcast
=
Broadcast
.
builder
().
broadcastNum
(
param
).
build
();
return
broadcastRepository
.
count
(
Example
.
of
(
broadcast
))
>
0
;
}
}
app/src/main/java/com/yiring/app/service/icon/IconService.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
service
.
icon
;
import
com.yiring.app.param.icon.IconParam
;
import
com.yiring.app.vo.icon.IconVo
;
import
com.yiring.common.core.Result
;
import
com.yiring.common.param.IdParam
;
import
com.yiring.common.param.PageParam
;
import
com.yiring.common.vo.PageVo
;
/**
* @author tzl
* @date 2022/5/5 9:28
*/
public
interface
IconService
{
/**
* 图标新增接口
* @author tzl
* @date 2022/5/5 10:03
* @param iconParam IconParam
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result
<
String
>
saveIcon
(
IconParam
iconParam
);
/**
* 图标删除接口
* @author tzl
* @date 2022/5/5 10:23
* @param idParam IdParam
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result
<
String
>
deleteIcon
(
IdParam
idParam
);
/**
* 图标修改接口
* @author tzl
* @date 2022/5/5 10:26
* @param iconParam IconParam
* @param idParam IdParam
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result
<
String
>
updateIcon
(
IconParam
iconParam
,
IdParam
idParam
);
/**
* 分页查询
* @author tzl
* @date 2022/5/5 15:09
* @param pageParam PageParam
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result
<
PageVo
<
IconVo
>>
pageIcon
(
PageParam
pageParam
);
}
app/src/main/java/com/yiring/app/service/icon/impl/IconServiceImpl.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
service
.
icon
.
impl
;
import
com.yiring.app.domain.icon.Icon
;
import
com.yiring.app.domain.icon.IconRepository
;
import
com.yiring.app.param.icon.IconParam
;
import
com.yiring.app.service.icon.IconService
;
import
com.yiring.app.vo.icon.IconVo
;
import
com.yiring.common.core.Result
;
import
com.yiring.common.core.Status
;
import
com.yiring.common.param.IdParam
;
import
com.yiring.common.param.PageParam
;
import
com.yiring.common.vo.PageVo
;
import
java.util.List
;
import
java.util.Optional
;
import
java.util.stream.Collectors
;
import
javax.annotation.Resource
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.data.domain.*
;
import
org.springframework.stereotype.Service
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 9:28
*/
@Service
public
class
IconServiceImpl
implements
IconService
{
@Resource
IconRepository
iconRepository
;
@Override
public
Result
<
String
>
saveIcon
(
IconParam
iconParam
)
{
if
(
hasIconName
(
iconParam
.
getIconName
()))
{
return
Result
.
no
(
Status
.
BAD_REQUEST
,
"图标名称已存在"
);
}
Icon
icon
=
new
Icon
();
BeanUtils
.
copyProperties
(
iconParam
,
icon
);
iconRepository
.
saveAndFlush
(
icon
);
return
Result
.
ok
();
}
@Override
public
Result
<
String
>
deleteIcon
(
IdParam
idParam
)
{
Optional
<
Icon
>
optional
=
iconRepository
.
findById
(
idParam
.
getId
());
if
(
optional
.
isEmpty
())
{
return
Result
.
no
(
Status
.
NOT_FOUND
);
}
Icon
icon
=
optional
.
get
();
iconRepository
.
delete
(
icon
);
return
Result
.
ok
();
}
@Override
public
Result
<
String
>
updateIcon
(
IconParam
iconParam
,
IdParam
idParam
)
{
Optional
<
Icon
>
optional
=
iconRepository
.
findById
(
idParam
.
getId
());
if
(
optional
.
isEmpty
())
{
return
Result
.
no
(
Status
.
NOT_FOUND
);
}
Icon
icon
=
optional
.
get
();
//当修改图标名称时
if
(!
icon
.
getIconName
().
equals
(
iconParam
.
getIconName
()))
{
if
(
hasIconName
(
iconParam
.
getIconName
()))
{
return
Result
.
no
(
Status
.
BAD_REQUEST
,
"图标名称已存在"
);
}
}
BeanUtils
.
copyProperties
(
iconParam
,
icon
);
iconRepository
.
saveAndFlush
(
icon
);
return
Result
.
ok
();
}
@Override
public
Result
<
PageVo
<
IconVo
>>
pageIcon
(
PageParam
pageParam
)
{
//分页
Pageable
pageable
=
PageRequest
.
of
(
pageParam
.
getPageNo
()
-
1
,
pageParam
.
getPageSize
());
Page
<
Icon
>
all
=
iconRepository
.
findAll
(
pageable
);
List
<
IconVo
>
data
=
all
.
get
()
.
map
(
icon
->
{
IconVo
vo
=
new
IconVo
();
BeanUtils
.
copyProperties
(
icon
,
vo
);
return
vo
;
})
.
collect
(
Collectors
.
toList
());
PageVo
<
IconVo
>
resultVo
=
PageVo
.
build
(
data
,
all
.
getTotalElements
());
return
Result
.
ok
(
resultVo
);
}
public
boolean
hasIconName
(
String
param
)
{
Icon
icon
=
Icon
.
builder
().
iconName
(
param
).
build
();
long
count
=
iconRepository
.
count
(
Example
.
of
(
icon
));
return
count
>
0
;
}
}
app/src/main/java/com/yiring/app/vo/broadcast/BroadcastVo.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
vo
.
broadcast
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
import
org.locationtech.jts.geom.Point
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 17:26
*/
@ApiModel
(
"BroadcastVo"
)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
BroadcastVo
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
2927556677143859520L
;
@ApiModelProperty
(
value
=
"编号"
,
example
=
"1"
)
String
broadcastNum
;
@ApiModelProperty
(
value
=
"坐标点信息"
)
Point
point
;
@ApiModelProperty
(
value
=
"备注"
,
example
=
"厂区喇叭"
)
String
remark
;
@ApiModelProperty
(
value
=
"音柱地址"
,
example
=
"音柱地址"
)
String
broadcastAdd
;
@ApiModelProperty
(
value
=
"播报设备地址名称"
,
example
=
"喇叭1"
)
String
broadcastName
;
}
app/src/main/java/com/yiring/app/vo/icon/IconVo.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
vo
.
icon
;
import
java.io.Serial
;
import
java.io.Serializable
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 15:10
*/
public
class
IconVo
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
2334297671118394950L
;
}
app/src/main/java/com/yiring/app/web/broadcast/BroadcastController.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
web
.
broadcast
;
import
com.yiring.app.param.broadcast.BroadcastParam
;
import
com.yiring.app.param.broadcast.BroadcastQueryParam
;
import
com.yiring.app.service.broadcast.BroadcastService
;
import
com.yiring.app.vo.broadcast.BroadcastVo
;
import
com.yiring.common.core.Result
;
import
com.yiring.common.param.IdParam
;
import
com.yiring.common.param.IndexParam
;
import
com.yiring.common.vo.PageVo
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiOperation
;
import
javax.annotation.Resource
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.validation.Valid
;
import
lombok.extern.slf4j.Slf4j
;
import
org.locationtech.jts.geom.Point
;
import
org.springframework.http.MediaType
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.multipart.MultipartFile
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/6 10:15
*/
@Slf4j
@Validated
@Api
(
tags
=
"Broadcast(播报设备管理)"
)
@RestController
@RequestMapping
(
"/broadcast/"
)
public
class
BroadcastController
{
@Resource
BroadcastService
broadcastService
;
@ApiOperation
(
value
=
"新增设备信息"
)
@PostMapping
(
"saveBroadcast"
)
public
Result
<
String
>
saveBroadcast
(
@Valid
BroadcastParam
broadcastParam
)
{
return
broadcastService
.
saveBroadcast
(
broadcastParam
);
}
@ApiOperation
(
value
=
"删除设备信息"
)
@PostMapping
(
"deleteBroadcast"
)
public
Result
<
String
>
deleteBroadcast
(
@Valid
IdParam
idParam
)
{
return
broadcastService
.
deleteBroadcast
(
idParam
);
}
@ApiOperation
(
value
=
"修改设备信息"
)
@PostMapping
(
"updateBroadcast"
)
public
Result
<
String
>
updateBroadcast
(
@Valid
BroadcastParam
broadcastParam
,
@Valid
IdParam
idParam
)
{
return
broadcastService
.
updateBroadcast
(
broadcastParam
,
idParam
);
}
@ApiOperation
(
value
=
"查看设备位置"
)
@GetMapping
(
"selectPoint"
)
public
Result
<
Point
>
selectPoint
(
@Valid
IdParam
idParam
)
{
return
broadcastService
.
selectPoint
(
idParam
);
}
@ApiOperation
(
value
=
"分页设备信息"
)
@GetMapping
(
"pageBroadcast"
)
public
Result
<
PageVo
<
BroadcastVo
>>
pageBroadcast
(
@Valid
BroadcastQueryParam
broadcastQueryParam
)
{
return
broadcastService
.
pageBroadcast
(
broadcastQueryParam
);
}
@ApiOperation
(
value
=
"导出"
,
produces
=
MediaType
.
APPLICATION_OCTET_STREAM_VALUE
)
@PostMapping
(
"exportBroadcast"
)
public
void
exportBroadcast
(
HttpServletResponse
response
,
@Valid
BroadcastQueryParam
broadcastQueryParam
)
{
broadcastService
.
exportBroadcast
(
broadcastQueryParam
,
response
);
}
@ApiOperation
(
value
=
"导入"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
value
=
"文件"
,
required
=
true
,
name
=
"file"
)
})
@PostMapping
(
"importVideo"
)
public
Result
<
String
>
importVideo
(
MultipartFile
file
)
{
return
broadcastService
.
importBroadcast
(
file
);
}
@ApiOperation
(
value
=
"根据名字检索"
)
@GetMapping
(
"selectBroadcastName"
)
public
Result
<
PageVo
<
BroadcastVo
>>
selectBroadcastName
(
@Valid
IndexParam
indexParam
)
{
return
broadcastService
.
selectBroadcastName
(
indexParam
);
}
}
app/src/main/java/com/yiring/app/web/icon/IconController.java
0 → 100644
浏览文件 @
7773af7b
/* (C) 2022 YiRing, Inc. */
package
com
.
yiring
.
app
.
web
.
icon
;
import
com.yiring.app.param.icon.IconParam
;
import
com.yiring.app.service.icon.IconService
;
import
com.yiring.app.vo.icon.IconVo
;
import
com.yiring.common.core.Result
;
import
com.yiring.common.param.IdParam
;
import
com.yiring.common.param.PageParam
;
import
com.yiring.common.vo.PageVo
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
javax.annotation.Resource
;
import
javax.validation.Valid
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/5/5 15:18
*/
@Slf4j
@Validated
@Api
(
tags
=
"Icon(图标管理)"
)
@RestController
@RequestMapping
(
"/icon/"
)
public
class
IconController
{
@Resource
IconService
iconService
;
@ApiOperation
(
value
=
"新增图标信息"
)
@PostMapping
(
"saveIcon"
)
public
Result
<
String
>
saveIcon
(
@Valid
IconParam
iconParam
)
{
return
iconService
.
saveIcon
(
iconParam
);
}
@ApiOperation
(
value
=
"删除图标信息"
)
@PostMapping
(
"deleteIcon"
)
public
Result
<
String
>
deleteIcon
(
@Valid
IdParam
idParam
)
{
return
iconService
.
deleteIcon
(
idParam
);
}
@ApiOperation
(
value
=
"修改图标信息"
)
@PostMapping
(
"updateIcon"
)
public
Result
<
String
>
updateIcon
(
@Valid
IconParam
iconParam
,
@Valid
IdParam
idParam
)
{
return
iconService
.
updateIcon
(
iconParam
,
idParam
);
}
@ApiOperation
(
value
=
"分页图标信息"
)
@GetMapping
(
"pageIcon"
)
public
Result
<
PageVo
<
IconVo
>>
pageIcon
(
@Valid
PageParam
pageParam
)
{
return
iconService
.
pageIcon
(
pageParam
);
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论