Merge pull request #76

pg
This commit is contained in:
misworga831 2023-02-09 16:06:45 +08:00 committed by GitHub
commit 894a75beb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
53 changed files with 328 additions and 534 deletions

View File

@ -1,3 +1,6 @@
/** 优惠券活动增加领取周期字段 **/
ALTER TABLE li_coupon_activity ADD coupon_frequency_enum varchar(255) COMMENT '领取周期';
-- 会员优惠券标识
CREATE TABLE `li_member_coupon_sign` (
`id` bigint NOT NULL,

View File

@ -65,4 +65,10 @@ public class FootprintController {
return ResultUtil.data(footprintService.getFootprintNum());
}
@GetMapping("/history")
@ApiOperation(value = "获取会员的历史足迹")
public ResultMessage<IPage<EsGoodsIndex>> getMemberHistory(FootPrintQueryParams params) {
return ResultUtil.data(footprintService.footPrintPage(params));
}
}

View File

@ -128,5 +128,4 @@ public class OrderBuyerController {
return ResultUtil.data(orderService.invoice(orderSn));
}
}

View File

@ -3,6 +3,8 @@ package cn.lili.controller.passport;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.Member;
@ -264,4 +266,18 @@ public class MemberBuyerController {
return ResultUtil.data(this.memberService.refreshToken(refreshToken));
}
@GetMapping("/getImUser")
@ApiOperation(value = "获取用户信息")
public ResultMessage<Member> getImUser() {
AuthUser authUser = UserContext.getCurrentUser();
return ResultUtil.data(memberService.getById(authUser.getId()));
}
@GetMapping("/getImUserDetail/{memberId}")
@ApiImplicitParam(name = "memberId", value = "店铺Id", required = true, dataType = "String", paramType = "path")
@ApiOperation(value = "获取用户信息")
public ResultMessage<Member> getImUserDetail(@PathVariable String memberId) {
return ResultUtil.data(memberService.getById(memberId));
}
}

View File

@ -1,11 +1,13 @@
package cn.lili.controller.store;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
import cn.lili.modules.goods.service.StoreGoodsLabelService;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.dto.StoreBankDTO;
import cn.lili.modules.store.entity.dto.StoreCompanyDTO;
import cn.lili.modules.store.entity.dto.StoreOtherInfoDTO;
@ -57,6 +59,20 @@ public class StoreBuyerController {
return ResultUtil.data(storeService.findByConditionPage(entity, page));
}
@GetMapping("/store")
@ApiOperation(value = "im-获取店铺信息")
public ResultMessage<Store> getStoreUser() {
AuthUser authUser = UserContext.getCurrentUser();
return ResultUtil.data(storeService.getById(authUser.getStoreId()));
}
@GetMapping("/store/{storeId}")
@ApiImplicitParam(name = "storeId", value = "店铺Id", required = true, dataType = "String", paramType = "path")
@ApiOperation(value = "im-店铺ID获取店铺信息")
public ResultMessage<Store> getStoreUserDetail(@PathVariable String storeId) {
return ResultUtil.data(storeService.getById(storeId));
}
@ApiOperation(value = "通过id获取店铺信息")
@ApiImplicitParam(name = "id", value = "店铺ID", required = true, paramType = "path")
@GetMapping(value = "/get/detail/{id}")

View File

