Merge branch 'feature/pg' of gitee.com:beijing_hongye_huicheng/lilishop into feature/pg

This commit is contained in:
paulGao 2021-06-22 22:34:02 +08:00
commit bf67a45d53
157 changed files with 1383 additions and 1137 deletions

View File

@ -4,9 +4,9 @@ import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage; import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.message.entity.enums.MessageStatusEnum; import cn.lili.modules.message.entity.enums.MessageStatusEnum;
import cn.lili.modules.member.entity.dos.MemberMessage; import cn.lili.modules.message.entity.dos.MemberMessage;
import cn.lili.modules.member.entity.vo.MemberMessageQueryVO; import cn.lili.modules.message.entity.vos.MemberMessageQueryVO;
import cn.lili.modules.member.service.MemberMessageService; import cn.lili.modules.message.service.MemberMessageService;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;

View File

@ -55,7 +55,7 @@ public class CartController {
cartService.add(skuId, num, cartType); cartService.add(skuId, num, cartType);
return ResultUtil.success(); return ResultUtil.success();
} catch (ServiceException se) { } catch (ServiceException se) {
log.error(se.getMsg(), se); log.info(se.getMsg(), se);
return ResultUtil.error(se.getResultCode().code(), se.getResultCode().message()); return ResultUtil.error(se.getResultCode().code(), se.getResultCode().message());
} catch (Exception e) { } catch (Exception e) {
log.error(ResultCode.CART_ERROR.message(), e); log.error(ResultCode.CART_ERROR.message(), e);

View File

@ -1,6 +1,7 @@
package cn.lili.controller.common; package cn.lili.controller.common;
import cn.lili.common.aop.limiter.annotation.LimitPoint; import cn.lili.common.aop.limiter.annotation.LimitPoint;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.enums.ResultUtil; import cn.lili.common.enums.ResultUtil;
import cn.lili.common.verification.enums.VerificationEnums; import cn.lili.common.verification.enums.VerificationEnums;
@ -38,7 +39,7 @@ public class SliderImageController {
throw e; throw e;
} catch (Exception e) { } catch (Exception e) {
log.error("获取校验接口错误", e); log.error("获取校验接口错误", e);
return null; throw new ServiceException(ResultCode.VERIFICATION_EXIST);
} }
} }

View File

