'合并master'
This commit is contained in:
commit
87f637099c
1
.gitignore
vendored
1
.gitignore
vendored
@ -10,6 +10,7 @@ target
|
|||||||
.factorypath
|
.factorypath
|
||||||
|
|
||||||
log/
|
log/
|
||||||
|
logs/
|
||||||
*.factorypath
|
*.factorypath
|
||||||
lili-shop/src/main/java/cn/lili/generator/CodeGenerator.java
|
lili-shop/src/main/java/cn/lili/generator/CodeGenerator.java
|
||||||
lili-logs
|
lili-logs
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
## PS:数据库位置
|
## PS:数据库位置
|
||||||
|
|
||||||
点击跳转 https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql 这里有与tag版本一致的sql,根据tag获取sql,如果使用master代码,则需要在lilishop项目根目录的update-sql目录中,获取对应的升级sql。
|
点击跳转 https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql 这里有与tag版本一致的sql,根据tag获取sql,如果使用master代码,则需要在lilishop项目根目录的update-sql目录中,获取对应的升级sql。
|
||||||
|
|
||||||
|
|
||||||
|
使用master分支代码时,可能会无法运行,执行完初始化sql之后需要执行当前目录下'versiontXXXXtoMASTER.sql'。
|
56
DB/version4.2.3toMASTER.sql
Normal file
56
DB/version4.2.3toMASTER.sql
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/** 新增已退货数量 **/
|
||||||
|
ALTER TABLE li_order_item ADD return_goods_number int DEFAULT 0 COMMENT '退货数量 ';
|
||||||
|
|
||||||
|
|
||||||
|
-- 促销重构sql
|
||||||
|
ALTER TABLE li_coupon DROP COLUMN promotion_status;
|
||||||
|
|
||||||
|
ALTER TABLE li_coupon_activity DROP COLUMN promotion_status;
|
||||||
|
ALTER TABLE li_coupon_activity ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '范围关联的ID';
|
||||||
|
ALTER TABLE li_coupon_activity ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型';
|
||||||
|
|
||||||
|
ALTER TABLE li_full_discount DROP COLUMN promotion_status;
|
||||||
|
ALTER TABLE li_full_discount ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
|
||||||
|
ALTER TABLE li_full_discount ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型';
|
||||||
|
|
||||||
|
ALTER TABLE li_kanjia_activity_goods DROP COLUMN promotion_status;
|
||||||
|
ALTER TABLE li_kanjia_activity_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
|
||||||
|
ALTER TABLE li_kanjia_activity_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型';
|
||||||
|
ALTER TABLE li_kanjia_activity_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE li_pintuan DROP COLUMN promotion_status;
|
||||||
|
ALTER TABLE li_pintuan ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
|
||||||
|
ALTER TABLE li_pintuan ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型';
|
||||||
|
|
||||||
|
ALTER TABLE li_points_goods DROP COLUMN promotion_status;
|
||||||
|
ALTER TABLE li_points_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
|
||||||
|
ALTER TABLE li_points_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型';
|
||||||
|
ALTER TABLE li_points_goods ADD `original_price` double(10,2) DEFAULT NULL COMMENT '原价';
|
||||||
|
ALTER TABLE li_points_goods ADD `thumbnail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '缩略图';
|
||||||
|
ALTER TABLE li_points_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品编号';
|
||||||
|
ALTER TABLE li_points_goods ADD `goods_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '货品名称';
|
||||||
|
|
||||||
|
ALTER TABLE li_promotion_goods DROP COLUMN promotion_status;
|
||||||
|
ALTER TABLE li_promotion_goods ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
|
||||||
|
ALTER TABLE li_promotion_goods ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型';
|
||||||
|
ALTER TABLE li_promotion_goods ADD `original_price` double(10,2) DEFAULT NULL COMMENT '原价';
|
||||||
|
ALTER TABLE li_promotion_goods ADD `points` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '兑换积分';
|
||||||
|
ALTER TABLE li_promotion_goods ADD `goods_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品编号';
|
||||||
|
|
||||||
|
ALTER TABLE li_seckill DROP COLUMN promotion_status;
|
||||||
|
ALTER TABLE li_seckill ADD `scope_id` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '范围关联的ID';
|
||||||
|
ALTER TABLE li_seckill ADD `scope_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'PORTION_GOODS' COMMENT '关联范围类型';
|
||||||
|
|
||||||
|
ALTER TABLE li_full_discount RENAME COLUMN is_coupon TO coupon_flag;
|
||||||
|
ALTER TABLE li_full_discount RENAME COLUMN is_free_freight TO free_freight_flag;
|
||||||
|
ALTER TABLE li_full_discount RENAME COLUMN is_full_minus TO full_minus_flag;
|
||||||
|
ALTER TABLE li_full_discount RENAME COLUMN is_full_rate TO full_rate_flag;
|
||||||
|
ALTER TABLE li_full_discount RENAME COLUMN is_gift TO gift_flag;
|
||||||
|
ALTER TABLE li_full_discount RENAME COLUMN is_point TO point_flag;
|
||||||
|
|
||||||
|
ALTER TABLE li_member_coupon RENAME COLUMN is_platform TO platform_flag;
|
||||||
|
|
||||||
|
ALTER TABLE li_goods RENAME COLUMN is_auth TO auth_flag;
|
||||||
|
|
||||||
|
ALTER TABLE li_goods_sku RENAME COLUMN is_promotion TO promotion_flag;
|
||||||
|
ALTER TABLE li_goods_sku RENAME COLUMN is_auth TO auth_flag;
|
114
README.md
114
README.md
@ -1,6 +1,6 @@
|
|||||||
## 🔥 Lilishop B2B2C商城系统
|
## Lilishop B2B2C商城系统
|
||||||
|
|
||||||
##### 🌹 开源不易,如有帮助请点Star
|
##### 开源不易,如有帮助请点Star
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -20,51 +20,33 @@
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
### 🔥 商城介绍
|
### 商城介绍
|
||||||
**官网**:https://pickmall.cn
|
**官网**:https://pickmall.cn
|
||||||
|
|
||||||
Lilishop商城系统支持商家入驻,后端基于SpringBoot 研发,前端使用 Vue、uniapp开发, **系统全端全部代码开源**
|
Lilishop商城系统支持商家入驻,后端基于SpringBoot 研发,前端使用 Vue、uniapp开发, **系统全端全部代码开源**
|
||||||
|
|
||||||
商城前后端分离,支持分布式部署,各个API独立,并且有独立的消费者。
|
商城前后端分离,支持分布式部署,支持Docker,各个API独立,并且有独立的消费者。
|
||||||
|
|
||||||
商城包含 会员模块、**第三方登录模块**、**第三方支付模块**、**楼层装修模块**、订单模块、商品模块、促销模块、分销模块、文章模块、系统设置模块、流量分析模块和平台运营模块
|
|
||||||
|
|
||||||
商城包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等,支持Docker,支持k8s。是一款高性能、支持分布式、支持扩展的商城系统。
|
|
||||||
|
|
||||||
### 商城 API/消费者 聚合版
|
### 商城 API/消费者 聚合版
|
||||||
api不需要单独部署,只需启动一个jar包就可以正常运转 如有需要,可以点击跳转
|
api不需要单独部署,只需启动一个jar包就可以正常运转 如有需要,可以点击跳转
|
||||||
https://gitee.com/beijing_hongye_huicheng/lilishop-simplify
|
https://gitee.com/beijing_hongye_huicheng/lilishop-simplify
|
||||||
|
|
||||||
### ☃️ 商城 开发/使用/常见问题 帮助文档
|
### 商城 开发/使用/常见问题 帮助文档
|
||||||
|
|
||||||
https://docs.pickmall.cn
|
https://docs.pickmall.cn
|
||||||
|
|
||||||
### 💧 开源商城项目地址(gitee)
|
### 项目地址
|
||||||
|
|
||||||
**API(商城所有API)**:https://gitee.com/beijing_hongye_huicheng/lilishop.git
|
gitee : https://gitee.com/beijing_hongye_huicheng
|
||||||
|
|
||||||
**UI(平台管理端/商家端/买家PC端)**: https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
|
github 镜像: https://github.com/lilishop?tab=repositories
|
||||||
|
|
||||||
**uniapp(商城移动端,支持小程序/APP/H5)**:https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
|
商城UI 项目下3个文件夹
|
||||||
|
buyer:买家PC端,seller:商家端,manager:后台管理端
|
||||||
**docker一键部署(商城部署脚本)**:https://gitee.com/beijing_hongye_huicheng/docker.git
|
|
||||||
|
|
||||||
### 💧 开源商城项目地址(github)
|
|
||||||
|
|
||||||
**API(商城所有API)**:https://github.com/hongyehuicheng/lilishop.git
|
|
||||||
|
|
||||||
**UI(平台管理端/商家端/买家PC端)**: https://github.com/hongyehuicheng/lilishop-ui.git
|
|
||||||
|
|
||||||
**uniapp(商城移动端,支持小程序/APP/H5)**:https://github.com/hongyehuicheng/lilishop-uniapp.git
|
|
||||||
|
|
||||||
**docker一键部署(商城部署脚本)**:https://github.com/hongyehuicheng/docker.git
|
|
||||||
|
|
||||||
|
|
||||||
|
### 演示地址
|
||||||
☃️ UI 项目下3个文件夹 buyer:买家PC端,seller:商家端,manager:后台管理端
|
PS:手机验证码为 ‘111111’
|
||||||
|
|
||||||
|
|
||||||
### 💧 演示地址(手机验证码为 ‘111111’)
|
|
||||||
|
|
||||||
**平台管理端**:https://admin-b2b2c.pickmall.cn 账号:admin/123456
|
**平台管理端**:https://admin-b2b2c.pickmall.cn 账号:admin/123456
|
||||||
|
|
||||||
@ -72,88 +54,54 @@ https://docs.pickmall.cn
|
|||||||
|
|
||||||
**商城PC页面**:https://pc-b2b2c.pickmall.cn
|
**商城PC页面**:https://pc-b2b2c.pickmall.cn
|
||||||
|
|
||||||
**商城移动端(请使浏览器手机模式,或者用手机浏览器打开)**:https://m-b2b2c.pickmall.cn
|
**商城 小程序/公众号/APP**:扫描二维码
|
||||||
|
|
||||||
**商城 小程序/公众号/APP(支持ios、android)**:扫描二维码
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 🚙 3行命令搭建本地商城(注:只能本机访问,前端镜像固定访问 127.0.0.1,如果是非本机体验,请自行下载源码操作镜像)
|
### 快速部署本地商城
|
||||||
|
|
||||||
温馨提示:由于服务中间件较多,如果笔记本环境启动内存没有32g可能无法启动成功(macbookpro 2020 16g内存启动无法成功),台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。
|
[点击跳转](https://docs.pickmall.cn/deploy/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html)
|
||||||
|
|
||||||
##### docker环境安装 [点击跳转](https://docs.pickmall.cn/deploy/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html)
|
**商城数据库**
|
||||||
|
使用docker-compose部署数据库,自动初始化数据库,不需要手动下载等操作
|
||||||
|
|
||||||
##### 下载docker-compose脚本
|
如果手动部署,才需要获取sql [点击跳转](https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql) (PS:这里有与tag版本一致的sql,如果是历史版本,则docker项目也切换至历史版本获取sql即可,历史版本升级则根据java相聚的根目录DB目录下的升级sql,按需执行)。
|
||||||
`git clone https://gitee.com/beijing_hongye_huicheng/docker.git `
|
|
||||||
|
|
||||||
##### 部署商城所需中间件
|
|
||||||
`docker-compose up -d`
|
|
||||||
|
|
||||||
##### 部署商城应用
|
|
||||||
`docker-compose -f docker-compose-application.yml up -d`
|
|
||||||
|
|
||||||
PS:商城数据库非docker部署
|
|
||||||
https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql
|
|
||||||
|
|
||||||
这里有与tag版本一致的sql,根据tag获取sql,如果使用master代码
|
|
||||||
|
|
||||||
##### 商城 API/UI 地址
|
|
||||||
|
|
||||||
| API | 地址 |
|
|
||||||
| -------------- | --------------- |
|
|
||||||
| 买家API | http://127.0.0.1:8888 |
|
|
||||||
| 商家API | http://127.0.0.1:8889 |
|
|
||||||
| 管理端API | http://127.0.0.1:8887 |
|
|
||||||
| 通用API | http://127.0.0.1:8890 |
|
|
||||||
|
|
||||||
| 前端演示 | 地址 |
|
|
||||||
| -------------- | --------------- |
|
|
||||||
| 商城PC端 | http://127.0.0.1:10000 |
|
|
||||||
| 商城H5端 | http://127.0.0.1:10001 |
|
|
||||||
| 卖家端 | http://127.0.0.1:10002 |
|
|
||||||
| 平台管理端 | http://127.0.0.1:10003 |
|
|
||||||
|
|
||||||
其他小程序/app等需自行打包。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### ⚾️ 功能列表
|
### 功能列表
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 🥎 平台管理端功能
|
#### 平台管理端功能
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### 🥎 卖家功能
|
#### 卖家功能
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
### 商城前端功能展示
|
||||||
|
|
||||||
|
#### 商城移动端
|
||||||
|
|
||||||
### 🧩 商城前端功能展示
|
|
||||||
|
|
||||||
#### ⚽️ 商城移动端
|
|
||||||
|
|
||||||
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="移动端功能展示" style="zoom:50%;" />
|
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="移动端功能展示" style="zoom:50%;" />
|
||||||
|
|
||||||
#### ⚽️ 平台管理端
|
#### 平台管理端
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
### 技术选型
|
### 技术选型
|
||||||
|
|
||||||
#### 🥅 架构图
|
#### 架构图
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
##### 🕹 后台技术选型
|
##### 后台技术选型
|
||||||
|
|
||||||
| 说明 | 框架 | 说明 | |
|
| 说明 | 框架 | 说明 | |
|
||||||
| -------------- | --------------- | -------------- | ------------- |
|
| -------------- | --------------- | -------------- | ------------- |
|
||||||
@ -167,7 +115,7 @@ https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql
|
|||||||
| 短信 | 阿里云短信 | 认证 | JWT |
|
| 短信 | 阿里云短信 | 认证 | JWT |
|
||||||
| 日志处理 | Log4j | 接口规范 | RESTful |
|
| 日志处理 | Log4j | 接口规范 | RESTful |
|
||||||
|
|
||||||
##### 🖥 前端-运营后台、店铺后台
|
##### 前端-运营后台、店铺后台
|
||||||
|
|
||||||
| 说明 | 框架 | 说明 | 框架 |
|
| 说明 | 框架 | 说明 | 框架 |
|
||||||
| ---------- | ---------- | ---------- | ------- |
|
| ---------- | ---------- | ---------- | ------- |
|
||||||
@ -177,14 +125,14 @@ https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql
|
|||||||
| 基础UI库 | iView | UI界面基于 | iView |
|
| 基础UI库 | iView | UI界面基于 | iView |
|
||||||
| 网络请求 | axios | | |
|
| 网络请求 | axios | | |
|
||||||
|
|
||||||
##### 📱前端-移动端
|
##### 前端-移动端
|
||||||
|
|
||||||
| 说明 | 架构 | 说明 | 架构 |
|
| 说明 | 架构 | 说明 | 架构 |
|
||||||
| --------- | ------- | -------- | ------- |
|
| --------- | ------- | -------- | ------- |
|
||||||
| 基础UI库 | uViewui | 基础框架 | uni-app |
|
| 基础UI库 | uViewui | 基础框架 | uni-app |
|
||||||
| CSS预处理 | scss | 地图引擎 | amap |
|
| CSS预处理 | scss | 地图引擎 | amap |
|
||||||
|
|
||||||
### 🌟 版本升级
|
### 版本升级
|
||||||
|
|
||||||
```
|
```
|
||||||
商城后续会持续版本升级,修复bug,完善功能,覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
|
商城后续会持续版本升级,修复bug,完善功能,覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
|
||||||
@ -193,7 +141,7 @@ https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### ⚠️ 开源须知
|
### 开源须知
|
||||||
1.仅允许用于个人学习研究使用.
|
1.仅允许用于个人学习研究使用.
|
||||||
|
|
||||||
2.禁止将本开源的代码和资源进行任何形式任何名义的出售.
|
2.禁止将本开源的代码和资源进行任何形式任何名义的出售.
|
||||||
@ -203,7 +151,7 @@ https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql
|
|||||||
4.限制商用,如果需要商业使用请联系我们。QQ3409056806.
|
4.限制商用,如果需要商业使用请联系我们。QQ3409056806.
|
||||||
|
|
||||||
|
|
||||||
### 🐧 交流群
|
### 交流群
|
||||||
|
|
||||||
##### 官方qq 1群 961316482(已满)
|
##### 官方qq 1群 961316482(已满)
|
||||||
##### 官方qq 2群 875294241
|
##### 官方qq 2群 875294241
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.controller.other.distribution;
|
package cn.lili.controller.distribution;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.controller.other.distribution;
|
package cn.lili.controller.distribution;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
@ -13,6 +13,7 @@ import io.swagger.annotations.ApiImplicitParam;
|
|||||||
import io.swagger.annotations.ApiImplicitParams;
|
import io.swagger.annotations.ApiImplicitParams;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@ -33,6 +34,7 @@ import javax.validation.constraints.NotNull;
|
|||||||
@RestController
|
@RestController
|
||||||
@Api(tags = "买家端,分销商品佣金提现接口")
|
@Api(tags = "买家端,分销商品佣金提现接口")
|
||||||
@RequestMapping("/buyer/distribution/cash")
|
@RequestMapping("/buyer/distribution/cash")
|
||||||
|
@Validated
|
||||||
public class DistributionCashBuyerController {
|
public class DistributionCashBuyerController {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,10 +54,10 @@ public class DistributionCashBuyerController {
|
|||||||
@ApiImplicitParam(name = "price", value = "申请金额", required = true, paramType = "query", dataType = "double")
|
@ApiImplicitParam(name = "price", value = "申请金额", required = true, paramType = "query", dataType = "double")
|
||||||
})
|
})
|
||||||
@PostMapping
|
@PostMapping
|
||||||
public ResultMessage<Object> cash(@Max(value = 1000, message = "提现金额单次最多允许提现1000元")
|
public ResultMessage<Object> cash(@Validated @Max(value = 9999, message = "提现金额单次最多允许提现9999元")
|
||||||
@Min(value = 1, message = "提现金额单次最少提现金额为1元")
|
@Min(value = 1, message = "提现金额单次最少提现金额为1元")
|
||||||
@NotNull @ApiIgnore Double price) {
|
@NotNull @ApiIgnore Double price) {
|
||||||
if (distributionCashService.cash(price)) {
|
if (Boolean.TRUE.equals(distributionCashService.cash(price))) {
|
||||||
return ResultUtil.success();
|
return ResultUtil.success();
|
||||||
}
|
}
|
||||||
throw new ServiceException(ResultCode.ERROR);
|
throw new ServiceException(ResultCode.ERROR);
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.controller.other.distribution;
|
package cn.lili.controller.distribution;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.controller.other.distribution;
|
package cn.lili.controller.distribution;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
@ -1,12 +1,12 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.member;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
|
import cn.lili.common.security.OperationalJudgment;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.member.entity.dos.MemberAddress;
|
import cn.lili.modules.member.entity.dos.MemberAddress;
|
||||||
import cn.lili.modules.member.service.MemberAddressService;
|
import cn.lili.modules.member.service.MemberAddressService;
|
||||||
import cn.lili.common.security.OperationalJudgment;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
@ -1,57 +0,0 @@
|
|||||||
package cn.lili.controller.member;
|
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
|
||||||
import cn.lili.common.vo.PageVO;
|
|
||||||
import cn.lili.common.vo.ResultMessage;
|
|
||||||
import cn.lili.modules.system.entity.dos.ServiceNotice;
|
|
||||||
import cn.lili.modules.system.service.ServiceNoticeService;
|
|
||||||
import cn.lili.mybatis.util.PageUtil;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
||||||
import io.swagger.annotations.Api;
|
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
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;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 买家端,会员站服务消息接口
|
|
||||||
*
|
|
||||||
* @author Chopper
|
|
||||||
* @since 2020/11/17 2:31 下午
|
|
||||||
*/
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/service/notice")
|
|
||||||
@Api(tags = "买家端,会员站服务消息接口")
|
|
||||||
public class ServiceNoticeBuyerController {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 服务消息
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private ServiceNoticeService serviceNoticeService;
|
|
||||||
|
|
||||||
@ApiOperation(value = "获取消息详情")
|
|
||||||
@ApiImplicitParam(name = "id", value = "商品ID", required = true, dataType = "Long", paramType = "path")
|
|
||||||
@GetMapping(value = "/{id}")
|
|
||||||
public ResultMessage<ServiceNotice> get(@PathVariable String id) {
|
|
||||||
ServiceNotice serviceNotice = serviceNoticeService.getById(id);
|
|
||||||
return ResultUtil.data(serviceNotice);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "分页获取服务消息")
|
|
||||||
@GetMapping
|
|
||||||
@ApiImplicitParam(name = "storeId", value = "商家id,默认为-1,代表平台消息,如果查询某商家发布的消息,传递商家id即可", dataType = "int", paramType = "query")
|
|
||||||
public ResultMessage<IPage<ServiceNotice>> getByPage(PageVO page, String storeId) {
|
|
||||||
ServiceNotice serviceNotice = new ServiceNotice();
|
|
||||||
if (storeId == null) {
|
|
||||||
storeId = "-1";
|
|
||||||
}
|
|
||||||
serviceNotice.setStoreId(storeId);
|
|
||||||
IPage<ServiceNotice> data = serviceNoticeService.page(PageUtil.initPage(page));
|
|
||||||
return ResultUtil.data(data);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.message;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
@ -1,19 +1,19 @@
|
|||||||
package cn.lili.controller.trade;
|
package cn.lili.controller.order;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
|
||||||
import cn.lili.modules.order.order.entity.dos.AfterSale;
|
|
||||||
import cn.lili.modules.order.order.entity.dos.AfterSaleReason;
|
|
||||||
import cn.lili.modules.order.order.entity.dto.AfterSaleDTO;
|
|
||||||
import cn.lili.modules.order.order.entity.vo.AfterSaleApplyVO;
|
|
||||||
import cn.lili.modules.order.order.entity.vo.AfterSaleSearchParams;
|
|
||||||
import cn.lili.modules.order.order.entity.vo.AfterSaleVO;
|
|
||||||
import cn.lili.modules.order.order.service.AfterSaleLogService;
|
|
||||||
import cn.lili.modules.order.order.service.AfterSaleReasonService;
|
|
||||||
import cn.lili.modules.order.order.service.AfterSaleService;
|
|
||||||
import cn.lili.modules.order.trade.entity.dos.AfterSaleLog;
|
|
||||||
import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO;
|
|
||||||
import cn.lili.common.security.OperationalJudgment;
|
import cn.lili.common.security.OperationalJudgment;
|
||||||
|
import cn.lili.common.vo.ResultMessage;
|
||||||
|
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
|
||||||
|
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
|
||||||
|
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason;
|
||||||
|
import cn.lili.modules.order.aftersale.entity.dto.AfterSaleDTO;
|
||||||
|
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleApplyVO;
|
||||||
|
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleSearchParams;
|
||||||
|
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO;
|
||||||
|
import cn.lili.modules.order.aftersale.service.AfterSaleLogService;
|
||||||
|
import cn.lili.modules.order.aftersale.service.AfterSaleReasonService;
|
||||||
|
import cn.lili.modules.order.aftersale.service.AfterSaleService;
|
||||||
|
import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
@ -1,8 +1,8 @@
|
|||||||
package cn.lili.controller.trade;
|
package cn.lili.controller.order;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.exception.ServiceException;
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
|
import cn.lili.common.exception.ServiceException;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
||||||
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
|
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
|
||||||
@ -246,7 +246,7 @@ public class CartController {
|
|||||||
throw se;
|
throw se;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(ResultCode.ORDER_ERROR.message(), e);
|
log.error(ResultCode.ORDER_ERROR.message(), e);
|
||||||
throw new ServiceException(ResultCode.ORDER_ERROR);
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,9 +1,10 @@
|
|||||||
package cn.lili.controller.trade;
|
package cn.lili.controller.order;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.exception.ServiceException;
|
||||||
import cn.lili.common.security.AuthUser;
|
import cn.lili.common.security.AuthUser;
|
||||||
|
import cn.lili.common.security.OperationalJudgment;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.order.order.entity.dos.Order;
|
import cn.lili.modules.order.order.entity.dos.Order;
|
||||||
@ -12,7 +13,6 @@ import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
|
|||||||
import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
|
import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
|
||||||
import cn.lili.modules.order.order.entity.vo.OrderSimpleVO;
|
import cn.lili.modules.order.order.entity.vo.OrderSimpleVO;
|
||||||
import cn.lili.modules.order.order.service.OrderService;
|
import cn.lili.modules.order.order.service.OrderService;
|
||||||
import cn.lili.common.security.OperationalJudgment;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
@ -1,7 +1,8 @@
|
|||||||
package cn.lili.controller.trade;
|
package cn.lili.controller.order;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.security.AuthUser;
|
import cn.lili.common.security.AuthUser;
|
||||||
|
import cn.lili.common.security.OperationalJudgment;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
@ -13,7 +14,6 @@ import cn.lili.modules.order.order.entity.vo.OrderComplaintSearchParams;
|
|||||||
import cn.lili.modules.order.order.entity.vo.OrderComplaintVO;
|
import cn.lili.modules.order.order.entity.vo.OrderComplaintVO;
|
||||||
import cn.lili.modules.order.order.service.OrderComplaintCommunicationService;
|
import cn.lili.modules.order.order.service.OrderComplaintCommunicationService;
|
||||||
import cn.lili.modules.order.order.service.OrderComplaintService;
|
import cn.lili.modules.order.order.service.OrderComplaintService;
|
||||||
import cn.lili.common.security.OperationalJudgment;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.controller.trade;
|
package cn.lili.controller.order;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
@ -1,9 +1,9 @@
|
|||||||
package cn.lili.controller.trade;
|
package cn.lili.controller.order;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.order.trade.entity.dos.Recharge;
|
import cn.lili.modules.wallet.entity.dos.Recharge;
|
||||||
import cn.lili.modules.order.trade.service.RechargeService;
|
import cn.lili.modules.wallet.service.RechargeService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
import io.swagger.annotations.ApiImplicitParams;
|
import io.swagger.annotations.ApiImplicitParams;
|
@ -1,13 +1,15 @@
|
|||||||
package cn.lili.controller.passport;
|
package cn.lili.controller.passport;
|
||||||
|
|
||||||
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
|
import cn.lili.common.exception.ServiceException;
|
||||||
import cn.lili.common.security.enums.UserEnums;
|
import cn.lili.common.security.enums.UserEnums;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
import cn.lili.modules.member.entity.dto.MemberEditDTO;
|
import cn.lili.modules.member.entity.dto.MemberEditDTO;
|
||||||
import cn.lili.modules.member.service.MemberService;
|
import cn.lili.modules.member.service.MemberService;
|
||||||
import cn.lili.modules.system.sms.SmsUtil;
|
import cn.lili.modules.sms.SmsUtil;
|
||||||
import cn.lili.modules.verification.enums.VerificationEnums;
|
import cn.lili.modules.verification.entity.enums.VerificationEnums;
|
||||||
import cn.lili.modules.verification.service.VerificationService;
|
import cn.lili.modules.verification.service.VerificationService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
@ -66,8 +68,11 @@ public class MemberBuyerController {
|
|||||||
public ResultMessage<Object> smsLogin(@NotNull(message = "手机号为空") @RequestParam String mobile,
|
public ResultMessage<Object> smsLogin(@NotNull(message = "手机号为空") @RequestParam String mobile,
|
||||||
@NotNull(message = "验证码为空") @RequestParam String code,
|
@NotNull(message = "验证码为空") @RequestParam String code,
|
||||||
@RequestHeader String uuid) {
|
@RequestHeader String uuid) {
|
||||||
smsUtil.verifyCode(mobile, VerificationEnums.LOGIN, uuid, code);
|
if (smsUtil.verifyCode(mobile, VerificationEnums.LOGIN, uuid, code)) {
|
||||||
return ResultUtil.data(memberService.mobilePhoneLogin(mobile));
|
return ResultUtil.data(memberService.mobilePhoneLogin(mobile));
|
||||||
|
} else {
|
||||||
|
throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "注册用户")
|
@ApiOperation(value = "注册用户")
|
||||||
@ -84,8 +89,11 @@ public class MemberBuyerController {
|
|||||||
@RequestHeader String uuid,
|
@RequestHeader String uuid,
|
||||||
@NotNull(message = "验证码不能为空") @RequestParam String code) {
|
@NotNull(message = "验证码不能为空") @RequestParam String code) {
|
||||||
|
|
||||||
smsUtil.verifyCode(mobilePhone, VerificationEnums.REGISTER, uuid, code);
|
if (smsUtil.verifyCode(mobilePhone, VerificationEnums.REGISTER, uuid, code)) {
|
||||||
return ResultUtil.data(memberService.register(username, password, mobilePhone));
|
return ResultUtil.data(memberService.register(username, password, mobilePhone));
|
||||||
|
} else {
|
||||||
|
throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,11 +114,13 @@ public class MemberBuyerController {
|
|||||||
@NotNull(message = "验证码为空") @RequestParam String code,
|
@NotNull(message = "验证码为空") @RequestParam String code,
|
||||||
@RequestHeader String uuid) {
|
@RequestHeader String uuid) {
|
||||||
//校验短信验证码是否正确
|
//校验短信验证码是否正确
|
||||||
smsUtil.verifyCode(mobile, VerificationEnums.FIND_USER, uuid, code);
|
if (smsUtil.verifyCode(mobile, VerificationEnums.FIND_USER, uuid, code)) {
|
||||||
//校验是否通过手机号可获取会员,存在则将会员信息存入缓存,有效时间3分钟
|
//校验是否通过手机号可获取会员,存在则将会员信息存入缓存,有效时间3分钟
|
||||||
memberService.findByMobile(uuid, mobile);
|
memberService.findByMobile(uuid, mobile);
|
||||||
|
|
||||||
return ResultUtil.success();
|
return ResultUtil.success();
|
||||||
|
} else {
|
||||||
|
throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "修改密码")
|
@ApiOperation(value = "修改密码")
|
||||||
|
@ -2,16 +2,16 @@ package cn.lili.controller.passport.connect;
|
|||||||
|
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.exception.ServiceException;
|
||||||
import cn.lili.common.security.token.Token;
|
import cn.lili.common.security.token.Token;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.utils.UuidUtils;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.connect.entity.dto.AuthCallback;
|
import cn.lili.modules.connect.entity.dto.AuthCallback;
|
||||||
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
|
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
|
||||||
import cn.lili.modules.connect.request.AuthRequest;
|
import cn.lili.modules.connect.request.AuthRequest;
|
||||||
import cn.lili.modules.connect.service.ConnectService;
|
import cn.lili.modules.connect.service.ConnectService;
|
||||||
import cn.lili.modules.connect.util.ConnectUtil;
|
import cn.lili.modules.connect.util.ConnectUtil;
|
||||||
import cn.lili.modules.connect.util.UuidUtils;
|
|
||||||
import cn.lili.modules.member.service.MemberService;
|
import cn.lili.modules.member.service.MemberService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
package cn.lili.controller.passport.connect;
|
package cn.lili.controller.passport.connect;
|
||||||
|
|
||||||
import cn.lili.common.security.token.Token;
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
|
import cn.lili.common.security.token.Token;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.connect.entity.dto.WechatMPLoginParams;
|
import cn.lili.modules.connect.entity.dto.WechatMPLoginParams;
|
||||||
import cn.lili.modules.connect.service.ConnectService;
|
import cn.lili.modules.connect.service.ConnectService;
|
||||||
import cn.lili.modules.message.entity.dos.WechatMPMessage;
|
|
||||||
import cn.lili.modules.message.service.ShortLinkService;
|
import cn.lili.modules.message.service.ShortLinkService;
|
||||||
import cn.lili.modules.message.service.WechatMPMessageService;
|
import cn.lili.modules.wechat.entity.dos.WechatMPMessage;
|
||||||
import cn.lili.modules.message.util.WechatMpCodeUtil;
|
import cn.lili.modules.wechat.service.WechatMPMessageService;
|
||||||
|
import cn.lili.modules.wechat.util.WechatMpCodeUtil;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
@ -1,16 +1,19 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.promotion;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.security.AuthUser;
|
import cn.lili.common.security.AuthUser;
|
||||||
|
import cn.lili.common.security.OperationalJudgment;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
||||||
import cn.lili.modules.promotion.entity.vos.CouponSearchParams;
|
import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams;
|
||||||
|
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
|
||||||
|
import cn.lili.modules.promotion.entity.enums.CouponGetEnum;
|
||||||
|
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
||||||
import cn.lili.modules.promotion.entity.vos.CouponVO;
|
import cn.lili.modules.promotion.entity.vos.CouponVO;
|
||||||
import cn.lili.modules.promotion.service.CouponService;
|
import cn.lili.modules.promotion.service.CouponService;
|
||||||
import cn.lili.modules.promotion.service.MemberCouponService;
|
import cn.lili.modules.promotion.service.MemberCouponService;
|
||||||
import cn.lili.common.security.OperationalJudgment;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
@ -51,13 +54,15 @@ public class CouponBuyerController {
|
|||||||
@GetMapping
|
@GetMapping
|
||||||
@ApiOperation(value = "获取可领取优惠券列表")
|
@ApiOperation(value = "获取可领取优惠券列表")
|
||||||
public ResultMessage<IPage<CouponVO>> getCouponList(CouponSearchParams queryParam, PageVO page) {
|
public ResultMessage<IPage<CouponVO>> getCouponList(CouponSearchParams queryParam, PageVO page) {
|
||||||
IPage<CouponVO> canUseCoupons = couponService.getCanReceiveCoupons(queryParam, page);
|
queryParam.setPromotionStatus(PromotionsStatusEnum.START.name());
|
||||||
|
queryParam.setGetType(CouponGetEnum.FREE.name());
|
||||||
|
IPage<CouponVO> canUseCoupons = couponService.pageVOFindAll(queryParam, page);
|
||||||
return ResultUtil.data(canUseCoupons);
|
return ResultUtil.data(canUseCoupons);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "获取当前会员的优惠券列表")
|
@ApiOperation(value = "获取当前会员的优惠券列表")
|
||||||
@GetMapping("/getCoupons")
|
@GetMapping("/getCoupons")
|
||||||
public ResultMessage<IPage<MemberCoupon>> getCoupons(CouponSearchParams param, PageVO pageVo) {
|
public ResultMessage<IPage<MemberCoupon>> getCoupons(MemberCouponSearchParams param, PageVO pageVo) {
|
||||||
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
|
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
|
||||||
param.setMemberId(currentUser.getId());
|
param.setMemberId(currentUser.getId());
|
||||||
return ResultUtil.data(memberCouponService.getMemberCoupons(param, pageVo));
|
return ResultUtil.data(memberCouponService.getMemberCoupons(param, pageVo));
|
||||||
@ -65,7 +70,7 @@ public class CouponBuyerController {
|
|||||||
|
|
||||||
@ApiOperation(value = "获取当前会员的对于当前商品可使用的优惠券列表")
|
@ApiOperation(value = "获取当前会员的对于当前商品可使用的优惠券列表")
|
||||||
@GetMapping("/canUse")
|
@GetMapping("/canUse")
|
||||||
public ResultMessage<IPage<MemberCoupon>> getCouponsByCanUse(CouponSearchParams param, Double totalPrice, PageVO pageVo) {
|
public ResultMessage<IPage<MemberCoupon>> getCouponsByCanUse(MemberCouponSearchParams param, Double totalPrice, PageVO pageVo) {
|
||||||
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
|
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
|
||||||
param.setMemberId(currentUser.getId());
|
param.setMemberId(currentUser.getId());
|
||||||
return ResultUtil.data(memberCouponService.getMemberCouponsByCanUse(param, totalPrice, pageVo));
|
return ResultUtil.data(memberCouponService.getMemberCouponsByCanUse(param, totalPrice, pageVo));
|
||||||
@ -84,8 +89,7 @@ public class CouponBuyerController {
|
|||||||
@GetMapping("/receive/{couponId}")
|
@GetMapping("/receive/{couponId}")
|
||||||
public ResultMessage<Object> receiveCoupon(@NotNull(message = "优惠券ID不能为空") @PathVariable("couponId") String couponId) {
|
public ResultMessage<Object> receiveCoupon(@NotNull(message = "优惠券ID不能为空") @PathVariable("couponId") String couponId) {
|
||||||
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
|
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
|
||||||
memberCouponService.checkCouponLimit(couponId, currentUser.getId());
|
memberCouponService.receiveBuyerCoupon(couponId, currentUser.getId(), currentUser.getNickName());
|
||||||
memberCouponService.receiveCoupon(couponId, currentUser.getId(), currentUser.getNickName());
|
|
||||||
return ResultUtil.success();
|
return ResultUtil.success();
|
||||||
}
|
}
|
||||||
|
|
@ -1,16 +1,20 @@
|
|||||||
package cn.lili.controller.promotion;
|
package cn.lili.controller.promotion;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
|
import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
|
||||||
import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog;
|
import cn.lili.modules.promotion.entity.dos.KanjiaActivityLog;
|
||||||
import cn.lili.modules.promotion.entity.dto.KanJiaActivityLogQuery;
|
import cn.lili.modules.promotion.entity.dto.search.KanJiaActivityLogQuery;
|
||||||
import cn.lili.modules.promotion.entity.dto.KanjiaActivityQuery;
|
import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityGoodsParams;
|
||||||
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
|
import cn.lili.modules.promotion.entity.dto.search.KanjiaActivityQuery;
|
||||||
import cn.lili.modules.promotion.entity.vos.kanjia.*;
|
import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams;
|
||||||
|
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
||||||
|
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsListVO;
|
||||||
|
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityGoodsVO;
|
||||||
|
import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO;
|
||||||
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
|
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
|
||||||
import cn.lili.modules.promotion.service.KanjiaActivityLogService;
|
import cn.lili.modules.promotion.service.KanjiaActivityLogService;
|
||||||
import cn.lili.modules.promotion.service.KanjiaActivityService;
|
import cn.lili.modules.promotion.service.KanjiaActivityService;
|
||||||
@ -52,9 +56,9 @@ public class KanjiaGoodsActivityBuyerController {
|
|||||||
@ApiOperation(value = "分页获取砍价商品")
|
@ApiOperation(value = "分页获取砍价商品")
|
||||||
public ResultMessage<IPage<KanjiaActivityGoodsListVO>> kanjiaActivityGoodsPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO page) {
|
public ResultMessage<IPage<KanjiaActivityGoodsListVO>> kanjiaActivityGoodsPage(KanjiaActivityGoodsParams kanjiaActivityGoodsParams, PageVO page) {
|
||||||
// 会员端查询到的肯定是已经开始的活动商品
|
// 会员端查询到的肯定是已经开始的活动商品
|
||||||
kanjiaActivityGoodsParams.setPromotionStatus(PromotionStatusEnum.START.name());
|
kanjiaActivityGoodsParams.setPromotionStatus(PromotionsStatusEnum.START.name());
|
||||||
kanjiaActivityGoodsParams.setStartTime(System.currentTimeMillis());
|
// kanjiaActivityGoodsParams.setStartTime(System.currentTimeMillis());
|
||||||
kanjiaActivityGoodsParams.setEndTime(System.currentTimeMillis());
|
// kanjiaActivityGoodsParams.setEndTime(System.currentTimeMillis());
|
||||||
return ResultUtil.data(kanJiaActivityGoodsService.kanjiaGoodsVOPage(kanjiaActivityGoodsParams, page));
|
return ResultUtil.data(kanJiaActivityGoodsService.kanjiaGoodsVOPage(kanjiaActivityGoodsParams, page));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +79,7 @@ public class KanjiaGoodsActivityBuyerController {
|
|||||||
@ApiOperation(value = "获取砍价活动")
|
@ApiOperation(value = "获取砍价活动")
|
||||||
public ResultMessage<KanjiaActivityVO> getKanJiaActivity(KanjiaActivitySearchParams kanjiaActivitySearchParams) {
|
public ResultMessage<KanjiaActivityVO> getKanJiaActivity(KanjiaActivitySearchParams kanjiaActivitySearchParams) {
|
||||||
//如果是非被邀请关系则填写会员ID
|
//如果是非被邀请关系则填写会员ID
|
||||||
if (StrUtil.isEmpty(kanjiaActivitySearchParams.getKanjiaActivityId())) {
|
if (CharSequenceUtil.isEmpty(kanjiaActivitySearchParams.getKanjiaActivityId())) {
|
||||||
kanjiaActivitySearchParams.setMemberId(UserContext.getCurrentUser().getId());
|
kanjiaActivitySearchParams.setMemberId(UserContext.getCurrentUser().getId());
|
||||||
}
|
}
|
||||||
return ResultUtil.data(kanJiaActivityService.getKanjiaActivityVO(kanjiaActivitySearchParams));
|
return ResultUtil.data(kanJiaActivityService.getKanjiaActivityVO(kanjiaActivitySearchParams));
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
package cn.lili.controller.promotion;
|
package cn.lili.controller.promotion;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.lili.common.enums.PromotionTypeEnum;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.promotion.entity.dto.PromotionGoodsDTO;
|
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
||||||
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
|
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
|
||||||
import cn.lili.common.enums.PromotionTypeEnum;
|
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
||||||
import cn.lili.modules.promotion.entity.vos.PintuanMemberVO;
|
import cn.lili.modules.promotion.entity.vos.PintuanMemberVO;
|
||||||
import cn.lili.modules.promotion.entity.vos.PintuanShareVO;
|
import cn.lili.modules.promotion.entity.vos.PintuanShareVO;
|
||||||
import cn.lili.modules.promotion.entity.vos.PromotionGoodsSearchParams;
|
|
||||||
import cn.lili.modules.promotion.service.PintuanService;
|
import cn.lili.modules.promotion.service.PintuanService;
|
||||||
import cn.lili.modules.promotion.service.PromotionGoodsService;
|
import cn.lili.modules.promotion.service.PromotionGoodsService;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
@ -40,14 +39,13 @@ public class PintuanBuyerController {
|
|||||||
|
|
||||||
@ApiOperation(value = "获取拼团商品")
|
@ApiOperation(value = "获取拼团商品")
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public ResultMessage<IPage<PromotionGoodsDTO>> getPintuanCategory(String goodsName, String categoryPath, PageVO pageVo) {
|
public ResultMessage<IPage<PromotionGoods>> getPintuanCategory(String goodsName, String categoryPath, PageVO pageVo) {
|
||||||
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
|
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
|
||||||
searchParams.setGoodsName(goodsName);
|
searchParams.setGoodsName(goodsName);
|
||||||
searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name());
|
searchParams.setPromotionType(PromotionTypeEnum.PINTUAN.name());
|
||||||
searchParams.setPromotionStatus(PromotionStatusEnum.START.name());
|
searchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
|
||||||
searchParams.setCategoryPath(categoryPath);
|
searchParams.setCategoryPath(categoryPath);
|
||||||
searchParams.setEndTime(DateUtil.date().getTime());
|
return ResultUtil.data(promotionGoodsService.pageFindAll(searchParams, pageVo));
|
||||||
return ResultUtil.data(promotionGoodsService.getPromotionGoods(searchParams, pageVo));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,8 +3,10 @@ package cn.lili.controller.promotion;
|
|||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
|
import cn.lili.modules.promotion.entity.dos.PointsGoods;
|
||||||
import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory;
|
import cn.lili.modules.promotion.entity.dos.PointsGoodsCategory;
|
||||||
import cn.lili.modules.promotion.entity.vos.PointsGoodsSearchParams;
|
import cn.lili.modules.promotion.entity.dto.search.PointsGoodsSearchParams;
|
||||||
|
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
||||||
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
|
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
|
||||||
import cn.lili.modules.promotion.service.PointsGoodsCategoryService;
|
import cn.lili.modules.promotion.service.PointsGoodsCategoryService;
|
||||||
import cn.lili.modules.promotion.service.PointsGoodsService;
|
import cn.lili.modules.promotion.service.PointsGoodsService;
|
||||||
@ -35,8 +37,9 @@ public class PointsGoodsBuyerController {
|
|||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
@ApiOperation(value = "分页获取积分商品")
|
@ApiOperation(value = "分页获取积分商品")
|
||||||
public ResultMessage<IPage<PointsGoodsVO>> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) {
|
public ResultMessage<IPage<PointsGoods>> getPointsGoodsPage(PointsGoodsSearchParams searchParams, PageVO page) {
|
||||||
IPage<PointsGoodsVO> pointsGoodsByPage = pointsGoodsService.getPointsGoodsByPage(searchParams, page);
|
searchParams.setPromotionStatus(PromotionsStatusEnum.START.name());
|
||||||
|
IPage<PointsGoods> pointsGoodsByPage = pointsGoodsService.pageFindAll(searchParams, page);
|
||||||
return ResultUtil.data(pointsGoodsByPage);
|
return ResultUtil.data(pointsGoodsByPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,12 +5,12 @@ import cn.lili.common.security.context.UserContext;
|
|||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
|
import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
|
||||||
|
import cn.lili.modules.goods.service.StoreGoodsLabelService;
|
||||||
import cn.lili.modules.store.entity.dto.StoreBankDTO;
|
import cn.lili.modules.store.entity.dto.StoreBankDTO;
|
||||||
import cn.lili.modules.store.entity.dto.StoreCompanyDTO;
|
import cn.lili.modules.store.entity.dto.StoreCompanyDTO;
|
||||||
import cn.lili.modules.store.entity.dto.StoreOtherInfoDTO;
|
import cn.lili.modules.store.entity.dto.StoreOtherInfoDTO;
|
||||||
import cn.lili.modules.store.entity.vos.*;
|
import cn.lili.modules.store.entity.vos.*;
|
||||||
import cn.lili.modules.store.service.StoreDetailService;
|
import cn.lili.modules.store.service.StoreDetailService;
|
||||||
import cn.lili.modules.goods.service.StoreGoodsLabelService;
|
|
||||||
import cn.lili.modules.store.service.StoreService;
|
import cn.lili.modules.store.service.StoreService;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.wallet;
|
||||||
|
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.wallet;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
@ -7,12 +7,12 @@ import cn.lili.common.security.AuthUser;
|
|||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
import cn.lili.modules.member.entity.dos.MemberWallet;
|
|
||||||
import cn.lili.modules.member.entity.vo.MemberWalletVO;
|
|
||||||
import cn.lili.modules.member.service.MemberService;
|
import cn.lili.modules.member.service.MemberService;
|
||||||
import cn.lili.modules.member.service.MemberWalletService;
|
import cn.lili.modules.verification.entity.enums.VerificationEnums;
|
||||||
import cn.lili.modules.verification.enums.VerificationEnums;
|
|
||||||
import cn.lili.modules.verification.service.VerificationService;
|
import cn.lili.modules.verification.service.VerificationService;
|
||||||
|
import cn.lili.modules.wallet.entity.dos.MemberWallet;
|
||||||
|
import cn.lili.modules.wallet.entity.vo.MemberWalletVO;
|
||||||
|
import cn.lili.modules.wallet.service.MemberWalletService;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
@ -125,7 +125,7 @@ public class MemberWalletBuyerController {
|
|||||||
@ApiImplicitParams({
|
@ApiImplicitParams({
|
||||||
@ApiImplicitParam(name = "price", value = "提现金额", required = true, dataType = "double", paramType = "query")
|
@ApiImplicitParam(name = "price", value = "提现金额", required = true, dataType = "double", paramType = "query")
|
||||||
})
|
})
|
||||||
public ResultMessage<Boolean> withdrawal(@Max(value = 1000, message = "充值金额单次最多允许提现1000元") @Min(value = 1, message = "充值金额单次最少提现金额为1元") Double price) {
|
public ResultMessage<Boolean> withdrawal(@Max(value = 9999, message = "充值金额单次最多允许提现9999元") @Min(value = 1, message = "充值金额单次最少提现金额为1元") Double price) {
|
||||||
return ResultUtil.data(memberWalletService.applyWithdrawal(price));
|
return ResultUtil.data(memberWalletService.applyWithdrawal(price));
|
||||||
}
|
}
|
||||||
|
|
@ -1,13 +1,13 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.wallet;
|
||||||
|
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.member.entity.dos.MemberWithdrawApply;
|
import cn.lili.modules.wallet.entity.dos.MemberWithdrawApply;
|
||||||
import cn.lili.modules.member.entity.vo.MemberWithdrawApplyQueryVO;
|
import cn.lili.modules.wallet.entity.vo.MemberWithdrawApplyQueryVO;
|
||||||
import cn.lili.modules.member.service.MemberWithdrawApplyService;
|
import cn.lili.modules.wallet.service.MemberWithdrawApplyService;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
@ -1,12 +1,12 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.wallet;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.order.trade.entity.dos.Recharge;
|
|
||||||
import cn.lili.modules.order.trade.entity.vo.RechargeQueryVO;
|
import cn.lili.modules.order.trade.entity.vo.RechargeQueryVO;
|
||||||
import cn.lili.modules.order.trade.service.RechargeService;
|
import cn.lili.modules.wallet.entity.dos.Recharge;
|
||||||
|
import cn.lili.modules.wallet.service.RechargeService;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
@ -1,12 +1,12 @@
|
|||||||
package cn.lili.controller.trade;
|
package cn.lili.controller.wallet;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.security.AuthUser;
|
import cn.lili.common.security.AuthUser;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.order.trade.entity.dos.WalletLog;
|
import cn.lili.modules.wallet.entity.dos.WalletLog;
|
||||||
import cn.lili.modules.order.trade.service.WalletLogService;
|
import cn.lili.modules.wallet.service.WalletLogService;
|
||||||
import cn.lili.mybatis.util.PageUtil;
|
import cn.lili.mybatis.util.PageUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
@ -43,16 +43,6 @@ spring:
|
|||||||
#关闭jackson 对json做解析
|
#关闭jackson 对json做解析
|
||||||
fail-on-empty-beans: false
|
fail-on-empty-beans: false
|
||||||
|
|
||||||
# mongodb
|
|
||||||
data:
|
|
||||||
mongodb:
|
|
||||||
uri: 127.0.0.1:27017
|
|
||||||
database: lilishop
|
|
||||||
username: root
|
|
||||||
password: lilishop
|
|
||||||
authentication-database: admin
|
|
||||||
# replica-set-name: mongoreplset
|
|
||||||
|
|
||||||
# Redis
|
# Redis
|
||||||
redis:
|
redis:
|
||||||
host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
@ -189,7 +179,6 @@ logging:
|
|||||||
cn.lili: debug
|
cn.lili: debug
|
||||||
org.hibernate: debug
|
org.hibernate: debug
|
||||||
# org.springframework: debug
|
# org.springframework: debug
|
||||||
# org.springframework.data.mongodb.core: debug
|
|
||||||
file:
|
file:
|
||||||
# 指定路径
|
# 指定路径
|
||||||
path: lili-logs
|
path: lili-logs
|
||||||
|
@ -25,16 +25,6 @@ spring:
|
|||||||
admin:
|
admin:
|
||||||
client:
|
client:
|
||||||
url: http://192.168.0.116:8000
|
url: http://192.168.0.116:8000
|
||||||
# mongodb
|
|
||||||
data:
|
|
||||||
mongodb:
|
|
||||||
host: 192.168.0.116
|
|
||||||
port: 27017
|
|
||||||
database: lilishop
|
|
||||||
username: root
|
|
||||||
password: lilishop
|
|
||||||
authentication-database: admin
|
|
||||||
# replica-set-name: mongoreplset
|
|
||||||
cache:
|
cache:
|
||||||
type: redis
|
type: redis
|
||||||
#amqp
|
#amqp
|
||||||
@ -186,7 +176,6 @@ logging:
|
|||||||
cn.lili: info
|
cn.lili: info
|
||||||
# org.hibernate: debug
|
# org.hibernate: debug
|
||||||
# org.springframework: debug
|
# org.springframework: debug
|
||||||
# org.springframework.data.mongodb.core: debug
|
|
||||||
file:
|
file:
|
||||||
# 指定路径
|
# 指定路径
|
||||||
path: lili-logs
|
path: lili-logs
|
||||||
|
@ -2,11 +2,11 @@ package cn.lili.controller.common;
|
|||||||
|
|
||||||
import cn.lili.cache.Cache;
|
import cn.lili.cache.Cache;
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.exception.ServiceException;
|
||||||
import cn.lili.common.security.AuthUser;
|
import cn.lili.common.security.AuthUser;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.security.enums.UserEnums;
|
import cn.lili.common.security.enums.UserEnums;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.common.vo.SearchVO;
|
import cn.lili.common.vo.SearchVO;
|
||||||
@ -78,9 +78,7 @@ public class FileController {
|
|||||||
}
|
}
|
||||||
throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR);
|
throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR);
|
||||||
case MANAGER:
|
case MANAGER:
|
||||||
if (file.getUserEnums().equals(authUser.getRole().name())) {
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR);
|
throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.member;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
|
||||||
import cn.lili.common.utils.IpHelper;
|
import cn.lili.common.utils.IpHelper;
|
||||||
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
@ -28,6 +28,7 @@ public class IpInfoManagerController {
|
|||||||
@RequestMapping(value = "/info", method = RequestMethod.GET)
|
@RequestMapping(value = "/info", method = RequestMethod.GET)
|
||||||
@ApiOperation(value = "IP及天气相关信息")
|
@ApiOperation(value = "IP及天气相关信息")
|
||||||
public ResultMessage<Object> upload(HttpServletRequest request) {
|
public ResultMessage<Object> upload(HttpServletRequest request) {
|
||||||
|
|
||||||
String result = ipHelper.getIpCity(request);
|
String result = ipHelper.getIpCity(request);
|
||||||
return ResultUtil.data(result);
|
return ResultUtil.data(result);
|
||||||
}
|
}
|
@ -3,7 +3,7 @@ package cn.lili.controller.common;
|
|||||||
import cn.lili.cache.limit.annotation.LimitPoint;
|
import cn.lili.cache.limit.annotation.LimitPoint;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.verification.enums.VerificationEnums;
|
import cn.lili.modules.verification.entity.enums.VerificationEnums;
|
||||||
import cn.lili.modules.verification.service.VerificationService;
|
import cn.lili.modules.verification.service.VerificationService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
@ -4,8 +4,8 @@ import cn.lili.cache.limit.annotation.LimitPoint;
|
|||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
import cn.lili.modules.system.sms.SmsUtil;
|
import cn.lili.modules.sms.SmsUtil;
|
||||||
import cn.lili.modules.verification.enums.VerificationEnums;
|
import cn.lili.modules.verification.entity.enums.VerificationEnums;
|
||||||
import cn.lili.modules.verification.service.VerificationService;
|
import cn.lili.modules.verification.service.VerificationService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
@ -29,15 +29,6 @@ spring:
|
|||||||
admin:
|
admin:
|
||||||
client:
|
client:
|
||||||
url: http://127.0.0.1:8000
|
url: http://127.0.0.1:8000
|
||||||
# mongodb
|
|
||||||
data:
|
|
||||||
mongodb:
|
|
||||||
uri: 127.0.0.1:27017
|
|
||||||
database: lilishop
|
|
||||||
username: root
|
|
||||||
password: lilishop
|
|
||||||
authentication-database: admin
|
|
||||||
# replica-set-name: mongoreplset
|
|
||||||
cache:
|
cache:
|
||||||
type: redis
|
type: redis
|
||||||
# Redis
|
# Redis
|
||||||
@ -188,7 +179,6 @@ logging:
|
|||||||
cn.lili: info
|
cn.lili: info
|
||||||
# org.hibernate: debug
|
# org.hibernate: debug
|
||||||
# org.springframework: debug
|
# org.springframework: debug
|
||||||
# org.springframework.data.mongodb.core: debug
|
|
||||||
file:
|
file:
|
||||||
# 指定路径
|
# 指定路径
|
||||||
path: lili-logs
|
path: lili-logs
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package cn.lili.event;
|
package cn.lili.event;
|
||||||
|
|
||||||
|
|
||||||
import cn.lili.modules.order.order.entity.dos.AfterSale;
|
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 售后单改变状态
|
* 售后单改变状态
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package cn.lili.event;
|
package cn.lili.event;
|
||||||
|
|
||||||
import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage;
|
import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 会员提现消息
|
* 会员提现消息
|
||||||
|
@ -7,7 +7,7 @@ import cn.lili.modules.distribution.entity.dos.DistributionOrder;
|
|||||||
import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum;
|
import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum;
|
||||||
import cn.lili.modules.distribution.mapper.DistributionOrderMapper;
|
import cn.lili.modules.distribution.mapper.DistributionOrderMapper;
|
||||||
import cn.lili.modules.distribution.service.DistributionOrderService;
|
import cn.lili.modules.distribution.service.DistributionOrderService;
|
||||||
import cn.lili.modules.order.order.entity.dos.AfterSale;
|
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
|
||||||
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
||||||
import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
|
import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
|
||||||
import cn.lili.timetask.handler.EveryDayExecute;
|
import cn.lili.timetask.handler.EveryDayExecute;
|
||||||
|
@ -26,7 +26,7 @@ import cn.lili.modules.order.trade.entity.dos.OrderLog;
|
|||||||
import cn.lili.modules.order.trade.service.OrderLogService;
|
import cn.lili.modules.order.trade.service.OrderLogService;
|
||||||
import cn.lili.modules.promotion.service.MemberCouponService;
|
import cn.lili.modules.promotion.service.MemberCouponService;
|
||||||
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
|
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
|
||||||
import cn.lili.rocketmq.tags.MqOrderTagsEnum;
|
import cn.lili.rocketmq.tags.OrderTagsEnum;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -82,7 +82,7 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent {
|
|||||||
if ((cartVO.getGiftList() != null && !cartVO.getGiftList().isEmpty())
|
if ((cartVO.getGiftList() != null && !cartVO.getGiftList().isEmpty())
|
||||||
|| (cartVO.getGiftPoint() != null && cartVO.getGiftPoint() > 0)
|
|| (cartVO.getGiftPoint() != null && cartVO.getGiftPoint() > 0)
|
||||||
|| (cartVO.getGiftCouponList() != null && !cartVO.getGiftCouponList().isEmpty())) {
|
|| (cartVO.getGiftCouponList() != null && !cartVO.getGiftCouponList().isEmpty())) {
|
||||||
cache.put(CachePrefix.ORDER.getPrefix() + cartVO.getSn(), cartVO);
|
cache.put(CachePrefix.ORDER.getPrefix() + cartVO.getSn(), JSONUtil.toJsonStr(cartVO));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -92,7 +92,7 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent {
|
|||||||
public void orderChange(OrderMessage orderMessage) {
|
public void orderChange(OrderMessage orderMessage) {
|
||||||
if (orderMessage.getNewStatus().equals(OrderStatusEnum.PAID)) {
|
if (orderMessage.getNewStatus().equals(OrderStatusEnum.PAID)) {
|
||||||
log.debug("满减活动,订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn());
|
log.debug("满减活动,订单状态操作 {}", CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn());
|
||||||
renderGift((CartVO) cache.get(CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()), orderMessage);
|
renderGift(JSONUtil.toBean(cache.getString(CachePrefix.ORDER.getPrefix() + orderMessage.getOrderSn()), CartVO.class), orderMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ public class FullDiscountExecute implements TradeEvent, OrderStatusChangeEvent {
|
|||||||
orderMessage.setPaymentMethod(order.getPaymentMethod());
|
orderMessage.setPaymentMethod(order.getPaymentMethod());
|
||||||
orderMessage.setNewStatus(OrderStatusEnum.PAID);
|
orderMessage.setNewStatus(OrderStatusEnum.PAID);
|
||||||
|
|
||||||
String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.STATUS_CHANGE.name();
|
String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name();
|
||||||
//发送订单变更mq消息
|
//发送订单变更mq消息
|
||||||
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback());
|
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback());
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package cn.lili.event.impl;
|
package cn.lili.event.impl;
|
||||||
|
|
||||||
|
|
||||||
import cn.hutool.core.convert.Convert;
|
|
||||||
import cn.lili.common.utils.CurrencyUtil;
|
import cn.lili.common.utils.CurrencyUtil;
|
||||||
import cn.lili.common.utils.StringUtils;
|
import cn.lili.common.utils.StringUtils;
|
||||||
import cn.lili.event.AfterSaleStatusChangeEvent;
|
import cn.lili.event.AfterSaleStatusChangeEvent;
|
||||||
@ -12,11 +11,10 @@ import cn.lili.modules.member.entity.dos.Member;
|
|||||||
import cn.lili.modules.member.entity.dos.MemberEvaluation;
|
import cn.lili.modules.member.entity.dos.MemberEvaluation;
|
||||||
import cn.lili.modules.member.entity.enums.PointTypeEnum;
|
import cn.lili.modules.member.entity.enums.PointTypeEnum;
|
||||||
import cn.lili.modules.member.service.MemberService;
|
import cn.lili.modules.member.service.MemberService;
|
||||||
import cn.lili.modules.order.order.entity.dos.AfterSale;
|
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
|
||||||
import cn.lili.modules.order.order.entity.dos.Order;
|
import cn.lili.modules.order.order.entity.dos.Order;
|
||||||
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
||||||
import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum;
|
import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum;
|
||||||
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
|
|
||||||
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
|
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
|
||||||
import cn.lili.modules.order.order.service.OrderService;
|
import cn.lili.modules.order.order.service.OrderService;
|
||||||
import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
|
import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
|
||||||
|
@ -3,8 +3,7 @@ package cn.lili.event.impl;
|
|||||||
|
|
||||||
import cn.lili.event.MemberRegisterEvent;
|
import cn.lili.event.MemberRegisterEvent;
|
||||||
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
import cn.lili.modules.member.service.MemberWalletService;
|
import cn.lili.modules.wallet.service.MemberWalletService;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@ -22,6 +21,7 @@ public class MemberWalletExecute implements MemberRegisterEvent {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void memberRegister(Member member) {
|
public void memberRegister(Member member) {
|
||||||
memberWalletService.save(member.getId(),member.getUsername());
|
// 有些情况下,会同时创建一个member_id的两条数据
|
||||||
|
// memberWalletService.save(member.getId(),member.getUsername());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,22 +2,22 @@ package cn.lili.event.impl;
|
|||||||
|
|
||||||
import cn.lili.event.*;
|
import cn.lili.event.*;
|
||||||
import cn.lili.modules.member.entity.dto.MemberPointMessage;
|
import cn.lili.modules.member.entity.dto.MemberPointMessage;
|
||||||
import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage;
|
|
||||||
import cn.lili.modules.member.entity.enums.MemberWithdrawalDestinationEnum;
|
|
||||||
import cn.lili.modules.member.entity.enums.PointTypeEnum;
|
import cn.lili.modules.member.entity.enums.PointTypeEnum;
|
||||||
import cn.lili.modules.member.entity.enums.WithdrawStatusEnum;
|
|
||||||
import cn.lili.modules.message.entity.dto.NoticeMessageDTO;
|
import cn.lili.modules.message.entity.dto.NoticeMessageDTO;
|
||||||
import cn.lili.modules.message.entity.enums.NoticeMessageNodeEnum;
|
import cn.lili.modules.message.entity.enums.NoticeMessageNodeEnum;
|
||||||
import cn.lili.modules.message.entity.enums.NoticeMessageParameterEnum;
|
import cn.lili.modules.message.entity.enums.NoticeMessageParameterEnum;
|
||||||
import cn.lili.modules.message.service.NoticeMessageService;
|
import cn.lili.modules.message.service.NoticeMessageService;
|
||||||
|
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
|
||||||
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
||||||
import cn.lili.modules.order.order.entity.dos.AfterSale;
|
|
||||||
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
||||||
import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum;
|
import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum;
|
||||||
import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
|
import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
|
||||||
import cn.lili.modules.order.order.service.OrderService;
|
import cn.lili.modules.order.order.service.OrderService;
|
||||||
import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
|
import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
|
||||||
import cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum;
|
import cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum;
|
||||||
|
import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage;
|
||||||
|
import cn.lili.modules.wallet.entity.enums.MemberWithdrawalDestinationEnum;
|
||||||
|
import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ import cn.lili.modules.order.order.entity.dos.Receipt;
|
|||||||
import cn.lili.modules.order.order.entity.vo.OrderVO;
|
import cn.lili.modules.order.order.entity.vo.OrderVO;
|
||||||
import cn.lili.modules.order.order.entity.vo.ReceiptVO;
|
import cn.lili.modules.order.order.entity.vo.ReceiptVO;
|
||||||
import cn.lili.modules.order.order.service.ReceiptService;
|
import cn.lili.modules.order.order.service.ReceiptService;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@ -34,8 +33,7 @@ public class OrderCreateReceiptExecute implements TradeEvent {
|
|||||||
//获取发票信息
|
//获取发票信息
|
||||||
ReceiptVO receiptVO = tradeDTO.getReceiptVO();
|
ReceiptVO receiptVO = tradeDTO.getReceiptVO();
|
||||||
//如果需要获取发票则保存发票信息
|
//如果需要获取发票则保存发票信息
|
||||||
if (tradeDTO.getNeedReceipt()) {
|
if (Boolean.TRUE.equals(tradeDTO.getNeedReceipt()) && !orderList.isEmpty()) {
|
||||||
if (orderList.size() > 0) {
|
|
||||||
List<Receipt> receipts = new ArrayList<>();
|
List<Receipt> receipts = new ArrayList<>();
|
||||||
for (OrderVO orderVO : orderList) {
|
for (OrderVO orderVO : orderList) {
|
||||||
Receipt receipt = new Receipt();
|
Receipt receipt = new Receipt();
|
||||||
@ -54,5 +52,4 @@ public class OrderCreateReceiptExecute implements TradeEvent {
|
|||||||
receiptService.saveBatch(receipts);
|
receiptService.saveBatch(receipts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,10 @@ import cn.lili.event.MemberRegisterEvent;
|
|||||||
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
import cn.lili.modules.promotion.entity.dos.CouponActivity;
|
import cn.lili.modules.promotion.entity.dos.CouponActivity;
|
||||||
import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum;
|
import cn.lili.modules.promotion.entity.enums.CouponActivityTypeEnum;
|
||||||
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
|
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
||||||
import cn.lili.modules.promotion.service.CouponActivityService;
|
import cn.lili.modules.promotion.service.CouponActivityService;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import cn.lili.modules.promotion.tools.PromotionTools;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -32,10 +33,9 @@ public class RegisteredCouponActivityExecute implements MemberRegisterEvent {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void memberRegister(Member member) {
|
public void memberRegister(Member member) {
|
||||||
List<CouponActivity> couponActivities = couponActivityService.list(new LambdaQueryWrapper<CouponActivity>()
|
List<CouponActivity> couponActivities = couponActivityService.list(new QueryWrapper<CouponActivity>()
|
||||||
.eq(CouponActivity::getCouponActivityType, CouponActivityTypeEnum.REGISTERED.name())
|
.eq("coupon_activity_type", CouponActivityTypeEnum.REGISTERED.name())
|
||||||
.eq(CouponActivity::getPromotionStatus, PromotionStatusEnum.START.name()));
|
.and(PromotionTools.queryPromotionStatus(PromotionsStatusEnum.START)));
|
||||||
couponActivityService.registered(couponActivities, member);
|
couponActivityService.registered(couponActivities, member);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,11 +14,14 @@ import cn.lili.modules.order.order.service.OrderService;
|
|||||||
import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
|
import cn.lili.modules.promotion.entity.dos.KanjiaActivity;
|
||||||
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
||||||
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
|
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
|
||||||
|
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
|
||||||
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
|
import cn.lili.modules.promotion.entity.vos.PointsGoodsVO;
|
||||||
import cn.lili.modules.promotion.service.*;
|
import cn.lili.modules.promotion.service.KanjiaActivityGoodsService;
|
||||||
|
import cn.lili.modules.promotion.service.KanjiaActivityService;
|
||||||
|
import cn.lili.modules.promotion.service.PointsGoodsService;
|
||||||
|
import cn.lili.modules.promotion.service.PromotionGoodsService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
|
||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
import org.springframework.data.redis.core.script.DefaultRedisScript;
|
import org.springframework.data.redis.core.script.DefaultRedisScript;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -62,11 +65,6 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
|||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
private PromotionGoodsService promotionGoodsService;
|
private PromotionGoodsService promotionGoodsService;
|
||||||
/**
|
|
||||||
* 促销商品
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private SeckillApplyService seckillApplyService;
|
|
||||||
/**
|
/**
|
||||||
* 缓存
|
* 缓存
|
||||||
*/
|
*/
|
||||||
@ -79,8 +77,6 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
|||||||
private KanjiaActivityGoodsService kanjiaActivityGoodsService;
|
private KanjiaActivityGoodsService kanjiaActivityGoodsService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private PointsGoodsService pointsGoodsService;
|
private PointsGoodsService pointsGoodsService;
|
||||||
@Autowired
|
|
||||||
private MongoTemplate mongoTemplate;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void orderChange(OrderMessage orderMessage) {
|
public void orderChange(OrderMessage orderMessage) {
|
||||||
@ -202,10 +198,10 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
|||||||
|
|
||||||
switch (promotionTypeEnum) {
|
switch (promotionTypeEnum) {
|
||||||
case KANJIA:
|
case KANJIA:
|
||||||
cache.put(cacheKey, kanjiaActivityGoodsService.getKanJiaGoodsBySku(orderItem.getSkuId()).getStock().intValue());
|
cache.put(cacheKey, kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(orderItem.getSkuId()).getStock());
|
||||||
return;
|
return;
|
||||||
case POINTS_GOODS:
|
case POINTS_GOODS:
|
||||||
cache.put(cacheKey, pointsGoodsService.getPointsGoodsVOByMongo(orderItem.getSkuId()).getActiveStock().intValue());
|
cache.put(cacheKey, pointsGoodsService.getPointsGoodsDetailBySkuId(orderItem.getSkuId()).getActiveStock());
|
||||||
return;
|
return;
|
||||||
case SECKILL:
|
case SECKILL:
|
||||||
case PINTUAN:
|
case PINTUAN:
|
||||||
@ -294,25 +290,29 @@ public class StockUpdateExecute implements OrderStatusChangeEvent {
|
|||||||
kanjiaActivityGoodsDTO.setStock(stock);
|
kanjiaActivityGoodsDTO.setStock(stock);
|
||||||
|
|
||||||
kanjiaActivityGoodsService.updateById(kanjiaActivityGoodsDTO);
|
kanjiaActivityGoodsService.updateById(kanjiaActivityGoodsDTO);
|
||||||
this.mongoTemplate.save(kanjiaActivityGoodsDTO);
|
|
||||||
//修改积分商品库存
|
//修改积分商品库存
|
||||||
} else if (promotionTypeEnum.equals(PromotionTypeEnum.POINTS_GOODS)) {
|
} else if (promotionTypeEnum.equals(PromotionTypeEnum.POINTS_GOODS)) {
|
||||||
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetail(orderItem.getPromotionId());
|
PointsGoodsVO pointsGoodsVO = pointsGoodsService.getPointsGoodsDetail(orderItem.getPromotionId());
|
||||||
Integer stock = Integer.parseInt(cache.get(PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId())).toString());
|
Integer stock = Integer.parseInt(cache.get(PromotionGoodsService.getPromotionGoodsStockCacheKey(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId())).toString());
|
||||||
pointsGoodsVO.setActiveStock(stock);
|
pointsGoodsVO.setActiveStock(stock);
|
||||||
pointsGoodsService.updateById(pointsGoodsVO);
|
pointsGoodsService.updateById(pointsGoodsVO);
|
||||||
this.mongoTemplate.save(pointsGoodsVO);
|
|
||||||
} else {
|
} else {
|
||||||
PromotionGoods pGoods = promotionGoodsService.getPromotionGoods(promotionTypeEnum, orderItem.getPromotionId(), orderItem.getSkuId());
|
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
|
||||||
|
searchParams.setPromotionType(promotionTypeEnum.name());
|
||||||
|
searchParams.setPromotionId(orderItem.getPromotionId());
|
||||||
|
searchParams.setSkuId(orderItem.getSkuId());
|
||||||
|
PromotionGoods pGoods = promotionGoodsService.getPromotionsGoods(searchParams);
|
||||||
//记录需要更新的促销库存信息
|
//记录需要更新的促销库存信息
|
||||||
promotionKey.add(
|
promotionKey.add(
|
||||||
PromotionGoodsService.getPromotionGoodsStockCacheKey(
|
PromotionGoodsService.getPromotionGoodsStockCacheKey(
|
||||||
promotionTypeEnum,
|
promotionTypeEnum,
|
||||||
orderItem.getPromotionId(), orderItem.getSkuId())
|
orderItem.getPromotionId(), orderItem.getSkuId())
|
||||||
);
|
);
|
||||||
|
if (pGoods != null) {
|
||||||
promotionGoods.add(pGoods);
|
promotionGoods.add(pGoods);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
goodsSkus.add(goodsSku);
|
goodsSkus.add(goodsSku);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,10 +2,10 @@ package cn.lili.event.impl;
|
|||||||
|
|
||||||
import cn.lili.event.OrderStatusChangeEvent;
|
import cn.lili.event.OrderStatusChangeEvent;
|
||||||
import cn.lili.event.TradeEvent;
|
import cn.lili.event.TradeEvent;
|
||||||
import cn.lili.modules.message.util.WechatMessageUtil;
|
|
||||||
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
||||||
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
||||||
import cn.lili.modules.order.order.entity.vo.OrderVO;
|
import cn.lili.modules.order.order.entity.vo.OrderVO;
|
||||||
|
import cn.lili.modules.wechat.util.WechatMessageUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
34
consumer/src/main/java/cn/lili/init/SensitiveWordsInit.java
Normal file
34
consumer/src/main/java/cn/lili/init/SensitiveWordsInit.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package cn.lili.init;
|
||||||
|
|
||||||
|
import cn.lili.modules.system.service.SensitiveWordsService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.ApplicationArguments;
|
||||||
|
import org.springframework.boot.ApplicationRunner;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SensitiveWordsInit
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2021-11-29 11:38
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class SensitiveWordsInit implements ApplicationRunner {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SensitiveWordsService sensitiveWordsService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* consumer 启动时,实时更新一下过滤词
|
||||||
|
*
|
||||||
|
* @param args 启动参数
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run(ApplicationArguments args) {
|
||||||
|
sensitiveWordsService.resetCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,9 +1,9 @@
|
|||||||
package cn.lili.listener;
|
package cn.lili.listener;
|
||||||
|
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import cn.lili.rocketmq.tags.AfterSaleTagsEnum;
|
|
||||||
import cn.lili.event.AfterSaleStatusChangeEvent;
|
import cn.lili.event.AfterSaleStatusChangeEvent;
|
||||||
import cn.lili.modules.order.order.entity.dos.AfterSale;
|
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
|
||||||
|
import cn.lili.rocketmq.tags.AfterSaleTagsEnum;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.rocketmq.common.message.MessageExt;
|
import org.apache.rocketmq.common.message.MessageExt;
|
||||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||||
|
@ -3,52 +3,44 @@ package cn.lili.listener;
|
|||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.hutool.core.text.CharSequenceUtil;
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
|
import cn.hutool.core.util.ClassLoaderUtil;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import cn.lili.common.properties.RocketmqCustomProperties;
|
|
||||||
import cn.lili.event.GoodsCommentCompleteEvent;
|
import cn.lili.event.GoodsCommentCompleteEvent;
|
||||||
import cn.lili.modules.distribution.entity.dos.DistributionGoods;
|
import cn.lili.modules.distribution.entity.dos.DistributionGoods;
|
||||||
import cn.lili.modules.distribution.entity.dos.DistributionSelectedGoods;
|
import cn.lili.modules.distribution.entity.dto.DistributionGoodsSearchParams;
|
||||||
import cn.lili.modules.distribution.service.DistributionGoodsService;
|
import cn.lili.modules.distribution.service.DistributionGoodsService;
|
||||||
import cn.lili.modules.distribution.service.DistributionSelectedGoodsService;
|
import cn.lili.modules.distribution.service.DistributionSelectedGoodsService;
|
||||||
import cn.lili.modules.goods.entity.dos.Brand;
|
import cn.lili.modules.goods.entity.dos.*;
|
||||||
import cn.lili.modules.goods.entity.dos.Category;
|
|
||||||
import cn.lili.modules.goods.entity.dos.Goods;
|
|
||||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
|
||||||
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
|
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
|
||||||
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
|
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
|
||||||
|
import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
|
||||||
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
|
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
|
||||||
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
|
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
|
||||||
import cn.lili.modules.goods.service.BrandService;
|
import cn.lili.modules.goods.service.*;
|
||||||
import cn.lili.modules.goods.service.CategoryService;
|
|
||||||
import cn.lili.modules.goods.service.GoodsService;
|
|
||||||
import cn.lili.modules.goods.service.GoodsSkuService;
|
|
||||||
import cn.lili.modules.member.entity.dos.FootPrint;
|
import cn.lili.modules.member.entity.dos.FootPrint;
|
||||||
import cn.lili.modules.member.entity.dos.MemberEvaluation;
|
import cn.lili.modules.member.entity.dos.MemberEvaluation;
|
||||||
import cn.lili.modules.member.service.FootprintService;
|
import cn.lili.modules.member.service.FootprintService;
|
||||||
import cn.lili.modules.member.service.GoodsCollectionService;
|
import cn.lili.modules.member.service.GoodsCollectionService;
|
||||||
|
import cn.lili.modules.promotion.entity.dos.BasePromotions;
|
||||||
|
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
||||||
|
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
|
||||||
|
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
|
||||||
|
import cn.lili.modules.promotion.service.PromotionGoodsService;
|
||||||
|
import cn.lili.modules.promotion.service.PromotionService;
|
||||||
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
||||||
import cn.lili.modules.search.service.EsGoodsIndexService;
|
import cn.lili.modules.search.service.EsGoodsIndexService;
|
||||||
import cn.lili.modules.search.utils.EsIndexUtil;
|
|
||||||
import cn.lili.modules.goods.entity.dos.StoreGoodsLabel;
|
|
||||||
import cn.lili.modules.goods.service.StoreGoodsLabelService;
|
|
||||||
import cn.lili.modules.store.service.StoreService;
|
import cn.lili.modules.store.service.StoreService;
|
||||||
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
|
|
||||||
import cn.lili.rocketmq.tags.GoodsTagsEnum;
|
import cn.lili.rocketmq.tags.GoodsTagsEnum;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.rocketmq.common.message.MessageExt;
|
import org.apache.rocketmq.common.message.MessageExt;
|
||||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||||
import org.apache.rocketmq.spring.core.RocketMQListener;
|
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||||
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
import java.util.stream.Collectors;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品消息
|
* 商品消息
|
||||||
@ -122,16 +114,11 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private StoreGoodsLabelService storeGoodsLabelService;
|
private StoreGoodsLabelService storeGoodsLabelService;
|
||||||
|
|
||||||
/**
|
|
||||||
* rocketMq
|
|
||||||
*/
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RocketMQTemplate rocketMQTemplate;
|
private PromotionService promotionService;
|
||||||
/**
|
|
||||||
* rocketMq配置
|
|
||||||
*/
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RocketmqCustomProperties rocketmqCustomProperties;
|
private PromotionGoodsService promotionGoodsService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMessage(MessageExt messageExt) {
|
public void onMessage(MessageExt messageExt) {
|
||||||
@ -145,17 +132,31 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
//生成索引
|
//生成索引
|
||||||
case GENERATOR_GOODS_INDEX:
|
case GENERATOR_GOODS_INDEX:
|
||||||
try {
|
try {
|
||||||
String goodsJsonStr = new String(messageExt.getBody());
|
String goodsId = new String(messageExt.getBody());
|
||||||
Goods goods = JSONUtil.toBean(goodsJsonStr, Goods.class);
|
log.info("生成索引: {}", goodsId);
|
||||||
|
Goods goods = this.goodsService.getById(goodsId);
|
||||||
updateGoodsIndex(goods);
|
updateGoodsIndex(goods);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("生成商品索引事件执行异常,商品信息 {}", new String(messageExt.getBody()));
|
log.error("生成商品索引事件执行异常,商品信息 {}", new String(messageExt.getBody()));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case UPDATE_GOODS_INDEX_PROMOTIONS:
|
||||||
|
this.updateGoodsIndexPromotions(new String(messageExt.getBody()));
|
||||||
|
break;
|
||||||
|
case DELETE_GOODS_INDEX_PROMOTIONS:
|
||||||
|
BasePromotions promotions = JSONUtil.toBean(new String(messageExt.getBody()), BasePromotions.class);
|
||||||
|
if (CharSequenceUtil.isNotEmpty(promotions.getScopeId())) {
|
||||||
|
this.goodsIndexService.deleteEsGoodsPromotionByPromotionId(Arrays.asList(promotions.getScopeId().split(",")), promotions.getId());
|
||||||
|
} else {
|
||||||
|
this.goodsIndexService.deleteEsGoodsPromotionByPromotionId(null, promotions.getId());
|
||||||
|
}
|
||||||
|
break;
|
||||||
case UPDATE_GOODS_INDEX:
|
case UPDATE_GOODS_INDEX:
|
||||||
try {
|
try {
|
||||||
String goodsIdsJsonStr = new String(messageExt.getBody());
|
String goodsIdsJsonStr = new String(messageExt.getBody());
|
||||||
List<Goods> goodsList = goodsService.list(new LambdaQueryWrapper<Goods>().in(Goods::getId, JSONUtil.toList(goodsIdsJsonStr, String.class)));
|
GoodsSearchParams searchParams = new GoodsSearchParams();
|
||||||
|
searchParams.setId(ArrayUtil.join(JSONUtil.toList(goodsIdsJsonStr, String.class).toArray(), ","));
|
||||||
|
List<Goods> goodsList = goodsService.queryListByParams(searchParams);
|
||||||
this.updateGoodsIndex(goodsList);
|
this.updateGoodsIndex(goodsList);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("更新商品索引事件执行异常,商品信息 {}", new String(messageExt.getBody()));
|
log.error("更新商品索引事件执行异常,商品信息 {}", new String(messageExt.getBody()));
|
||||||
@ -185,12 +186,29 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
break;
|
break;
|
||||||
//审核商品
|
//审核商品
|
||||||
case GOODS_AUDIT:
|
case GOODS_AUDIT:
|
||||||
updateGoodsNum(messageExt);
|
Goods goods = JSONUtil.toBean(new String(messageExt.getBody()), Goods.class);
|
||||||
|
updateGoodsNum(goods);
|
||||||
|
updateGoodsIndex(goods);
|
||||||
break;
|
break;
|
||||||
//删除商品
|
//删除商品
|
||||||
case GOODS_DELETE:
|
case GOODS_DELETE:
|
||||||
deleteGoods(messageExt);
|
try {
|
||||||
updateGoodsNum(messageExt);
|
String goodsIdsJsonStr = new String(messageExt.getBody());
|
||||||
|
for (String goodsId : JSONUtil.toList(goodsIdsJsonStr, String.class)) {
|
||||||
|
Goods goodsById = this.goodsService.getById(goodsId);
|
||||||
|
if (goodsById != null) {
|
||||||
|
this.deleteGoods(goodsById);
|
||||||
|
this.updateGoodsNum(goodsById);
|
||||||
|
List<String> skuIdsByGoodsId = this.goodsSkuService.getSkuIdsByGoodsId(goodsId);
|
||||||
|
if (skuIdsByGoodsId != null && !skuIdsByGoodsId.isEmpty()) {
|
||||||
|
this.goodsIndexService.deleteIndexByIds(skuIdsByGoodsId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("删除商品索引事件执行异常,商品信息 {}", new String(messageExt.getBody()));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
//规格删除
|
//规格删除
|
||||||
case SKU_DELETE:
|
case SKU_DELETE:
|
||||||
@ -198,10 +216,6 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
List<String> skuIds = JSONUtil.toList(message, String.class);
|
List<String> skuIds = JSONUtil.toList(message, String.class);
|
||||||
goodsCollectionService.deleteSkuCollection(skuIds);
|
goodsCollectionService.deleteSkuCollection(skuIds);
|
||||||
break;
|
break;
|
||||||
//收藏商品
|
|
||||||
case GOODS_COLLECTION:
|
|
||||||
storeService.updateStoreCollectionNum(new String(messageExt.getBody()));
|
|
||||||
break;
|
|
||||||
//商品评价
|
//商品评价
|
||||||
case GOODS_COMMENT_COMPLETE:
|
case GOODS_COMMENT_COMPLETE:
|
||||||
MemberEvaluation memberEvaluation = JSONUtil.toBean(new String(messageExt.getBody()), MemberEvaluation.class);
|
MemberEvaluation memberEvaluation = JSONUtil.toBean(new String(messageExt.getBody()), MemberEvaluation.class);
|
||||||
@ -226,6 +240,35 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateGoodsIndexPromotions(String promotionsJsonStr) {
|
||||||
|
try {
|
||||||
|
log.info("更新商品索引促销信息: {}", promotionsJsonStr);
|
||||||
|
JSONObject jsonObject = JSONUtil.parseObj(promotionsJsonStr);
|
||||||
|
BasePromotions promotions = (BasePromotions) jsonObject.get("promotions",
|
||||||
|
ClassLoaderUtil.loadClass(jsonObject.get("promotionsType").toString()));
|
||||||
|
String esPromotionKey = jsonObject.get("esPromotionKey").toString();
|
||||||
|
if (PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(promotions.getScopeType())) {
|
||||||
|
PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams();
|
||||||
|
searchParams.setPromotionId(promotions.getId());
|
||||||
|
List<PromotionGoods> promotionGoodsList = this.promotionGoodsService.listFindAll(searchParams);
|
||||||
|
List<String> skuIds = promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList());
|
||||||
|
this.goodsIndexService.deleteEsGoodsPromotionByPromotionId(skuIds, promotions.getId());
|
||||||
|
this.goodsIndexService.updateEsGoodsIndexByList(promotionGoodsList, promotions, esPromotionKey);
|
||||||
|
} else if (PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name().equals(promotions.getScopeType())) {
|
||||||
|
GoodsSearchParams searchParams = new GoodsSearchParams();
|
||||||
|
searchParams.setCategoryPath(promotions.getScopeId());
|
||||||
|
List<GoodsSku> goodsSkuByList = this.goodsSkuService.getGoodsSkuByList(searchParams);
|
||||||
|
List<String> skuIds = goodsSkuByList.stream().map(GoodsSku::getId).collect(Collectors.toList());
|
||||||
|
this.goodsIndexService.deleteEsGoodsPromotionByPromotionId(skuIds, promotions.getId());
|
||||||
|
this.goodsIndexService.updateEsGoodsIndexPromotions(skuIds, promotions, esPromotionKey);
|
||||||
|
} else if (PromotionsScopeTypeEnum.ALL.name().equals(promotions.getScopeType())) {
|
||||||
|
this.goodsIndexService.updateEsGoodsIndexAllByList(promotions, esPromotionKey);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("生成商品索引促销信息执行异常", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新商品索引
|
* 更新商品索引
|
||||||
*
|
*
|
||||||
@ -235,8 +278,11 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
List<EsGoodsIndex> goodsIndices = new ArrayList<>();
|
List<EsGoodsIndex> goodsIndices = new ArrayList<>();
|
||||||
for (Goods goods : goodsList) {
|
for (Goods goods : goodsList) {
|
||||||
//如果商品通过审核&&并且已上架
|
//如果商品通过审核&&并且已上架
|
||||||
List<GoodsSku> goodsSkuList = this.goodsSkuService.list(new LambdaQueryWrapper<GoodsSku>().eq(GoodsSku::getGoodsId, goods.getId()).gt(GoodsSku::getQuantity, 0));
|
GoodsSearchParams searchParams = new GoodsSearchParams();
|
||||||
if (goods.getIsAuth().equals(GoodsAuthEnum.PASS.name())
|
searchParams.setGoodsId(goods.getId());
|
||||||
|
searchParams.setGeQuantity(0);
|
||||||
|
List<GoodsSku> goodsSkuList = this.goodsSkuService.getGoodsSkuByList(searchParams);
|
||||||
|
if (goods.getAuthFlag().equals(GoodsAuthEnum.PASS.name())
|
||||||
&& goods.getMarketEnable().equals(GoodsStatusEnum.UPPER.name())
|
&& goods.getMarketEnable().equals(GoodsStatusEnum.UPPER.name())
|
||||||
&& Boolean.FALSE.equals(goods.getDeleteFlag())) {
|
&& Boolean.FALSE.equals(goods.getDeleteFlag())) {
|
||||||
goodsSkuList.forEach(goodsSku -> {
|
goodsSkuList.forEach(goodsSku -> {
|
||||||
@ -264,8 +310,12 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
*/
|
*/
|
||||||
private void updateGoodsIndex(Goods goods) {
|
private void updateGoodsIndex(Goods goods) {
|
||||||
//如果商品通过审核&&并且已上架
|
//如果商品通过审核&&并且已上架
|
||||||
List<GoodsSku> goodsSkuList = this.goodsSkuService.list(new LambdaQueryWrapper<GoodsSku>().eq(GoodsSku::getGoodsId, goods.getId()));
|
GoodsSearchParams searchParams = new GoodsSearchParams();
|
||||||
if (goods.getIsAuth().equals(GoodsAuthEnum.PASS.name())
|
searchParams.setGoodsId(goods.getId());
|
||||||
|
List<GoodsSku> goodsSkuList = this.goodsSkuService.getGoodsSkuByList(searchParams);
|
||||||
|
log.info("goods:{}", goods);
|
||||||
|
log.info("goodsSkuList:{}", goodsSkuList);
|
||||||
|
if (goods.getAuthFlag().equals(GoodsAuthEnum.PASS.name())
|
||||||
&& goods.getMarketEnable().equals(GoodsStatusEnum.UPPER.name())
|
&& goods.getMarketEnable().equals(GoodsStatusEnum.UPPER.name())
|
||||||
&& Boolean.FALSE.equals(goods.getDeleteFlag())) {
|
&& Boolean.FALSE.equals(goods.getDeleteFlag())) {
|
||||||
this.generatorGoodsIndex(goods, goodsSkuList);
|
this.generatorGoodsIndex(goods, goodsSkuList);
|
||||||
@ -293,6 +343,8 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
EsGoodsIndex esGoodsOld = goodsIndexService.findById(goodsSku.getId());
|
EsGoodsIndex esGoodsOld = goodsIndexService.findById(goodsSku.getId());
|
||||||
EsGoodsIndex goodsIndex = this.settingUpGoodsIndexData(goods, goodsSku);
|
EsGoodsIndex goodsIndex = this.settingUpGoodsIndexData(goods, goodsSku);
|
||||||
goodsIndex.setSkuSource(skuSource--);
|
goodsIndex.setSkuSource(skuSource--);
|
||||||
|
log.info("goodsSku:{}", goodsSku);
|
||||||
|
log.info("esGoodsOld:{}", esGoodsOld);
|
||||||
//如果商品库存不为0,并且es中有数据
|
//如果商品库存不为0,并且es中有数据
|
||||||
if (goodsSku.getQuantity() > 0 && esGoodsOld == null) {
|
if (goodsSku.getQuantity() > 0 && esGoodsOld == null) {
|
||||||
log.info("生成商品索引 {}", goodsIndex);
|
log.info("生成商品索引 {}", goodsIndex);
|
||||||
@ -309,7 +361,7 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
List<GoodsParamsDTO> goodsParamDTOS = JSONUtil.toList(goods.getParams(), GoodsParamsDTO.class);
|
List<GoodsParamsDTO> goodsParamDTOS = JSONUtil.toList(goods.getParams(), GoodsParamsDTO.class);
|
||||||
goodsIndex = new EsGoodsIndex(goodsSku, goodsParamDTOS);
|
goodsIndex = new EsGoodsIndex(goodsSku, goodsParamDTOS);
|
||||||
}
|
}
|
||||||
goodsIndex.setIsAuth(goods.getIsAuth());
|
goodsIndex.setAuthFlag(goods.getAuthFlag());
|
||||||
goodsIndex.setMarketEnable(goods.getMarketEnable());
|
goodsIndex.setMarketEnable(goods.getMarketEnable());
|
||||||
this.settingUpGoodsIndexOtherParam(goodsIndex);
|
this.settingUpGoodsIndexOtherParam(goodsIndex);
|
||||||
return goodsIndex;
|
return goodsIndex;
|
||||||
@ -336,6 +388,11 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
goodsIndex.setStoreCategoryNamePath(ArrayUtil.join(storeGoodsLabels.stream().map(StoreGoodsLabel::getLabelName).toArray(), ","));
|
goodsIndex.setStoreCategoryNamePath(ArrayUtil.join(storeGoodsLabels.stream().map(StoreGoodsLabel::getLabelName).toArray(), ","));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (goodsIndex.getPromotionMap() == null || goodsIndex.getPromotionMap().isEmpty()) {
|
||||||
|
Map<String, Object> goodsCurrentPromotionMap = promotionService.getGoodsPromotionMap(goodsIndex);
|
||||||
|
goodsIndex.setPromotionMapJson(JSONUtil.toJsonStr(goodsCurrentPromotionMap));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -345,38 +402,37 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
* 2.删除分销员-分销商品绑定关系
|
* 2.删除分销员-分销商品绑定关系
|
||||||
* 3.删除分销商品
|
* 3.删除分销商品
|
||||||
*
|
*
|
||||||
* @param messageExt 消息
|
* @param goods 消息
|
||||||
*/
|
*/
|
||||||
private void deleteGoods(MessageExt messageExt) {
|
private void deleteGoods(Goods goods) {
|
||||||
Goods goods = JSONUtil.toBean(new String(messageExt.getBody()), Goods.class);
|
|
||||||
|
|
||||||
|
DistributionGoodsSearchParams searchParams = new DistributionGoodsSearchParams();
|
||||||
|
searchParams.setGoodsId(goods.getId());
|
||||||
//删除获取分销商品
|
//删除获取分销商品
|
||||||
DistributionGoods distributionGoods = distributionGoodsService.getOne(new LambdaQueryWrapper<DistributionGoods>()
|
DistributionGoods distributionGoods = distributionGoodsService.getDistributionGoods(searchParams);
|
||||||
.eq(DistributionGoods::getGoodsId, goods.getId()));
|
|
||||||
|
if (distributionGoods != null) {
|
||||||
|
|
||||||
//删除分销商品绑定关系
|
//删除分销商品绑定关系
|
||||||
distributionSelectedGoodsService.remove(new LambdaQueryWrapper<DistributionSelectedGoods>()
|
distributionSelectedGoodsService.deleteByDistributionGoodsId(distributionGoods.getId());
|
||||||
.eq(DistributionSelectedGoods::getDistributionGoodsId, distributionGoods.getId()));
|
|
||||||
|
|
||||||
//删除分销商品
|
//删除分销商品
|
||||||
distributionGoodsService.removeById(distributionGoods.getId());
|
distributionGoodsService.removeById(distributionGoods.getId());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改商品数量
|
* 修改商品数量
|
||||||
*
|
*
|
||||||
* @param messageExt 信息体
|
* @param goods 信息体
|
||||||
*/
|
*/
|
||||||
private void updateGoodsNum(MessageExt messageExt) {
|
private void updateGoodsNum(Goods goods) {
|
||||||
|
|
||||||
Goods goods;
|
|
||||||
try {
|
try {
|
||||||
goods = JSONUtil.toBean(new String(messageExt.getBody()), Goods.class);
|
|
||||||
//更新店铺商品数量
|
//更新店铺商品数量
|
||||||
assert goods != null;
|
assert goods != null;
|
||||||
storeService.updateStoreGoodsNum(goods.getStoreId());
|
storeService.updateStoreGoodsNum(goods.getStoreId());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("商品MQ信息错误:{}", messageExt.toString());
|
log.error("修改商品数量错误");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,9 +455,7 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
goods.setBuyCount(0);
|
goods.setBuyCount(0);
|
||||||
}
|
}
|
||||||
int buyCount = goods.getBuyCount() + goodsCompleteMessage.getBuyNum();
|
int buyCount = goods.getBuyCount() + goodsCompleteMessage.getBuyNum();
|
||||||
goodsService.update(new LambdaUpdateWrapper<Goods>()
|
this.goodsService.updateGoodsBuyCount(goodsCompleteMessage.getGoodsId(), buyCount);
|
||||||
.eq(Goods::getId, goodsCompleteMessage.getGoodsId())
|
|
||||||
.set(Goods::getBuyCount, buyCount));
|
|
||||||
} else {
|
} else {
|
||||||
log.error("商品Id为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!");
|
log.error("商品Id为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!");
|
||||||
}
|
}
|
||||||
@ -415,13 +469,10 @@ public class GoodsMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
goodsSku.setBuyCount(buyCount);
|
goodsSku.setBuyCount(buyCount);
|
||||||
goodsSkuService.update(goodsSku);
|
goodsSkuService.update(goodsSku);
|
||||||
|
|
||||||
//修改规格索引,发送mq消息
|
this.goodsIndexService.updateIndex(
|
||||||
Map<String, Object> updateIndexFieldsMap = EsIndexUtil.getUpdateIndexFieldsMap(
|
MapUtil.builder(new HashMap<String, Object>()).put("id", goodsCompleteMessage.getSkuId()).build(),
|
||||||
MapUtil.builder().put("id", goodsCompleteMessage.getSkuId()).build(),
|
MapUtil.builder(new HashMap<String, Object>()).put("buyCount", buyCount).build());
|
||||||
MapUtil.builder().put("buyCount", buyCount).build());
|
|
||||||
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.UPDATE_GOODS_INDEX_FIELD.name();
|
|
||||||
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(updateIndexFieldsMap), RocketmqSendCallbackBuilder.commonCallback());
|
|
||||||
goodsIndexService.updateIndex(goodsCompleteMessage.getSkuId(), new EsGoodsIndex().setBuyCount(buyCount));
|
|
||||||
} else {
|
} else {
|
||||||
log.error("商品SkuId为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!");
|
log.error("商品SkuId为[" + goodsCompleteMessage.getGoodsId() + "的商品不存在,更新商品失败!");
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
package cn.lili.listener;
|
package cn.lili.listener;
|
||||||
|
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import cn.lili.rocketmq.tags.MemberTagsEnum;
|
|
||||||
import cn.lili.event.MemberPointChangeEvent;
|
import cn.lili.event.MemberPointChangeEvent;
|
||||||
import cn.lili.event.MemberRegisterEvent;
|
import cn.lili.event.MemberRegisterEvent;
|
||||||
import cn.lili.event.MemberWithdrawalEvent;
|
import cn.lili.event.MemberWithdrawalEvent;
|
||||||
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
import cn.lili.modules.member.entity.dos.MemberSign;
|
import cn.lili.modules.member.entity.dos.MemberSign;
|
||||||
import cn.lili.modules.member.entity.dto.MemberPointMessage;
|
import cn.lili.modules.member.entity.dto.MemberPointMessage;
|
||||||
import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage;
|
|
||||||
import cn.lili.modules.member.service.MemberSignService;
|
import cn.lili.modules.member.service.MemberSignService;
|
||||||
|
import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage;
|
||||||
|
import cn.lili.rocketmq.tags.MemberTagsEnum;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.rocketmq.common.message.MessageExt;
|
import org.apache.rocketmq.common.message.MessageExt;
|
||||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||||
|
@ -10,15 +10,15 @@ import cn.lili.modules.member.service.MemberService;
|
|||||||
import cn.lili.modules.message.entity.dos.MemberMessage;
|
import cn.lili.modules.message.entity.dos.MemberMessage;
|
||||||
import cn.lili.modules.message.entity.dos.Message;
|
import cn.lili.modules.message.entity.dos.Message;
|
||||||
import cn.lili.modules.message.entity.dos.StoreMessage;
|
import cn.lili.modules.message.entity.dos.StoreMessage;
|
||||||
import cn.lili.modules.message.entity.dto.SmsReachDTO;
|
|
||||||
import cn.lili.modules.message.entity.enums.MessageSendClient;
|
import cn.lili.modules.message.entity.enums.MessageSendClient;
|
||||||
import cn.lili.modules.message.entity.enums.MessageStatusEnum;
|
import cn.lili.modules.message.entity.enums.MessageStatusEnum;
|
||||||
import cn.lili.modules.message.entity.enums.RangeEnum;
|
import cn.lili.modules.message.entity.enums.RangeEnum;
|
||||||
import cn.lili.modules.message.service.MemberMessageService;
|
import cn.lili.modules.message.service.MemberMessageService;
|
||||||
import cn.lili.modules.message.service.StoreMessageService;
|
import cn.lili.modules.message.service.StoreMessageService;
|
||||||
|
import cn.lili.modules.sms.SmsUtil;
|
||||||
|
import cn.lili.modules.sms.entity.dto.SmsReachDTO;
|
||||||
import cn.lili.modules.store.entity.dos.Store;
|
import cn.lili.modules.store.entity.dos.Store;
|
||||||
import cn.lili.modules.store.service.StoreService;
|
import cn.lili.modules.store.service.StoreService;
|
||||||
import cn.lili.modules.system.sms.SmsUtil;
|
|
||||||
import cn.lili.rocketmq.tags.OtherTagsEnum;
|
import cn.lili.rocketmq.tags.OtherTagsEnum;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
@ -158,12 +158,12 @@ public class NoticeSendMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
//查询所有会员总数,因为会员总数比较大 如果一次性查出来会占用数据库资源,所以要分页查询
|
//查询所有会员总数,因为会员总数比较大 如果一次性查出来会占用数据库资源,所以要分页查询
|
||||||
MemberSearchVO memberSearchVO = new MemberSearchVO();
|
MemberSearchVO memberSearchVO = new MemberSearchVO();
|
||||||
memberSearchVO.setDisabled(SwitchEnum.OPEN.name());
|
memberSearchVO.setDisabled(SwitchEnum.OPEN.name());
|
||||||
Integer memberNum = memberService.getMemberNum(memberSearchVO);
|
long memberNum = memberService.getMemberNum(memberSearchVO);
|
||||||
//构建分页查询参数
|
//构建分页查询参数
|
||||||
//100条查一次
|
//100条查一次
|
||||||
Integer pageSize = 100;
|
int pageSize = 100;
|
||||||
Integer pageCount = 0;
|
int pageCount;
|
||||||
pageCount = memberNum / pageSize;
|
pageCount = (int) (memberNum / pageSize);
|
||||||
pageCount = memberNum % pageSize > 0 ? pageCount + 1 : pageCount;
|
pageCount = memberNum % pageSize > 0 ? pageCount + 1 : pageCount;
|
||||||
for (int i = 1; i <= pageCount; i++) {
|
for (int i = 1; i <= pageCount; i++) {
|
||||||
PageVO pageVO = new PageVO();
|
PageVO pageVO = new PageVO();
|
||||||
|
@ -2,11 +2,11 @@ package cn.lili.listener;
|
|||||||
|
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import cn.lili.cache.Cache;
|
import cn.lili.cache.Cache;
|
||||||
import cn.lili.rocketmq.tags.MqOrderTagsEnum;
|
|
||||||
import cn.lili.event.OrderStatusChangeEvent;
|
import cn.lili.event.OrderStatusChangeEvent;
|
||||||
import cn.lili.event.TradeEvent;
|
import cn.lili.event.TradeEvent;
|
||||||
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
||||||
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
||||||
|
import cn.lili.rocketmq.tags.OrderTagsEnum;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.rocketmq.common.message.MessageExt;
|
import org.apache.rocketmq.common.message.MessageExt;
|
||||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||||
@ -58,11 +58,11 @@ public class OrderMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
*/
|
*/
|
||||||
public void orderStatusEvent(MessageExt messageExt) {
|
public void orderStatusEvent(MessageExt messageExt) {
|
||||||
|
|
||||||
switch (MqOrderTagsEnum.valueOf(messageExt.getTags())) {
|
switch (OrderTagsEnum.valueOf(messageExt.getTags())) {
|
||||||
//订单创建
|
//订单创建
|
||||||
case ORDER_CREATE:
|
case ORDER_CREATE:
|
||||||
String key = new String(messageExt.getBody());
|
String key = new String(messageExt.getBody());
|
||||||
TradeDTO tradeDTO = (TradeDTO) cache.get(key);
|
TradeDTO tradeDTO = JSONUtil.toBean(cache.getString(key), TradeDTO.class);
|
||||||
boolean result = true;
|
boolean result = true;
|
||||||
for (TradeEvent event : tradeEvent) {
|
for (TradeEvent event : tradeEvent) {
|
||||||
try {
|
try {
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
package cn.lili.service;
|
|
||||||
|
|
||||||
import cn.lili.event.OrderStatusChangeEvent;
|
|
||||||
import cn.lili.modules.order.order.entity.dto.OrderMessage;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 消息发送
|
|
||||||
*
|
|
||||||
* @author paulG
|
|
||||||
* @since 2020/12/9
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class NoticeSendMessageConsumer implements OrderStatusChangeEvent {
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void orderChange(OrderMessage orderMessage) {
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,13 +3,12 @@ package cn.lili.timetask.handler.impl.bill;
|
|||||||
import cn.hutool.core.date.DateTime;
|
import cn.hutool.core.date.DateTime;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.lili.modules.store.entity.dto.StoreSettlementDay;
|
import cn.lili.modules.store.entity.dto.StoreSettlementDay;
|
||||||
import cn.lili.modules.store.mapper.StoreDetailMapper;
|
|
||||||
import cn.lili.modules.store.service.BillService;
|
import cn.lili.modules.store.service.BillService;
|
||||||
|
import cn.lili.modules.store.service.StoreDetailService;
|
||||||
import cn.lili.timetask.handler.EveryDayExecute;
|
import cn.lili.timetask.handler.EveryDayExecute;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,8 +28,8 @@ public class BillExecute implements EveryDayExecute {
|
|||||||
/**
|
/**
|
||||||
* 店铺详情
|
* 店铺详情
|
||||||
*/
|
*/
|
||||||
@Resource
|
@Autowired
|
||||||
private StoreDetailMapper storeDetailMapper;
|
private StoreDetailService storeDetailService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1.查询今日待结算的商家
|
* 1.查询今日待结算的商家
|
||||||
@ -44,18 +43,18 @@ public class BillExecute implements EveryDayExecute {
|
|||||||
int day = DateUtil.date().dayOfMonth();
|
int day = DateUtil.date().dayOfMonth();
|
||||||
|
|
||||||
//获取待结算商家列表
|
//获取待结算商家列表
|
||||||
List<StoreSettlementDay> storeList = storeDetailMapper.getSettlementStore(day);
|
List<StoreSettlementDay> storeList = storeDetailService.getSettlementStore(day);
|
||||||
|
|
||||||
//获取当前时间
|
//获取当前时间
|
||||||
DateTime endTime =DateUtil.date();
|
DateTime endTime = DateUtil.date();
|
||||||
//批量商家结算
|
//批量商家结算
|
||||||
for (StoreSettlementDay storeSettlementDay : storeList) {
|
for (StoreSettlementDay storeSettlementDay : storeList) {
|
||||||
|
|
||||||
//生成结算单
|
//生成结算单
|
||||||
billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(),endTime);
|
billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(), endTime);
|
||||||
|
|
||||||
//修改店铺结算时间
|
//修改店铺结算时间
|
||||||
storeDetailMapper.updateSettlementDay(storeSettlementDay.getStoreId(), endTime);
|
storeDetailService.updateSettlementDay(storeSettlementDay.getStoreId(), endTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import cn.lili.common.exception.ServiceException;
|
|||||||
import cn.lili.modules.member.entity.dto.MemberEvaluationDTO;
|
import cn.lili.modules.member.entity.dto.MemberEvaluationDTO;
|
||||||
import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
|
import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
|
||||||
import cn.lili.modules.member.service.MemberEvaluationService;
|
import cn.lili.modules.member.service.MemberEvaluationService;
|
||||||
|
import cn.lili.modules.order.aftersale.service.AfterSaleService;
|
||||||
import cn.lili.modules.order.order.entity.dos.Order;
|
import cn.lili.modules.order.order.entity.dos.Order;
|
||||||
import cn.lili.modules.order.order.entity.dos.OrderItem;
|
import cn.lili.modules.order.order.entity.dos.OrderItem;
|
||||||
import cn.lili.modules.order.order.entity.enums.CommentStatusEnum;
|
import cn.lili.modules.order.order.entity.enums.CommentStatusEnum;
|
||||||
@ -15,7 +16,6 @@ import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum;
|
|||||||
import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
|
import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
|
||||||
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
|
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
|
||||||
import cn.lili.modules.order.order.mapper.OrderItemMapper;
|
import cn.lili.modules.order.order.mapper.OrderItemMapper;
|
||||||
import cn.lili.modules.order.order.service.AfterSaleService;
|
|
||||||
import cn.lili.modules.order.order.service.OrderItemService;
|
import cn.lili.modules.order.order.service.OrderItemService;
|
||||||
import cn.lili.modules.order.order.service.OrderService;
|
import cn.lili.modules.order.order.service.OrderService;
|
||||||
import cn.lili.modules.system.entity.dos.Setting;
|
import cn.lili.modules.system.entity.dos.Setting;
|
||||||
|
@ -4,12 +4,12 @@ import cn.hutool.core.date.DateTime;
|
|||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
|
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
|
||||||
import cn.lili.modules.order.trade.entity.dos.Recharge;
|
|
||||||
import cn.lili.modules.order.trade.service.RechargeService;
|
|
||||||
import cn.lili.modules.system.entity.dos.Setting;
|
import cn.lili.modules.system.entity.dos.Setting;
|
||||||
import cn.lili.modules.system.entity.dto.OrderSetting;
|
import cn.lili.modules.system.entity.dto.OrderSetting;
|
||||||
import cn.lili.modules.system.entity.enums.SettingEnum;
|
import cn.lili.modules.system.entity.enums.SettingEnum;
|
||||||
import cn.lili.modules.system.service.SettingService;
|
import cn.lili.modules.system.service.SettingService;
|
||||||
|
import cn.lili.modules.wallet.entity.dos.Recharge;
|
||||||
|
import cn.lili.modules.wallet.service.RechargeService;
|
||||||
import cn.lili.timetask.handler.EveryMinuteExecute;
|
import cn.lili.timetask.handler.EveryMinuteExecute;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
@ -1,34 +1,18 @@
|
|||||||
package cn.lili.timetask.handler.impl.promotion;
|
package cn.lili.timetask.handler.impl.promotion;
|
||||||
|
|
||||||
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;
|
|
||||||
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
|
||||||
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
|
|
||||||
import cn.lili.modules.promotion.entity.dos.Seckill;
|
import cn.lili.modules.promotion.entity.dos.Seckill;
|
||||||
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
|
import cn.lili.modules.promotion.service.SeckillService;
|
||||||
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
|
|
||||||
import cn.lili.modules.promotion.entity.vos.CouponVO;
|
|
||||||
import cn.lili.modules.promotion.entity.vos.PintuanVO;
|
|
||||||
import cn.lili.modules.promotion.service.*;
|
|
||||||
import cn.lili.modules.search.service.EsGoodsIndexService;
|
import cn.lili.modules.search.service.EsGoodsIndexService;
|
||||||
import cn.lili.modules.system.entity.dos.Setting;
|
import cn.lili.modules.system.entity.dos.Setting;
|
||||||
import cn.lili.modules.system.entity.dto.SeckillSetting;
|
import cn.lili.modules.system.entity.dto.SeckillSetting;
|
||||||
import cn.lili.modules.system.entity.enums.SettingEnum;
|
import cn.lili.modules.system.entity.enums.SettingEnum;
|
||||||
import cn.lili.modules.system.service.SettingService;
|
import cn.lili.modules.system.service.SettingService;
|
||||||
import cn.lili.timetask.handler.EveryDayExecute;
|
import cn.lili.timetask.handler.EveryDayExecute;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
|
||||||
import org.springframework.data.mongodb.core.query.Criteria;
|
|
||||||
import org.springframework.data.mongodb.core.query.Query;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 促销活动每日定时器
|
* 促销活动每日定时器
|
||||||
*
|
*
|
||||||
@ -39,41 +23,11 @@ import java.util.List;
|
|||||||
@Component
|
@Component
|
||||||
public class PromotionEverydayExecute implements EveryDayExecute {
|
public class PromotionEverydayExecute implements EveryDayExecute {
|
||||||
|
|
||||||
/**
|
|
||||||
* Mongo
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private MongoTemplate mongoTemplate;
|
|
||||||
/**
|
/**
|
||||||
* ES商品索引
|
* ES商品索引
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
private EsGoodsIndexService esGoodsIndexService;
|
private EsGoodsIndexService esGoodsIndexService;
|
||||||
/**
|
|
||||||
* 满额活动
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private FullDiscountService fullDiscountService;
|
|
||||||
/**
|
|
||||||
* 拼团
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private PintuanService pintuanService;
|
|
||||||
/**
|
|
||||||
* 优惠券
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private CouponService couponService;
|
|
||||||
/**
|
|
||||||
* 会员优惠券
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private MemberCouponService memberCouponService;
|
|
||||||
/**
|
|
||||||
* 促销商品
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private PromotionGoodsService promotionGoodsService;
|
|
||||||
/**
|
/**
|
||||||
* 系统设置
|
* 系统设置
|
||||||
*/
|
*/
|
||||||
@ -90,125 +44,13 @@ public class PromotionEverydayExecute implements EveryDayExecute {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
//mongo查询条件
|
//清除所以商品索引的无效促销活动
|
||||||
Query query = new Query();
|
this.esGoodsIndexService.cleanInvalidPromotion();
|
||||||
//结束条件 活动未关闭/活动未结束
|
|
||||||
query.addCriteria(Criteria.where("promotionStatus").ne(PromotionStatusEnum.END.name())
|
|
||||||
.orOperator(Criteria.where("promotionStatus").ne(PromotionStatusEnum.CLOSE.name())));
|
|
||||||
//结束条件 活动结束时间大于当前时间
|
|
||||||
query.addCriteria(Criteria.where("endTime").lte(new Date()));
|
|
||||||
|
|
||||||
//结束满减活动
|
|
||||||
endFullDiscount(query);
|
|
||||||
|
|
||||||
//关闭拼团活动
|
|
||||||
endPintuan(query);
|
|
||||||
|
|
||||||
//结束优惠券
|
|
||||||
endCoupon(query);
|
|
||||||
|
|
||||||
//定时创建活动
|
//定时创建活动
|
||||||
addSeckill();
|
addSeckill();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 结束优惠券活动
|
|
||||||
*
|
|
||||||
* @param query
|
|
||||||
*/
|
|
||||||
private void endCoupon(Query query) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
//关闭优惠券活动
|
|
||||||
List<CouponVO> couponVOS = mongoTemplate.find(query, CouponVO.class);
|
|
||||||
if (!couponVOS.isEmpty()) {
|
|
||||||
List<String> ids = new ArrayList<>();
|
|
||||||
// //关闭的优惠券活动
|
|
||||||
for (CouponVO vo : couponVOS) {
|
|
||||||
vo.setPromotionStatus(PromotionStatusEnum.END.name());
|
|
||||||
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
|
|
||||||
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
|
|
||||||
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
|
|
||||||
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mongoTemplate.save(vo);
|
|
||||||
ids.add(vo.getId());
|
|
||||||
}
|
|
||||||
couponService.update(this.getUpdatePromotionWrapper(ids));
|
|
||||||
LambdaUpdateWrapper<MemberCoupon> memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper<MemberCoupon>().in(MemberCoupon::getCouponId, ids).set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
|
|
||||||
memberCouponService.update(memberCouponLambdaUpdateWrapper);
|
|
||||||
//将活动商品对照表进行结束处理
|
|
||||||
promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids));
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("优惠券活动关闭错误", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 结束拼团活动
|
|
||||||
*
|
|
||||||
* @param query
|
|
||||||
*/
|
|
||||||
private void endPintuan(Query query) {
|
|
||||||
try {
|
|
||||||
//关闭拼团活动
|
|
||||||
List<PintuanVO> pintuanVOS = mongoTemplate.find(query, PintuanVO.class);
|
|
||||||
if (!pintuanVOS.isEmpty()) {
|
|
||||||
//准备修改活动的id
|
|
||||||
List<String> ids = new ArrayList<>();
|
|
||||||
for (PintuanVO vo : pintuanVOS) {
|
|
||||||
vo.setPromotionStatus(PromotionStatusEnum.END.name());
|
|
||||||
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
|
|
||||||
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
|
|
||||||
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
|
|
||||||
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mongoTemplate.save(vo);
|
|
||||||
ids.add(vo.getId());
|
|
||||||
}
|
|
||||||
pintuanService.update(this.getUpdatePromotionWrapper(ids));
|
|
||||||
//将活动商品对照表进行结束处理
|
|
||||||
promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(ids));
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("拼团活动关闭错误", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 结束满减活动
|
|
||||||
*
|
|
||||||
* @param query
|
|
||||||
*/
|
|
||||||
private void endFullDiscount(Query query) {
|
|
||||||
try {
|
|
||||||
//关闭满减活动
|
|
||||||
List<FullDiscountVO> fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class);
|
|
||||||
if (!fullDiscountVOS.isEmpty()) {
|
|
||||||
List<String> ids = new ArrayList<>();
|
|
||||||
//循环活动 关闭活动
|
|
||||||
for (FullDiscountVO vo : fullDiscountVOS) {
|
|
||||||
vo.setPromotionStatus(PromotionStatusEnum.END.name());
|
|
||||||
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
|
|
||||||
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
|
|
||||||
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
|
|
||||||
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mongoTemplate.save(vo);
|
|
||||||
ids.add(vo.getId());
|
|
||||||
}
|
|
||||||
fullDiscountService.update(this.getUpdatePromotionWrapper(ids));
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("满减活动关闭错误", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加秒杀活动
|
* 添加秒杀活动
|
||||||
* 从系统设置中获取秒杀活动的配置
|
* 从系统设置中获取秒杀活动的配置
|
||||||
@ -218,32 +60,6 @@ public class PromotionEverydayExecute implements EveryDayExecute {
|
|||||||
Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name());
|
Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name());
|
||||||
SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
|
SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
|
||||||
Seckill seckill = new Seckill(SeckillService.PRE_CREATION, seckillSetting.getHours(), seckillSetting.getSeckillRule());
|
Seckill seckill = new Seckill(SeckillService.PRE_CREATION, seckillSetting.getHours(), seckillSetting.getSeckillRule());
|
||||||
seckillService.saveSeckill(seckill);
|
seckillService.savePromotions(seckill);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取促销修改查询条件 修改活动状态
|
|
||||||
*
|
|
||||||
* @param ids 促销活动ID
|
|
||||||
* @return 促销活动商品查询Wrapper
|
|
||||||
*/
|
|
||||||
private UpdateWrapper getUpdatePromotionWrapper(List<String> ids) {
|
|
||||||
UpdateWrapper updateWrapper = new UpdateWrapper<>();
|
|
||||||
updateWrapper.in("id", ids);
|
|
||||||
updateWrapper.set("promotion_status", PromotionStatusEnum.END.name());
|
|
||||||
return updateWrapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取商品的促销修改查询条件 修改商品状态
|
|
||||||
*
|
|
||||||
* @param ids 促销活动ID
|
|
||||||
* @return 促销活动商品修改Wrapper
|
|
||||||
*/
|
|
||||||
private UpdateWrapper getUpdatePromotionGoodsWrapper(List<String> ids) {
|
|
||||||
UpdateWrapper updateWrapper = new UpdateWrapper<>();
|
|
||||||
updateWrapper.in("promotion_id", ids);
|
|
||||||
updateWrapper.set("promotion_status", PromotionStatusEnum.END.name());
|
|
||||||
return updateWrapper;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package cn.lili.timetask.handler.impl.statistics;
|
package cn.lili.timetask.handler.impl.statistics;
|
||||||
|
|
||||||
import cn.lili.modules.statistics.entity.dos.MemberStatisticsData;
|
import cn.lili.modules.statistics.entity.dos.MemberStatisticsData;
|
||||||
import cn.lili.modules.statistics.service.MemberStatisticsDataService;
|
import cn.lili.modules.statistics.service.MemberStatisticsService;
|
||||||
import cn.lili.timetask.handler.EveryDayExecute;
|
import cn.lili.timetask.handler.EveryDayExecute;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -24,7 +24,7 @@ public class MemberStatisticsExecute implements EveryDayExecute {
|
|||||||
* 会员统计
|
* 会员统计
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
private MemberStatisticsDataService memberStatisticsDataService;
|
private MemberStatisticsService memberStatisticsService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
@ -43,30 +43,13 @@ public class MemberStatisticsExecute implements EveryDayExecute {
|
|||||||
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - 1);
|
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - 1);
|
||||||
startTime = calendar.getTime();
|
startTime = calendar.getTime();
|
||||||
MemberStatisticsData memberStatisticsData = new MemberStatisticsData();
|
MemberStatisticsData memberStatisticsData = new MemberStatisticsData();
|
||||||
memberStatisticsData.setMemberCount(memberStatisticsDataService.memberCount(endTime));
|
memberStatisticsData.setMemberCount(memberStatisticsService.memberCount(endTime));
|
||||||
memberStatisticsData.setCreateDate(startTime);
|
memberStatisticsData.setCreateDate(startTime);
|
||||||
memberStatisticsData.setActiveQuantity(memberStatisticsDataService.activeQuantity(startTime));
|
memberStatisticsData.setActiveQuantity(memberStatisticsService.activeQuantity(startTime));
|
||||||
memberStatisticsData.setNewlyAdded(memberStatisticsDataService.newlyAdded(startTime, endTime));
|
memberStatisticsData.setNewlyAdded(memberStatisticsService.newlyAdded(startTime, endTime));
|
||||||
memberStatisticsDataService.save(memberStatisticsData);
|
memberStatisticsService.save(memberStatisticsData);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("每日会员统计功能异常:", e);
|
log.error("每日会员统计功能异常:", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
|
|
||||||
//统计的时间(开始。结束时间)
|
|
||||||
Date startTime, endTime;
|
|
||||||
//初始值
|
|
||||||
Calendar calendar = Calendar.getInstance();
|
|
||||||
calendar.set(Calendar.SECOND, 0);
|
|
||||||
calendar.set(Calendar.MILLISECOND, 1);
|
|
||||||
calendar.set(Calendar.MINUTE, 0);
|
|
||||||
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
|
||||||
endTime = calendar.getTime();
|
|
||||||
//-1天,即为开始时间
|
|
||||||
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - 1);
|
|
||||||
startTime = calendar.getTime();
|
|
||||||
System.out.println(startTime);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -5,7 +5,7 @@ import cn.lili.cache.Cache;
|
|||||||
import cn.lili.cache.CachePrefix;
|
import cn.lili.cache.CachePrefix;
|
||||||
import cn.lili.common.utils.BeanUtil;
|
import cn.lili.common.utils.BeanUtil;
|
||||||
import cn.lili.modules.statistics.entity.dos.PlatformViewData;
|
import cn.lili.modules.statistics.entity.dos.PlatformViewData;
|
||||||
import cn.lili.modules.statistics.service.PlatformViewDataService;
|
import cn.lili.modules.statistics.service.PlatformViewService;
|
||||||
import cn.lili.timetask.handler.EveryDayExecute;
|
import cn.lili.timetask.handler.EveryDayExecute;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -37,7 +37,7 @@ public class PageViewStatisticsExecute implements EveryDayExecute {
|
|||||||
* 平台PV统计
|
* 平台PV统计
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
private PlatformViewDataService platformViewDataService;
|
private PlatformViewService platformViewService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
@ -123,7 +123,7 @@ public class PageViewStatisticsExecute implements EveryDayExecute {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
void batchSave(List<String> pvKeys, List<String> uvKeys, List<PlatformViewData> platformViewData) {
|
void batchSave(List<String> pvKeys, List<String> uvKeys, List<PlatformViewData> platformViewData) {
|
||||||
log.debug("批量保存流量数据,共计【{}】条", platformViewData.size());
|
log.debug("批量保存流量数据,共计【{}】条", platformViewData.size());
|
||||||
platformViewDataService.saveBatch(platformViewData);
|
platformViewService.saveBatch(platformViewData);
|
||||||
//批量删除缓存key
|
//批量删除缓存key
|
||||||
cache.multiDel(pvKeys);
|
cache.multiDel(pvKeys);
|
||||||
cache.multiDel(uvKeys);
|
cache.multiDel(uvKeys);
|
||||||
|
@ -1,16 +1,11 @@
|
|||||||
package cn.lili.trigger.executor;
|
package cn.lili.trigger.executor;
|
||||||
|
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import cn.lili.common.properties.RocketmqCustomProperties;
|
|
||||||
import cn.lili.modules.order.order.service.OrderService;
|
import cn.lili.modules.order.order.service.OrderService;
|
||||||
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
|
import cn.lili.modules.promotion.entity.dos.Pintuan;
|
||||||
import cn.lili.modules.promotion.service.PromotionService;
|
|
||||||
import cn.lili.trigger.TimeTriggerExecutor;
|
import cn.lili.trigger.TimeTriggerExecutor;
|
||||||
import cn.lili.trigger.interfaces.TimeTrigger;
|
|
||||||
import cn.lili.trigger.message.PintuanOrderMessage;
|
import cn.lili.trigger.message.PintuanOrderMessage;
|
||||||
import cn.lili.trigger.message.PromotionMessage;
|
|
||||||
import cn.lili.trigger.model.TimeExecuteConstant;
|
import cn.lili.trigger.model.TimeExecuteConstant;
|
||||||
import cn.lili.trigger.model.TimeTriggerMsg;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -25,21 +20,6 @@ import org.springframework.stereotype.Component;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
@Component(TimeExecuteConstant.PROMOTION_EXECUTOR)
|
@Component(TimeExecuteConstant.PROMOTION_EXECUTOR)
|
||||||
public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
|
public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
|
||||||
/**
|
|
||||||
* 促销
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private PromotionService promotionService;
|
|
||||||
/**
|
|
||||||
* RocketMQ
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private RocketmqCustomProperties rocketmqCustomProperties;
|
|
||||||
/**
|
|
||||||
* 延时任务
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private TimeTrigger timeTrigger;
|
|
||||||
/**
|
/**
|
||||||
* 订单
|
* 订单
|
||||||
*/
|
*/
|
||||||
@ -49,32 +29,6 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Object object) {
|
public void execute(Object object) {
|
||||||
PromotionMessage promotionMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PromotionMessage.class);
|
|
||||||
//促销延时信息
|
|
||||||
if (promotionMessage != null && promotionMessage.getPromotionId() != null) {
|
|
||||||
log.info("促销活动信息消费:{}", promotionMessage);
|
|
||||||
//如果为促销活动开始,则需要发布促销活动结束的定时任务
|
|
||||||
if (PromotionStatusEnum.START.name().equals(promotionMessage.getPromotionStatus())) {
|
|
||||||
if (!promotionService.updatePromotionStatus(promotionMessage)) {
|
|
||||||
log.error("开始促销活动失败: {}", promotionMessage);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//促销活动开始后,设置促销活动结束的定时任务
|
|
||||||
promotionMessage.setPromotionStatus(PromotionStatusEnum.END.name());
|
|
||||||
String uniqueKey = "{TIME_TRIGGER_" + promotionMessage.getPromotionType() + "}_" + promotionMessage.getPromotionId();
|
|
||||||
if (promotionMessage.getEndTime() != null) {
|
|
||||||
//结束时间(延时一分钟)
|
|
||||||
long closeTime = promotionMessage.getEndTime().getTime() + 60000;
|
|
||||||
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR, closeTime, promotionMessage, uniqueKey, rocketmqCustomProperties.getPromotionTopic());
|
|
||||||
//添加延时任务
|
|
||||||
timeTrigger.addDelay(timeTriggerMsg);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//不是开始,则修改活动状态
|
|
||||||
promotionService.updatePromotionStatus(promotionMessage);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//拼团订单消息
|
//拼团订单消息
|
||||||
PintuanOrderMessage pintuanOrderMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PintuanOrderMessage.class);
|
PintuanOrderMessage pintuanOrderMessage = JSONUtil.toBean(JSONUtil.parseObj(object), PintuanOrderMessage.class);
|
||||||
if (pintuanOrderMessage != null && pintuanOrderMessage.getPintuanId() != null) {
|
if (pintuanOrderMessage != null && pintuanOrderMessage.getPintuanId() != null) {
|
||||||
@ -82,6 +36,10 @@ public class PromotionTimeTriggerExecutor implements TimeTriggerExecutor {
|
|||||||
//拼团订单自动处理
|
//拼团订单自动处理
|
||||||
orderService.agglomeratePintuanOrder(pintuanOrderMessage.getPintuanId(), pintuanOrderMessage.getOrderSn());
|
orderService.agglomeratePintuanOrder(pintuanOrderMessage.getPintuanId(), pintuanOrderMessage.getOrderSn());
|
||||||
}
|
}
|
||||||
|
Pintuan pintuan = JSONUtil.toBean(JSONUtil.parseObj(object), Pintuan.class);
|
||||||
|
if (pintuan != null && pintuan.getId() != null) {
|
||||||
|
this.orderService.checkFictitiousOrder(pintuan.getId(), pintuan.getRequiredNum(), pintuan.getFictitious());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,15 +32,6 @@ spring:
|
|||||||
admin:
|
admin:
|
||||||
client:
|
client:
|
||||||
url: http://127.0.0.1:8000
|
url: http://127.0.0.1:8000
|
||||||
# mongodb
|
|
||||||
data:
|
|
||||||
mongodb:
|
|
||||||
uri: 127.0.0.1:27017
|
|
||||||
database: lilishop
|
|
||||||
username: root
|
|
||||||
password: lilishop
|
|
||||||
authentication-database: admin
|
|
||||||
# replica-set-name: mongoreplset
|
|
||||||
cache:
|
cache:
|
||||||
type: redis
|
type: redis
|
||||||
# Redis
|
# Redis
|
||||||
@ -191,7 +182,6 @@ logging:
|
|||||||
cn.lili: info
|
cn.lili: info
|
||||||
# org.hibernate: debug
|
# org.hibernate: debug
|
||||||
# org.springframework: debug
|
# org.springframework: debug
|
||||||
# org.springframework.data.mongodb.core: debug
|
|
||||||
file:
|
file:
|
||||||
# 指定路径
|
# 指定路径
|
||||||
path: lili-logs
|
path: lili-logs
|
||||||
|
61
consumer/src/test/java/cn/lili/buyer/test/bill/BillTest.java
Normal file
61
consumer/src/test/java/cn/lili/buyer/test/bill/BillTest.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package cn.lili.buyer.test.bill;
|
||||||
|
|
||||||
|
import cn.hutool.core.date.DateTime;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.lili.modules.store.entity.dto.StoreSettlementDay;
|
||||||
|
import cn.lili.modules.store.service.BillService;
|
||||||
|
import cn.lili.modules.store.service.StoreDetailService;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author paulG
|
||||||
|
* @since 2022/1/10
|
||||||
|
**/
|
||||||
|
@ExtendWith(SpringExtension.class)
|
||||||
|
@SpringBootTest
|
||||||
|
public class BillTest {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结算单
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private BillService billService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 店铺详情
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private StoreDetailService storeDetailService;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void createBillTest() {
|
||||||
|
//获取当前天数
|
||||||
|
int day = DateUtil.date().dayOfMonth();
|
||||||
|
|
||||||
|
//获取待结算商家列表
|
||||||
|
List<StoreSettlementDay> storeList = storeDetailService.getSettlementStore(day);
|
||||||
|
|
||||||
|
//获取当前时间
|
||||||
|
DateTime endTime = DateUtil.date();
|
||||||
|
//批量商家结算
|
||||||
|
for (StoreSettlementDay storeSettlementDay : storeList) {
|
||||||
|
|
||||||
|
//生成结算单
|
||||||
|
billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(), endTime);
|
||||||
|
|
||||||
|
//修改店铺结算时间
|
||||||
|
storeDetailService.updateSettlementDay(storeSettlementDay.getStoreId(), endTime);
|
||||||
|
}
|
||||||
|
Assertions.assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -26,9 +26,21 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!--定时任务-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-quartz</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>log4j-to-slf4j</artifactId>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
@ -69,16 +81,11 @@
|
|||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-pool2</artifactId>
|
<artifactId>commons-pool2</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!--mongodb依赖配置-->
|
<!-- <!– Websocket –>-->
|
||||||
<dependency>
|
<!-- <dependency>-->
|
||||||
<groupId>org.springframework.boot</groupId>
|
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||||
<artifactId>spring-boot-starter-data-mongodb</artifactId>
|
<!-- <artifactId>spring-boot-starter-websocket</artifactId>-->
|
||||||
</dependency>
|
<!-- </dependency>-->
|
||||||
<!-- <!– Websocket –>-->
|
|
||||||
<!-- <dependency>-->
|
|
||||||
<!-- <groupId>org.springframework.boot</groupId>-->
|
|
||||||
<!-- <artifactId>spring-boot-starter-websocket</artifactId>-->
|
|
||||||
<!-- </dependency>-->
|
|
||||||
<!-- MybatisPlus -->
|
<!-- MybatisPlus -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
@ -88,7 +95,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mybatis.spring.boot</groupId>
|
<groupId>org.mybatis.spring.boot</groupId>
|
||||||
<artifactId>mybatis-spring-boot-starter-test</artifactId>
|
<artifactId>mybatis-spring-boot-starter-test</artifactId>
|
||||||
<version>1.3.2</version>
|
<version>2.2.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- Mysql Connector -->
|
<!-- Mysql Connector -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -265,11 +272,11 @@
|
|||||||
<artifactId>logstash-logback-encoder</artifactId>
|
<artifactId>logstash-logback-encoder</artifactId>
|
||||||
<version>${logstash-logback-encoder}</version>
|
<version>${logstash-logback-encoder}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>javax.interceptor</groupId>-->
|
<!-- <groupId>javax.interceptor</groupId>-->
|
||||||
<!-- <artifactId>javax.interceptor-api</artifactId>-->
|
<!-- <artifactId>javax.interceptor-api</artifactId>-->
|
||||||
<!-- <version>${interceptor-api}</version>-->
|
<!-- <version>${interceptor-api}</version>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>de.codecentric</groupId>
|
<groupId>de.codecentric</groupId>
|
||||||
<artifactId>spring-boot-admin-starter-client</artifactId>
|
<artifactId>spring-boot-admin-starter-client</artifactId>
|
||||||
|
@ -480,7 +480,11 @@ public enum CachePrefix {
|
|||||||
/**
|
/**
|
||||||
* 订单暂时缓存
|
* 订单暂时缓存
|
||||||
*/
|
*/
|
||||||
ORDER;
|
ORDER,
|
||||||
|
/**
|
||||||
|
* 敏感词
|
||||||
|
*/
|
||||||
|
SENSITIVE;
|
||||||
|
|
||||||
|
|
||||||
public static String removePrefix(String str) {
|
public static String removePrefix(String str) {
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
package cn.lili.cache.config.mongo;
|
|
||||||
|
|
||||||
import com.mongodb.MongoClientSettings;
|
|
||||||
import com.mongodb.MongoCredential;
|
|
||||||
import com.mongodb.ServerAddress;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
|
|
||||||
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author paulG
|
|
||||||
* @since 2020/10/22
|
|
||||||
**/
|
|
||||||
@Configuration
|
|
||||||
@EnableMongoRepositories
|
|
||||||
public class MongoConfig extends AbstractMongoClientConfiguration {
|
|
||||||
|
|
||||||
@Value("${spring.data.mongodb.database}")
|
|
||||||
private String databaseName;
|
|
||||||
|
|
||||||
@Value("${spring.data.mongodb.uri}")
|
|
||||||
private List<String> uri = new ArrayList<>();
|
|
||||||
|
|
||||||
@Value("${spring.data.mongodb.username}")
|
|
||||||
private String username;
|
|
||||||
|
|
||||||
@Value("${spring.data.mongodb.password}")
|
|
||||||
private String password;
|
|
||||||
|
|
||||||
@Value("${spring.data.mongodb.authentication-database}")
|
|
||||||
private String authenticationDatabase;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getDatabaseName() {
|
|
||||||
return databaseName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void configureClientSettings(MongoClientSettings.Builder builder) {
|
|
||||||
builder.credential(MongoCredential.createCredential(username, authenticationDatabase, password.toCharArray()))
|
|
||||||
.applyToClusterSettings(settings -> {
|
|
||||||
List<ServerAddress> serverAddresses = new ArrayList<>();
|
|
||||||
for (String s : uri) {
|
|
||||||
String[] node = s.split(":");
|
|
||||||
serverAddresses.add(new ServerAddress(node[0], Integer.parseInt(node[1])));
|
|
||||||
}
|
|
||||||
settings.hosts(serverAddresses);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -78,6 +78,7 @@ public class RedisConfig extends CachingConfigurerSupport {
|
|||||||
可参考 https://blog.csdn.net/u012240455/article/details/80538540
|
可参考 https://blog.csdn.net/u012240455/article/details/80538540
|
||||||
*/
|
*/
|
||||||
ParserConfig.getGlobalInstance().addAccept("cn.lili.");
|
ParserConfig.getGlobalInstance().addAccept("cn.lili.");
|
||||||
|
ParserConfig.getGlobalInstance().addAccept("cn.hutool.json.");
|
||||||
|
|
||||||
return cacheManager;
|
return cacheManager;
|
||||||
}
|
}
|
||||||
|
@ -1,250 +0,0 @@
|
|||||||
package cn.lili.cache.util;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.data.redis.core.DefaultTypedTuple;
|
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Redis封装工具类
|
|
||||||
*
|
|
||||||
* @author paulG
|
|
||||||
* @since 2020/11/7
|
|
||||||
**/
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
public class RedisUtil {
|
|
||||||
@Autowired
|
|
||||||
private RedisTemplate redisTemplate;
|
|
||||||
|
|
||||||
//=============================common============================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 指定缓存失效时间
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param time 时间(秒)
|
|
||||||
* @return 操作结果
|
|
||||||
*/
|
|
||||||
public boolean expire(String key, long time) {
|
|
||||||
try {
|
|
||||||
if (time > 0) {
|
|
||||||
redisTemplate.expire(key, time, TimeUnit.SECONDS);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("指定缓存失效时间错误",e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//============================String=============================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 普通缓存获取
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @return 值
|
|
||||||
*/
|
|
||||||
public Object get(String key) {
|
|
||||||
return key == null ? null : redisTemplate.opsForValue().get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 普通缓存获取
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @return 值
|
|
||||||
*/
|
|
||||||
public <T> T get(String key, Class<T> clazz) {
|
|
||||||
Object o = key == null ? null : redisTemplate.opsForValue().get(key);
|
|
||||||
return (T) o;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 普通缓存放入
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param value 值
|
|
||||||
* @return true成功 false失败
|
|
||||||
*/
|
|
||||||
public boolean set(String key, Object value) {
|
|
||||||
try {
|
|
||||||
redisTemplate.opsForValue().set(key, value);
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("缓存放入错误",e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 普通缓存放入并设置时间
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param value 值
|
|
||||||
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
|
|
||||||
* @return true成功 false 失败
|
|
||||||
*/
|
|
||||||
public boolean set(String key, Object value, long time) {
|
|
||||||
try {
|
|
||||||
if (time > 0) {
|
|
||||||
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
|
|
||||||
} else {
|
|
||||||
set(key, value);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("普通缓存放入并设置时间错误",e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//================================Map=================================
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 将数据放入set缓存
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param values 值 可以是多个
|
|
||||||
* @return 成功个数
|
|
||||||
*/
|
|
||||||
public long sSet(String key, Object... values) {
|
|
||||||
try {
|
|
||||||
return redisTemplate.opsForSet().add(key, values);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("将数据放入set缓存错误",e);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 将list放入缓存
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param value 值
|
|
||||||
* @return 操作结果
|
|
||||||
*/
|
|
||||||
public boolean lSet(String key, Object value) {
|
|
||||||
try {
|
|
||||||
redisTemplate.opsForList().rightPush(key, value);
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("将list放入缓存错误",e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 将list放入缓存
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param value 值
|
|
||||||
* @param time 时间(秒)
|
|
||||||
* @return 操作结果
|
|
||||||
*/
|
|
||||||
public boolean lSet(String key, Object value, long time) {
|
|
||||||
try {
|
|
||||||
redisTemplate.opsForList().rightPush(key, value);
|
|
||||||
if (time > 0) {
|
|
||||||
expire(key, time);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("将list放入缓存错误",e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 将list放入缓存
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param value 值
|
|
||||||
* @return 操作结果
|
|
||||||
*/
|
|
||||||
public boolean lSet(String key, List<Object> value) {
|
|
||||||
try {
|
|
||||||
redisTemplate.opsForList().rightPushAll(key, value);
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("将list放入缓存错误",e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 将list放入缓存
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param value 值
|
|
||||||
* @param time 时间(秒)
|
|
||||||
* @return 操作结果
|
|
||||||
*/
|
|
||||||
public boolean lSet(String key, List<Object> value, long time) {
|
|
||||||
try {
|
|
||||||
redisTemplate.opsForList().rightPushAll(key, value);
|
|
||||||
if (time > 0) {
|
|
||||||
expire(key, time);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("将list放入缓存错误",e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//===============================ZSet=================================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 向Zset里添加成员
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param score 分数
|
|
||||||
* @param value 值
|
|
||||||
* @return 操作结果
|
|
||||||
*/
|
|
||||||
public boolean zadd(String key, long score, String value) {
|
|
||||||
return redisTemplate.opsForZSet().add(key, value, score);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取 某key 下 某一分值区间的队列
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param from 起始位置
|
|
||||||
* @param to 结束为止
|
|
||||||
* @return 符合条件的结果集
|
|
||||||
*/
|
|
||||||
public Set<DefaultTypedTuple> zrangeByScoreWithScores(String key, int from, long to) {
|
|
||||||
Set<DefaultTypedTuple> set = redisTemplate.opsForZSet().rangeByScoreWithScores(key, from, to);
|
|
||||||
return set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 移除 Zset队列值
|
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param value 值集合
|
|
||||||
* @return 移除数量
|
|
||||||
*/
|
|
||||||
public Long zremove(String key, String... value) {
|
|
||||||
return redisTemplate.opsForZSet().remove(key, value);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.modules.system.aspect.annotation;
|
package cn.lili.common.aop.annotation;
|
||||||
|
|
||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
|
@ -1,9 +1,9 @@
|
|||||||
package cn.lili.modules.system.aspect.interceptor;
|
package cn.lili.common.aop.interceptor;
|
||||||
|
|
||||||
|
import cn.lili.common.aop.annotation.DemoSite;
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.exception.ServiceException;
|
||||||
import cn.lili.common.properties.SystemSettingProperties;
|
import cn.lili.common.properties.SystemSettingProperties;
|
||||||
import cn.lili.modules.system.aspect.annotation.DemoSite;
|
|
||||||
import org.aspectj.lang.annotation.Aspect;
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
import org.aspectj.lang.annotation.Before;
|
import org.aspectj.lang.annotation.Before;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
@ -23,7 +23,7 @@ public enum PromotionTypeEnum {
|
|||||||
/**
|
/**
|
||||||
* 有促销库存的活动类型
|
* 有促销库存的活动类型
|
||||||
*/
|
*/
|
||||||
static PromotionTypeEnum[] haveStockPromotion = new PromotionTypeEnum[]{PINTUAN, SECKILL, KANJIA, POINTS_GOODS};
|
static final PromotionTypeEnum[] haveStockPromotion = new PromotionTypeEnum[]{PINTUAN, SECKILL, KANJIA, POINTS_GOODS};
|
||||||
|
|
||||||
private final String description;
|
private final String description;
|
||||||
|
|
||||||
|
@ -66,6 +66,8 @@ public enum ResultCode {
|
|||||||
GOODS_UPPER_ERROR(11004, "商品上架失败"),
|
GOODS_UPPER_ERROR(11004, "商品上架失败"),
|
||||||
GOODS_AUTH_ERROR(11005, "商品审核失败"),
|
GOODS_AUTH_ERROR(11005, "商品审核失败"),
|
||||||
POINT_GOODS_ERROR(11006, "积分商品业务异常,请稍后重试"),
|
POINT_GOODS_ERROR(11006, "积分商品业务异常,请稍后重试"),
|
||||||
|
POINT_GOODS_NOT_EXIST(11020, "积分商品不存在"),
|
||||||
|
POINT_GOODS_CATEGORY_EXIST(11021, "当前积分商品分类已存在"),
|
||||||
GOODS_SKU_SN_ERROR(11007, "商品SKU货号不能为空"),
|
GOODS_SKU_SN_ERROR(11007, "商品SKU货号不能为空"),
|
||||||
GOODS_SKU_PRICE_ERROR(11008, "商品SKU价格不能小于等于0"),
|
GOODS_SKU_PRICE_ERROR(11008, "商品SKU价格不能小于等于0"),
|
||||||
GOODS_SKU_COST_ERROR(11009, "商品SKU成本价不能小于等于0"),
|
GOODS_SKU_COST_ERROR(11009, "商品SKU成本价不能小于等于0"),
|
||||||
@ -178,6 +180,7 @@ public enum ResultCode {
|
|||||||
ORDER_CAN_NOT_CANCEL(31012, "当前订单状态不可取消"),
|
ORDER_CAN_NOT_CANCEL(31012, "当前订单状态不可取消"),
|
||||||
ORDER_BATCH_DELIVER_ERROR(31013, "批量发货,文件读取失败"),
|
ORDER_BATCH_DELIVER_ERROR(31013, "批量发货,文件读取失败"),
|
||||||
ORDER_ITEM_NOT_EXIST(31014, "当前订单项不存在!"),
|
ORDER_ITEM_NOT_EXIST(31014, "当前订单项不存在!"),
|
||||||
|
POINT_NOT_ENOUGH(31015, "当前会员积分不足购买当前积分商品!"),
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -248,6 +251,7 @@ public enum ResultCode {
|
|||||||
PROMOTION_START_TIME_ERROR(40002, "活动起始时间不能小于当前时间"),
|
PROMOTION_START_TIME_ERROR(40002, "活动起始时间不能小于当前时间"),
|
||||||
PROMOTION_END_TIME_ERROR(40003, "活动结束时间不能小于当前时间"),
|
PROMOTION_END_TIME_ERROR(40003, "活动结束时间不能小于当前时间"),
|
||||||
PROMOTION_TIME_ERROR(40004, "活动起始时间必须大于结束时间"),
|
PROMOTION_TIME_ERROR(40004, "活动起始时间必须大于结束时间"),
|
||||||
|
PROMOTION_TIME_NOT_EXIST(40011, "活动起始时间和活动结束时间不能为空"),
|
||||||
PROMOTION_SAME_ERROR(40005, "当前时间段已存在相同活动!"),
|
PROMOTION_SAME_ERROR(40005, "当前时间段已存在相同活动!"),
|
||||||
PROMOTION_GOODS_ERROR(40006, "请选择要参与活动的商品"),
|
PROMOTION_GOODS_ERROR(40006, "请选择要参与活动的商品"),
|
||||||
PROMOTION_STATUS_END(40007, "当前活动已停止"),
|
PROMOTION_STATUS_END(40007, "当前活动已停止"),
|
||||||
@ -267,6 +271,11 @@ public enum ResultCode {
|
|||||||
COUPON_RECEIVE_ERROR(41005, "当前优惠券已经被领取完了,下次要早点来哦"),
|
COUPON_RECEIVE_ERROR(41005, "当前优惠券已经被领取完了,下次要早点来哦"),
|
||||||
COUPON_NUM_INSUFFICIENT_ERROR(41006, "优惠券剩余领取数量不足"),
|
COUPON_NUM_INSUFFICIENT_ERROR(41006, "优惠券剩余领取数量不足"),
|
||||||
COUPON_NOT_EXIST(41007, "当前优惠券不存在"),
|
COUPON_NOT_EXIST(41007, "当前优惠券不存在"),
|
||||||
|
COUPON_DO_NOT_RECEIVER(41030, "当前优惠券不允许主动领取"),
|
||||||
|
COUPON_ACTIVITY_NOT_EXIST(410022, "当前优惠券活动不存在"),
|
||||||
|
COUPON_SAVE_ERROR(41020, "保存优惠券失败"),
|
||||||
|
COUPON_ACTIVITY_SAVE_ERROR(41023, "保存优惠券活动失败"),
|
||||||
|
COUPON_DELETE_ERROR(41021, "删除优惠券失败"),
|
||||||
COUPON_LIMIT_NUM_LESS_THAN_0(41008, "领取限制数量不能为负数"),
|
COUPON_LIMIT_NUM_LESS_THAN_0(41008, "领取限制数量不能为负数"),
|
||||||
COUPON_LIMIT_GREATER_THAN_PUBLISH(41009, "领取限制数量超出发行数量"),
|
COUPON_LIMIT_GREATER_THAN_PUBLISH(41009, "领取限制数量超出发行数量"),
|
||||||
COUPON_DISCOUNT_ERROR(41010, "优惠券折扣必须小于10且大于0"),
|
COUPON_DISCOUNT_ERROR(41010, "优惠券折扣必须小于10且大于0"),
|
||||||
@ -294,7 +303,8 @@ public enum ResultCode {
|
|||||||
PINTUAN_DELETE_ERROR(42010, "删除拼团活动失败"),
|
PINTUAN_DELETE_ERROR(42010, "删除拼团活动失败"),
|
||||||
PINTUAN_JOIN_ERROR(42011, "不能参与自己发起的拼团活动!"),
|
PINTUAN_JOIN_ERROR(42011, "不能参与自己发起的拼团活动!"),
|
||||||
PINTUAN_LIMIT_NUM_ERROR(42012, "购买数量超过拼团活动限制数量!"),
|
PINTUAN_LIMIT_NUM_ERROR(42012, "购买数量超过拼团活动限制数量!"),
|
||||||
PINTUAN_NOT_EXIST_ERROR(42013, "当前拼团商品不存在!"),
|
PINTUAN_NOT_EXIST_ERROR(42013, "当前拼团活动不存在!"),
|
||||||
|
PINTUAN_GOODS_NOT_EXIST_ERROR(42014, "当前拼团商品不存在!"),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 满额活动
|
* 满额活动
|
||||||
@ -321,10 +331,12 @@ public enum ResultCode {
|
|||||||
*/
|
*/
|
||||||
SECKILL_NOT_START_ERROR(45000, "今日没有限时抢购活动,请明天再来看看吧。"),
|
SECKILL_NOT_START_ERROR(45000, "今日没有限时抢购活动,请明天再来看看吧。"),
|
||||||
SECKILL_NOT_EXIST_ERROR(45001, "当前参与的秒杀活动不存在!"),
|
SECKILL_NOT_EXIST_ERROR(45001, "当前参与的秒杀活动不存在!"),
|
||||||
|
SECKILL_APPLY_NOT_EXIST_ERROR(45010, "当前参与的秒杀活动不存在!"),
|
||||||
SECKILL_UPDATE_ERROR(45002, "当前秒杀活动活动已经开始,无法修改!"),
|
SECKILL_UPDATE_ERROR(45002, "当前秒杀活动活动已经开始,无法修改!"),
|
||||||
SECKILL_PRICE_ERROR(45003, "活动价格不能大于商品原价"),
|
SECKILL_PRICE_ERROR(45003, "活动价格不能大于商品原价"),
|
||||||
SECKILL_TIME_ERROR(45004, "时刻参数异常"),
|
SECKILL_TIME_ERROR(45004, "时刻参数异常"),
|
||||||
SECKILL_DELETE_ERROR(45005, "该秒杀活动活动的状态不能删除"),
|
SECKILL_DELETE_ERROR(45005, "该秒杀活动活动的状态不能删除"),
|
||||||
|
SECKILL_OPEN_ERROR(45010, "该秒杀活动活动的状态不能删除"),
|
||||||
SECKILL_CLOSE_ERROR(45006, "该秒杀活动活动的状态不能关闭"),
|
SECKILL_CLOSE_ERROR(45006, "该秒杀活动活动的状态不能关闭"),
|
||||||
|
|
||||||
|
|
||||||
@ -354,6 +366,7 @@ public enum ResultCode {
|
|||||||
KANJIA_GOODS_ACTIVE_HIGHEST_LOWEST_PRICE_ERROR(48005, "最低砍价金额不能高于最高砍价金额"),
|
KANJIA_GOODS_ACTIVE_HIGHEST_LOWEST_PRICE_ERROR(48005, "最低砍价金额不能高于最高砍价金额"),
|
||||||
KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR(48006, "结算金额不能高于商品金额"),
|
KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR(48006, "结算金额不能高于商品金额"),
|
||||||
KANJIA_GOODS_DELETE_ERROR(48007, "删除砍价商品异常"),
|
KANJIA_GOODS_DELETE_ERROR(48007, "删除砍价商品异常"),
|
||||||
|
KANJIA_GOODS_UPDATE_ERROR(48012, "更新砍价商品异常"),
|
||||||
KANJIA_ACTIVITY_NOT_FOUND_ERROR(48008, "砍价记录不存在"),
|
KANJIA_ACTIVITY_NOT_FOUND_ERROR(48008, "砍价记录不存在"),
|
||||||
KANJIA_ACTIVITY_LOG_MEMBER_ERROR(48009, "当前会员已经帮砍"),
|
KANJIA_ACTIVITY_LOG_MEMBER_ERROR(48009, "当前会员已经帮砍"),
|
||||||
KANJIA_ACTIVITY_MEMBER_ERROR(48010, "当前会员已经发起此砍价商品活动"),
|
KANJIA_ACTIVITY_MEMBER_ERROR(48010, "当前会员已经发起此砍价商品活动"),
|
||||||
|
@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
|
|||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.validation.ConstraintViolationException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -122,4 +123,18 @@ public class GlobalControllerExceptionHandler {
|
|||||||
return ResultUtil.error(ResultCode.PARAMS_ERROR);
|
return ResultUtil.error(ResultCode.PARAMS_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bean校验未通过异常
|
||||||
|
*
|
||||||
|
* @see javax.validation.Valid
|
||||||
|
* @see org.springframework.validation.Validator
|
||||||
|
* @see org.springframework.validation.DataBinder
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(ConstraintViolationException.class)
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
@ResponseBody
|
||||||
|
public ResultMessage<Object> constraintViolationExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
|
||||||
|
ConstraintViolationException exception = (ConstraintViolationException) e;
|
||||||
|
return ResultUtil.error(ResultCode.PARAMS_ERROR.code(), exception.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,11 @@ public class AuthUser implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String nickName;
|
private String nickName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 头像
|
||||||
|
*/
|
||||||
|
private String face;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* id
|
* id
|
||||||
*/
|
*/
|
||||||
@ -58,16 +63,18 @@ public class AuthUser implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Boolean isSuper = false;
|
private Boolean isSuper = false;
|
||||||
|
|
||||||
public AuthUser(String username, String id, String nickName, UserEnums role) {
|
public AuthUser(String username, String id, String nickName, String face, UserEnums role) {
|
||||||
this.username = username;
|
this.username = username;
|
||||||
|
this.face = face;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.role = role;
|
this.role = role;
|
||||||
this.nickName = nickName;
|
this.nickName = nickName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AuthUser(String username, String id, UserEnums manager, String nickName, Boolean isSuper) {
|
public AuthUser(String username, String id, String face, UserEnums manager, String nickName, Boolean isSuper) {
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
this.face = face;
|
||||||
this.role = manager;
|
this.role = manager;
|
||||||
this.isSuper = isSuper;
|
this.isSuper = isSuper;
|
||||||
this.nickName = nickName;
|
this.nickName = nickName;
|
||||||
|
@ -2,7 +2,6 @@ package cn.lili.common.security;
|
|||||||
|
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.exception.ServiceException;
|
||||||
import cn.lili.common.security.AuthUser;
|
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.utils.BeanUtil;
|
import cn.lili.common.utils.BeanUtil;
|
||||||
|
|
||||||
|
@ -4,6 +4,9 @@ package cn.lili.common.security.filter;
|
|||||||
import cn.hutool.core.text.CharSequenceUtil;
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.hutool.http.HtmlUtil;
|
import cn.hutool.http.HtmlUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.owasp.html.HtmlPolicyBuilder;
|
||||||
|
import org.owasp.html.PolicyFactory;
|
||||||
import org.owasp.html.Sanitizers;
|
import org.owasp.html.Sanitizers;
|
||||||
|
|
||||||
import javax.servlet.ReadListener;
|
import javax.servlet.ReadListener;
|
||||||
@ -17,7 +20,6 @@ import java.io.InputStreamReader;
|
|||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -27,6 +29,7 @@ import java.util.Map;
|
|||||||
* @version v1.0
|
* @version v1.0
|
||||||
* 2021-06-04 10:39
|
* 2021-06-04 10:39
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
||||||
|
|
||||||
|
|
||||||
@ -35,7 +38,44 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|||||||
*
|
*
|
||||||
* @todo 这里的参数应该更智能些,例如iv,前端的参数包含这两个字母就会放过,这是有问题的
|
* @todo 这里的参数应该更智能些,例如iv,前端的参数包含这两个字母就会放过,这是有问题的
|
||||||
*/
|
*/
|
||||||
private static final String[] IGNORE_FIELD = {"logo", "url", "photo", "intro", "content", "name", "image", "encrypted", "iv","mail"};
|
private static final String[] IGNORE_FIELD = {
|
||||||
|
"logo",
|
||||||
|
"url",
|
||||||
|
"photo",
|
||||||
|
"intro",
|
||||||
|
"content",
|
||||||
|
"name",
|
||||||
|
"image",
|
||||||
|
"encrypted",
|
||||||
|
"iv",
|
||||||
|
"mail",
|
||||||
|
"sell",
|
||||||
|
"id",
|
||||||
|
"price",
|
||||||
|
"prop",
|
||||||
|
"reply",
|
||||||
|
"profile",
|
||||||
|
"privateKey",
|
||||||
|
"wechatpay",
|
||||||
|
};
|
||||||
|
|
||||||
|
//允许的标签
|
||||||
|
private static final String[] allowedTags = {"h1", "h2", "h3", "h4", "h5", "h6",
|
||||||
|
"span", "strong",
|
||||||
|
"img", "video", "source", "iframe", "code",
|
||||||
|
"blockquote", "p", "div",
|
||||||
|
"ul", "ol", "li",
|
||||||
|
"table", "thead", "caption", "tbody", "tr", "th", "td", "br",
|
||||||
|
"a"
|
||||||
|
};
|
||||||
|
|
||||||
|
//需要转化的标签
|
||||||
|
private static final String[] needTransformTags = {"article", "aside", "command", "datalist", "details", "figcaption", "figure",
|
||||||
|
"footer", "header", "hgroup", "section", "summary"};
|
||||||
|
|
||||||
|
//带有超链接的标签
|
||||||
|
private static final String[] linkTags = {"img", "video", "source", "a", "iframe"};
|
||||||
|
|
||||||
|
|
||||||
public XssHttpServletRequestWrapper(HttpServletRequest request) {
|
public XssHttpServletRequestWrapper(HttpServletRequest request) {
|
||||||
super(request);
|
super(request);
|
||||||
@ -128,12 +168,19 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public ServletInputStream getInputStream() throws IOException {
|
public ServletInputStream getInputStream() throws IOException {
|
||||||
|
|
||||||
|
BufferedReader bufferedReader = null;
|
||||||
|
|
||||||
|
InputStreamReader reader = null;
|
||||||
|
|
||||||
//获取输入流
|
//获取输入流
|
||||||
ServletInputStream in = super.getInputStream();
|
ServletInputStream in = null;
|
||||||
|
try {
|
||||||
|
in = super.getInputStream();
|
||||||
//用于存储输入流
|
//用于存储输入流
|
||||||
StringBuilder body = new StringBuilder();
|
StringBuilder body = new StringBuilder();
|
||||||
InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
|
reader = new InputStreamReader(in, StandardCharsets.UTF_8);
|
||||||
BufferedReader bufferedReader = new BufferedReader(reader);
|
bufferedReader = new BufferedReader(reader);
|
||||||
//按行读取输入流
|
//按行读取输入流
|
||||||
String line = bufferedReader.readLine();
|
String line = bufferedReader.readLine();
|
||||||
while (line != null) {
|
while (line != null) {
|
||||||
@ -142,11 +189,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|||||||
//继续读取下一行流,直到line为空
|
//继续读取下一行流,直到line为空
|
||||||
line = bufferedReader.readLine();
|
line = bufferedReader.readLine();
|
||||||
}
|
}
|
||||||
//关闭流
|
|
||||||
bufferedReader.close();
|
|
||||||
reader.close();
|
|
||||||
in.close();
|
|
||||||
|
|
||||||
if (CharSequenceUtil.isNotEmpty(body) && Boolean.TRUE.equals(JSONUtil.isJsonObj(body.toString()))) {
|
if (CharSequenceUtil.isNotEmpty(body) && Boolean.TRUE.equals(JSONUtil.isJsonObj(body.toString()))) {
|
||||||
//将body转换为map
|
//将body转换为map
|
||||||
Map<String, Object> map = JSONUtil.parseObj(body.toString());
|
Map<String, Object> map = JSONUtil.parseObj(body.toString());
|
||||||
@ -192,7 +234,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|||||||
|
|
||||||
//将json字符串转换为字节
|
//将json字符串转换为字节
|
||||||
final ByteArrayInputStream bis = new ByteArrayInputStream(body.toString().getBytes());
|
final ByteArrayInputStream bis = new ByteArrayInputStream(body.toString().getBytes());
|
||||||
|
|
||||||
//实现接口
|
//实现接口
|
||||||
return new ServletInputStream() {
|
return new ServletInputStream() {
|
||||||
@Override
|
@Override
|
||||||
@ -215,14 +256,49 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|||||||
return bis.read();
|
return bis.read();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
log.error("get request inputStream error", e);
|
||||||
|
return null;
|
||||||
|
} finally {
|
||||||
|
//关闭流
|
||||||
|
if (bufferedReader != null) {
|
||||||
|
bufferedReader.close();
|
||||||
|
}
|
||||||
|
if (reader != null) {
|
||||||
|
reader.close();
|
||||||
|
}
|
||||||
|
if (in != null) {
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String cleanXSS(String value) {
|
private String cleanXSS(String value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
value = Sanitizers.FORMATTING.and(Sanitizers.LINKS).sanitize(value);
|
// 自定义策略
|
||||||
|
PolicyFactory policy = new HtmlPolicyBuilder()
|
||||||
|
.allowStandardUrlProtocols()
|
||||||
|
//所有允许的标签
|
||||||
|
.allowElements(allowedTags)
|
||||||
|
//内容标签转化为div
|
||||||
|
.allowElements((elementName, attributes) -> "div", needTransformTags)
|
||||||
|
.allowAttributes("src", "href", "target", "width", "height").onElements(linkTags)
|
||||||
|
//校验链接中的是否为http
|
||||||
|
// .allowUrlProtocols("https")
|
||||||
|
.toFactory();
|
||||||
|
// basic prepackaged policies for links, tables, integers, images, styles, blocks
|
||||||
|
value = Sanitizers.FORMATTING
|
||||||
|
.and(Sanitizers.STYLES)
|
||||||
|
.and(Sanitizers.IMAGES)
|
||||||
|
.and(Sanitizers.LINKS)
|
||||||
|
.and(Sanitizers.BLOCKS)
|
||||||
|
.and(Sanitizers.TABLES)
|
||||||
|
.and(policy)
|
||||||
|
.sanitize(value);
|
||||||
}
|
}
|
||||||
return value;
|
return HtmlUtil.unescape(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -233,12 +309,13 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|||||||
* @return 参数值
|
* @return 参数值
|
||||||
*/
|
*/
|
||||||
private String filterXss(String name, String value) {
|
private String filterXss(String name, String value) {
|
||||||
if (CharSequenceUtil.containsAny(name.toLowerCase(Locale.ROOT), IGNORE_FIELD)) {
|
// if (CharSequenceUtil.containsAny(name.toLowerCase(Locale.ROOT), IGNORE_FIELD)) {
|
||||||
// 忽略的处理,(过滤敏感字符)
|
// // 忽略的处理,(过滤敏感字符)
|
||||||
return HtmlUtil.unescape(HtmlUtil.filter(value));
|
// return value;
|
||||||
} else {
|
// } else {
|
||||||
|
// return cleanXSS(value);
|
||||||
|
// }
|
||||||
return cleanXSS(value);
|
return cleanXSS(value);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,6 @@
|
|||||||
package cn.lili.modules.system.utils;
|
package cn.lili.common.sensitive;
|
||||||
|
|
||||||
import cn.lili.modules.system.entity.dos.SensitiveWords;
|
|
||||||
import cn.lili.modules.system.service.SensitiveWordsService;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.ApplicationArguments;
|
|
||||||
import org.springframework.boot.ApplicationRunner;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -21,9 +15,12 @@ import java.util.NavigableSet;
|
|||||||
* 2020-02-25 14:10:16
|
* 2020-02-25 14:10:16
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
public class SensitiveWordsFilter implements Serializable {
|
||||||
public class SensitiveWordsFilter implements Serializable, ApplicationRunner {
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符*
|
||||||
|
*/
|
||||||
|
public final static char WILDCARD_STAR = '*';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为2的n次方,考虑到敏感词大概在10k左右,
|
* 为2的n次方,考虑到敏感词大概在10k左右,
|
||||||
@ -37,98 +34,27 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner {
|
|||||||
* 类似HashMap的桶,比较稀疏。
|
* 类似HashMap的桶,比较稀疏。
|
||||||
* 使用2个字符的hash定位。
|
* 使用2个字符的hash定位。
|
||||||
*/
|
*/
|
||||||
protected static SensitiveWordsNode[] nodes;
|
protected static SensitiveWordsNode[] nodes = new SensitiveWordsNode[0];
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private SensitiveWordsService sensitiveWordsService;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 增加一个敏感词,如果词的长度(trim后)小于2,则丢弃<br/>
|
* 更新中的nodes,用于防止动态更新时,原有nodes被清空,导致无法正常写入过滤词
|
||||||
* 此方法(构建)并不是主要的性能优化点。
|
|
||||||
*
|
|
||||||
* @param word 敏感词
|
|
||||||
* @return 操作结果
|
|
||||||
*/
|
*/
|
||||||
public static boolean put(String word) {
|
protected static SensitiveWordsNode[] nodesUpdate;
|
||||||
|
|
||||||
//长度小于2的不加入
|
|
||||||
if (word == null || word.trim().length() < 2) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//两个字符的不考虑
|
|
||||||
if (word.length() == 2 && word.matches("\\w\\w")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
StringPointer sp = new StringPointer(word.trim());
|
|
||||||
//计算头两个字符的hash
|
|
||||||
int hash = sp.nextTwoCharHash(0);
|
|
||||||
//计算头两个字符的mix表示(mix相同,两个字符相同)
|
|
||||||
int mix = sp.nextTwoCharMix(0);
|
|
||||||
//转为在hash桶中的位置
|
|
||||||
int index = hash & (nodes.length - 1);
|
|
||||||
|
|
||||||
//从桶里拿第一个节点
|
|
||||||
SensitiveWordsNode node = nodes[index];
|
|
||||||
if (node == null) {
|
|
||||||
//如果没有节点,则放进去一个
|
|
||||||
node = new SensitiveWordsNode(mix);
|
|
||||||
//并添加词
|
|
||||||
node.words.add(sp);
|
|
||||||
//放入桶里
|
|
||||||
nodes[index] = node;
|
|
||||||
} else {
|
|
||||||
//如果已经有节点(1个或多个),找到正确的节点
|
|
||||||
for (; node != null; node = node.next) {
|
|
||||||
//匹配节点
|
|
||||||
if (node.headTwoCharMix == mix) {
|
|
||||||
node.words.add(sp);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//如果匹配到最后仍然不成功,则追加一个节点
|
|
||||||
if (node.next == null) {
|
|
||||||
new SensitiveWordsNode(mix, node).words.add(sp);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 移除敏感词
|
* 过滤铭感次
|
||||||
*
|
*
|
||||||
* @param word
|
* @param sentence 过滤赐予
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static void remove(String word) {
|
public static String filter(String sentence) {
|
||||||
|
return filter(sentence, WILDCARD_STAR);
|
||||||
StringPointer sp = new StringPointer(word.trim());
|
|
||||||
//计算头两个字符的hash
|
|
||||||
int hash = sp.nextTwoCharHash(0);
|
|
||||||
//计算头两个字符的mix表示(mix相同,两个字符相同)
|
|
||||||
int mix = sp.nextTwoCharMix(0);
|
|
||||||
//转为在hash桶中的位置
|
|
||||||
int index = hash & (nodes.length - 1);
|
|
||||||
SensitiveWordsNode node = nodes[index];
|
|
||||||
|
|
||||||
for (; node != null; node = node.next) {
|
|
||||||
//匹配节点
|
|
||||||
if (node.headTwoCharMix == mix) {
|
|
||||||
node.words.remove(sp);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对句子进行敏感词过滤<br/>
|
* 对句子进行敏感词过滤<br/>
|
||||||
* 如果无敏感词返回输入的sentence对象,即可以用下面的方式判断是否有敏感词:<br/><code>
|
* 如果无敏感词返回输入的sentence对象,即可以用下面的方式判断是否有敏感词:<br/>
|
||||||
* String result = filter.filter(sentence, CharacterConstant.WILDCARD_STAR);<br/>
|
|
||||||
* if(result != sentence){<br/>
|
|
||||||
* //有敏感词<br/>
|
|
||||||
* }
|
|
||||||
* </code>
|
|
||||||
*
|
*
|
||||||
* @param sentence 句子
|
* @param sentence 句子
|
||||||
* @param replace 敏感词的替换字符
|
* @param replace 敏感词的替换字符
|
||||||
@ -224,25 +150,96 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 初始化敏感词
|
* 初始化敏感词
|
||||||
*
|
|
||||||
* @param args
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
*/
|
||||||
@Override
|
public static void init(List<String> words) {
|
||||||
public void run(ApplicationArguments args) {
|
log.info("开始初始化敏感词");
|
||||||
try {
|
nodesUpdate = new SensitiveWordsNode[DEFAULT_INITIAL_CAPACITY];
|
||||||
nodes = new SensitiveWordsNode[DEFAULT_INITIAL_CAPACITY];
|
for (String word : words) {
|
||||||
//加入平台添加的敏感词
|
put(word);
|
||||||
List<SensitiveWords> list = sensitiveWordsService.list();
|
}
|
||||||
if (list != null && list.size() > 0) {
|
nodes = nodesUpdate;
|
||||||
for (SensitiveWords sensitiveWords : list) {
|
}
|
||||||
put(sensitiveWords.getSensitiveWord());
|
|
||||||
|
/**
|
||||||
|
* 增加一个敏感词,如果词的长度(trim后)小于2,则丢弃<br/>
|
||||||
|
* 此方法(构建)并不是主要的性能优化点。
|
||||||
|
*
|
||||||
|
* @param word 敏感词
|
||||||
|
* @return 操作结果
|
||||||
|
*/
|
||||||
|
public static boolean put(String word) {
|
||||||
|
|
||||||
|
//长度小于2的不加入
|
||||||
|
if (word == null || word.trim().length() < 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//两个字符的不考虑
|
||||||
|
if (word.length() == 2 && word.matches("\\w\\w")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
StringPointer sp = new StringPointer(word.trim());
|
||||||
|
//计算头两个字符的hash
|
||||||
|
int hash = sp.nextTwoCharHash(0);
|
||||||
|
//计算头两个字符的mix表示(mix相同,两个字符相同)
|
||||||
|
int mix = sp.nextTwoCharMix(0);
|
||||||
|
//转为在hash桶中的位置
|
||||||
|
int index = hash & (nodesUpdate.length - 1);
|
||||||
|
|
||||||
|
//从桶里拿第一个节点
|
||||||
|
SensitiveWordsNode node = nodesUpdate[index];
|
||||||
|
if (node == null) {
|
||||||
|
//如果没有节点,则放进去一个
|
||||||
|
node = new SensitiveWordsNode(mix);
|
||||||
|
//并添加词
|
||||||
|
node.words.add(sp);
|
||||||
|
//放入桶里
|
||||||
|
nodesUpdate[index] = node;
|
||||||
|
} else {
|
||||||
|
//如果已经有节点(1个或多个),找到正确的节点
|
||||||
|
for (; node != null; node = node.next) {
|
||||||
|
//匹配节点
|
||||||
|
if (node.headTwoCharMix == mix) {
|
||||||
|
node.words.add(sp);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//如果匹配到最后仍然不成功,则追加一个节点
|
||||||
|
if (node.next == null) {
|
||||||
|
new SensitiveWordsNode(mix, node).words.add(sp);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
}
|
||||||
log.error("初始化敏感词错误", e);
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除敏感词
|
||||||
|
*
|
||||||
|
* @param word
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static void remove(String word) {
|
||||||
|
|
||||||
|
StringPointer sp = new StringPointer(word.trim());
|
||||||
|
//计算头两个字符的hash
|
||||||
|
int hash = sp.nextTwoCharHash(0);
|
||||||
|
//计算头两个字符的mix表示(mix相同,两个字符相同)
|
||||||
|
int mix = sp.nextTwoCharMix(0);
|
||||||
|
//转为在hash桶中的位置
|
||||||
|
int index = hash & (nodes.length - 1);
|
||||||
|
SensitiveWordsNode node = nodes[index];
|
||||||
|
|
||||||
|
for (; node != null; node = node.next) {
|
||||||
|
//匹配节点
|
||||||
|
if (node.headTwoCharMix == mix) {
|
||||||
|
node.words.remove(sp);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.modules.system.utils;
|
package cn.lili.common.sensitive;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
@ -1,13 +1,14 @@
|
|||||||
package cn.lili.modules.system.utils;
|
package cn.lili.common.sensitive;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* 字符指针
|
||||||
*
|
*
|
||||||
* @author Bulbasaur
|
* @author Bulbasaur
|
||||||
* @since 2020-02-25 14:10:16
|
* @since 2020-02-25 14:10:16
|
||||||
*/
|
*/
|
||||||
public class StringPointer implements Serializable, CharSequence, Comparable<StringPointer>{
|
public class StringPointer implements Serializable, CharSequence, Comparable<StringPointer> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@ -19,13 +20,13 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
|
|||||||
|
|
||||||
private int hash = 0;
|
private int hash = 0;
|
||||||
|
|
||||||
public StringPointer(String str){
|
public StringPointer(String str) {
|
||||||
value = str.toCharArray();
|
value = str.toCharArray();
|
||||||
offset = 0;
|
offset = 0;
|
||||||
length = value.length;
|
length = value.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
public StringPointer(char[] value, int offset, int length){
|
public StringPointer(char[] value, int offset, int length) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
this.length = length;
|
this.length = length;
|
||||||
@ -34,10 +35,11 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算该位置后(包含)2个字符的hash值
|
* 计算该位置后(包含)2个字符的hash值
|
||||||
|
*
|
||||||
* @param i 从 0 到 length - 2
|
* @param i 从 0 到 length - 2
|
||||||
* @return 从 0 到 length - 2
|
* @return 从 0 到 length - 2
|
||||||
*/
|
*/
|
||||||
public int nextTwoCharHash(int i){
|
public int nextTwoCharHash(int i) {
|
||||||
return 31 * value[offset + i] + value[offset + i + 1];
|
return 31 * value[offset + i] + value[offset + i + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,7 +50,7 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
|
|||||||
* @param i 从 0 到 length - 2
|
* @param i 从 0 到 length - 2
|
||||||
* @return int值
|
* @return int值
|
||||||
*/
|
*/
|
||||||
public int nextTwoCharMix(int i){
|
public int nextTwoCharMix(int i) {
|
||||||
return (value[offset + i] << 16) | value[offset + i + 1];
|
return (value[offset + i] << 16) | value[offset + i + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,14 +61,14 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
|
|||||||
* @param word 词
|
* @param word 词
|
||||||
* @return 是否?
|
* @return 是否?
|
||||||
*/
|
*/
|
||||||
public boolean nextStartsWith(int i, StringPointer word){
|
public boolean nextStartsWith(int i, StringPointer word) {
|
||||||
//是否长度超出
|
//是否长度超出
|
||||||
if(word.length > length - i){
|
if (word.length > length - i) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//从尾开始判断
|
//从尾开始判断
|
||||||
for(int c = word.length - 1; c >= 0; c --){
|
for (int c = word.length - 1; c >= 0; c--) {
|
||||||
if(value[offset + i + c] != word.value[word.offset + c]){
|
if (value[offset + i + c] != word.value[word.offset + c]) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,27 +82,27 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
|
|||||||
* @param end 到此位置结束(不含)
|
* @param end 到此位置结束(不含)
|
||||||
* @param fillWith 以此字符填充(替换)
|
* @param fillWith 以此字符填充(替换)
|
||||||
*/
|
*/
|
||||||
public void fill(int begin, int end, char fillWith){
|
public void fill(int begin, int end, char fillWith) {
|
||||||
for(int i = begin; i < end; i ++){
|
for (int i = begin; i < end; i++) {
|
||||||
value[offset + i] = fillWith;
|
value[offset + i] = fillWith;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int length(){
|
public int length() {
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public char charAt(int i){
|
public char charAt(int i) {
|
||||||
return value[offset + i];
|
return value[offset + i];
|
||||||
}
|
}
|
||||||
|
|
||||||
public StringPointer substring(int begin){
|
public StringPointer substring(int begin) {
|
||||||
return new StringPointer(value, offset + begin, length - begin);
|
return new StringPointer(value, offset + begin, length - begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
public StringPointer substring(int begin, int end){
|
public StringPointer substring(int begin, int end) {
|
||||||
return new StringPointer(value, offset + begin, end - begin);
|
return new StringPointer(value, offset + begin, end - begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,7 +112,7 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(){
|
public String toString() {
|
||||||
return new String(value, offset, length);
|
return new String(value, offset, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,12 +134,12 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (anObject instanceof StringPointer) {
|
if (anObject instanceof StringPointer) {
|
||||||
StringPointer that = (StringPointer)anObject;
|
StringPointer that = (StringPointer) anObject;
|
||||||
if (length == that.length) {
|
if (length == that.length) {
|
||||||
char[] v1 = this.value;
|
char[] v1 = this.value;
|
||||||
char[] v2 = that.value;
|
char[] v2 = that.value;
|
||||||
for(int i = 0; i < this.length; i ++){
|
for (int i = 0; i < this.length; i++) {
|
||||||
if(v1[this.offset + i] != v2[that.offset + i]){
|
if (v1[this.offset + i] != v2[that.offset + i]) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package cn.lili.common.sensitive.init;
|
||||||
|
|
||||||
|
import cn.lili.cache.Cache;
|
||||||
|
import cn.lili.cache.CachePrefix;
|
||||||
|
import cn.lili.common.sensitive.SensitiveWordsFilter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.ApplicationArguments;
|
||||||
|
import org.springframework.boot.ApplicationRunner;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 敏感词加载
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2021-11-23 12:08
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class SensitiveWordsLoader implements ApplicationRunner {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Cache<List<String>> cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 程序启动时,获取最新的需要过滤的敏感词
|
||||||
|
* <p>
|
||||||
|
* 这里即便缓存中为空也没关系,定时任务会定时重新加载敏感词
|
||||||
|
*
|
||||||
|
* @param args 启动参数
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run(ApplicationArguments args) {
|
||||||
|
List<String> sensitives = cache.get(CachePrefix.SENSITIVE.getPrefix());
|
||||||
|
log.info("系统初始化敏感词");
|
||||||
|
if (sensitives == null || sensitives.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SensitiveWordsFilter.init(sensitives);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package cn.lili.common.sensitive.quartz;
|
||||||
|
|
||||||
|
import org.quartz.*;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时执行配置
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2021-11-23 16:30
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class QuartzConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public JobDetail sensitiveQuartzDetail() {
|
||||||
|
return JobBuilder.newJob(SensitiveQuartz.class).withIdentity("sensitiveQuartz").storeDurably().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Trigger sensitiveQuartzTrigger() {
|
||||||
|
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
|
||||||
|
.withIntervalInSeconds(3600)
|
||||||
|
.repeatForever();
|
||||||
|
return TriggerBuilder.newTrigger().forJob(sensitiveQuartzDetail())
|
||||||
|
.withIdentity("sensitiveQuartz")
|
||||||
|
.withSchedule(scheduleBuilder)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package cn.lili.common.sensitive.quartz;
|
||||||
|
|
||||||
|
import cn.lili.cache.Cache;
|
||||||
|
import cn.lili.cache.CachePrefix;
|
||||||
|
import cn.lili.common.sensitive.SensitiveWordsFilter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.quartz.JobExecutionContext;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.quartz.QuartzJobBean;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 间隔更新敏感词
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2021-11-23 16:31
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class SensitiveQuartz extends QuartzJobBean {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Cache<List<String>> cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时更新敏感词信息
|
||||||
|
*
|
||||||
|
* @param jobExecutionContext
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void executeInternal(JobExecutionContext jobExecutionContext) {
|
||||||
|
log.info("敏感词定时更新");
|
||||||
|
List<String> sensitives = cache.get(CachePrefix.SENSITIVE.getPrefix());
|
||||||
|
if (sensitives == null || sensitives.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SensitiveWordsFilter.init(sensitives);
|
||||||
|
}
|
||||||
|
}
|
@ -3,11 +3,10 @@ package cn.lili.common.utils;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.Base64.Decoder;
|
import java.util.Base64.Decoder;
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* base64转为multipartFile工具类
|
* base64转为multipartFile工具类
|
||||||
*
|
*
|
||||||
@ -55,7 +54,7 @@ public class Base64DecodeMultipartFile implements MultipartFile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getInputStream() throws IOException {
|
public InputStream getInputStream() {
|
||||||
return new ByteArrayInputStream(imgContent);
|
return new ByteArrayInputStream(imgContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,8 +65,9 @@ public class Base64DecodeMultipartFile implements MultipartFile {
|
|||||||
stream = new FileOutputStream(dest);
|
stream = new FileOutputStream(dest);
|
||||||
stream.write(imgContent);
|
stream.write(imgContent);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.error("transferTo错误",e);
|
log.error("transferTo错误", e);
|
||||||
}finally {
|
} finally {
|
||||||
|
assert stream != null;
|
||||||
stream.close();
|
stream.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,7 +94,7 @@ public class Base64DecodeMultipartFile implements MultipartFile {
|
|||||||
byte[] bytes = Base64.getDecoder().decode(base64);
|
byte[] bytes = Base64.getDecoder().decode(base64);
|
||||||
stream = new ByteArrayInputStream(bytes);
|
stream = new ByteArrayInputStream(bytes);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("base64ToInputStream错误",e);
|
log.error("base64ToInputStream错误", e);
|
||||||
}
|
}
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
@ -111,13 +111,13 @@ public class Base64DecodeMultipartFile implements MultipartFile {
|
|||||||
}
|
}
|
||||||
data = swapStream.toByteArray();
|
data = swapStream.toByteArray();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.error("转码错误",e);
|
log.error("转码错误", e);
|
||||||
} finally {
|
} finally {
|
||||||
if (in != null) {
|
if (in != null) {
|
||||||
try {
|
try {
|
||||||
in.close();
|
in.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.error("inputStreamToStream错误",e);
|
log.error("inputStreamToStream错误", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ public class BeanUtil {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取属性名数组
|
* 获取属性名数组
|
||||||
|
*
|
||||||
* @param o 获取字段的对象
|
* @param o 获取字段的对象
|
||||||
* @return 返回各个字段
|
* @return 返回各个字段
|
||||||
*/
|
*/
|
||||||
@ -49,6 +50,7 @@ public class BeanUtil {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据属性名获取属性值
|
* 根据属性名获取属性值
|
||||||
|
*
|
||||||
* @param fieldName 属性名
|
* @param fieldName 属性名
|
||||||
* @param o 对象
|
* @param o 对象
|
||||||
* @return 属性值
|
* @return 属性值
|
||||||
@ -69,6 +71,7 @@ public class BeanUtil {
|
|||||||
/**
|
/**
|
||||||
* 将对象转换为key value
|
* 将对象转换为key value
|
||||||
* A=a&B=b&C=c 格式
|
* A=a&B=b&C=c 格式
|
||||||
|
*
|
||||||
* @param object 对象
|
* @param object 对象
|
||||||
* @return 格式化结果
|
* @return 格式化结果
|
||||||
*/
|
*/
|
||||||
@ -87,6 +90,7 @@ public class BeanUtil {
|
|||||||
String key = fieldNames[j];
|
String key = fieldNames[j];
|
||||||
//获取值
|
//获取值
|
||||||
Object value = BeanUtil.getFieldValueByName(key, object);
|
Object value = BeanUtil.getFieldValueByName(key, object);
|
||||||
|
assert value != null;
|
||||||
stringBuffer.append(key).append("=").append(value.toString());
|
stringBuffer.append(key).append("=").append(value.toString());
|
||||||
}
|
}
|
||||||
return stringBuffer.toString();
|
return stringBuffer.toString();
|
||||||
@ -95,6 +99,7 @@ public class BeanUtil {
|
|||||||
/**
|
/**
|
||||||
* key value键值对 转换为 对象
|
* key value键值对 转换为 对象
|
||||||
* A=a&B=b&C=c 格式 转换为对象
|
* A=a&B=b&C=c 格式 转换为对象
|
||||||
|
*
|
||||||
* @param str 对象字符串
|
* @param str 对象字符串
|
||||||
* @param t 范型
|
* @param t 范型
|
||||||
* @param <T> 范型
|
* @param <T> 范型
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package cn.lili.common.utils;
|
package cn.lili.common.utils;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 金额计算工具
|
* 金额计算工具
|
||||||
@ -23,27 +25,29 @@ public final class CurrencyUtil {
|
|||||||
/**
|
/**
|
||||||
* 提供精确的加法运算。
|
* 提供精确的加法运算。
|
||||||
*
|
*
|
||||||
* @param v1 被加数
|
* @return 累加之和
|
||||||
* @param v2 加数
|
|
||||||
* @return 两个参数的和
|
|
||||||
*/
|
*/
|
||||||
public static Double add(double v1, double v2) {
|
public static Double add(double... params) {
|
||||||
BigDecimal b1 = new BigDecimal(v1);
|
BigDecimal result = new BigDecimal("0");
|
||||||
BigDecimal b2 = new BigDecimal(v2);
|
for (double param : params) {
|
||||||
return b1.add(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
BigDecimal bigParam = BigDecimal.valueOf(param);
|
||||||
|
result = result.add(bigParam).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
return result.doubleValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提供精确的减法运算。
|
* 提供精确的加法运算。
|
||||||
*
|
*
|
||||||
* @param v1 被减数
|
* @return 累加之和
|
||||||
* @param v2 减数
|
|
||||||
* @return 两个参数的差
|
|
||||||
*/
|
*/
|
||||||
public static double sub(double v1, double v2) {
|
public static Double sub(double... params) {
|
||||||
BigDecimal b1 = new BigDecimal(v1);
|
BigDecimal result = BigDecimal.valueOf(params[0]);
|
||||||
BigDecimal b2 = new BigDecimal(v2);
|
params = Arrays.stream(params).skip(1).toArray();
|
||||||
return b1.subtract(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
for (double param : params) {
|
||||||
|
BigDecimal bigParam = BigDecimal.valueOf(param);
|
||||||
|
result = result.subtract(bigParam).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
return result.doubleValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,9 +58,9 @@ public final class CurrencyUtil {
|
|||||||
* @return 两个参数的积
|
* @return 两个参数的积
|
||||||
*/
|
*/
|
||||||
public static Double mul(double v1, double v2) {
|
public static Double mul(double v1, double v2) {
|
||||||
BigDecimal b1 = new BigDecimal(v1);
|
BigDecimal b1 = BigDecimal.valueOf(v1);
|
||||||
BigDecimal b2 = new BigDecimal(v2);
|
BigDecimal b2 = BigDecimal.valueOf(v2);
|
||||||
return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
|
return b1.multiply(b2).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,9 +76,9 @@ public final class CurrencyUtil {
|
|||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
"The scale must be a positive integer or zero");
|
"The scale must be a positive integer or zero");
|
||||||
}
|
}
|
||||||
BigDecimal b1 = new BigDecimal(v1);
|
BigDecimal b1 = BigDecimal.valueOf(v1);
|
||||||
BigDecimal b2 = new BigDecimal(v2);
|
BigDecimal b2 = BigDecimal.valueOf(v2);
|
||||||
return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
|
return b1.multiply(b2).setScale(scale, RoundingMode.HALF_UP).doubleValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -105,26 +109,9 @@ public final class CurrencyUtil {
|
|||||||
if (v2 == 0) {
|
if (v2 == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
BigDecimal b1 = new BigDecimal(v1);
|
BigDecimal b1 = BigDecimal.valueOf(v1);
|
||||||
BigDecimal b2 = new BigDecimal(v2);
|
BigDecimal b2 = BigDecimal.valueOf(v2);
|
||||||
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
|
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 提供精确的小数位四舍五入处理。
|
|
||||||
*
|
|
||||||
* @param v 需要四舍五入的数字
|
|
||||||
* @param scale 小数点后保留几位
|
|
||||||
* @return 四舍五入后的结果
|
|
||||||
*/
|
|
||||||
public static double round(double v, int scale) {
|
|
||||||
if (scale < 0) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"The scale must be a positive integer or zero");
|
|
||||||
}
|
|
||||||
BigDecimal b = new BigDecimal(v);
|
|
||||||
BigDecimal one = new BigDecimal("1");
|
|
||||||
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -145,7 +132,6 @@ public final class CurrencyUtil {
|
|||||||
* @return double类型分
|
* @return double类型分
|
||||||
*/
|
*/
|
||||||
public static double reversalFen(Double money) {
|
public static double reversalFen(Double money) {
|
||||||
double price = div(money, 100);
|
return div(money, 100);
|
||||||
return price;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -273,7 +273,7 @@ public class DateUtil {
|
|||||||
* @return 时间戳
|
* @return 时间戳
|
||||||
*/
|
*/
|
||||||
public static long getDateline(String date) {
|
public static long getDateline(String date) {
|
||||||
return toDate(date, STANDARD_DATE_FORMAT).getTime() / 1000;
|
return Objects.requireNonNull(toDate(date, STANDARD_DATE_FORMAT)).getTime() / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -311,7 +311,7 @@ public class DateUtil {
|
|||||||
* @return 时间戳
|
* @return 时间戳
|
||||||
*/
|
*/
|
||||||
public static long getDateline(String date, String pattern) {
|
public static long getDateline(String date, String pattern) {
|
||||||
return toDate(date, pattern).getTime() / 1000;
|
return Objects.requireNonNull(toDate(date, pattern)).getTime() / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,19 +1,25 @@
|
|||||||
package cn.lili.common.utils;
|
package cn.lili.common.utils;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.xkcoding.http.HttpUtil;
|
import com.xkcoding.http.HttpUtil;
|
||||||
import com.xkcoding.http.config.HttpConfig;
|
import com.xkcoding.http.config.HttpConfig;
|
||||||
import com.xkcoding.http.support.HttpHeader;
|
import com.xkcoding.http.support.HttpHeader;
|
||||||
import com.xkcoding.http.support.httpclient.HttpClientImpl;
|
import com.xkcoding.http.support.httpclient.HttpClientImpl;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HttpUtil 工具,统一处理 http 请求,方便对 simple-http 做定制
|
* HTTP 工具类
|
||||||
*
|
* @author liushuai
|
||||||
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
|
|
||||||
* @version 4.1
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
public class HttpUtils {
|
public class HttpUtils {
|
||||||
|
|
||||||
public HttpUtils(HttpConfig config) {
|
public HttpUtils(HttpConfig config) {
|
||||||
@ -105,4 +111,258 @@ public class HttpUtils {
|
|||||||
public String post(String url, Map<String, String> params, HttpHeader header, boolean encode) {
|
public String post(String url, Map<String, String> params, HttpHeader header, boolean encode) {
|
||||||
return HttpUtil.post(url, params, header, encode);
|
return HttpUtil.post(url, params, header, encode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 静态方法运行参数
|
||||||
|
*/
|
||||||
|
public static final int HTTP_CONN_TIMEOUT = 100000;
|
||||||
|
public static final int HTTP_SOCKET_TIMEOUT = 100000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST 静态方法请求
|
||||||
|
*
|
||||||
|
* @param reqUrl
|
||||||
|
* @param parameters
|
||||||
|
* @param encoding
|
||||||
|
* @param connectTimeout
|
||||||
|
* @param readTimeout
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String doPost(String reqUrl, Map<String, String> parameters, String encoding, int connectTimeout,
|
||||||
|
int readTimeout) {
|
||||||
|
HttpURLConnection urlConn = null;
|
||||||
|
try {
|
||||||
|
urlConn = sendPost(reqUrl, parameters, encoding, connectTimeout, readTimeout);
|
||||||
|
String responseContent = getContent(urlConn, encoding);
|
||||||
|
return responseContent.trim();
|
||||||
|
} finally {
|
||||||
|
if (urlConn != null) {
|
||||||
|
urlConn.disconnect();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* post携带json请求 静态方法
|
||||||
|
*
|
||||||
|
* @param reqUrl 请求地址
|
||||||
|
* @param jsonParameters 参数
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String doPostWithJson(String reqUrl, Map<String, String> jsonParameters) {
|
||||||
|
|
||||||
|
BufferedReader reader = null;
|
||||||
|
try {
|
||||||
|
//创建连接
|
||||||
|
URL url = new URL(reqUrl);
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
connection.setDoOutput(true);
|
||||||
|
connection.setDoInput(true);
|
||||||
|
connection.setUseCaches(false);
|
||||||
|
connection.setInstanceFollowRedirects(true);
|
||||||
|
//设置请求方式
|
||||||
|
connection.setRequestMethod("POST");
|
||||||
|
//设置发送数据的格式
|
||||||
|
connection.setRequestProperty("Content-Type", "application/json");
|
||||||
|
connection.connect();
|
||||||
|
//一定要用BufferedReader 来接收响应, 使用字节来接收响应的方法是接收不到内容的
|
||||||
|
//utf-8编码
|
||||||
|
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8);
|
||||||
|
out.append(JSONObject.toJSONString(jsonParameters));
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
//读取响应
|
||||||
|
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
|
||||||
|
String line;
|
||||||
|
String res = "";
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
res += line;
|
||||||
|
}
|
||||||
|
reader.close();
|
||||||
|
|
||||||
|
return res;
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("post请求错误", e);
|
||||||
|
}
|
||||||
|
//自定义错误信息
|
||||||
|
return "error";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* post携带json请求 静态方法
|
||||||
|
*
|
||||||
|
* @param reqUrl 请求地址
|
||||||
|
* @param object 对象
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String doPostWithJson(String reqUrl, Object object) {
|
||||||
|
|
||||||
|
BufferedReader reader = null;
|
||||||
|
try {
|
||||||
|
//创建连接
|
||||||
|
URL url = new URL(reqUrl);
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
connection.setDoOutput(true);
|
||||||
|
connection.setDoInput(true);
|
||||||
|
connection.setUseCaches(false);
|
||||||
|
connection.setInstanceFollowRedirects(true);
|
||||||
|
//设置请求方式
|
||||||
|
connection.setRequestMethod("POST");
|
||||||
|
//设置发送数据的格式
|
||||||
|
connection.setRequestProperty("Content-Type", "application/json");
|
||||||
|
connection.connect();
|
||||||
|
//一定要用BufferedReader 来接收响应, 使用字节来接收响应的方法是接收不到内容的
|
||||||
|
//utf-8编码
|
||||||
|
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8);
|
||||||
|
out.append(JSONObject.toJSONString(object));
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
//读取响应
|
||||||
|
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
|
||||||
|
String line;
|
||||||
|
String res = "";
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
res += line;
|
||||||
|
}
|
||||||
|
reader.close();
|
||||||
|
|
||||||
|
return res;
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("post错误", e);
|
||||||
|
}
|
||||||
|
//自定义错误信息
|
||||||
|
return "error";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送post请求
|
||||||
|
*
|
||||||
|
* @param reqUrl
|
||||||
|
* @param parameters
|
||||||
|
* @param encoding
|
||||||
|
* @param connectTimeout
|
||||||
|
* @param readTimeout
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static HttpURLConnection sendPost(String reqUrl,
|
||||||
|
Map<String, String> parameters, String encoding, int connectTimeout, int readTimeout) {
|
||||||
|
HttpURLConnection urlConn = null;
|
||||||
|
try {
|
||||||
|
String params = generatorParamString(parameters, encoding);
|
||||||
|
URL url = new URL(reqUrl);
|
||||||
|
urlConn = (HttpURLConnection) url.openConnection();
|
||||||
|
urlConn.setRequestMethod("POST");
|
||||||
|
//(单位:毫秒)jdk
|
||||||
|
urlConn.setConnectTimeout(connectTimeout);
|
||||||
|
//(单位:毫秒)jdk 1.5换成这个,读操作超时
|
||||||
|
urlConn.setReadTimeout(readTimeout);
|
||||||
|
urlConn.setDoOutput(true);
|
||||||
|
//String按照字节处理是一个好方法
|
||||||
|
byte[] b = params.getBytes(encoding);
|
||||||
|
urlConn.getOutputStream().write(b, 0, b.length);
|
||||||
|
urlConn.getOutputStream().flush();
|
||||||
|
urlConn.getOutputStream().close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
return urlConn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get 请求 静态方法
|
||||||
|
*
|
||||||
|
* @param urlConn
|
||||||
|
* @param encoding
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String getContent(HttpURLConnection urlConn, String encoding) {
|
||||||
|
try {
|
||||||
|
String responseContent = null;
|
||||||
|
InputStream in = urlConn.getInputStream();
|
||||||
|
BufferedReader rd = new BufferedReader(new InputStreamReader(in, encoding));
|
||||||
|
String tempLine = rd.readLine();
|
||||||
|
StringBuffer tempStr = new StringBuffer();
|
||||||
|
String crlf = System.getProperty("line.separator");
|
||||||
|
while (tempLine != null) {
|
||||||
|
tempStr.append(tempLine);
|
||||||
|
tempStr.append(crlf);
|
||||||
|
tempLine = rd.readLine();
|
||||||
|
}
|
||||||
|
responseContent = tempStr.toString();
|
||||||
|
rd.close();
|
||||||
|
in.close();
|
||||||
|
return responseContent;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get 请求 静态方法
|
||||||
|
*
|
||||||
|
* @param link
|
||||||
|
* @param encoding
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String doGet(String link, String encoding, int connectTimeout, int readTimeout) {
|
||||||
|
HttpURLConnection conn = null;
|
||||||
|
try {
|
||||||
|
URL url = new URL(link);
|
||||||
|
conn = (HttpURLConnection) url.openConnection();
|
||||||
|
conn.setRequestMethod("GET");
|
||||||
|
conn.setConnectTimeout(connectTimeout);
|
||||||
|
conn.setReadTimeout(readTimeout);
|
||||||
|
BufferedInputStream in = new BufferedInputStream(
|
||||||
|
conn.getInputStream());
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
byte[] buf = new byte[1024];
|
||||||
|
for (int i = 0; (i = in.read(buf)) > 0; ) {
|
||||||
|
out.write(buf, 0, i);
|
||||||
|
}
|
||||||
|
out.flush();
|
||||||
|
String s = out.toString(encoding);
|
||||||
|
return s;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e.getMessage(), e);
|
||||||
|
} finally {
|
||||||
|
if (conn != null) {
|
||||||
|
conn.disconnect();
|
||||||
|
conn = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将parameters中数据转换成用"&"链接的http请求参数形式
|
||||||
|
*
|
||||||
|
* @param parameters
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String generatorParamString(Map<String, String> parameters, String encoding) {
|
||||||
|
StringBuffer params = new StringBuffer();
|
||||||
|
if (parameters != null) {
|
||||||
|
for (Iterator<String> iter = parameters.keySet().iterator(); iter
|
||||||
|
.hasNext(); ) {
|
||||||
|
String name = iter.next();
|
||||||
|
String value = parameters.get(name);
|
||||||
|
params.append(name + "=");
|
||||||
|
try {
|
||||||
|
params.append(URLEncoder.encode(value, encoding));
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new RuntimeException(e.getMessage(), e);
|
||||||
|
} catch (Exception e) {
|
||||||
|
String message = String.format("'%s'='%s'", name, value);
|
||||||
|
throw new RuntimeException(message, e);
|
||||||
|
}
|
||||||
|
if (iter.hasNext()) {
|
||||||
|
params.append("&");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return params.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package cn.lili.modules.connect.util;
|
package cn.lili.common.utils;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
@ -1,5 +1,6 @@
|
|||||||
package cn.lili.common.vo;
|
package cn.lili.common.vo;
|
||||||
|
|
||||||
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.lili.common.utils.StringUtils;
|
import cn.lili.common.utils.StringUtils;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -31,17 +32,8 @@ public class PageVO implements Serializable {
|
|||||||
@ApiModelProperty(value = "需要驼峰转换蛇形", notes = "一般不做处理,如果数据库中就是蛇形,则这块需要处理。")
|
@ApiModelProperty(value = "需要驼峰转换蛇形", notes = "一般不做处理,如果数据库中就是蛇形,则这块需要处理。")
|
||||||
private Boolean notConvert;
|
private Boolean notConvert;
|
||||||
|
|
||||||
public Integer getMongoPageNumber() {
|
|
||||||
int i = pageNumber - 1;
|
|
||||||
if (i < 0) {
|
|
||||||
return pageNumber;
|
|
||||||
} else {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSort() {
|
public String getSort() {
|
||||||
if (!StringUtils.isEmpty(sort)) {
|
if (CharSequenceUtil.isNotEmpty(sort)) {
|
||||||
if (notConvert == null || Boolean.FALSE.equals(notConvert)) {
|
if (notConvert == null || Boolean.FALSE.equals(notConvert)) {
|
||||||
return StringUtils.camel2Underline(sort);
|
return StringUtils.camel2Underline(sort);
|
||||||
} else {
|
} else {
|
||||||
|
@ -31,8 +31,7 @@ public class SearchVO implements Serializable {
|
|||||||
if (StringUtils.isEmpty(startDate)) {
|
if (StringUtils.isEmpty(startDate)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Date date = DateUtil.toDate(startDate, DateUtil.STANDARD_DATE_FORMAT);
|
return DateUtil.toDate(startDate, DateUtil.STANDARD_DATE_FORMAT);
|
||||||
return date;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Date getConvertEndDate() {
|
public Date getConvertEndDate() {
|
||||||
|
@ -244,7 +244,7 @@ public abstract class BaseElasticsearchService {
|
|||||||
" }\n" +
|
" }\n" +
|
||||||
" }\n" +
|
" }\n" +
|
||||||
" },\n" +
|
" },\n" +
|
||||||
" \"isAuth\": {\n" +
|
" \"authFlag\": {\n" +
|
||||||
" \"type\": \"text\",\n" +
|
" \"type\": \"text\",\n" +
|
||||||
" \"fields\": {\n" +
|
" \"fields\": {\n" +
|
||||||
" \"keyword\": {\n" +
|
" \"keyword\": {\n" +
|
||||||
@ -331,6 +331,9 @@ public abstract class BaseElasticsearchService {
|
|||||||
" }\n" +
|
" }\n" +
|
||||||
" }\n" +
|
" }\n" +
|
||||||
" },\n" +
|
" },\n" +
|
||||||
|
" \"promotionMapJson\": {\n" +
|
||||||
|
" \"type\": \"text\"\n" +
|
||||||
|
" },\n" +
|
||||||
" \"thumbnail\": {\n" +
|
" \"thumbnail\": {\n" +
|
||||||
" \"type\": \"text\",\n" +
|
" \"type\": \"text\",\n" +
|
||||||
" \"fields\": {\n" +
|
" \"fields\": {\n" +
|
||||||
|
@ -13,4 +13,9 @@ public class EsSuffix {
|
|||||||
*/
|
*/
|
||||||
public static final String GOODS_INDEX_NAME = "goods";
|
public static final String GOODS_INDEX_NAME = "goods";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志索引后缀
|
||||||
|
*/
|
||||||
|
public static final String LOGS_INDEX_NAME = "logs";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
|
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
|
||||||
|
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
|
||||||
|
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -56,18 +57,23 @@ public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
|
|||||||
.setDefaultCredentialsProvider(credential)
|
.setDefaultCredentialsProvider(credential)
|
||||||
.setKeepAliveStrategy(getConnectionKeepAliveStrategy())
|
.setKeepAliveStrategy(getConnectionKeepAliveStrategy())
|
||||||
.setMaxConnPerRoute(10)
|
.setMaxConnPerRoute(10)
|
||||||
.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(1).build()));
|
.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(Runtime.getRuntime().availableProcessors()).build()));
|
||||||
}
|
}
|
||||||
|
|
||||||
restBuilder.setRequestConfigCallback(requestConfigBuilder ->
|
restBuilder.setRequestConfigCallback(requestConfigBuilder ->
|
||||||
requestConfigBuilder.setConnectTimeout(1000) //time until a connection with the server is established.
|
requestConfigBuilder.setConnectTimeout(1000) //time until a connection with the server is established.
|
||||||
.setSocketTimeout(12 * 1000) //time of inactivity to wait for packets[data] to receive.
|
.setSocketTimeout(12 * 1000) //time of inactivity to wait for packets[data] to receive.
|
||||||
.setConnectionRequestTimeout(2 * 1000)); //time to fetch a connection from the connection pool 0 for infinite.
|
.setConnectionRequestTimeout(-1)); //time to fetch a connection from the connection pool 0 for infinite.
|
||||||
|
|
||||||
client = new RestHighLevelClient(restBuilder);
|
client = new RestHighLevelClient(restBuilder);
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean("elasticsearchRestTemplate")
|
||||||
|
public ElasticsearchRestTemplate elasticsearchRestTemplate() {
|
||||||
|
return new ElasticsearchRestTemplate(this.client);
|
||||||
|
}
|
||||||
|
|
||||||
private HttpHost[] getHttpHosts() {
|
private HttpHost[] getHttpHosts() {
|
||||||
List<String> clusterNodes = elasticsearchProperties.getClusterNodes();
|
List<String> clusterNodes = elasticsearchProperties.getClusterNodes();
|
||||||
HttpHost[] httpHosts = new HttpHost[clusterNodes.size()];
|
HttpHost[] httpHosts = new HttpHost[clusterNodes.size()];
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package cn.lili.modules.connect.request;
|
package cn.lili.modules.connect.request;
|
||||||
|
|
||||||
import cn.lili.cache.Cache;
|
import cn.lili.cache.Cache;
|
||||||
|
import cn.lili.common.utils.HttpUtils;
|
||||||
import cn.lili.common.utils.StringUtils;
|
import cn.lili.common.utils.StringUtils;
|
||||||
import cn.lili.common.utils.UrlBuilder;
|
import cn.lili.common.utils.UrlBuilder;
|
||||||
|
import cn.lili.common.utils.UuidUtils;
|
||||||
import cn.lili.modules.connect.config.AuthConfig;
|
import cn.lili.modules.connect.config.AuthConfig;
|
||||||
import cn.lili.modules.connect.config.ConnectAuth;
|
import cn.lili.modules.connect.config.ConnectAuth;
|
||||||
import cn.lili.modules.connect.entity.dto.AuthCallback;
|
import cn.lili.modules.connect.entity.dto.AuthCallback;
|
||||||
@ -12,8 +14,6 @@ import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
|
|||||||
import cn.lili.modules.connect.entity.enums.AuthResponseStatus;
|
import cn.lili.modules.connect.entity.enums.AuthResponseStatus;
|
||||||
import cn.lili.modules.connect.exception.AuthException;
|
import cn.lili.modules.connect.exception.AuthException;
|
||||||
import cn.lili.modules.connect.util.AuthChecker;
|
import cn.lili.modules.connect.util.AuthChecker;
|
||||||
import cn.lili.common.utils.HttpUtils;
|
|
||||||
import cn.lili.modules.connect.util.UuidUtils;
|
|
||||||
import com.xkcoding.http.util.UrlUtil;
|
import com.xkcoding.http.util.UrlUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import cn.lili.common.security.token.Token;
|
|||||||
import cn.lili.modules.connect.entity.Connect;
|
import cn.lili.modules.connect.entity.Connect;
|
||||||
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
|
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
|
||||||
import cn.lili.modules.connect.entity.dto.WechatMPLoginParams;
|
import cn.lili.modules.connect.entity.dto.WechatMPLoginParams;
|
||||||
|
import cn.lili.modules.member.entity.dto.ConnectQueryDTO;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
import javax.naming.NoPermissionException;
|
import javax.naming.NoPermissionException;
|
||||||
@ -103,4 +104,12 @@ public interface ConnectService extends IService<Connect> {
|
|||||||
* @return token
|
* @return token
|
||||||
*/
|
*/
|
||||||
Token miniProgramAutoLogin(WechatMPLoginParams params);
|
Token miniProgramAutoLogin(WechatMPLoginParams params);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据查询dto获取查询对象
|
||||||
|
*
|
||||||
|
* @param connectQueryDTO
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Connect queryConnect(ConnectQueryDTO connectQueryDTO);
|
||||||
}
|
}
|
@ -12,6 +12,7 @@ import cn.lili.common.security.AuthUser;
|
|||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.security.token.Token;
|
import cn.lili.common.security.token.Token;
|
||||||
import cn.lili.common.utils.CookieUtil;
|
import cn.lili.common.utils.CookieUtil;
|
||||||
|
import cn.lili.common.utils.HttpUtils;
|
||||||
import cn.lili.common.utils.StringUtils;
|
import cn.lili.common.utils.StringUtils;
|
||||||
import cn.lili.modules.connect.entity.Connect;
|
import cn.lili.modules.connect.entity.Connect;
|
||||||
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
|
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
|
||||||
@ -20,6 +21,7 @@ import cn.lili.modules.connect.entity.enums.ConnectEnum;
|
|||||||
import cn.lili.modules.connect.mapper.ConnectMapper;
|
import cn.lili.modules.connect.mapper.ConnectMapper;
|
||||||
import cn.lili.modules.connect.service.ConnectService;
|
import cn.lili.modules.connect.service.ConnectService;
|
||||||
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
|
import cn.lili.modules.member.entity.dto.ConnectQueryDTO;
|
||||||
import cn.lili.modules.member.service.MemberService;
|
import cn.lili.modules.member.service.MemberService;
|
||||||
import cn.lili.modules.member.token.MemberTokenGenerate;
|
import cn.lili.modules.member.token.MemberTokenGenerate;
|
||||||
import cn.lili.modules.system.entity.dos.Setting;
|
import cn.lili.modules.system.entity.dos.Setting;
|
||||||
@ -27,7 +29,6 @@ import cn.lili.modules.system.entity.dto.connect.WechatConnectSetting;
|
|||||||
import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem;
|
import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem;
|
||||||
import cn.lili.modules.system.entity.enums.SettingEnum;
|
import cn.lili.modules.system.entity.enums.SettingEnum;
|
||||||
import cn.lili.modules.system.service.SettingService;
|
import cn.lili.modules.system.service.SettingService;
|
||||||
import cn.lili.modules.system.utils.HttpUtils;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -232,6 +233,16 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
|
|||||||
return memberTokenGenerate.createToken(newMember.getUsername(), true);
|
return memberTokenGenerate.createToken(newMember.getUsername(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Connect queryConnect(ConnectQueryDTO connectQueryDTO) {
|
||||||
|
|
||||||
|
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(StringUtils.isNotEmpty(connectQueryDTO.getUserId()), Connect::getUserId, connectQueryDTO.getUserId())
|
||||||
|
.eq(StringUtils.isNotEmpty(connectQueryDTO.getUnionType()), Connect::getUnionType, connectQueryDTO.getUnionType())
|
||||||
|
.eq(StringUtils.isNotEmpty(connectQueryDTO.getUnionId()), Connect::getUnionId, connectQueryDTO.getUnionId());
|
||||||
|
return this.getOne(queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 会员绑定 绑定微信小程序
|
* 会员绑定 绑定微信小程序
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package cn.lili.modules.distribution.entity.dos;
|
package cn.lili.modules.distribution.entity.dos;
|
||||||
|
|
||||||
import cn.lili.modules.member.entity.enums.WithdrawStatusEnum;
|
import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum;
|
||||||
import cn.lili.mybatis.BaseEntity;
|
import cn.lili.mybatis.BaseEntity;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
@ -5,7 +5,6 @@ import cn.lili.modules.order.order.entity.dos.StoreFlow;
|
|||||||
import cn.lili.mybatis.BaseIdEntity;
|
import cn.lili.mybatis.BaseIdEntity;
|
||||||
import com.baomidou.mybatisplus.annotation.FieldFill;
|
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
@ -31,11 +30,6 @@ public class DistributionOrder extends BaseIdEntity {
|
|||||||
|
|
||||||
private static final long serialVersionUID = 501799944909496507L;
|
private static final long serialVersionUID = 501799944909496507L;
|
||||||
|
|
||||||
@TableId
|
|
||||||
@TableField
|
|
||||||
@ApiModelProperty(value = "唯一标识", hidden = true)
|
|
||||||
private String id;
|
|
||||||
|
|
||||||
@CreatedDate
|
@CreatedDate
|
||||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package cn.lili.modules.distribution.entity.dto;
|
package cn.lili.modules.distribution.entity.dto;
|
||||||
|
|
||||||
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.utils.StringUtils;
|
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分销员商品查询条件
|
* 分销员商品查询条件
|
||||||
@ -13,25 +16,35 @@ import lombok.Data;
|
|||||||
* @author pikachu
|
* @author pikachu
|
||||||
* @since 2020-03-14 23:04:56
|
* @since 2020-03-14 23:04:56
|
||||||
*/
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Data
|
@Data
|
||||||
public class DistributionGoodsSearchParams extends PageVO {
|
public class DistributionGoodsSearchParams extends PageVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "商品ID")
|
||||||
|
private String goodsId;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品名称")
|
@ApiModelProperty(value = "商品名称")
|
||||||
private String goodsName;
|
private String goodsName;
|
||||||
|
|
||||||
@ApiModelProperty(value = "是否已选择")
|
@ApiModelProperty(value = "是否已选择")
|
||||||
private boolean isChecked;
|
private boolean isChecked;
|
||||||
|
|
||||||
|
public <T> QueryWrapper<T> queryWrapper() {
|
||||||
|
QueryWrapper<T> queryWrapper = this.distributionQueryWrapper();
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(goodsId), "goods_id", goodsId);
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(goodsName), "goods_name", goodsId);
|
||||||
|
return queryWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
public <T> QueryWrapper<T> storeQueryWrapper() {
|
public <T> QueryWrapper<T> storeQueryWrapper() {
|
||||||
QueryWrapper<T> queryWrapper = this.distributionQueryWrapper();
|
QueryWrapper<T> queryWrapper = this.distributionQueryWrapper();
|
||||||
queryWrapper.eq("dg.store_id", UserContext.getCurrentUser().getStoreId());
|
queryWrapper.eq("dg.store_id", Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId());
|
||||||
return queryWrapper;
|
return queryWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> QueryWrapper<T> distributionQueryWrapper() {
|
public <T> QueryWrapper<T> distributionQueryWrapper() {
|
||||||
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.like(StringUtils.isNotEmpty(goodsName), "dg.goods_name", goodsName);
|
queryWrapper.like(CharSequenceUtil.isNotEmpty(goodsName), "dg.goods_name", goodsName);
|
||||||
return queryWrapper;
|
return queryWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user