@ -1,8 +1,8 @@
package cn.lili.event.impl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.utils.StringUtils;
import cn.lili.event.MemberRegisterEvent;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
@ -46,7 +46,7 @@ public class RegisteredCouponActivityExecute implements MemberRegisterEvent {
.build());
//邀请人赠券
String memberId = (String) cache.get(CachePrefix.INVITER.getPrefix() + member.getId());
if (StringUtils.isNotEmpty(memberId)) {
if (CharSequenceUtil.isNotEmpty(memberId)) {
//邀请人
Member inviter = memberService.getById(memberId);
couponActivityService.trigger(CouponActivityTrigger.builder()

View File

@ -193,6 +193,7 @@ public enum ResultCode {
ORDER_NOT_USER(31007, "非当前会员的订单"),
ORDER_TAKE_ERROR(31008, "当前订单无法核销"),
MEMBER_ADDRESS_NOT_EXIST(31009, "订单无收货地址,请先配置收货地址"),
STORE_ADDRESS_NOT_EXIST(31009,"订单没有自提地址,请先选择自提地址"),
ORDER_DELIVER_NUM_ERROR(31010, "没有待发货的订单"),
ORDER_NOT_SUPPORT_DISTRIBUTION(31011, "购物车中包含不支持配送的商品,请重新选择收货地址,或者重新选择商品"),
ORDER_NOT_EXIST_VALID(31041, "购物车中无有效商品,请检查购物车内商品,或者重新选择商品"),
@ -447,6 +448,7 @@ public enum ResultCode {
ALIPAY_EXCEPTION(70003, "支付宝支付错误,请稍后重试"),
ALIPAY_PARAMS_EXCEPTION(70004, "支付宝参数异常"),
LOGISTICS_NOT_SETTING(70005, "您还未配置快递查询"),
LOGISTICS_CHECK_SETTING(70005, "操作失败,请检查您的快递鸟配置"),
ORDER_SETTING_ERROR(70006, "系统订单配置异常"),
ALI_SMS_SETTING_ERROR(70007, "您还未配置阿里云短信"),
SMS_SIGN_EXIST_ERROR(70008, "短信签名已存在"),

View File

@ -77,11 +77,7 @@ public class AuthConfig {
/**
* 针对国外服务可以单独设置代理
* HttpConfig config = new HttpConfig();
<<<<<<< HEAD
* config.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("106.124.130.167", 10080)));
=======
* config.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 10080)));
>>>>>>> ae0c4aea12996d3d72eca7c6ccdc97922373e4d7
* config.setTimeout(15000);
*
* @since 1.15.5

View File

@ -5,6 +5,7 @@ import cn.lili.modules.goods.entity.dos.Wholesale;
import cn.lili.modules.goods.entity.dto.GoodsParamsDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@ -14,6 +15,7 @@ import java.util.List;
* @author pikachu
* @since 2020-02-26 23:24:13
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class DraftGoodsVO extends DraftGoods {

View File

@ -16,6 +16,7 @@ public enum MessageResultType {
* 未读消息
* 历史消息
* 系统提示
* 下线提醒
*/
FRIENDS,
ADD_FRIENDS,
@ -23,6 +24,7 @@ public enum MessageResultType {
READ_MESSAGE,
UN_READ,
HISTORY,
SYSTEM_TIPS
SYSTEM_TIPS,
OFFLINE
}

View File

@ -2,6 +2,7 @@ package cn.lili.modules.im.entity.vo;
import cn.lili.modules.im.entity.enums.MessageResultType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
/**
@ -12,6 +13,7 @@ import lombok.Data;
* 2021-12-30 15:51
*/
@Data
@Builder
@AllArgsConstructor
public class MessageVO {

View File

@ -194,10 +194,11 @@ public class KdNiaoServiceImpl implements KdNiaoService {
params.put("DataType", "2");
// 以form表单形式提交post请求post请求体中包含了应用级参数和系统级参数
String result = sendPost(ReqURL, params);
if(CharSequenceUtil.isEmpty(result) || CharSequenceUtil.isBlank(result)){
throw new ServiceException(ResultCode.LOGISTICS_CHECK_SETTING);
}
//根据公司业务处理返回的信息......
JSONObject obj = JSONObject.parseObject(result);
log.info("电子面单响应:{}",result);
if(!"100".equals(obj.getString("ResultCode"))){
return obj.getString("Reason");

View File

@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -15,6 +16,7 @@ import lombok.NoArgsConstructor;
* @author Chopper
* @since 2020/11/17 7:22 下午
*/
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_foot_print")
@ApiModel(value = "浏览历史")

View File

@ -1,9 +1,9 @@
package cn.lili.modules.member.entity.dos;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.SwitchEnum;
import cn.lili.common.security.sensitive.Sensitive;
import cn.lili.common.security.sensitive.enums.SensitiveStrategy;
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.member.entity.dto.MemberEvaluationDTO;
import cn.lili.modules.order.order.entity.dos.Order;
@ -131,7 +131,7 @@ public class MemberEvaluation extends BaseEntity {
//设置订单编号
this.orderNo = order.getSn();
//是否包含图片
this.haveImage = StringUtils.isNotEmpty(memberEvaluationDTO.getImages());
this.haveImage = CharSequenceUtil.isNotEmpty(memberEvaluationDTO.getImages());
//默认开启评价
this.status = SwitchEnum.OPEN.name();
}

View File

@ -89,5 +89,4 @@ public interface StoreLogisticsService extends IService<StoreLogistics> {
*/
List<StoreLogisticsVO> getCloseStoreLogistics(String storeId);
}

View File

@ -4,7 +4,6 @@ import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.dos.Clerk;
@ -20,7 +19,6 @@ import cn.lili.modules.member.service.*;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -60,9 +58,8 @@ public class ClerkServiceImpl extends ServiceImpl<ClerkMapper, Clerk> implements
clerkVOQueryWrapper.eq(StringUtils.isNotEmpty(clerkQueryDTO.getDepartmentId()), "li_clerk.department_id", clerkQueryDTO.getDepartmentId());
clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getClerkName()), "li_clerk.clerk_name", clerkQueryDTO.getClerkName());
clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getMobile()), "m.mobile", clerkQueryDTO.getMobile());
IPage<ClerkVO> clerkPage = this.baseMapper.selectClerkPage(PageUtil.initPage(page), clerkVOQueryWrapper);
return clerkPage;
return this.baseMapper.selectClerkPage(PageUtil.initPage(page), clerkVOQueryWrapper);
/*Page<Clerk> clerkPage = page(initPage, initWrapper);

View File

@ -42,7 +42,6 @@ import cn.lili.modules.store.service.StoreService;
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;
@ -189,8 +188,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
@Override
public Token usernameStoreLogin(String username, String password) {
// Member member = this.findMember(username);
Member member = this.getOne(new LambdaQueryWrapper<Member>().eq(Member::getMobile,username));
Member member = this.findMember(username);
//判断用户是否存在
if (member == null || !member.getDisabled()) {
throw new ServiceException(ResultCode.USER_NOT_EXIST);

View File

@ -73,7 +73,7 @@ public class MemberSignServiceImpl extends ServiceImpl<MemberSignMapper, MemberS
LambdaQueryWrapper<MemberSign> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MemberSign::getMemberId, authUser.getId());
List<MemberSign> signSize = this.baseMapper.getTodayMemberSign(queryWrapper);
if (signSize.size() > 0) {
if (signSize.isEmpty()) {
throw new ServiceException(ResultCode.MEMBER_SIGN_REPEAT);
}
//当前签到天数的前一天日期

View File

@ -455,7 +455,10 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
switch (afterSaleStatusEnum) {
//判断当前售后的状态---申请中
case APPLY: {
// 买家申请售后时已经输入了订单售后数量这里不需要(+x)处理
orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() + afterSale.getNum());
//修改orderItem订单
this.updateOrderItem(orderItem);
break;
}
@ -464,13 +467,13 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
case BUYER_CANCEL:
case SELLER_TERMINATION: {
orderItem.setReturnGoodsNumber(orderItem.getReturnGoodsNumber() - afterSale.getNum());
//修改orderItem订单
this.updateOrderItem(orderItem);
break;
}
default:
break;
}
//修改orderItem订单
this.updateOrderItem(orderItem);
}

View File

@ -3,6 +3,7 @@ package cn.lili.modules.order.cart.entity.vo;
import cn.lili.modules.distribution.entity.dos.DistributionGoods;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
import cn.lili.modules.promotion.tools.PromotionTools;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -89,6 +90,12 @@ public class CartSkuVO extends CartBase implements Serializable {
@ApiModelProperty(value = "购物车类型")
private CartTypeEnum cartType;
/**
* @see DeliveryMethodEnum
*/
@ApiModelProperty(value = "配送方式")
private String deliveryMethod;
/**
* 在构造器里初始化促销列表规格列表
*/

View File

@ -81,6 +81,7 @@ public class CartVO extends CartBase implements Serializable {
public CartVO(CartSkuVO cartSkuVO) {
this.setStoreId(cartSkuVO.getStoreId());
this.setStoreName(cartSkuVO.getStoreName());
this.setDeliveryMethod(cartSkuVO.getDeliveryMethod());
this.setSkuList(new ArrayList<>());
this.setCouponList(new ArrayList<>());
this.setGiftList(new ArrayList<>());

View File

@ -36,10 +36,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -108,29 +105,36 @@ public class CheckDataRender implements CartRenderStep {
//缓存中的商品信息
GoodsSku dataSku = goodsSkuService.getGoodsSkuByIdFromCache(cartSkuVO.getGoodsSku().getId());
Map<String, Object> promotionMap = promotionGoodsService.getCurrentGoodsPromotion(dataSku, tradeDTO.getCartTypeEnum().name());
//商品有效性判定
if (dataSku == null || dataSku.getUpdateTime().after(cartSkuVO.getGoodsSku().getUpdateTime())) {
//商品失效,将商品移除并重新填充商品
cartSkuVOS.remove(cartSkuVO);
//设置新商品
CartSkuVO newCartSkuVO = new CartSkuVO(dataSku,promotionMap);
newCartSkuVO.setCartType(tradeDTO.getCartTypeEnum());
newCartSkuVO.setNum(cartSkuVO.getNum());
newCartSkuVO.setSubTotal(CurrencyUtil.mul(newCartSkuVO.getPurchasePrice(), cartSkuVO.getNum()));
cartSkuVOS.add(newCartSkuVO);
continue;
}
//商品上架状态判定
if (!GoodsAuthEnum.PASS.name().equals(dataSku.getAuthFlag()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable())) {
boolean checkGoodsStatus = dataSku == null || !GoodsAuthEnum.PASS.name().equals(dataSku.getAuthFlag()) || !GoodsStatusEnum.UPPER.name().equals(dataSku.getMarketEnable());
//商品有效性判定
boolean checkGoodsValid = dataSku != null && dataSku.getUpdateTime() != null && dataSku.getUpdateTime().after(cartSkuVO.getGoodsSku().getUpdateTime());
Map<String, Object> promotionMap = dataSku != null ? promotionGoodsService.getCurrentGoodsPromotion(dataSku, tradeDTO.getCartTypeEnum().name()) : null;
log.info("dataSku: {}, goodsSku: {}", dataSku, cartSkuVO.getGoodsSku());
if (checkGoodsStatus || checkGoodsValid) {
if (checkGoodsStatus) {
//设置购物车未选中
cartSkuVO.setChecked(false);
//设置购物车此sku商品已失效
cartSkuVO.setInvalid(true);
//设置失效消息
cartSkuVO.setErrorMessage("商品已下架");
}
if (checkGoodsValid) {
CartSkuVO newCartSkuVO = new CartSkuVO(dataSku,promotionMap);
newCartSkuVO.setCartType(tradeDTO.getCartTypeEnum());
newCartSkuVO.setNum(cartSkuVO.getNum());
newCartSkuVO.setSubTotal(CurrencyUtil.mul(newCartSkuVO.getPurchasePrice(), cartSkuVO.getNum()));
cartSkuVO = newCartSkuVO;
log.info("商品信息已更新,更新后的商品信息为:{}", cartSkuVO);
}
continue;
}
//商品库存判定
if (dataSku.getQuantity() < cartSkuVO.getNum()) {
//设置购物车未选中

View File

@ -116,6 +116,9 @@ public class SkuFreightRender implements CartRenderStep {
}
}
}
}else{
//自提清空不配送商品
tradeDTO.setNotSupportFreight(null);
}
}

View File

@ -492,12 +492,11 @@ public class CartServiceImpl implements CartService {
if (CharSequenceUtil.isNotEmpty(way)) {
cartTypeEnum = CartTypeEnum.valueOf(way);
}
TradeDTO tradeDTO = this.getCheckedTradeDTO(cartTypeEnum);
for (CartVO cartVO : tradeDTO.getCartList()) {
cartVO.setDeliveryMethod(DeliveryMethodEnum.valueOf(deliveryMethod).name());
TradeDTO tradeDTO = this.readDTO(cartTypeEnum);
for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) {
cartSkuVO.setDeliveryMethod(DeliveryMethodEnum.valueOf(deliveryMethod).name());
}
this.resetTradeDTO(tradeDTO);
TradeDTO neTradeDTO = (TradeDTO) cache.get(this.getOriginKey(cartTypeEnum));
}
/**

View File

@ -1,6 +1,7 @@
package cn.lili.modules.order.order.entity.vo;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
@ -69,10 +70,11 @@ public class AllowOperation implements Serializable {
//新订单允许支付
this.pay = status.equals(OrderStatusEnum.UNPAID.name()) && payStatus.equals(PayStatusEnum.UNPAID.name());
//可编辑订单收件人信息=实物订单 && 订单未发货 && 订单未取消
//可编辑订单收件人信息=实物订单 && 订单未发货 && 订单未取消 && 订单不是自提
this.editConsignee = order.getOrderType().equals(OrderTypeEnum.NORMAL.name())
&& order.getDeliverStatus().equals(DeliverStatusEnum.UNDELIVERED.name())
&& !status.equals(OrderStatusEnum.CANCELLED.name());
&& !status.equals(OrderStatusEnum.CANCELLED.name())
&& !order.getDeliveryMethod().equals(DeliveryMethodEnum.SELF_PICK_UP.name());
//是否允许被发货
this.ship = editConsignee && status.equals(OrderStatusEnum.UNDELIVERED.name());
@ -83,7 +85,8 @@ public class AllowOperation implements Serializable {
//是否允许查看物流信息
this.showLogistics = order.getDeliverStatus().equals(DeliverStatusEnum.DELIVERED.name()) && status.equals(OrderStatusEnum.DELIVERED.name());
this.take = order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name());
//虚拟订单 自提订单可以核销
this.take = (order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name()) && order.getOrderStatus().equals(OrderStatusEnum.TAKE.name())) || (order.getDeliveryMethod().equals(DeliveryMethodEnum.SELF_PICK_UP.name()) && order.getOrderStatus().equals(OrderStatusEnum.STAY_PICKED_UP.name()));
}
/**

View File

@ -1002,12 +1002,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
if (order == null) {
throw new ServiceException(ResultCode.ORDER_NOT_EXIST);
}
//判断是否为虚拟订单
if (!order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name())) {
//判断是否为虚拟订单 自提订单
if (!order.getOrderType().equals(OrderTypeEnum.VIRTUAL.name()) && !order.getDeliveryMethod().equals(DeliveryMethodEnum.SELF_PICK_UP.name())) {
throw new ServiceException(ResultCode.ORDER_TAKE_ERROR);
}
//判断虚拟订单状态
if (!order.getOrderStatus().equals(OrderStatusEnum.TAKE.name())) {
//判断虚拟订单状态 待自提
if (!order.getOrderStatus().equals(OrderStatusEnum.TAKE.name()) && !order.getOrderStatus().equals(OrderStatusEnum.STAY_PICKED_UP.name())) {
throw new ServiceException(ResultCode.ORDER_TAKE_ERROR);
}
//判断验证码是否正确

File diff suppressed because one or more lines are too long

View File

@ -4,8 +4,6 @@ import cn.lili.common.utils.SnowFlake;
import cn.lili.common.utils.SpringContextUtil;
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.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;
@ -35,11 +33,6 @@ public class RefundSupport {
*/
@Autowired
private OrderService orderService;
/**
* 子订单
*/
@Autowired
private OrderItemService orderItemService;
/**
* 售后退款
@ -64,31 +57,10 @@ public class RefundSupport {
Payment payment = (Payment) SpringContextUtil.getBean(paymentMethodEnum.getPlugin());
payment.refund(refundLog);
this.updateReturnGoodsNumber(afterSale);
//记录退款流水
storeFlowService.refundOrder(afterSale);
}
/**
* 功能描述: 修改子订单中已售后退款商品数量
*
* @return void
* @Author ftyy
* @Date 17:33 2021/11/18
* @Param [afterSale]
**/
private void updateReturnGoodsNumber(AfterSale afterSale) {
//根据商品id及订单sn获取子订单
OrderItem orderItem = orderItemService.getByOrderSnAndSkuId(afterSale.getOrderSn(), afterSale.getSkuId());
orderItem.setReturnGoodsNumber(afterSale.getNum() + orderItem.getReturnGoodsNumber());
//修改子订单订单中的退货数量
orderItemService.updateById(orderItem);
}
/**
* 退款通知
*

View File

@ -23,6 +23,7 @@ import javax.validation.constraints.NotNull;
@ApiModel(value = "优惠券活动实体类")
public class CouponActivity extends BasePromotions {
private static final long serialVersionUID = 4230258450334305951L;
/**
* @see CouponActivityTypeEnum
*/

View File

@ -5,6 +5,7 @@ import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* MemberCouponVO
@ -15,6 +16,7 @@ import lombok.EqualsAndHashCode;
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
public class MemberCouponVO extends MemberCoupon {
private static final long serialVersionUID = -5533168813075444962L;
@ -30,7 +32,4 @@ public class MemberCouponVO extends MemberCoupon {
this.reason = reason;
}
public MemberCouponVO(){
}
}

View File

@ -7,7 +7,7 @@ import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.dto.GoodsSkuDTO;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dto.search.PromotionGoodsSearchParams;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Date;
@ -60,7 +60,7 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
* @param pageVo 分页参数
* @return 促销商品列表
*/
IPage<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo);
Page<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo);
/**
* 获取促销商品信息

View File

@ -29,7 +29,7 @@ import cn.lili.mybatis.util.PageUtil;
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.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
@ -115,7 +115,7 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
}
@Override
public IPage<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo) {
public Page<PromotionGoods> pageFindAll(PromotionGoodsSearchParams searchParams, PageVO pageVo) {
return this.page(PageUtil.initPage(pageVo), searchParams.queryWrapper());
}

View File

@ -257,10 +257,6 @@ public class SeckillApplyServiceImpl extends ServiceImpl<SeckillApplyMapper, Sec
}
/**
<<<<<<< HEAD
=======
<<<<<<< HEAD
>>>>>>> origin/master
* 更新秒杀活动时间
*
* @param seckill 秒杀活动

View File

@ -135,10 +135,6 @@ public class SeckillServiceImpl extends AbstractPromotionsServiceImpl<SeckillMap
}
/**
* <<<<<<< HEAD
* =======
* <<<<<<< HEAD
* >>>>>>> origin/master
* 通用促销更新
* 调用顺序:
* 1. checkStatus 检查促销状态

View File

@ -214,15 +214,15 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
List<Map<String, Object>> brandList = new ArrayList<>();
if (CollUtil.isNotEmpty(brandIds)) {
brandList = this.brandService.getBrandsMapsByCategory(brandIds, "id,name,logo");
brandList = this.brandService.getBrandsMapsByCategory(CollUtil.distinct(brandIds), "id,name,logo");
}
List<Map<String, Object>> categoryList = new ArrayList<>();
if (CollUtil.isNotEmpty(categoryList)) {
categoryList = this.categoryService.listMapsByIdsOrderByLevel(categoryPaths, "id,name");
if (CollUtil.isNotEmpty(categoryPaths)) {
categoryList = this.categoryService.listMapsByIdsOrderByLevel(CollUtil.distinct(categoryPaths), "id,name");
}
List<Map<String, Object>> storeCategoryList = new ArrayList<>();
if (CollUtil.isNotEmpty(storeCategoryList)) {
storeCategoryList = this.storeGoodsLabelService.listMapsByStoreIds(storeCategoryPaths, "id,label_name");
if (CollUtil.isNotEmpty(storeCategoryPaths)) {
storeCategoryList = this.storeGoodsLabelService.listMapsByStoreIds(CollUtil.distinct(storeCategoryPaths), "id,label_name");
}
for (GoodsSkuDTO goodsSku : skuIPage.getRecords()) {
@ -913,9 +913,11 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
if (CollUtil.isNotEmpty(categoryList) && CharSequenceUtil.isNotEmpty(goodsSku.getCategoryPath())) {
StringBuilder categoryNamePath = new StringBuilder();
categoryList.stream().filter(o -> goodsSku.getCategoryPath().contains(o.get("id").toString())).forEach(p -> categoryNamePath.append(p.get("name")).append(","));
if (CharSequenceUtil.isNotEmpty(categoryNamePath)) {
categoryNamePath.deleteCharAt(categoryNamePath.length() - 1);
index.setCategoryNamePath(categoryNamePath.toString());
}
}
//商品品牌索引
if (CollUtil.isNotEmpty(brandList) && CharSequenceUtil.isNotEmpty(goodsSku.getBrandId())) {
Optional<Map<String, Object>> brandInfo = brandList.stream().filter(p -> p.get("id").equals(goodsSku.getBrandId())).findFirst();
@ -928,9 +930,11 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
if (CollUtil.isNotEmpty(storeCategoryList) && CharSequenceUtil.isNotEmpty(goodsSku.getStoreCategoryPath())) {
StringBuilder storeCategoryNamePath = new StringBuilder();
storeCategoryList.stream().filter(o -> goodsSku.getStoreCategoryPath().contains(o.get("id").toString())).forEach(p -> storeCategoryNamePath.append(p.get("label_name").toString()).append(","));
if (CharSequenceUtil.isNotEmpty(storeCategoryNamePath)) {
storeCategoryNamePath.deleteCharAt(storeCategoryNamePath.length() - 1);
index.setStoreCategoryNamePath(storeCategoryNamePath.toString());
}
}
return index;
}
}

View File

@ -120,8 +120,6 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
@Override
public List<EsGoodsIndex> getEsGoodsBySkuIds(List<String> skuIds, PageVO pageVo) {
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
NativeSearchQuery build = searchQueryBuilder.build();
build.setIds(skuIds);
if (pageVo != null) {
int pageNumber = pageVo.getPageNumber() - 1;
if (pageNumber < 0) {
@ -131,6 +129,8 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
//分页
searchQueryBuilder.withPageable(pageable);
}
NativeSearchQuery build = searchQueryBuilder.build();
build.setIds(skuIds);
return restTemplate.multiGet(build, EsGoodsIndex.class, restTemplate.getIndexCoordinatesFor(EsGoodsIndex.class));
}

View File

@ -15,7 +15,10 @@ import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.search.utils.EsIndexUtil;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.dos.StoreDetail;
import cn.lili.modules.store.entity.dto.*;
import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO;
import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO;
import cn.lili.modules.store.entity.dto.StoreSettingDTO;
import cn.lili.modules.store.entity.dto.StoreSettlementDay;
import cn.lili.modules.store.entity.vos.StoreBasicInfoVO;
import cn.lili.modules.store.entity.vos.StoreDetailVO;
import cn.lili.modules.store.entity.vos.StoreManagementCategoryVO;
@ -25,7 +28,6 @@ import cn.lili.modules.store.service.StoreDetailService;
import cn.lili.modules.store.service.StoreService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import cn.lili.rocketmq.tags.MemberTagsEnum;
import cn.lili.rocketmq.tags.StoreTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -100,6 +102,7 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
boolean result = storeService.updateById(store);
if (result) {
this.updateStoreGoodsInfo(store);
this.removeCache(store.getId());
}
String destination = rocketmqCustomProperties.getStoreTopic() + ":" + StoreTagsEnum.EDIT_STORE_SETTING.name();
//发送订单变更mq消息
@ -125,6 +128,7 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
AuthUser tokenUser = Objects.requireNonNull(UserContext.getCurrentUser());
Store store = storeService.getById(tokenUser.getStoreId());
store.setMerchantEuid(merchantEuid);
this.removeCache(store.getId());
return storeService.updateById(store);
}
@ -164,6 +168,9 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
lambdaUpdateWrapper.set(StoreDetail::getSalesConsignorAddressPath, storeDeliverGoodsAddressDto.getSalesConsignorAddressPath());
lambdaUpdateWrapper.set(StoreDetail::getSalesConsignorDetail, storeDeliverGoodsAddressDto.getSalesConsignorDetail());
lambdaUpdateWrapper.eq(StoreDetail::getStoreId, storeId);
this.removeCache(storeId);
return this.update(lambdaUpdateWrapper);
}
@ -175,6 +182,7 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
*/
@Override
public void updateSettlementDay(String storeId, DateTime dateTime) {
this.removeCache(storeId);
this.baseMapper.updateSettlementDay(storeId, dateTime);
}
@ -209,6 +217,8 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
lambdaUpdateWrapper.set(StoreDetail::getSalesConsigneeDetail, storeAfterSaleAddressDTO.getSalesConsigneeDetail());
lambdaUpdateWrapper.set(StoreDetail::getSalesConsigneeMobile, storeAfterSaleAddressDTO.getSalesConsigneeMobile());
lambdaUpdateWrapper.eq(StoreDetail::getStoreId, storeId);
this.removeCache(storeId);
return this.update(lambdaUpdateWrapper);
}
@ -219,6 +229,7 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
LambdaUpdateWrapper<StoreDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.set(StoreDetail::getStockWarning, stockWarning);
lambdaUpdateWrapper.eq(StoreDetail::getStoreId, storeId);
this.removeCache(storeId);
return this.update(lambdaUpdateWrapper);
}
@ -249,4 +260,14 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
return this.baseMapper.getLicencePhoto(storeId);
}
/**
* 删除缓存
*
* @param storeId 店铺id
*/
private void removeCache(String storeId) {
cache.remove(CachePrefix.STORE.getPrefix() + storeId);
}
}