@ -1,18 +1,27 @@
package cn.lili.listener; package cn.lili.listener;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.SwitchEnum;
import cn.lili.common.rocketmq.tags.OtherTagsEnum; import cn.lili.common.rocketmq.tags.OtherTagsEnum;
import cn.lili.common.sms.SmsUtil; import cn.lili.common.sms.SmsUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.mapper.MemberMapper; import cn.lili.modules.member.mapper.MemberMapper;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.message.entity.dos.MemberMessage;
import cn.lili.modules.message.entity.dos.Message; import cn.lili.modules.message.entity.dos.Message;
import cn.lili.modules.message.entity.dos.StoreMessage; import cn.lili.modules.message.entity.dos.StoreMessage;
import cn.lili.modules.message.entity.dto.SmsReachDTO; import cn.lili.modules.message.entity.dto.SmsReachDTO;
import cn.lili.modules.message.entity.enums.MessageSendClient;
import cn.lili.modules.message.entity.enums.MessageStatusEnum; import cn.lili.modules.message.entity.enums.MessageStatusEnum;
import cn.lili.modules.message.entity.enums.RangeEnum; import cn.lili.modules.message.entity.enums.RangeEnum;
import cn.lili.modules.message.service.MemberMessageService;
import cn.lili.modules.message.service.StoreMessageService; import cn.lili.modules.message.service.StoreMessageService;
import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.service.StoreService; import cn.lili.modules.store.service.StoreService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener; import org.apache.rocketmq.spring.core.RocketMQListener;
@ -41,9 +50,15 @@ public class NoticeSendMessageListener implements RocketMQListener<MessageExt> {
//店铺消息 //店铺消息
@Autowired @Autowired
private StoreMessageService storeMessageService; private StoreMessageService storeMessageService;
//会员消息
@Autowired
private MemberMessageService memberMessageService;
//店铺 //店铺
@Autowired @Autowired
private StoreService storeService; private StoreService storeService;
//会员
@Autowired
private MemberService memberService;
@Override @Override
public void onMessage(MessageExt messageExt) { public void onMessage(MessageExt messageExt) {
@ -51,7 +66,6 @@ public class NoticeSendMessageListener implements RocketMQListener<MessageExt> {
case SMS: case SMS:
String smsJsonStr = new String(messageExt.getBody()); String smsJsonStr = new String(messageExt.getBody());
SmsReachDTO smsReachDTO = JSONUtil.toBean(smsJsonStr, SmsReachDTO.class); SmsReachDTO smsReachDTO = JSONUtil.toBean(smsJsonStr, SmsReachDTO.class);
//发送全部会员 //发送全部会员
if (smsReachDTO.getSmsRange().equals(RangeEnum.ALL.name())) { if (smsReachDTO.getSmsRange().equals(RangeEnum.ALL.name())) {
//获取所有会员的手机号 //获取所有会员的手机号
@ -65,8 +79,27 @@ public class NoticeSendMessageListener implements RocketMQListener<MessageExt> {
//管理员发送站内信 //管理员发送站内信
case MESSAGE: case MESSAGE:
Message message = JSONUtil.toBean(new String(messageExt.getBody()), Message.class); Message message = JSONUtil.toBean(new String(messageExt.getBody()), Message.class);
// 管理端发送给商家的站内信
if (message.getMessageClient().equals(MessageSendClient.STORE.name().toLowerCase())) {
saveStoreMessage(message);
} else {
//管理员发送给会员的站内信
saveMemberMessage(message);
}
break;
default:
break;
}
}
/**
* 保存店铺消息
*
* @param message 消息
*/
private void saveStoreMessage(Message message) {
List<StoreMessage> list = new ArrayList<>(); List<StoreMessage> list = new ArrayList<>();
//保存商家记录 //发送全部商家情况
if (message.getMessageRange().equals("ALL")) { if (message.getMessageRange().equals("ALL")) {
List<Store> storeList = storeService.list(new QueryWrapper<Store>().eq("store_disable", "OPEN")); List<Store> storeList = storeService.list(new QueryWrapper<Store>().eq("store_disable", "OPEN"));
storeList.forEach(item -> { storeList.forEach(item -> {
@ -80,6 +113,7 @@ public class NoticeSendMessageListener implements RocketMQListener<MessageExt> {
list.add(storeMessage); list.add(storeMessage);
}); });
} else { } else {
//发送给指定商家情况
int i = 0; int i = 0;
for (String str : message.getUserIds()) { for (String str : message.getUserIds()) {
StoreMessage storeMessage = new StoreMessage(); StoreMessage storeMessage = new StoreMessage();
@ -93,10 +127,70 @@ public class NoticeSendMessageListener implements RocketMQListener<MessageExt> {
i++; i++;
} }
} }
if (list.size() > 0) {
//执行保存
storeMessageService.save(list); storeMessageService.save(list);
break;
default:
break;
} }
} }
/**
* 保存会员消息
*
* @param message 消息
*/
private void saveMemberMessage(Message message) {
List<MemberMessage> list = new ArrayList<>();
//如果是给所有会员发送消息
if (message.getMessageRange().equals("ALL")) {
//查询所有会员总数因为会员总数比较大 如果一次性查出来会占用数据库资源所以要分页查询
MemberSearchVO memberSearchVO = new MemberSearchVO();
memberSearchVO.setDisabled(SwitchEnum.OPEN.name());
Integer memberNum = memberService.getMemberNum(memberSearchVO);
//构建分页查询参数
//100条查一次
Integer pageSize = 200;
Integer pageCount = 0;
pageCount = memberNum / pageSize;
pageCount = memberNum % pageSize > 0 ? pageCount + 1 : pageCount;
for (int i = 1; i <= pageCount; i++) {
PageVO pageVO = new PageVO();
pageVO.setPageSize(pageSize);
pageVO.setPageNumber(i);
IPage<Member> page = memberService.getMemberPage(memberSearchVO, pageVO);
//循环要保存的信息
page.getRecords().forEach(item -> {
MemberMessage memberMessage = new MemberMessage();
memberMessage.setContent(message.getContent());
memberMessage.setTitle(message.getTitle());
memberMessage.setMessageId(message.getId());
memberMessage.setMemberId(item.getId());
memberMessage.setMemberName(item.getUsername());
memberMessage.setStatus(MessageStatusEnum.UN_READY.name());
list.add(memberMessage);
});
}
} else {
//如果是给指定会员发送消息
int i = 0;
for (String str : message.getUserIds()) {
MemberMessage memberMessage = new MemberMessage();
memberMessage.setMessageId(message.getId());
memberMessage.setMemberId(str);
memberMessage.setMemberName(message.getUserNames()[i]);
memberMessage.setStatus(MessageStatusEnum.UN_READY.name());
memberMessage.setTitle(message.getTitle());
memberMessage.setContent(message.getContent());
list.add(memberMessage);
i++;
}
}
if (list.size() > 0) {
//执行保存
memberMessageService.save(list);
}
}
} }

View File

@ -5,10 +5,8 @@ import cn.lili.common.exception.ServiceException;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
@ -18,7 +16,6 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Method;
/** /**
* 流量拦截 * 流量拦截
@ -43,40 +40,34 @@ public class LimitInterceptor {
this.limitScript = limitScript; this.limitScript = limitScript;
} }
@Around("execution(public * *(..)) && @annotation(cn.lili.common.aop.limiter.annotation.LimitPoint)") @Before("@annotation(limitPointAnnotation)")
public Object interceptor(ProceedingJoinPoint pjp) throws Throwable { public void interceptor(LimitPoint limitPointAnnotation) {
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
LimitPoint limitPointAnnotation = method.getAnnotation(LimitPoint.class);
LimitType limitType = limitPointAnnotation.limitType(); LimitType limitType = limitPointAnnotation.limitType();
String name = limitPointAnnotation.name(); String name = limitPointAnnotation.name();
String key; String key;
int limitPeriod = limitPointAnnotation.period(); int limitPeriod = limitPointAnnotation.period();
int limitCount = limitPointAnnotation.limit(); int limitCount = limitPointAnnotation.limit();
switch (limitType) { switch (limitType) {
case IP:
key = limitPointAnnotation.key() + getIpAddress();
break;
case CUSTOMER: case CUSTOMER:
key = limitPointAnnotation.key(); key = limitPointAnnotation.key();
break; break;
default: default:
key = StringUtils.upperCase(method.getName()); key = limitPointAnnotation.key() + getIpAddress();
} }
ImmutableList<String> keys = ImmutableList.of(StringUtils.join(limitPointAnnotation.prefix(), key)); ImmutableList<String> keys = ImmutableList.of(StringUtils.join(limitPointAnnotation.prefix(), key));
try { try {
Number count = redisTemplate.execute(limitScript, keys, limitCount, limitPeriod); Number count = redisTemplate.execute(limitScript, keys, limitCount, limitPeriod);
log.info("Access try count is {} for name={} and key = {}", count, name, key); log.info("限制请求{}, 当前请求{},缓存key{}", limitCount, count.intValue(), key);
//如果缓存里没有值或者他的值小于限制频率 //如果缓存里没有值或者他的值小于限制频率
if (count.intValue() <= limitCount) { if (count.intValue() >= limitCount) {
return pjp.proceed();
} else {
throw new ServiceException("访问过于频繁,请稍后再试"); throw new ServiceException("访问过于频繁,请稍后再试");
} }
} }
//如果从redis中执行都值判定为空则这里跳过 //如果从redis中执行都值判定为空则这里跳过
catch (NullPointerException e) { catch (NullPointerException e) {
return pjp.proceed(); return;
} catch (ServiceException e) {
throw e;
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("服务器异常,请稍后再试"); throw new RuntimeException("服务器异常,请稍后再试");
} }

View File

@ -34,6 +34,7 @@ public enum ResultCode {
*/ */
WECHAT_CONNECT_NOT_EXIST(1001, "微信联合登录未配置"), WECHAT_CONNECT_NOT_EXIST(1001, "微信联合登录未配置"),
VERIFICATION_EXIST(1002, "验证码服务异常"),
/** /**
* 分类 * 分类
*/ */
@ -57,77 +58,119 @@ public enum ResultCode {
GOODS_UPPER_ERROR(11004, "商品上架失败"), GOODS_UPPER_ERROR(11004, "商品上架失败"),
GOODS_AUTH_ERROR(11005, "商品审核失败"), GOODS_AUTH_ERROR(11005, "商品审核失败"),
POINT_GOODS_ERROR(11006, "积分商品业务异常,请稍后重试"), POINT_GOODS_ERROR(11006, "积分商品业务异常,请稍后重试"),
GOODS_SKU_SN_ERROR(11007, "商品SKU编号不能为空"),
GOODS_SKU_PRICE_ERROR(11008, "商品SKU价格不能小于等于0"),
GOODS_SKU_COST_ERROR(11009, "商品SKU成本价不能小于等于0"),
GOODS_SKU_WEIGHT_ERROR(11010, "商品重量不能为负数"),
GOODS_SKU_QUANTITY_ERROR(11011, "商品库存数量不能为负数"),
/** /**
* 参数 * 参数
*/ */
PARAMETER_SAVE_ERROR(12001, "参数添加失败"), PARAMETER_SAVE_ERROR(12001, "参数添加失败"),
PARAMETER_UPDATE_ERROR(12002, "参数编辑失败"), PARAMETER_UPDATE_ERROR(12002, "参数编辑失败"),
/** /**
* 规格 * 规格
*/ */
SPEC_SAVE_ERROR(13001, "规格修改失败"), SPEC_SAVE_ERROR(13001, "规格修改失败"),
SPEC_UPDATE_ERROR(13002, "规格修改失败"), SPEC_UPDATE_ERROR(13002, "规格修改失败"),
SPEC_DELETE_ERROR(13003, "此规格已绑定分类不允许删除"), SPEC_DELETE_ERROR(13003, "此规格已绑定分类不允许删除"),
/** /**
* 品牌 * 品牌
*/ */
BRAND_SAVE_ERROR(14001, "品牌添加失败"), BRAND_SAVE_ERROR(14001, "品牌添加失败"),
BRAND_UPDATE_ERROR(14002, "品牌修改失败"), BRAND_UPDATE_ERROR(14002, "品牌修改失败"),
BRAND_DISABLE_ERROR(14003, "品牌禁用失败"), BRAND_DISABLE_ERROR(14003, "品牌禁用失败"),
BRAND_DELETE_ERROR(14004, "品牌删除失败"), BRAND_DELETE_ERROR(14004, "品牌删除失败"),
/** /**
* 用户 * 用户
*/ */
USER_EDIT_SUCCESS(20001, "用户修改成功"), USER_EDIT_SUCCESS(20001, "用户修改成功"),
USER_NOT_EXIST(20002, "用户不存在"), USER_NOT_EXIST(20002, "用户不存在"),
USER_NOT_LOGIN(20003, "用户未登录"), USER_NOT_LOGIN(20003, "用户未登录"),
USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"), USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"),
USER_AUTHORITY_ERROR(20005, "权限不足"), USER_AUTHORITY_ERROR(20005, "权限不足"),
USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"), USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"),
USER_NAME_EXIST(20007, "该用户名已被注册"), USER_NAME_EXIST(20007, "该用户名已被注册"),
USER_PHONE_EXIST(20008, "该手机号已被注册"), USER_PHONE_EXIST(20008, "该手机号已被注册"),
USER_PHONE_NOT_EXIST(20009, "手机号不存在"), USER_PHONE_NOT_EXIST(20009, "手机号不存在"),
USER_PASSWORD_ERROR(20010, "密码不正确"), USER_PASSWORD_ERROR(20010, "密码不正确"),
USER_NOT_PHONE(20011, "非当前用户的手机号"), USER_NOT_PHONE(20011, "非当前用户的手机号"),
USER_CONNECT_ERROR(20012, "联合第三方登录,授权信息错误"), USER_CONNECT_ERROR(20012, "联合第三方登录,授权信息错误"),
USER_RECEIPT_REPEAT_ERROR(20013, "会员发票信息重复"), USER_RECEIPT_REPEAT_ERROR(20013, "会员发票信息重复"),
USER_RECEIPT_NOT_EXIST(20014, "会员发票信息不存在"), USER_RECEIPT_NOT_EXIST(20014, "会员发票信息不存在"),
USER_EDIT_ERROR(20015, "用户修改失败"), USER_EDIT_ERROR(20015, "用户修改失败"),
USER_OLD_PASSWORD_ERROR(20016, "旧密码不正确"), USER_OLD_PASSWORD_ERROR(20016, "旧密码不正确"),
USER_COLLECTION_EXIST(20017, "无法重复收藏"), USER_COLLECTION_EXIST(20017, "无法重复收藏"),
USER_GRADE_IS_DEFAULT(20018, "会员等级为默认会员等级"), USER_GRADE_IS_DEFAULT(20018, "会员等级为默认会员等级"),
DELETE_EXIST(2001, "无法重复收藏"), DELETE_EXIST(2001, "无法重复收藏"),
/** /**
* 权限 * 权限
*/ */
PERMISSION_DEPARTMENT_ROLE_ERROR(21001, "角色已绑定部门,请逐个删除"), PERMISSION_DEPARTMENT_ROLE_ERROR(21001, "角色已绑定部门,请逐个删除"),
PERMISSION_USER_ROLE_ERROR(21002, "角色已绑定管理员,请逐个删除"), PERMISSION_USER_ROLE_ERROR(21002, "角色已绑定管理员,请逐个删除"),
PERMISSION_MENU_ROLE_ERROR(21003, "菜单已绑定角色,请先删除或编辑角色"), PERMISSION_MENU_ROLE_ERROR(21003, "菜单已绑定角色,请先删除或编辑角色"),
PERMISSION_DEPARTMENT_DELETE_ERROR(21004, "部门已经绑定管理员,请先删除或编辑管理员"), PERMISSION_DEPARTMENT_DELETE_ERROR(21004, "部门已经绑定管理员,请先删除或编辑管理员"),
PERMISSION_BEYOND_TEN(21005, "最多可以设置10个角色"), PERMISSION_BEYOND_TEN(21005, "最多可以设置10个角色"),
/** /**
* 分销 * 分销
*/ */
DISTRIBUTION_CLOSE(22000, "分销功能关闭"), DISTRIBUTION_CLOSE(22000, "分销功能关闭"),
DISTRIBUTION_NOT_EXIST(22001, "分销员不存在"), DISTRIBUTION_NOT_EXIST(22001, "分销员不存在"),
DISTRIBUTION_IS_APPLY(22002, "分销员已申请,无需重复提交"), DISTRIBUTION_IS_APPLY(22002, "分销员已申请,无需重复提交"),
DISTRIBUTION_AUDIT_ERROR(22003, "审核分销员失败"), DISTRIBUTION_AUDIT_ERROR(22003, "审核分销员失败"),
DISTRIBUTION_RETREAT_ERROR(22004, "分销员清退失败"), DISTRIBUTION_RETREAT_ERROR(22004, "分销员清退失败"),
DISTRIBUTION_CASH_NOT_EXIST(22005, "分销员提现记录不存在"), DISTRIBUTION_CASH_NOT_EXIST(22005, "分销员提现记录不存在"),
DISTRIBUTION_GOODS_DOUBLE(22006, "不能重复添加分销商品"), DISTRIBUTION_GOODS_DOUBLE(22006, "不能重复添加分销商品"),
/** /**
* 购物车 * 购物车
*/ */
CART_ERROR(30001, "读取结算页的购物车异常"), CART_ERROR(30001, "读取结算页的购物车异常"),
CART_PINTUAN_NOT_EXIST_ERROR(30002, "拼团活动不存在错误"), CART_PINTUAN_NOT_EXIST_ERROR(30002, "拼团活动不存在错误"),
CART_PINTUAN_LIMIT_ERROR(30003, "购买数量超过拼团活动限制数量"), CART_PINTUAN_LIMIT_ERROR(30003, "购买数量超过拼团活动限制数量"),
SHIPPING_NOT_APPLY(30005, "购物商品不支持当前收货地址配送"), SHIPPING_NOT_APPLY(30005, "购物商品不支持当前收货地址配送"),
/** /**

View File

@ -87,6 +87,9 @@ public class DateUtil {
* @return * @return
*/ */
public static Date endOfDate(Date date) { public static Date endOfDate(Date date) {
if (date == null) {
date = new Date();
}
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(date); calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.HOUR_OF_DAY, 23);
@ -200,6 +203,7 @@ public class DateUtil {
public static String toString(Date date) { public static String toString(Date date) {
return toString(date, STANDARD_FORMAT); return toString(date, STANDARD_FORMAT);
} }
/** /**
* 把日期转换成字符串型 * 把日期转换成字符串型
* *
@ -209,6 +213,7 @@ public class DateUtil {
public static String toString(Long date) { public static String toString(Long date) {
return toString(date, STANDARD_FORMAT); return toString(date, STANDARD_FORMAT);
} }
/** /**
* 把日期转换成字符串型 * 把日期转换成字符串型
* *

View File

@ -2,11 +2,14 @@ package cn.lili.modules.goods.entity.dos;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.base.BaseEntity; import cn.lili.base.BaseEntity;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.modules.goods.entity.dto.GoodsOperationDTO; import cn.lili.modules.goods.entity.dto.GoodsOperationDTO;
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum; import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum; import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.xkcoding.http.util.StringUtil;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@ -16,6 +19,7 @@ import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.Table; import javax.persistence.Table;
import javax.validation.constraints.Max; import javax.validation.constraints.Max;
import java.util.Map;
/** /**
* 商品 * 商品
@ -223,5 +227,26 @@ public class Goods extends BaseEntity {
//如果立即上架则 //如果立即上架则
this.marketEnable = goodsOperationDTO.isRelease() ? GoodsStatusEnum.UPPER.name() : GoodsStatusEnum.DOWN.name(); this.marketEnable = goodsOperationDTO.isRelease() ? GoodsStatusEnum.UPPER.name() : GoodsStatusEnum.DOWN.name();
this.goodsType = goodsOperationDTO.getGoodsType(); this.goodsType = goodsOperationDTO.getGoodsType();
//循环sku判定sku是否有效
for (Map<String, Object> sku : goodsOperationDTO.getSkuList()) {
//判定参数不能为空
if (sku.get("sn") == null) {
throw new ServiceException(ResultCode.GOODS_SKU_SN_ERROR);
}
if (StringUtil.isEmpty(sku.get("price").toString()) || Integer.parseInt( sku.get("price").toString()) <= 0) {
throw new ServiceException(ResultCode.GOODS_SKU_PRICE_ERROR);
}
if (StringUtil.isEmpty(sku.get("cost").toString()) || Integer.parseInt( sku.get("cost").toString()) <= 0) {
throw new ServiceException(ResultCode.GOODS_SKU_COST_ERROR);
}
if (StringUtil.isEmpty(sku.get("weight").toString()) || Integer.parseInt( sku.get("weight").toString()) < 0) {
throw new ServiceException(ResultCode.GOODS_SKU_WEIGHT_ERROR);
}
if (StringUtil.isEmpty(sku.get("quantity").toString()) || Integer.parseInt( sku.get("quantity").toString()) < 0) {
throw new ServiceException(ResultCode.GOODS_SKU_QUANTITY_ERROR);
}
}
} }
} }

View File

@ -557,9 +557,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername()); queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername());
//按照电话号码查询 //按照电话号码查询
queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile()); queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile());
//按照电话号码查询 //按照状态查询
queryWrapper.like(StringUtils.isNotBlank(memberSearchVO.getDisabled()), "disabled", memberSearchVO.getDisabled()); queryWrapper.eq(StringUtils.isNotBlank(memberSearchVO.getDisabled()), "disabled",
queryWrapper.orderByDesc("create_time"); memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0); queryWrapper.orderByDesc("create_time");
return this.count(queryWrapper); return this.count(queryWrapper);
} }

View File

@ -1,4 +1,4 @@
package cn.lili.modules.member.entity.dos; package cn.lili.modules.message.entity.dos;
import cn.lili.base.BaseEntity; import cn.lili.base.BaseEntity;
import cn.lili.modules.message.entity.enums.MessageStatusEnum; import cn.lili.modules.message.entity.enums.MessageStatusEnum;
@ -11,7 +11,7 @@ import javax.persistence.Entity;
import javax.persistence.Table; import javax.persistence.Table;
/** /**
* 会员消息 * 会员接受消息对象
* *
* @author Chopper * @author Chopper
* @date 2020-02-25 14:10:16 * @date 2020-02-25 14:10:16
@ -37,6 +37,9 @@ public class MemberMessage extends BaseEntity {
@ApiModelProperty(value = "消息内容") @ApiModelProperty(value = "消息内容")
private String content; private String content;
@ApiModelProperty(value = "关联消息id")
private String messageId;
/** /**
* @see MessageStatusEnum * @see MessageStatusEnum
*/ */

View File

@ -2,6 +2,7 @@ package cn.lili.modules.message.entity.dos;
import cn.lili.base.BaseEntity; import cn.lili.base.BaseEntity;
import cn.lili.modules.message.entity.enums.RangeEnum; import cn.lili.modules.message.entity.enums.RangeEnum;
import cn.lili.modules.message.entity.enums.MessageSendClient;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
@ -13,6 +14,8 @@ import javax.persistence.Table;
import javax.persistence.Transient; import javax.persistence.Transient;
/** /**
* 管理段发送消息对象
*
* @author lili * @author lili
*/ */
@ -37,7 +40,10 @@ public class Message extends BaseEntity {
@ApiModelProperty(value = "发送范围") @ApiModelProperty(value = "发送范围")
private String messageRange; private String messageRange;
@ApiModelProperty(value = "发送客户端 商家和会员") /**
* @see MessageSendClient
*/
@ApiModelProperty(value = "发送客户端 商家或者会员")
private String messageClient; private String messageClient;
@Transient @Transient

View File

@ -10,7 +10,7 @@ import javax.persistence.Entity;
import javax.persistence.Table; import javax.persistence.Table;
/** /**
* 站内消息模板设置 * 通知类站内信模版对象
* *
* @author Bulbasaur * @author Bulbasaur
* @version v4.1 * @version v4.1
@ -20,7 +20,7 @@ import javax.persistence.Table;
@Entity @Entity
@Table(name = "li_notice_message") @Table(name = "li_notice_message")
@TableName("li_notice_message") @TableName("li_notice_message")
@ApiModel(value = "站内消息模板") @ApiModel(value = "通知类消息模板")
public class NoticeMessage extends BaseEntity { public class NoticeMessage extends BaseEntity {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -17,7 +17,7 @@ import javax.persistence.*;
import java.util.Date; import java.util.Date;
/** /**
* 店铺消息 * 店铺接收消息对象
* @author Chopper * @author Chopper
* @date 2021/1/30 4:13 下午 * @date 2021/1/30 4:13 下午
*/ */

View File

@ -0,0 +1,27 @@
package cn.lili.modules.message.entity.enums;
/**
* 消息发送客户端
*
* @author pikachu
* @date 2020/12/8 9:46
*/
public enum MessageSendClient {
//全部用户
MEMBER("会员"),
//指定用户
STORE("店铺");
private final String description;
MessageSendClient(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}

View File

@ -1,17 +1,19 @@
package cn.lili.modules.member.entity.vo; package cn.lili.modules.message.entity.vos;
import cn.lili.modules.message.entity.enums.MessageStatusEnum; import cn.lili.modules.message.entity.enums.MessageStatusEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* 会员消息查询 * 会员接收消息查询vo
* *
* @author Chopper * @author Chopper
* @date 2020-02-25 14:10:16 * @date 2020/12/2 17:50
*/ */
@Data @Data
@ApiModel(value = "会员接收消息查询vo")
public class MemberMessageQueryVO { public class MemberMessageQueryVO {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -22,6 +24,9 @@ public class MemberMessageQueryVO {
@ApiModelProperty(value = "状态") @ApiModelProperty(value = "状态")
private String status; private String status;
@ApiModelProperty(value = "消息id")
private String messageId;
@ApiModelProperty(value = "消息标题") @ApiModelProperty(value = "消息标题")
private String title; private String title;

View File

@ -1,12 +1,12 @@
package cn.lili.modules.member.mapper; package cn.lili.modules.message.mapper;
import cn.lili.modules.member.entity.dos.MemberMessage; import cn.lili.modules.message.entity.dos.MemberMessage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/** /**
* 会员消息数据处理层 * 会员接收到消息数据处理层
* *
* @author lili * @author lili
* @date 2020-02-25 14:10:16 * @date 2020-02-25 14:10:16

View File

@ -4,7 +4,7 @@ import cn.lili.modules.message.entity.dos.Message;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/** /**
* 消息内容数据处理层 * 管理端发送消息内容数据处理层
* @author Chopper * @author Chopper
* @date 2020/12/2 17:50 * @date 2020/12/2 17:50
*/ */

View File

@ -4,7 +4,7 @@ import cn.lili.modules.message.entity.dos.NoticeMessage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/** /**
* 消息模板数据处理层 * 通知类消息模板数据处理层
* *
* @author Bulbasaur * @author Bulbasaur
* @date 2020/12/8 9:46 * @date 2020/12/8 9:46

View File

@ -9,7 +9,7 @@ import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
/** /**
* 消息发送数据处理层 * 店铺接收到消息发送数据处理层
* *
* @author Chopper * @author Chopper
* @date 2021/1/30 4:17 下午 * @date 2021/1/30 4:17 下午

View File

@ -1,13 +1,15 @@
package cn.lili.modules.member.service; package cn.lili.modules.message.service;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.dos.MemberMessage; import cn.lili.modules.message.entity.dos.MemberMessage;
import cn.lili.modules.member.entity.vo.MemberMessageQueryVO; import cn.lili.modules.message.entity.vos.MemberMessageQueryVO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* 消息发送业务层 * 会员消息发送业务层
* *
* @author Chopper * @author Chopper
* @date 2020/11/17 3:44 下午 * @date 2020/11/17 3:44 下午
@ -41,4 +43,13 @@ public interface MemberMessageService extends IService<MemberMessage> {
Boolean deleteMessage(String messageId); Boolean deleteMessage(String messageId);
/**
* 保存消息信息
*
* @param messages 消息
* @return
*/
boolean save(List<MemberMessage> messages);
} }

View File

@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
/** /**
* 消息内容业务层 * 管理端发送消息内容业务层
* *
* @author Chopper * @author Chopper
* @date 2020/11/17 3:44 下午 * @date 2020/11/17 3:44 下午

View File

@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
/** /**
* 消息模板业务层 * 通知类消息模板业务层
* *
* @author Bulbasaur * @author Bulbasaur
* @date 2020/12/8 9:47 * @date 2020/12/8 9:47

View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
/** /**
* 消息发送业务层 * 店铺接收消息业务层
* *
* @author Chopper * @author Chopper
* @date 2020/11/17 3:44 下午 * @date 2020/11/17 3:44 下午
@ -34,7 +34,7 @@ public interface StoreMessageService extends IService<StoreMessage> {
IPage<StoreMessage> getPage(StoreMessageQueryVO storeMessageQueryVO, PageVO pageVO); IPage<StoreMessage> getPage(StoreMessageQueryVO storeMessageQueryVO, PageVO pageVO);
/** /**
* 保存消息信息 * 保存店铺消息信息
* *
* @param messages 消息 * @param messages 消息
* @return * @return

View File

@ -1,21 +1,23 @@
package cn.lili.modules.member.serviceimpl; package cn.lili.modules.message.serviceimpl;
import cn.lili.common.utils.PageUtil; import cn.lili.common.utils.PageUtil;
import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO; import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.dos.MemberMessage; import cn.lili.modules.message.entity.dos.MemberMessage;
import cn.lili.modules.member.entity.vo.MemberMessageQueryVO; import cn.lili.modules.message.mapper.MemberMessageMapper;
import cn.lili.modules.member.mapper.MemberMessageMapper; import cn.lili.modules.message.service.MemberMessageService;
import cn.lili.modules.member.service.MemberMessageService; import cn.lili.modules.message.entity.vos.MemberMessageQueryVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/** /**
* 会员消息业务层实现 * 会员接收消息业务层实现
* *
* @author Chopper * @author Chopper
* @date 2020/11/17 3:48 下午 * @date 2020/11/17 3:48 下午
@ -28,6 +30,8 @@ public class MemberMessageServiceImpl extends ServiceImpl<MemberMessageMapper, M
@Override @Override
public IPage<MemberMessage> getPage(MemberMessageQueryVO memberMessageQueryVO, PageVO pageVO) { public IPage<MemberMessage> getPage(MemberMessageQueryVO memberMessageQueryVO, PageVO pageVO) {
QueryWrapper<MemberMessage> queryWrapper = new QueryWrapper<>(); QueryWrapper<MemberMessage> queryWrapper = new QueryWrapper<>();
//消息id
queryWrapper.like(StringUtils.isNotEmpty(memberMessageQueryVO.getMessageId()), "message_id", memberMessageQueryVO.getMessageId());
//消息标题 //消息标题
queryWrapper.like(StringUtils.isNotEmpty(memberMessageQueryVO.getTitle()), "title", memberMessageQueryVO.getTitle()); queryWrapper.like(StringUtils.isNotEmpty(memberMessageQueryVO.getTitle()), "title", memberMessageQueryVO.getTitle());
//会员id //会员id
@ -61,4 +65,9 @@ public class MemberMessageServiceImpl extends ServiceImpl<MemberMessageMapper, M
} }
return false; return false;
} }
@Override
public boolean save(List<MemberMessage> messages) {
return saveBatch(messages);
}
} }

View File

@ -17,7 +17,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
/** /**
* 消息内容业务层实现 * 管理端发送消息内容业务层实现
* *
* @author Chopper * @author Chopper
* @date 2020/11/17 3:48 下午 * @date 2020/11/17 3:48 下午

View File

@ -22,7 +22,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Map; import java.util.Map;
/** /**
* 消息模板业务层实现 * 通知类消息模板业务层实现
* *
* @author Bulbasaur * @author Bulbasaur
* @date 2020/12/8 9:48 * @date 2020/12/8 9:48

View File

@ -98,53 +98,60 @@ public class OrderSearchParams extends PageVO {
//关键字查询 //关键字查询
if (StringUtils.isNotEmpty(keywords)) { if (StringUtils.isNotEmpty(keywords)) {
wrapper.like("o.sn", keywords); wrapper.and(queryWrapper -> wrapper.like("o.sn", keywords).or().
wrapper.like("oi.goods_name", keywords); like("oi.goods_name", keywords));
} }
//按卖家查询 //按卖家查询
if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name())) { wrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()), "o.store_id", UserContext.getCurrentUser().getStoreId());
wrapper.eq("o.store_id", UserContext.getCurrentUser().getStoreId());
} //店铺查询
if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MANAGER.name()) wrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MANAGER.name())
&& StringUtils.isNotEmpty(storeId)) { && StringUtils.isNotEmpty(storeId), "o.store_id", storeId);
wrapper.eq("o.store_id", storeId);
}
//按买家查询 //按买家查询
if (StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MEMBER.name())) { wrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.MEMBER.name()), "o.member_id", UserContext.getCurrentUser().getId());
wrapper.eq("o.member_id", UserContext.getCurrentUser().getId());
}
//按照买家查询 //按照买家查询
if (StringUtils.isNotEmpty(memberId)) { wrapper.like(StringUtils.isNotEmpty(memberId), "o.member_id", memberId);
wrapper.like("o.member_id", memberId);
}
//按订单编号查询 //按订单编号查询
if (StringUtils.isNotEmpty(orderSn)) { wrapper.like(StringUtils.isNotEmpty(orderSn), "o.sn", orderSn);
wrapper.like("o.sn", orderSn);
}
//按时间查询 //按时间查询
if (startDate != null) { wrapper.ge(startDate != null, "o.create_time", startDate);
wrapper.ge("o.create_time", startDate);
} wrapper.le(endDate != null, "o.create_time", DateUtil.endOfDate(endDate));
if (endDate != null) {
wrapper.le("o.create_time", DateUtil.endOfDate(endDate));
}
//按购买人用户名 //按购买人用户名
if (StringUtils.isNotEmpty(buyerName)) { wrapper.like(StringUtils.isNotEmpty(buyerName), "o.member_name", buyerName);
wrapper.like("o.member_name", buyerName);
}
//按订单类型 //按订单类型
if (StringUtils.isNotEmpty(orderType)) { if (StringUtils.isNotEmpty(orderType)) {
wrapper.eq("o.order_type", orderType) wrapper.and(queryWrapper-> queryWrapper.eq("o.order_type", orderType).or()
.or().eq("o.order_promotion_type", orderType); .eq("o.order_promotion_type", orderType));
} }
//物流查询
wrapper.like(StringUtils.isNotEmpty(shipName), "o.ship_name", shipName);
//按商品名称查询
wrapper.like(StringUtils.isNotEmpty(goodsName), "oi.goods_name", goodsName);
//付款方式
wrapper.like(StringUtils.isNotEmpty(paymentType), "o.payment_type", paymentType);
//按支付方式 //按支付方式
if (StringUtils.isNotEmpty(paymentMethod)) { wrapper.eq(StringUtils.isNotEmpty(paymentMethod), "o.payment_method", paymentMethod);
wrapper.eq("o.payment_method", paymentMethod);
} //订单状态
wrapper.eq(StringUtils.isNotEmpty(orderStatus), "o.order_status", orderStatus);
//付款状态
wrapper.eq(StringUtils.isNotEmpty(payStatus), "o.pay_status", payStatus);
//订单来源
wrapper.like(StringUtils.isNotEmpty(clientType), "o.client_type", clientType);
//按标签查询 //按标签查询
if (StringUtils.isNotEmpty(tag)) { if (StringUtils.isNotEmpty(tag)) {
@ -176,33 +183,7 @@ public class OrderSearchParams extends PageVO {
} }
} }
if (StringUtils.isNotEmpty(shipName)) {
wrapper.like("o.ship_name", shipName);
}
// 按商品名称查询
if (StringUtils.isNotEmpty(goodsName)) {
wrapper.like("oi.goods_name", goodsName);
}
//付款方式
if (StringUtils.isNotEmpty(paymentType)) {
wrapper.like("o.payment_type", paymentType);
}
//订单状态
if (StringUtils.isNotEmpty(orderStatus)) {
wrapper.eq("o.order_status", orderStatus);
}
//付款状态
if (StringUtils.isNotEmpty(payStatus)) {
wrapper.eq("o.pay_status", payStatus);
}
//订单来源
if (StringUtils.isNotEmpty(clientType)) {
wrapper.like("o.client_type", clientType);
}
wrapper.eq("o.delete_flag", false); wrapper.eq("o.delete_flag", false);
return wrapper; return wrapper;
} }

View File

@ -0,0 +1,45 @@
package cn.lili.controller.member;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.message.entity.dos.MemberMessage;
import cn.lili.modules.message.entity.dos.StoreMessage;
import cn.lili.modules.message.entity.vos.MemberMessageQueryVO;
import cn.lili.modules.message.entity.vos.StoreMessageQueryVO;
import cn.lili.modules.message.service.MemberMessageService;
import cn.lili.modules.message.service.StoreMessageService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 管理端,会员消息消息管理接口
*
* @author pikachu
* @date: 2020/12/6 16:09
*/
@Transactional
@RestController
@Api(tags = "管理端,会员消息消息管理接口")
@RequestMapping("/manager/message/member")
public class MemberMessageManagerController {
@Autowired
private MemberMessageService memberMessageService;
@GetMapping
@ApiOperation(value = "多条件分页获取")
public ResultMessage<IPage<MemberMessage>> getByCondition(MemberMessageQueryVO memberMessageQueryVO,
PageVO pageVo) {
IPage<MemberMessage> page = memberMessageService.getPage(memberMessageQueryVO, pageVo);
return ResultUtil.data(page);
}
}