记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
董敬伟
liquidnet-bus-v1
Commits
c1aa0836
Commit
c1aa0836
authored
Jul 23, 2026
by
wangyifan
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into dev-v1.7.3-pintuan
parents
844d67bd
8d25b760
Changes
45
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
45 changed files
with
1434 additions
and
342 deletions
+1434
-342
kylin_artist_product.sql
docs/kylin_artist_product.sql
+16
-0
zhengzai-V1.5-20260304.sql
docu/zhengzai-V1.5-20260304.sql
+1
-0
IGoblinSqbService.java
...m/liquidnet/service/goblin/service/IGoblinSqbService.java
+2
-2
KylinRedisConst.java
...com/liquidnet/service/kylin/constant/KylinRedisConst.java
+4
-0
ArtistProductSaveParam.java
...idnet/service/kylin/dto/param/ArtistProductSaveParam.java
+18
-0
ArtistGoodsOptionVo.java
...m/liquidnet/service/kylin/dto/vo/ArtistGoodsOptionVo.java
+36
-0
ArtistVo.java
...ain/java/com/liquidnet/service/kylin/dto/vo/ArtistVo.java
+21
-4
KylinArtistDetailFrontVo.java
...ervice/kylin/dto/vo/returns/KylinArtistDetailFrontVo.java
+34
-0
KylinArtistPerformanceFrontVo.java
...e/kylin/dto/vo/returns/KylinArtistPerformanceFrontVo.java
+36
-0
KylinArtistProductFrontVo.java
...rvice/kylin/dto/vo/returns/KylinArtistProductFrontVo.java
+31
-0
IKylinArtistFrontService.java
...idnet/service/kylin/service/IKylinArtistFrontService.java
+21
-0
IKylinArtistService.java
...dnet/service/kylin/service/admin/IKylinArtistService.java
+7
-0
ISweetArtistsService.java
...liquidnet/service/sweet/service/ISweetArtistsService.java
+1
-12
KylinArtistController.java
.../web/controller/zhengzai/kylin/KylinArtistController.java
+65
-0
artists.html
...in/resources/templates/zhengzai/kylin/artist/artists.html
+16
-0
detail.html
...ain/resources/templates/zhengzai/kylin/artist/detail.html
+0
-48
products.html
...n/resources/templates/zhengzai/kylin/artist/products.html
+189
-0
artistLineup.html
...s/templates/zhengzai/kylin/performances/artistLineup.html
+40
-17
KylinArtistPerformanceServiceImpl.java
...kylin/service/impl/KylinArtistPerformanceServiceImpl.java
+8
-3
KylinArtistServiceImpl.java
...n/zhengzai/kylin/service/impl/KylinArtistServiceImpl.java
+187
-13
DataUtils.java
...iquidnet/client/admin/zhengzai/kylin/utils/DataUtils.java
+35
-0
SweetArtistCacheUtils.java
...ent/admin/zhengzai/kylin/utils/SweetArtistCacheUtils.java
+86
-0
RedisKeyExpireConst.java
.../liquidnet/service/base/constant/RedisKeyExpireConst.java
+3
-0
liquidnet-service-kylin.yml
...t-bus-config/liquidnet-config/liquidnet-service-kylin.yml
+2
-0
GoblinSqbOrderMapper.java
...liquidnet/service/goblin/mapper/GoblinSqbOrderMapper.java
+2
-1
GoblinSqbOrderMapper.xml
....liquidnet.service.goblin.mapper/GoblinSqbOrderMapper.xml
+10
-3
KylinArtist.java
.../java/com/liquidnet/service/kylin/entity/KylinArtist.java
+5
-0
KylinArtistProduct.java
...om/liquidnet/service/kylin/entity/KylinArtistProduct.java
+46
-0
KylinArtistProductMapper.java
...uidnet/service/kylin/mapper/KylinArtistProductMapper.java
+13
-0
KylinArtistMapper.xml
.../com.liquidnet.service.kylin.mapper/KylinArtistMapper.xml
+1
-1
KylinArtistProductMapper.xml
...quidnet.service.kylin.mapper/KylinArtistProductMapper.xml
+18
-0
SweetManualArtistsFiveMapper.xml
...net.service.sweet.mapper/SweetManualArtistsFiveMapper.xml
+9
-9
SweetManualArtistsMapper.xml
...quidnet.service.sweet.mapper/SweetManualArtistsMapper.xml
+15
-15
SweetManualArtistsMdskMapper.xml
...net.service.sweet.mapper/SweetManualArtistsMdskMapper.xml
+9
-9
SweetManualArtistsTfcMapper.xml
...dnet.service.sweet.mapper/SweetManualArtistsTfcMapper.xml
+9
-9
GoblinTaskHandler.java
...dnet/service/executor/main/handler/GoblinTaskHandler.java
+1
-1
GoblinSqbJobController.java
...rvice/goblin/controller/Inner/GoblinSqbJobController.java
+2
-2
GoblinSqbServiceImpl.java
...net/service/goblin/service/impl/GoblinSqbServiceImpl.java
+31
-21
KylinArtistController.java
...idnet/service/kylin/controller/KylinArtistController.java
+60
-0
KylinArtistFrontServiceImpl.java
...rvice/kylin/service/impl/KylinArtistFrontServiceImpl.java
+253
-0
DataUtils.java
...ain/java/com/liquidnet/service/kylin/utils/DataUtils.java
+19
-0
pom.xml
liquidnet-bus-service/liquidnet-service-sweet/pom.xml
+6
-0
SweetArtistsController.java
...dnet/service/sweet/controller/SweetArtistsController.java
+1
-46
SweetArtistsServiceImpl.java
...t/service/sweet/service/impl/SweetArtistsServiceImpl.java
+47
-124
RedisDataUtils.java
...ava/com/liquidnet/service/sweet/utils/RedisDataUtils.java
+18
-2
No files found.
docs/kylin_artist_product.sql
0 → 100644
View file @
c1aa0836
-- 艺人关联商品表
CREATE
TABLE
IF
NOT
EXISTS
`kylin_artist_product`
(
`mid`
bigint
NOT
NULL
AUTO_INCREMENT
COMMENT
'主键'
,
`relation_id`
varchar
(
64
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NOT
NULL
COMMENT
'关联记录ID'
,
`artist_id`
varchar
(
64
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NOT
NULL
COMMENT
'艺人ID'
,
`spu_id`
varchar
(
64
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NOT
NULL
COMMENT
'商品SPU ID'
,
`sort`
int
DEFAULT
0
COMMENT
'排序权重,越大越靠前'
,
`status`
tinyint
DEFAULT
1
COMMENT
'1启用 0禁用'
,
`created_at`
datetime
DEFAULT
NULL
COMMENT
'创建时间'
,
`updated_at`
datetime
DEFAULT
NULL
COMMENT
'更新时间'
,
PRIMARY
KEY
(
`mid`
),
UNIQUE
KEY
`uk_relation_id`
(
`relation_id`
),
UNIQUE
KEY
`uk_artist_spu`
(
`artist_id`
,
`spu_id`
),
KEY
`idx_artist_id`
(
`artist_id`
),
KEY
`idx_spu_id`
(
`spu_id`
)
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8mb4
COLLATE
=
utf8mb4_unicode_ci
COMMENT
=
'艺人关联商品'
;
docu/zhengzai-V1.5-20260304.sql
View file @
c1aa0836
...
...
@@ -6,6 +6,7 @@ CREATE TABLE `kylin_artist` (
`mid`
int
(
11
)
NOT
NULL
AUTO_INCREMENT
COMMENT
'主键ID'
,
`artist_id`
varchar
(
64
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NOT
NULL
COMMENT
'艺人ID'
,
`artist_name`
varchar
(
50
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NOT
NULL
COMMENT
'艺人名称'
,
`pinyin`
varchar
(
200
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NOT
NULL
DEFAULT
''
COMMENT
'姓名拼音'
,
`artist_type`
tinyint
(
4
)
NOT
NULL
COMMENT
'艺人类型 1音乐人 2艺术家 3厂牌 4品牌方'
,
`avatar_url`
varchar
(
500
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NOT
NULL
COMMENT
'艺人头像'
,
`introduction`
text
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NOT
NULL
COMMENT
'艺人简介'
,
...
...
liquidnet-bus-api/liquidnet-service-goblin-api/src/main/java/com/liquidnet/service/goblin/service/IGoblinSqbService.java
View file @
c1aa0836
...
...
@@ -38,8 +38,8 @@ public interface IGoblinSqbService {
ResponseDto
<
Boolean
>
syncCouponStatus
(
String
userId
,
String
orderId
);
/**
*
演出结束
自动退款(定时任务调用)
* SQL 已联表过滤:收钱吧扩展单、
主单已支付(2)、演出已结束、扩展未核销;循环内仅
调 refund。
* 自动退款(定时任务调用)
* SQL 已联表过滤:收钱吧扩展单、
未核销,且(主单已支付(2)+演出已结束)或(退款中(61)+超 8 小时);循环内
调 refund。
*
* @param performancesId 演出ID,传 null 或空则不按演出缩小(全库符合条件候选,慎用)
* @return 处理结果摘要(成功/失败笔数)
...
...
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/constant/KylinRedisConst.java
View file @
c1aa0836
...
...
@@ -6,6 +6,10 @@ public class KylinRedisConst {
public
static
final
String
PERFORMANCES_INVOICE_REMINDER
=
"kylin:performances:invoice_reminder:id:"
;
public
static
final
String
PERFORMANCES_NOTICE_REMIND_STATUS
=
"kylin:performances:noticeRemindStatus:id:"
;
public
static
final
String
PERFORMANCES_ARTISTS
=
"kylin:performances:artists:id:"
;
public
static
final
String
ARTIST_DETAIL
=
"kylin:artist:detail:id:"
;
public
static
final
String
ARTIST_ALBUM
=
"kylin:artist:album:id:"
;
public
static
final
String
ARTIST_PERFORMANCES
=
"kylin:artist:performances:id:"
;
public
static
final
String
ARTIST_PRODUCTS
=
"kylin:artist:products:id:"
;
public
static
final
String
PERFORMANCES_TRUE_NAME
=
"kylin:performances_true_name:id:"
;
public
static
final
String
PERFORMANCES_LIST_CITY
=
"kylin:performances:city:"
;
public
static
final
String
PERFORMANCES_LIST_SYSTEM_RECOMMEND
=
"kylin:performances:systemRecommend"
;
...
...
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/dto/param/ArtistProductSaveParam.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
dto
.
param
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.List
;
@Data
@ApiModel
(
"艺人关联商品保存参数"
)
public
class
ArtistProductSaveParam
{
@ApiModelProperty
(
"艺人ID"
)
private
String
artistId
;
@ApiModelProperty
(
"商品SPU ID列表"
)
private
List
<
String
>
spuIds
;
}
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/dto/vo/ArtistGoodsOptionVo.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
dto
.
vo
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.math.BigDecimal
;
/**
* 艺人关联商品搜索选项
*/
@Data
@ApiModel
(
"艺人关联商品搜索选项"
)
public
class
ArtistGoodsOptionVo
{
@ApiModelProperty
(
"商品SPU ID"
)
private
String
spuId
;
@ApiModelProperty
(
"商品编码"
)
private
String
spuNo
;
@ApiModelProperty
(
"商品名称"
)
private
String
name
;
@ApiModelProperty
(
"封面图"
)
private
String
coverPic
;
@ApiModelProperty
(
"售价"
)
private
BigDecimal
sellPrice
;
@ApiModelProperty
(
"上架状态文案"
)
private
String
shelfStatusLabel
;
@ApiModelProperty
(
"是否可选择"
)
private
Boolean
selectable
;
}
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/dto/vo/ArtistVo.java
View file @
c1aa0836
...
...
@@ -40,9 +40,6 @@ public class ArtistVo {
@ApiModelProperty
(
value
=
"关联演出"
)
private
List
<
PerformanceVo
>
performanceVoList
;
@ApiModelProperty
(
value
=
"关联商品"
)
private
List
<
ProductVo
>
productVoList
;
@ApiModelProperty
(
value
=
"排序权重"
)
private
Integer
sort
;
...
...
@@ -79,7 +76,27 @@ public class ArtistVo {
@Data
@ApiModel
(
"商品VO"
)
private
static
class
ProductVo
{
public
static
class
ProductVo
{
@ApiModelProperty
(
"商品SPU ID"
)
private
String
spuId
;
@ApiModelProperty
(
"商品编码"
)
private
String
productCode
;
@ApiModelProperty
(
"商品名称"
)
private
String
productName
;
@ApiModelProperty
(
"商品头图"
)
private
String
imageUrl
;
@ApiModelProperty
(
"商品分类"
)
private
String
category
;
@ApiModelProperty
(
"商品售价"
)
private
String
price
;
@ApiModelProperty
(
"上架状态 1已上架 0未上架"
)
private
Integer
status
;
}
}
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/dto/vo/returns/KylinArtistDetailFrontVo.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
dto
.
vo
.
returns
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.List
;
@Data
@ApiModel
(
"C端艺人详情"
)
public
class
KylinArtistDetailFrontVo
implements
Serializable
{
@ApiModelProperty
(
"艺人ID"
)
private
String
artistId
;
@ApiModelProperty
(
"艺人名称"
)
private
String
artistName
;
@ApiModelProperty
(
"艺人类型 1音乐人 2艺术家 3厂牌 4品牌方"
)
private
Integer
artistType
;
@ApiModelProperty
(
"艺人类型名称"
)
private
String
artistTypeName
;
@ApiModelProperty
(
"艺人头像"
)
private
String
avatarUrl
;
@ApiModelProperty
(
"艺人简介"
)
private
String
introduction
;
@ApiModelProperty
(
"艺人相册"
)
private
List
<
String
>
albumImages
;
}
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/dto/vo/returns/KylinArtistPerformanceFrontVo.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
dto
.
vo
.
returns
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
@ApiModel
(
"C端艺人关联演出"
)
public
class
KylinArtistPerformanceFrontVo
implements
Serializable
{
@ApiModelProperty
(
"演出ID"
)
private
String
performanceId
;
@ApiModelProperty
(
"演出名称"
)
private
String
title
;
@ApiModelProperty
(
"封面"
)
private
String
coverPic
;
@ApiModelProperty
(
"演出开始时间"
)
private
String
timeStart
;
@ApiModelProperty
(
"场地名称(演出地点)"
)
private
String
fieldName
;
@ApiModelProperty
(
"价格"
)
private
String
price
;
@ApiModelProperty
(
"状态 6购买 8售罄 9未开始"
)
private
Integer
appStatus
;
@ApiModelProperty
(
"状态文案"
)
private
String
statusName
;
}
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/dto/vo/returns/KylinArtistProductFrontVo.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
dto
.
vo
.
returns
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.math.BigDecimal
;
@Data
@ApiModel
(
"C端艺人关联商品"
)
public
class
KylinArtistProductFrontVo
implements
Serializable
{
@ApiModelProperty
(
"商品SPU ID"
)
private
String
spuId
;
@ApiModelProperty
(
"商品类型 0-常规 1-数字藏品 2-券类商品"
)
private
Integer
spuType
;
@ApiModelProperty
(
"商品名称"
)
private
String
name
;
@ApiModelProperty
(
"封面图"
)
private
String
coverPic
;
@ApiModelProperty
(
"售价"
)
private
BigDecimal
sellPrice
;
@ApiModelProperty
(
"排序"
)
private
Integer
sort
;
}
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/service/IKylinArtistFrontService.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
service
;
import
com.liquidnet.service.kylin.dto.vo.returns.KylinArtistDetailFrontVo
;
import
com.liquidnet.service.kylin.dto.vo.returns.KylinArtistPerformanceFrontVo
;
import
com.liquidnet.service.kylin.dto.vo.returns.KylinArtistProductFrontVo
;
import
java.util.List
;
/**
* C端艺人详情
*/
public
interface
IKylinArtistFrontService
{
KylinArtistDetailFrontVo
getArtistDetail
(
String
artistId
);
List
<
String
>
getArtistAlbum
(
String
artistId
);
List
<
KylinArtistPerformanceFrontVo
>
getArtistPerformances
(
String
artistId
);
List
<
KylinArtistProductFrontVo
>
getArtistProducts
(
String
artistId
);
}
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/service/admin/IKylinArtistService.java
View file @
c1aa0836
...
...
@@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
import
com.liquidnet.service.kylin.dao.KylinArtistDao
;
import
com.liquidnet.service.kylin.dto.param.ArtistParam
;
import
com.liquidnet.service.kylin.dto.param.ArtistSearchParam
;
import
com.liquidnet.service.kylin.dto.vo.ArtistGoodsOptionVo
;
import
com.liquidnet.service.kylin.dto.vo.ArtistVo
;
import
com.liquidnet.service.kylin.entity.KylinArtist
;
...
...
@@ -32,4 +33,10 @@ public interface IKylinArtistService extends IService<KylinArtist> {
Boolean
checkArtistNameExists
(
String
artistName
,
String
artistId
);
List
<
ArtistGoodsOptionVo
>
searchGoods
(
String
keyword
,
String
artistId
,
List
<
String
>
excludeSpuIds
);
List
<
ArtistVo
.
ProductVo
>
listArtistProducts
(
String
artistId
);
Boolean
saveArtistProducts
(
String
artistId
,
List
<
String
>
spuIds
);
}
liquidnet-bus-api/liquidnet-service-sweet-api/src/main/java/com/liquidnet/service/sweet/service/ISweetArtistsService.java
View file @
c1aa0836
...
...
@@ -4,16 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
import
com.github.pagehelper.PageInfo
;
import
com.liquidnet.service.base.ResponseDto
;
import
com.liquidnet.service.sweet.entity.SweetArtists
;
import
com.liquidnet.service.sweet.entity.SweetArtistsList
;
import
com.liquidnet.service.sweet.entity.SweetArtistsUrl
;
import
com.liquidnet.service.sweet.param.SweetArtistsListParam
;
import
com.liquidnet.service.sweet.vo.SweetArtistsVo
;
import
java.util.List
;
/**
* <p>
* 艺人表 服务类
* 艺人表 服务类
(读 kylin_artist,写已迁移至 admin)
* </p>
*
* @author liquidnet
...
...
@@ -23,12 +18,6 @@ public interface ISweetArtistsService extends IService<SweetArtists> {
ResponseDto
<
PageInfo
<
SweetArtists
>>
getList
(
int
page
,
int
size
,
String
name
);
ResponseDto
<
Boolean
>
add
(
SweetArtistsListParam
sweetArtistsList
);
ResponseDto
<
SweetArtistsVo
>
detail
(
String
artistsId
);
ResponseDto
<
Boolean
>
change
(
String
artistsId
,
SweetArtistsListParam
sweetArtistsList
);
ResponseDto
<
SweetArtists
>
del
(
String
artistsId
);
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/java/com/liquidnet/client/admin/web/controller/zhengzai/kylin/KylinArtistController.java
View file @
c1aa0836
...
...
@@ -11,7 +11,9 @@ import com.liquidnet.service.kylin.dao.KylinArtistDao;
import
com.liquidnet.service.kylin.dao.KylinArtistOperationLogDao
;
import
com.liquidnet.service.kylin.dao.KylinArtistPerformanceDao
;
import
com.liquidnet.service.kylin.dto.param.ArtistParam
;
import
com.liquidnet.service.kylin.dto.param.ArtistProductSaveParam
;
import
com.liquidnet.service.kylin.dto.param.ArtistSearchParam
;
import
com.liquidnet.service.kylin.dto.vo.ArtistGoodsOptionVo
;
import
com.liquidnet.service.kylin.dto.vo.ArtistVo
;
import
com.liquidnet.service.kylin.service.admin.IKylinArtistOperationLogService
;
import
com.liquidnet.service.kylin.service.admin.IKylinArtistPerformanceService
;
...
...
@@ -24,6 +26,7 @@ import org.springframework.stereotype.Controller;
import
org.springframework.ui.ModelMap
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -305,4 +308,66 @@ public class KylinArtistController extends BaseController {
}
}
/**
* 关联商品页面
*/
@RequiresPermissions
(
"kylin:artist:update"
)
@GetMapping
(
"/products/{artistId}"
)
public
String
productsPage
(
@PathVariable
(
"artistId"
)
String
artistId
,
ModelMap
mmap
)
{
ArtistVo
artistVo
=
kylinArtistService
.
detail
(
artistId
);
mmap
.
put
(
"artistId"
,
artistId
);
mmap
.
put
(
"artistName"
,
artistVo
!=
null
?
artistVo
.
getArtistName
()
:
""
);
return
prefix
+
"/products"
;
}
/**
* 查询艺人已关联商品
*/
@RequiresPermissions
(
"kylin:artist:update"
)
@GetMapping
(
"/products/list"
)
@ResponseBody
public
AjaxResult
productsList
(
@RequestParam
String
artistId
)
{
return
AjaxResult
.
success
(
kylinArtistService
.
listArtistProducts
(
artistId
));
}
/**
* 保存艺人关联商品
*/
@Log
(
title
=
"保存艺人关联商品"
,
businessType
=
BusinessType
.
UPDATE
)
@RequiresPermissions
(
"kylin:artist:update"
)
@PostMapping
(
"/products/save"
)
@ResponseBody
public
AjaxResult
productsSave
(
@RequestBody
ArtistProductSaveParam
param
)
{
try
{
Boolean
result
=
kylinArtistService
.
saveArtistProducts
(
param
.
getArtistId
(),
param
.
getSpuIds
());
if
(
result
)
{
return
success
(
"保存成功"
);
}
return
error
(
"艺人不存在"
);
}
catch
(
IllegalArgumentException
e
)
{
return
error
(
e
.
getMessage
());
}
}
/**
* 搜索可选商品(按名称)
*/
@GetMapping
(
"/searchGoods"
)
@ResponseBody
public
AjaxResult
searchGoods
(
@RequestParam
(
value
=
"keyword"
,
required
=
false
)
String
keyword
,
@RequestParam
(
value
=
"artistId"
,
required
=
false
)
String
artistId
,
@RequestParam
(
value
=
"excludeSpuIds"
,
required
=
false
)
String
excludeSpuIds
)
{
List
<
String
>
excludeList
=
new
ArrayList
<>();
if
(
excludeSpuIds
!=
null
&&
!
excludeSpuIds
.
isEmpty
())
{
for
(
String
spuId
:
excludeSpuIds
.
split
(
","
))
{
if
(
spuId
!=
null
&&
!
spuId
.
trim
().
isEmpty
())
{
excludeList
.
add
(
spuId
.
trim
());
}
}
}
List
<
ArtistGoodsOptionVo
>
list
=
kylinArtistService
.
searchGoods
(
keyword
,
artistId
,
excludeList
);
return
AjaxResult
.
success
(
list
);
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/kylin/artist/artists.html
View file @
c1aa0836
...
...
@@ -127,6 +127,7 @@
var
actions
=
[];
actions
.
push
(
'<a class="btn btn-info btn-xs '
+
detailFlag
+
'" href="javascript:void(0)" onclick="$.operate.detail(
\'
'
+
row
.
artistId
+
'
\'
)"><i class="fa fa-eye"></i>详情</a> '
);
actions
.
push
(
'<a class="btn btn-success btn-xs '
+
updateFlag
+
'" href="javascript:void(0)" onclick="$.operate.edit(
\'
'
+
row
.
artistId
+
'
\'
)"><i class="fa fa-edit"></i>编辑</a> '
);
actions
.
push
(
'<a class="btn btn-primary btn-xs '
+
updateFlag
+
'" href="javascript:void(0)" onclick="openProductModal(
\'
'
+
row
.
artistId
+
'
\'
)"><i class="fa fa-shopping-bag"></i>关联商品</a> '
);
actions
.
push
(
'<a class="btn btn-warning btn-xs '
+
detailFlag
+
'" href="javascript:void(0)" onclick="showOperationLog(
\'
'
+
row
.
artistId
+
'
\'
)"><i class="fa fa-history"></i>操作日志</a> '
);
return
actions
.
join
(
''
);
}
...
...
@@ -171,6 +172,21 @@
var
url
=
prefix
+
'/operationLog/'
+
artistId
;
$
.
modal
.
openTab
(
"艺人操作记录"
,
url
);
}
function
openProductModal
(
artistId
)
{
var
url
=
prefix
+
'/products/'
+
artistId
;
$
.
modal
.
openOptions
({
title
:
'关联商品'
,
url
:
url
,
width
:
'900'
,
height
:
'600'
,
btn
:
[
'保存'
,
'关闭'
],
yes
:
function
(
index
,
layero
)
{
var
iframeWin
=
layero
.
find
(
'iframe'
)[
0
];
iframeWin
.
contentWindow
.
submitHandler
(
index
,
layero
);
}
});
}
</script>
</body>
</html>
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/kylin/artist/detail.html
View file @
c1aa0836
...
...
@@ -282,54 +282,6 @@
暂无演出信息
</div>
</div>
<!-- 关联商品信息 -->
<div>
<div
class=
"section-title"
>
艺人关联商品信息
<span
th:if=
"*{productVoList != null}"
style=
"font-size: 14px; color: #666; margin-left: 10px;"
>
(共
<span
th:text=
"*{productVoList.size()}"
>
2
</span>
条)
</span>
</div>
<div
class=
"table-container"
th:if=
"*{productVoList != null and !productVoList.isEmpty()}"
>
<table
class=
"custom-table"
>
<thead>
<tr>
<th
width=
"15%"
>
商品编码
</th>
<th
width=
"20%"
>
商品名称
</th>
<th
width=
"15%"
>
商品头图
</th>
<th
width=
"15%"
>
商品分类
</th>
<th
width=
"15%"
>
商品售价
</th>
<th
width=
"15%"
>
上架状态
</th>
</tr>
</thead>
<tbody>
<tr
th:each=
"product : ${ArtistVo.productVoList}"
>
<td
th:text=
"${product.productCode} ?: '--'"
>
goods001
</td>
<td
th:text=
"${product.productName} ?: '--'"
>
摩登天空T恤
</td>
<td>
<div
class=
"product-image"
th:if=
"${product.imageUrl}"
>
<img
th:src=
"${product.imageUrl}"
alt=
"商品图片"
>
</div>
<span
th:unless=
"${product.imageUrl}"
>
--
</span>
</td>
<td
th:text=
"${product.category} ?: '--'"
>
服饰
</td>
<td
th:text=
"${product.price} ?: '--'"
>
99.00元
</td>
<td>
<span
th:if=
"${product.status == 1}"
class=
"status-badge status-on"
>
已上架
</span>
<span
th:if=
"${product.status == 0}"
class=
"status-badge status-off"
>
未上架
</span>
<span
th:if=
"${product.status != 1 and product.status != 0}"
th:text=
"${product.status}"
>
--
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div
th:if=
"*{productVoList == null or productVoList.isEmpty()}"
class=
"empty-data"
>
暂无关联商品信息
</div>
</div>
</div>
</div>
</div>
...
...
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/kylin/artist/products.html
0 → 100644
View file @
c1aa0836
<!DOCTYPE html>
<html
lang=
"zh"
xmlns:th=
"http://www.thymeleaf.org"
>
<head>
<th:block
th:include=
"include :: header('关联商品')"
/>
<link
rel=
"stylesheet"
th:href=
"@{/ajax/libs/select2/select2.min.css}"
/>
<style>
body
{
background
:
#fff
;
}
.page-wrap
{
padding
:
16px
;
}
.section-title
{
font-weight
:
bold
;
margin
:
16px
0
8px
;
}
.img-thumb
{
width
:
40px
;
height
:
40px
;
object-fit
:
cover
;
border-radius
:
4px
;
}
.select2-container
{
min-width
:
380px
;
}
.add-row
{
margin-bottom
:
16px
;
display
:
flex
;
align-items
:
center
;
gap
:
10px
;
}
</style>
</head>
<body
class=
"white-bg"
>
<div
class=
"page-wrap"
>
<div
class=
"section-title"
>
艺人:
<span
th:text=
"${artistName}"
>
--
</span>
<span
style=
"font-size:12px;color:#999;margin-left:8px;"
th:text=
"'ID: ' + ${artistId}"
></span>
</div>
<div
class=
"add-row"
>
<select
id=
"goodsSelect"
style=
"width:400px;"
>
<option
value=
""
>
默认最近20条,输入名称搜索全部匹配
</option>
</select>
<span
style=
"color:#999;font-size:12px;"
>
选中商品后自动添加到列表
</span>
</div>
<div
class=
"section-title"
>
已关联商品
</div>
<div
class=
"table-responsive"
>
<table
class=
"table table-bordered"
>
<thead>
<tr>
<th>
商品SPU ID
</th>
<th>
头图
</th>
<th>
商品名称
</th>
<th>
状态
</th>
<th>
操作
</th>
</tr>
</thead>
<tbody
id=
"linkedProductsBody"
>
<tr
id=
"linkedProductsEmptyRow"
>
<td
colspan=
"5"
style=
"text-align:center;color:#999;"
>
暂无关联商品
</td>
</tr>
</tbody>
</table>
</div>
</div>
<th:block
th:include=
"include :: footer"
/>
<script
th:src=
"@{/ajax/libs/select2/select2.min.js}"
></script>
<script
th:inline=
"javascript"
>
var
artistId
=
/*[[${artistId}]]*/
''
;
var
prefix
=
ctx
+
'kylin/artist'
;
var
linkedProducts
=
[];
$
(
function
()
{
initSelect2
();
loadLinkedProducts
();
});
function
initSelect2
()
{
$
(
'#goodsSelect'
).
select2
({
allowClear
:
true
,
placeholder
:
'默认最近20条,输入名称搜索全部匹配'
,
minimumInputLength
:
0
,
ajax
:
{
url
:
prefix
+
'/searchGoods'
,
dataType
:
'json'
,
delay
:
300
,
data
:
function
(
params
)
{
return
{
keyword
:
params
.
term
||
''
,
artistId
:
artistId
,
excludeSpuIds
:
linkedProducts
.
map
(
function
(
item
)
{
return
item
.
spuId
;
}).
join
(
','
)
};
},
processResults
:
function
(
resp
)
{
var
list
=
(
resp
&&
resp
.
data
)
?
resp
.
data
:
[];
return
{
results
:
list
.
map
(
function
(
item
)
{
var
text
=
item
.
name
||
item
.
spuId
;
if
(
item
.
spuNo
)
{
text
+=
' ('
+
item
.
spuNo
+
')'
;
}
return
{
id
:
item
.
spuId
,
text
:
text
,
disabled
:
item
.
selectable
===
false
,
_raw
:
item
};
})};
}
}
}).
on
(
'select2:select'
,
function
(
e
)
{
var
raw
=
e
.
params
.
data
.
_raw
;
if
(
raw
&&
raw
.
selectable
===
false
)
{
$
.
modal
.
alertWarning
(
'该商品不可关联'
);
$
(
this
).
val
(
null
).
trigger
(
'change'
);
return
;
}
if
(
raw
)
{
addLinkedProduct
(
raw
);
}
$
(
this
).
val
(
null
).
trigger
(
'change'
);
});
}
function
loadLinkedProducts
()
{
$
.
get
(
prefix
+
'/products/list'
,
{
artistId
:
artistId
},
function
(
resp
)
{
if
(
resp
.
code
===
0
&&
resp
.
data
)
{
linkedProducts
=
resp
.
data
.
map
(
function
(
item
)
{
return
{
spuId
:
item
.
spuId
,
name
:
item
.
productName
,
coverPic
:
item
.
imageUrl
,
shelfStatusLabel
:
item
.
status
===
1
?
'已上架'
:
'未上架'
};
});
renderLinkedProducts
();
}
});
}
function
renderLinkedProducts
()
{
var
$body
=
$
(
'#linkedProductsBody'
);
$body
.
empty
();
if
(
!
linkedProducts
.
length
)
{
$body
.
append
(
'<tr><td colspan="5" style="text-align:center;color:#999;">暂无关联商品</td></tr>'
);
return
;
}
linkedProducts
.
forEach
(
function
(
item
,
index
)
{
$body
.
append
(
'<tr>'
+
'<td>'
+
(
item
.
spuId
||
'--'
)
+
'</td>'
+
'<td>'
+
(
item
.
coverPic
?
'<img class="img-thumb" src="'
+
item
.
coverPic
+
'">'
:
'--'
)
+
'</td>'
+
'<td>'
+
(
item
.
name
||
'--'
)
+
'</td>'
+
'<td>'
+
(
item
.
shelfStatusLabel
||
'--'
)
+
'</td>'
+
'<td><button type="button" class="btn btn-danger btn-xs" onclick="removeLinkedProduct('
+
index
+
')">移除</button></td>'
+
'</tr>'
);
});
}
function
addLinkedProduct
(
raw
)
{
if
(
!
raw
||
!
raw
.
spuId
)
{
return
;
}
if
(
linkedProducts
.
some
(
function
(
item
)
{
return
item
.
spuId
===
raw
.
spuId
;
}))
{
$
.
modal
.
alertWarning
(
'该商品已在列表中'
);
return
;
}
linkedProducts
.
push
({
spuId
:
raw
.
spuId
,
name
:
raw
.
name
,
coverPic
:
raw
.
coverPic
,
shelfStatusLabel
:
raw
.
shelfStatusLabel
});
renderLinkedProducts
();
}
function
removeLinkedProduct
(
index
)
{
linkedProducts
.
splice
(
index
,
1
);
renderLinkedProducts
();
}
function
submitHandler
(
index
,
layero
)
{
var
spuIds
=
linkedProducts
.
map
(
function
(
item
)
{
return
item
.
spuId
;
});
$
.
ajax
({
url
:
prefix
+
'/products/save'
,
type
:
'post'
,
contentType
:
'application/json'
,
data
:
JSON
.
stringify
({
artistId
:
artistId
,
spuIds
:
spuIds
}),
success
:
function
(
resp
)
{
if
(
resp
.
code
===
0
)
{
if
(
parent
&&
parent
.
$
&&
parent
.
$
.
modal
)
{
parent
.
$
.
modal
.
msgSuccess
(
'保存成功'
);
if
(
parent
.
$
.
table
)
{
parent
.
$
.
table
.
refresh
();
}
}
else
{
$
.
modal
.
msgSuccess
(
'保存成功'
);
}
if
(
typeof
index
!==
'undefined'
)
{
parent
.
layer
.
close
(
index
);
}
else
{
$
.
modal
.
close
();
}
}
else
{
$
.
modal
.
alertError
(
resp
.
msg
||
'保存失败'
);
}
}
});
}
</script>
</body>
</html>
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/kylin/performances/artistLineup.html
View file @
c1aa0836
...
...
@@ -699,8 +699,10 @@
$
(
'#selected-artists-container'
).
html
(
''
);
// 打开弹窗
$
(
'#associateArtistModal'
).
modal
(
'show'
);
// 加载初始艺人列表(含已关联状态)
loadAllArtistsForModal
(
timesId
,
true
);
// 已绑定艺人从 getSessionArtists 初始化(含逻辑删除但仍关联的);可选列表走 getAllArtists
initSelectedArtistsFromSession
(
timesId
,
function
()
{
loadAllArtistsForModal
(
timesId
);
});
}
// 防抖
...
...
@@ -715,15 +717,45 @@
const
debouncedSearch
=
debounce
(
function
()
{
const
timesId
=
$
(
'#associateArtistModal'
).
data
(
'timesId'
);
loadAllArtistsForModal
(
timesId
,
false
);
loadAllArtistsForModal
(
timesId
);
},
300
);
/** 从本场次已绑定阵容初始化已选艺人(不按 status 过滤) */
function
initSelectedArtistsFromSession
(
timesId
,
callback
)
{
$
.
ajax
({
url
:
ctx
+
"kylin/artist/getSessionArtists"
,
type
:
"GET"
,
data
:
{
performancesId
:
performancesId
,
timesId
:
timesId
},
success
:
function
(
response
)
{
if
(
response
.
code
===
0
)
{
selectedArtists
=
(
response
.
data
||
[])
.
map
(
function
(
a
)
{
return
{
artistId
:
a
.
artistId
,
artistName
:
a
.
artistName
,
avatarUrl
:
a
.
avatarUrl
,
sort
:
a
.
sort
||
0
};
})
.
sort
(
function
(
a
,
b
)
{
return
b
.
sort
-
a
.
sort
;
});
updateSelectedArtistsView
();
}
if
(
callback
)
callback
();
},
error
:
function
()
{
if
(
callback
)
callback
();
}
});
}
/**
* 从后端加载
艺人列表
* 从后端加载
可选艺人列表(仅 status=1)
* @param {string} timesId
* @param {boolean} isInitialLoad 是否首次加载(用于初始化已选艺人)
*/
function
loadAllArtistsForModal
(
timesId
,
isInitialLoad
)
{
function
loadAllArtistsForModal
(
timesId
)
{
const
keyword
=
$
(
'#artist-search-input'
).
val
().
trim
();
// 显示加载中
...
...
@@ -742,7 +774,7 @@
success
:
function
(
response
)
{
if
(
response
.
code
===
0
)
{
currentModalArtists
=
response
.
data
||
[];
renderArtistsInModal
(
currentModalArtists
,
isInitialLoad
);
renderArtistsInModal
(
currentModalArtists
);
}
else
{
$
(
'#modal-artist-list'
).
html
(
'<div class="modal-empty">加载艺人列表失败,请重试</div>'
...
...
@@ -760,9 +792,8 @@
/**
* 渲染搜索结果列表
* @param {Array} artists
* @param {boolean} isInitialLoad
*/
function
renderArtistsInModal
(
artists
,
isInitialLoad
)
{
function
renderArtistsInModal
(
artists
)
{
const
listContainer
=
$
(
'#modal-artist-list'
);
if
(
!
artists
||
artists
.
length
===
0
)
{
...
...
@@ -771,14 +802,6 @@
return
;
}
// 首次加载时,从后端的 associated 字段初始化已选列表,并按 sort 降序排列(sort 越大越靠前)
if
(
isInitialLoad
)
{
selectedArtists
=
artists
.
filter
(
a
=>
a
.
associated
)
.
map
(
a
=>
({
artistId
:
a
.
artistId
,
artistName
:
a
.
artistName
,
avatarUrl
:
a
.
avatarUrl
,
sort
:
a
.
sort
||
0
}))
.
sort
((
a
,
b
)
=>
b
.
sort
-
a
.
sort
);
}
let
html
=
''
;
artists
.
forEach
(
function
(
artist
)
{
const
isSelected
=
selectedArtists
.
some
(
a
=>
a
.
artistId
===
artist
.
artistId
);
...
...
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/kylin/service/impl/KylinArtistPerformanceServiceImpl.java
View file @
c1aa0836
...
...
@@ -14,10 +14,10 @@ import lombok.extern.slf4j.Slf4j;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.HashSet
;
import
java.util.HashMap
;
import
java.util.stream.Collectors
;
import
com.liquidnet.service.kylin.service.admin.IKylinArtistOperationLogService
;
...
...
@@ -79,6 +79,7 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
// 删除缓存演出阵容
dataUtils
.
delPerformanceArtists
(
performanceId
);
dataUtils
.
delArtistPerformancesCache
(
artistId
);
int
result
=
artistPerformanceMapper
.
deleteById
(
mid
);
// 记录删除后的关联数量
...
...
@@ -95,8 +96,9 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
@Override
public
List
<
KylinArtistAssociationStatusDto
>
getAllArtists
(
String
performancesId
,
String
timesId
,
String
keyword
)
{
// 1.
获取所有艺人
// 1.
可选艺人:仅启用中(已逻辑删除的不出现在选艺人列表;已绑定展示走 getSessionArtists)
List
<
KylinArtist
>
allArtists
=
artistMapper
.
selectList
(
new
QueryWrapper
<
KylinArtist
>()
.
eq
(
"status"
,
1
)
.
like
(
keyword
!=
null
&&
!
keyword
.
isEmpty
(),
"artist_name"
,
keyword
)
.
orderByDesc
(
"created_at"
));
...
...
@@ -108,7 +110,7 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
.
collect
(
Collectors
.
toMap
(
KylinArtistPerformanceDao:
:
getArtistId
,
KylinArtistPerformanceDao:
:
getSort
,
(
existing
,
replacement
)
->
existing
// 重复 key 保留已有值
(
existing
,
replacement
)
->
existing
));
// 3. 组装返回结果
...
...
@@ -190,6 +192,9 @@ public class KylinArtistPerformanceServiceImpl extends ServiceImpl<KylinArtistPe
// 删除缓存演出阵容
dataUtils
.
delPerformanceArtists
(
performancesId
);
for
(
String
artistId
:
affectedArtistIds
)
{
dataUtils
.
delArtistPerformancesCache
(
artistId
);
}
return
true
;
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/kylin/service/impl/KylinArtistServiceImpl.java
View file @
c1aa0836
This diff is collapsed.
Click to expand it.
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/kylin/utils/DataUtils.java
View file @
c1aa0836
...
...
@@ -631,4 +631,39 @@ public class DataUtils {
final
String
redisKey
=
KylinRedisConst
.
PERFORMANCES_ARTISTS
+
performancesId
;
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
redisKey
);
}
/**
* 删除艺人 C 端缓存(详情/相册/演出/商品)
*/
public
void
delArtistCache
(
String
artistId
)
{
if
(
artistId
==
null
||
artistId
.
isEmpty
())
{
return
;
}
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
KylinRedisConst
.
ARTIST_DETAIL
+
artistId
);
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
KylinRedisConst
.
ARTIST_ALBUM
+
artistId
);
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
KylinRedisConst
.
ARTIST_PERFORMANCES
+
artistId
);
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
KylinRedisConst
.
ARTIST_PRODUCTS
+
artistId
);
}
public
void
delArtistDetailAndAlbumCache
(
String
artistId
)
{
if
(
artistId
==
null
||
artistId
.
isEmpty
())
{
return
;
}
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
KylinRedisConst
.
ARTIST_DETAIL
+
artistId
);
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
KylinRedisConst
.
ARTIST_ALBUM
+
artistId
);
}
public
void
delArtistPerformancesCache
(
String
artistId
)
{
if
(
artistId
==
null
||
artistId
.
isEmpty
())
{
return
;
}
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
KylinRedisConst
.
ARTIST_PERFORMANCES
+
artistId
);
}
public
void
delArtistProductsCache
(
String
artistId
)
{
if
(
artistId
==
null
||
artistId
.
isEmpty
())
{
return
;
}
redisDataSourceUtil
.
getRedisKylinUtil
().
del
(
KylinRedisConst
.
ARTIST_PRODUCTS
+
artistId
);
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/kylin/utils/SweetArtistCacheUtils.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
client
.
admin
.
zhengzai
.
kylin
.
utils
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.liquidnet.common.cache.redis.util.RedisDataSourceUtil
;
import
com.liquidnet.service.sweet.constant.SweetConstant
;
import
com.liquidnet.service.sweet.entity.SweetManualArtists
;
import
com.liquidnet.service.sweet.entity.SweetManualArtistsFive
;
import
com.liquidnet.service.sweet.entity.SweetManualArtistsMdsk
;
import
com.liquidnet.service.sweet.entity.SweetManualArtistsTfc
;
import
com.liquidnet.service.sweet.mapper.SweetManualArtistsFiveMapper
;
import
com.liquidnet.service.sweet.mapper.SweetManualArtistsMapper
;
import
com.liquidnet.service.sweet.mapper.SweetManualArtistsMdskMapper
;
import
com.liquidnet.service.sweet.mapper.SweetManualArtistsTfcMapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.util.HashSet
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
/**
* admin 修改 kylin 艺人后,失效 sweet 小程序相关 Redis 缓存
*/
@Slf4j
@Component
public
class
SweetArtistCacheUtils
{
@Autowired
private
RedisDataSourceUtil
redisDataSourceUtil
;
@Autowired
private
SweetManualArtistsMapper
sweetManualArtistsMapper
;
@Autowired
private
SweetManualArtistsMdskMapper
sweetManualArtistsMdskMapper
;
@Autowired
private
SweetManualArtistsTfcMapper
sweetManualArtistsTfcMapper
;
@Autowired
private
SweetManualArtistsFiveMapper
sweetManualArtistsFiveMapper
;
public
void
invalidateByArtistId
(
String
artistId
)
{
if
(
artistId
==
null
||
artistId
.
isEmpty
())
{
return
;
}
try
{
redisDataSourceUtil
.
getRedisSweetUtil
().
del
(
SweetConstant
.
REDIS_KEY_SWEET_ARTISTS_DETAILS
.
concat
(
artistId
));
invalidateManualTimeList
(
sweetManualArtistsMapper
.
selectList
(
Wrappers
.
lambdaQuery
(
SweetManualArtists
.
class
).
eq
(
SweetManualArtists:
:
getArtistsId
,
artistId
)
).
stream
().
map
(
SweetManualArtists:
:
getManualId
).
collect
(
Collectors
.
toSet
()),
SweetConstant
.
REDIS_KEY_SWEET_MANUAL_TIME_LIST
);
invalidateManualTimeList
(
sweetManualArtistsMdskMapper
.
selectList
(
Wrappers
.
lambdaQuery
(
SweetManualArtistsMdsk
.
class
).
eq
(
SweetManualArtistsMdsk:
:
getArtistsId
,
artistId
)
).
stream
().
map
(
SweetManualArtistsMdsk:
:
getManualId
).
collect
(
Collectors
.
toSet
()),
SweetConstant
.
REDIS_KEY_SWEET_MDSK_MANUAL_TIME_LIST
);
invalidateManualTimeList
(
sweetManualArtistsTfcMapper
.
selectList
(
Wrappers
.
lambdaQuery
(
SweetManualArtistsTfc
.
class
).
eq
(
SweetManualArtistsTfc:
:
getArtistsId
,
artistId
)
).
stream
().
map
(
SweetManualArtistsTfc:
:
getManualId
).
collect
(
Collectors
.
toSet
()),
SweetConstant
.
REDIS_KEY_SWEET_TFC_MANUAL_TIME_LIST
);
invalidateManualTimeList
(
sweetManualArtistsFiveMapper
.
selectList
(
Wrappers
.
lambdaQuery
(
SweetManualArtistsFive
.
class
).
eq
(
SweetManualArtistsFive:
:
getArtistsId
,
artistId
)
).
stream
().
map
(
SweetManualArtistsFive:
:
getManualId
).
collect
(
Collectors
.
toSet
()),
SweetConstant
.
REDIS_KEY_SWEET_FIVE_MANUAL_TIME_LIST
);
}
catch
(
Exception
e
)
{
log
.
error
(
"invalidate sweet artist cache failed, artistId={}"
,
artistId
,
e
);
}
}
private
void
invalidateManualTimeList
(
Set
<
String
>
manualIds
,
String
keyPrefix
)
{
if
(
manualIds
==
null
||
manualIds
.
isEmpty
())
{
return
;
}
for
(
String
manualId
:
new
HashSet
<>(
manualIds
))
{
if
(
manualId
!=
null
&&
!
manualId
.
isEmpty
())
{
redisDataSourceUtil
.
getRedisSweetUtil
().
del
(
keyPrefix
.
concat
(
manualId
));
}
}
}
}
liquidnet-bus-common/liquidnet-common-service-base/src/main/java/com/liquidnet/service/base/constant/RedisKeyExpireConst.java
View file @
c1aa0836
...
...
@@ -60,6 +60,9 @@ public class RedisKeyExpireConst {
// 演出关联阵容缓存过期时间
public
static
final
long
PERFORMANCES_ARTISTS_EXPIRE
=
30
*
24
*
60
*
60
;
// C端艺人详情相关缓存过期时间
public
static
final
long
ARTIST_FRONT_CACHE_EXPIRE
=
30
*
24
*
60
*
60
;
/**
* 演出关联收钱吧商品缓存过期时间 (30天)
*/
...
...
liquidnet-bus-config/liquidnet-config/liquidnet-service-kylin.yml
View file @
c1aa0836
...
...
@@ -161,6 +161,8 @@ global-auth:
-
${liquidnet.info.context}/health
# 演出阵容
-
${liquidnet.info.context}/performance/artists/**
# 艺人详情 C 端(无需登录)
-
${liquidnet.info.context}/artist/**
oncheck-url-pattern
:
-
${liquidnet.info.context}/order/details
-
${liquidnet.info.context}/order/transfer*
...
...
liquidnet-bus-do/liquidnet-service-goblin-do/src/main/java/com/liquidnet/service/goblin/mapper/GoblinSqbOrderMapper.java
View file @
c1aa0836
...
...
@@ -17,7 +17,8 @@ import java.util.List;
public
interface
GoblinSqbOrderMapper
extends
BaseMapper
<
GoblinSqbOrder
>
{
/**
* 联表过滤:主单已支付(2)、演出已结束、扩展未核销;可选按演出 id 缩小范围
* 联表过滤候选:未核销 + 有演出关联,且满足其一:
* 主单已支付(2)+演出已结束,或主单退款中(61)+进入退款中已超 8 小时;可选按演出 id 缩小范围
*/
List
<
GoblinSqbOrder
>
selectAutoRefundCandidates
(
@Param
(
"performancesId"
)
String
performancesId
);
}
liquidnet-bus-do/liquidnet-service-goblin-do/src/main/resources/com.liquidnet.service.goblin.mapper/GoblinSqbOrderMapper.xml
View file @
c1aa0836
...
...
@@ -2,17 +2,24 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.liquidnet.service.goblin.mapper.GoblinSqbOrderMapper"
>
<!-- 收钱吧扩展单 + 主单已支付 + 演出已结束 + 未核销(定时自动退候选) -->
<!-- 定时自动退候选:未核销 + 有演出关联,且满足其一:
1) 主单已支付(2) + 演出已结束
2) 主单退款中(61) + 进入退款中已超 8 小时(卡单重试,不要求演出结束) -->
<select
id=
"selectAutoRefundCandidates"
resultType=
"com.liquidnet.service.goblin.entity.GoblinSqbOrder"
>
SELECT so.*
FROM goblin_sqb_order so
INNER JOIN goblin_store_order o ON o.order_id = so.order_id
INNER JOIN kylin_performances kp ON kp.performances_id = so.performances_id
WHERE (so.coupon_used_status = 0 OR so.coupon_used_status IS NULL)
AND o.status = 2
AND kp.time_end
<
NOW()
AND so.performances_id IS NOT NULL
AND so.performances_id != ''
AND (
(o.status = 2 AND kp.time_end
<
NOW())
OR (
o.status = 61
AND o.updated_at
<
= DATE_SUB(NOW(), INTERVAL 8 HOUR)
)
)
<if
test=
"performancesId != null and performancesId != ''"
>
AND so.performances_id = #{performancesId}
</if>
...
...
liquidnet-bus-do/liquidnet-service-kylin-do/src/main/java/com/liquidnet/service/kylin/entity/KylinArtist.java
View file @
c1aa0836
...
...
@@ -36,6 +36,11 @@ public class KylinArtist implements Serializable, Cloneable {
*/
private
String
artistName
;
/**
* 姓名拼音
*/
private
String
pinyin
;
/**
* 艺人类型 1音乐人 2艺术家 3厂牌 4品牌方
*/
...
...
liquidnet-bus-do/liquidnet-service-kylin-do/src/main/java/com/liquidnet/service/kylin/entity/KylinArtistProduct.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
entity
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
java.io.Serializable
;
import
java.time.LocalDateTime
;
/**
* 艺人关联商品
*/
@Data
@EqualsAndHashCode
(
callSuper
=
false
)
public
class
KylinArtistProduct
implements
Serializable
,
Cloneable
{
private
static
final
long
serialVersionUID
=
1L
;
@TableId
(
value
=
"mid"
,
type
=
IdType
.
AUTO
)
private
Long
mid
;
private
String
relationId
;
private
String
artistId
;
private
String
spuId
;
private
Integer
sort
;
private
Integer
status
;
private
LocalDateTime
createdAt
;
private
LocalDateTime
updatedAt
;
private
static
final
KylinArtistProduct
obj
=
new
KylinArtistProduct
();
public
static
KylinArtistProduct
getNew
()
{
try
{
return
(
KylinArtistProduct
)
obj
.
clone
();
}
catch
(
CloneNotSupportedException
e
)
{
return
new
KylinArtistProduct
();
}
}
}
liquidnet-bus-do/liquidnet-service-kylin-do/src/main/java/com/liquidnet/service/kylin/mapper/KylinArtistProductMapper.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.liquidnet.service.kylin.entity.KylinArtistProduct
;
import
java.util.List
;
public
interface
KylinArtistProductMapper
extends
BaseMapper
<
KylinArtistProduct
>
{
List
<
KylinArtistProduct
>
selectByArtistId
(
String
artistId
);
int
deleteByArtistId
(
String
artistId
);
}
liquidnet-bus-do/liquidnet-service-kylin-do/src/main/resources/com.liquidnet.service.kylin.mapper/KylinArtistMapper.xml
View file @
c1aa0836
...
...
@@ -19,7 +19,7 @@
a.introduction,
a.created_at,
(SELECT COUNT(1) FROM kylin_artist_performance ap WHERE ap.artist_id = a.artist_id) as performance_count,
0
as product_count
(SELECT COUNT(1) FROM kylin_artist_product ap2 WHERE ap2.artist_id = a.artist_id AND ap2.status = 1)
as product_count
FROM kylin_artist a
<where>
a.status = 1
...
...
liquidnet-bus-do/liquidnet-service-kylin-do/src/main/resources/com.liquidnet.service.kylin.mapper/KylinArtistProductMapper.xml
0 → 100644
View file @
c1aa0836
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.liquidnet.service.kylin.mapper.KylinArtistProductMapper"
>
<select
id=
"selectByArtistId"
parameterType=
"java.lang.String"
resultType=
"com.liquidnet.service.kylin.entity.KylinArtistProduct"
>
SELECT mid, relation_id, artist_id, spu_id, sort, status, created_at, updated_at
FROM kylin_artist_product
WHERE artist_id = #{artistId} AND status = 1
ORDER BY sort DESC, mid DESC
</select>
<delete
id=
"deleteByArtistId"
parameterType=
"java.lang.String"
>
DELETE FROM kylin_artist_product
WHERE artist_id = #{artistId}
</delete>
</mapper>
liquidnet-bus-do/liquidnet-service-sweet-do/src/main/resources/com.liquidnet.service.sweet.mapper/SweetManualArtistsFiveMapper.xml
View file @
c1aa0836
...
...
@@ -23,11 +23,11 @@
<select
id=
"getManualList"
parameterType=
"java.util.Map"
resultMap=
"getManualListResult"
>
select manual_relation_id,
sa.`artist
s_id`
,
sa.`
name`
,
sa.`artist
_id` as artists_id
,
sa.`
artist_name` as name
,
sa.pinyin,
sa.describes,
sa.pic_url,
sa.
introduction as
describes,
sa.
avatar_url as
pic_url,
ss.stage_id,
ss.title,
performance_start,
...
...
@@ -35,7 +35,7 @@
signature_start,
signature_end
from sweet_manual_artists_Five as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where>
sma.status = 1 and manual_id = #{manualId}
...
...
@@ -45,8 +45,8 @@
<select
id=
"getManualDetails"
parameterType=
"java.util.Map"
resultMap=
"getManualListResult"
>
select manual_relation_id,
sa.`
name`
,
sa.`artist
s_id`
,
sa.`
artist_name` as name
,
sa.`artist
_id` as artists_id
,
ss.title,
ss.stage_id,
performance_start,
...
...
@@ -54,7 +54,7 @@
signature_start,
signature_end
from sweet_manual_artists_Five as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where manual_relation_id = #{manualRelationId}
</select>
...
...
@@ -62,7 +62,7 @@
<select
id=
"getStageNameList"
parameterType=
"java.util.Map"
resultMap=
"getStageNameListResult"
>
select ss.title
from sweet_manual_artists_Five as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1
and manual_id = #{manualId}
...
...
liquidnet-bus-do/liquidnet-service-sweet-do/src/main/resources/com.liquidnet.service.sweet.mapper/SweetManualArtistsMapper.xml
View file @
c1aa0836
...
...
@@ -23,11 +23,11 @@
<select
id=
"getManualList"
parameterType=
"java.util.Map"
resultMap=
"getManualListResult"
>
select manual_relation_id,
sa.`artist
s_id`
,
sa.`
name`
,
sa.`artist
_id` as artists_id
,
sa.`
artist_name` as name
,
sa.pinyin,
sa.describes,
sa.pic_url,
sa.
introduction as
describes,
sa.
avatar_url as
pic_url,
ss.stage_id,
ss.title,
performance_start,
...
...
@@ -35,7 +35,7 @@
signature_start,
signature_end
from sweet_manual_artists as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where>
sma.status = 1 and manual_id = #{manualId}
...
...
@@ -45,8 +45,8 @@
<select
id=
"getManualDetails"
parameterType=
"java.util.Map"
resultMap=
"getManualListResult"
>
select manual_relation_id,
sa.`
name`
,
sa.`artist
s_id`
,
sa.`
artist_name` as name
,
sa.`artist
_id` as artists_id
,
ss.title,
ss.stage_id,
performance_start,
...
...
@@ -54,7 +54,7 @@
signature_start,
signature_end
from sweet_manual_artists as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where manual_relation_id = #{manualRelationId}
</select>
...
...
@@ -62,7 +62,7 @@
<select
id=
"getStageNameList"
parameterType=
"java.util.Map"
resultMap=
"getStageNameListResult"
>
select ss.title
from sweet_manual_artists as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1
and manual_id = #{manualId}
...
...
@@ -74,7 +74,7 @@
select ss.title, ss.stage_id
from sweet_manual_artists as sma
join sweet_manual as sm on sm.manual_id = sma.manual_id
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1
and sm.performance_id = #{performanceId}
...
...
@@ -82,11 +82,11 @@
</select>
<select
id=
"getManualListAr"
resultType=
"com.liquidnet.service.sweet.dto.SweetManualArtistListArDto"
>
select manual_relation_id,
sa.`artist
s_id`
,
sa.`
name`
,
sa.`artist
_id` as artists_id
,
sa.`
artist_name` as name
,
sa.pinyin,
sa.describes,
sa.pic_url,
sa.
introduction as
describes,
sa.
avatar_url as
pic_url,
ss.stage_id,
ss.title,
performance_start,
...
...
@@ -95,7 +95,7 @@
signature_end
from sweet_manual_artists as sma
join sweet_manual as sm on sm.manual_id = sma.manual_id
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where>
sma.status = 1 and sm.performance_id = #{performanceId}
...
...
liquidnet-bus-do/liquidnet-service-sweet-do/src/main/resources/com.liquidnet.service.sweet.mapper/SweetManualArtistsMdskMapper.xml
View file @
c1aa0836
...
...
@@ -23,11 +23,11 @@
<select
id=
"getManualList"
parameterType=
"java.util.Map"
resultMap=
"getManualListResult"
>
select manual_relation_id,
sa.`artist
s_id`
,
sa.`
name`
,
sa.`artist
_id` as artists_id
,
sa.`
artist_name` as name
,
sa.pinyin,
sa.describes,
sa.pic_url,
sa.
introduction as
describes,
sa.
avatar_url as
pic_url,
ss.stage_id,
ss.title,
performance_start,
...
...
@@ -35,7 +35,7 @@
signature_start,
signature_end
from sweet_manual_artists_mdsk as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where>
sma.status = 1 and manual_id = #{manualId}
...
...
@@ -45,8 +45,8 @@
<select
id=
"getManualDetails"
parameterType=
"java.util.Map"
resultMap=
"getManualListResult"
>
select manual_relation_id,
sa.`
name`
,
sa.`artist
s_id`
,
sa.`
artist_name` as name
,
sa.`artist
_id` as artists_id
,
ss.title,
ss.stage_id,
performance_start,
...
...
@@ -54,7 +54,7 @@
signature_start,
signature_end
from sweet_manual_artists_mdsk as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where manual_relation_id = #{manualRelationId}
</select>
...
...
@@ -62,7 +62,7 @@
<select
id=
"getStageNameList"
parameterType=
"java.util.Map"
resultMap=
"getStageNameListResult"
>
select ss.title
from sweet_manual_artists_mdsk as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1
and manual_id = #{manualId}
...
...
liquidnet-bus-do/liquidnet-service-sweet-do/src/main/resources/com.liquidnet.service.sweet.mapper/SweetManualArtistsTfcMapper.xml
View file @
c1aa0836
...
...
@@ -23,11 +23,11 @@
<select
id=
"getManualList"
parameterType=
"java.util.Map"
resultMap=
"getManualListResult"
>
select manual_relation_id,
sa.`artist
s_id`
,
sa.`
name`
,
sa.`artist
_id` as artists_id
,
sa.`
artist_name` as name
,
sa.pinyin,
sa.describes,
sa.pic_url,
sa.
introduction as
describes,
sa.
avatar_url as
pic_url,
ss.stage_id,
ss.title,
performance_start,
...
...
@@ -35,7 +35,7 @@
signature_start,
signature_end
from sweet_manual_artists_tfc as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
<where>
sma.status = 1 and manual_id = #{manualId}
...
...
@@ -45,8 +45,8 @@
<select
id=
"getManualDetails"
parameterType=
"java.util.Map"
resultMap=
"getManualListResult"
>
select manual_relation_id,
sa.`
name`
,
sa.`artist
s_id`
,
sa.`
artist_name` as name
,
sa.`artist
_id` as artists_id
,
ss.title,
ss.stage_id,
performance_start,
...
...
@@ -54,7 +54,7 @@
signature_start,
signature_end
from sweet_manual_artists_tfc as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where manual_relation_id = #{manualRelationId}
</select>
...
...
@@ -62,7 +62,7 @@
<select
id=
"getStageNameList"
parameterType=
"java.util.Map"
resultMap=
"getStageNameListResult"
>
select ss.title
from sweet_manual_artists_tfc as sma
left join
sweet_artists as sa on sa.artists
_id = sma.artists_id
left join
kylin_artist as sa on sa.artist
_id = sma.artists_id
left join sweet_stage as ss on ss.stage_id = sma.stage_id
where sma.status = 1
and manual_id = #{manualId}
...
...
liquidnet-bus-service/liquidnet-service-executor-all/liquidnet-service-executor-main/src/main/java/com/liquidnet/service/executor/main/handler/GoblinTaskHandler.java
View file @
c1aa0836
...
...
@@ -70,7 +70,7 @@ public class GoblinTaskHandler {
}
/**
* 演出结束自动退款
* 演出结束自动退款
/ 退款中超8小时卡单重试
* xxl-job 配置:JobHandler = sev-goblin:sqbAutoRefund;参数为演出ID、或 performancesId=xxx;空则走 goblin 全库候选(慎用)
*/
@XxlJob
(
value
=
"sev-goblin:sqbAutoRefund"
)
...
...
liquidnet-bus-service/liquidnet-service-goblin/liquidnet-service-goblin-impl/src/main/java/com/liquidnet/service/goblin/controller/Inner/GoblinSqbJobController.java
View file @
c1aa0836
...
...
@@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.RestController;
* - JobHandler:sev-goblin:sqbAutoRefund(接口走 rsc/** 免登录,与 NFT job 一致)
* - CRON:按演出结束时间触发(如演出结束后 5 分钟:0 5 * * * ?,具体由运维根据演出时间动态配置)
* - 执行器:liquidnet-service-executor
* - 任务参数:演出ID 或 performancesId=xxx;留空则处理全库
「演出已结束 + 主单已支付 + 扩展未核销」候选(
慎用)
* - 任务参数:演出ID 或 performancesId=xxx;留空则处理全库
候选(演出结束已支付 / 退款中超8小时,
慎用)
* - 路由策略:第一个
*/
@Slf4j
...
...
@@ -32,7 +32,7 @@ public class GoblinSqbJobController {
private
IGoblinSqbService
goblinSqbService
;
@PostMapping
(
"/autoRefund"
)
@ApiOperation
(
"
演出结束自动退款
"
)
@ApiOperation
(
"
收钱吧自动退款(演出结束已支付 / 退款中超8小时卡单重试)
"
)
public
ResponseDto
<
String
>
autoRefund
(
@RequestParam
(
value
=
"performancesId"
,
required
=
false
)
String
performancesId
)
{
log
.
info
(
"[收钱吧自动退款] 收到任务,performancesId={}"
,
performancesId
);
return
goblinSqbService
.
autoRefundByPerformance
(
performancesId
);
...
...
liquidnet-bus-service/liquidnet-service-goblin/liquidnet-service-goblin-impl/src/main/java/com/liquidnet/service/goblin/service/impl/GoblinSqbServiceImpl.java
View file @
c1aa0836
...
...
@@ -134,7 +134,8 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
if
(
Integer
.
valueOf
(
GoblinStatusConst
.
Status
.
ORDER_STATUS_6
.
getValue
()).
equals
(
storeSt
))
{
return
ResponseDto
.
failure
(
"订单已退款,不可重复退款"
);
}
if
(!
Integer
.
valueOf
(
GoblinStatusConst
.
Status
.
ORDER_STATUS_2
.
getValue
()).
equals
(
storeSt
))
{
boolean
isRetry
=
Integer
.
valueOf
(
GoblinStatusConst
.
Status
.
ORDER_STATUS_61
.
getValue
()).
equals
(
storeSt
);
if
(!
isRetry
&&
!
Integer
.
valueOf
(
GoblinStatusConst
.
Status
.
ORDER_STATUS_2
.
getValue
()).
equals
(
storeSt
))
{
return
ResponseDto
.
failure
(
"订单状态不可退款"
);
}
List
<
String
>
orderSkuVoIds
=
storeOrderVo
.
getOrderSkuVoIds
();
...
...
@@ -160,11 +161,13 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
return
ResponseDto
.
failure
(
"券码已核销,不可退款"
);
}
// 更新状态为退款中
String
now
=
LocalDateTime
.
now
().
format
(
DTF
);
orderVo
.
setUpdatedAt
(
now
);
goblinSqbRedisUtils
.
setSqbOrder
(
orderId
,
orderVo
);
syncOrderStatus
(
orderId
,
4
);
// 首次申请:置退款中;卡单重试(已是61):不改主单状态,避免刷新 updated_at
if
(!
isRetry
)
{
String
now
=
LocalDateTime
.
now
().
format
(
DTF
);
orderVo
.
setUpdatedAt
(
now
);
goblinSqbRedisUtils
.
setSqbOrder
(
orderId
,
orderVo
);
syncOrderStatus
(
orderId
,
4
);
}
List
<
GoblinOrderSkuVo
>
orderSkuVos
=
new
ArrayList
<>();
for
(
String
skuVoId
:
storeOrderVo
.
getOrderSkuVoIds
())
{
...
...
@@ -183,32 +186,39 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
reason
,
buildRequestId
(
IDGenerator
.
nextSnowId
())
);
log
.
info
(
"[收钱吧-退款] 收钱吧退款响应: {}, orderId: {}
."
,
JsonUtils
.
toJson
(
refundData
),
orderId
);
log
.
info
(
"[收钱吧-退款] 收钱吧退款响应: {}, orderId: {}
, isRetry={}."
,
JsonUtils
.
toJson
(
refundData
),
orderId
,
isRetry
);
if
(
refundData
==
null
)
{
// 退款失败,回滚状态
orderVo
.
setUpdatedAt
(
LocalDateTime
.
now
().
format
(
DTF
));
goblinSqbRedisUtils
.
setSqbOrder
(
orderId
,
orderVo
);
syncOrderStatus
(
orderId
,
1
);
if
(!
isRetry
)
{
// 首次申请失败:回滚为已支付
orderVo
.
setUpdatedAt
(
LocalDateTime
.
now
().
format
(
DTF
));
goblinSqbRedisUtils
.
setSqbOrder
(
orderId
,
orderVo
);
syncOrderStatus
(
orderId
,
1
);
}
else
{
log
.
warn
(
"[收钱吧-退款] 卡单重试失败,保持退款中,orderId={}"
,
orderId
);
}
return
ResponseDto
.
failure
(
"退款失败,请稍后重试"
);
}
//
退款成功
//
调收钱吧成功:写退款号;库存只在退款回调 targetState=20 时回(避免申请成功+回调各回一次)
orderVo
.
setRefundSn
(
refundData
.
getTicketsSn
());
orderVo
.
setRefundSignature
(
refundData
.
getTicketSignature
());
orderVo
.
setRefundReason
(
reason
);
orderVo
.
setUpdatedAt
(
LocalDateTime
.
now
().
format
(
DTF
));
goblinSqbRedisUtils
.
setSqbOrder
(
orderId
,
orderVo
);
goblinRedisUtils
.
incrSkuStock
(
null
,
orderVo
.
getSkuId
(),
orderVo
.
getQuantity
());
// syncOrderStatus(orderId, 3);
log
.
info
(
"[收钱吧-退款] 调用收钱吧退款成功,orderId={}
"
,
orderId
);
log
.
info
(
"[收钱吧-退款] 调用收钱吧退款成功,orderId={}
, isRetry={}"
,
orderId
,
isRetry
);
return
ResponseDto
.
success
(
Boolean
.
TRUE
);
}
catch
(
Exception
e
)
{
log
.
error
(
"[收钱吧退款] 退款异常,orderId={},回滚主单为已支付"
,
orderId
,
e
);
orderVo
.
setUpdatedAt
(
LocalDateTime
.
now
().
format
(
DTF
));
goblinSqbRedisUtils
.
setSqbOrder
(
orderId
,
orderVo
);
syncOrderStatus
(
orderId
,
1
);
if
(!
isRetry
)
{
log
.
error
(
"[收钱吧退款] 退款异常,orderId={},回滚主单为已支付"
,
orderId
,
e
);
orderVo
.
setUpdatedAt
(
LocalDateTime
.
now
().
format
(
DTF
));
goblinSqbRedisUtils
.
setSqbOrder
(
orderId
,
orderVo
);
syncOrderStatus
(
orderId
,
1
);
}
else
{
log
.
error
(
"[收钱吧退款] 卡单重试异常,保持退款中,orderId={}"
,
orderId
,
e
);
}
return
ResponseDto
.
failure
(
"退款失败:"
+
e
.
getMessage
());
}
}
...
...
@@ -272,14 +282,14 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
pid
=
null
;
}
if
(
pid
==
null
)
{
log
.
warn
(
"[收钱吧自动退款] performancesId 为空,将处理库内所有
「演出已结束 + 主单已支付 + 扩展未核销」候选单
"
);
log
.
warn
(
"[收钱吧自动退款] performancesId 为空,将处理库内所有
符合条件候选单(演出结束已支付 / 退款中超8小时)
"
);
}
else
{
log
.
info
(
"[收钱吧自动退款] 开始 performancesId={}"
,
pid
);
}
List
<
GoblinSqbOrder
>
orders
=
goblinSqbOrderMapper
.
selectAutoRefundCandidates
(
pid
);
if
(
CollectionUtils
.
isEmpty
(
orders
))
{
String
scope
=
pid
!=
null
?
(
"演出 "
+
pid
)
:
"全库
(演出已结束)
"
;
String
scope
=
pid
!=
null
?
(
"演出 "
+
pid
)
:
"全库"
;
String
summary
=
scope
+
" 无待自动退款的收钱吧扩展单"
;
log
.
info
(
"[收钱吧自动退款] {}"
,
summary
);
return
ResponseDto
.
success
(
summary
);
...
...
@@ -311,7 +321,7 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
}
}
String
scopeLabel
=
pid
!=
null
?
(
"演出 "
+
pid
)
:
"全库
(演出已结束)
"
;
String
scopeLabel
=
pid
!=
null
?
(
"演出 "
+
pid
)
:
"全库"
;
String
summary
=
String
.
format
(
"%s 自动退款完成:成功 %d 笔,失败 %d 笔"
,
scopeLabel
,
successCount
,
failCount
);
log
.
info
(
"[收钱吧自动退款] {}"
,
summary
);
return
ResponseDto
.
success
(
summary
);
...
...
liquidnet-bus-service/liquidnet-service-kylin/liquidnet-service-kylin-impl/src/main/java/com/liquidnet/service/kylin/controller/KylinArtistController.java
0 → 100644
View file @
c1aa0836
package
com
.
liquidnet
.
service
.
kylin
.
controller
;
import
com.liquidnet.service.base.ResponseDto
;
import
com.liquidnet.service.kylin.dto.vo.returns.KylinArtistDetailFrontVo
;
import
com.liquidnet.service.kylin.dto.vo.returns.KylinArtistPerformanceFrontVo
;
import
com.liquidnet.service.kylin.dto.vo.returns.KylinArtistProductFrontVo
;
import
com.liquidnet.service.kylin.service.IKylinArtistFrontService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.List
;
@Api
(
tags
=
"前端-艺人"
)
@RestController
@RequestMapping
(
"artist"
)
@Slf4j
public
class
KylinArtistController
{
@Autowired
private
IKylinArtistFrontService
kylinArtistFrontService
;
@GetMapping
(
"detail/{artistId}"
)
@ApiOperation
(
"艺人详情(简介)"
)
@ApiImplicitParam
(
type
=
"path"
,
dataType
=
"String"
,
name
=
"artistId"
,
value
=
"艺人ID"
,
required
=
true
)
public
ResponseDto
<
KylinArtistDetailFrontVo
>
detail
(
@PathVariable
String
artistId
)
{
KylinArtistDetailFrontVo
vo
=
kylinArtistFrontService
.
getArtistDetail
(
artistId
);
if
(
vo
==
null
)
{
return
ResponseDto
.
failure
(
"艺人不存在"
);
}
return
ResponseDto
.
success
(
vo
);
}
@GetMapping
(
"{artistId}/album"
)
@ApiOperation
(
"艺人相册"
)
@ApiImplicitParam
(
type
=
"path"
,
dataType
=
"String"
,
name
=
"artistId"
,
value
=
"艺人ID"
,
required
=
true
)
public
ResponseDto
<
List
<
String
>>
album
(
@PathVariable
String
artistId
)
{
return
ResponseDto
.
success
(
kylinArtistFrontService
.
getArtistAlbum
(
artistId
));
}
@GetMapping
(
"{artistId}/performances"
)
@ApiOperation
(
"艺人关联演出(未开售/已开售/售罄,不含已结束)"
)
@ApiImplicitParam
(
type
=
"path"
,
dataType
=
"String"
,
name
=
"artistId"
,
value
=
"艺人ID"
,
required
=
true
)
public
ResponseDto
<
List
<
KylinArtistPerformanceFrontVo
>>
performances
(
@PathVariable
String
artistId
)
{
return
ResponseDto
.
success
(
kylinArtistFrontService
.
getArtistPerformances
(
artistId
));
}
@GetMapping
(
"{artistId}/products"
)
@ApiOperation
(
"艺人关联商品"
)
@ApiImplicitParam
(
type
=
"path"
,
dataType
=
"String"
,
name
=
"artistId"
,
value
=
"艺人ID"
,
required
=
true
)
public
ResponseDto
<
List
<
KylinArtistProductFrontVo
>>
products
(
@PathVariable
String
artistId
)
{
return
ResponseDto
.
success
(
kylinArtistFrontService
.
getArtistProducts
(
artistId
));
}
}
liquidnet-bus-service/liquidnet-service-kylin/liquidnet-service-kylin-impl/src/main/java/com/liquidnet/service/kylin/service/impl/KylinArtistFrontServiceImpl.java
0 → 100644
View file @
c1aa0836
This diff is collapsed.
Click to expand it.
liquidnet-bus-service/liquidnet-service-kylin/liquidnet-service-kylin-impl/src/main/java/com/liquidnet/service/kylin/utils/DataUtils.java
View file @
c1aa0836
...
...
@@ -1782,4 +1782,23 @@ public class DataUtils {
final
String
redisKey
=
KylinRedisConst
.
PERFORMANCES_ARTISTS
+
performancesId
;
redisUtil
.
set
(
redisKey
,
artistLineupVos
,
RedisKeyExpireConst
.
PERFORMANCES_ARTISTS_EXPIRE
);
}
public
void
delArtistCache
(
String
artistId
)
{
if
(
artistId
==
null
||
artistId
.
isEmpty
())
{
return
;
}
redisUtil
.
del
(
KylinRedisConst
.
ARTIST_DETAIL
+
artistId
);
redisUtil
.
del
(
KylinRedisConst
.
ARTIST_ALBUM
+
artistId
);
redisUtil
.
del
(
KylinRedisConst
.
ARTIST_PERFORMANCES
+
artistId
);
redisUtil
.
del
(
KylinRedisConst
.
ARTIST_PRODUCTS
+
artistId
);
}
@SuppressWarnings
(
"unchecked"
)
public
<
T
>
T
getArtistFrontCache
(
String
redisKey
)
{
return
(
T
)
redisUtil
.
get
(
redisKey
);
}
public
void
setArtistFrontCache
(
String
redisKey
,
Object
value
)
{
redisUtil
.
set
(
redisKey
,
value
,
RedisKeyExpireConst
.
ARTIST_FRONT_CACHE_EXPIRE
);
}
}
liquidnet-bus-service/liquidnet-service-sweet/pom.xml
View file @
c1aa0836
...
...
@@ -85,6 +85,12 @@
<version>
1.0-SNAPSHOT
</version>
<scope>
compile
</scope>
</dependency>
<dependency>
<groupId>
com.liquidnet
</groupId>
<artifactId>
liquidnet-service-kylin-do
</artifactId>
<version>
1.0-SNAPSHOT
</version>
<scope>
compile
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.data
</groupId>
<artifactId>
spring-data-mongodb
</artifactId>
...
...
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/controller/SweetArtistsController.java
View file @
c1aa0836
...
...
@@ -4,12 +4,7 @@ package com.liquidnet.service.sweet.controller;
import
com.github.pagehelper.PageInfo
;
import
com.liquidnet.service.base.ResponseDto
;
import
com.liquidnet.service.sweet.entity.SweetArtists
;
import
com.liquidnet.service.sweet.entity.SweetArtistsList
;
import
com.liquidnet.service.sweet.entity.SweetArtistsUrl
;
import
com.liquidnet.service.sweet.entity.SweetStage
;
import
com.liquidnet.service.sweet.param.SweetArtistsListParam
;
import
com.liquidnet.service.sweet.service.ISweetArtistsService
;
import
com.liquidnet.service.sweet.service.ISweetStageService
;
import
com.liquidnet.service.sweet.vo.SweetArtistsVo
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
...
...
@@ -18,11 +13,9 @@ import io.swagger.annotations.ApiOperation;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.List
;
/**
* <p>
* 艺人表 前端控制器
* 艺人表 前端控制器
(读 kylin_artist,写已迁移至 admin /kylin/artist)
* </p>
*
* @author liquidnet
...
...
@@ -49,20 +42,6 @@ public class SweetArtistsController {
return
sweetArtistsService
.
getList
(
page
,
size
,
name
);
}
@PostMapping
(
"add"
)
@ApiOperation
(
"添加艺人"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"picUrl"
,
value
=
"封面图片"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"name"
,
value
=
"艺人姓名"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"pinyin"
,
value
=
"姓名拼音"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"describes"
,
value
=
"艺人简介"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String[]"
,
name
=
"picArray"
,
value
=
"图片数组"
,
required
=
false
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String[]"
,
name
=
"videoArray"
,
value
=
"视频数组"
,
required
=
false
)
})
public
ResponseDto
<
Boolean
>
add
(
SweetArtistsListParam
sweetArtistsList
)
{
return
sweetArtistsService
.
add
(
sweetArtistsList
);
}
@GetMapping
(
"detail"
)
@ApiOperation
(
"艺人详情"
)
@ApiImplicitParams
({
...
...
@@ -71,28 +50,4 @@ public class SweetArtistsController {
public
ResponseDto
<
SweetArtistsVo
>
detail
(
@RequestParam
()
String
artistsId
)
{
return
sweetArtistsService
.
detail
(
artistsId
);
}
@PostMapping
(
"change"
)
@ApiOperation
(
"修改艺人"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"picUrl"
,
value
=
"封面图片"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"artistsId"
,
value
=
"艺人Id"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"name"
,
value
=
"艺人姓名"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"pinyin"
,
value
=
"姓名拼音"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"describes"
,
value
=
"艺人简介"
,
required
=
true
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String[]"
,
name
=
"picArray"
,
value
=
"图片数组"
,
required
=
false
),
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String[]"
,
name
=
"videoArray"
,
value
=
"视频数组"
,
required
=
false
)
})
public
ResponseDto
<
Boolean
>
change
(
@RequestParam
()
String
artistsId
,
SweetArtistsListParam
sweetArtistsList
)
{
return
sweetArtistsService
.
change
(
artistsId
,
sweetArtistsList
);
}
@GetMapping
(
"del"
)
@ApiOperation
(
"删除艺人"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
type
=
"query"
,
dataType
=
"String"
,
name
=
"artistsId"
,
value
=
"艺人Id"
,
required
=
true
),
})
public
ResponseDto
<
SweetArtists
>
del
(
@RequestParam
()
String
artistsId
)
{
return
sweetArtistsService
.
del
(
artistsId
);
}
}
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/service/impl/SweetArtistsServiceImpl.java
View file @
c1aa0836
This diff is collapsed.
Click to expand it.
liquidnet-bus-service/liquidnet-service-sweet/src/main/java/com/liquidnet/service/sweet/utils/RedisDataUtils.java
View file @
c1aa0836
...
...
@@ -15,6 +15,8 @@ import com.liquidnet.service.base.constant.MQConst;
import
com.liquidnet.service.base.constant.RedisKeyExpireConst
;
import
com.liquidnet.service.feign.slime.api.FeignSlimeApiClient
;
import
com.liquidnet.service.slime.dto.vo.SlimeFieldsDetailsVo
;
import
com.liquidnet.service.kylin.entity.KylinArtist
;
import
com.liquidnet.service.kylin.mapper.KylinArtistMapper
;
import
com.liquidnet.service.sweet.constant.SweetConstant
;
import
com.liquidnet.service.sweet.dto.*
;
import
com.liquidnet.service.sweet.dto.param.poster.SweetStrawberryParam
;
...
...
@@ -58,7 +60,7 @@ public class RedisDataUtils {
@Autowired
private
SweetManualShopMapper
sweetManualShopMapper
;
@Autowired
private
SweetArtistsMapper
sweetArtists
Mapper
;
private
KylinArtistMapper
kylinArtist
Mapper
;
@Autowired
private
SweetIntegralActivityDrawMapper
sweetIntegralActivityDrawMapper
;
@Autowired
...
...
@@ -405,7 +407,21 @@ public class RedisDataUtils {
// 艺人详情
public
SweetArtists
setArtistsDetails
(
String
artistsId
)
{
String
redisKey
=
SweetConstant
.
REDIS_KEY_SWEET_ARTISTS_DETAILS
.
concat
(
artistsId
);
SweetArtists
sweetArtists
=
sweetArtistsMapper
.
selectOne
(
Wrappers
.
lambdaQuery
(
SweetArtists
.
class
).
eq
(
SweetArtists:
:
getArtistsId
,
artistsId
).
eq
(
SweetArtists:
:
getStatus
,
1
));
KylinArtist
kylinArtist
=
kylinArtistMapper
.
selectOne
(
Wrappers
.
lambdaQuery
(
KylinArtist
.
class
).
eq
(
KylinArtist:
:
getArtistId
,
artistsId
)
);
SweetArtists
sweetArtists
=
null
;
if
(
kylinArtist
!=
null
)
{
sweetArtists
=
SweetArtists
.
getNew
();
sweetArtists
.
setArtistsId
(
kylinArtist
.
getArtistId
());
sweetArtists
.
setName
(
kylinArtist
.
getArtistName
());
sweetArtists
.
setPinyin
(
kylinArtist
.
getPinyin
());
sweetArtists
.
setDescribes
(
kylinArtist
.
getIntroduction
());
sweetArtists
.
setPicUrl
(
kylinArtist
.
getAvatarUrl
());
sweetArtists
.
setStatus
(
kylinArtist
.
getStatus
());
sweetArtists
.
setCreatedAt
(
kylinArtist
.
getCreatedAt
());
sweetArtists
.
setUpdatdAt
(
kylinArtist
.
getUpdatedAt
());
}
redisUtil
.
set
(
redisKey
,
sweetArtists
);
return
sweetArtists
;
}
...
...
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