merge branch "master"

This commit is contained in:
paulGao
2021-12-11 17:45:25 +08:00
345 changed files with 3529 additions and 2779 deletions

View File

@@ -26,6 +26,12 @@
</exclusion>
</exclusions>
</dependency>
<!--定时任务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
@@ -80,11 +86,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- &lt;!&ndash; Websocket &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-websocket</artifactId>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; Websocket &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-websocket</artifactId>-->
<!-- </dependency>-->
<!-- MybatisPlus -->
<dependency>
<groupId>com.baomidou</groupId>
@@ -271,11 +277,11 @@
<artifactId>logstash-logback-encoder</artifactId>
<version>${logstash-logback-encoder}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>javax.interceptor</groupId>-->
<!-- <artifactId>javax.interceptor-api</artifactId>-->
<!-- <version>${interceptor-api}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>javax.interceptor</groupId>-->
<!-- <artifactId>javax.interceptor-api</artifactId>-->
<!-- <version>${interceptor-api}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>

View File

@@ -480,7 +480,11 @@ public enum CachePrefix {
/**
* 订单暂时缓存
*/
ORDER;
ORDER,
/**
* 敏感词
*/
SENSITIVE;
public static String removePrefix(String str) {

View File

@@ -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);
}
}

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.system.aspect.annotation;
package cn.lili.common.aop.annotation;
import java.lang.annotation.*;

View File