View File

@ -1,83 +0,0 @@
package cn.lili.controller.goods;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.search.service.EsGoodsSearchService;
import cn.lili.modules.search.service.HotWordsService;
import cn.lili.modules.statistics.aop.PageViewPoint;
import cn.lili.modules.statistics.aop.enums.PageViewEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
/**
* IM端,商品接口
*
* @author chc
* @since 2022-12-28 18:30:33
*/
@Slf4j
@Api(tags = "IM端,商品接口")
@RestController
@RequestMapping("/im/goods/goods")
public class GoodsImController {
/**
* 商品
*/
@Autowired
private GoodsService goodsService;
/**
* 商品SKU
*/
@Autowired
private GoodsSkuService goodsSkuService;
/**
* ES商品搜索
*/
@Autowired
private EsGoodsSearchService goodsSearchService;
@Autowired
private HotWordsService hotWordsService;
@ApiOperation(value = "通过id获取商品信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path"),
@ApiImplicitParam(name = "skuId", value = "skuId", required = true, paramType = "path")
})
@GetMapping(value = "/sku/{goodsId}/{skuId}")
@PageViewPoint(type = PageViewEnum.SKU, id = "#id")
public ResultMessage<Map<String, Object>> getSku(@NotNull(message = "商品ID不能为空") @PathVariable("goodsId") String goodsId,
@NotNull(message = "SKU ID不能为空") @PathVariable("skuId") String skuId) {
try {
// 读取选中的列表
Map<String, Object> map = goodsSkuService.getGoodsSkuDetail(goodsId, skuId);
return ResultUtil.data(map);
} catch (ServiceException se) {
log.info(se.getMsg(), se);
throw se;
} catch (Exception e) {
log.error(ResultCode.GOODS_ERROR.message(), e);
return ResultUtil.error(ResultCode.GOODS_ERROR);
}
}
}

