15生鲜电商平台-售后模块的设计与架构(代码片段)

lu-manman lu-manman     2023-01-28     755

关键词:

说明:任何一个的电商平台都有售后服务系统,那么对于我们这个生鲜的电商平台,售后系统需要思考以下几个维度。

 

          1. 买家的需求维度

             说明:买家在平台上没找到自己想要的东西,我们需要提供给他一个入口,告诉我们他有这个需求,我们进行改进。系统需要有记录这种情况,同时也有回复客户的情况。

          2. 投诉入口

              说明:有客户性子比较急,他有问题,就会马上打电话给客服,客服需要解答与回答,维护客户关系。对于系统而言,需要记录这种情况,然后分析问题与解决问题。

          3. IM聊天入口

             说明:客户有时候也不想写信息,也不想打电话,能否有一个时刻的IM聊天记录呢?对于系统而言需要记录这种信息,我们目前系统没处理,采用的是微信,以及销售人员的反馈机制。

          4. 退货问题

              说明:售后系统中,退货问题是最繁琐的,买家存在以下两种情况。

                      4.1 买家要钱不要货。顾名思义,有些买家就是不要货了,他需要我们退钱给他,这个配送端有一个一件退货功能,钱退到买家的余额里面,下次可以继续购买。

                      4.2  买家要货不要钱,顾名思义,有些买家的确需要这个货物,对于我们退钱给他,他是不接受的,因为他真的需要这种东西,你让他再去买,客户体验非常差,可能 就没有下次购物了。对于这种情况,我们用时间轴来继续整个过程。(说明,由于这个系统设计到生鲜电商方面,其他的电商方面可能会不一样。)

 

相关数据库的设计与架构如下:

 1. 买家平台建议信息表

技术分享图片
CREATE TABLE `suggestion` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自动增加ID‘,
  `suggestion_content` varchar(1024) DEFAULT NULL COMMENT ‘建议内容‘,
  `suggestion_imgs` varchar(255) DEFAULT NULL COMMENT ‘多张图片‘,
  `user_id` bigint(20) DEFAULT NULL COMMENT ‘所属用户ID‘,
  `create_time` datetime DEFAULT NULL COMMENT ‘创建时间‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=78 DEFAULT CHARSET=utf8 COMMENT=‘用户对平台的建议‘;
技术分享图片

说明: 平台建议表,是买家对平台的建议以及自己的需求的一个入口,可以是图片与内容两点。

          比如说:他说我们送的菜有问题,很多烂的,那么他是需要拍图片证明的。

 

2. 平台回复信息表

技术分享图片
CREATE TABLE `suggestion_reply` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自动增加ID‘,
  `suggestion_id` bigint(20) DEFAULT NULL COMMENT ‘客户的建议?ID‘,
  `content` varchar(512) DEFAULT NULL COMMENT ‘回复的内容‘,
  `create_time` datetime DEFAULT NULL COMMENT ‘创建时间‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT=‘客户建议回复信息表‘;
技术分享图片

说明:作为一个平台,平台需要回复客户的信息,买家也需要看到,当然这边系统是不区分是买家还是卖家的,我们都是可以数据的处理的。

 

3. 售后系统时间轴的设计

说明:其实我们系统需要知道整个售后的过程的,比如买家什么时候发起的不要钱,要货,然后师傅是什么时候知道这个消息的,如何进行售后的,他们会遇到什么问题,

当然这里面有很多的问题,系统可以做的事情其实是很少的,而我们需要做的是更多的事情。

 

技术分享图片
CREATE TABLE `order_timeline` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自动增加ID‘,
  `item_id` bigint(20) DEFAULT NULL COMMENT ‘订单项ID‘,
  `remarks` varchar(256) DEFAULT NULL COMMENT ‘备注‘,
  `create_time` datetime DEFAULT NULL COMMENT ‘创建时间‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1980 DEFAULT CHARSET=utf8 COMMENT=‘售后模块,退换货时间轴,针对的是某一个订单项‘;
技术分享图片

 

相关时间轴运营截图如下:

技术分享图片

 

 技术分享图片

 

 整个业务不算复杂,需要的一种思路与解决思路的方案:

关于补货流程:

