我们电商上面订单的状态修改是非常普通的业务
随着商品的购买流程,订单的状态有
状态:
0=未支付
1=已关闭(超时未支付)
2=已取消
3=已支付
4=已签收
5=已拒收
6=退款处理中
7=已退款
修改订单状态就是根据订单id修改订单的state
我们随着业务的发展,订单可能需要更多修改的需求
订单的列(字段)比较多,如果每个字段修改,都需要编写一个方法的话,那么方法的数量会非常多
如果我们编写一个方法,能够接收订单对象的实体类参数(OmsOrder)
我们要实现可以根据OmsOrder对象的实际数据来实现动态的修改要修改的字段
Mybatis中可以通过编写动态修改sql语句完成这个需求
OmsOrderMapper接口添加方法
- // 动态修改订单的sql,参数是omsOrder实体类对象
- // 对象中必须有id,id不可修改,其它属性不为空就修改其它属性值
- int updateOrderById(OmsOrder order);
OmsOrderMapper.xml编写sql
- <update id="updateOrderById">
- update oms_order
- <set>
- <if test="contactName!=null">
- contact_name=#{contactName},
- if>
- <if test="mobilePhone!=null">
- mobile_phone=#{mobilePhone},
- if>
- <if test="telephone!=null">
- telephone=#{telephone},
- if>
- <if test="streetCode!=null">
- street_code=#{streetCode},
- if>
- <if test="streetName!=null">
- street_name=#{streetName},
- if>
- <if test="detailedAddress!=null">
- detailed_address=#{detailedAddress},
- if>
- <if test="tag!=null">
- tag=#{tag},
- if>
- <if test="paymentType!=null">
- payment_type=#{paymentType},
- if>
- <if test="state!=null">
- state=#{state},
- if>
- <if test="rewardPoint!=null">
- reward_point=#{rewardPoint},
- if>
- <if test="amountOfOriginalPrice!=null">
- amount_of_original_price=#{amountOfOriginalPrice},
- if>
- <if test="amountOfFreight!=null">
- amount_of_freight=#{amountOfFreight},
- if>
- <if test="amountOfDiscount!=null">
- amount_of_discount=#{amountOfDiscount},
- if>
- <if test="amountOfActualPay!=null">
- amount_of_actual_pay=#{amountOfActualPay},
- if>
- <if test="gmtPay!=null">
- gmt_pay=#{gmtPay},
- if>
- set>
- where
- id=#{id}
- update>
OmsOrderServiceImpl
- // 根据订单id 修改订单状态的业务逻辑层方法
- @Override
- public void updateOrderState(OrderStateUpdateDTO orderStateUpdateDTO) {
- // 参数OrderStateUpdateDTO包含订单id和要修改的状态码
- // 将参数属性值赋值给OmsOrder类型对象,以便持久层调用
- OmsOrder order=new OmsOrder();
- BeanUtils.copyProperties(orderStateUpdateDTO,order);
- // 调用持久层方法
- omsOrderMapper.updateOrderById(order);
- }
启动Nacos\Seata
启动Order
测试时根据实际数据库订单id,修改knife4j的数据然后再运行
运行后查看数据库中订单状态列是否修改
我们要想完成高效的搜索任务,需要ES的支持
因为数据库的模糊查询效率太低了
我们在前端页面中完成的搜索是从ES中搜索数据
这样就要求,我们在查询之前,需要先将商品信息(spu)保存到ES中
一开始我们使用最原始的办法:从数据库查询出数据之后新增到ES中
搜索功能编写在mall-search模块中
它使用的实体类在cn.tedu.mall.pojo.search.eneity包下SpuForElastic
这个类有四个字段是具备分词功能的
所以支持我们使用这4个字段进行查询
- /**
- * SPU名称
- */
- @Field(name = "name",type = FieldType.Text,
- analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
- @ApiModelProperty