View File

@ -1,175 +0,0 @@
package cn.lili.controller.im;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
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.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.common.vo.SearchVO;
import cn.lili.modules.permission.entity.dos.AdminUser;
import cn.lili.modules.permission.entity.dto.AdminUserDTO;
import cn.lili.modules.permission.entity.vo.AdminUserVO;
import cn.lili.modules.permission.service.AdminUserService;
import cn.lili.modules.permission.service.DepartmentService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
@Slf4j
@RestController
@Api(tags = "管理员")
@RequestMapping("/im/manager/im/passport/user")
@Validated
public class ImManagerController {
@Autowired
private AdminUserService adminUserService;
@Autowired
private DepartmentService departmentService;
@PostMapping(value = "/login")
@ApiOperation(value = "登录管理员")
public ResultMessage<Token> login(@NotNull(message = "用户名不能为空") String username,
@NotNull(message = "密码不能为空") String password) {
return ResultUtil.data(adminUserService.login(username, password));
}
@ApiOperation(value = "注销接口")
@PostMapping("/logout")
public ResultMessage<Object> logout() {
this.adminUserService.logout(UserEnums.MANAGER);
return ResultUtil.success();
}
@ApiOperation(value = "刷新token")
@GetMapping("/refresh/{refreshToken}")
public ResultMessage<Object> refreshToken(@NotNull(message = "刷新token不能为空") @PathVariable String refreshToken) {
return ResultUtil.data(this.adminUserService.refreshToken(refreshToken));
}
@GetMapping(value = "/info")
@ApiOperation(value = "获取当前登录用户接口")
public ResultMessage<AdminUserVO> getUserInfo() {
AuthUser tokenUser = UserContext.getCurrentUser();
if (tokenUser != null) {
AdminUserVO adminUser = new AdminUserVO(adminUserService.findByUsername(tokenUser.getUsername()));
if (StringUtils.isNotEmpty(adminUser.getDepartmentId())) {
adminUser.setDepartmentTitle(departmentService.getById(adminUser.getDepartmentId()).getTitle());
}
adminUser.setPassword(null);
return ResultUtil.data(adminUser);
}
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
}
@PutMapping(value = "/edit")
@ApiOperation(value = "修改用户自己资料", notes = "用户名密码不会修改")
public ResultMessage<Object> editOwner(AdminUser adminUser) {
AuthUser tokenUser = UserContext.getCurrentUser();
if (tokenUser != null) {
//查询当前管理员
AdminUser oldAdminUser = adminUserService.findByUsername(tokenUser.getUsername());
oldAdminUser.setAvatar(adminUser.getAvatar());
oldAdminUser.setNickName(adminUser.getNickName());
if (!adminUserService.updateById(oldAdminUser)) {
throw new ServiceException(ResultCode.USER_EDIT_ERROR);
}
return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS);
}
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
}
@PutMapping(value = "/admin/edit")
@ApiOperation(value = "超级管理员修改其他管理员资料")
public ResultMessage<Object> edit(@Valid AdminUser adminUser,
@RequestParam(required = false) List<String> roles) {
if (!adminUserService.updateAdminUser(adminUser, roles)) {
throw new ServiceException(ResultCode.USER_EDIT_ERROR);
}
return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS);
}
/**
* 修改密码
*
* @param password
* @param newPassword
* @return
*/
@PutMapping(value = "/editPassword")
@ApiOperation(value = "修改密码")
public ResultMessage<Object> editPassword(String password, String newPassword) {
adminUserService.editPassword(password, newPassword);
return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS);
}
@PostMapping(value = "/resetPassword/{ids}")
@ApiOperation(value = "重置密码")
public ResultMessage<Object> resetPassword(@PathVariable List ids) {
adminUserService.resetPassword(ids);
return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS);
}
@GetMapping
@ApiOperation(value = "多条件分页获取用户列表")
public ResultMessage<IPage<AdminUserVO>> getByCondition(AdminUserDTO user,
SearchVO searchVo,
PageVO pageVo) {
IPage<AdminUserVO> page = adminUserService.adminUserPage(PageUtil.initPage(pageVo), PageUtil.initWrapper(user, searchVo));
return ResultUtil.data(page);
}
@PostMapping
@ApiOperation(value = "添加用户")
public ResultMessage<Object> register(@Valid AdminUserDTO adminUser,
@RequestParam(required = false) List<String> roles) {
int rolesMaxSize = 10;
try {
if (roles != null && roles.size() >= rolesMaxSize) {
throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN);
}
adminUserService.saveAdminUser(adminUser, roles);
} catch (Exception e) {
log.error("添加用户错误", e);
}
return ResultUtil.success();
}
@PutMapping(value = "/enable/{userId}")
@ApiOperation(value = "禁/启 用 用户")
public ResultMessage<Object> disable(@ApiParam("用户唯一id标识") @PathVariable String userId, Boolean status) {
AdminUser user = adminUserService.getById(userId);
if (user == null) {
throw new ServiceException(ResultCode.USER_NOT_EXIST);
}
user.setStatus(status);
adminUserService.updateById(user);
return ResultUtil.success();
}
@DeleteMapping(value = "/{ids}")
@ApiOperation(value = "批量通过ids删除")
public ResultMessage<Object> delAllByIds(@PathVariable List<String> ids) {
adminUserService.deleteCompletely(ids);
return ResultUtil.success();
}
}