@@ -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.exception.ServiceException;
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.Before;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -210,6 +210,7 @@ public enum ResultCode {
AFTER_STATUS_ERROR(33006, "售后状态错误,请刷新页面"),
RETURN_MONEY_OFFLINE_BANK_ERROR(33007, "当账号类型为银行转账时,银行信息不能为空"),
AFTER_SALES_PRICE_ERROR(33004, "申请退款金额错误"),
AFTER_GOODS_NUMBER_ERROR(33008, "申请售后商品数量错误"),
/**
* 投诉

View File

@@ -1,8 +1,7 @@
package cn.lili.modules.system.utils;
package cn.lili.common.security;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.BeanUtil;

View File

@@ -4,6 +4,7 @@ package cn.lili.common.security.filter;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.owasp.html.Sanitizers;
import javax.servlet.ReadListener;
@@ -27,6 +28,7 @@ import java.util.Map;
* @version v1.0
* 2021-06-04 10:39
*/
@Slf4j
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
@@ -35,7 +37,20 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
*
* @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",
"privateKey",
"wechatpay",
};
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
@@ -128,45 +143,72 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
*/
@Override
public ServletInputStream getInputStream() throws IOException {
//获取输入流
ServletInputStream in = super.getInputStream();
//用于存储输入流
StringBuilder body = new StringBuilder();
InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(reader);
//按行读取输入流
String line = bufferedReader.readLine();
while (line != null) {
//将获取到的第一行数据append到StringBuffer中
body.append(line);
//继续读取下一行流直到line为空
line = bufferedReader.readLine();
}
//关闭流
bufferedReader.close();
reader.close();
in.close();
if (CharSequenceUtil.isNotEmpty(body) && Boolean.TRUE.equals(JSONUtil.isJsonObj(body.toString()))) {
//将body转换为map
Map<String, Object> map = JSONUtil.parseObj(body.toString());
//创建空的map用于存储结果
Map<String, Object> resultMap = new HashMap<>(map.size());
//遍历数组
for (Map.Entry<String, Object> entry : map.entrySet()) {
//如果map.get(key)获取到的是字符串就需要进行处理如果不是直接存储resultMap
if (map.get(entry.getKey()) instanceof String) {
resultMap.put(entry.getKey(), filterXss(entry.getKey(), entry.getValue().toString()));
} else {
resultMap.put(entry.getKey(), entry.getValue());
BufferedReader bufferedReader = null;
InputStreamReader reader = null;
//获取输入流
ServletInputStream in = null;
try {
in = super.getInputStream();
//用于存储输入流
StringBuilder body = new StringBuilder();
reader = new InputStreamReader(in, StandardCharsets.UTF_8);
bufferedReader = new BufferedReader(reader);
//按行读取输入流
String line = bufferedReader.readLine();
while (line != null) {
//将获取到的第一行数据append到StringBuffer中
body.append(line);
//继续读取下一行流直到line为空
line = bufferedReader.readLine();
}
if (CharSequenceUtil.isNotEmpty(body) && Boolean.TRUE.equals(JSONUtil.isJsonObj(body.toString()))) {
//将body转换为map
Map<String, Object> map = JSONUtil.parseObj(body.toString());
//创建空的map用于存储结果
Map<String, Object> resultMap = new HashMap<>(map.size());
//遍历数组
for (Map.Entry<String, Object> entry : map.entrySet()) {
//如果map.get(key)获取到的是字符串就需要进行处理如果不是直接存储resultMap
if (map.get(entry.getKey()) instanceof String) {
resultMap.put(entry.getKey(), filterXss(entry.getKey(), entry.getValue().toString()));
} else {
resultMap.put(entry.getKey(), entry.getValue());
}
}
//将resultMap转换为json字符串
String resultStr = JSONUtil.toJsonStr(resultMap);
//将json字符串转换为字节
final ByteArrayInputStream resultBIS = new ByteArrayInputStream(resultStr.getBytes());
//实现接口
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() {
return resultBIS.read();
}
};
}
//将resultMap转换为json字符串
String resultStr = JSONUtil.toJsonStr(resultMap);
//将json字符串转换为字节
final ByteArrayInputStream resultBIS = new ByteArrayInputStream(resultStr.getBytes());
final ByteArrayInputStream bis = new ByteArrayInputStream(body.toString().getBytes());
//实现接口
return new ServletInputStream() {
@Override
@@ -181,41 +223,31 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() {
return resultBIS.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();
}
}
//将json字符串转换为字节
final ByteArrayInputStream bis = new ByteArrayInputStream(body.toString().getBytes());
//实现接口
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() {
return bis.read();
}
};
}
private String cleanXSS(String value) {

View File

@@ -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 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.util.List;
@@ -21,9 +15,12 @@ import java.util.NavigableSet;
* 2020-02-25 14:10:16
*/
@Slf4j
@Component
public class SensitiveWordsFilter implements Serializable, ApplicationRunner {
public class SensitiveWordsFilter implements Serializable {
/**
* 字符*
*/
public final static char WILDCARD_STAR = '*';
/**
* 为2的n次方考虑到敏感词大概在10k左右
@@ -37,98 +34,27 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner {
* 类似HashMap的桶比较稀疏
* 使用2个字符的hash定位
*/
protected static SensitiveWordsNode[] nodes;
@Autowired
private SensitiveWordsService sensitiveWordsService;
protected static SensitiveWordsNode[] nodes = new SensitiveWordsNode[0];
/**
* 增加一个敏感词如果词的长度trim后小于2则丢弃<br/>
* 此方法构建并不是主要的性能优化点
*
* @param word 敏感词
* @return 操作结果
* 更新中的nodes用于防止动态更新时原有nodes被清空导致无法正常写入过滤词
*/
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
*/
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);
}
}
public static String filter(String sentence) {
return filter(sentence, WILDCARD_STAR);
}
/**
* 对句子进行敏感词过滤<br/>
* 如果无敏感词返回输入的sentence对象即可以用下面的方式判断是否有敏感词<br/><code>
* String result = filter.filter(sentence, CharacterConstant.WILDCARD_STAR);<br/>
* if(result != sentence){<br/>
* &nbsp;&nbsp;//有敏感词<br/>
* }
* </code>
* 如果无敏感词返回输入的sentence对象即可以用下面的方式判断是否有敏感词<br/>
*
* @param sentence 句子
* @param replace 敏感词的替换字符
@@ -224,25 +150,96 @@ public class SensitiveWordsFilter implements Serializable, ApplicationRunner {
}
}
/**
* 初始化敏感词
*
* @param args
* @throws Exception
*/
@Override
public void run(ApplicationArguments args) {
try {
nodes = new SensitiveWordsNode[DEFAULT_INITIAL_CAPACITY];
//加入平台添加的敏感词
List<SensitiveWords> list = sensitiveWordsService.list();
if (list != null && list.size() > 0) {
for (SensitiveWords sensitiveWords : list) {
put(sensitiveWords.getSensitiveWord());
public static void init(List<String> words) {
log.info("开始初始化敏感词");
nodesUpdate = new SensitiveWordsNode[DEFAULT_INITIAL_CAPACITY];
for (String word : words) {
put(word);
}
nodes = nodesUpdate;
}
/**
* 增加一个敏感词如果词的长度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);
}
}
}
}

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.system.utils;
package cn.lili.common.sensitive;
import java.io.Serializable;
import java.util.TreeSet;

View File

@@ -1,13 +1,14 @@
package cn.lili.modules.system.utils;
package cn.lili.common.sensitive;
import java.io.Serializable;
/**
* 字符指针
*
* @author Bulbasaur
* @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;
@@ -19,13 +20,13 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
private int hash = 0;
public StringPointer(String str){
public StringPointer(String str) {
value = str.toCharArray();
offset = 0;
length = value.length;
}
public StringPointer(char[] value, int offset, int length){
public StringPointer(char[] value, int offset, int length) {
this.value = value;
this.offset = offset;
this.length = length;
@@ -34,10 +35,11 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
/**
* 计算该位置后包含2个字符的hash值
*
* @param i 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];
}
@@ -48,25 +50,25 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
* @param i 0 length - 2
* @return int值
*/
public int nextTwoCharMix(int i){
public int nextTwoCharMix(int i) {
return (value[offset + i] << 16) | value[offset + i + 1];
}
/**
* 该位置后包含的字符串是否以某个词word开头
*
* @param i 0 length - 2
* @param i 0 length - 2
* @param word
* @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;
}
//从尾开始判断
for(int c = word.length - 1; c >= 0; c --){
if(value[offset + i + c] != word.value[word.offset + c]){
for (int c = word.length - 1; c >= 0; c--) {
if (value[offset + i + c] != word.value[word.offset + c]) {
return false;
}
}
@@ -76,31 +78,31 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
/**
* 填充替换
*
* @param begin 从此位置开始
* @param end 到此位置结束不含
* @param begin 从此位置开始
* @param end 到此位置结束不含
* @param fillWith 以此字符填充替换
*/
public void fill(int begin, int end, char fillWith){
for(int i = begin; i < end; i ++){
public void fill(int begin, int end, char fillWith) {
for (int i = begin; i < end; i++) {
value[offset + i] = fillWith;
}
}
@Override
public int length(){
public int length() {
return length;
}
@Override
public char charAt(int i){
public char charAt(int i) {
return value[offset + i];
}
public StringPointer substring(int begin){
public StringPointer substring(int 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);
}
@@ -110,7 +112,7 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
}
@Override
public String toString(){
public String toString() {
return new String(value, offset, length);
}
@@ -132,12 +134,12 @@ public class StringPointer implements Serializable, CharSequence, Comparable<Str
return true;
}
if (anObject instanceof StringPointer) {
StringPointer that = (StringPointer)anObject;
StringPointer that = (StringPointer) anObject;
if (length == that.length) {
char[] v1 = this.value;
char[] v2 = that.value;
for(int i = 0; i < this.length; i ++){
if(v1[this.offset + i] != v2[that.offset + i]){
for (int i = 0; i < this.length; i++) {
if (v1[this.offset + i] != v2[that.offset + i]) {
return false;
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -3,11 +3,10 @@ package cn.lili.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.io.*;
/**
* base64转为multipartFile工具类
*
@@ -55,7 +54,7 @@ public class Base64DecodeMultipartFile implements MultipartFile {
}
@Override
public InputStream getInputStream() throws IOException {
public InputStream getInputStream() {
return new ByteArrayInputStream(imgContent);
}
@@ -66,8 +65,9 @@ public class Base64DecodeMultipartFile implements MultipartFile {
stream = new FileOutputStream(dest);
stream.write(imgContent);
} catch (IOException e) {
log.error("transferTo错误",e);
}finally {
log.error("transferTo错误", e);
} finally {
assert stream != null;
stream.close();
}
}
@@ -94,7 +94,7 @@ public class Base64DecodeMultipartFile implements MultipartFile {
byte[] bytes = Base64.getDecoder().decode(base64);
stream = new ByteArrayInputStream(bytes);
} catch (Exception e) {
log.error("base64ToInputStream错误",e);
log.error("base64ToInputStream错误", e);
}
return stream;
}
@@ -111,13 +111,13 @@ public class Base64DecodeMultipartFile implements MultipartFile {
}
data = swapStream.toByteArray();
} catch (IOException e) {
log.error("转码错误",e);
log.error("转码错误", e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
log.error("inputStreamToStream错误",e);
log.error("inputStreamToStream错误", e);
}
}
}

View File

@@ -16,7 +16,7 @@ public class BeanUtil {
* 复制属性
*
* @param objectFrom 源自对象
* @param objectTo 复制给对象
* @param objectTo 复制给对象
*/
public static void copyProperties(Object objectFrom, Object objectTo) {
BeanUtils.copyProperties(objectFrom, objectTo);
@@ -25,6 +25,7 @@ public class BeanUtil {
/**
* 获取属性名数组
*
* @param o 获取字段的对象
* @return 返回各个字段
*/
@@ -49,8 +50,9 @@ public class BeanUtil {
/**
* 根据属性名获取属性值
*
* @param fieldName 属性名
* @param o 对象
* @param o 对象
* @return 属性值
*/
public static Object getFieldValueByName(String fieldName, Object o) {
@@ -69,6 +71,7 @@ public class BeanUtil {
/**
* 将对象转换为key value
* A=a&B=b&C=c 格式
*
* @param object 对象
* @return 格式化结果
*/
@@ -87,6 +90,7 @@ public class BeanUtil {
String key = fieldNames[j];
//获取值
Object value = BeanUtil.getFieldValueByName(key, object);
assert value != null;
stringBuffer.append(key).append("=").append(value.toString());
}
return stringBuffer.toString();
@@ -95,8 +99,9 @@ public class BeanUtil {
/**
* key value键值对 转换为 对象
* A=a&B=b&C=c 格式 转换为对象
*
* @param str 对象字符串
* @param t 范型
* @param t 范型
* @param <T> 范型
* @return 格式化结果
*/

View File

@@ -1,6 +1,7 @@
package cn.lili.common.utils;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* 金额计算工具
@@ -28,9 +29,9 @@ public final class CurrencyUtil {
* @return 两个参数的和
*/
public static Double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.add(b2).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
/**
@@ -41,9 +42,9 @@ public final class CurrencyUtil {
* @return 两个参数的差
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.subtract(b2).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
/**
@@ -54,9 +55,9 @@ public final class CurrencyUtil {
* @return 两个参数的积
*/
public static Double mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.multiply(b2).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
/**
@@ -72,9 +73,9 @@ public final class CurrencyUtil {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.multiply(b2).setScale(scale, RoundingMode.HALF_UP).doubleValue();
}
/**
@@ -105,26 +106,9 @@ public final class CurrencyUtil {
if (v2 == 0) {
return 0;
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.divide(b2, scale, BigDecimal.ROUND_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();
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
}
/**
@@ -145,7 +129,6 @@ public final class CurrencyUtil {
* @return double类型分
*/
public static double reversalFen(Double money) {
double price = div(money, 100);
return price;
return div(money, 100);
}
}

View File

@@ -273,7 +273,7 @@ public class DateUtil {
* @return 时间戳
*/
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 时间戳
*/
public static long getDateline(String date, String pattern) {
return toDate(date, pattern).getTime() / 1000;
return Objects.requireNonNull(toDate(date, pattern)).getTime() / 1000;
}
/**

View File

@@ -1,19 +1,25 @@
package cn.lili.common.utils;
import com.alibaba.fastjson.JSONObject;
import com.xkcoding.http.HttpUtil;
import com.xkcoding.http.config.HttpConfig;
import com.xkcoding.http.support.HttpHeader;
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;
/**
* HttpUtil 工具,统一处理 http 请求,方便对 simple-http 做定制
*
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
* @version 4.1
* @since 1.0.0
* HTTP 工具类
* @author liushuai
*/
@Slf4j
public class HttpUtils {
public HttpUtils(HttpConfig config) {
@@ -105,4 +111,258 @@ public class HttpUtils {
public String post(String url, Map<String, String> params, HttpHeader header, boolean 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();
}
}

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.connect.util;
package cn.lili.common.utils;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ThreadLocalRandom;

View File

@@ -1,8 +1,10 @@
package cn.lili.modules.connect.request;
import cn.lili.cache.Cache;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.StringUtils;
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.ConnectAuth;
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.exception.AuthException;
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 lombok.extern.slf4j.Slf4j;

View File

@@ -5,6 +5,7 @@ import cn.lili.common.security.token.Token;
import cn.lili.modules.connect.entity.Connect;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.entity.dto.WechatMPLoginParams;
import cn.lili.modules.member.entity.dto.ConnectQueryDTO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.naming.NoPermissionException;
@@ -103,4 +104,12 @@ public interface ConnectService extends IService<Connect> {
* @return token
*/
Token miniProgramAutoLogin(WechatMPLoginParams params);
/**
* 根据查询dto获取查询对象
*
* @param connectQueryDTO
* @return
*/
Connect queryConnect(ConnectQueryDTO connectQueryDTO);
}

View File

@@ -12,6 +12,7 @@ import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.token.Token;
import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.connect.entity.Connect;
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.service.ConnectService;
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.token.MemberTokenGenerate;
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.enums.SettingEnum;
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.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
@@ -232,6 +233,16 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
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>

View File

@@ -1,6 +1,6 @@
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 com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;

View File

@@ -49,10 +49,4 @@ public interface DistributionCashService extends IService<DistributionCash> {
*/
DistributionCash audit(@PathVariable String id, @RequestParam String result);
/**
* 待处理分销员提现申请数量
*
* @return 待处理分销员提现申请数量
*/
Integer newDistributionCash();
}

View File

@@ -2,14 +2,10 @@ package cn.lili.modules.distribution.serviceimpl;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.member.entity.enums.WithdrawStatusEnum;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dos.DistributionCash;
import cn.lili.modules.distribution.entity.enums.DistributionStatusEnum;
@@ -17,13 +13,17 @@ import cn.lili.modules.distribution.entity.vos.DistributionCashSearchParams;
import cn.lili.modules.distribution.mapper.DistributionCashMapper;
import cn.lili.modules.distribution.service.DistributionCashService;
import cn.lili.modules.distribution.service.DistributionService;
import cn.lili.modules.member.entity.dto.MemberWithdrawalMessage;
import cn.lili.modules.member.entity.enums.MemberWithdrawalDestinationEnum;
import cn.lili.modules.member.service.MemberWalletService;
import cn.lili.modules.order.trade.entity.enums.DepositServiceTypeEnum;
import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO;
import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage;
import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum;
import cn.lili.modules.wallet.entity.enums.MemberWithdrawalDestinationEnum;
import cn.lili.modules.wallet.entity.enums.WithdrawStatusEnum;
import cn.lili.modules.wallet.service.MemberWalletService;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
@@ -130,7 +130,7 @@ public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMap
distributorCash.setDistributionCashStatus(WithdrawStatusEnum.VIA_AUDITING.name());
distributorCash.setPayTime(new Date());
//提现到余额
memberWalletService.increase(distributorCash.getPrice(), distribution.getMemberId(), "分销[" + distributorCash.getSn() + "]佣金提现到余额[" + distributorCash.getPrice() + "]", DepositServiceTypeEnum.WALLET_COMMISSION.name());
memberWalletService.increase(new MemberWalletUpdateDTO(distributorCash.getPrice(), distribution.getMemberId(), "分销[" + distributorCash.getSn() + "]佣金提现到余额[" + distributorCash.getPrice() + "]", DepositServiceTypeEnum.WALLET_COMMISSION.name()));
} else {
memberWithdrawalMessage.setStatus(WithdrawStatusEnum.FAIL_AUDITING.name());
//分销员可提现金额退回
@@ -156,11 +156,4 @@ public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMap
throw new ServiceException(ResultCode.DISTRIBUTION_CASH_NOT_EXIST);
}
@Override
public Integer newDistributionCash() {
QueryWrapper queryWrapper = Wrappers.query();
queryWrapper.eq("distribution_cash_status", WithdrawStatusEnum.APPLY.name());
return this.count(queryWrapper);
}
}

View File

@@ -4,7 +4,6 @@ import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.json.JSONUtil;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum;
@@ -14,6 +13,7 @@ import cn.lili.modules.distribution.service.DistributionOrderService;
import cn.lili.modules.distribution.service.DistributionService;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dos.StoreFlow;
import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.order.service.StoreFlowService;
@@ -21,6 +21,7 @@ import cn.lili.modules.system.entity.dos.Setting;
import cn.lili.modules.system.entity.dto.DistributionSetting;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -87,10 +88,9 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
//判断是否为分销订单,如果为分销订单则获取分销佣金
if (order.getDistributionId() != null) {
//根据订单编号获取有分销金额的店铺流水记录
List<StoreFlow> storeFlowList = storeFlowService.list(new LambdaQueryWrapper<StoreFlow>()
.eq(StoreFlow::getOrderSn, orderSn)
.isNotNull(StoreFlow::getDistributionRebate));
Double rebate = 0.0;
List<StoreFlow> storeFlowList = storeFlowService
.listStoreFlow(StoreFlowQueryDTO.builder().justDistribution(true).orderSn(orderSn).build());
double rebate = 0.0;
//循环店铺流水记录判断是否包含分销商品
//包含分销商品则进行记录分销订单、计算分销总额
for (StoreFlow storeFlow : storeFlowList) {
@@ -165,7 +165,7 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
return;
}
//分销金额
Double rebate = 0.0;
double rebate = 0.0;
//包含分销商品则进行记录分销订单、计算分销总额
for (DistributionOrder distributionOrder : distributionOrderList) {
@@ -187,9 +187,7 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
@Override
public void refundOrder(String afterSaleSn) {
//判断是否为分销订单
StoreFlow storeFlow = storeFlowService.getOne(new LambdaQueryWrapper<StoreFlow>()
.eq(StoreFlow::getRefundSn, afterSaleSn)
.isNotNull(StoreFlow::getDistributionRebate));
StoreFlow storeFlow = storeFlowService.queryOne(StoreFlowQueryDTO.builder().justDistribution(true).refundSn(afterSaleSn).build());
if (storeFlow != null) {
//获取收款分销订单
@@ -199,12 +197,7 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
if (distributionOrder == null) {
return;
}
//已提交无法重复提交
if (distributionOrder.getDistributionOrderStatus().equals(DistributionOrderStatusEnum.CANCEL.name())) {
return;
}
//如果未结算则将分销订单取消
else if (distributionOrder.getDistributionOrderStatus().equals(DistributionOrderStatusEnum.WAIT_BILL.name())) {
if (distributionOrder.getDistributionOrderStatus().equals(DistributionOrderStatusEnum.WAIT_BILL.name())) {
this.update(new LambdaUpdateWrapper<DistributionOrder>()
.eq(DistributionOrder::getOrderItemSn, storeFlow.getOrderItemSn())
.set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.CANCEL.name()));

View File

@@ -37,13 +37,4 @@ public interface FileManagerPlugin {
*/
void deleteFile(List<String> key);
/**
* 根据原图生成规定尺寸的图片
*
* @param url 连接
* @param width 宽
* @param height 高
* @return
*/
String getUrl(String url, Integer width, Integer height);
}

View File

@@ -183,11 +183,4 @@ public class AliFileManagerPlugin implements FileManagerPlugin {
ossClient.shutdown();
}
}
@Override
public String getUrl(String url, Integer width, Integer height) {
//缩略图全路径
//返回缩略图全路径
return url + "?x-oss-process=style/" + width + "X" + height;
}
}

View File

@@ -0,0 +1,24 @@
package cn.lili.modules.file.util;
/**
* FileUtil
*
* @author Chopper
* @version v1.0
* 2021-11-22 11:19
*/
public class FileUtil {
/**
* 根据原图生成规定尺寸的图片
*
* @param url 连接
* @param width 宽
* @param height 高
* @return
*/
public static String getUrl(String url, Integer width, Integer height) {
//缩略图全路径
return url + "?x-oss-process=style/" + width + "X" + height;
}
}

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.store.entity.dos;
package cn.lili.modules.goods.entity.dos;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;

View File

@@ -1,18 +0,0 @@
package cn.lili.modules.goods.entity.dto;
import io.swagger.annotations.ApiModelProperty;
/**
* 用于直播间前台使用的直播间商品DTO
*
* @author Bulbasaur
* @since 2021/5/20 2:34 下午
*/
public class SimpleCommodity {
@ApiModelProperty(value = "图片")
private String goodsImage;
@ApiModelProperty(value = "商品名称")
private String name;
}

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.store.entity.vos;
package cn.lili.modules.goods.entity.vos;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

View File

@@ -1,6 +1,6 @@
package cn.lili.modules.store.mapper;
package cn.lili.modules.goods.mapper;
import cn.lili.modules.store.entity.dos.StoreGoodsLabel;
import cn.lili.modules.goods.entity.dos.StoreGoodsLabel;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**

View File

@@ -6,6 +6,7 @@ import cn.lili.modules.goods.entity.dto.GoodsSearchParams;
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.store.entity.dos.Store;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -91,21 +92,6 @@ public interface GoodsService extends IService<Goods> {
*/
boolean auditGoods(List<String> goodsIds, GoodsAuthEnum goodsAuthEnum);
/**
* 获取所有的已上架的商品数量
*
* @param goodsAuthEnum 商品审核枚举
* @param goodsStatusEnum 商品状态枚举
* @return 所有的已上架的商品数量
*/
Integer goodsNum(GoodsStatusEnum goodsStatusEnum, GoodsAuthEnum goodsAuthEnum);
/**
* 获取今天的已上架的商品数量
*
* @return 今天的已上架的商品数量
*/
Integer todayUpperNum();
/**
* 更新商品上架状态状态
@@ -148,4 +134,16 @@ public interface GoodsService extends IService<Goods> {
* @param goodsId 商品ID
*/
void updateGoodsCommentNum(String goodsId);
/**
* 批量更新商品的店铺信息
* @param store
*/
void updateStoreDetail(Store store);
/**
* 统计店铺的商品数量
* @param storeId 店铺id
*/
Integer countStoreGoodsNum(String storeId);
}

View File

@@ -1,7 +1,7 @@
package cn.lili.modules.store.service;
package cn.lili.modules.goods.service;
import cn.lili.modules.store.entity.dos.StoreGoodsLabel;
import cn.lili.modules.store.entity.vos.StoreGoodsLabelVO;
import cn.lili.modules.goods.entity.dos.StoreGoodsLabel;
import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;

View File

@@ -1,7 +1,7 @@
package cn.lili.modules.goods.serviceimpl;
import cn.hutool.json.JSONUtil;
import cn.lili.modules.file.plugin.FileManagerPlugin;
import cn.lili.modules.file.util.FileUtil;
import cn.lili.modules.goods.entity.dos.GoodsGallery;
import cn.lili.modules.goods.mapper.GoodsGalleryMapper;
import cn.lili.modules.goods.service.GoodsGalleryService;
@@ -29,11 +29,6 @@ import java.util.List;
@Service
@Transactional(rollbackFor = Exception.class)
public class GoodsGalleryServiceImpl extends ServiceImpl<GoodsGalleryMapper, GoodsGallery> implements GoodsGalleryService {
/**
* 文件
*/
@Autowired
private FileManagerPlugin fileManagerPlugin;
/**
* 设置
*/
@@ -65,9 +60,9 @@ public class GoodsGalleryServiceImpl extends ServiceImpl<GoodsGalleryMapper, Goo
Setting setting = settingService.get(SettingEnum.GOODS_SETTING.name());
GoodsSetting goodsSetting = JSONUtil.toBean(setting.getSettingValue(), GoodsSetting.class);
//缩略图
String thumbnail = fileManagerPlugin.getUrl(origin, goodsSetting.getAbbreviationPictureWidth(), goodsSetting.getAbbreviationPictureHeight());
String thumbnail = FileUtil.getUrl(origin, goodsSetting.getAbbreviationPictureWidth(), goodsSetting.getAbbreviationPictureHeight());
//小图
String small = fileManagerPlugin.getUrl(origin, goodsSetting.getSmallPictureWidth(), goodsSetting.getSmallPictureHeight());
String small = FileUtil.getUrl(origin, goodsSetting.getSmallPictureWidth(), goodsSetting.getSmallPictureHeight());
//赋值
goodsGallery.setSmall(small);
goodsGallery.setThumbnail(thumbnail);

View File

@@ -1,7 +1,5 @@
package cn.lili.modules.goods.serviceimpl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONUtil;
@@ -29,6 +27,7 @@ import cn.lili.modules.member.entity.dos.MemberEvaluation;
import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
import cn.lili.modules.member.service.MemberEvaluationService;
import cn.lili.modules.store.entity.dos.FreightTemplate;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.vos.StoreVO;
import cn.lili.modules.store.service.FreightTemplateService;
import cn.lili.modules.store.service.StoreService;
@@ -42,6 +41,7 @@ import cn.lili.rocketmq.tags.GoodsTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -121,8 +121,8 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
@Override
public List<Goods> getByBrandIds(List<String> brandIds) {
LambdaQueryWrapper<Goods> lambdaQueryWrapper = new LambdaQueryWrapper<Goods> ();
lambdaQueryWrapper.in(Goods::getBrandId,brandIds);
LambdaQueryWrapper<Goods> lambdaQueryWrapper = new LambdaQueryWrapper<Goods>();
lambdaQueryWrapper.in(Goods::getBrandId, brandIds);
return list(lambdaQueryWrapper);
}
@@ -273,33 +273,6 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
return result;
}
@Override
public Integer goodsNum(GoodsStatusEnum goodsStatusEnum, GoodsAuthEnum goodsAuthEnum) {
LambdaQueryWrapper<Goods> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(Goods::getDeleteFlag, false);
if (goodsStatusEnum != null) {
queryWrapper.eq(Goods::getMarketEnable, goodsStatusEnum.name());
}
if (goodsAuthEnum != null) {
queryWrapper.eq(Goods::getIsAuth, goodsAuthEnum.name());
}
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
queryWrapper.eq(CharSequenceUtil.equals(currentUser.getRole().name(), UserEnums.STORE.name()),
Goods::getStoreId, currentUser.getStoreId());
return this.count(queryWrapper);
}
@Override
public Integer todayUpperNum() {
LambdaQueryWrapper<Goods> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(Goods::getMarketEnable, GoodsStatusEnum.UPPER.name());
queryWrapper.ge(Goods::getCreateTime, DateUtil.beginOfDay(new DateTime()));
return this.count(queryWrapper);
}
@Override
public Boolean updateGoodsMarketAble(List<String> goodsIds, GoodsStatusEnum goodsStatusEnum, String underReason) {
boolean result;
@@ -396,6 +369,25 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
this.updateById(goods);
}
@Override
public void updateStoreDetail(Store store) {
UpdateWrapper updateWrapper = new UpdateWrapper<>()
.eq("store_id", store.getId())
.set("store_name", store.getStoreName())
.set("self_operated", store.getSelfOperated());
this.update(updateWrapper);
goodsSkuService.update(updateWrapper);
}
@Override
public Integer countStoreGoodsNum(String storeId) {
return this.count(
new LambdaQueryWrapper<Goods>()
.eq(Goods::getStoreId, storeId)
.eq(Goods::getIsAuth, GoodsAuthEnum.PASS.name())
.eq(Goods::getMarketEnable, GoodsStatusEnum.UPPER.name()));
}
/**
* 添加商品默认图片
*
@@ -490,12 +482,12 @@ public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
*/
private AuthUser checkStoreAuthority() {
AuthUser currentUser = UserContext.getCurrentUser();
if (currentUser == null || (currentUser.getRole().equals(UserEnums.STORE) && currentUser.getStoreId() == null)) {
throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR);
} else if (currentUser.getRole().equals(UserEnums.STORE) && currentUser.getStoreId() != null) {
//如果当前会员不为空,且为店铺角色
if (currentUser != null && (currentUser.getRole().equals(UserEnums.STORE) && currentUser.getStoreId() != null)) {
return currentUser;
} else {
throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR);
}
return null;
}
/**

View File

@@ -535,6 +535,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
*
* @param goods 商品信息
*/
@Override
public void generateEs(Goods goods) {
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GENERATOR_GOODS_INDEX.name();
//发送mq消息

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.store.serviceimpl;
package cn.lili.modules.goods.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.cache.Cache;
@@ -7,10 +7,10 @@ import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.modules.store.entity.dos.StoreGoodsLabel;
import cn.lili.modules.store.entity.vos.StoreGoodsLabelVO;
import cn.lili.modules.store.mapper.StoreGoodsLabelMapper;
import cn.lili.modules.store.service.StoreGoodsLabelService;
import cn.lili.modules.goods.entity.dos.StoreGoodsLabel;
import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
import cn.lili.modules.goods.mapper.StoreGoodsLabelMapper;
import cn.lili.modules.goods.service.StoreGoodsLabelService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;

View File

@@ -3,11 +3,11 @@ package cn.lili.modules.goods.util;
import cn.hutool.json.JSONObject;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.HttpUtils;
import cn.lili.modules.goods.entity.dos.Commodity;
import cn.lili.modules.goods.entity.dos.Studio;
import cn.lili.modules.goods.entity.dto.GoodsInfo;
import cn.lili.modules.message.util.WechatAccessTokenUtil;
import cn.lili.modules.system.utils.HttpUtils;
import cn.lili.modules.wechat.util.WechatAccessTokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -4,7 +4,7 @@ import cn.hutool.json.JSONObject;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.message.util.WechatAccessTokenUtil;
import cn.lili.modules.wechat.util.WechatAccessTokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -105,8 +105,9 @@ public class WechatMediaUtil {
} catch (Exception e) {
log.error("微信媒体上传失败", e);
}
assert resultStr != null;
JSONObject jsonObject = new JSONObject(resultStr.toString());
log.info("微信媒体上传:" + jsonObject.toString());
log.info("微信媒体上传:" + jsonObject);
//判断是否传递成功如果token过期则重新获取
if (jsonObject.get("errcode") != null && ("40001").equals(jsonObject.get("errcode"))) {
wechatAccessTokenUtil.removeAccessToken(ClientTypeEnum.WECHAT_MP);

View File

@@ -0,0 +1,28 @@
package cn.lili.modules.member.entity.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 收藏数量变化DTO
*
* @author Chopper
* @version v1.0
* 2021-11-30 10:14
*/
@Data
@AllArgsConstructor
public class CollectionDTO {
/**
* 变化的模型id
* 商品id/店铺id
*/
private String id;
/**
* 变化的数量
* -1 减少1 / +1 增加1
*/
private Integer num;
}

View File

@@ -0,0 +1,32 @@
package cn.lili.modules.member.entity.dto;
import lombok.Builder;
import lombok.Data;
/**
* ConnectQueryDTO
*
* @author Chopper
* @version v1.0
* 2021-12-01 14:34
*/
@Data
@Builder
public class ConnectQueryDTO {
/**
* 用户id
*/
private String userId;
/**
* 第三方id
*/
private String unionId;
/**
* 联合登陆类型
*/
private String unionType;
}

View File

@@ -2,7 +2,6 @@ package cn.lili.modules.member.mapper;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.vo.MemberDistributionVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -28,13 +27,6 @@ public interface MemberMapper extends BaseMapper<Member> {
@Select("select m.mobile from li_member m")
List<String> getAllMemberMobile();
/**
* 获取会员分布列表
* @return 会员分布列表
*/
@Select("select client_enum,count(0) as num from li_member group by client_enum")
List<MemberDistributionVO> distribution();
@Select("select * from li_member ${ew.customSqlSegment}")
IPage<MemberVO> pageByMemberVO(IPage<MemberVO> page, @Param(Constants.WRAPPER) Wrapper<Member> queryWrapper);
}

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.system.mapper;
package cn.lili.modules.member.mapper;
import cn.lili.modules.store.entity.dos.StoreLogistics;
import cn.lili.modules.system.entity.vo.StoreLogisticsVO;

View File

@@ -88,18 +88,5 @@ public interface MemberEvaluationService extends IService<MemberEvaluation> {
*/
EvaluationNumberVO getEvaluationNumber(String goodsId);
/**
* 获取今天新增的评价数量
*
* @return 今日评价数量
*/
Integer todayMemberEvaluation();
/**
* 获取等待回复评价数量
*
* @return 等待回复评价数量
*/
Integer getWaitReplyNum();
}

View File

@@ -9,7 +9,6 @@ import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO;
import cn.lili.modules.member.entity.dto.MemberAddDTO;
import cn.lili.modules.member.entity.dto.MemberEditDTO;
import cn.lili.modules.member.entity.vo.MemberDistributionVO;
import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -198,13 +197,6 @@ public interface MemberService extends IService<Member> {
*/
Boolean updateMemberStatus(List<String> memberIds, Boolean status);
/**
* 查看会员数据分布
*
* @return 会员数据分布
*/
List<MemberDistributionVO> distribution();
/**
* 根据条件查询会员总数
*

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.system.service;
package cn.lili.modules.member.service;
import cn.lili.modules.store.entity.dos.StoreLogistics;
import cn.lili.modules.system.entity.vo.StoreLogisticsVO;

View File

@@ -1,24 +1,18 @@
package cn.lili.modules.member.serviceimpl;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import cn.lili.common.security.context.UserContext;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.modules.member.entity.dos.GoodsCollection;
import cn.lili.modules.member.entity.vo.GoodsCollectionVO;
import cn.lili.modules.member.mapper.GoodsCollectionMapper;
import cn.lili.modules.member.service.GoodsCollectionService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -33,19 +27,8 @@ import java.util.Optional;
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class GoodsCollectionServiceImpl extends ServiceImpl<GoodsCollectionMapper, GoodsCollection> implements GoodsCollectionService {
/**
* rocketMq
*/
@Autowired
private RocketMQTemplate rocketMQTemplate;
/**
* rocketMq配置
*/
@Autowired
private RocketmqCustomProperties rocketmqCustomProperties;
@Override
public IPage<GoodsCollectionVO> goodsCollection(PageVO pageVo) {
@@ -73,10 +56,6 @@ public class GoodsCollectionServiceImpl extends ServiceImpl<GoodsCollectionMappe
goodsCollection = new GoodsCollection(UserContext.getCurrentUser().getId(), skuId);
this.save(goodsCollection);
//商品收藏消息
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.GOODS_COLLECTION.name();
//发送mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(skuId), RocketmqSendCallbackBuilder.commonCallback());
return goodsCollection;
}
throw new ServiceException(ResultCode.USER_COLLECTION_EXIST);

View File

@@ -1,18 +1,13 @@
package cn.lili.modules.member.serviceimpl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.SwitchEnum;
import cn.lili.common.exception.ServiceException;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.member.entity.dos.Member;
@@ -31,9 +26,9 @@ import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.enums.CommentStatusEnum;
import cn.lili.modules.order.order.service.OrderItemService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.system.utils.CharacterConstant;
import cn.lili.modules.system.utils.SensitiveWordsFilter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -121,7 +116,7 @@ public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMap
//新增用户评价
MemberEvaluation memberEvaluation = new MemberEvaluation(memberEvaluationDTO, goodsSku, member, order);
//过滤商品咨询敏感词
memberEvaluation.setContent(SensitiveWordsFilter.filter(memberEvaluation.getContent(), CharacterConstant.WILDCARD_STAR));
memberEvaluation.setContent(SensitiveWordsFilter.filter(memberEvaluation.getContent()));
//添加评价
this.save(memberEvaluation);
@@ -196,20 +191,6 @@ public class MemberEvaluationServiceImpl extends ServiceImpl<MemberEvaluationMap
return evaluationNumberVO;
}
@Override
public Integer todayMemberEvaluation() {
return this.count(new LambdaQueryWrapper<MemberEvaluation>().ge(MemberEvaluation::getCreateTime, DateUtil.beginOfDay(new DateTime())));
}
@Override
public Integer getWaitReplyNum() {
QueryWrapper<MemberEvaluation> queryWrapper = Wrappers.query();
queryWrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()),
"store_id", UserContext.getCurrentUser().getStoreId());
queryWrapper.eq("reply_status", false);
return this.count(queryWrapper);
}
/**
* 检测会员评价
*

View File

@@ -14,23 +14,20 @@ import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.utils.UuidUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.connect.config.ConnectAuthEnum;
import cn.lili.modules.connect.entity.Connect;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.connect.util.UuidUtils;
import cn.lili.modules.member.aop.annotation.PointLogPoint;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.ManagerMemberEditDTO;
import cn.lili.modules.member.entity.dto.MemberAddDTO;
import cn.lili.modules.member.entity.dto.MemberEditDTO;
import cn.lili.modules.member.entity.dto.MemberPointMessage;
import cn.lili.modules.member.entity.dto.*;
import cn.lili.modules.member.entity.enums.PointTypeEnum;
import cn.lili.modules.member.entity.vo.MemberDistributionVO;
import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import cn.lili.modules.member.mapper.MemberMapper;
@@ -40,12 +37,9 @@ import cn.lili.modules.member.token.StoreTokenGenerate;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.enums.StoreStatusEnum;
import cn.lili.modules.store.service.StoreService;
import cn.lili.modules.system.utils.CharacterConstant;
import cn.lili.modules.system.utils.SensitiveWordsFilter;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -352,7 +346,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
}
//过滤会员昵称敏感词
if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(managerMemberEditDTO.getNickName())) {
managerMemberEditDTO.setNickName(SensitiveWordsFilter.filter(managerMemberEditDTO.getNickName(), CharacterConstant.WILDCARD_STAR));
managerMemberEditDTO.setNickName(SensitiveWordsFilter.filter(managerMemberEditDTO.getNickName()));
}
//如果密码不为空则加密密码
if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(managerMemberEditDTO.getPassword())) {
@@ -429,13 +423,6 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
return this.update(updateWrapper);
}
@Override
public List<MemberDistributionVO> distribution() {
List<MemberDistributionVO> memberDistributionVOS = this.baseMapper.distribution();
return memberDistributionVOS;
}
/**
* 根据手机号获取会员
*
@@ -471,10 +458,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
* @param type 状态
*/
private void loginBindUser(Member member, String unionId, String type) {
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Connect::getUnionId, unionId);
queryWrapper.eq(Connect::getUnionType, type);
Connect connect = connectService.getOne(queryWrapper);
Connect connect = connectService.queryConnect(
ConnectQueryDTO.builder().unionId(unionId).unionType(type).build()
);
if (connect == null) {
connect = new Connect(member.getId(), unionId, type);
connectService.save(connect);
@@ -498,11 +484,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
if (connectAuthUser == null) {
return;
}
//检测是否已经绑定过用户
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Connect::getUnionId, connectAuthUser.getUuid());
queryWrapper.eq(Connect::getUnionType, connectType);
Connect connect = connectService.getOne(queryWrapper);
Connect connect = connectService.queryConnect(
ConnectQueryDTO.builder().unionId(connectAuthUser.getUuid()).unionType(connectType).build()
);
if (connect == null) {
connect = new Connect(member.getId(), connectAuthUser.getUuid(), connectType);
connectService.save(connect);
@@ -544,10 +528,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
throw new ServiceException(ResultCode.USER_OVERDUE_CONNECT_ERROR);
}
//检测是否已经绑定过用户
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Connect::getUnionId, connectAuthUser.getUuid());
queryWrapper.eq(Connect::getUnionType, connectType);
Connect connect = connectService.getOne(queryWrapper);
Connect connect = connectService.queryConnect(
ConnectQueryDTO.builder().unionType(connectType).unionId(connectAuthUser.getUuid()).build()
);
//没有关联则返回true表示可以继续绑定
if (connect == null) {
connectAuthUser.setConnectEnum(authInterface);

View File

@@ -3,16 +3,19 @@ package cn.lili.modules.member.serviceimpl;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.dos.StoreCollection;
import cn.lili.modules.member.entity.dto.CollectionDTO;
import cn.lili.modules.member.entity.vo.StoreCollectionVO;
import cn.lili.modules.member.mapper.StoreCollectionMapper;
import cn.lili.modules.member.service.StoreCollectionService;
import cn.lili.modules.store.service.StoreService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;
@@ -26,6 +29,10 @@ import java.util.Optional;
@Service
public class StoreCollectionServiceImpl extends ServiceImpl<StoreCollectionMapper, StoreCollection> implements StoreCollectionService {
@Autowired
private StoreService storeService;
@Override
public IPage<StoreCollectionVO> storeCollection(PageVO pageVo) {
QueryWrapper<StoreCollectionVO> queryWrapper = new QueryWrapper();
@@ -49,6 +56,7 @@ public class StoreCollectionServiceImpl extends ServiceImpl<StoreCollectionMappe
.eq(StoreCollection::getStoreId, storeId)) == null) {
StoreCollection storeCollection = new StoreCollection(UserContext.getCurrentUser().getId(), storeId);
this.save(storeCollection);
storeService.updateStoreCollectionNum(new CollectionDTO(storeId, 1));
return storeCollection;
}
throw new ServiceException(ResultCode.USER_COLLECTION_EXIST);
@@ -59,6 +67,7 @@ public class StoreCollectionServiceImpl extends ServiceImpl<StoreCollectionMappe
QueryWrapper<StoreCollection> queryWrapper = new QueryWrapper();
queryWrapper.eq("member_id", UserContext.getCurrentUser().getId());
queryWrapper.eq("store_id", storeId);
storeService.updateStoreCollectionNum(new CollectionDTO(storeId, -1));
return this.remove(queryWrapper);
}
}

View File

@@ -1,9 +1,9 @@
package cn.lili.modules.system.serviceimpl;
package cn.lili.modules.member.serviceimpl;
import cn.lili.modules.member.mapper.StoreLogisticsMapper;
import cn.lili.modules.member.service.StoreLogisticsService;
import cn.lili.modules.store.entity.dos.StoreLogistics;
import cn.lili.modules.system.entity.vo.StoreLogisticsVO;
import cn.lili.modules.system.mapper.StoreLogisticsMapper;
import cn.lili.modules.system.service.StoreLogisticsService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

View File

@@ -1,12 +1,22 @@
package cn.lili.modules.message.service;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.lili.modules.message.entity.dos.ShortLink;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 短链接 业务层
*
* @author Chopper
*/
public interface ShortLinkService extends IService<ShortLink> {
/**
* 根据模型,查询返回的集合
*
* @param shortLink 短链接模型
* @return 端链接集合
*/
List<ShortLink> queryShortLinks(ShortLink shortLink);
}

View File

@@ -3,16 +3,24 @@ package cn.lili.modules.message.serviceimpl;
import cn.lili.modules.message.entity.dos.ShortLink;
import cn.lili.modules.message.mapper.ShortLinkMapper;
import cn.lili.modules.message.service.ShortLinkService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 短链接 业务实现
*
* @author Chopper
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class ShortLinkServiceImpl extends ServiceImpl<ShortLinkMapper, ShortLink> implements ShortLinkService {
@Override
public List<ShortLink> queryShortLinks(ShortLink shortLink) {
return this.list(PageUtil.initWrapper(shortLink));
}
}

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.aop;
package cn.lili.modules.order.aftersale.aop;
import java.lang.annotation.*;

View File

@@ -1,12 +1,12 @@
package cn.lili.modules.order.order.aop;
package cn.lili.modules.order.aftersale.aop;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.SpelUtil;
import cn.lili.common.utils.ThreadPoolUtil;
import cn.lili.modules.order.order.service.AfterSaleLogService;
import cn.lili.modules.order.trade.entity.dos.AfterSaleLog;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
import cn.lili.modules.order.aftersale.service.AfterSaleLogService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
@@ -32,7 +32,7 @@ public class AfterSaleOperationLogAspect {
@Autowired
private AfterSaleLogService afterSaleLogService;
@AfterReturning(returning = "rvt", pointcut = "@annotation(cn.lili.modules.order.order.aop.AfterSaleLogPoint)")
@AfterReturning(returning = "rvt", pointcut = "@annotation(cn.lili.modules.order.aftersale.aop.AfterSaleLogPoint)")
public void afterReturning(JoinPoint joinPoint, Object rvt) {
try {
AuthUser auth = UserContext.getCurrentUser();

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.entity.dos;
package cn.lili.modules.order.aftersale.entity.dos;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -142,7 +142,7 @@ public class AfterSale extends BaseEntity {
private String mLogisticsName;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "买家发货时间")
private Date mDeliverTime;

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.trade.entity.dos;
package cn.lili.modules.order.aftersale.entity.dos;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.mybatis.BaseIdEntity;

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.entity.dos;
package cn.lili.modules.order.aftersale.entity.dos;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.entity.dto;
package cn.lili.modules.order.aftersale.entity.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.entity.dto;
package cn.lili.modules.order.aftersale.entity.dto;
import cn.lili.modules.promotion.entity.dto.BasePromotions;

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.entity.enums;
package cn.lili.modules.order.aftersale.entity.enums;
/**
* 交易投诉状态

View File

@@ -1,6 +1,6 @@
package cn.lili.modules.order.order.entity.vo;
package cn.lili.modules.order.aftersale.entity.vo;
import cn.lili.modules.order.order.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.entity.vo;
package cn.lili.modules.order.aftersale.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -54,5 +54,10 @@ public class AfterSaleApplyVO {
@ApiModelProperty(value = "是否支持退款")
private Boolean returnMoney;
@ApiModelProperty(value = "会员ID")
private String memberId;
}

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.entity.vo;
package cn.lili.modules.order.aftersale.entity.vo;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;

View File

@@ -1,7 +1,6 @@
package cn.lili.modules.order.order.entity.vo;
package cn.lili.modules.order.aftersale.entity.vo;
import cn.lili.modules.order.order.entity.dos.AfterSale;
import jdk.nashorn.internal.objects.annotations.Getter;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import lombok.Data;
/**
@@ -15,7 +14,6 @@ public class AfterSaleVO extends AfterSale {
/**
* 初始化自身状态
*/
@Getter
public AfterSaleAllowOperation getAfterSaleAllowOperationVO() {
//设置订单的可操作状态

View File

@@ -1,6 +1,6 @@
package cn.lili.modules.order.trade.mapper;
package cn.lili.modules.order.aftersale.mapper;
import cn.lili.modules.order.trade.entity.dos.AfterSaleLog;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**

View File

@@ -1,7 +1,7 @@
package cn.lili.modules.order.order.mapper;
package cn.lili.modules.order.aftersale.mapper;
import cn.lili.modules.order.order.entity.dos.AfterSale;
import cn.lili.modules.order.order.entity.vo.AfterSaleVO;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.entity.vo.AfterSaleVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;

View File

@@ -1,6 +1,6 @@
package cn.lili.modules.order.order.mapper;
package cn.lili.modules.order.aftersale.mapper;
import cn.lili.modules.order.order.entity.dos.AfterSaleReason;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**

View File

@@ -1,6 +1,6 @@
package cn.lili.modules.order.order.service;
package cn.lili.modules.order.aftersale.service;
import cn.lili.modules.order.trade.entity.dos.AfterSaleLog;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;

View File

@@ -1,6 +1,6 @@
package cn.lili.modules.order.order.service;
package cn.lili.modules.order.aftersale.service;
import cn.lili.modules.order.order.entity.dos.AfterSaleReason;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;

View File

@@ -1,13 +1,11 @@
package cn.lili.modules.order.order.service;
package cn.lili.modules.order.aftersale.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.order.order.entity.dos.AfterSale;
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.statistics.entity.dto.StatisticsQueryParam;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
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.store.entity.dto.StoreAfterSaleAddressDTO;
import cn.lili.modules.system.entity.vo.Traces;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -129,13 +127,6 @@ public interface AfterSaleService extends IService<AfterSale> {
*/
AfterSale cancel(String afterSaleSn);
/**
* 获取待处理售后数量
*
* @param serviceType 售后类型
* @return 待处理售后数量
*/
Integer applyNum(String serviceType);
/**
* 根据售后单号获取店铺退货收货地址信息
@@ -145,12 +136,4 @@ public interface AfterSaleService extends IService<AfterSale> {
*/
StoreAfterSaleAddressDTO getStoreAfterSaleAddressDTO(String sn);
/**
* 获取统计的售后
*
* @param statisticsQueryParam 统计搜索参数
* @param pageVO 分页
* @return 售后分页列表
*/
IPage<AfterSale> getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO);
}

View File

@@ -1,8 +1,8 @@
package cn.lili.modules.order.order.serviceimpl;
package cn.lili.modules.order.aftersale.serviceimpl;
import cn.lili.modules.order.order.service.AfterSaleLogService;
import cn.lili.modules.order.trade.entity.dos.AfterSaleLog;
import cn.lili.modules.order.trade.mapper.AfterSaleLogMapper;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
import cn.lili.modules.order.aftersale.mapper.AfterSaleLogMapper;
import cn.lili.modules.order.aftersale.service.AfterSaleLogService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

View File

@@ -1,8 +1,8 @@
package cn.lili.modules.order.order.serviceimpl;
package cn.lili.modules.order.aftersale.serviceimpl;
import cn.lili.modules.order.order.entity.dos.AfterSaleReason;
import cn.lili.modules.order.order.mapper.AfterSaleReasonMapper;
import cn.lili.modules.order.order.service.AfterSaleReasonService;
import cn.lili.modules.order.aftersale.entity.dos.AfterSaleReason;
import cn.lili.modules.order.aftersale.mapper.AfterSaleReasonMapper;
import cn.lili.modules.order.aftersale.service.AfterSaleReasonService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;

View File

@@ -1,4 +1,4 @@
package cn.lili.modules.order.order.serviceimpl;
package cn.lili.modules.order.aftersale.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.NumberUtil;
@@ -7,26 +7,25 @@ import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.order.order.aop.AfterSaleLogPoint;
import cn.lili.modules.order.order.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.aop.AfterSaleLogPoint;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
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.mapper.AfterSaleMapper;
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.OrderItem;
import cn.lili.modules.order.order.entity.dto.AfterSaleDTO;
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.OrderTypeEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
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.mapper.AfterSaleMapper;
import cn.lili.modules.order.order.service.AfterSaleService;
import cn.lili.modules.order.order.service.OrderItemService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.trade.entity.enums.AfterSaleRefundWayEnum;
@@ -34,15 +33,12 @@ import cn.lili.modules.order.trade.entity.enums.AfterSaleStatusEnum;
import cn.lili.modules.order.trade.entity.enums.AfterSaleTypeEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.RefundSupport;
import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
import cn.lili.modules.statistics.util.StatisticsDateUtil;
import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO;
import cn.lili.modules.store.service.StoreDetailService;
import cn.lili.modules.system.aspect.annotation.SystemLogPoint;
import cn.lili.modules.system.entity.dos.Logistics;
import cn.lili.modules.system.entity.vo.Traces;
import cn.lili.modules.system.service.LogisticsService;
import cn.lili.modules.system.utils.OperationalJudgment;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.AfterSaleTagsEnum;
@@ -60,6 +56,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 售后业务层实现
@@ -165,6 +162,7 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
afterSaleApplyVO.setImage(orderItem.getImage());
afterSaleApplyVO.setGoodsPrice(orderItem.getGoodsPrice());
afterSaleApplyVO.setSkuId(orderItem.getSkuId());
afterSaleApplyVO.setMemberId(order.getMemberId());
return afterSaleApplyVO;
}
@@ -192,7 +190,7 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
throw new ServiceException(ResultCode.AFTER_SALES_DOUBLE_ERROR);
}
//判断退款金额与付款金额是否正确,退款金额不能大于付款金额
if (NumberUtil.compare(afterSale.getFlowPrice(), actualRefundPrice) == -1) {
if (NumberUtil.compare(afterSale.getFlowPrice(), actualRefundPrice) < 0) {
throw new ServiceException(ResultCode.AFTER_SALES_PRICE_ERROR);
}
@@ -208,6 +206,7 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
if (afterSale.getRefundWay().equals(AfterSaleRefundWayEnum.ORIGINAL.name())) {
//如果为退款操作 && 在线支付 则直接进行退款
refundSupport.refund(afterSale);
afterSale.setRefundTime(new Date());
afterSaleStatusEnum = AfterSaleStatusEnum.COMPLETE;
} else {
afterSaleStatusEnum = AfterSaleStatusEnum.WAIT_REFUND;
@@ -222,8 +221,9 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
afterSale.setAuditRemark(remark);
//根据售后编号修改售后单
updateAfterSale(afterSaleSn, afterSale);
this.updateAfterSale(afterSaleSn, afterSale);
//根据售后状态修改OrderItem订单中正在售后商品数量及状态
this.updateOrderItemAfterSaleStatus(afterSale);
//发送售后消息
this.sendAfterSaleMessage(afterSale);
@@ -304,7 +304,8 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
//根据售后编号修改售后单
this.updateAfterSale(afterSaleSn, afterSale);
//根据售后状态修改OrderItem订单中正在售后商品数量及状态
this.updateOrderItemAfterSaleStatus(afterSale);
//发送售后消息
this.sendAfterSaleMessage(afterSale);
return afterSale;
@@ -353,38 +354,18 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
//根据售后编号修改售后单
this.updateAfterSale(afterSaleSn, afterSale);
//根据售后状态修改OrderItem订单中正在售后商品数量及状态
this.updateOrderItemAfterSaleStatus(afterSale);
return afterSale;
}
throw new ServiceException(ResultCode.AFTER_SALES_CANCEL_ERROR);
}
@Override
public Integer applyNum(String serviceType) {
AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser());
LambdaQueryWrapper<AfterSale> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(AfterSale::getServiceStatus, AfterSaleStatusEnum.APPLY.name());
queryWrapper.eq(CharSequenceUtil.isNotEmpty(serviceType), AfterSale::getServiceType, serviceType);
queryWrapper.eq(CharSequenceUtil.equals(authUser.getRole().name(), UserEnums.STORE.name()),
AfterSale::getStoreId, authUser.getStoreId());
return this.count(queryWrapper);
}
@Override
public StoreAfterSaleAddressDTO getStoreAfterSaleAddressDTO(String sn) {
return storeDetailService.getStoreAfterSaleAddressDTO(OperationalJudgment.judgment(this.getBySn(sn)).getStoreId());
}
@Override
public IPage<AfterSale> getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) {
LambdaQueryWrapper<AfterSale> queryWrapper = new LambdaQueryWrapper<>();
Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam);
queryWrapper.between(AfterSale::getCreateTime, dates[0], dates[1]);
queryWrapper.eq(CharSequenceUtil.isNotEmpty(statisticsQueryParam.getStoreId()), AfterSale::getStoreId, statisticsQueryParam.getStoreId());
return this.page(PageUtil.initPage(pageVO), queryWrapper);
}
/**
* 创建售后
*
@@ -441,15 +422,54 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
double utilPrice = CurrencyUtil.div(orderItem.getPriceDetailDTO().getFlowPrice(), orderItem.getNum());
afterSale.setApplyRefundPrice(CurrencyUtil.mul(afterSale.getNum(), utilPrice));
}
//添加售后
this.save(afterSale);
//发送售后消息
this.sendAfterSaleMessage(afterSale);
//修改订单的售后状态
orderItemService.updateAfterSaleStatus(orderItem.getSn(), OrderItemAfterSaleStatusEnum.ALREADY_APPLIED);
//根据售后状态修改OrderItem订单中正在售后商品数量及状态
this.updateOrderItemAfterSaleStatus(afterSale);
return afterSale;
}
/**
* 修改OrderItem订单中正在售后的商品数量及OrderItem订单状态
*
* @author ftyy
*/
private void updateOrderItemAfterSaleStatus(AfterSale afterSale) {
//根据商品skuId及订单sn获取子订单
OrderItem orderItem = orderItemService.getOne(new LambdaQueryWrapper<OrderItem>()
.eq(OrderItem::getOrderSn, afterSale.getOrderSn())
.eq(OrderItem::getSkuId, afterSale.getSkuId()));
AfterSaleStatusEnum afterSaleStatusEnum = AfterSaleStatusEnum.valueOf(afterSale.getServiceStatus());
switch (afterSaleStatusEnum) {
//判断当前售后的状态---申请中
case APPLY: {
orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() + afterSale.getNum());
break;
}
//判断当前售后的状态---已拒绝,买家取消售后,卖家终止售后
case REFUSE:
case BUYER_CANCEL:
case SELLER_TERMINATION: {
orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() - afterSale.getNum());
break;
}
default:
break;
}
//修改orderItem订单
this.updateOrderItem(orderItem);
}
/**
* 检查当前订单状态是否为可申请当前售后类型的状态
*
@@ -465,11 +485,17 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
//获取订单货物判断是否可申请售后
OrderItem orderItem = orderItemService.getBySn(afterSaleDTO.getOrderItemSn());
//未申请售后订单货物才能进行申请
if (!orderItem.getAfterSaleStatus().equals(OrderItemAfterSaleStatusEnum.NOT_APPLIED.name())) {
//未申请售后或部分售后订单货物才能进行申请
if (!orderItem.getAfterSaleStatus().equals(OrderItemAfterSaleStatusEnum.NOT_APPLIED.name()) && !orderItem.getAfterSaleStatus().equals(OrderItemAfterSaleStatusEnum.PART_AFTER_SALE.name())) {
throw new ServiceException(ResultCode.AFTER_SALES_BAN);
}
//申请商品数量不能超过商品总数量-售后商品数量
if (afterSaleDTO.getNum() > (orderItem.getNum() - orderItem.getReturnGoodsNumber())) {
throw new ServiceException(ResultCode.AFTER_GOODS_NUMBER_ERROR);
}
//获取售后类型
Order order = orderService.getBySn(orderItem.getOrderSn());
AfterSaleTypeEnum afterSaleTypeEnum = AfterSaleTypeEnum.valueOf(afterSaleDTO.getServiceType());
@@ -531,6 +557,7 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
* @param afterSale 售后单
*/
private void updateAfterSale(String afterSaleSn, AfterSale afterSale) {
//修改售后单状态
LambdaUpdateWrapper<AfterSale> queryWrapper = Wrappers.lambdaUpdate();
queryWrapper.eq(AfterSale::getSn, afterSaleSn);
this.update(afterSale, queryWrapper);
@@ -547,4 +574,76 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
//发送订单变更mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(afterSale), RocketmqSendCallbackBuilder.commonCallback());
}
/**
* 功能描述: 获取售后商品数量及已完成售后商品数量修改orderItem订单
*
* @param orderItem,afterSaleList
* @author ftyy
**/
private void updateOrderItemGoodsNumber(OrderItem orderItem, List<AfterSale> afterSaleList) {
//根据售后状态获取不是已结束的售后记录
List<AfterSale> implementList = afterSaleList.stream()
.filter(afterSale -> afterSale.getServiceStatus().equals(AfterSaleStatusEnum.APPLY.name())
|| afterSale.getServiceStatus().equals(AfterSaleStatusEnum.PASS.name())
|| afterSale.getServiceStatus().equals(AfterSaleStatusEnum.BUYER_RETURN.name())
|| afterSale.getServiceStatus().equals(AfterSaleStatusEnum.SELLER_CONFIRM.name())
|| afterSale.getServiceStatus().equals(AfterSaleStatusEnum.WAIT_REFUND.name())
|| afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name()))
.collect(Collectors.toList());
if (!implementList.isEmpty()) {
//遍历售后记录获取售后商品数量
implementList.forEach(a -> orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() + a.getNum()));
}
//获取已完成售后订单数量
List<AfterSale> completeList = afterSaleList.stream()
.filter(afterSale -> afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name()))
.collect(Collectors.toList());
if (!completeList.isEmpty()) {
//遍历售后记录获取已完成售后商品数量
completeList.forEach(a -> orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() + a.getNum()));
}
}
/**
* 功能描述: 修改orderItem订单
*
* @param orderItem
* @return void
* @author ftyy
**/
private void updateOrderItem(OrderItem orderItem) {
//订单状态不能为新订单,已失效订单或未申请订单才可以去修改订单信息
OrderItemAfterSaleStatusEnum afterSaleTypeEnum = OrderItemAfterSaleStatusEnum.valueOf(orderItem.getAfterSaleStatus());
switch (afterSaleTypeEnum) {
//售后状态为未申请 部分售后 已申请
case NOT_APPLIED:
case PART_AFTER_SALE:
case ALREADY_APPLIED: {
//通过正在售后商品总数修改订单售后状态
if (orderItem.getReturnGoodsNumber().equals(orderItem.getNum())) {
//修改订单的售后状态--已申请
orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.ALREADY_APPLIED.name());
} else if (orderItem.getReturnGoodsNumber().equals(0)) {
//修改订单的售后状态--未申请
orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.NOT_APPLIED.name());
} else {
//修改订单的售后状态--部分售后
orderItem.setAfterSaleStatus(OrderItemAfterSaleStatusEnum.PART_AFTER_SALE.name());
}
break;
}
default:
break;
}
orderItemService.update(new LambdaUpdateWrapper<OrderItem>()
.eq(OrderItem::getSn, orderItem.getSn())
.set(OrderItem::getAfterSaleStatus, orderItem.getAfterSaleStatus())
.set(OrderItem::getReturnGoodsNumber, orderItem.getReturnGoodsNumber()));
}
}

View File

@@ -97,7 +97,7 @@ public class TradeBuilder {
renderCartBySteps(tradeDTO, RenderStepStatement.tradeRender);
}
//添加order订单及order_item子订单并返回
return tradeService.createTrade(tradeDTO);
}

View File

@@ -397,11 +397,8 @@ public class CartServiceImpl implements CartService {
private void checkSetGoodsQuantity(CartSkuVO cartSkuVO, String skuId, Integer num) {
Integer enableStock = goodsSkuService.getStock(skuId);
//读取sku的可用库存
Integer enableQuantity = goodsSkuService.getStock(skuId);
//如果sku的可用库存小于等于0或者小于用户购买的数量则不允许购买
if (enableQuantity <= 0 || enableQuantity < num) {
if (enableStock <= 0 || enableStock < num) {
throw new ServiceException(ResultCode.GOODS_SKU_QUANTITY_NOT_ENOUGH);
}

View File

@@ -1,6 +1,6 @@
package cn.lili.modules.order.order.entity.dos;
import cn.lili.modules.order.order.entity.enums.ComplaintStatusEnum;
import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;

View File

@@ -112,6 +112,10 @@ public class OrderItem extends BaseEntity {
@ApiModelProperty(value = "交易投诉id")
private String complainId;
@ApiModelProperty(value = "退货商品数量")
private Integer returnGoodsNumber;
public OrderItem(CartSkuVO cartSkuVO, CartVO cartVO, TradeDTO tradeDTO) {
String oldId = this.getId();
BeanUtil.copyProperties(cartSkuVO.getGoodsSku(), this);

View File

@@ -0,0 +1,38 @@
package cn.lili.modules.order.order.entity.dto;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.store.entity.dos.Bill;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
/**
* 店铺流水查询DTO
*
* @author Chopper
* @version v1.0
* 2021-12-08 10:53
*/
@Data
@Builder
public class StoreFlowQueryDTO {
@ApiModelProperty(value = "类型")
private String type;
@ApiModelProperty(value = "售后编号")
private String refundSn;
@ApiModelProperty(value = "售后编号")
private String orderSn;
@ApiModelProperty(value = "过滤只看分销订单")
private Boolean justDistribution;
@ApiModelProperty("结算单")
private Bill bill;
@ApiModelProperty(value = "分页")
private PageVO pageVO;
}

View File

@@ -14,7 +14,9 @@ public enum OrderItemAfterSaleStatusEnum {
NEW("新订单,不能申请售后"),
NOT_APPLIED("未申请"),
ALREADY_APPLIED("已申请"),
EXPIRED("已失效不允许申请售后");
EXPIRED("已失效不允许申请售后"),
PART_AFTER_SALE("部分售后");
private final String description;

View File

@@ -1,8 +1,8 @@
package cn.lili.modules.order.order.entity.vo;
import cn.hutool.core.util.StrUtil;
import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum;
import cn.lili.modules.order.order.entity.dos.OrderComplaint;
import cn.lili.modules.order.order.entity.enums.ComplaintStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

View File

@@ -31,6 +31,28 @@ public interface OrderMapper extends BaseMapper<Order> {
@Update({"update li_order set order_status = #{status} where sn = #{orderSn}"})
void updateStatus(String status, String orderSn);
/**
* 查询导出订单DTO列表
*
* @param queryWrapper 查询条件
* @return 导出订单DTO列表
*/
@Select("SELECT o.sn,o.create_time,o.member_name,o.consignee_name,o.consignee_mobile,o.consignee_address_path,o.consignee_detail," +
"o.payment_method, o.logistics_name,o.freight_price,o.goods_price,o.discount_price,o.flow_price,oi.goods_name,oi.num," +
"o.remark,o.order_status,o.pay_status,o.deliver_status,o.need_receipt,o.store_name FROM li_order o LEFT JOIN li_order_item oi " +
"ON oi.order_sn=o.sn ${ew.customSqlSegment}")
List<OrderExportDTO> queryExportOrder(@Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper);
/**
* 查询订单支付记录
*
* @param page 分页
* @param queryWrapper 查询条件
* @return 订单支付记录分页
*/
@Select("select * from li_order ${ew.customSqlSegment} ")
IPage<PaymentLog> queryPaymentLogs(IPage<PaymentLog> page, @Param(Constants.WRAPPER) Wrapper<PaymentLog> queryWrapper);
/**
* 查询订单简短信息分页
*
@@ -63,26 +85,4 @@ public interface OrderMapper extends BaseMapper<Order> {
List<Order> queryListByParams(@Param(Constants.WRAPPER) Wrapper<Order> queryWrapper);
/**
* 查询导出订单DTO列表
*
* @param queryWrapper 查询条件
* @return 导出订单DTO列表
*/
@Select("SELECT o.sn,o.create_time,o.member_name,o.consignee_name,o.consignee_mobile,o.consignee_address_path,o.consignee_detail," +
"o.payment_method, o.logistics_name,o.freight_price,o.goods_price,o.discount_price,o.flow_price,oi.goods_name,oi.num," +
"o.remark,o.order_status,o.pay_status,o.deliver_status,o.need_receipt,o.store_name FROM li_order o LEFT JOIN li_order_item oi " +
"ON oi.order_sn=o.sn ${ew.customSqlSegment}")
List<OrderExportDTO> queryExportOrder(@Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper);
/**
* 查询订单支付记录
*
* @param page 分页
* @param queryWrapper 查询条件
* @return 订单支付记录分页
*/
@Select("select * from li_order ${ew.customSqlSegment} ")
IPage<PaymentLog> queryPaymentLogs(IPage<PaymentLog> page, @Param(Constants.WRAPPER) Wrapper<PaymentLog> queryWrapper);
}

View File

@@ -58,4 +58,12 @@ public interface OrderItemService extends IService<OrderItem> {
*/
List<OrderItem> getByOrderSn(String orderSn);
/**
* 子订单查询
*
* @param orderSn 订单编号
* @param skuId skuid
* @return 子订单
*/
OrderItem getByOrderSnAndSkuId(String orderSn, String skuId);
}

View File

@@ -1,6 +1,5 @@
package cn.lili.modules.order.order.service;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.order.entity.dos.Order;
@@ -9,8 +8,9 @@ import cn.lili.modules.order.order.entity.dto.OrderMessage;
import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
import cn.lili.modules.order.order.entity.vo.OrderSimpleVO;
import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
import cn.lili.modules.order.order.entity.vo.PaymentLog;
import cn.lili.modules.system.entity.vo.Traces;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
@@ -226,16 +226,6 @@ public interface OrderService extends IService<Order> {
*/
void deleteOrder(String sn);
/**
* 获取统计的订单
*
* @param statisticsQueryParam
* @param pageVO
* @return
*/
IPage<OrderSimpleVO> getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO);
/**
* 开具发票
*
@@ -275,4 +265,13 @@ public interface OrderService extends IService<Order> {
* @return 金额
*/
Double getPaymentTotal(String orderSn);
/**
* 查询订单支付记录
*
* @param page 分页
* @param queryWrapper 查询条件
* @return 订单支付记录分页
*/
IPage<PaymentLog> queryPaymentLogs(IPage<PaymentLog> page, Wrapper<PaymentLog> queryWrapper);
}

View File

@@ -1,12 +1,15 @@
package cn.lili.modules.order.order.service;
import cn.lili.common.vo.PageVO;
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.StoreFlow;
import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO;
import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO;
import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Date;
import java.util.List;
/**
* 商家订单流水业务层
@@ -33,14 +36,61 @@ public interface StoreFlowService extends IService<StoreFlow> {
/**
* 获取商家流水
*
* @param storeId 商家ID
* @param type 收入、退款
* @param distribution 是否查看分销相关数据
* @param pageVO 分页
* @param startTime 开始时间
* @param endTime 结束时间
* @return
* @param storeFlowQueryDTO 查询参数
* @return 返回分页
*/
IPage<StoreFlow> getStoreFlow(String storeId, String type, boolean distribution, PageVO pageVO, Date startTime, Date endTime);
IPage<StoreFlow> getStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO);
/**
* 根据参数查询一条数据
*
* @param storeFlowQueryDTO 查询参数
* @return 返回分页
*/
StoreFlow queryOne(StoreFlowQueryDTO storeFlowQueryDTO);
/**
* 获取结算单地入账流水
*
* @param storeFlowQueryDTO 查询条件
* @return 入账流水
*/
List<StoreFlowPayDownloadVO> getStoreFlowPayDownloadVO(StoreFlowQueryDTO storeFlowQueryDTO);
/**
* 获取结算单的退款流水
*
* @param storeFlowQueryDTO 查询条件
* @return 退款流水
*/
List<StoreFlowRefundDownloadVO> getStoreFlowRefundDownloadVO(StoreFlowQueryDTO storeFlowQueryDTO);
/**
* 根据结算单ID获取商家流水
*
* @param pageVO 分页
* @param id 结算单ID
* @param type 类型
* @return 商家流水
*/
IPage<StoreFlow> getStoreFlow(String id, String type, PageVO pageVO);
/**
* 根据结算单ID获取商家流水
*
* @param pageVO 分页
* @param id 结算单ID
* @return 商家流水
*/
IPage<StoreFlow> getDistributionFlow(String id, PageVO pageVO);
/**
* 获取店铺流水
*
* @param storeFlowQueryDTO 店铺流水查询参数
* @return 商家流水集合
*/
List<StoreFlow> listStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO);
}

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.BeanUtil;
@@ -11,11 +12,11 @@ import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.order.aftersale.entity.enums.ComplaintStatusEnum;
import cn.lili.modules.order.order.entity.dos.OrderComplaint;
import cn.lili.modules.order.order.entity.dos.OrderComplaintCommunication;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.dto.OrderComplaintDTO;
import cn.lili.modules.order.order.entity.enums.ComplaintStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum;
import cn.lili.modules.order.order.entity.vo.*;
import cn.lili.modules.order.order.mapper.OrderComplaintMapper;
@@ -23,7 +24,6 @@ import cn.lili.modules.order.order.service.OrderComplaintCommunicationService;
import cn.lili.modules.order.order.service.OrderComplaintService;
import cn.lili.modules.order.order.service.OrderItemService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.system.utils.OperationalJudgment;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

View File

@@ -9,14 +9,12 @@ import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
import cn.lili.modules.order.order.mapper.OrderItemMapper;
import cn.lili.modules.order.order.service.OrderItemService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
@@ -80,4 +78,10 @@ public class OrderItemServiceImpl extends ServiceImpl<OrderItemMapper, OrderItem
return this.list(lambdaQueryWrapper);
}
@Override
public OrderItem getByOrderSnAndSkuId(String orderSn, String skuId) {
return this.getOne(new LambdaQueryWrapper<OrderItem>()
.eq(OrderItem::getOrderSn, orderSn)
.eq(OrderItem::getSkuId, skuId));
}
}

View File

@@ -3,6 +3,7 @@ package cn.lili.modules.order.order.serviceimpl;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.modules.order.order.aop.OrderLogPoint;
import cn.lili.modules.order.order.entity.dos.Order;
@@ -15,7 +16,6 @@ import cn.lili.modules.order.order.service.OrderPriceService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.payment.kit.plugin.bank.BankTransferPlugin;
import cn.lili.modules.system.aspect.annotation.SystemLogPoint;
import cn.lili.modules.system.utils.OperationalJudgment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

View File

@@ -12,10 +12,10 @@ import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
@@ -32,6 +32,7 @@ import cn.lili.modules.order.order.entity.enums.*;
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.OrderVO;
import cn.lili.modules.order.order.entity.vo.PaymentLog;
import cn.lili.modules.order.order.mapper.OrderItemMapper;
import cn.lili.modules.order.order.mapper.OrderMapper;
import cn.lili.modules.order.order.service.*;
@@ -40,23 +41,21 @@ import cn.lili.modules.order.trade.service.OrderLogService;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.promotion.entity.dos.Pintuan;
import cn.lili.modules.promotion.service.PintuanService;
import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
import cn.lili.modules.statistics.util.StatisticsDateUtil;
import cn.lili.modules.system.aspect.annotation.SystemLogPoint;
import cn.lili.modules.system.entity.dos.Logistics;
import cn.lili.modules.system.entity.vo.Traces;
import cn.lili.modules.system.service.LogisticsService;
import cn.lili.modules.system.utils.OperationalJudgment;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import cn.lili.rocketmq.tags.MqOrderTagsEnum;
import cn.lili.rocketmq.tags.OrderTagsEnum;
import cn.lili.trigger.enums.DelayTypeEnums;
import cn.lili.trigger.interfaces.TimeTrigger;
import cn.lili.trigger.message.PintuanOrderMessage;
import cn.lili.trigger.model.TimeExecuteConstant;
import cn.lili.trigger.model.TimeTriggerMsg;
import cn.lili.trigger.util.DelayQueueTools;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -524,7 +523,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
@Override
public void sendUpdateStatusMessage(OrderMessage orderMessage) {
String destination = rocketmqCustomProperties.getOrderTopic() + ":" + MqOrderTagsEnum.STATUS_CHANGE.name();
String destination = rocketmqCustomProperties.getOrderTopic() + ":" + OrderTagsEnum.STATUS_CHANGE.name();
//发送订单变更mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(orderMessage), RocketmqSendCallbackBuilder.commonCallback());
}
@@ -544,21 +543,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
this.orderItemService.update(orderItemLambdaUpdateWrapper);
}
@Override
public IPage<OrderSimpleVO> getStatistics(StatisticsQueryParam statisticsQueryParam, PageVO pageVO) {
QueryWrapper<OrderSimpleVO> queryWrapper = new QueryWrapper<>();
Date[] dates = StatisticsDateUtil.getDateArray(statisticsQueryParam);
queryWrapper.between("o.create_time", dates[0], dates[1]);
queryWrapper.eq(StringUtils.isNotEmpty(statisticsQueryParam.getStoreId()),
"o.store_id", statisticsQueryParam.getStoreId());
queryWrapper.eq("o.delete_flag", false);
queryWrapper.groupBy("o.id");
queryWrapper.orderByDesc("o.id");
return this.baseMapper.queryByParams(PageUtil.initPage(pageVO), queryWrapper);
}
@Override
public Boolean invoice(String sn) {
//根据订单号查询发票信息
@@ -663,6 +647,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
return order.getFlowPrice();
}
@Override
public IPage<PaymentLog> queryPaymentLogs(IPage<PaymentLog> page, Wrapper<PaymentLog> queryWrapper) {
return baseMapper.queryPaymentLogs(page, queryWrapper);
}
/**
* 循环检查批量发货订单列表
*

View File

@@ -1,11 +1,15 @@
package cn.lili.modules.order.order.serviceimpl;
import cn.lili.common.utils.*;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
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.OrderItem;
import cn.lili.modules.order.order.entity.dos.StoreFlow;
import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO;
import cn.lili.modules.order.order.entity.enums.FlowTypeEnum;
import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
@@ -15,6 +19,10 @@ import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.order.service.StoreFlowService;
import cn.lili.modules.payment.entity.RefundLog;
import cn.lili.modules.payment.service.RefundLogService;
import cn.lili.modules.store.entity.dos.Bill;
import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO;
import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO;
import cn.lili.modules.store.service.BillService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -26,7 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
@@ -56,6 +63,9 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
@Autowired
private RefundLogService refundLogService;
@Autowired
private BillService billService;
@Override
public void payOrder(String orderSn) {
//根据订单编号获取子订单列表
@@ -139,7 +149,8 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
//获取付款信息
StoreFlow payStoreFlow = this.getOne(new LambdaUpdateWrapper<StoreFlow>().eq(StoreFlow::getOrderItemSn, afterSale.getOrderItemSn()));
StoreFlow payStoreFlow = this.getOne(new LambdaUpdateWrapper<StoreFlow>().eq(StoreFlow::getOrderItemSn, afterSale.getOrderItemSn())
.eq(StoreFlow::getFlowType, FlowTypeEnum.PAY));
storeFlow.setNum(afterSale.getNum());
storeFlow.setCategoryId(payStoreFlow.getCategoryId());
//佣金
@@ -151,20 +162,84 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
//最终结算金额
storeFlow.setBillPrice(CurrencyUtil.add(CurrencyUtil.add(storeFlow.getFinalPrice(), storeFlow.getDistributionRebate()), storeFlow.getCommissionPrice()));
//获取第三方支付流水号
RefundLog refundLog = refundLogService.getOne(new LambdaQueryWrapper<RefundLog>().eq(RefundLog::getAfterSaleNo, afterSale.getSn()));
RefundLog refundLog = refundLogService.queryByAfterSaleSn(afterSale.getSn());
storeFlow.setTransactionId(refundLog.getReceivableNo());
storeFlow.setPaymentName(refundLog.getPaymentName());
this.save(storeFlow);
}
@Override
public IPage<StoreFlow> getStoreFlow(String storeId, String type, boolean distribution, PageVO pageVO, Date startTime, Date endTime) {
public IPage<StoreFlow> getStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO) {
return this.page(PageUtil.initPage(storeFlowQueryDTO.getPageVO()), generatorQueryWrapper(storeFlowQueryDTO));
}
@Override
public StoreFlow queryOne(StoreFlowQueryDTO storeFlowQueryDTO) {
return this.getOne(generatorQueryWrapper(storeFlowQueryDTO));
}
@Override
public List<StoreFlowPayDownloadVO> getStoreFlowPayDownloadVO(StoreFlowQueryDTO storeFlowQueryDTO) {
return baseMapper.getStoreFlowPayDownloadVO(generatorQueryWrapper(storeFlowQueryDTO));
}
@Override
public List<StoreFlowRefundDownloadVO> getStoreFlowRefundDownloadVO(StoreFlowQueryDTO storeFlowQueryDTO) {
return baseMapper.getStoreFlowRefundDownloadVO(generatorQueryWrapper(storeFlowQueryDTO));
}
@Override
public IPage<StoreFlow> getStoreFlow(String id, String type, PageVO pageVO) {
Bill bill = billService.getById(id);
return this.getStoreFlow(StoreFlowQueryDTO.builder().type(type).pageVO(pageVO).bill(bill).build());
}
@Override
public IPage<StoreFlow> getDistributionFlow(String id, PageVO pageVO) {
Bill bill = billService.getById(id);
return this.getStoreFlow(StoreFlowQueryDTO.builder().pageVO(pageVO).bill(bill).build());
}
@Override
public List<StoreFlow> listStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO) {
return this.list(generatorQueryWrapper(storeFlowQueryDTO));
}
/**
* 生成查询wrapper
*
* @param storeFlowQueryDTO 搜索参数
* @return 查询wrapper
*/
private LambdaQueryWrapper generatorQueryWrapper(StoreFlowQueryDTO storeFlowQueryDTO) {
LambdaQueryWrapper<StoreFlow> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(StoreFlow::getStoreId, storeId);
lambdaQueryWrapper.isNotNull(distribution, StoreFlow::getDistributionRebate);
lambdaQueryWrapper.between(StoreFlow::getCreateTime, startTime, endTime);
lambdaQueryWrapper.eq(StringUtils.isNotEmpty(type), StoreFlow::getFlowType, type);
return this.page(PageUtil.initPage(pageVO), lambdaQueryWrapper);
//分销订单过滤是否判定
lambdaQueryWrapper.isNotNull(storeFlowQueryDTO.getJustDistribution() != null && storeFlowQueryDTO.getJustDistribution(),
StoreFlow::getDistributionRebate);
//流水类型判定
lambdaQueryWrapper.eq(StringUtils.isNotEmpty(storeFlowQueryDTO.getType()),
StoreFlow::getFlowType, storeFlowQueryDTO.getType());
//售后编号判定
lambdaQueryWrapper.eq(StringUtils.isNotEmpty(storeFlowQueryDTO.getRefundSn()),
StoreFlow::getRefundSn, storeFlowQueryDTO.getRefundSn());
//售后编号判定
lambdaQueryWrapper.eq(StringUtils.isNotEmpty(storeFlowQueryDTO.getOrderSn()),
StoreFlow::getOrderSn, storeFlowQueryDTO.getOrderSn());
//结算单非空,则校对结算单参数
if (storeFlowQueryDTO.getBill() != null) {
Bill bill = storeFlowQueryDTO.getBill();
lambdaQueryWrapper.eq(StringUtils.isNotEmpty(bill.getStoreId()), StoreFlow::getStoreId, bill.getStoreId());
lambdaQueryWrapper.between(bill.getStartTime() != null && bill.getEndTime() != null,
StoreFlow::getCreateTime, bill.getStartTime(), bill.getEndTime());
}
return lambdaQueryWrapper;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,16 +1,15 @@
package cn.lili.modules.payment.kit;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.SpringContextUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.modules.member.service.MemberWalletService;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.entity.enums.PaymentClientEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.kit.params.CashierExecute;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import cn.lili.modules.system.entity.dos.Setting;
@@ -19,6 +18,7 @@ import cn.lili.modules.system.entity.dto.payment.PaymentSupportSetting;
import cn.lili.modules.system.entity.dto.payment.dto.PaymentSupportItem;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import cn.lili.modules.wallet.service.MemberWalletService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -2,20 +2,19 @@ package cn.lili.modules.payment.kit;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.SpringContextUtil;
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.service.AfterSaleService;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.service.OrderItemService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.order.service.StoreFlowService;
import cn.lili.modules.payment.entity.RefundLog;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* 退款支持
@@ -31,16 +30,16 @@ public class RefundSupport {
*/
@Autowired
private StoreFlowService storeFlowService;
/**
* 售后
*/
@Autowired
private AfterSaleService afterSaleService;
/**
* 订单
*/
@Autowired
private OrderService orderService;
/**
* 子订单
*/
@Autowired
private OrderItemService orderItemService;
/**
* 售后退款
@@ -65,14 +64,31 @@ public class RefundSupport {
Payment payment = (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin());
payment.refund(refundLog);
//记录售后单中的退款金额
afterSaleService.update(new LambdaUpdateWrapper<AfterSale>()
.eq(AfterSale::getId, afterSale.getId())
.set(AfterSale::getRefundTime, new Date()));
this.updateReturnGoodsNumber(afterSale);
//记录退款流水
storeFlowService.refundOrder(afterSale);
}
/**
* 功能描述: 修改子订单中已售后退款商品数量
*
* @return void
* @Author ftyy
* @Description //TODO
* @Date 17:33 2021/11/18
* @Param [afterSale]
**/
private void updateReturnGoodsNumber(AfterSale afterSale) {
//根据商品id及订单sn获取子订单
OrderItem orderItem = orderItemService.getByOrderSnAndSkuId(afterSale.getOrderSn(), afterSale.getGoodsId());
orderItem.setReturnGoodsNumber(afterSale.getNum() + orderItem.getReturnGoodsNumber());
//修改子订单订单中的退货数量
orderItemService.updateById(orderItem);
}
/**
* 订单取消
*

View File

@@ -4,16 +4,16 @@ import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
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.payment.entity.enums.CashierEnum;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.kit.dto.PaymentSuccessParams;
import cn.lili.modules.payment.entity.enums.CashierEnum;
import cn.lili.modules.payment.kit.params.CashierExecute;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import cn.lili.modules.system.entity.dto.BaseSetting;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import cn.lili.modules.wallet.entity.dos.Recharge;
import cn.lili.modules.wallet.service.RechargeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

View File

@@ -5,18 +5,19 @@ import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.service.MemberWalletService;
import cn.lili.modules.order.trade.entity.enums.DepositServiceTypeEnum;
import cn.lili.modules.payment.entity.RefundLog;
import cn.lili.modules.payment.entity.enums.CashierEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.CashierSupport;
import cn.lili.modules.payment.kit.Payment;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.kit.dto.PaymentSuccessParams;
import cn.lili.modules.payment.entity.enums.CashierEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import cn.lili.modules.payment.service.PaymentService;
import cn.lili.modules.payment.service.RefundLogService;
import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO;
import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum;
import cn.lili.modules.wallet.service.MemberWalletService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -77,7 +78,7 @@ public class WalletPlugin implements Payment {
@Override
public ResultMessage<Object> nativePay(HttpServletRequest request, PayParam payParam) {
if(payParam.getOrderType().equals(CashierEnum.RECHARGE.name())){
if (payParam.getOrderType().equals(CashierEnum.RECHARGE.name())) {
throw new ServiceException(ResultCode.CAN_NOT_RECHARGE_WALLET);
}
savePaymentLog(payParam);
@@ -95,14 +96,14 @@ public class WalletPlugin implements Payment {
public void cancel(RefundLog refundLog) {
try {
memberWalletService.increase(refundLog.getTotalAmount(),
memberWalletService.increase(new MemberWalletUpdateDTO(refundLog.getTotalAmount(),
refundLog.getMemberId(),
"取消[" + refundLog.getOrderSn() + "]订单,退还金额[" + refundLog.getTotalAmount() + "]",
DepositServiceTypeEnum.WALLET_REFUND.name());
DepositServiceTypeEnum.WALLET_REFUND.name()));
refundLog.setIsRefund(true);
refundLogService.save(refundLog);
} catch (Exception e) {
log.error("订单取消错误",e);
log.error("订单取消错误", e);
}
}
@@ -120,13 +121,14 @@ public class WalletPlugin implements Payment {
@Override
public void refund(RefundLog refundLog) {
try {
memberWalletService.increase(refundLog.getTotalAmount(),
memberWalletService.increase(new MemberWalletUpdateDTO(refundLog.getTotalAmount(),
refundLog.getMemberId(),
"售后[" + refundLog.getAfterSaleNo() + "]审批,退还金额[" + refundLog.getTotalAmount() + "]", DepositServiceTypeEnum.WALLET_REFUND.name());
"售后[" + refundLog.getAfterSaleNo() + "]审批,退还金额[" + refundLog.getTotalAmount() + "]",
DepositServiceTypeEnum.WALLET_REFUND.name()));
refundLog.setIsRefund(true);
refundLogService.save(refundLog);
} catch (Exception e) {
log.error("退款失败",e);
log.error("退款失败", e);
}
}
@@ -143,11 +145,12 @@ public class WalletPlugin implements Payment {
if (UserContext.getCurrentUser() == null) {
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
}
boolean result = memberWalletService.reduce(
cashierParam.getPrice(),
UserContext.getCurrentUser().getId(),
"订单[" + cashierParam.getOrderSns() + "]支付金额[" + cashierParam.getPrice() + "]",
DepositServiceTypeEnum.WALLET_PAY.name()
boolean result = memberWalletService.reduce(new MemberWalletUpdateDTO(
cashierParam.getPrice(),
UserContext.getCurrentUser().getId(),
"订单[" + cashierParam.getOrderSns() + "]支付金额[" + cashierParam.getPrice() + "]",
DepositServiceTypeEnum.WALLET_PAY.name()
)
);
if (result) {
try {
@@ -162,11 +165,11 @@ public class WalletPlugin implements Payment {
log.info("支付回调通知:余额支付:{}", payParam);
} catch (ServiceException e) {
//业务异常,则支付手动回滚
memberWalletService.increase(
memberWalletService.increase(new MemberWalletUpdateDTO(
cashierParam.getPrice(),
UserContext.getCurrentUser().getId(),
"订单[" + cashierParam.getOrderSns() + "]支付异常,余额返还[" + cashierParam.getPrice() + "]",
DepositServiceTypeEnum.WALLET_REFUND.name()
DepositServiceTypeEnum.WALLET_REFUND.name())
);
throw e;
}

View File

@@ -7,21 +7,23 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.ApiProperties;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.ResultMessage;
import cn.lili.common.properties.ApiProperties;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.modules.connect.entity.Connect;
import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.member.entity.dto.ConnectQueryDTO;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.payment.entity.RefundLog;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.CashierSupport;
import cn.lili.modules.payment.kit.Payment;
import cn.lili.modules.payment.kit.core.PaymentHttpResponse;
@@ -31,7 +33,6 @@ import cn.lili.modules.payment.kit.core.kit.*;
import cn.lili.modules.payment.kit.core.utils.DateTimeZoneUtil;
import cn.lili.modules.payment.kit.dto.PayParam;
import cn.lili.modules.payment.kit.dto.PaymentSuccessParams;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.payment.kit.params.dto.CashierParam;
import cn.lili.modules.payment.kit.plugin.wechat.enums.WechatApiEnum;
import cn.lili.modules.payment.kit.plugin.wechat.enums.WechatDomain;
@@ -166,10 +167,9 @@ public class WechatPlugin implements Payment {
public ResultMessage<Object> jsApiPay(HttpServletRequest request, PayParam payParam) {
try {
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Connect::getUserId, UserContext.getCurrentUser().getId())
.eq(Connect::getUnionType, ConnectEnum.WECHAT.name());
Connect connect = connectService.getOne(queryWrapper);
Connect connect = connectService.queryConnect(
ConnectQueryDTO.builder().userId(UserContext.getCurrentUser().getId()).unionType(ConnectEnum.WECHAT.name()).build()
);
if (connect == null) {
return null;
}
@@ -359,10 +359,9 @@ public class WechatPlugin implements Payment {
public ResultMessage<Object> mpPay(HttpServletRequest request, PayParam payParam) {
try {
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Connect::getUserId, UserContext.getCurrentUser().getId())
.eq(Connect::getUnionType, ConnectEnum.WECHAT_MP_OPEN_ID.name());
Connect connect = connectService.getOne(queryWrapper);
Connect connect = connectService.queryConnect(
ConnectQueryDTO.builder().userId(UserContext.getCurrentUser().getId()).unionType(ConnectEnum.WECHAT_MP_OPEN_ID.name()).build()
);
if (connect == null) {
return null;
}

View File

@@ -1,10 +1,6 @@
package cn.lili.modules.payment.service;
import cn.lili.modules.order.order.entity.vo.PaymentLog;
import cn.lili.modules.payment.kit.dto.PaymentSuccessParams;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
* 支付日志 业务层
@@ -29,13 +25,4 @@ public interface PaymentService {
*/
void adminPaySuccess(PaymentSuccessParams paymentSuccessParams);
/**
* 获取支付日志
*
* @param initPage
* @param initWrapper
* @return
*/
IPage<PaymentLog> page(Page<PaymentLog> initPage, QueryWrapper<PaymentLog> initWrapper);
}

Some files were not shown because too many files have changed in this diff Show More