diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java index b893050..875628d 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5MemberController.java @@ -6,6 +6,7 @@ import com.cyl.h5.pojo.response.ValidatePhoneResponse; import com.cyl.h5.pojo.response.H5LoginResponse; import com.cyl.h5.service.H5MemberService; import com.cyl.manager.ums.pojo.vo.MemberVO; +import com.cyl.wechat.WechatAuthService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -18,6 +19,7 @@ public class H5MemberController { @Autowired private H5MemberService service; + @ApiOperation("会员注册") @PostMapping("/register") public ResponseEntity register(@RequestBody RegisterRequest request){ diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java index 50094ab..213e0e4 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java @@ -1,13 +1,18 @@ package com.cyl.h5.controller; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; import com.cyl.h5.pojo.dto.OrderCreateDTO; +import com.cyl.h5.pojo.request.CancelOrderRequest; import com.cyl.h5.pojo.vo.CountOrderVO; import com.cyl.h5.pojo.vo.H5OrderVO; import com.cyl.h5.pojo.vo.OrderCalcVO; import com.cyl.h5.pojo.vo.form.OrderSubmitForm; import com.cyl.h5.service.H5OrderService; +import com.cyl.manager.oms.domain.Order; import com.cyl.manager.ums.domain.Member; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisService; import com.ruoyi.framework.config.LocalDataUtil; import io.swagger.annotations.ApiOperation; @@ -18,6 +23,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/h5/order") @Slf4j @@ -103,4 +110,25 @@ public class H5OrderController { Long memberId = member.getId(); return ResponseEntity.ok(service.orderNumCount(memberId)); } + + @ApiOperation("取消订单") + @PostMapping("/orderCancel") + public ResponseEntity orderCancel(@RequestBody CancelOrderRequest request){ + Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); + String redisKey = "h5_oms_order_cancel_"+ request.getIdList().get(0); + String redisValue = request.getIdList().get(0)+"_"+System.currentTimeMillis(); + try{ + redisService.lock(redisKey,redisValue,60); + return ResponseEntity.ok(service.orderBatchCancel(request, member.getId())); + }catch (Exception e){ + log.error("订单取消方法异常",e); + throw new RuntimeException("订单取消失败"); + }finally { + try { + redisService.unLock(redisKey,redisValue); + }catch (Exception e){ + log.error("",e); + } + } + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/CancelOrderRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/CancelOrderRequest.java new file mode 100644 index 0000000..79a52c4 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/CancelOrderRequest.java @@ -0,0 +1,14 @@ +package com.cyl.h5.pojo.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel("取消订单请求") +public class CancelOrderRequest { + @ApiModelProperty("要取消的订单id集合") + private List idList; +} diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java index 2d90442..906d034 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/RegisterRequest.java @@ -24,4 +24,7 @@ public class RegisterRequest { @NotBlank private String code; + @ApiModelProperty("微信授权code") + private String wechatCode; + } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java index 52e77a8..191a03d 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5MemberService.java @@ -10,8 +10,12 @@ import com.cyl.h5.pojo.response.RegisterResponse; import com.cyl.h5.pojo.response.ValidatePhoneResponse; import com.cyl.h5.pojo.response.H5LoginResponse; import com.cyl.manager.ums.domain.Member; +import com.cyl.manager.ums.domain.MemberWechat; import com.cyl.manager.ums.mapper.MemberMapper; +import com.cyl.manager.ums.mapper.MemberWechatMapper; import com.cyl.manager.ums.pojo.vo.MemberVO; +import com.cyl.wechat.WechatAuthService; +import com.cyl.wechat.response.WechatUserAuth; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.model.LoginMember; import com.ruoyi.common.core.redis.RedisCache; @@ -26,6 +30,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Base64Utils; import java.time.LocalDateTime; @@ -47,12 +52,20 @@ public class H5MemberService { @Value("${aes.key}") private String aesKey; + @Autowired + private WechatAuthService wechatAuthService; + + @Autowired + private MemberWechatMapper memberWechatMapper; + /** * 注册 * @param request 注册请求体 * @return 结果 */ + @Transactional public RegisterResponse register(RegisterRequest request){ + LocalDateTime optDate = LocalDateTime.now(); RegisterResponse response = new RegisterResponse(); //校验验证码 this.validateVerifyCode(request.getUuid(), request.getMobile(), request.getCode()); @@ -64,8 +77,28 @@ public class H5MemberService { member.setNickname("用户" + request.getMobile().substring(7,11)); member.setStatus(Constants.MEMBER_ACCOUNT_STATUS.NORMAL); member.setGender(0); - member.setCreateTime(LocalDateTime.now()); - memberMapper.insert(member); + member.setCreateTime(optDate); + int rows = memberMapper.insert(member); + if (rows < 1){ + throw new RuntimeException("注册失败,请重试"); + } + //调用微信授权业务拿到openId等 + WechatUserAuth userToken = wechatAuthService.getUserToken(request.getWechatCode()); + if (userToken == null){ + throw new RuntimeException("授权失败,请重试"); + } + MemberWechat memberWechat = new MemberWechat(); + memberWechat.setMemberId(member.getId()); + memberWechat.setOpenid(userToken.getOpenid()); + memberWechat.setAccessToken(userToken.getAccess_token()); + memberWechat.setExpiresIn(userToken.getExpires_in()); + memberWechat.setRefreshToken(userToken.getRefresh_token()); + memberWechat.setCreateTime(optDate); + memberWechat.setCreateBy(member.getId()); + rows = memberWechatMapper.insert(memberWechat); + if (rows < 1){ + throw new RuntimeException("注册失败,请重试"); + } //注册成功直接返回token了 H5LoginResponse loginResponse = getLoginResponse(member.getId()); response.setToken(loginResponse.getToken()); diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java index d8f0b8e..3b48865 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.cyl.h5.pojo.dto.OrderCreateDTO; import com.cyl.h5.pojo.dto.OrderProductListDTO; +import com.cyl.h5.pojo.request.CancelOrderRequest; import com.cyl.h5.pojo.vo.CountOrderVO; import com.cyl.h5.pojo.vo.H5OrderVO; import com.cyl.h5.pojo.vo.OrderCalcVO; @@ -19,6 +20,7 @@ import com.cyl.manager.oms.mapper.OrderItemMapper; import com.cyl.manager.oms.mapper.OrderMapper; import com.cyl.manager.oms.mapper.OrderOperateHistoryMapper; import com.cyl.manager.oms.service.OrderItemService; +import com.cyl.manager.oms.service.OrderOperateHistoryService; import com.cyl.manager.pms.domain.Product; import com.cyl.manager.pms.domain.Sku; import com.cyl.manager.pms.mapper.ProductMapper; @@ -72,6 +74,9 @@ public class H5OrderService { @Autowired private OrderItemService orderItemService; + @Autowired + private OrderOperateHistoryService orderOperateHistoryService; + @Transactional public Long submit(OrderSubmitForm form) { Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO); @@ -349,4 +354,48 @@ public class H5OrderService { public CountOrderVO orderNumCount(Long memberId) { return orderMapper.countByStatusAndMemberId(memberId); } + + @Transactional + public String orderBatchCancel(CancelOrderRequest request, Long userId) { + LocalDateTime optDate = LocalDateTime.now(); + if (CollectionUtil.isEmpty(request.getIdList())){ + throw new RuntimeException("未指定需要取消的订单号"); + } + QueryWrapper orderQw = new QueryWrapper<>(); + orderQw.in("id", request.getIdList()); + List orderList = orderMapper.selectList(orderQw); + if (orderList.size() < request.getIdList().size()){ + throw new RuntimeException("未查询到订单信息"); + } + long count = orderList.stream().filter(it -> !Constants.H5OrderStatus.UN_PAY.equals(it.getStatus())).count(); + if (count > 0){ + throw new RuntimeException("订单状态已更新,请刷新页面"); + } + List addHistoryList = new ArrayList<>(); + orderList.forEach(item -> { + item.setStatus(Constants.H5OrderStatus.CLOSED); + item.setUpdateTime(optDate); + item.setUpdateBy(userId); + OrderOperateHistory history = new OrderOperateHistory(); + history.setOrderId(item.getId()); + history.setOperateMan("用户"); + history.setOrderStatus(Constants.H5OrderStatus.CLOSED); + history.setCreateTime(optDate); + history.setCreateBy(userId); + history.setUpdateBy(userId); + history.setUpdateTime(optDate); + addHistoryList.add(history); + }); + //取消订单 + int rows = orderMapper.cancelBatch(orderList); + if (rows < 1){ + throw new RuntimeException("更改订单状态失败"); + } + //创建订单操作记录 + boolean flag = orderOperateHistoryService.saveBatch(addHistoryList); + if (!flag){ + throw new RuntimeException("创建订单操作记录失败"); + } + return "取消订单成功"; + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java b/ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java index cf0faaf..ee4e354 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java @@ -30,4 +30,6 @@ public interface OrderMapper extends BaseMapper { H5OrderVO selectOrderDetail(Long orderId); CountOrderVO countByStatusAndMemberId(Long memberId); + + Integer cancelBatch(@Param("list") List orderList); } diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/OrderOperateHistoryService.java b/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/OrderOperateHistoryService.java index 575cb14..038b861 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/OrderOperateHistoryService.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/OrderOperateHistoryService.java @@ -3,6 +3,7 @@ package com.cyl.manager.oms.service; import java.util.List; import java.time.LocalDateTime; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; @@ -19,7 +20,7 @@ import com.cyl.manager.oms.pojo.query.OrderOperateHistoryQuery; * @author zcc */ @Service -public class OrderOperateHistoryService { +public class OrderOperateHistoryService extends ServiceImpl { @Autowired private OrderOperateHistoryMapper orderOperateHistoryMapper; diff --git a/ruoyi-mall/src/main/resources/mapper/oms/OrderMapper.xml b/ruoyi-mall/src/main/resources/mapper/oms/OrderMapper.xml index 9c04574..64d1d0d 100644 --- a/ruoyi-mall/src/main/resources/mapper/oms/OrderMapper.xml +++ b/ruoyi-mall/src/main/resources/mapper/oms/OrderMapper.xml @@ -47,6 +47,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select id, member_id, member_username, total_amount, purchase_price, pay_amount, freight_amount, pay_type, status, aftersale_status, delivery_company, delivery_sn, auto_confirm_day, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_district, receiver_province_id, receiver_city_id, receiver_district_id, receiver_detail_address, note, confirm_status, delete_status, payment_time, delivery_time, receive_time, create_by, create_time, update_by, update_time from oms_order + + + update oms_order + + status=#{item.status}, + update_by=#{item.updateBy}, + update_time=#{item.updateTime} + + where id=#{item.id} + +