View File

@ -5,7 +5,6 @@ import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
import cn.lili.modules.member.service.FootprintService;

View File

@ -1,6 +1,6 @@
package cn.lili.controller.im;
import cn.lili.cache.Cache;
import cn.hutool.json.JSONUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
@ -12,11 +12,10 @@ import cn.lili.modules.im.entity.vo.MessageOperation;
import cn.lili.modules.im.entity.vo.MessageVO;
import cn.lili.modules.im.service.ImMessageService;
import cn.lili.modules.im.service.ImTalkService;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.store.service.StoreService;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@ -35,53 +34,46 @@ import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint(value = "/lili/webSocket/{accessToken}", configurator = CustomSpringConfigurator.class)
@Scope("prototype")
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class WebSocketServer {
/**
* 消息服务
*/
@Autowired
private ImMessageService imMessageService;
private final ImMessageService imMessageService;
/**
* im用户服务
*/
@Autowired
private MemberService memberService;
private final ImTalkService imTalkService;
@Autowired
private StoreService storeService;
@Autowired
private ImTalkService imTalkService;
@Autowired
private Cache cache;
/**
* 在线人数
* PS 注意只能单节点如果多节点部署需要自行寻找方案
*/
private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
/**
* 建立连接
*
* @param session
*/
@OnOpen
public void onOpen(@PathParam("accessToken") String accessToken, Session session) throws IOException {
AuthUser authUser = UserContext.getAuthUser(accessToken);
Object message = null;
if (UserEnums.STORE.equals(authUser.getRole())) {
message = storeService.getById(authUser.getStoreId());
sessionPools.put(authUser.getStoreId(), session);
public void onOpen(@PathParam("accessToken") String accessToken, Session session) {
} else if (UserEnums.MEMBER.equals(authUser.getRole())) {
message = memberService.getById(authUser.getId());
sessionPools.put(authUser.getId(), session);
AuthUser authUser = UserContext.getAuthUser(accessToken);
String sessionId = UserEnums.STORE.equals(authUser.getRole()) ? authUser.getStoreId() : authUser.getId();
//如果已有会话则进行下线提醒
if (sessionPools.containsKey(sessionId)) {
log.info("用户重复登陆,旧用户下线");
Session oldSession = sessionPools.get(sessionId);
sendMessage(oldSession, MessageVO.builder().messageResultType(MessageResultType.OFFLINE).result("用户异地登陆").build());
try {
oldSession.close();
} catch (Exception e) {
e.printStackTrace();
}
MessageVO messageVO = new MessageVO(MessageResultType.FRIENDS, message);
sendMessage(authUser.getId(), messageVO);
}
sessionPools.put(sessionId, session);
}
/**
@ -89,8 +81,9 @@ public class WebSocketServer {
*/
@OnClose
public void onClose(@PathParam("accessToken") String accessToken) {
log.info("断开连接:{}", accessToken);
sessionPools.remove(UserContext.getAuthUser(accessToken).getId());
AuthUser authUser = UserContext.getAuthUser(accessToken);
log.info("用户断开断开连接:{}", JSONUtil.toJsonStr(authUser));
sessionPools.remove(authUser);
}
/**
@ -101,7 +94,7 @@ public class WebSocketServer {
*/
@OnMessage
public void onMessage(@PathParam("accessToken") String accessToken, String msg) {
log.error(msg);
log.info("发送消息:{}", msg);
MessageOperation messageOperation = JSON.parseObject(msg, MessageOperation.class);
operation(accessToken, messageOperation);
}
@ -148,15 +141,25 @@ public class WebSocketServer {
/**
* 发送消息
*
* @param key 密钥
* @param sessionId sessionId
* @param message 消息对象
*/
private void sendMessage(String key, MessageVO message) {
Session session = sessionPools.get(key);
private void sendMessage(String sessionId, MessageVO message) {
Session session = sessionPools.get(sessionId);
sendMessage(session, message);
}
/**
* 发送消息
*
* @param session 会话
* @param message 消息对象
*/
private void sendMessage(Session session, MessageVO message) {
if (session != null) {
try {
session.getBasicRemote().sendText(JSON.toJSONString(message, true));
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
}
}
@ -170,16 +173,8 @@ public class WebSocketServer {
*/
@OnError
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
log.error("socket异常: {}", session.getId(), throwable);
}
/**
* 获取店铺id
*
* @return
*/
private String storeKey(String storeId) {
return "STORE_" + storeId;
}
}

View File

@ -1,42 +0,0 @@
package cn.lili.controller.orders;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.im.entity.dto.ImQueryParams;
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
import cn.lili.modules.order.order.entity.vo.OrderSimpleVO;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* IM端,订单接口
*
* @author chc
* @since 2022/6/2114:46
*/
@Slf4j
@Api(tags = "IM端,订单接口")
@RestController
@RequestMapping("/im/orders/orders")
public class ImOrderComtroller {
@Autowired
private OrderService orderService;
@GetMapping("")
@ApiOperation(value = "获取会员订单列表")
public ResultMessage<IPage<OrderSimpleVO>> getMemberHistory(OrderSearchParams params) {
return ResultUtil.data(orderService.queryByParams(params));
}
}

View File

@ -1,4 +1,4 @@
package cn.lili.controller.im;
package cn.lili.controller.store.im;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.PageVO;

View File

@ -1,4 +1,4 @@
package cn.lili.controller.seat;
package cn.lili.controller.store.seat;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;

View File

@ -1,4 +1,4 @@
package cn.lili.controller.seat;
package cn.lili.controller.store.seat;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;

View File

@ -1,4 +1,4 @@
package cn.lili.controller.seat;
package cn.lili.controller.store.seat;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;

View File

@ -1,4 +1,4 @@
package cn.lili.controller.seat;
package cn.lili.controller.store.seat;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;

View File

@ -1,7 +1,9 @@
package cn.lili.controller.goods;
import cn.lili.common.aop.annotation.DemoSite;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.security.OperationalJudgment;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
@ -16,6 +18,8 @@ import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.goods.entity.vos.StockWarningVO;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.statistics.aop.PageViewPoint;
import cn.lili.modules.statistics.aop.enums.PageViewEnum;
import cn.lili.modules.store.entity.dos.StoreDetail;
import cn.lili.modules.store.service.StoreDetailService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -24,11 +28,14 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@ -39,6 +46,7 @@ import java.util.stream.Collectors;
* @since 2020-02-23 15:18:56
*/
@RestController
@Slf4j
@Api(tags = "店铺端,商品接口")
@RequestMapping("/store/goods/goods")
public class GoodsStoreController {
@ -174,4 +182,27 @@ public class GoodsStoreController {
return ResultUtil.success();
}
@ApiOperation(value = "通过id获取商品信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "goodsId", value = "商品ID", required = true, paramType = "path"),
@ApiImplicitParam(name = "skuId", value = "skuId", required = true, paramType = "path")
})
@GetMapping(value = "/sku/{goodsId}/{skuId}")
@PageViewPoint(type = PageViewEnum.SKU, id = "#id")
public ResultMessage<Map<String, Object>> getSku(@NotNull(message = "商品ID不能为空") @PathVariable("goodsId") String goodsId,
@NotNull(message = "SKU ID不能为空") @PathVariable("skuId") String skuId) {
try {
// 读取选中的列表
Map<String, Object> map = goodsSkuService.getGoodsSkuDetail(goodsId, skuId);
return ResultUtil.data(map);
} catch (ServiceException se) {
log.info(se.getMsg(), se);
throw se;
} catch (Exception e) {
log.error(ResultCode.GOODS_ERROR.message(), e);
return ResultUtil.error(ResultCode.GOODS_ERROR);
}
}
}

View File

@ -0,0 +1,39 @@
package cn.lili.controller.member;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
import cn.lili.modules.member.service.FootprintService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 商家端,浏览历史接口
*
* @author chc
* @since 2022/6/2114:46
*/
@RestController
@Api(tags = "商家端,浏览历史接口")
@RequestMapping("/store/member/footprint")
public class FootprintStoreController {
/**
* 会员足迹
*/
@Autowired
private FootprintService footprintService;
@ApiOperation(value = "分页获取")
@GetMapping
public ResultMessage<IPage<EsGoodsIndex>> getByPage(FootPrintQueryParams params) {
return ResultUtil.data(footprintService.footPrintPage(params));
}
}

View File

@ -8,6 +8,8 @@ import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.service.StoreService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -29,6 +31,9 @@ public class StoreUserController {
@Autowired
private MemberService memberService;
@Autowired
private StoreService storeService;
@GetMapping(value = "/info")
@ApiOperation(value = "获取当前登录用户接口")
@ -42,5 +47,16 @@ public class StoreUserController {
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
}
@GetMapping(value = "")
@ApiOperation(value = "获取当前登录店铺接口")
public ResultMessage<Store> getStoreInfo() {
AuthUser tokenUser = UserContext.getCurrentUser();
if (tokenUser != null) {
Store store = storeService.getById(tokenUser.getStoreId());
return ResultUtil.data(store);
}
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
}
}

View File

@ -1,40 +1,4 @@
<<<<<<< HEAD
=======
<p align="center" >
<img src="https://www.xuxueli.com/doc/static/xxl-job/images/xxl-logo.jpg" width="150">
<h3 align="center">XXL-JOB</h3>
<p align="center">
XXL-JOB, a distributed task scheduling framework.
<br>
<a href="https://www.xuxueli.com/xxl-job/"><strong>-- Home Page --</strong></a>
<br>
<br>
<a href="https://github.com/xuxueli/xxl-job/actions">
<img src="https://github.com/xuxueli/xxl-job/workflows/Java%20CI/badge.svg" >
</a>
<a href="https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/">
<img src="https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/badge.svg" >
</a>
<a href="https://github.com/xuxueli/xxl-job/releases">
<img src="https://img.shields.io/github/release/xuxueli/xxl-job.svg" >
</a>
<a href="https://github.com/xuxueli/xxl-job/">
<img src="https://img.shields.io/github/stars/xuxueli/xxl-job" >
</a>
<a href="https://hub.docker.com/r/xuxueli/xxl-job-admin/">
<img src="https://img.shields.io/docker/pulls/xuxueli/xxl-job-admin" >
</a>
<a href="http://www.gnu.org/licenses/gpl-3.0.html">
<img src="https://img.shields.io/badge/license-GPLv3-blue.svg" >
</a>
<a href="https://www.xuxueli.com/page/donate.html">
<img src="https://img.shields.io/badge/%24-donate-ff69b4.svg?style=flat" >
</a>
</p>
</p>
>>>>>>> ae0c4aea12996d3d72eca7c6ccdc97922373e4d7
## Introduction
XXL-JOB is a distributed task scheduling framework.
It's core design goal is to develop quickly and learn simple, lightweight, and easy to expand.