commit
b416e56b98
@ -6,4 +6,74 @@ CREATE TABLE `li_member_coupon_sign` (
|
|||||||
`invalid_time` datetime NULL DEFAULT NULL COMMENT '过期时间',
|
`invalid_time` datetime NULL DEFAULT NULL COMMENT '过期时间',
|
||||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = DYNAMIC;
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
|
/**
|
||||||
|
IM聊天
|
||||||
|
*/
|
||||||
|
CREATE TABLE `li_im_talk` (
|
||||||
|
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
|
||||||
|
`create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建者',
|
||||||
|
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||||
|
`delete_flag` bit(1) DEFAULT NULL COMMENT '删除标志',
|
||||||
|
`update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '修改者',
|
||||||
|
`update_time` datetime(6) DEFAULT NULL COMMENT '修改时间',
|
||||||
|
`user_id1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户1Id',
|
||||||
|
`user_id2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户2Id',
|
||||||
|
`name1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户1名称',
|
||||||
|
`name2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户2名称',
|
||||||
|
`face1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户1头像',
|
||||||
|
`face2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户2头像',
|
||||||
|
`top1` bit(1) DEFAULT NULL COMMENT '用户1置顶标识',
|
||||||
|
`top2` bit(1) DEFAULT NULL COMMENT '用户2置顶标识',
|
||||||
|
`disable1` bit(1) DEFAULT NULL COMMENT '用户1禁用标识',
|
||||||
|
`disable2` bit(1) DEFAULT NULL COMMENT '用户2禁用标识',
|
||||||
|
`store_flag1` bit(1) DEFAULT NULL COMMENT '用户1店铺标识',
|
||||||
|
`store_flag2` bit(1) DEFAULT NULL COMMENT '用户2店铺标识',
|
||||||
|
`last_talk_time` datetime DEFAULT NULL COMMENT '最后聊天时间',
|
||||||
|
`last_talk_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '最后的消息',
|
||||||
|
`last_message_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '最后消息类型',
|
||||||
|
`talk_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '聊天Id',
|
||||||
|
`tenant_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '坐席Id',
|
||||||
|
`tenant_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '坐席名称',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
IM消息
|
||||||
|
*/
|
||||||
|
CREATE TABLE `li_im_message` (
|
||||||
|
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
|
||||||
|
`create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建者',
|
||||||
|
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||||
|
`delete_flag` bit(1) DEFAULT NULL COMMENT '删除标识',
|
||||||
|
`update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '修改者',
|
||||||
|
`update_time` datetime(6) DEFAULT NULL COMMENT '修改标识',
|
||||||
|
`from_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发送用户Id',
|
||||||
|
`to_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '接收用户Id',
|
||||||
|
`is_read` bit(1) DEFAULT NULL COMMENT '已读标识',
|
||||||
|
`message_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '聊天类型',
|
||||||
|
`text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '聊天内容',
|
||||||
|
`talk_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '聊天Id',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
订单增加自提信息
|
||||||
|
*/
|
||||||
|
ALTER TABLE li_order ADD `store_address_path` varchar(255) DEFAULT NULL;
|
||||||
|
ALTER TABLE li_order ADD `store_address_center` varchar(255) DEFAULT NULL;
|
||||||
|
ALTER TABLE li_order ADD `store_address_mobile` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
店铺是否开启自提
|
||||||
|
*/
|
||||||
|
ALTER TABLE li_store ADD `self_pick_flag` bit(1) DEFAULT NULL;
|
||||||
|
/**
|
||||||
|
历史足迹增加店铺Id
|
||||||
|
*/
|
||||||
|
ALTER TABLE li_foot_print ADD `store_id` varchar(255) DEFAULT NULL COMMENT '店铺ID';
|
||||||
@ -1,14 +1,17 @@
|
|||||||
package cn.lili.controller.member;
|
package cn.lili.controller.member;
|
||||||
|
|
||||||
import cn.lili.common.enums.ResultUtil;
|
import cn.lili.common.enums.ResultUtil;
|
||||||
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.common.vo.ResultMessage;
|
import cn.lili.common.vo.ResultMessage;
|
||||||
|
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
|
||||||
import cn.lili.modules.member.service.FootprintService;
|
import cn.lili.modules.member.service.FootprintService;
|
||||||
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
||||||
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;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.apache.catalina.User;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
@ -35,8 +38,9 @@ public class FootprintController {
|
|||||||
|
|
||||||
@ApiOperation(value = "分页获取")
|
@ApiOperation(value = "分页获取")
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public ResultMessage<IPage<EsGoodsIndex>> getByPage(PageVO page) {
|
public ResultMessage<IPage<EsGoodsIndex>> getByPage(FootPrintQueryParams params) {
|
||||||
return ResultUtil.data(footprintService.footPrintPage(page));
|
params.setMemberId(UserContext.getCurrentUser().getId());
|
||||||
|
return ResultUtil.data(footprintService.footPrintPage(params));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "根据id删除")
|
@ApiOperation(value = "根据id删除")
|
||||||
|
|||||||
@ -189,20 +189,38 @@ public class CartController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "选择自提地址")
|
||||||
|
@ApiImplicitParams({
|
||||||
|
@ApiImplicitParam(name = "storeAddressId", value = "自提地址id ", required = true, paramType = "query"),
|
||||||
|
@ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query")
|
||||||
|
})
|
||||||
|
@GetMapping("/storeAddress")
|
||||||
|
public ResultMessage<Object> shippingSelfPickAddress(@NotNull(message = "自提地址ID不能为空") String storeAddressId,
|
||||||
|
String way) {
|
||||||
|
try {
|
||||||
|
cartService.shippingSelfAddress(storeAddressId, way);
|
||||||
|
return ResultUtil.success();
|
||||||
|
} catch (ServiceException se) {
|
||||||
|
log.error(ResultCode.SHIPPING_NOT_APPLY.message(), se);
|
||||||
|
throw new ServiceException(ResultCode.SHIPPING_NOT_APPLY);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(ResultCode.CART_ERROR.message(), e);
|
||||||
|
throw new ServiceException(ResultCode.CART_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "选择配送方式")
|
@ApiOperation(value = "选择配送方式")
|
||||||
@ApiImplicitParams({
|
@ApiImplicitParams({
|
||||||
@ApiImplicitParam(name = "shippingMethod", value = "配送方式:SELF_PICK_UP(自提)," +
|
@ApiImplicitParam(name = "shippingMethod", value = "配送方式:SELF_PICK_UP(自提)," +
|
||||||
"LOCAL_TOWN_DELIVERY(同城配送)," +
|
"LOCAL_TOWN_DELIVERY(同城配送)," +
|
||||||
"LOGISTICS(物流) ", required = true, paramType = "query"),
|
"LOGISTICS(物流) ", required = true, paramType = "query"),
|
||||||
@ApiImplicitParam(name = "selleId", value = "店铺id", paramType = "query"),
|
|
||||||
@ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query")
|
@ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query")
|
||||||
})
|
})
|
||||||
@GetMapping("/shippingMethod")
|
@PutMapping("/shippingMethod")
|
||||||
public ResultMessage<Object> shippingMethod(@NotNull(message = "配送方式不能为空") String shippingMethod,
|
public ResultMessage<Object> shippingMethod(@NotNull(message = "配送方式不能为空") String shippingMethod,
|
||||||
String selleId,
|
|
||||||
String way) {
|
String way) {
|
||||||
try {
|
try {
|
||||||
cartService.shippingMethod(selleId, shippingMethod, way);
|
cartService.shippingMethod( shippingMethod, way);
|
||||||
return ResultUtil.success();
|
return ResultUtil.success();
|
||||||
} catch (ServiceException se) {
|
} catch (ServiceException se) {
|
||||||
log.error(se.getMsg(), se);
|
log.error(se.getMsg(), se);
|
||||||
@ -213,6 +231,21 @@ public class CartController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取用户可选择的物流方式")
|
||||||
|
@ApiImplicitParams({
|
||||||
|
@ApiImplicitParam(name = "way", value = "购物车类型 ", paramType = "query")
|
||||||
|
})
|
||||||
|
@GetMapping("/shippingMethodList")
|
||||||
|
public ResultMessage<Object> shippingMethodList(String way) {
|
||||||
|
try {
|
||||||
|
return ResultUtil.data(cartService.shippingMethodList(way));
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return ResultUtil.error(ResultCode.ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "选择发票")
|
@ApiOperation(value = "选择发票")
|
||||||
@ApiImplicitParams({
|
@ApiImplicitParams({
|
||||||
@ApiImplicitParam(name = "way", value = "购物车购买:CART/立即购买:BUY_NOW/拼团购买:PINTUAN / 积分购买:POINT ", required = true, paramType = "query"),
|
@ApiImplicitParam(name = "way", value = "购物车购买:CART/立即购买:BUY_NOW/拼团购买:PINTUAN / 积分购买:POINT ", required = true, paramType = "query"),
|
||||||
|
|||||||
@ -0,0 +1,53 @@
|
|||||||
|
package cn.lili.controller.store;
|
||||||
|
|
||||||
|
import cn.lili.common.enums.ResultUtil;
|
||||||
|
import cn.lili.common.security.OperationalJudgment;
|
||||||
|
import cn.lili.common.security.context.UserContext;
|
||||||
|
import cn.lili.common.vo.PageVO;
|
||||||
|
import cn.lili.common.vo.ResultMessage;
|
||||||
|
import cn.lili.modules.store.entity.dos.StoreAddress;
|
||||||
|
import cn.lili.modules.store.service.StoreAddressService;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 买家端,商家地址(自提点)接口
|
||||||
|
*
|
||||||
|
* @author chc
|
||||||
|
* @since 2022/6/2114:46
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@Api(tags = "买家端,商家地址(自提点)接口")
|
||||||
|
@RequestMapping("/buyer/store/address")
|
||||||
|
public class StoreAddressBuyerController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 店铺自提点
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private StoreAddressService storeAddressService;
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取商家自提点分页")
|
||||||
|
@ApiImplicitParam(name = "storeId", value = "店铺Id", required = true, dataType = "String", paramType = "path")
|
||||||
|
@GetMapping("/page/{storeId}")
|
||||||
|
public ResultMessage<IPage<StoreAddress>> get(PageVO pageVo,@PathVariable String storeId) {
|
||||||
|
return ResultUtil.data(storeAddressService.getStoreAddress(storeId, pageVo));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "获取商家自提点信息")
|
||||||
|
@ApiImplicitParam(name = "id", value = "自提点ID", required = true, paramType = "path")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public ResultMessage<StoreAddress> get(@PathVariable String id) {
|
||||||
|
StoreAddress address = OperationalJudgment.judgment(storeAddressService.getById(id));
|
||||||
|
return ResultUtil.data(address);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -265,6 +265,8 @@ lili:
|
|||||||
order-group: lili_order_group
|
order-group: lili_order_group
|
||||||
member-topic: lili_member_topic
|
member-topic: lili_member_topic
|
||||||
member-group: lili_member_group
|
member-group: lili_member_group
|
||||||
|
store-topic: lili_store_topic
|
||||||
|
store-group: lili_store_group
|
||||||
other-topic: lili_other_topic
|
other-topic: lili_other_topic
|
||||||
other-group: lili_other_group
|
other-group: lili_other_group
|
||||||
notice-topic: lili_notice_topic
|
notice-topic: lili_notice_topic
|
||||||
|
|||||||
@ -0,0 +1,17 @@
|
|||||||
|
package cn.lili.event;
|
||||||
|
|
||||||
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author chc
|
||||||
|
* @since 2022/6/2114:46
|
||||||
|
*/
|
||||||
|
public interface MemberInfoChangeEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会员信息更改消息
|
||||||
|
*
|
||||||
|
* @param member 会员信息
|
||||||
|
*/
|
||||||
|
void memberInfoChange(Member member);
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
package cn.lili.event;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lili.modules.store.entity.dos.Store;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author chc
|
||||||
|
* @since 2022/6/2114:46
|
||||||
|
*/
|
||||||
|
public interface StoreSettingChangeEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 店铺信息更改消息
|
||||||
|
*
|
||||||
|
* @param store 店铺信息
|
||||||
|
*/
|
||||||
|
void storeSettingChange(Store store);
|
||||||
|
}
|
||||||
@ -44,8 +44,9 @@ public class DistributionOrderExecute implements OrderStatusChangeEvent, EveryDa
|
|||||||
public void orderChange(OrderMessage orderMessage) {
|
public void orderChange(OrderMessage orderMessage) {
|
||||||
|
|
||||||
switch (orderMessage.getNewStatus()) {
|
switch (orderMessage.getNewStatus()) {
|
||||||
//订单带校验/订单代发货,则记录分销信息
|
//订单带校验/订单代发货/待自提,则记录分销信息
|
||||||
case TAKE:
|
case TAKE:
|
||||||
|
case STAY_PICKED_UP:
|
||||||
case UNDELIVERED: {
|
case UNDELIVERED: {
|
||||||
//记录分销订单
|
//记录分销订单
|
||||||
distributionOrderService.calculationDistribution(orderMessage.getOrderSn());
|
distributionOrderService.calculationDistribution(orderMessage.getOrderSn());
|
||||||
|
|||||||
60
consumer/src/main/java/cn/lili/event/impl/ImTalkExecute.java
Normal file
60
consumer/src/main/java/cn/lili/event/impl/ImTalkExecute.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package cn.lili.event.impl;
|
||||||
|
|
||||||
|
import cn.lili.event.MemberInfoChangeEvent;
|
||||||
|
import cn.lili.event.StoreSettingChangeEvent;
|
||||||
|
import cn.lili.modules.im.entity.dos.ImTalk;
|
||||||
|
import cn.lili.modules.im.service.ImTalkService;
|
||||||
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
|
import cn.lili.modules.store.entity.dos.Store;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Im对话消息
|
||||||
|
*
|
||||||
|
* @author chc
|
||||||
|
* @since 2022/6/2114:46
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class ImTalkExecute implements MemberInfoChangeEvent, StoreSettingChangeEvent {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ImTalkService imTalkService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void memberInfoChange(Member member) {
|
||||||
|
//当与UserId1相等时
|
||||||
|
List<ImTalk> imTalkList1 = imTalkService.list(new LambdaQueryWrapper<ImTalk>().eq(ImTalk::getUserId1, member.getId()));
|
||||||
|
for (ImTalk imTalk : imTalkList1) {
|
||||||
|
imTalk.setName1(member.getNickName());
|
||||||
|
imTalk.setFace1(member.getFace());
|
||||||
|
}
|
||||||
|
imTalkService.updateBatchById(imTalkList1);
|
||||||
|
List<ImTalk> imTalkList2 = imTalkService.list(new LambdaQueryWrapper<ImTalk>().eq(ImTalk::getUserId2, member.getId()));
|
||||||
|
for (ImTalk imTalk : imTalkList2) {
|
||||||
|
imTalk.setName2(member.getNickName());
|
||||||
|
imTalk.setFace2(member.getFace());
|
||||||
|
}
|
||||||
|
imTalkService.updateBatchById(imTalkList2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void storeSettingChange(Store store) {
|
||||||
|
//当与UserId1相等时
|
||||||
|
List<ImTalk> imTalkList1 = imTalkService.list(new LambdaQueryWrapper<ImTalk>().eq(ImTalk::getUserId1, store.getId()));
|
||||||
|
for (ImTalk imTalk : imTalkList1) {
|
||||||
|
imTalk.setName1(store.getStoreName());
|
||||||
|
imTalk.setFace1(store.getStoreLogo());
|
||||||
|
}
|
||||||
|
imTalkService.updateBatchById(imTalkList1);
|
||||||
|
List<ImTalk> imTalkList2 = imTalkService.list(new LambdaQueryWrapper<ImTalk>().eq(ImTalk::getUserId2, store.getId()));
|
||||||
|
for (ImTalk imTalk : imTalkList2) {
|
||||||
|
imTalk.setName2(store.getStoreName());
|
||||||
|
imTalk.setFace2(store.getStoreLogo());
|
||||||
|
}
|
||||||
|
imTalkService.updateBatchById(imTalkList2);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -31,7 +31,7 @@ public class VerificationOrderExecute implements OrderStatusChangeEvent {
|
|||||||
@Override
|
@Override
|
||||||
public void orderChange(OrderMessage orderMessage) {
|
public void orderChange(OrderMessage orderMessage) {
|
||||||
//订单状态为待核验,添加订单添加核验码
|
//订单状态为待核验,添加订单添加核验码
|
||||||
if (orderMessage.getNewStatus().equals(OrderStatusEnum.TAKE)) {
|
if (orderMessage.getNewStatus().equals(OrderStatusEnum.TAKE) || orderMessage.getNewStatus().equals(OrderStatusEnum.STAY_PICKED_UP)) {
|
||||||
//获取订单信息
|
//获取订单信息
|
||||||
Order order = orderService.getBySn(orderMessage.getOrderSn());
|
Order order = orderService.getBySn(orderMessage.getOrderSn());
|
||||||
//获取随机数,判定是否存在
|
//获取随机数,判定是否存在
|
||||||
|
|||||||
@ -42,6 +42,7 @@ public class WechatMessageExecute implements OrderStatusChangeEvent, TradeEvent
|
|||||||
case PAID:
|
case PAID:
|
||||||
case UNDELIVERED:
|
case UNDELIVERED:
|
||||||
case DELIVERED:
|
case DELIVERED:
|
||||||
|
case STAY_PICKED_UP:
|
||||||
case COMPLETED:
|
case COMPLETED:
|
||||||
try {
|
try {
|
||||||
wechatMessageUtil.sendWechatMessage(orderMessage.getOrderSn());
|
wechatMessageUtil.sendWechatMessage(orderMessage.getOrderSn());
|
||||||
|
|||||||
@ -1,10 +1,8 @@
|
|||||||
package cn.lili.listener;
|
package cn.lili.listener;
|
||||||
|
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import cn.lili.event.MemberLoginEvent;
|
import cn.lili.event.*;
|
||||||
import cn.lili.event.MemberPointChangeEvent;
|
import cn.lili.event.impl.ImTalkExecute;
|
||||||
import cn.lili.event.MemberRegisterEvent;
|
|
||||||
import cn.lili.event.MemberWithdrawalEvent;
|
|
||||||
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
import cn.lili.modules.member.entity.dos.MemberSign;
|
import cn.lili.modules.member.entity.dos.MemberSign;
|
||||||
import cn.lili.modules.member.entity.dto.MemberPointMessage;
|
import cn.lili.modules.member.entity.dto.MemberPointMessage;
|
||||||
@ -58,6 +56,9 @@ public class MemberMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private List<MemberLoginEvent> memberLoginEvents;
|
private List<MemberLoginEvent> memberLoginEvents;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private List<MemberInfoChangeEvent> memberInfoChangeEvents;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onMessage(MessageExt messageExt) {
|
public void onMessage(MessageExt messageExt) {
|
||||||
@ -110,6 +111,20 @@ public class MemberMessageListener implements RocketMQListener<MessageExt> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
//会员信息更改
|
||||||
|
case MEMBER_INFO_EDIT:
|
||||||
|
for (MemberInfoChangeEvent memberInfoChangeEvent : memberInfoChangeEvents) {
|
||||||
|
try {
|
||||||
|
Member member = JSONUtil.toBean(new String(messageExt.getBody()), Member.class);
|
||||||
|
memberInfoChangeEvent.memberInfoChange(member);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("会员{},在{}业务中,提现事件执行异常",
|
||||||
|
new String(messageExt.getBody()),
|
||||||
|
memberInfoChangeEvent.getClass().getName(),
|
||||||
|
e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
//会员提现
|
//会员提现
|
||||||
case MEMBER_WITHDRAWAL:
|
case MEMBER_WITHDRAWAL:
|
||||||
for (MemberWithdrawalEvent memberWithdrawalEvent : memberWithdrawalEvents) {
|
for (MemberWithdrawalEvent memberWithdrawalEvent : memberWithdrawalEvents) {
|
||||||
|
|||||||
@ -0,0 +1,51 @@
|
|||||||
|
package cn.lili.listener;
|
||||||
|
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import cn.lili.event.MemberRegisterEvent;
|
||||||
|
import cn.lili.event.StoreSettingChangeEvent;
|
||||||
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
|
import cn.lili.modules.store.entity.dos.Store;
|
||||||
|
import cn.lili.rocketmq.tags.StoreTagsEnum;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.rocketmq.common.message.MessageExt;
|
||||||
|
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||||
|
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 店铺消息
|
||||||
|
* @author chc
|
||||||
|
* @since 2022/6/2114:46
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
@RocketMQMessageListener(topic = "${lili.data.rocketmq.store-topic}", consumerGroup = "${lili.data.rocketmq.store-group}")
|
||||||
|
public class StoreMessageListener implements RocketMQListener<MessageExt> {
|
||||||
|
@Autowired
|
||||||
|
private List<StoreSettingChangeEvent> storeSettingChangeEventList;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(MessageExt messageExt) {
|
||||||
|
switch (StoreTagsEnum.valueOf(messageExt.getTags())){
|
||||||
|
//修改店铺
|
||||||
|
case EDIT_STORE_SETTING:
|
||||||
|
for (StoreSettingChangeEvent storeSettingChangeEvent : storeSettingChangeEventList) {
|
||||||
|
try {
|
||||||
|
Store store = JSONUtil.toBean(new String(messageExt.getBody()), Store.class);
|
||||||
|
storeSettingChangeEvent.storeSettingChange(store);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("会员{},在{}业务中,状态修改事件执行异常",
|
||||||
|
new String(messageExt.getBody()),
|
||||||
|
storeSettingChangeEvent.getClass().getName(),
|
||||||
|
e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -260,6 +260,8 @@ lili:
|
|||||||
order-group: lili_order_group
|
order-group: lili_order_group
|
||||||
member-topic: lili_member_topic
|
member-topic: lili_member_topic
|
||||||
member-group: lili_member_group
|
member-group: lili_member_group
|
||||||
|
store-topic: lili_store_topic
|
||||||
|
store-group: lili_store_group
|
||||||
other-topic: lili_other_topic
|
other-topic: lili_other_topic
|
||||||
other-group: lili_other_group
|
other-group: lili_other_group
|
||||||
notice-topic: lili_notice_topic
|
notice-topic: lili_notice_topic
|
||||||
|
|||||||
@ -51,7 +51,10 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
|||||||
@ -70,6 +70,12 @@ public class AuthUser implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Boolean isSuper = false;
|
private Boolean isSuper = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户id
|
||||||
|
*/
|
||||||
|
private String tenantId;
|
||||||
|
|
||||||
|
|
||||||
public AuthUser(String username, String id, String nickName, String face, UserEnums role) {
|
public AuthUser(String username, String id, String nickName, String face, UserEnums role) {
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.face = face;
|
this.face = face;
|
||||||
|
|||||||
@ -14,7 +14,8 @@ public enum UserEnums {
|
|||||||
MEMBER("会员"),
|
MEMBER("会员"),
|
||||||
STORE("商家"),
|
STORE("商家"),
|
||||||
MANAGER("管理员"),
|
MANAGER("管理员"),
|
||||||
SYSTEM("系统");
|
SYSTEM("系统"),
|
||||||
|
SEAT("坐席");
|
||||||
private final String role;
|
private final String role;
|
||||||
|
|
||||||
UserEnums(String role) {
|
UserEnums(String role) {
|
||||||
|
|||||||
@ -81,6 +81,32 @@ public class Swagger2Config {
|
|||||||
.securitySchemes(securitySchemes())
|
.securitySchemes(securitySchemes())
|
||||||
.securityContexts(securityContexts());
|
.securityContexts(securityContexts());
|
||||||
}
|
}
|
||||||
|
@Bean
|
||||||
|
public Docket orderRestApi() {
|
||||||
|
return new Docket(DocumentationType.SWAGGER_2)
|
||||||
|
.groupName("订单")
|
||||||
|
.apiInfo(apiInfo()).select()
|
||||||
|
//扫描所有有注解的api,用这种方式更灵活
|
||||||
|
// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
|
||||||
|
.apis(RequestHandlerSelectors.basePackage("cn.lili.controller.order"))
|
||||||
|
.paths(PathSelectors.any())
|
||||||
|
.build()
|
||||||
|
.securitySchemes(securitySchemes())
|
||||||
|
.securityContexts(securityContexts());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Docket imRestApi() {
|
||||||
|
return new Docket(DocumentationType.SWAGGER_2)
|
||||||
|
.groupName("im")
|
||||||
|
.apiInfo(apiInfo()).select()
|
||||||
|
//扫描所有有注解的api,用这种方式更灵活
|
||||||
|
.apis(RequestHandlerSelectors.basePackage("cn.lili.controller.im"))
|
||||||
|
.paths(PathSelectors.any())
|
||||||
|
.build()
|
||||||
|
.securitySchemes(securitySchemes())
|
||||||
|
.securityContexts(securityContexts());
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public Docket memberRestApi() {
|
public Docket memberRestApi() {
|
||||||
|
|||||||
@ -325,7 +325,7 @@ public abstract class BaseElasticsearchService {
|
|||||||
" }\n" +
|
" }\n" +
|
||||||
" },\n" +
|
" },\n" +
|
||||||
" \"promotionMapJson\": {\n" +
|
" \"promotionMapJson\": {\n" +
|
||||||
" \"type\": \"text\"\n" +
|
" \"type\": \"keyword\"\n" +
|
||||||
" },\n" +
|
" },\n" +
|
||||||
" \"thumbnail\": {\n" +
|
" \"thumbnail\": {\n" +
|
||||||
" \"type\": \"text\",\n" +
|
" \"type\": \"text\",\n" +
|
||||||
|
|||||||
@ -327,7 +327,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
|||||||
|
|
||||||
//记录用户足迹
|
//记录用户足迹
|
||||||
if (UserContext.getCurrentUser() != null) {
|
if (UserContext.getCurrentUser() != null) {
|
||||||
FootPrint footPrint = new FootPrint(UserContext.getCurrentUser().getId(), goodsId, skuId);
|
FootPrint footPrint = new FootPrint(UserContext.getCurrentUser().getId(), goodsIndex.getStoreId(), goodsId, skuId);
|
||||||
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.VIEW_GOODS.name();
|
String destination = rocketmqCustomProperties.getGoodsTopic() + ":" + GoodsTagsEnum.VIEW_GOODS.name();
|
||||||
rocketMQTemplate.asyncSend(destination, footPrint, RocketmqSendCallbackBuilder.commonCallback());
|
rocketMQTemplate.asyncSend(destination, footPrint, RocketmqSendCallbackBuilder.commonCallback());
|
||||||
}
|
}
|
||||||
@ -508,6 +508,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
|
|||||||
List<GoodsSku> goodsSkus = new ArrayList<>();
|
List<GoodsSku> goodsSkus = new ArrayList<>();
|
||||||
goodsSkus.add(goodsSku);
|
goodsSkus.add(goodsSku);
|
||||||
this.updateGoodsStuck(goodsSkus);
|
this.updateGoodsStuck(goodsSkus);
|
||||||
|
this.promotionGoodsService.updatePromotionGoodsStock(goodsSku.getId(), quantity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,34 @@
|
|||||||
|
package cn.lili.modules.im.config;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.beans.factory.BeanFactory;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
|
||||||
|
import javax.websocket.server.ServerEndpointConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CustomSpringConfigurator
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2021-12-31 11:53
|
||||||
|
*/
|
||||||
|
public class CustomSpringConfigurator extends ServerEndpointConfig.Configurator implements ApplicationContextAware {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spring application context.
|
||||||
|
*/
|
||||||
|
private static volatile BeanFactory context;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException {
|
||||||
|
return context.getBean(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||||
|
CustomSpringConfigurator.context = applicationContext;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package cn.lili.modules.im.config;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebSocketConfigurator
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2021-12-31 11:53
|
||||||
|
*/
|
||||||
|
@ConditionalOnWebApplication
|
||||||
|
@Configuration
|
||||||
|
public class WebSocketConfigurator {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CustomSpringConfigurator customSpringConfigurator() {
|
||||||
|
// This is just to get context
|
||||||
|
return new CustomSpringConfigurator();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
package cn.lili.modules.im.entity.dos;
|
||||||
|
|
||||||
|
import cn.lili.common.utils.SnowFlake;
|
||||||
|
import cn.lili.modules.im.entity.enums.MessageTypeEnum;
|
||||||
|
import cn.lili.modules.im.entity.vo.MessageOperation;
|
||||||
|
import cn.lili.mybatis.BaseEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("li_im_message")
|
||||||
|
@ApiModel(value = "Im消息")
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class ImMessage extends BaseEntity {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送者
|
||||||
|
*/
|
||||||
|
private String fromUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 接收者
|
||||||
|
*/
|
||||||
|
private String toUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 已阅
|
||||||
|
*/
|
||||||
|
private Boolean isRead;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息类型
|
||||||
|
*/
|
||||||
|
private MessageTypeEnum messageType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天id
|
||||||
|
*/
|
||||||
|
private String talkId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息实体
|
||||||
|
*/
|
||||||
|
private String text;
|
||||||
|
|
||||||
|
|
||||||
|
public ImMessage(MessageOperation messageOperation){
|
||||||
|
this.setFromUser(messageOperation.getFrom());
|
||||||
|
this.setMessageType(messageOperation.getMessageType());
|
||||||
|
this.setIsRead(false);
|
||||||
|
this.setText(messageOperation.getContext());
|
||||||
|
this.setTalkId(messageOperation.getTalkId());
|
||||||
|
this.setCreateTime(new Date());
|
||||||
|
this.setToUser(messageOperation.getTo());
|
||||||
|
this.setId(SnowFlake.getIdStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,102 @@
|
|||||||
|
package cn.lili.modules.im.entity.dos;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lili.common.utils.SnowFlake;
|
||||||
|
import cn.lili.mybatis.BaseTenantEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("li_im_talk")
|
||||||
|
@ApiModel(value = "聊天")
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class ImTalk extends BaseTenantEntity {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户1 id")
|
||||||
|
private String userId1;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户2 id")
|
||||||
|
private String userId2;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户1置顶")
|
||||||
|
private Boolean top1;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户2置顶")
|
||||||
|
private Boolean top2;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户1 不可见")
|
||||||
|
private Boolean disable1;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户2 不可见")
|
||||||
|
private Boolean disable2;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户1名字")
|
||||||
|
private String name1;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户2名字")
|
||||||
|
private String name2;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户1头像")
|
||||||
|
private String face1;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户2头像")
|
||||||
|
private String face2;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户1的店铺标识")
|
||||||
|
private Boolean storeFlag1;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户2的店铺标识")
|
||||||
|
private Boolean storeFlag2;
|
||||||
|
|
||||||
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@ApiModelProperty(value = "最后聊天时间", hidden = true)
|
||||||
|
private Date lastTalkTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "最后聊天内容")
|
||||||
|
private String lastTalkMessage;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "最后发送消息类型")
|
||||||
|
private String lastMessageType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "坐席Id")
|
||||||
|
private String tenantId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "坐席名称")
|
||||||
|
private String tenantName;
|
||||||
|
|
||||||
|
|
||||||
|
public ImTalk(String userId1, String userId2,
|
||||||
|
String face1, String face2,
|
||||||
|
String name1, String name2
|
||||||
|
) {
|
||||||
|
this.userId1 = userId1;
|
||||||
|
this.userId2 = userId2;
|
||||||
|
this.top1 = false;
|
||||||
|
this.top2 = false;
|
||||||
|
this.disable1 = false;
|
||||||
|
this.disable2 = false;
|
||||||
|
this.storeFlag1 = false;
|
||||||
|
this.storeFlag2 = false;
|
||||||
|
this.setId(SnowFlake.getIdStr());
|
||||||
|
this.lastTalkTime = new Date();
|
||||||
|
this.face1 = face1;
|
||||||
|
this.face2 = face2;
|
||||||
|
this.name1 = name1;
|
||||||
|
this.name2 = name2;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
package cn.lili.modules.im.entity.dos;
|
||||||
|
|
||||||
|
import cn.lili.mybatis.BaseEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 问题答案
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2022-02-09 17:59
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("li_qa")
|
||||||
|
@ApiModel(value = "租户问答")
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class QA extends BaseEntity {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "租户id")
|
||||||
|
private Integer tenantId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "问题")
|
||||||
|
private String question;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "答案")
|
||||||
|
private String answer;
|
||||||
|
}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
package cn.lili.modules.im.entity.dos;
|
||||||
|
|
||||||
|
import cn.lili.mybatis.BaseTenantEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2022-02-09 17:08
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("li_seat")
|
||||||
|
@ApiModel(value = "坐席")
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class Seat extends BaseTenantEntity {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "租户id")
|
||||||
|
private String tenantId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "坐席用户名")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "会员头像")
|
||||||
|
private String face;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "坐席密码")
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "昵称")
|
||||||
|
private String nickName;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "坐席状态")
|
||||||
|
private Boolean disabled;
|
||||||
|
|
||||||
|
@NotEmpty(message = "手机号码不能为空")
|
||||||
|
@ApiModelProperty(value = "手机号码", required = true)
|
||||||
|
private String mobile;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package cn.lili.modules.im.entity.dos;
|
||||||
|
|
||||||
|
import cn.lili.mybatis.BaseTenantEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席设置
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2022-02-09 17:55
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("li_seat_setting")
|
||||||
|
@ApiModel(value = "坐席设置")
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class SeatSetting extends BaseTenantEntity {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "租户idid")
|
||||||
|
private String tenantId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "欢迎语")
|
||||||
|
private String welcome;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "离线自动回复")
|
||||||
|
private String outLineAutoReply;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "长时间自动回复")
|
||||||
|
private String longTermAutoReply;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package cn.lili.modules.im.entity.dto;
|
||||||
|
|
||||||
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
|
import cn.lili.common.vo.PageVO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author chc
|
||||||
|
* @since 2022/6/2114:46
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel
|
||||||
|
public class ImQueryParams extends PageVO {
|
||||||
|
|
||||||
|
@ApiModelProperty("用户Id")
|
||||||
|
private String memberId;
|
||||||
|
|
||||||
|
@ApiModelProperty("店铺Id")
|
||||||
|
private String storeId;
|
||||||
|
|
||||||
|
public <T> QueryWrapper<T> queryWrapper() {
|
||||||
|
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
||||||
|
if (CharSequenceUtil.isNotEmpty(memberId)) {
|
||||||
|
queryWrapper.eq("member_id", memberId);
|
||||||
|
}
|
||||||
|
if (CharSequenceUtil.isNotEmpty(storeId)) {
|
||||||
|
queryWrapper.eq("store_id", storeId);
|
||||||
|
}
|
||||||
|
queryWrapper.eq("delete_flag",false);
|
||||||
|
queryWrapper.orderByDesc("create_time");
|
||||||
|
return queryWrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
package cn.lili.modules.im.entity.dto;
|
||||||
|
|
||||||
|
import cn.lili.common.enums.ResultCode;
|
||||||
|
import cn.lili.common.exception.ServiceException;
|
||||||
|
import cn.lili.common.utils.StringUtils;
|
||||||
|
import cn.lili.common.vo.PageVO;
|
||||||
|
import cn.lili.modules.im.entity.dos.ImMessage;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessageQueryParams
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2022-01-20 17:16
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class MessageQueryParams extends PageVO {
|
||||||
|
/**
|
||||||
|
* 聊天窗口
|
||||||
|
*/
|
||||||
|
private String talkId;
|
||||||
|
/**
|
||||||
|
* 最后一个消息
|
||||||
|
*/
|
||||||
|
private String lastMessageId;
|
||||||
|
/**
|
||||||
|
* 获取消息数量
|
||||||
|
*/
|
||||||
|
private Integer num;
|
||||||
|
|
||||||
|
public LambdaQueryWrapper<ImMessage> initQueryWrapper() {
|
||||||
|
if (StringUtils.isEmpty(talkId)) {
|
||||||
|
throw new ServiceException(ResultCode.ERROR);
|
||||||
|
}
|
||||||
|
if (num == null || num > 50) {
|
||||||
|
num = 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
LambdaQueryWrapper<ImMessage> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
lambdaQueryWrapper.eq(ImMessage::getTalkId, talkId);
|
||||||
|
if (StringUtils.isNotEmpty(lastMessageId)) {
|
||||||
|
lambdaQueryWrapper.lt(ImMessage::getId, lastMessageId);
|
||||||
|
}
|
||||||
|
lambdaQueryWrapper.orderByDesc(ImMessage::getCreateTime);
|
||||||
|
// lambdaQueryWrapper.last("limit " + num);
|
||||||
|
return lambdaQueryWrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
package cn.lili.modules.im.entity.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回消息类型枚举
|
||||||
|
*
|
||||||
|
* @author liushuai
|
||||||
|
*/
|
||||||
|
public enum MessageResultType {
|
||||||
|
/**
|
||||||
|
* 返回消息类型枚举
|
||||||
|
* <p>
|
||||||
|
* 好友列表
|
||||||
|
* 增加好友
|
||||||
|
* 消息
|
||||||
|
* 阅读消息
|
||||||
|
* 未读消息
|
||||||
|
* 历史消息
|
||||||
|
* 系统提示
|
||||||
|
*/
|
||||||
|
FRIENDS,
|
||||||
|
ADD_FRIENDS,
|
||||||
|
MESSAGE,
|
||||||
|
READ_MESSAGE,
|
||||||
|
UN_READ,
|
||||||
|
HISTORY,
|
||||||
|
SYSTEM_TIPS
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
package cn.lili.modules.im.entity.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息的类型
|
||||||
|
*
|
||||||
|
* @author liushuai(liushuai711 @ gmail.com)
|
||||||
|
* @version v4.0
|
||||||
|
* @Description:
|
||||||
|
* @since 2022/2/10 16:36
|
||||||
|
*/
|
||||||
|
public enum MessageStatusEnum {
|
||||||
|
//socket刚打开时发送的消息,这个一般是是刚打开socket链接,进行登录,传入token用
|
||||||
|
CONNECT,
|
||||||
|
//心跳类型的消息,此种类型的消息只有 type 、 text 两种属性
|
||||||
|
HEARTBEAT,
|
||||||
|
//用户打开一个对话框,准备跟某人聊天时
|
||||||
|
OPEN,
|
||||||
|
//客服进行自动回复。客户端发起这种类型请求,则是在拉取对方是否有自动回复,如果有,服务端就会给客户端发送过自动回复的信息
|
||||||
|
AUTO_REPLY,
|
||||||
|
//正常收发消息沟通,文字、表情等沟通
|
||||||
|
MSG,
|
||||||
|
//扩展。比如发送商品、发送订单
|
||||||
|
EXTEND,
|
||||||
|
//系统提示,如提示 对方已离线
|
||||||
|
SYSTEM,
|
||||||
|
//服务端发送到客户端,用于设置客户端的用户信息。会吧 com.xnx3.yunkefu.core.vo.bean.User 传过去
|
||||||
|
SET_USER,
|
||||||
|
//结束服务
|
||||||
|
CLOSE_SERVICE;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package cn.lili.modules.im.entity.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息类型
|
||||||
|
*
|
||||||
|
* @author liushuai
|
||||||
|
*/
|
||||||
|
public enum MessageTypeEnum {
|
||||||
|
/**
|
||||||
|
* 消息类型枚举
|
||||||
|
* <p>
|
||||||
|
* 普通消息
|
||||||
|
* 图片
|
||||||
|
* 语音
|
||||||
|
* 视频
|
||||||
|
*/
|
||||||
|
MESSAGE,
|
||||||
|
PICTURE,
|
||||||
|
VOICE,
|
||||||
|
GOODS,
|
||||||
|
ORDER,
|
||||||
|
VIDEO
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
package cn.lili.modules.im.entity.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席在线状态
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2022-02-10 16:37
|
||||||
|
*/
|
||||||
|
public enum OnlineStatusEnum {
|
||||||
|
// 在线/下线
|
||||||
|
ONLINE,
|
||||||
|
OUTLINE;
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package cn.lili.modules.im.entity.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作类型枚举
|
||||||
|
*
|
||||||
|
* @author liushuai
|
||||||
|
*/
|
||||||
|
public enum OperationType {
|
||||||
|
/**
|
||||||
|
* 消息类型枚举
|
||||||
|
* <p>
|
||||||
|
* 心跳检测
|
||||||
|
* 发起聊天
|
||||||
|
* 发起消息
|
||||||
|
* 查询历史消息
|
||||||
|
* 阅读消息
|
||||||
|
* 查询未读消息
|
||||||
|
*/
|
||||||
|
PING,
|
||||||
|
CREATE,
|
||||||
|
MESSAGE,
|
||||||
|
HISTORY,
|
||||||
|
READ,
|
||||||
|
UNREAD,
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,82 @@
|
|||||||
|
package cn.lili.modules.im.entity.vo;
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.ImTalk;
|
||||||
|
import cn.lili.mybatis.BaseTenantEntity;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(value = "聊天")
|
||||||
|
public class ImTalkVO extends BaseTenantEntity {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ApiModelProperty("id")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户 id")
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
@ApiModelProperty("置顶")
|
||||||
|
private Boolean top;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户 不可见")
|
||||||
|
private Boolean disable;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户名字")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户头像")
|
||||||
|
private String face;
|
||||||
|
|
||||||
|
@ApiModelProperty("店铺标识")
|
||||||
|
private Boolean storeFlag;
|
||||||
|
|
||||||
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@ApiModelProperty(value = "最后聊天时间", hidden = true)
|
||||||
|
private Date lastTalkTime;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "最后聊天内容")
|
||||||
|
private String lastTalkMessage;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "最后发送消息类型")
|
||||||
|
private String lastMessageType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "未读数量")
|
||||||
|
private Long unread;
|
||||||
|
|
||||||
|
public ImTalkVO() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImTalkVO(ImTalk imTalk, String currentUser) {
|
||||||
|
if (imTalk.getUserId2().equals(currentUser)) {
|
||||||
|
userId = imTalk.getUserId1();
|
||||||
|
top = imTalk.getTop1();
|
||||||
|
disable = imTalk.getDisable1();
|
||||||
|
name = imTalk.getName1();
|
||||||
|
face = imTalk.getFace1();
|
||||||
|
storeFlag = imTalk.getStoreFlag1();
|
||||||
|
} else {
|
||||||
|
userId = imTalk.getUserId2();
|
||||||
|
top = imTalk.getTop2();
|
||||||
|
disable = imTalk.getDisable2();
|
||||||
|
name = imTalk.getName2();
|
||||||
|
face = imTalk.getFace2();
|
||||||
|
storeFlag = imTalk.getStoreFlag2();
|
||||||
|
}
|
||||||
|
lastTalkMessage = imTalk.getLastTalkMessage();
|
||||||
|
lastTalkTime = imTalk.getLastTalkTime();
|
||||||
|
lastMessageType = imTalk.getLastMessageType();
|
||||||
|
id = imTalk.getId();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
package cn.lili.modules.im.entity.vo;
|
||||||
|
|
||||||
|
import cn.lili.common.utils.StringUtils;
|
||||||
|
import cn.lili.modules.im.entity.enums.MessageTypeEnum;
|
||||||
|
import cn.lili.modules.im.entity.enums.OperationType;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liushuai
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class MessageOperation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息类型
|
||||||
|
*/
|
||||||
|
private OperationType operationType;
|
||||||
|
/**
|
||||||
|
* 与某人聊天记录
|
||||||
|
*/
|
||||||
|
private String to;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送者
|
||||||
|
*/
|
||||||
|
private String from;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天id
|
||||||
|
*/
|
||||||
|
private String talkId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息类型
|
||||||
|
*/
|
||||||
|
private MessageTypeEnum messageType;
|
||||||
|
/**
|
||||||
|
* 消息内容
|
||||||
|
*/
|
||||||
|
private String context;
|
||||||
|
|
||||||
|
public void setOperationType(String operationType) {
|
||||||
|
if (!StringUtils.isEmpty(operationType)) {
|
||||||
|
this.operationType = OperationType.valueOf(operationType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessageType(String messageType) {
|
||||||
|
if (!StringUtils.isEmpty(messageType)) {
|
||||||
|
this.messageType = MessageTypeEnum.valueOf(messageType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package cn.lili.modules.im.entity.vo;
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.enums.MessageResultType;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessageVO
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2021-12-30 15:51
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class MessageVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息类型
|
||||||
|
*/
|
||||||
|
private MessageResultType messageResultType;
|
||||||
|
/**
|
||||||
|
* 消息内容
|
||||||
|
*/
|
||||||
|
private Object result;
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
package cn.lili.modules.im.entity.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ReadMessage
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2021-12-31 11:13
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class ReadMessage {
|
||||||
|
private List<String> readMessageList;
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package cn.lili.modules.im.entity.vo;
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.Seat;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客服VO
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* 2022-02-10 15:02
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class SeatVO extends Seat {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在线状态
|
||||||
|
*/
|
||||||
|
private String onlineStatus;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
package cn.lili.modules.im.mapper;
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.ImMessage;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Im消息 Dao层
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
public interface ImMessageMapper extends BaseMapper<ImMessage> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
package cn.lili.modules.im.mapper;
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.ImTalk;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天 Dao层
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
public interface ImTalkMapper extends BaseMapper<ImTalk> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
package cn.lili.modules.im.mapper;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.QA;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 问答处理层
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 15:18:56
|
||||||
|
*/
|
||||||
|
public interface QAMapper extends BaseMapper<QA> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
package cn.lili.modules.im.mapper;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.Seat;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席处理层
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 15:18:56
|
||||||
|
*/
|
||||||
|
public interface SeatMapper extends BaseMapper<Seat> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
package cn.lili.modules.im.mapper;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.SeatSetting;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席设置处理层
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 15:18:56
|
||||||
|
*/
|
||||||
|
public interface SeatSettingMapper extends BaseMapper<SeatSetting> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
package cn.lili.modules.im.service;
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.ImMessage;
|
||||||
|
import cn.lili.modules.im.entity.dto.MessageQueryParams;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Im消息 业务层
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
public interface ImMessageService extends IService<ImMessage> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阅读消息
|
||||||
|
*
|
||||||
|
* @param talkId
|
||||||
|
* @param accessToken
|
||||||
|
*/
|
||||||
|
void read(String talkId, String accessToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 未读消息列表
|
||||||
|
*
|
||||||
|
* @param accessToken
|
||||||
|
*/
|
||||||
|
List<ImMessage> unReadMessages(String accessToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 历史消息
|
||||||
|
*
|
||||||
|
* @param accessToken
|
||||||
|
* @param to
|
||||||
|
*/
|
||||||
|
List<ImMessage> historyMessage(String accessToken, String to);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否有新消息
|
||||||
|
* @param accessToken
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Boolean hasNewMessage(String accessToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页获取消息列表
|
||||||
|
* @param messageQueryParams 查询条件
|
||||||
|
* @return 消息列表
|
||||||
|
*/
|
||||||
|
List<ImMessage> getList(MessageQueryParams messageQueryParams);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有未读消息
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Long unreadMessageCount();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清空所有未读消息
|
||||||
|
*/
|
||||||
|
void cleanUnreadMessage();
|
||||||
|
}
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
package cn.lili.modules.im.service;
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.ImTalk;
|
||||||
|
import cn.lili.modules.im.entity.vo.ImTalkVO;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天 业务层
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
public interface ImTalkService extends IService<ImTalk> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取与某人的聊天框
|
||||||
|
*
|
||||||
|
* @param userId1
|
||||||
|
* @param userId2
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
ImTalk getTalkByUser(String userId1, String userId2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 置顶消息
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @param top
|
||||||
|
*/
|
||||||
|
void top(String id, Boolean top);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁用(前端不做展示)聊天
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
void disable(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户聊天列表
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<ImTalkVO> getUserTalkList(String userName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取商家聊天列表
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<ImTalkVO> getStoreTalkList();
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package cn.lili.modules.im.service;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lili.common.vo.PageVO;
|
||||||
|
import cn.lili.modules.im.entity.dos.QA;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 问答
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 16:18:56
|
||||||
|
*/
|
||||||
|
public interface QAService extends IService<QA> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询店铺问题
|
||||||
|
* @param word
|
||||||
|
* @param pageVO
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
IPage<QA> getStoreQA(String word, PageVO pageVO);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
package cn.lili.modules.im.service;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lili.common.security.token.Token;
|
||||||
|
import cn.lili.modules.im.entity.dos.Seat;
|
||||||
|
import cn.lili.modules.im.entity.vo.SeatVO;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席业务
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 16:18:56
|
||||||
|
*/
|
||||||
|
public interface SeatService extends IService<Seat> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取坐席列表
|
||||||
|
*
|
||||||
|
* @param storeId 店铺id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<SeatVO> seatVoList(String storeId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席登录
|
||||||
|
*
|
||||||
|
* @param username
|
||||||
|
* @param password
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Token usernameLogin(String username, String password);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 快捷登录code 生成
|
||||||
|
*
|
||||||
|
* @param username 用户名
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String createQuickLoginCode(String username);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 快捷登录
|
||||||
|
*
|
||||||
|
* @param code
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Token quickLogin(String code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询坐席
|
||||||
|
*
|
||||||
|
* @param username
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Seat findByUsername(String username);
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
package cn.lili.modules.im.service;
|
||||||
|
|
||||||
|
import cn.lili.modules.im.entity.dos.SeatSetting;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席设置业务
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 16:18:56
|
||||||
|
*/
|
||||||
|
public interface SeatSettingService extends IService<SeatSetting> {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据店铺id获取坐席配置
|
||||||
|
*
|
||||||
|
* @param storeId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
SeatSetting getSetting(String storeId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据店铺修改坐席设置
|
||||||
|
*
|
||||||
|
* @param seatSetting 坐席设置
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
SeatSetting updateByStore(SeatSetting seatSetting);
|
||||||
|
}
|
||||||
@ -0,0 +1,143 @@
|
|||||||
|
package cn.lili.modules.im.serviceimpl;
|
||||||
|
|
||||||
|
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.im.entity.dos.ImMessage;
|
||||||
|
import cn.lili.modules.im.entity.dto.MessageQueryParams;
|
||||||
|
import cn.lili.modules.im.mapper.ImMessageMapper;
|
||||||
|
import cn.lili.modules.im.service.ImMessageService;
|
||||||
|
import cn.lili.modules.im.service.ImTalkService;
|
||||||
|
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.extension.service.impl.ServiceImpl;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Im消息 业务实现
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
||||||
|
public class ImMessageServiceImpl extends ServiceImpl<ImMessageMapper, ImMessage> implements ImMessageService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ImTalkService imTalkService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(String talkId, String accessToken) {
|
||||||
|
LambdaUpdateWrapper<ImMessage> updateWrapper = new LambdaUpdateWrapper<>();
|
||||||
|
String userId = UserContext.getAuthUser(accessToken).getId();
|
||||||
|
updateWrapper.eq(ImMessage::getTalkId, talkId);
|
||||||
|
updateWrapper.eq(ImMessage::getToUser, userId);
|
||||||
|
updateWrapper.set(ImMessage::getIsRead, true);
|
||||||
|
this.update(updateWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ImMessage> unReadMessages(String accessToken) {
|
||||||
|
String userId = UserContext.getAuthUser(accessToken).getId();
|
||||||
|
LambdaQueryWrapper<ImMessage> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(ImMessage::getToUser, userId);
|
||||||
|
queryWrapper.eq(ImMessage::getIsRead, false);
|
||||||
|
return this.list(queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ImMessage> historyMessage(String accessToken, String to) {
|
||||||
|
String userId = UserContext.getAuthUser(accessToken).getId();
|
||||||
|
LambdaQueryWrapper<ImMessage> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.and(i -> i.eq(ImMessage::getToUser, userId).and(j -> j.eq(ImMessage::getFromUser, to)));
|
||||||
|
queryWrapper.or(i -> i.eq(ImMessage::getToUser, to).and(j -> j.eq(ImMessage::getFromUser, userId)));
|
||||||
|
queryWrapper.orderByDesc(ImMessage::getCreateTime);
|
||||||
|
return this.list(queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean hasNewMessage(String accessToken) {
|
||||||
|
String userId = UserContext.getAuthUser(accessToken).getId();
|
||||||
|
LambdaQueryWrapper<ImMessage> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(ImMessage::getIsRead, false);
|
||||||
|
queryWrapper.eq(ImMessage::getToUser, userId);
|
||||||
|
return this.list(queryWrapper).size() > 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ImMessage> getList(MessageQueryParams messageQueryParams) {
|
||||||
|
List<ImMessage> messageList = this.page(PageUtil.initPage(messageQueryParams), messageQueryParams.initQueryWrapper()).getRecords();
|
||||||
|
ListSort(messageList);
|
||||||
|
readMessage(messageList);
|
||||||
|
return messageList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long unreadMessageCount() {
|
||||||
|
AuthUser currentUser = UserContext.getCurrentUser();
|
||||||
|
if(currentUser == null){
|
||||||
|
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
|
||||||
|
}
|
||||||
|
return this.count(new LambdaQueryWrapper<ImMessage>().eq(ImMessage::getToUser,currentUser.getId()).eq(ImMessage::getIsRead,false));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cleanUnreadMessage() {
|
||||||
|
AuthUser currentUser = UserContext.getCurrentUser();
|
||||||
|
if(currentUser == null){
|
||||||
|
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
|
||||||
|
}
|
||||||
|
this.update(new LambdaUpdateWrapper<ImMessage>().eq(ImMessage::getToUser,currentUser.getId()).set(ImMessage::getIsRead,true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据时间倒叙
|
||||||
|
*
|
||||||
|
* @param list
|
||||||
|
*/
|
||||||
|
private static void ListSort(List<ImMessage> list) {
|
||||||
|
list.sort(new Comparator<ImMessage>() {
|
||||||
|
@Override
|
||||||
|
public int compare(ImMessage e1, ImMessage e2) {
|
||||||
|
try {
|
||||||
|
if (e1.getCreateTime().before(e2.getCreateTime())) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阅读消息
|
||||||
|
*
|
||||||
|
* @param messageList 消息列表
|
||||||
|
*/
|
||||||
|
private void readMessage(List<ImMessage> messageList) {
|
||||||
|
if (messageList.size() > 0) {
|
||||||
|
for (ImMessage imMessage : messageList) {
|
||||||
|
if(Boolean.FALSE.equals(imMessage.getIsRead())){
|
||||||
|
imMessage.setIsRead(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.updateBatchById(messageList);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,187 @@
|
|||||||
|
package cn.lili.modules.im.serviceimpl;
|
||||||
|
|
||||||
|
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.security.enums.UserEnums;
|
||||||
|
import cn.lili.modules.im.entity.dos.ImMessage;
|
||||||
|
import cn.lili.modules.im.entity.dos.ImTalk;
|
||||||
|
import cn.lili.modules.im.entity.vo.ImTalkVO;
|
||||||
|
import cn.lili.modules.im.mapper.ImTalkMapper;
|
||||||
|
import cn.lili.modules.im.service.ImMessageService;
|
||||||
|
import cn.lili.modules.im.service.ImTalkService;
|
||||||
|
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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.stringtemplate.v4.ST;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天 业务实现
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
||||||
|
public class ImTalkServiceImpl extends ServiceImpl<ImTalkMapper, ImTalk> implements ImTalkService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MemberService memberService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private StoreService storeService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ImMessageService imMessageService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ImTalk getTalkByUser(String userId1, String userId2) {
|
||||||
|
LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(ImTalk::getUserId2, userId2);
|
||||||
|
queryWrapper.eq(ImTalk::getUserId1, userId1);
|
||||||
|
ImTalk imTalk = this.getOne(queryWrapper);
|
||||||
|
AuthUser currentUser = UserContext.getCurrentUser();
|
||||||
|
//如果没有聊天,则创建聊天
|
||||||
|
if (imTalk == null) {
|
||||||
|
// 没有登录的这个账户信息
|
||||||
|
if (currentUser == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
//当自己为店铺时
|
||||||
|
if(UserEnums.STORE.equals(currentUser.getRole())){
|
||||||
|
Store selfStore = storeService.getById(userId1);
|
||||||
|
//没有这个用户信息
|
||||||
|
Member other = memberService.getById(userId2);
|
||||||
|
if(other == null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
//自己为店铺其他人必定为用户
|
||||||
|
imTalk = new ImTalk(userId1, userId2, selfStore.getStoreLogo(), other.getFace(), selfStore.getStoreName(), other.getNickName());
|
||||||
|
imTalk.setStoreFlag1(true);
|
||||||
|
}else if(UserEnums.MEMBER.equals(currentUser.getRole())){
|
||||||
|
//没有这个店铺信息
|
||||||
|
Member self = memberService.getById(userId1);
|
||||||
|
Member otherMember = memberService.getById(userId2);
|
||||||
|
Store otherStore = storeService.getById(userId2);
|
||||||
|
if(otherStore != null){
|
||||||
|
imTalk = new ImTalk(userId1, userId2, self.getFace(), otherStore.getStoreLogo(), self.getNickName(), otherStore.getStoreName());
|
||||||
|
imTalk.setStoreFlag2(true);
|
||||||
|
}else if (otherMember != null){
|
||||||
|
imTalk = new ImTalk(userId1, userId2, self.getFace(), otherMember.getFace(), self.getNickName(), otherMember.getNickName());
|
||||||
|
}else{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.save(imTalk);
|
||||||
|
} else {
|
||||||
|
imTalk = check(imTalk);
|
||||||
|
}
|
||||||
|
return imTalk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起聊天后,如果聊天不可见为true,则需要修正
|
||||||
|
*
|
||||||
|
* @param imTalk
|
||||||
|
*/
|
||||||
|
private ImTalk check(ImTalk imTalk) {
|
||||||
|
if (imTalk.getDisable1() || imTalk.getDisable2()) {
|
||||||
|
imTalk.setDisable1(false);
|
||||||
|
imTalk.setDisable2(false);
|
||||||
|
this.updateById(imTalk);
|
||||||
|
|
||||||
|
}
|
||||||
|
return imTalk;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void top(String id, Boolean top) {
|
||||||
|
ImTalk imTalk = this.getById(id);
|
||||||
|
if (imTalk.getUserId1().equals(UserContext.getCurrentUser().getId())) {
|
||||||
|
imTalk.setTop1(top);
|
||||||
|
} else if (imTalk.getUserId2().equals(UserContext.getCurrentUser().getId())) {
|
||||||
|
imTalk.setTop2(top);
|
||||||
|
} else {
|
||||||
|
throw new ServiceException(ResultCode.ERROR);
|
||||||
|
}
|
||||||
|
this.updateById(imTalk);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disable(String id) {
|
||||||
|
ImTalk imTalk = this.getById(id);
|
||||||
|
if (imTalk.getUserId1().equals(UserContext.getCurrentUser().getId())) {
|
||||||
|
imTalk.setDisable1(true);
|
||||||
|
this.updateById(imTalk);
|
||||||
|
} else if (imTalk.getUserId2().equals(UserContext.getCurrentUser().getId())) {
|
||||||
|
imTalk.setDisable2(true);
|
||||||
|
this.updateById(imTalk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ImTalkVO> getUserTalkList(String userName) {
|
||||||
|
AuthUser authUser = UserContext.getCurrentUser();
|
||||||
|
if(authUser == null){
|
||||||
|
throw new ServiceException(ResultCode.USER_NOT_LOGIN);
|
||||||
|
}
|
||||||
|
LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.and(wq->{
|
||||||
|
wq.like(ImTalk::getName1, userName).or().like(ImTalk::getName2,userName);
|
||||||
|
});
|
||||||
|
queryWrapper.and(wq->{
|
||||||
|
wq.like(ImTalk::getUserId1, authUser.getId()).or().like(ImTalk::getUserId2,authUser.getId());
|
||||||
|
});
|
||||||
|
queryWrapper.orderByDesc(ImTalk::getLastTalkTime);
|
||||||
|
List<ImTalk> imTalks = this.list(queryWrapper);
|
||||||
|
List<ImTalkVO> imTalkVOList = imTalks.stream().map(imTalk -> {
|
||||||
|
return new ImTalkVO(imTalk, authUser.getId());
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
getUnread(imTalkVOList);
|
||||||
|
return imTalkVOList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ImTalkVO> getStoreTalkList() {
|
||||||
|
AuthUser authUser = UserContext.getCurrentUser();
|
||||||
|
if(authUser == null){
|
||||||
|
throw new ServiceException(ResultCode.STORE_NOT_LOGIN_ERROR);
|
||||||
|
}
|
||||||
|
LambdaQueryWrapper<ImTalk> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.and(wq->{
|
||||||
|
wq.like(ImTalk::getUserId1, authUser.getStoreId()).or().like(ImTalk::getUserId2,authUser.getStoreId());
|
||||||
|
});
|
||||||
|
queryWrapper.orderByDesc(ImTalk::getLastTalkTime);
|
||||||
|
List<ImTalk> imTalks = this.list(queryWrapper);
|
||||||
|
|
||||||
|
List<ImTalkVO> imTalkVOList = imTalks.stream().map(imTalk -> {
|
||||||
|
return new ImTalkVO(imTalk, authUser.getStoreId());
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
getUnread(imTalkVOList);
|
||||||
|
return imTalkVOList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取未读消息数量
|
||||||
|
* @param imTalkVOList
|
||||||
|
*/
|
||||||
|
private void getUnread(List<ImTalkVO> imTalkVOList){
|
||||||
|
if(imTalkVOList.size() > 0){
|
||||||
|
for (ImTalkVO imTalkVO : imTalkVOList) {
|
||||||
|
long count = imMessageService.count(new LambdaQueryWrapper<ImMessage>().eq(ImMessage::getFromUser, imTalkVO.getUserId()).eq(ImMessage::getIsRead, false));
|
||||||
|
imTalkVO.setUnread(count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
package cn.lili.modules.im.serviceimpl;
|
||||||
|
|
||||||
|
import cn.lili.common.security.context.UserContext;
|
||||||
|
import cn.lili.common.vo.PageVO;
|
||||||
|
import cn.lili.modules.im.entity.dos.QA;
|
||||||
|
import cn.lili.modules.im.mapper.QAMapper;
|
||||||
|
import cn.lili.modules.im.service.QAService;
|
||||||
|
import cn.lili.mybatis.util.PageUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席业务层实现
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 16:18:56
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public class QAServiceImpl extends ServiceImpl<QAMapper, QA> implements QAService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPage<QA> getStoreQA(String word, PageVO pageVo) {
|
||||||
|
LambdaQueryWrapper<QA> qaLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
qaLambdaQueryWrapper.eq(QA::getTenantId, UserContext.getCurrentUser().getTenantId());
|
||||||
|
qaLambdaQueryWrapper.like(QA::getQuestion, word);
|
||||||
|
return this.page(PageUtil.initPage(pageVo), qaLambdaQueryWrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,111 @@
|
|||||||
|
package cn.lili.modules.im.serviceimpl;
|
||||||
|
|
||||||
|
import cn.lili.cache.Cache;
|
||||||
|
import cn.lili.common.enums.ResultCode;
|
||||||
|
import cn.lili.common.exception.ServiceException;
|
||||||
|
import cn.lili.common.security.token.Token;
|
||||||
|
import cn.lili.common.utils.StringUtils;
|
||||||
|
import cn.lili.modules.im.entity.dos.Seat;
|
||||||
|
import cn.lili.modules.im.entity.enums.OnlineStatusEnum;
|
||||||
|
import cn.lili.modules.im.entity.vo.SeatVO;
|
||||||
|
import cn.lili.modules.im.mapper.SeatMapper;
|
||||||
|
import cn.lili.modules.im.service.SeatService;
|
||||||
|
import cn.lili.modules.im.token.SeatTokenGenerate;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席业务层实现
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 16:18:56
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public class SeatServiceImpl extends ServiceImpl<SeatMapper, Seat> implements SeatService {
|
||||||
|
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SeatTokenGenerate seatTokenGenerate;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Cache<String> cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 快捷登录缓存前缀
|
||||||
|
*/
|
||||||
|
private static String prefix = "{quick_login}_";
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SeatVO> seatVoList(String storeId) {
|
||||||
|
|
||||||
|
LambdaQueryWrapper<Seat> seatLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
seatLambdaQueryWrapper.eq(Seat::getTenantId, storeId);
|
||||||
|
List<Seat> list = this.list(seatLambdaQueryWrapper);
|
||||||
|
|
||||||
|
//转换模型为VO
|
||||||
|
List<SeatVO> results = list.stream().map(item -> (SeatVO) item).collect(Collectors.toList());
|
||||||
|
//填充坐席当前状态
|
||||||
|
//todo
|
||||||
|
results.forEach(item -> {
|
||||||
|
item.setOnlineStatus(OnlineStatusEnum.ONLINE.name());
|
||||||
|
});
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Token usernameLogin(String username, String password) {
|
||||||
|
|
||||||
|
Seat seat = this.findByUsername(username);
|
||||||
|
//判断用户是否存在
|
||||||
|
if (seat == null || !seat.getDisabled()) {
|
||||||
|
throw new ServiceException(ResultCode.ERROR);
|
||||||
|
}
|
||||||
|
//判断密码是否输入正确
|
||||||
|
if (!new BCryptPasswordEncoder().matches(password, seat.getPassword())) {
|
||||||
|
throw new ServiceException(ResultCode.ERROR);
|
||||||
|
}
|
||||||
|
return seatTokenGenerate.createToken(seat, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String createQuickLoginCode(String username) {
|
||||||
|
String code = UUID.randomUUID().toString();
|
||||||
|
cache.put(prefix + code, username, 20L);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Token quickLogin(String code) {
|
||||||
|
String username = cache.get(prefix + code);
|
||||||
|
cache.remove(prefix + code);
|
||||||
|
if (StringUtils.isEmpty(username)) {
|
||||||
|
throw new ServiceException(ResultCode.ERROR);
|
||||||
|
}
|
||||||
|
return seatTokenGenerate.createToken(findByUsername(username), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询坐席
|
||||||
|
*
|
||||||
|
* @param username
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Seat findByUsername(String username) {
|
||||||
|
LambdaQueryWrapper<Seat> seatLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
seatLambdaQueryWrapper.eq(Seat::getUsername, username);
|
||||||
|
return this.getOne(seatLambdaQueryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
package cn.lili.modules.im.serviceimpl;
|
||||||
|
|
||||||
|
import cn.lili.common.enums.ResultCode;
|
||||||
|
import cn.lili.common.exception.ServiceException;
|
||||||
|
import cn.lili.modules.im.entity.dos.SeatSetting;
|
||||||
|
import cn.lili.modules.im.mapper.SeatSettingMapper;
|
||||||
|
import cn.lili.modules.im.service.SeatSettingService;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席设置业务层实现
|
||||||
|
*
|
||||||
|
* @author pikachu
|
||||||
|
* @since 2020-02-18 16:18:56
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public class SeatSettingServiceImpl extends ServiceImpl<SeatSettingMapper, SeatSetting> implements SeatSettingService {
|
||||||
|
@Override
|
||||||
|
public SeatSetting getSetting(String storeId) {
|
||||||
|
LambdaQueryWrapper<SeatSetting> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(SeatSetting::getTenantId, storeId);
|
||||||
|
SeatSetting seatSetting = this.baseMapper.selectOne(queryWrapper);
|
||||||
|
if (seatSetting == null) {
|
||||||
|
seatSetting = new SeatSetting();
|
||||||
|
seatSetting.setOutLineAutoReply("您好,我现在不在线,请您留下关键内容和联系方式,我看到后会立马回电。");
|
||||||
|
seatSetting.setLongTermAutoReply("您好,我正在查阅相关资料,请您稍等。");
|
||||||
|
seatSetting.setWelcome("您好,请问有什么可以帮您?");
|
||||||
|
seatSetting.setTenantId(storeId);
|
||||||
|
this.save(seatSetting);
|
||||||
|
}
|
||||||
|
return seatSetting;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SeatSetting updateByStore(SeatSetting seatSetting) {
|
||||||
|
SeatSetting oldSetting = this.baseMapper.selectById(seatSetting.getId());
|
||||||
|
if (oldSetting.getTenantId().equals(seatSetting.getTenantId())) {
|
||||||
|
this.updateById(seatSetting);
|
||||||
|
} else {
|
||||||
|
throw new ServiceException(ResultCode.ERROR);
|
||||||
|
}
|
||||||
|
return seatSetting;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
package cn.lili.modules.im.token;
|
||||||
|
|
||||||
|
import cn.lili.common.security.AuthUser;
|
||||||
|
import cn.lili.common.security.enums.UserEnums;
|
||||||
|
import cn.lili.common.security.token.Token;
|
||||||
|
import cn.lili.common.security.token.TokenUtil;
|
||||||
|
import cn.lili.common.security.token.base.AbstractTokenGenerate;
|
||||||
|
import cn.lili.modules.im.entity.dos.Seat;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会员token生成
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v4.0
|
||||||
|
* @since 2020/11/16 10:50
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SeatTokenGenerate extends AbstractTokenGenerate<Seat> {
|
||||||
|
@Autowired
|
||||||
|
private TokenUtil tokenUtil;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Token createToken(Seat seat, Boolean longTerm) {
|
||||||
|
AuthUser authUser = new AuthUser(
|
||||||
|
seat.getUsername(),
|
||||||
|
seat.getId(),
|
||||||
|
seat.getNickName(),
|
||||||
|
seat.getFace(),
|
||||||
|
UserEnums.SEAT);
|
||||||
|
authUser.setTenantId(seat.getTenantId());
|
||||||
|
//登陆成功生成token
|
||||||
|
return tokenUtil.createToken(seat.getUsername(), authUser, longTerm, UserEnums.SEAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Token refreshToken(String refreshToken) {
|
||||||
|
return tokenUtil.refreshToken(refreshToken, UserEnums.SEAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -28,6 +28,9 @@ public class FootPrint extends BaseEntity {
|
|||||||
@ApiModelProperty(value = "会员ID")
|
@ApiModelProperty(value = "会员ID")
|
||||||
private String memberId;
|
private String memberId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "店铺Id")
|
||||||
|
private String storeId;
|
||||||
|
|
||||||
@ApiModelProperty(value = "商品ID")
|
@ApiModelProperty(value = "商品ID")
|
||||||
private String goodsId;
|
private String goodsId;
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,36 @@
|
|||||||
|
package cn.lili.modules.member.entity.dto;
|
||||||
|
|
||||||
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
|
import cn.lili.common.vo.PageVO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author chc
|
||||||
|
* @since 2022/6/2114:46
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel
|
||||||
|
public class FootPrintQueryParams extends PageVO {
|
||||||
|
|
||||||
|
@ApiModelProperty("用户Id")
|
||||||
|
private String memberId;
|
||||||
|
|
||||||
|
@ApiModelProperty("店铺Id")
|
||||||
|
private String storeId;
|
||||||
|
|
||||||
|
public <T> QueryWrapper<T> queryWrapper() {
|
||||||
|
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
|
||||||
|
if (CharSequenceUtil.isNotEmpty(memberId)) {
|
||||||
|
queryWrapper.eq("member_id", memberId);
|
||||||
|
}
|
||||||
|
if (CharSequenceUtil.isNotEmpty(storeId)) {
|
||||||
|
queryWrapper.eq("store_id", storeId);
|
||||||
|
}
|
||||||
|
queryWrapper.eq("delete_flag",false);
|
||||||
|
queryWrapper.orderByDesc("create_time");
|
||||||
|
return queryWrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2,6 +2,7 @@ package cn.lili.modules.member.service;
|
|||||||
|
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.modules.member.entity.dos.FootPrint;
|
import cn.lili.modules.member.entity.dos.FootPrint;
|
||||||
|
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
|
||||||
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
||||||
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;
|
||||||
@ -42,10 +43,10 @@ public interface FootprintService extends IService<FootPrint> {
|
|||||||
/**
|
/**
|
||||||
* 获取会员浏览历史分页
|
* 获取会员浏览历史分页
|
||||||
*
|
*
|
||||||
* @param pageVO 分页
|
* @param params 分页
|
||||||
* @return 会员浏览历史列表
|
* @return 会员浏览历史列表
|
||||||
*/
|
*/
|
||||||
IPage<EsGoodsIndex> footPrintPage(PageVO pageVO);
|
IPage<EsGoodsIndex> footPrintPage(FootPrintQueryParams params);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前会员的浏览记录数量
|
* 获取当前会员的浏览记录数量
|
||||||
@ -53,4 +54,5 @@ public interface FootprintService extends IService<FootPrint> {
|
|||||||
* @return 当前会员的浏览记录数量
|
* @return 当前会员的浏览记录数量
|
||||||
*/
|
*/
|
||||||
long getFootprintNum();
|
long getFootprintNum();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -252,7 +252,6 @@ public interface MemberService extends IService<Member> {
|
|||||||
void logout(UserEnums userEnums);
|
void logout(UserEnums userEnums);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <<<<<<< HEAD
|
|
||||||
* 修改会员是否拥有店铺
|
* 修改会员是否拥有店铺
|
||||||
*
|
*
|
||||||
* @param haveStore 是否拥有店铺
|
* @param haveStore 是否拥有店铺
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package cn.lili.modules.member.serviceimpl;
|
|||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.modules.member.entity.dos.FootPrint;
|
import cn.lili.modules.member.entity.dos.FootPrint;
|
||||||
|
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
|
||||||
import cn.lili.modules.member.mapper.FootprintMapper;
|
import cn.lili.modules.member.mapper.FootprintMapper;
|
||||||
import cn.lili.modules.member.service.FootprintService;
|
import cn.lili.modules.member.service.FootprintService;
|
||||||
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
||||||
@ -43,19 +44,17 @@ public class FootprintServiceImpl extends ServiceImpl<FootprintMapper, FootPrint
|
|||||||
queryWrapper.eq(FootPrint::getGoodsId, footPrint.getGoodsId());
|
queryWrapper.eq(FootPrint::getGoodsId, footPrint.getGoodsId());
|
||||||
//如果已存在某商品记录,则更新其修改时间
|
//如果已存在某商品记录,则更新其修改时间
|
||||||
//如果不存在则添加记录
|
//如果不存在则添加记录
|
||||||
|
//为了保证足迹的排序,将原本足迹删除后重新添加
|
||||||
List<FootPrint> oldPrints = list(queryWrapper);
|
List<FootPrint> oldPrints = list(queryWrapper);
|
||||||
if (oldPrints != null && !oldPrints.isEmpty()) {
|
if (oldPrints != null && !oldPrints.isEmpty()) {
|
||||||
FootPrint oldPrint = oldPrints.get(0);
|
FootPrint oldPrint = oldPrints.get(0);
|
||||||
oldPrint.setSkuId(footPrint.getSkuId());
|
this.removeById(oldPrint.getId());
|
||||||
this.updateById(oldPrint);
|
|
||||||
return oldPrint;
|
|
||||||
} else {
|
|
||||||
footPrint.setCreateTime(new Date());
|
|
||||||
this.save(footPrint);
|
|
||||||
//删除超过100条后的记录
|
|
||||||
this.baseMapper.deleteLastFootPrint(footPrint.getMemberId());
|
|
||||||
return footPrint;
|
|
||||||
}
|
}
|
||||||
|
footPrint.setCreateTime(new Date());
|
||||||
|
this.save(footPrint);
|
||||||
|
//删除超过100条后的记录
|
||||||
|
this.baseMapper.deleteLastFootPrint(footPrint.getMemberId());
|
||||||
|
return footPrint;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -74,15 +73,8 @@ public class FootprintServiceImpl extends ServiceImpl<FootprintMapper, FootPrint
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<EsGoodsIndex> footPrintPage(PageVO pageVO) {
|
public IPage<EsGoodsIndex> footPrintPage(FootPrintQueryParams params) {
|
||||||
|
IPage<FootPrint> footPrintPages = this.page(PageUtil.initPage(params), params.queryWrapper());
|
||||||
LambdaQueryWrapper<FootPrint> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
|
||||||
lambdaQueryWrapper.eq(FootPrint::getMemberId, UserContext.getCurrentUser().getId());
|
|
||||||
lambdaQueryWrapper.eq(FootPrint::getDeleteFlag, false);
|
|
||||||
lambdaQueryWrapper.orderByDesc(FootPrint::getCreateTime);
|
|
||||||
IPage<FootPrint> footPrintPages = this.page(PageUtil.initPage(pageVO), lambdaQueryWrapper);
|
|
||||||
|
|
||||||
|
|
||||||
//定义结果
|
//定义结果
|
||||||
IPage<EsGoodsIndex> esGoodsIndexIPage = new Page<>();
|
IPage<EsGoodsIndex> esGoodsIndexIPage = new Page<>();
|
||||||
|
|
||||||
@ -90,7 +82,7 @@ public class FootprintServiceImpl extends ServiceImpl<FootprintMapper, FootPrint
|
|||||||
return esGoodsIndexIPage;
|
return esGoodsIndexIPage;
|
||||||
} else {
|
} else {
|
||||||
List<EsGoodsIndex> list = esGoodsSearchService.getEsGoodsBySkuIds(
|
List<EsGoodsIndex> list = esGoodsSearchService.getEsGoodsBySkuIds(
|
||||||
footPrintPages.getRecords().stream().map(FootPrint::getSkuId).collect(Collectors.toList()), pageVO);
|
footPrintPages.getRecords().stream().map(FootPrint::getSkuId).collect(Collectors.toList()), params);
|
||||||
|
|
||||||
esGoodsIndexIPage.setPages(footPrintPages.getPages());
|
esGoodsIndexIPage.setPages(footPrintPages.getPages());
|
||||||
esGoodsIndexIPage.setRecords(list);
|
esGoodsIndexIPage.setRecords(list);
|
||||||
|
|||||||
@ -40,13 +40,16 @@ import cn.lili.modules.store.entity.dos.Store;
|
|||||||
import cn.lili.modules.store.entity.enums.StoreStatusEnum;
|
import cn.lili.modules.store.entity.enums.StoreStatusEnum;
|
||||||
import cn.lili.modules.store.service.StoreService;
|
import cn.lili.modules.store.service.StoreService;
|
||||||
import cn.lili.mybatis.util.PageUtil;
|
import cn.lili.mybatis.util.PageUtil;
|
||||||
|
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
|
||||||
import cn.lili.rocketmq.tags.MemberTagsEnum;
|
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.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
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.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.ApplicationEventPublisher;
|
import org.springframework.context.ApplicationEventPublisher;
|
||||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
@ -94,6 +97,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
|
|||||||
@Autowired
|
@Autowired
|
||||||
private RocketmqCustomProperties rocketmqCustomProperties;
|
private RocketmqCustomProperties rocketmqCustomProperties;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RocketMQTemplate rocketMQTemplate;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ApplicationEventPublisher applicationEventPublisher;
|
private ApplicationEventPublisher applicationEventPublisher;
|
||||||
/**
|
/**
|
||||||
@ -183,7 +189,8 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
|
|||||||
@Override
|
@Override
|
||||||
public Token usernameStoreLogin(String username, String password) {
|
public Token usernameStoreLogin(String username, String password) {
|
||||||
|
|
||||||
Member member = this.findMember(username);
|
// Member member = this.findMember(username);
|
||||||
|
Member member = this.getOne(new LambdaQueryWrapper<Member>().eq(Member::getMobile,username));
|
||||||
//判断用户是否存在
|
//判断用户是否存在
|
||||||
if (member == null || !member.getDisabled()) {
|
if (member == null || !member.getDisabled()) {
|
||||||
throw new ServiceException(ResultCode.USER_NOT_EXIST);
|
throw new ServiceException(ResultCode.USER_NOT_EXIST);
|
||||||
@ -301,6 +308,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
|
|||||||
BeanUtil.copyProperties(memberEditDTO, member);
|
BeanUtil.copyProperties(memberEditDTO, member);
|
||||||
//修改会员
|
//修改会员
|
||||||
this.updateById(member);
|
this.updateById(member);
|
||||||
|
String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_INFO_EDIT.name();
|
||||||
|
//发送订单变更mq消息
|
||||||
|
rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback());
|
||||||
return member;
|
return member;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import cn.lili.modules.order.order.entity.vo.OrderVO;
|
|||||||
import cn.lili.modules.order.order.entity.vo.ReceiptVO;
|
import cn.lili.modules.order.order.entity.vo.ReceiptVO;
|
||||||
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
||||||
import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
|
import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
|
||||||
|
import cn.lili.modules.store.entity.dos.StoreAddress;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ -106,6 +107,10 @@ public class TradeDTO implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private MemberAddress memberAddress;
|
private MemberAddress memberAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自提地址
|
||||||
|
*/
|
||||||
|
private StoreAddress storeAddress;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 客户端类型
|
* 客户端类型
|
||||||
|
|||||||
@ -160,35 +160,37 @@ public class CheckDataRender implements CartRenderStep {
|
|||||||
private void groupStore(TradeDTO tradeDTO) {
|
private void groupStore(TradeDTO tradeDTO) {
|
||||||
//渲染的购物车
|
//渲染的购物车
|
||||||
List<CartVO> cartList = new ArrayList<>();
|
List<CartVO> cartList = new ArrayList<>();
|
||||||
|
if(tradeDTO.getCartList() == null || tradeDTO.getCartList().size() == 0){
|
||||||
//根据店铺分组
|
//根据店铺分组
|
||||||
Map<String, List<CartSkuVO>> storeCollect = tradeDTO.getSkuList().stream().collect(Collectors.groupingBy(CartSkuVO::getStoreId));
|
Map<String, List<CartSkuVO>> storeCollect = tradeDTO.getSkuList().stream().collect(Collectors.groupingBy(CartSkuVO::getStoreId));
|
||||||
for (Map.Entry<String, List<CartSkuVO>> storeCart : storeCollect.entrySet()) {
|
for (Map.Entry<String, List<CartSkuVO>> storeCart : storeCollect.entrySet()) {
|
||||||
if (!storeCart.getValue().isEmpty()) {
|
if (!storeCart.getValue().isEmpty()) {
|
||||||
CartVO cartVO = new CartVO(storeCart.getValue().get(0));
|
CartVO cartVO = new CartVO(storeCart.getValue().get(0));
|
||||||
if (CharSequenceUtil.isEmpty(cartVO.getDeliveryMethod())) {
|
if (CharSequenceUtil.isEmpty(cartVO.getDeliveryMethod())) {
|
||||||
cartVO.setDeliveryMethod(DeliveryMethodEnum.LOGISTICS.name());
|
cartVO.setDeliveryMethod(DeliveryMethodEnum.LOGISTICS.name());
|
||||||
}
|
}
|
||||||
cartVO.setSkuList(storeCart.getValue());
|
cartVO.setSkuList(storeCart.getValue());
|
||||||
try {
|
try {
|
||||||
//筛选属于当前店铺的优惠券
|
//筛选属于当前店铺的优惠券
|
||||||
storeCart.getValue().forEach(i -> i.getPromotionMap().forEach((key, value) -> {
|
storeCart.getValue().forEach(i -> i.getPromotionMap().forEach((key, value) -> {
|
||||||
if (key.contains(PromotionTypeEnum.COUPON.name())) {
|
if (key.contains(PromotionTypeEnum.COUPON.name())) {
|
||||||
JSONObject promotionsObj = JSONUtil.parseObj(value);
|
JSONObject promotionsObj = JSONUtil.parseObj(value);
|
||||||
Coupon coupon = JSONUtil.toBean(promotionsObj, Coupon.class);
|
Coupon coupon = JSONUtil.toBean(promotionsObj, Coupon.class);
|
||||||
if (key.contains(PromotionTypeEnum.COUPON.name()) && coupon.getStoreId().equals(storeCart.getKey())) {
|
if (key.contains(PromotionTypeEnum.COUPON.name()) && coupon.getStoreId().equals(storeCart.getKey())) {
|
||||||
cartVO.getCanReceiveCoupon().add(new CouponVO(coupon));
|
cartVO.getCanReceiveCoupon().add(new CouponVO(coupon));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}));
|
||||||
}));
|
} catch (Exception e) {
|
||||||
} catch (Exception e) {
|
log.error("筛选属于当前店铺的优惠券发生异常!", e);
|
||||||
log.error("筛选属于当前店铺的优惠券发生异常!", e);
|
}
|
||||||
|
storeCart.getValue().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).findFirst().ifPresent(cartSkuVO -> cartVO.setChecked(true));
|
||||||
|
cartList.add(cartVO);
|
||||||
}
|
}
|
||||||
storeCart.getValue().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).findFirst().ifPresent(cartSkuVO -> cartVO.setChecked(true));
|
|
||||||
cartList.add(cartVO);
|
|
||||||
}
|
}
|
||||||
|
tradeDTO.setCartList(cartList);
|
||||||
}
|
}
|
||||||
tradeDTO.setCartList(cartList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -3,10 +3,12 @@ package cn.lili.modules.order.cart.render.impl;
|
|||||||
import cn.lili.common.utils.CurrencyUtil;
|
import cn.lili.common.utils.CurrencyUtil;
|
||||||
import cn.lili.modules.member.entity.dos.MemberAddress;
|
import cn.lili.modules.member.entity.dos.MemberAddress;
|
||||||
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
||||||
|
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
|
||||||
import cn.lili.modules.order.cart.entity.enums.RenderStepEnums;
|
import cn.lili.modules.order.cart.entity.enums.RenderStepEnums;
|
||||||
import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
|
import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
|
||||||
import cn.lili.modules.order.cart.render.CartRenderStep;
|
import cn.lili.modules.order.cart.render.CartRenderStep;
|
||||||
import cn.lili.modules.store.entity.dos.FreightTemplateChild;
|
import cn.lili.modules.store.entity.dos.FreightTemplateChild;
|
||||||
|
import cn.lili.modules.store.entity.dos.StoreAddress;
|
||||||
import cn.lili.modules.store.entity.dto.FreightTemplateChildDTO;
|
import cn.lili.modules.store.entity.dto.FreightTemplateChildDTO;
|
||||||
import cn.lili.modules.store.entity.enums.FreightTemplateEnum;
|
import cn.lili.modules.store.entity.enums.FreightTemplateEnum;
|
||||||
import cn.lili.modules.store.entity.vos.FreightTemplateVO;
|
import cn.lili.modules.store.entity.vos.FreightTemplateVO;
|
||||||
@ -42,71 +44,77 @@ public class SkuFreightRender implements CartRenderStep {
|
|||||||
List<CartSkuVO> cartSkuVOS = tradeDTO.getCheckedSkuList();
|
List<CartSkuVO> cartSkuVOS = tradeDTO.getCheckedSkuList();
|
||||||
//会员收货地址问题处理
|
//会员收货地址问题处理
|
||||||
MemberAddress memberAddress = tradeDTO.getMemberAddress();
|
MemberAddress memberAddress = tradeDTO.getMemberAddress();
|
||||||
|
StoreAddress storeAddress = tradeDTO.getStoreAddress();
|
||||||
//如果收货地址为空,则抛出异常
|
//如果收货地址为空,则抛出异常
|
||||||
if (memberAddress == null) {
|
if (memberAddress == null && storeAddress == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//运费分组信息
|
//选择物流的时候计算价格
|
||||||
Map<String, List<String>> freightGroups = freightTemplateGrouping(cartSkuVOS);
|
if(DeliveryMethodEnum.LOGISTICS.name().equals(tradeDTO.getCartList().get(0).getDeliveryMethod())){
|
||||||
|
if (memberAddress != null) {
|
||||||
|
//运费分组信息
|
||||||
|
Map<String, List<String>> freightGroups = freightTemplateGrouping(cartSkuVOS);
|
||||||
|
|
||||||
//循环运费模版
|
//循环运费模版
|
||||||
for (Map.Entry<String, List<String>> freightTemplateGroup : freightGroups.entrySet()) {
|
for (Map.Entry<String, List<String>> freightTemplateGroup : freightGroups.entrySet()) {
|
||||||
|
|
||||||
//商品id列表
|
//商品id列表
|
||||||
List<String> skuIds = freightTemplateGroup.getValue();
|
List<String> skuIds = freightTemplateGroup.getValue();
|
||||||
|
|
||||||
//当前购物车商品列表
|
//当前购物车商品列表
|
||||||
List<CartSkuVO> currentCartSkus = cartSkuVOS.stream().filter(item -> skuIds.contains(item.getGoodsSku().getId())).collect(Collectors.toList());
|
List<CartSkuVO> currentCartSkus = cartSkuVOS.stream().filter(item -> skuIds.contains(item.getGoodsSku().getId())).collect(Collectors.toList());
|
||||||
|
|
||||||
//寻找对应对商品运费计算模版
|
//寻找对应对商品运费计算模版
|
||||||
FreightTemplateVO freightTemplate = freightTemplateService.getFreightTemplate(freightTemplateGroup.getKey());
|
FreightTemplateVO freightTemplate = freightTemplateService.getFreightTemplate(freightTemplateGroup.getKey());
|
||||||
if (freightTemplate != null
|
if (freightTemplate != null
|
||||||
&& freightTemplate.getFreightTemplateChildList() != null
|
&& freightTemplate.getFreightTemplateChildList() != null
|
||||||
&& !freightTemplate.getFreightTemplateChildList().isEmpty()) {
|
&& !freightTemplate.getFreightTemplateChildList().isEmpty()) {
|
||||||
//店铺模版免运费则跳过
|
//店铺模版免运费则跳过
|
||||||
if (freightTemplate.getPricingMethod().equals(FreightTemplateEnum.FREE.name())) {
|
if (freightTemplate.getPricingMethod().equals(FreightTemplateEnum.FREE.name())) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//运费模版
|
//运费模版
|
||||||
FreightTemplateChild freightTemplateChild = null;
|
FreightTemplateChild freightTemplateChild = null;
|
||||||
|
|
||||||
//获取市级别id匹配运费模版
|
//获取市级别id匹配运费模版
|
||||||
String addressId = memberAddress.getConsigneeAddressIdPath().split(",")[1];
|
String addressId = memberAddress.getConsigneeAddressIdPath().split(",")[1];
|
||||||
for (FreightTemplateChild templateChild : freightTemplate.getFreightTemplateChildList()) {
|
for (FreightTemplateChild templateChild : freightTemplate.getFreightTemplateChildList()) {
|
||||||
//模版匹配判定
|
//模版匹配判定
|
||||||
if (templateChild.getAreaId().contains(addressId)) {
|
if (templateChild.getAreaId().contains(addressId)) {
|
||||||
freightTemplateChild = templateChild;
|
freightTemplateChild = templateChild;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//如果没有匹配到物流规则,则说明不支持配送
|
||||||
|
if (freightTemplateChild == null) {
|
||||||
|
if (tradeDTO.getNotSupportFreight() == null) {
|
||||||
|
tradeDTO.setNotSupportFreight(new ArrayList<>());
|
||||||
|
}
|
||||||
|
tradeDTO.getNotSupportFreight().addAll(currentCartSkus);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//物流规则模型创立
|
||||||
|
FreightTemplateChildDTO freightTemplateChildDTO = new FreightTemplateChildDTO(freightTemplateChild);
|
||||||
|
//模型写入运费模版设置的计费方式
|
||||||
|
freightTemplateChildDTO.setPricingMethod(freightTemplate.getPricingMethod());
|
||||||
|
|
||||||
|
//计算运费总数
|
||||||
|
Double count = currentCartSkus.stream().mapToDouble(item ->
|
||||||
|
// 根据计费规则 累加计费基数
|
||||||
|
freightTemplateChildDTO.getPricingMethod().equals(FreightTemplateEnum.NUM.name()) ?
|
||||||
|
item.getNum().doubleValue() :
|
||||||
|
CurrencyUtil.mul(item.getNum(), item.getGoodsSku().getWeight())
|
||||||
|
).sum();
|
||||||
|
|
||||||
|
//计算运费
|
||||||
|
Double countFreight = countFreight(count, freightTemplateChildDTO);
|
||||||
|
|
||||||
|
//写入SKU运费
|
||||||
|
resetFreightPrice(FreightTemplateEnum.valueOf(freightTemplateChildDTO.getPricingMethod()), count, countFreight, currentCartSkus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//如果没有匹配到物流规则,则说明不支持配送
|
|
||||||
if (freightTemplateChild == null) {
|
|
||||||
if (tradeDTO.getNotSupportFreight() == null) {
|
|
||||||
tradeDTO.setNotSupportFreight(new ArrayList<>());
|
|
||||||
}
|
|
||||||
tradeDTO.getNotSupportFreight().addAll(currentCartSkus);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//物流规则模型创立
|
|
||||||
FreightTemplateChildDTO freightTemplateChildDTO = new FreightTemplateChildDTO(freightTemplateChild);
|
|
||||||
//模型写入运费模版设置的计费方式
|
|
||||||
freightTemplateChildDTO.setPricingMethod(freightTemplate.getPricingMethod());
|
|
||||||
|
|
||||||
//计算运费总数
|
|
||||||
Double count = currentCartSkus.stream().mapToDouble(item ->
|
|
||||||
// 根据计费规则 累加计费基数
|
|
||||||
freightTemplateChildDTO.getPricingMethod().equals(FreightTemplateEnum.NUM.name()) ?
|
|
||||||
item.getNum().doubleValue() :
|
|
||||||
CurrencyUtil.mul(item.getNum(), item.getGoodsSku().getWeight())
|
|
||||||
).sum();
|
|
||||||
|
|
||||||
//计算运费
|
|
||||||
Double countFreight = countFreight(count, freightTemplateChildDTO);
|
|
||||||
|
|
||||||
//写入SKU运费
|
|
||||||
resetFreightPrice(FreightTemplateEnum.valueOf(freightTemplateChildDTO.getPricingMethod()), count, countFreight, currentCartSkus);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,8 @@ import cn.lili.modules.order.cart.entity.vo.TradeParams;
|
|||||||
import cn.lili.modules.order.order.entity.dos.Trade;
|
import cn.lili.modules.order.order.entity.dos.Trade;
|
||||||
import cn.lili.modules.order.order.entity.vo.ReceiptVO;
|
import cn.lili.modules.order.order.entity.vo.ReceiptVO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 购物车业务层
|
* 购物车业务层
|
||||||
*
|
*
|
||||||
@ -111,6 +113,14 @@ public interface CartService {
|
|||||||
*/
|
*/
|
||||||
void shippingAddress(String shippingAddressId, String way);
|
void shippingAddress(String shippingAddressId, String way);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选择自提地址
|
||||||
|
*
|
||||||
|
* @param shopAddressId 收货地址id
|
||||||
|
* @param way 购物车类型
|
||||||
|
*/
|
||||||
|
void shippingSelfAddress(String shopAddressId, String way);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 选择发票
|
* 选择发票
|
||||||
*
|
*
|
||||||
@ -123,11 +133,10 @@ public interface CartService {
|
|||||||
/**
|
/**
|
||||||
* 选择配送方式
|
* 选择配送方式
|
||||||
*
|
*
|
||||||
* @param storeId 店铺id
|
|
||||||
* @param deliveryMethod 配送方式
|
* @param deliveryMethod 配送方式
|
||||||
* @param way 购物车类型
|
* @param way 购物车类型
|
||||||
*/
|
*/
|
||||||
void shippingMethod(String storeId, String deliveryMethod, String way);
|
void shippingMethod(String deliveryMethod, String way);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取购物车商品数量
|
* 获取购物车商品数量
|
||||||
@ -160,4 +169,11 @@ public interface CartService {
|
|||||||
* @return 交易信息
|
* @return 交易信息
|
||||||
*/
|
*/
|
||||||
Trade createTrade(TradeParams tradeParams);
|
Trade createTrade(TradeParams tradeParams);
|
||||||
|
|
||||||
|
/***
|
||||||
|
* 获取可使用的配送方式
|
||||||
|
* @param way
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<String> shippingMethodList(String way);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,6 +46,10 @@ import cn.lili.modules.promotion.service.PointsGoodsService;
|
|||||||
import cn.lili.modules.promotion.service.PromotionGoodsService;
|
import cn.lili.modules.promotion.service.PromotionGoodsService;
|
||||||
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
|
||||||
import cn.lili.modules.search.service.EsGoodsSearchService;
|
import cn.lili.modules.search.service.EsGoodsSearchService;
|
||||||
|
import cn.lili.modules.store.entity.dos.Store;
|
||||||
|
import cn.lili.modules.store.entity.dos.StoreAddress;
|
||||||
|
import cn.lili.modules.store.service.StoreAddressService;
|
||||||
|
import cn.lili.modules.store.service.StoreService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -116,6 +120,12 @@ public class CartServiceImpl implements CartService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private WholesaleService wholesaleService;
|
private WholesaleService wholesaleService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private StoreService storeService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private StoreAddressService storeAddressService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(String skuId, Integer num, String cartType, Boolean cover) {
|
public void add(String skuId, Integer num, String cartType, Boolean cover) {
|
||||||
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
|
AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
|
||||||
@ -438,6 +448,20 @@ public class CartServiceImpl implements CartService {
|
|||||||
this.resetTradeDTO(tradeDTO);
|
this.resetTradeDTO(tradeDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shippingSelfAddress(String shopAddressId, String way) {
|
||||||
|
//默认购物车
|
||||||
|
CartTypeEnum cartTypeEnum = CartTypeEnum.CART;
|
||||||
|
if (CharSequenceUtil.isNotEmpty(way)) {
|
||||||
|
cartTypeEnum = CartTypeEnum.valueOf(way);
|
||||||
|
}
|
||||||
|
|
||||||
|
TradeDTO tradeDTO = this.readDTO(cartTypeEnum);
|
||||||
|
StoreAddress storeAddress = storeAddressService.getById(shopAddressId);
|
||||||
|
tradeDTO.setStoreAddress(storeAddress);
|
||||||
|
this.resetTradeDTO(tradeDTO);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 选择发票
|
* 选择发票
|
||||||
*
|
*
|
||||||
@ -459,23 +483,21 @@ public class CartServiceImpl implements CartService {
|
|||||||
/**
|
/**
|
||||||
* 选择配送方式
|
* 选择配送方式
|
||||||
*
|
*
|
||||||
* @param storeId 店铺id
|
|
||||||
* @param deliveryMethod 配送方式
|
* @param deliveryMethod 配送方式
|
||||||
* @param way 购物车类型
|
* @param way 购物车类型
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void shippingMethod(String storeId, String deliveryMethod, String way) {
|
public void shippingMethod(String deliveryMethod, String way) {
|
||||||
CartTypeEnum cartTypeEnum = CartTypeEnum.CART;
|
CartTypeEnum cartTypeEnum = CartTypeEnum.CART;
|
||||||
if (CharSequenceUtil.isNotEmpty(way)) {
|
if (CharSequenceUtil.isNotEmpty(way)) {
|
||||||
cartTypeEnum = CartTypeEnum.valueOf(way);
|
cartTypeEnum = CartTypeEnum.valueOf(way);
|
||||||
}
|
}
|
||||||
TradeDTO tradeDTO = this.readDTO(cartTypeEnum);
|
TradeDTO tradeDTO = this.getCheckedTradeDTO(cartTypeEnum);
|
||||||
for (CartVO cartVO : tradeDTO.getCartList()) {
|
for (CartVO cartVO : tradeDTO.getCartList()) {
|
||||||
if (cartVO.getStoreId().equals(storeId)) {
|
cartVO.setDeliveryMethod(DeliveryMethodEnum.valueOf(deliveryMethod).name());
|
||||||
cartVO.setDeliveryMethod(DeliveryMethodEnum.valueOf(deliveryMethod).name());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this.resetTradeDTO(tradeDTO);
|
this.resetTradeDTO(tradeDTO);
|
||||||
|
TradeDTO neTradeDTO = (TradeDTO) cache.get(this.getOriginKey(cartTypeEnum));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -547,8 +569,10 @@ public class CartServiceImpl implements CartService {
|
|||||||
tradeDTO.setStoreRemark(tradeParams.getRemark());
|
tradeDTO.setStoreRemark(tradeParams.getRemark());
|
||||||
tradeDTO.setParentOrderSn(tradeParams.getParentOrderSn());
|
tradeDTO.setParentOrderSn(tradeParams.getParentOrderSn());
|
||||||
//订单无收货地址校验
|
//订单无收货地址校验
|
||||||
if (tradeDTO.getMemberAddress() == null) {
|
if(tradeDTO.getStoreAddress() == null){
|
||||||
throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST);
|
if (tradeDTO.getMemberAddress() == null) {
|
||||||
|
throw new ServiceException(ResultCode.MEMBER_ADDRESS_NOT_EXIST);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//构建交易
|
//构建交易
|
||||||
Trade trade = tradeBuilder.createTrade(tradeDTO);
|
Trade trade = tradeBuilder.createTrade(tradeDTO);
|
||||||
@ -556,6 +580,22 @@ public class CartServiceImpl implements CartService {
|
|||||||
return trade;
|
return trade;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> shippingMethodList(String way) {
|
||||||
|
List<String> list = new ArrayList<String>();
|
||||||
|
list.add(DeliveryMethodEnum.LOGISTICS.name());
|
||||||
|
TradeDTO tradeDTO = this.getCheckedTradeDTO(CartTypeEnum.valueOf(way));
|
||||||
|
if(tradeDTO.getCartList().size()==1){
|
||||||
|
for (CartVO cartVO : tradeDTO.getCartList()) {
|
||||||
|
Store store = storeService.getById(cartVO.getStoreId());
|
||||||
|
if(store.getSelfPickFlag() != null && store.getSelfPickFlag()){
|
||||||
|
list.add(DeliveryMethodEnum.SELF_PICK_UP.name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取购物车类型
|
* 获取购物车类型
|
||||||
|
|||||||
@ -210,6 +210,15 @@ public class Order extends BaseEntity {
|
|||||||
@ApiModelProperty(value = "qrCode 实物为提货码 虚拟货物为账号")
|
@ApiModelProperty(value = "qrCode 实物为提货码 虚拟货物为账号")
|
||||||
private String qrCode;
|
private String qrCode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自提点地址")
|
||||||
|
private String storeAddressPath;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自提点电话")
|
||||||
|
private String storeAddressMobile;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "自提点地址经纬度")
|
||||||
|
private String storeAddressCenter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构建订单
|
* 构建订单
|
||||||
*
|
*
|
||||||
@ -233,11 +242,19 @@ public class Order extends BaseEntity {
|
|||||||
this.setRemark(cartVO.getRemark());
|
this.setRemark(cartVO.getRemark());
|
||||||
this.setFreightPrice(tradeDTO.getPriceDetailDTO().getFreightPrice());
|
this.setFreightPrice(tradeDTO.getPriceDetailDTO().getFreightPrice());
|
||||||
//会员收件信息
|
//会员收件信息
|
||||||
this.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath());
|
if(DeliveryMethodEnum.LOGISTICS.name().equals(cartVO.getDeliveryMethod())){
|
||||||
this.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath());
|
this.setConsigneeAddressIdPath(tradeDTO.getMemberAddress().getConsigneeAddressIdPath());
|
||||||
this.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail());
|
this.setConsigneeAddressPath(tradeDTO.getMemberAddress().getConsigneeAddressPath());
|
||||||
this.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile());
|
this.setConsigneeDetail(tradeDTO.getMemberAddress().getDetail());
|
||||||
this.setConsigneeName(tradeDTO.getMemberAddress().getName());
|
this.setConsigneeMobile(tradeDTO.getMemberAddress().getMobile());
|
||||||
|
this.setConsigneeName(tradeDTO.getMemberAddress().getName());
|
||||||
|
}
|
||||||
|
//自提点信息
|
||||||
|
if(DeliveryMethodEnum.SELF_PICK_UP.name().equals(cartVO.getDeliveryMethod())){
|
||||||
|
this.setStoreAddressPath(tradeDTO.getStoreAddress().getAddress());
|
||||||
|
this.setStoreAddressMobile(tradeDTO.getStoreAddress().getMobile());
|
||||||
|
this.setStoreAddressCenter(tradeDTO.getStoreAddress().getCenter());
|
||||||
|
}
|
||||||
//平台优惠券判定
|
//平台优惠券判定
|
||||||
if (tradeDTO.getPlatformCoupon() != null) {
|
if (tradeDTO.getPlatformCoupon() != null) {
|
||||||
this.setUsePlatformMemberCouponId(tradeDTO.getPlatformCoupon().getMemberCoupon().getId());
|
this.setUsePlatformMemberCouponId(tradeDTO.getPlatformCoupon().getMemberCoupon().getId());
|
||||||
|
|||||||
@ -16,6 +16,7 @@ public enum OrderStatusEnum {
|
|||||||
UNDELIVERED("待发货"),
|
UNDELIVERED("待发货"),
|
||||||
DELIVERED("已发货"),
|
DELIVERED("已发货"),
|
||||||
COMPLETED("已完成"),
|
COMPLETED("已完成"),
|
||||||
|
STAY_PICKED_UP("待自提"),
|
||||||
/**
|
/**
|
||||||
* 虚拟订单需要核验商品
|
* 虚拟订单需要核验商品
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -63,7 +63,7 @@ public class AllowOperation implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//新订单
|
//新订单
|
||||||
if (CharSequenceUtil.equalsAny(status, OrderStatusEnum.UNPAID.name(), OrderStatusEnum.PAID.name(), OrderStatusEnum.UNDELIVERED.name())) {
|
if (CharSequenceUtil.equalsAny(status, OrderStatusEnum.UNPAID.name(), OrderStatusEnum.PAID.name(), OrderStatusEnum.UNDELIVERED.name(), OrderStatusEnum.STAY_PICKED_UP.name())) {
|
||||||
this.cancel = true;
|
this.cancel = true;
|
||||||
}
|
}
|
||||||
//新订单,允许支付
|
//新订单,允许支付
|
||||||
|
|||||||
@ -183,6 +183,15 @@ public interface OrderService extends IService<Order> {
|
|||||||
*/
|
*/
|
||||||
Order take(String orderSn, String verificationCode);
|
Order take(String orderSn, String verificationCode);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单核验
|
||||||
|
*
|
||||||
|
* @param verificationCode 验证码
|
||||||
|
* @return 订单
|
||||||
|
*/
|
||||||
|
Order take(String verificationCode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据核验码获取订单信息
|
* 根据核验码获取订单信息
|
||||||
*
|
*
|
||||||
|
|||||||
@ -16,10 +16,12 @@ import cn.lili.common.properties.RocketmqCustomProperties;
|
|||||||
import cn.lili.common.security.OperationalJudgment;
|
import cn.lili.common.security.OperationalJudgment;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.security.enums.UserEnums;
|
import cn.lili.common.security.enums.UserEnums;
|
||||||
|
import cn.lili.common.utils.ObjectUtil;
|
||||||
import cn.lili.common.utils.SnowFlake;
|
import cn.lili.common.utils.SnowFlake;
|
||||||
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
|
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
|
||||||
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
|
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
|
||||||
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
|
||||||
|
import cn.lili.modules.order.cart.entity.enums.DeliveryMethodEnum;
|
||||||
import cn.lili.modules.order.order.aop.OrderLogPoint;
|
import cn.lili.modules.order.order.aop.OrderLogPoint;
|
||||||
import cn.lili.modules.order.order.entity.dos.*;
|
import cn.lili.modules.order.order.entity.dos.*;
|
||||||
import cn.lili.modules.order.order.entity.dto.OrderBatchDeliverDTO;
|
import cn.lili.modules.order.order.entity.dto.OrderBatchDeliverDTO;
|
||||||
@ -290,12 +292,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|||||||
Order order = OperationalJudgment.judgment(this.getBySn(orderSn));
|
Order order = OperationalJudgment.judgment(this.getBySn(orderSn));
|
||||||
//如果订单促销类型不为空&&订单是拼团订单,并且订单未成团,则抛出异常
|
//如果订单促销类型不为空&&订单是拼团订单,并且订单未成团,则抛出异常
|
||||||
if (OrderPromotionTypeEnum.PINTUAN.name().equals(order.getOrderPromotionType())
|
if (OrderPromotionTypeEnum.PINTUAN.name().equals(order.getOrderPromotionType())
|
||||||
&& !order.getOrderStatus().equals(OrderStatusEnum.UNDELIVERED.name())) {
|
&& !CharSequenceUtil.equalsAny(order.getOrderStatus(),OrderStatusEnum.UNDELIVERED.name(),OrderStatusEnum.STAY_PICKED_UP.name())) {
|
||||||
throw new ServiceException(ResultCode.ORDER_CAN_NOT_CANCEL);
|
throw new ServiceException(ResultCode.ORDER_CAN_NOT_CANCEL);
|
||||||
}
|
}
|
||||||
if (CharSequenceUtil.equalsAny(order.getOrderStatus(),
|
if (CharSequenceUtil.equalsAny(order.getOrderStatus(),
|
||||||
OrderStatusEnum.UNDELIVERED.name(),
|
OrderStatusEnum.UNDELIVERED.name(),
|
||||||
OrderStatusEnum.UNPAID.name(),
|
OrderStatusEnum.UNPAID.name(),
|
||||||
|
OrderStatusEnum.STAY_PICKED_UP.name(),
|
||||||
OrderStatusEnum.PAID.name())) {
|
OrderStatusEnum.PAID.name())) {
|
||||||
|
|
||||||
order.setOrderStatus(OrderStatusEnum.CANCELLED.name());
|
order.setOrderStatus(OrderStatusEnum.CANCELLED.name());
|
||||||
@ -472,11 +475,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Order take(String verificationCode) {
|
||||||
|
String storeId = OperationalJudgment.judgment(UserContext.getCurrentUser()).getStoreId();
|
||||||
|
Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getVerificationCode, verificationCode).eq(Order::getStoreId, storeId));
|
||||||
|
if(order == null){
|
||||||
|
throw new ServiceException(ResultCode.ORDER_NOT_EXIST);
|
||||||
|
}
|
||||||
|
order.setOrderStatus(OrderStatusEnum.COMPLETED.name());
|
||||||
|
//订单完成
|
||||||
|
this.complete(order.getSn());
|
||||||
|
return order;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Order getOrderByVerificationCode(String verificationCode) {
|
public Order getOrderByVerificationCode(String verificationCode) {
|
||||||
String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId();
|
String storeId = Objects.requireNonNull(UserContext.getCurrentUser()).getStoreId();
|
||||||
return this.getOne(new LambdaQueryWrapper<Order>()
|
return this.getOne(new LambdaQueryWrapper<Order>()
|
||||||
.eq(Order::getOrderStatus, OrderStatusEnum.TAKE.name())
|
.in(Order::getOrderStatus, OrderStatusEnum.TAKE.name(),OrderStatusEnum.STAY_PICKED_UP.name())
|
||||||
.eq(Order::getStoreId, storeId)
|
.eq(Order::getStoreId, storeId)
|
||||||
.eq(Order::getVerificationCode, verificationCode));
|
.eq(Order::getVerificationCode, verificationCode));
|
||||||
}
|
}
|
||||||
@ -938,13 +954,20 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|||||||
*/
|
*/
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void normalOrderConfirm(String orderSn) {
|
public void normalOrderConfirm(String orderSn) {
|
||||||
|
OrderStatusEnum orderStatusEnum = null;
|
||||||
|
Order order = this.getBySn(orderSn);
|
||||||
|
if(DeliveryMethodEnum.SELF_PICK_UP.name().equals(order.getDeliveryMethod())){
|
||||||
|
orderStatusEnum = OrderStatusEnum.STAY_PICKED_UP;
|
||||||
|
}else if (DeliveryMethodEnum.LOGISTICS.name().equals(order.getDeliveryMethod())){
|
||||||
|
orderStatusEnum = OrderStatusEnum.UNDELIVERED;
|
||||||
|
}
|
||||||
//修改订单
|
//修改订单
|
||||||
this.update(new LambdaUpdateWrapper<Order>()
|
this.update(new LambdaUpdateWrapper<Order>()
|
||||||
.eq(Order::getSn, orderSn)
|
.eq(Order::getSn, orderSn)
|
||||||
.set(Order::getOrderStatus, OrderStatusEnum.UNDELIVERED.name()));
|
.set(Order::getOrderStatus, orderStatusEnum.name()));
|
||||||
//修改订单
|
//修改订单
|
||||||
OrderMessage orderMessage = new OrderMessage();
|
OrderMessage orderMessage = new OrderMessage();
|
||||||
orderMessage.setNewStatus(OrderStatusEnum.UNDELIVERED);
|
orderMessage.setNewStatus(orderStatusEnum);
|
||||||
orderMessage.setOrderSn(orderSn);
|
orderMessage.setOrderSn(orderSn);
|
||||||
this.sendUpdateStatusMessage(orderMessage);
|
this.sendUpdateStatusMessage(orderMessage);
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -1,6 +1,7 @@
|
|||||||
package cn.lili.modules.permission.service;
|
package cn.lili.modules.permission.service;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lili.common.security.enums.UserEnums;
|
||||||
import cn.lili.common.security.token.Token;
|
import cn.lili.common.security.token.Token;
|
||||||
import cn.lili.modules.permission.entity.dos.AdminUser;
|
import cn.lili.modules.permission.entity.dos.AdminUser;
|
||||||
import cn.lili.modules.permission.entity.dto.AdminUserDTO;
|
import cn.lili.modules.permission.entity.dto.AdminUserDTO;
|
||||||
@ -99,4 +100,11 @@ public interface AdminUserService extends IService<AdminUser> {
|
|||||||
*/
|
*/
|
||||||
Token refreshToken(String refreshToken);
|
Token refreshToken(String refreshToken);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登出
|
||||||
|
*
|
||||||
|
* @param userEnums token角色类型
|
||||||
|
*/
|
||||||
|
void logout(UserEnums userEnums);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,13 @@
|
|||||||
package cn.lili.modules.permission.serviceimpl;
|
package cn.lili.modules.permission.serviceimpl;
|
||||||
|
|
||||||
import cn.hutool.core.text.CharSequenceUtil;
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
|
import cn.lili.cache.Cache;
|
||||||
|
import cn.lili.cache.CachePrefix;
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.exception.ServiceException;
|
||||||
import cn.lili.common.security.AuthUser;
|
import cn.lili.common.security.AuthUser;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
|
import cn.lili.common.security.enums.UserEnums;
|
||||||
import cn.lili.common.security.token.Token;
|
import cn.lili.common.security.token.Token;
|
||||||
import cn.lili.common.utils.BeanUtil;
|
import cn.lili.common.utils.BeanUtil;
|
||||||
import cn.lili.common.utils.StringUtils;
|
import cn.lili.common.utils.StringUtils;
|
||||||
@ -53,6 +56,10 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
|
|||||||
private MenuService menuService;
|
private MenuService menuService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ManagerTokenGenerate managerTokenGenerate;
|
private ManagerTokenGenerate managerTokenGenerate;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Cache cache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色长度
|
* 角色长度
|
||||||
*/
|
*/
|
||||||
@ -132,6 +139,14 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
|
|||||||
return managerTokenGenerate.refreshToken(refreshToken);
|
return managerTokenGenerate.refreshToken(refreshToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logout(UserEnums userEnums) {
|
||||||
|
String currentUserToken = UserContext.getCurrentUserToken();
|
||||||
|
if (CharSequenceUtil.isNotEmpty(currentUserToken)) {
|
||||||
|
cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + currentUserToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AdminUser findByUsername(String username) {
|
public AdminUser findByUsername(String username) {
|
||||||
|
|||||||
@ -27,8 +27,18 @@ public class MemberCouponSearchParams extends BasePromotionsSearchParams impleme
|
|||||||
|
|
||||||
private static final String PRICE_COLUMN = "price";
|
private static final String PRICE_COLUMN = "price";
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "优惠券id")
|
||||||
|
private String couponId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "优惠券名称")
|
||||||
|
private String couponName;
|
||||||
|
|
||||||
@ApiModelProperty(value = "会员id")
|
@ApiModelProperty(value = "会员id")
|
||||||
private String memberId;
|
private String memberId;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "会员名称")
|
||||||
|
private String memberName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* POINT("打折"), PRICE("减免现金");
|
* POINT("打折"), PRICE("减免现金");
|
||||||
*
|
*
|
||||||
@ -62,6 +72,9 @@ public class MemberCouponSearchParams extends BasePromotionsSearchParams impleme
|
|||||||
@Override
|
@Override
|
||||||
public <T> QueryWrapper<T> queryWrapper() {
|
public <T> QueryWrapper<T> queryWrapper() {
|
||||||
QueryWrapper<T> queryWrapper = super.queryWrapper();
|
QueryWrapper<T> queryWrapper = super.queryWrapper();
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(couponId), "coupon_id", couponId);
|
||||||
|
queryWrapper.like(CharSequenceUtil.isNotEmpty(couponName), "coupon_name", couponName);
|
||||||
|
queryWrapper.like(CharSequenceUtil.isNotEmpty(memberName), "member_name", memberName);
|
||||||
if (CharSequenceUtil.isNotEmpty(couponType)) {
|
if (CharSequenceUtil.isNotEmpty(couponType)) {
|
||||||
queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name());
|
queryWrapper.eq("coupon_type", CouponTypeEnum.valueOf(couponType).name());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,8 +4,7 @@ import cn.hutool.core.text.CharSequenceUtil;
|
|||||||
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
|
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.*;
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -18,6 +17,9 @@ import java.util.List;
|
|||||||
**/
|
**/
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Data
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
public class PromotionGoodsSearchParams extends BasePromotionsSearchParams {
|
public class PromotionGoodsSearchParams extends BasePromotionsSearchParams {
|
||||||
|
|
||||||
@ApiModelProperty(value = "促销活动id")
|
@ApiModelProperty(value = "促销活动id")
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import cn.lili.common.utils.BeanUtil;
|
|||||||
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MemberCouponVO
|
* MemberCouponVO
|
||||||
@ -12,9 +13,15 @@ import lombok.Data;
|
|||||||
* @version v1.0
|
* @version v1.0
|
||||||
* 2021-08-24 14:30
|
* 2021-08-24 14:30
|
||||||
*/
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Data
|
@Data
|
||||||
public class MemberCouponVO extends MemberCoupon {
|
public class MemberCouponVO extends MemberCoupon {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -5533168813075444962L;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "优惠券名称")
|
||||||
|
private String couponName;
|
||||||
|
|
||||||
@ApiModelProperty(value = "无法使用原因")
|
@ApiModelProperty(value = "无法使用原因")
|
||||||
private String reason;
|
private String reason;
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,13 @@
|
|||||||
package cn.lili.modules.promotion.mapper;
|
package cn.lili.modules.promotion.mapper;
|
||||||
|
|
||||||
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
||||||
|
import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 会员优惠券数据处理层
|
* 会员优惠券数据处理层
|
||||||
@ -11,4 +17,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
*/
|
*/
|
||||||
public interface MemberCouponMapper extends BaseMapper<MemberCoupon> {
|
public interface MemberCouponMapper extends BaseMapper<MemberCoupon> {
|
||||||
|
|
||||||
|
@Select("SELECT mc.*,c.coupon_name FROM li_member_coupon mc LEFT JOIN li_coupon c ON mc.coupon_id = c.id ${ew.customSqlSegment}")
|
||||||
|
Page<MemberCouponVO> getMemberCoupons(Page<MemberCoupon> page, @Param(Constants.WRAPPER) Wrapper<MemberCouponVO> queryWrapper);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -3,7 +3,9 @@ package cn.lili.modules.promotion.service;
|
|||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
|
||||||
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
|
import cn.lili.modules.promotion.entity.dto.search.MemberCouponSearchParams;
|
||||||
|
import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -154,4 +156,13 @@ public interface MemberCouponService extends IService<MemberCoupon> {
|
|||||||
*/
|
*/
|
||||||
void voidCoupon(String couponId);
|
void voidCoupon(String couponId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取会员优惠券列表
|
||||||
|
*
|
||||||
|
* @param page 分页参数
|
||||||
|
* @param param 查询参数
|
||||||
|
* @return 会员优惠券列表
|
||||||
|
*/
|
||||||
|
Page<MemberCouponVO> getMemberCouponsPage(Page<MemberCoupon> page, MemberCouponSearchParams param);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -137,6 +137,14 @@ public interface PromotionGoodsService extends IService<PromotionGoods> {
|
|||||||
*/
|
*/
|
||||||
void updatePromotionGoodsStock(List<PromotionGoods> promotionGoodsList);
|
void updatePromotionGoodsStock(List<PromotionGoods> promotionGoodsList);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新促销活动商品库存
|
||||||
|
*
|
||||||
|
* @param skuId 商品skuId
|
||||||
|
* @param quantity 库存
|
||||||
|
*/
|
||||||
|
void updatePromotionGoodsStock(String skuId, Integer quantity);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新促销活动商品索引
|
* 更新促销活动商品索引
|
||||||
*
|
*
|
||||||
|
|||||||
@ -166,6 +166,13 @@ public class CouponServiceImpl extends AbstractPromotionsServiceImpl<CouponMappe
|
|||||||
this.update(updateWrapper);
|
this.update(updateWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 关闭优惠券,删除相关会员优惠券和券活动
|
||||||
|
if (startTime == null && endTime == null) {
|
||||||
|
//删除优惠券信息
|
||||||
|
this.memberCouponService.closeMemberCoupon(ids);
|
||||||
|
//删除优惠券活动关联优惠券
|
||||||
|
this.couponActivityItemService.removeByCouponId(ids);
|
||||||
|
}
|
||||||
return super.updateStatus(ids, startTime, endTime);
|
return super.updateStatus(ids, startTime, endTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import cn.lili.modules.promotion.entity.enums.CouponGetEnum;
|
|||||||
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
|
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
|
||||||
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
|
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
|
||||||
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
import cn.lili.modules.promotion.entity.enums.PromotionsStatusEnum;
|
||||||
|
import cn.lili.modules.promotion.entity.vos.MemberCouponVO;
|
||||||
import cn.lili.modules.promotion.mapper.MemberCouponMapper;
|
import cn.lili.modules.promotion.mapper.MemberCouponMapper;
|
||||||
import cn.lili.modules.promotion.service.CouponService;
|
import cn.lili.modules.promotion.service.CouponService;
|
||||||
import cn.lili.modules.promotion.service.MemberCouponService;
|
import cn.lili.modules.promotion.service.MemberCouponService;
|
||||||
@ -304,6 +305,27 @@ public class MemberCouponServiceImpl extends ServiceImpl<MemberCouponMapper, Mem
|
|||||||
this.update(updateWrapper);
|
this.update(updateWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Page<MemberCouponVO> getMemberCouponsPage(Page<MemberCoupon> page, MemberCouponSearchParams param) {
|
||||||
|
QueryWrapper<MemberCouponVO> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getMemberId()), "mc.member_id", param.getMemberId());
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getStoreId()), "c.store_id", param.getStoreId());
|
||||||
|
queryWrapper.like(CharSequenceUtil.isNotEmpty(param.getMemberName()), "mc.member_name", param.getMemberName());
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getCouponId()), "mc.coupon_id", param.getCouponId());
|
||||||
|
queryWrapper.like(CharSequenceUtil.isNotEmpty(param.getCouponName()), "c.coupon_name", param.getCouponName());
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getGetType()), "mc.get_type", param.getGetType());
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getScopeType()), "mc.scope_type", param.getPromotionStatus());
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getCouponType()), "mc.coupon_type", param.getCouponType());
|
||||||
|
queryWrapper.eq(CharSequenceUtil.isNotEmpty(param.getMemberCouponStatus()), "mc.member_coupon_status", param.getMemberCouponStatus());
|
||||||
|
if (param.getStartTime() != null) {
|
||||||
|
queryWrapper.ge("mc.start_time", new Date(param.getStartTime()));
|
||||||
|
}
|
||||||
|
if (param.getEndTime() != null) {
|
||||||
|
queryWrapper.le("mc.end_time", new Date(param.getEndTime()));
|
||||||
|
}
|
||||||
|
return this.baseMapper.getMemberCoupons(page, queryWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 清除无效的会员优惠券
|
* 清除无效的会员优惠券
|
||||||
*
|
*
|
||||||
|
|||||||
@ -4,8 +4,8 @@ import cn.hutool.core.convert.Convert;
|
|||||||
import cn.hutool.core.text.CharSequenceUtil;
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import cn.lili.cache.Cache;
|
||||||
import cn.lili.common.enums.PromotionTypeEnum;
|
import cn.lili.common.enums.PromotionTypeEnum;
|
||||||
import cn.lili.common.utils.StringUtils;
|
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||||
import cn.lili.modules.goods.entity.dto.GoodsSkuDTO;
|
import cn.lili.modules.goods.entity.dto.GoodsSkuDTO;
|
||||||
@ -72,6 +72,9 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
|
|||||||
@Autowired
|
@Autowired
|
||||||
private EsGoodsIndexService goodsIndexService;
|
private EsGoodsIndexService goodsIndexService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Cache cache;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PromotionGoods> findSkuValidPromotion(String skuId, String storeIds) {
|
public List<PromotionGoods> findSkuValidPromotion(String skuId, String storeIds) {
|
||||||
|
|
||||||
@ -96,7 +99,7 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
|
|||||||
List<String> skuIds = skus.stream().map(GoodsSku::getId).collect(Collectors.toList());
|
List<String> skuIds = skus.stream().map(GoodsSku::getId).collect(Collectors.toList());
|
||||||
List<String> categoriesPath = new ArrayList<>();
|
List<String> categoriesPath = new ArrayList<>();
|
||||||
categories.forEach(i -> {
|
categories.forEach(i -> {
|
||||||
if (StringUtils.isNotEmpty(i)) {
|
if (CharSequenceUtil.isNotEmpty(i)) {
|
||||||
categoriesPath.addAll(Arrays.asList(i.split(",")));
|
categoriesPath.addAll(Arrays.asList(i.split(",")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -268,6 +271,20 @@ public class PromotionGoodsServiceImpl extends ServiceImpl<PromotionGoodsMapper,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updatePromotionGoodsStock(String skuId, Integer quantity) {
|
||||||
|
LambdaQueryWrapper<PromotionGoods> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.eq(PromotionGoods::getSkuId, skuId);
|
||||||
|
this.list(queryWrapper).forEach(promotionGoods -> {
|
||||||
|
String promotionStockKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(PromotionTypeEnum.valueOf(promotionGoods.getPromotionType()), promotionGoods.getPromotionId(), promotionGoods.getSkuId());
|
||||||
|
cache.remove(promotionStockKey);
|
||||||
|
});
|
||||||
|
LambdaUpdateWrapper<PromotionGoods> updateWrapper = new LambdaUpdateWrapper<>();
|
||||||
|
updateWrapper.eq(PromotionGoods::getSkuId, skuId);
|
||||||
|
updateWrapper.set(PromotionGoods::getQuantity, quantity);
|
||||||
|
this.update(updateWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新促销活动商品库存
|
* 更新促销活动商品库存
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package cn.lili.modules.search.entity.dto;
|
package cn.lili.modules.search.entity.dto;
|
||||||
|
|
||||||
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.lili.common.utils.RegularUtil;
|
import cn.lili.common.utils.RegularUtil;
|
||||||
import cn.lili.common.utils.StringUtils;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ -49,9 +49,18 @@ public class EsGoodsSearchDTO {
|
|||||||
@ApiModelProperty("当前商品skuId,根据当前浏览的商品信息来给用户推荐可能喜欢的商品")
|
@ApiModelProperty("当前商品skuId,根据当前浏览的商品信息来给用户推荐可能喜欢的商品")
|
||||||
private String currentGoodsId;
|
private String currentGoodsId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see cn.lili.common.enums.PromotionTypeEnum
|
||||||
|
*/
|
||||||
|
@ApiModelProperty("促销活动类型")
|
||||||
|
private String promotionType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "促销活动id")
|
||||||
|
private String promotionsId;
|
||||||
|
|
||||||
//过滤搜索关键字
|
//过滤搜索关键字
|
||||||
public String getKeyword() {
|
public String getKeyword() {
|
||||||
if (StringUtils.isNotEmpty(keyword)) {
|
if (CharSequenceUtil.isNotEmpty(keyword)) {
|
||||||
RegularUtil.replace(this.keyword);
|
RegularUtil.replace(this.keyword);
|
||||||
}
|
}
|
||||||
return keyword;
|
return keyword;
|
||||||
|
|||||||
@ -239,7 +239,8 @@ public class EsGoodsIndexServiceImpl extends BaseElasticsearchService implements
|
|||||||
List<PromotionGoods> promotionGoods = skuValidPromotions.stream()
|
List<PromotionGoods> promotionGoods = skuValidPromotions.stream()
|
||||||
.filter(j ->
|
.filter(j ->
|
||||||
(CharSequenceUtil.isNotEmpty(j.getSkuId()) && j.getSkuId().equals(goodsSku.getId())) ||
|
(CharSequenceUtil.isNotEmpty(j.getSkuId()) && j.getSkuId().equals(goodsSku.getId())) ||
|
||||||
j.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name()) ||
|
(j.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name()) && j.getStoreId().equals("0")) ||
|
||||||
|
(j.getScopeType().equals(PromotionsScopeTypeEnum.ALL.name()) && j.getStoreId().equals(esGoodsIndex.getStoreId())) ||
|
||||||
(j.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) && j.getScopeId().contains(goodsSku.getCategoryPath())))
|
(j.getScopeType().equals(PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name()) && j.getScopeId().contains(goodsSku.getCategoryPath())))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
if (CollUtil.isNotEmpty(promotionGoods)) {
|
if (CollUtil.isNotEmpty(promotionGoods)) {
|
||||||
|
|||||||
@ -469,6 +469,10 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService {
|
|||||||
if (CharSequenceUtil.isNotEmpty(searchDTO.getProp())) {
|
if (CharSequenceUtil.isNotEmpty(searchDTO.getProp())) {
|
||||||
this.propSearch(filterBuilder, searchDTO);
|
this.propSearch(filterBuilder, searchDTO);
|
||||||
}
|
}
|
||||||
|
// 促销活动判定
|
||||||
|
if (CharSequenceUtil.isNotEmpty(searchDTO.getPromotionsId()) && CharSequenceUtil.isNotEmpty(searchDTO.getPromotionType())) {
|
||||||
|
filterBuilder.must(QueryBuilders.wildcardQuery("promotionMapJson", "*" + searchDTO.getPromotionType() + "-" + searchDTO.getPromotionsId() + "*"));
|
||||||
|
}
|
||||||
//价格区间判定
|
//价格区间判定
|
||||||
if (CharSequenceUtil.isNotEmpty(searchDTO.getPrice())) {
|
if (CharSequenceUtil.isNotEmpty(searchDTO.getPrice())) {
|
||||||
String[] prices = searchDTO.getPrice().split("_");
|
String[] prices = searchDTO.getPrice().split("_");
|
||||||
|
|||||||
@ -47,5 +47,8 @@ public class StoreIndexStatisticsVO {
|
|||||||
@ApiModelProperty(value = "未对账结算单数量")
|
@ApiModelProperty(value = "未对账结算单数量")
|
||||||
private Long waitPayBill;
|
private Long waitPayBill;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "待自提数量")
|
||||||
|
private Long selfPickNum;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -200,7 +200,8 @@ public class IndexStatisticsServiceImpl implements IndexStatisticsService {
|
|||||||
storeIndexStatisticsVO.setUnDeliveredOrder(orderStatisticsService.orderNum(OrderStatusEnum.UNDELIVERED.name()));
|
storeIndexStatisticsVO.setUnDeliveredOrder(orderStatisticsService.orderNum(OrderStatusEnum.UNDELIVERED.name()));
|
||||||
//待收货订单数量
|
//待收货订单数量
|
||||||
storeIndexStatisticsVO.setDeliveredOrder(orderStatisticsService.orderNum(OrderStatusEnum.DELIVERED.name()));
|
storeIndexStatisticsVO.setDeliveredOrder(orderStatisticsService.orderNum(OrderStatusEnum.DELIVERED.name()));
|
||||||
|
//待自提数量
|
||||||
|
storeIndexStatisticsVO.setSelfPickNum(orderStatisticsService.orderNum(OrderStatusEnum.STAY_PICKED_UP.name()));
|
||||||
//待处理退货数量
|
//待处理退货数量
|
||||||
storeIndexStatisticsVO.setReturnGoods(afterSaleStatisticsService.applyNum(AfterSaleTypeEnum.RETURN_GOODS.name()));
|
storeIndexStatisticsVO.setReturnGoods(afterSaleStatisticsService.applyNum(AfterSaleTypeEnum.RETURN_GOODS.name()));
|
||||||
//待处理退款数量
|
//待处理退款数量
|
||||||
|
|||||||
@ -103,6 +103,9 @@ public class Store extends BaseEntity {
|
|||||||
@ApiModelProperty(value = "默认页面是否开启")
|
@ApiModelProperty(value = "默认页面是否开启")
|
||||||
private Boolean pageShow;
|
private Boolean pageShow;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开启自提")
|
||||||
|
private Boolean selfPickFlag;
|
||||||
|
|
||||||
public Store(Member member) {
|
public Store(Member member) {
|
||||||
this.memberId = member.getId();
|
this.memberId = member.getId();
|
||||||
this.memberName = member.getUsername();
|
this.memberName = member.getUsername();
|
||||||
|
|||||||
@ -36,4 +36,7 @@ public class StoreSettingDTO {
|
|||||||
@ApiModelProperty(value = "默认页面是否开启")
|
@ApiModelProperty(value = "默认页面是否开启")
|
||||||
private Boolean pageShow;
|
private Boolean pageShow;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "是否开启自提")
|
||||||
|
private Boolean selfPickFlag;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package cn.lili.modules.store.service;
|
package cn.lili.modules.store.service;
|
||||||
|
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
|
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||||
import cn.lili.modules.member.entity.dto.CollectionDTO;
|
import cn.lili.modules.member.entity.dto.CollectionDTO;
|
||||||
import cn.lili.modules.store.entity.dos.Store;
|
import cn.lili.modules.store.entity.dos.Store;
|
||||||
import cn.lili.modules.store.entity.dto.*;
|
import cn.lili.modules.store.entity.dto.*;
|
||||||
@ -9,6 +10,8 @@ import cn.lili.modules.store.entity.vos.StoreVO;
|
|||||||
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 店铺业务层
|
* 店铺业务层
|
||||||
*
|
*
|
||||||
@ -117,5 +120,15 @@ public interface StoreService extends IService<Store> {
|
|||||||
*/
|
*/
|
||||||
void updateStoreCollectionNum(CollectionDTO collectionDTO);
|
void updateStoreCollectionNum(CollectionDTO collectionDTO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新生成所有店铺
|
||||||
|
*/
|
||||||
void storeToClerk();
|
void storeToClerk();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 店铺获取该会员的访问记录
|
||||||
|
* @param memberId 会员Id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<GoodsSku> getToMemberHistory(String memberId);
|
||||||
}
|
}
|
||||||
@ -25,6 +25,8 @@ import cn.lili.modules.store.service.StoreDetailService;
|
|||||||
import cn.lili.modules.store.service.StoreService;
|
import cn.lili.modules.store.service.StoreService;
|
||||||
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
|
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
|
||||||
import cn.lili.rocketmq.tags.GoodsTagsEnum;
|
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.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
@ -99,6 +101,9 @@ public class StoreDetailServiceImpl extends ServiceImpl<StoreDetailMapper, Store
|
|||||||
if (result) {
|
if (result) {
|
||||||
this.updateStoreGoodsInfo(store);
|
this.updateStoreGoodsInfo(store);
|
||||||
}
|
}
|
||||||
|
String destination = rocketmqCustomProperties.getStoreTopic() + ":" + StoreTagsEnum.EDIT_STORE_SETTING.name();
|
||||||
|
//发送订单变更mq消息
|
||||||
|
rocketMQTemplate.asyncSend(destination, store, RocketmqSendCallbackBuilder.commonCallback());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,16 +6,21 @@ import cn.lili.cache.Cache;
|
|||||||
import cn.lili.cache.CachePrefix;
|
import cn.lili.cache.CachePrefix;
|
||||||
import cn.lili.common.enums.ResultCode;
|
import cn.lili.common.enums.ResultCode;
|
||||||
import cn.lili.common.exception.ServiceException;
|
import cn.lili.common.exception.ServiceException;
|
||||||
|
import cn.lili.common.properties.RocketmqCustomProperties;
|
||||||
import cn.lili.common.security.AuthUser;
|
import cn.lili.common.security.AuthUser;
|
||||||
import cn.lili.common.security.context.UserContext;
|
import cn.lili.common.security.context.UserContext;
|
||||||
import cn.lili.common.utils.BeanUtil;
|
import cn.lili.common.utils.BeanUtil;
|
||||||
import cn.lili.common.vo.PageVO;
|
import cn.lili.common.vo.PageVO;
|
||||||
|
import cn.lili.modules.goods.entity.dos.GoodsSku;
|
||||||
import cn.lili.modules.goods.service.GoodsService;
|
import cn.lili.modules.goods.service.GoodsService;
|
||||||
|
import cn.lili.modules.goods.service.GoodsSkuService;
|
||||||
import cn.lili.modules.member.entity.dos.Clerk;
|
import cn.lili.modules.member.entity.dos.Clerk;
|
||||||
|
import cn.lili.modules.member.entity.dos.FootPrint;
|
||||||
import cn.lili.modules.member.entity.dos.Member;
|
import cn.lili.modules.member.entity.dos.Member;
|
||||||
import cn.lili.modules.member.entity.dto.ClerkAddDTO;
|
import cn.lili.modules.member.entity.dto.ClerkAddDTO;
|
||||||
import cn.lili.modules.member.entity.dto.CollectionDTO;
|
import cn.lili.modules.member.entity.dto.CollectionDTO;
|
||||||
import cn.lili.modules.member.service.ClerkService;
|
import cn.lili.modules.member.service.ClerkService;
|
||||||
|
import cn.lili.modules.member.service.FootprintService;
|
||||||
import cn.lili.modules.member.service.MemberService;
|
import cn.lili.modules.member.service.MemberService;
|
||||||
import cn.lili.modules.store.entity.dos.Store;
|
import cn.lili.modules.store.entity.dos.Store;
|
||||||
import cn.lili.modules.store.entity.dos.StoreDetail;
|
import cn.lili.modules.store.entity.dos.StoreDetail;
|
||||||
@ -27,12 +32,15 @@ import cn.lili.modules.store.mapper.StoreMapper;
|
|||||||
import cn.lili.modules.store.service.StoreDetailService;
|
import cn.lili.modules.store.service.StoreDetailService;
|
||||||
import cn.lili.modules.store.service.StoreService;
|
import cn.lili.modules.store.service.StoreService;
|
||||||
import cn.lili.mybatis.util.PageUtil;
|
import cn.lili.mybatis.util.PageUtil;
|
||||||
|
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
|
||||||
|
import cn.lili.rocketmq.tags.StoreTagsEnum;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
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.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@ -66,12 +74,24 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
|
|||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
private GoodsService goodsService;
|
private GoodsService goodsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private GoodsSkuService goodsSkuService;
|
||||||
/**
|
/**
|
||||||
* 店铺详情
|
* 店铺详情
|
||||||
*/
|
*/
|
||||||
@Autowired
|
@Autowired
|
||||||
private StoreDetailService storeDetailService;
|
private StoreDetailService storeDetailService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RocketmqCustomProperties rocketmqCustomProperties;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RocketMQTemplate rocketMQTemplate;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FootprintService footprintService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private Cache cache;
|
private Cache cache;
|
||||||
|
|
||||||
@ -159,7 +179,11 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
|
|||||||
if (result) {
|
if (result) {
|
||||||
storeDetailService.updateStoreGoodsInfo(store);
|
storeDetailService.updateStoreGoodsInfo(store);
|
||||||
}
|
}
|
||||||
|
String destination = rocketmqCustomProperties.getStoreTopic() + ":" + StoreTagsEnum.EDIT_STORE_SETTING.name();
|
||||||
|
//发送订单变更mq消息
|
||||||
|
rocketMQTemplate.asyncSend(destination, store, RocketmqSendCallbackBuilder.commonCallback());
|
||||||
}
|
}
|
||||||
|
|
||||||
cache.remove(CachePrefix.STORE.getPrefix() + storeEditDTO.getStoreId());
|
cache.remove(CachePrefix.STORE.getPrefix() + storeEditDTO.getStoreId());
|
||||||
return store;
|
return store;
|
||||||
}
|
}
|
||||||
@ -352,6 +376,18 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
|
|||||||
clerkService.saveBatch(clerkList);
|
clerkService.saveBatch(clerkList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<GoodsSku> getToMemberHistory(String memberId) {
|
||||||
|
AuthUser currentUser = UserContext.getCurrentUser();
|
||||||
|
List<String> skuIdList = new ArrayList<>();
|
||||||
|
for (FootPrint footPrint : footprintService.list(new LambdaUpdateWrapper<FootPrint>().eq(FootPrint::getStoreId, currentUser.getStoreId()).eq(FootPrint::getMemberId, memberId))) {
|
||||||
|
if(footPrint.getSkuId() != null){
|
||||||
|
skuIdList.add(footPrint.getSkuId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return goodsSkuService.getGoodsSkuByIdFromCache(skuIdList);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前登录操作的店铺
|
* 获取当前登录操作的店铺
|
||||||
*
|
*
|
||||||
|
|||||||
@ -0,0 +1,24 @@
|
|||||||
|
package cn.lili.mybatis;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户超级类
|
||||||
|
*
|
||||||
|
* @author Chopper
|
||||||
|
* @version v1.0
|
||||||
|
* @since 2020/8/20 14:34
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public abstract class BaseTenantEntity extends BaseEntity {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "租户id", hidden = true)
|
||||||
|
private String tenantId;
|
||||||
|
|
||||||
|
}
|
||||||
@ -23,6 +23,10 @@ public enum MemberTagsEnum {
|
|||||||
* 会员提现
|
* 会员提现
|
||||||
*/
|
*/
|
||||||
MEMBER_WITHDRAWAL("会员提现"),
|
MEMBER_WITHDRAWAL("会员提现"),
|
||||||
|
/**
|
||||||
|
* 会员信息更改
|
||||||
|
*/
|
||||||
|
MEMBER_INFO_EDIT("会员信息更改"),
|
||||||
/**
|
/**
|
||||||
* 会员积分变动
|
* 会员积分变动
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -0,0 +1,20 @@
|
|||||||
|
package cn.lili.rocketmq.tags;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author chc
|
||||||
|
* @since 2022/6/2114:46
|
||||||
|
*/
|
||||||
|
public enum StoreTagsEnum {
|
||||||
|
|
||||||
|
EDIT_STORE_SETTING("修改商家设置");
|
||||||
|
|
||||||
|
private final String description;
|
||||||
|
|
||||||
|
StoreTagsEnum(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String description() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
}
|
||||||
34
im-api/pom.xml
Normal file
34
im-api/pom.xml
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>im-api</artifactId>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>cn.lili</groupId>
|
||||||
|
<artifactId>lili-shop-parent</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.lili</groupId>
|
||||||
|
<artifactId>framework</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
||||||
31
im-api/src/main/java/cn/lili/ImApiApplication.java
Normal file
31
im-api/src/main/java/cn/lili/ImApiApplication.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package cn.lili;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liushuai
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
public class ImApiApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(ImApiApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果使用独立的servlet容器,
|
||||||
|
* 而不是直接使用springboot的内置容器,
|
||||||
|
* 就不要注入ServerEndpointExporter,
|
||||||
|
* 因为它将由容器自己提供和管理
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public ServerEndpointExporter serverEndpointExporter() {
|
||||||
|
return new ServerEndpointExporter();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,175 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user