技术分享图片
补货需求
业务需求:
    当卖家主动点击缺货,则配送师傅看到这个异常订单项,然后他有两种选择,
第一种补货(有货,他也想补或者客户说要货不要钱)
第二种不补货(无货可补,他不想补或者客户说退钱等等)
第一种补货业务:
1.    当配送师傅点击已补货,则把这个订单项对应的金额从买家中直接扣除,前提是线上付款,如果这个订单是线下付款,则不用处理扣款逻辑,直接修改状态即可。同时记录时间轴日志。
第二种不补货业务:
2.    当师傅点击不补货,则这个订单项不做任何扣款逻辑,不管线下还是线上,直接修改状态即可,同时记录时间轴日志。
补充说明:补货与不补货属于互斥操作,即已补货后不允许再出现不补货,不补货后不再允许出现补货。按照规则来处理。
技术分享图片

 

 相关业务核心代码如下:

技术分享图片
/**
 * 订单项退货*/
@RestController
@RequestMapping("/delivery")
public class OrderReturnController extends BaseController 

    private static final Logger logger = LoggerFactory.getLogger(OrderReturnController.class);

    @Autowired
    private OrderItemService orderItemService;

    @Autowired
    private OrderReturnService orderReturnService;

    /**
     * 订单项退货
     * 
     */
    @RequestMapping(value = "/order/return/item", method =  RequestMethod.GET, RequestMethod.POST )
    public JsonResult orderReturnItem(HttpServletRequest request, HttpServletResponse response,
            @Param("itemId") Long itemId, @Param("deliveryId") Long deliveryId, @Param("status") int status) 
        try 
            if (itemId == null) 
                return new JsonResult(JsonResultCode.FAILURE, "item参数有误", "");
            

            OrderItem orderItem = orderItemService.getOrderItemByItemId(itemId);

            if (orderItem == null) 
                return new JsonResult(JsonResultCode.FAILURE, "无此订单项", "");
            
            
            String returnMsg = "";
            if(status == BuyerStatus.THREE)
                returnMsg = TimelineTemplate.return_MSG;
            if(status == BuyerStatus.FOUR)
                returnMsg = TimelineTemplate.BACK_MSG;
            if(status == BuyerStatus.ZERO)
                returnMsg = TimelineTemplate.OFF_MSG;
            
            orderItemService.updateOrderItemStatus(itemId, status, deliveryId, returnMsg);
            return new JsonResult(JsonResultCode.SUCCESS, "操作成功", "");
         catch (Exception ex) 
            logger.error("[OrderReturnController][orderReturnItem] exception :", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试", "");
        
    

    /**
     * 退还列表
     */
    @RequestMapping(value = "/order/return/list", method =  RequestMethod.GET, RequestMethod.POST )
    public JsonResult orderReturnList(HttpServletRequest request, HttpServletResponse response,@Param("deliveryId") Long deliveryId, @Param("status") int status) 
        try 
        
            // 组装成为最终的列表结果
            List<OrderReturnVo> listResult = new ArrayList<OrderReturnVo>();

            List<OrderGoodsVo> goodsList = orderReturnService.getReturnOrderGoodsList(deliveryId,status);

            if (CollectionUtils.isEmpty(goodsList)) 
                return new JsonResult(JsonResultCode.SUCCESS, "查询完成", listResult);
            

            // 临时参数,判断时间
            Map<String, List<OrderReturnEntity>> paramTimeMap = new HashMap<String, List<OrderReturnEntity>>();

            // 过滤卖家
            Map<String, List<OrderGoodsVo>> paramSellerMap = new HashMap<String, List<OrderGoodsVo>>();

            for (OrderGoodsVo vo : goodsList) 
                String bestTime = DateUtil.dateToString(vo.getBestTime(), "yyyy-MM-dd");

                // 时间相同
                if (paramTimeMap.get(bestTime) != null) 
                    List<OrderReturnEntity> mapOrderReturnEntity = paramTimeMap.get(bestTime);

                    // 组装时间
                    OrderReturnVo resultVo = new OrderReturnVo();
                    resultVo.setBestTime(bestTime);

                    // 判断是否是同一个卖家的
                    if (paramSellerMap.get(vo.getSellerName()) != null) 
                    
                        OrderReturnEntity entity = new OrderReturnEntity();
                        List<OrderGoodsVo> listVo = paramSellerMap.get(vo.getSellerName());
                        listVo.add(vo);
                        entity.setListOrderGoodsVo(listVo);
                        resultVo.setListOrderReturnEntity(mapOrderReturnEntity);
                    else
                    
                        //不同买家
                        OrderReturnEntity entity = new OrderReturnEntity();
                        entity.setSellerName(vo.getSellerName());
                        
                        List<OrderGoodsVo> listVo =new ArrayList<OrderGoodsVo>();
                        listVo.add(vo);
                        entity.setListOrderGoodsVo(listVo);
                        mapOrderReturnEntity.add(entity);
                        
                        paramSellerMap.put(vo.getSellerName(), listVo);
                    
                 else 
                    // 组装时间
                    OrderReturnVo resultVo = new OrderReturnVo();
                    resultVo.setBestTime(bestTime);

                    OrderReturnEntity entity = new OrderReturnEntity();
                    entity.setSellerName(vo.getSellerName());

                    List<OrderGoodsVo> paramOrderGoodsVo = new ArrayList<OrderGoodsVo>();
                    paramOrderGoodsVo.add(vo);
                    entity.setListOrderGoodsVo(paramOrderGoodsVo);

                    List<OrderReturnEntity> listOrderReturnEntity = new ArrayList<OrderReturnEntity>();
                    listOrderReturnEntity.add(entity);

                    resultVo.setListOrderReturnEntity(listOrderReturnEntity);

                    listResult.add(resultVo);

                    paramSellerMap.put(vo.getSellerName(), paramOrderGoodsVo);

                    paramTimeMap.put(bestTime, listOrderReturnEntity);
                
            
            return new JsonResult(JsonResultCode.SUCCESS, "查询信息成功", listResult);
         catch (Exception ex) 
            logger.error("[OrderReturnController][orderReturnItem] exception :", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系统错误,请稍后重试", "");
        
    
技术分享图片

 

APP运营截图相对而言比较简单,我这边就不贴出来了。

 

转载自-- https://www.cnblogs.com/jurendage/p/9066307.html

14生鲜电商平台-搜索模块的设计与架构(代码片段)

说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面。目前也是快速的检索商品。      对于移动端的APP买家用户而言,要求的速度在3秒内完成。支持模糊查询,由于业务实战表面,... 查看详情

8生鲜电商平台-购物车模块的设计与架构(代码片段)

说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题,然后再进行下单与付款. 1.购物车数据库设计:  说明:业务需求:&nb... 查看详情

38生鲜电商平台-会员积分系统的设计与架构

说明:互联网平台积分体系主要用于激励和回馈用户在平台的消费行为和活动行为,一个良好的积分体系可以很好的提升用户的粘性及活跃度。一、互联网平台积分体系设计必要性互联网平台积分体系是一个独立、完整的系统模... 查看详情

java生鲜电商平台-云平台架构设计与服务治理平台架构设计(小程序/app)

Java生鲜电商平台-云平台架构设计与服务治理平台架构设计(小程序/APP)说明:Java生鲜电商平台-云平台架构设计与服务治理平台架构设计,本文只是抛砖引玉,希望对大家有所帮助.    云平台是个非常宽泛的领域,本节... 查看详情

26生鲜电商平台-rbac系统权限的设计与架构

说明:根据上面的需求描述以及对需求的分析,我们得知通常的一个中小型系统对于权限系统所需实现的功能以及非功能性的需求,在下面我们将根据需求从技术角度上分析实现的策略以及基于目前两种比较流行的权限设计思想... 查看详情

java生鲜电商平台-电商个性化推荐引擎架构设计(小程序/app)

Java生鲜电商平台-电商个性化推荐引擎架构设计(小程序/APP) 说明:Java生鲜电商平台-电商个性化推荐引擎架构设计,个性化推荐引擎,被广泛使用在电商网站,网络广告,咨询网站中,这里我们以电商网站的使用场景为例,... 查看详情

36生鲜电商平台-积分,优惠券,会员折扣,签到预售拼团砍价秒杀及抽奖等促销模块架构设计

说明:本标题列举了所有目前社会上常见的促销方案,目前贴出实际的业务运营手段以及架构设计,包括业务说明,仅供参考 促销体系1.1促销体系在电商和O2O领域,促销是运营人员的一个主要的让利行为,同时促销活动期间... 查看详情

vivo全球商城:电商交易平台设计(代码片段)

...架构,我们的开发团队沉淀了许多宝贵的技术与经验,对电商领域业务也有相当深刻的理解。去年初,团队承接了O2O商城的建设任务,还有即将成立的礼品中台,以及官方商城的线上购买线下门店送货需求,都需要搭建底层的商... 查看详情

35生鲜电商平台-技术方案与文档下载

说明:任何一个好的项目,都应该有好的文档与设计方案,包括需求文档,概要设计,详细设计,测试用例,验收报告等等,类似下面这个图:      有以下几个管理域:     1.开发域。&nbs... 查看详情

基于springboot电商生鲜购物商城平台设计与实现(含源码+数据库文件)

主要功能:商品分类、商品详情、购物车、订单、用户管理、登录注册、个人中心等功能idea开发工具打开,导入数据库可直接运行登陆注册账号个人中心信息修改更新(个性签名)浏览查看商品信息详情添加商品... 查看详情

电商数仓笔记1(数据仓库概念,项目需求及架构设计,数据生成模块)(代码片段)

电商数仓一、数据仓库概念二、项目需求及架构设计1、项目需求分析2、项目框架(1)技术选型(2)系统数据流程设计(3)框架版本选型(4)服务器选型(5)集群规模(6)集群资... 查看详情

[架构之路-105]:《软件架构设计:程序员向架构师转型必备》-15-模块划分的综合技术与4步骤法

15.模块划分的综合技术与4步骤法本章把前面切分模块的各种方法都综合了起来,模块划分的综合技术与4步骤法。15.1像专家一样思考15.1.1自顶向下vs.自底向上,垂直切分vs.水平切分15.1.2横切竖割,并不矛盾15.2模块划... 查看详情

电商平台lnmp架构之mysql高速缓存--redis(代码片段)

电商平台lnmp架构之mysql高速缓存--redis1.redis的介绍2.redis服务的安装3.Redis常用命令4.Redis异步复制5.Redis高可用6.twemproxy分片代理7.rediscluster集群8.redis的持久化9.redis与mysql的结合1.redis的介绍Redis是一个nosql(notonlysql不仅仅只有sql)数据... 查看详情

带你走向技术前沿,打造畅购电商平台实战(第一章)。(代码片段)

微服务系统架构概述单体应用架构以电商平台为例,如图所示,在传统单体应用中,所有模块代码,都会写在一个应用下,然后我们一般开发完成后,打成一个war包放到tomcat中去运行。随着用户流量的不断增长,业务复杂度的提... 查看详情

电商平台lnmp架构之nginx+tomcat(代码片段)

电商平台lnmp架构之nginx+tomcattomcat结合memcachetomcat结合memcacheLAMP->LAMJ将LAMP架构中的php换成jsp就有了现在所说的LAMJ架构。nginx+tomcat+jdktomcatTomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器&... 查看详情

分布式架构设计之电商平台

分布式架构设计之电商平台 何为软件架构?不同人的答案会有所不同,而我认为一个好的软件架构除了要具备业务功能外,还应该具备一定的高性能、高可用、高伸缩性及可拓展等非功能需求。而软件架构是由业务架构和技... 查看详情

130242014067“电商系统购物车功能模块”需求分析与设计实验课小结

...2)选题讨论现在是网络时代,几乎人人都会网上购物,电商平台诸如淘宝,京东等。平台上的商品越来越多,玲琅满目。我们在这些平台上进行购物也不再是买一个东西下一单,买一个下一单的情况了 查看详情

电商项目介绍(代码片段)

...,一直参与这个商城系统的开发,我们这个系统是b2c模式的电商系统,我简单介绍一下我们这个系统的架构,项目是一个分布式架构项目,后台部分用的是springboot,springsvc,mybatis,权限验证是c罗,前端用的是vue+elementui,总共是7个人做这... 查看详情