From 06d54f2b51bf88d9ad0e6c35c8075ab75b028a1f Mon Sep 17 00:00:00 2001 From: xhxu Date: Wed, 12 May 2021 17:45:50 +0800 Subject: [PATCH 1/6] tt --- .../iformall/controller/BaseController.java | 9 + .../controller/TtOrderController.java | 360 ++++++++++++++++++ ...roller.java => TtUserGrantController.java} | 2 +- 3 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java rename mallinkTTCApi/src/main/java/com/iformall/controller/{WxUserGrantController.java => TtUserGrantController.java} (99%) diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/BaseController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/BaseController.java index 66bf1f6cf..b46c99732 100644 --- a/mallinkTTCApi/src/main/java/com/iformall/controller/BaseController.java +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/BaseController.java @@ -232,6 +232,15 @@ public class BaseController { return member; } + public Long getMemberId() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + Long memberId = (Long) request.getAttribute(Constant.LOGIN_MEMBER_KEY); + if(memberId == null){ + throw new MallinkException(ErrorCode.USER_IS_NOT_MEMBER); + } + return memberId; + } + public String getIpAddr() { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String ipaddress = IPUtil.getIpAddr(request); diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java new file mode 100644 index 000000000..01d1d26c2 --- /dev/null +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java @@ -0,0 +1,360 @@ +package com.iformall.controller; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.dto.OrderSaveDto; +import com.iformall.domain.po.WxCUserBasicInfo; +import com.iformall.domain.po.WxCoupon; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.base.BaseEntity; +import com.iformall.domain.vo.WxCouponCVo; +import com.iformall.domain.vo.WxOrderCouponPressVo; +import com.iformall.domain.vo.WxOrderCouponVo; +import com.iformall.enums.*; +import com.iformall.exception.MallinkException; +import com.iformall.service.WxCUserBasicInfoService; +import com.iformall.service.WxCouponChannelService; +import com.iformall.service.WxCouponService; +import com.iformall.service.WxOrderService; +import com.iformall.utils.Constant; +import com.iformall.utils.RedisLock; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.Map; + +@RestController +@RequestMapping("/api/order/") +@Api(description = "订单相关接口") +public class TtOrderController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxCouponChannelService wxCouponChannelService; + + @Autowired + private WxOrderService wxOrderService; + + @Autowired + private WxCouponService wxCouponService; + + @Autowired + private WxCUserBasicInfoService wxCUserBasicInfoService; + + @Autowired + @Qualifier("couponDetailRedisTemplate") + RedisTemplate cdRedisTemplate; + + @Autowired + RedisLock redisLock; + + @ApiOperation(value = "下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"}") + @PostMapping("save") + public ResultData saveOrder(@RequestBody OrderSaveDto orderSaveDto) { + Long memberId; + try { + memberId = getMemberId(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + return wxOrderService.saveOrder(orderSaveDto,memberId,EnumPayWay.PAY_WAY_WECHAT,getTenantInfo()); + } + + + @ApiOperation(value = "取消订单", notes = "{\"orderId\":\"string\"}") + @PostMapping("cancel") + public ResultData cancelOrder(@RequestBody Map paramMap) { + //Assert.notNull(wxOrders.getName(), "角色名不能为空"); + //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); + String orderIdStr = paramMap.get("orderId"); + if (StringUtils.isBlank(orderIdStr) || orderIdStr.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); + } + Long orderId = 0L; + try { + orderId = Long.valueOf(orderIdStr); + } catch (NumberFormatException e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL, "orderId: " + orderIdStr + ", e: " + e.getMessage()); + } + try { + WxOrder order = wxOrderService.getById(orderId,getTenantInfo().getTenantId()); + if (order != null) { + wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); + } + } catch (Exception e) { + logger.error("取消订单失败: " + e.getMessage()); + return new ResultData(ErrorCode.ORDER_IS_FAIL.getCode(), "取消订单失败: " + e.getMessage()); + } + + return new ResultData(); + } + + @ApiOperation(value = "订单已过期", notes = "{\"orderId\":\"string\"}") + @PostMapping("expired") + public ResultData expiredOrder(@RequestBody Map paramMap) { + //Assert.notNull(wxOrders.getName(), "角色名不能为空"); + //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); + String orderIdStr = paramMap.get("orderId"); + if (StringUtils.isBlank(orderIdStr) || orderIdStr.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "退款订单ID不能为空"); + } + Long orderId = 0L; + try { + orderId = Long.valueOf(orderIdStr); + } catch (NumberFormatException e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "退款订单ID转换失败"); + } + try { + WxOrder order = wxOrderService.getById(orderId,getTenantInfo().getTenantId()); + if (order != null) { + wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS); + } + } catch (Exception e) { + logger.error("更新退款订单状态失败:" + e.getMessage()); + return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), "更新退款订单状态失败:" + e.getMessage()); + } + return new ResultData(); + } + + @ApiOperation("分页订单列表接口") + @GetMapping("list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true), + }) + public ResultData list(@ModelAttribute WxOrder wxOrder, Integer pageNum, Integer pageSize) { + // c端用户应该只能看到自己的订单 + if (wxOrder == null){ + wxOrder = new WxOrder(); + } + Long memberId; + try { + memberId = getMemberId(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + wxOrder.setCUserId(memberId); + wxOrder.setSortColumns(BaseEntity.SortField.UpdateDate_DESC); + final PageInfo page = wxOrderService.listCUserVoAsPage(wxOrder, pageNum, pageSize); + + Date now = new Date(); + page.getList().stream().forEach(oc->{ + if (oc.getValidStartDate() != null && oc.getValidEndDate() != null ) { + if (oc.getValidStartDate().getTime() > now.getTime()) { + oc.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode()); + } else if (oc.getValidEndDate().getTime() < now.getTime()) { + oc.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode()); + } else { + oc.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode()); + } + } + }); + + + return new ResultData(page); + } + + @ApiOperation("订单详情接口") + @GetMapping("detail") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true) + }) + public ResultData detail(String orderId) { + if (StringUtils.isBlank(orderId) || orderId.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + // c端用户应该只能看到自己的订单细节 + WxOrder wxOrder = new WxOrder(); + Long id = 0L; + try { + id = Long.valueOf(orderId); + } catch (NumberFormatException e) { + logger.error("parse orderId failed"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); + } + wxOrder.setId(id); + Long memberId; + try { + memberId = getMemberId(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + wxOrder.setCUserId(memberId); + WxOrderCouponVo wxOrderCVo = wxOrderService.detailCUserVo(wxOrder); + if (wxOrderCVo == null) + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); + + Date now = new Date(); + + if (wxOrderCVo.getValidStartDate() != null && wxOrderCVo.getValidEndDate() != null + && !wxOrderCVo.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())) { + if (wxOrderCVo.getValidStartDate().getTime() > now.getTime()) { + wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode()); + } else if (wxOrderCVo.getValidEndDate().getTime() < now.getTime()) { + wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode()); + } else { + wxOrderCVo.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode()); + } + } + if(wxOrderCVo.getType().equals(EnumCouponType.COUPON_PREORDER.getCode()) + && wxOrderCVo.getPickStartDate() != null && wxOrderCVo.getPickEndDate() != null){ +// wxOrderCVo.setValidStartDate(wxOrderCVo.getPickStartDate()); +// wxOrderCVo.setValidEndDate(wxOrderCVo.getPickEndDate()); + if (wxOrderCVo.getPickStartDate().getTime() > now.getTime()) { + wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode()); + } else if (wxOrderCVo.getPickEndDate().getTime() < now.getTime()) { + wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode()); + } else { + wxOrderCVo.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode()); + } + } + + return new ResultData(wxOrderCVo); + } + + @ApiOperation(value = "根据orderId查询接口", notes = "{\"orderId\":\"string\"}") + @GetMapping("/findById") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true) + }) + public ResultData findById(String orderId) { + if (orderId == null || orderId.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + Long id = 0L; + try { + id = Long.valueOf(orderId); + } catch (NumberFormatException e) { + logger.error("parse orderId failed"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); + } + WxOrder order = null; + try { + order = wxOrderService.getById(id,getTenantInfo().getTenantId()); + if (order != null) { + return new ResultData(Result.SUCCESS, "查询成功", order); + } else { + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); + } + } catch (Exception e) { + logger.error("parse orderId failed"); + return new ResultData(ErrorCode.DB_FAIL.getCode(), "订单查询未成功,e:" + e.getMessage()); + } + } + + @ApiOperation(value = "获取未支付订单", notes = "{\"couponId\":\"string\"}") + @GetMapping("getUnPaidOrder") + @ApiImplicitParams({ + @ApiImplicitParam(name = "couponId", value = "券id", dataType = "String", paramType = "query", required = true) + }) + public ResultData getUnPaidOrder(String couponId) { + if (couponId == null || couponId.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + Long id = 0L; + try { + id = Long.valueOf(couponId); + } catch (NumberFormatException e) { + logger.error("parse couponId failed"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "券ID转换异常"); + } + WxCoupon wxCoupon = null; + try { + wxCoupon = wxCouponService.getById(id,getTenantInfo().getTenantId()); + } catch (Exception e) { + logger.error("券ID获取券信息失败, couponId: " + couponId); + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + if(wxCoupon == null) { + logger.error("券ID获取券信息失败, couponId: " + couponId); + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + + WxOrder order = null; + try { + WxCUserBasicInfo member = wxCUserBasicInfoService.getById(getMemberId(),getTenantInfo().getFinalTenantId()); + if(member == null) { + logger.error("会员用户未找到: " + getMemberId()); + throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "会员用户未找到" + getMemberId()); + } + order = wxOrderService.getUnPaidOrder(member, wxCoupon); + if (order != null) { + return new ResultData(Result.SUCCESS, "查询成功", order); + } else { + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); + } + } catch (Exception e) { + logger.error("parse orderId failed"); + return new ResultData(ErrorCode.DB_FAIL.getCode(), "订单查询未成功,e:" + e.getMessage()); + } + } + + @ApiOperation("我的砍价-分页列表接口") + @GetMapping("pressOrderList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData pressOrderList(@ModelAttribute WxOrder wxOrder, Integer pageNum, Integer pageSize) { + // c端用户应该只能看到自己的订单 + if (wxOrder == null) wxOrder = new WxOrder(); + Long memberId; + try { + memberId = getMemberId(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + wxOrder.setCUserId(memberId); + wxOrder.setSortColumns(BaseEntity.SortField.CreateDate_DESC); + final PageInfo page = wxOrderService.listPressVoAsPage(wxOrder, pageNum, pageSize); + return new ResultData(page); + } + + @ApiOperation("砍价订单-详情接口") + @GetMapping("pressOrderDetail") + @ApiImplicitParams({ + @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true) + }) + public ResultData pressOrderDetail(String orderId) { + // c端用户应该只能看到自己的订单细节 + WxOrder wxOrder = new WxOrder(); + if(StringUtils.isBlank(orderId)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID不能为空"); + } + Long id = 0L; + try { + id = Long.valueOf(orderId); + } catch (NumberFormatException e) { + logger.error("parse orderId failed"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); + } + wxOrder.setId(id); + wxOrder.updateTenantInfo(getTenantInfo()); + try { + final WxOrderCouponPressVo orderCouponPressVo = wxOrderService.detailPressVo(wxOrder); + if (orderCouponPressVo == null) { + logger.error("orderCouponPressVo is null: " + orderId); + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); + } + return new ResultData(orderCouponPressVo); + } catch (Exception e) { + logger.error("SQL: " + e.getMessage()); + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); + } + } + + +} diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/WxUserGrantController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtUserGrantController.java similarity index 99% rename from mallinkTTCApi/src/main/java/com/iformall/controller/WxUserGrantController.java rename to mallinkTTCApi/src/main/java/com/iformall/controller/TtUserGrantController.java index d1a84ae55..2a48b2668 100644 --- a/mallinkTTCApi/src/main/java/com/iformall/controller/WxUserGrantController.java +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtUserGrantController.java @@ -38,7 +38,7 @@ import java.util.Map; @RestController @RequestMapping("/api/user") @Api(description = "用户登陆授权相关接口") -public class WxUserGrantController extends BaseController { +public class TtUserGrantController extends BaseController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); From ee7686bb705901f7f4e3bdf7d12ed3571052db90 Mon Sep 17 00:00:00 2001 From: xhxu Date: Thu, 13 May 2021 15:16:58 +0800 Subject: [PATCH 2/6] tt --- .../com/iformall/domain/po/tt/TtOrder.java | 67 ++ .../com/iformall/mapper/TtOrderMapper.java | 66 ++ .../main/resources/mapper/TtOrderMapper.xml | 992 ++++++++++++++++++ .../controller/TtOrderController.java | 2 - 4 files changed, 1125 insertions(+), 2 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java create mode 100644 mallinkService/src/main/resources/mapper/TtOrderMapper.xml diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java new file mode 100644 index 000000000..c607c9aae --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java @@ -0,0 +1,67 @@ +package com.iformall.domain.po.tt; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.iformall.domain.po.base.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.math.BigDecimal; +import java.util.Date; + +@TableName(value = "tt_order") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class TtOrder extends TenantEntity { + + protected Long id; + + @io.swagger.annotations.ApiModelProperty(value="c端用户id",name="cUserId") + private Long cUserId; + @TableField(exist = false) + private String nickName; + @TableField(exist = false) + private String phone; + @io.swagger.annotations.ApiModelProperty(value="产品ID(couponId)",name="productId") + private Long productId; + @TableField(exist = false) + private String productTitle; + @TableField(exist = false) + private String productPic; + @TableField(exist = false) + private String author; + @TableField(exist = false) + private String authorPic; + @io.swagger.annotations.ApiModelProperty(value="支付类型(1:支付宝,2:微信)",name="type") + private Integer type; + @io.swagger.annotations.ApiModelProperty(value="0: 付款 1: 退款",name="paymentType") + private Integer paymentType; + + @io.swagger.annotations.ApiModelProperty(value="支付金额(分):允许有负数,退款时为负值。",name="payment") + private Integer payment; + @io.swagger.annotations.ApiModelProperty(value="支付时间",name="paymentTime") + private Date paymentTime; + + @Excel(name = "订单状态", width = 20, orderNum = "9", replace = {"待付款_0", "已支付_1", "已取消_2", "待退款_3", "已退款_4", "退款失败_5", " _-1"}) + @io.swagger.annotations.ApiModelProperty(value="\"待付款_0\", \"已支付_1\", \"已取消_2\", \"待退款_3\", \"已退款_4\", \"退款失败_5\", \" _-1\"",name="orderStatus") + private Integer orderStatus; + + @Excel(name = "订单日期", width = 20, orderNum = "7", format = "yyyy-MM-dd") + @io.swagger.annotations.ApiModelProperty(value="创建时间/砍价开始时间",name="createDate") + private Date createDate; + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + + + public String getPaymentStr() { + return payment != null ? new BigDecimal(payment).divide(new BigDecimal(100)).toPlainString() : paymentStr; + } + + @Excel(name = "订单金额(元)", width = 20, orderNum = "6") + @TableField(exist = false) + private String paymentStr; + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java new file mode 100644 index 000000000..d10c6995c --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java @@ -0,0 +1,66 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.dto.WxOrderReportDto; +import com.iformall.domain.po.WxOrder; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.domain.po.tt.TtOrder; +import com.iformall.domain.vo.*; +import org.apache.ibatis.annotations.Param; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public interface TtOrderMapper extends CommonMapper { + + List findList(TtOrder record); + + Integer countList(WxOrder wxOrder); + int countCouponConditionType1(WxOrder wxOrder); + + List findListOfUnpaidOrderByDate(Map dateMap); + + List findListOfUnpaidPressOrderByDate(Map dateMap); + List findListOfCompleteUnPaidPressOrderByDate(Map dateMap); + + List findListOfUnpaidGroupOrderByDate(Map dateMap); + + List findListOfCUser(WxOrder wxOrder); + List selectDetailOfCUser(WxOrder wxOrder); + + /** B端收银台(收款码支付) */ + Map dayMicroPayAmountList(Map dateMap); + List findListOfMicroPayOrderByDate(Map dateMap); + List findListOfExpMicroPayOrderByDate(Map dateMap); + + List queryForSceneRepotyHistory(HashMap params); + + List listOrderReportByDate(HashMap params); + + List listMicroPayOrderReportByDateAndMerchant(HashMap params); + + List findListOfMerchantMicroPayOrderByDate(@Param("wxOrderReportDto") WxOrderReportDto wxOrderReportDto, @Param("tenantEntitys")List tenantEntitys); + + List findListOrder(WxOrderQueryVo record); + + Long queryOrderForMerchantCount(Map params); + + Long queryOrderForSum(Map params); + + Long queryOrderForCount(Map params); + + /**砍价*/ + List findListOfPress(WxOrder wxOrder); + WxOrderCouponPressVo selectDetailOfPress(WxOrder wxOrder); + void updateStatusByPressCouponId(WxOrder wxOrder); + + void updateStatusByOrderGroupId(WxOrder order); + + void updateOrderGroupStatusByCouponId(WxOrder updateOrder); + + void updateOrderGroupStatusByCouponChannelId(WxOrder updateOrder); + + void updateOrderStatusForGroup(@Param("tenantId")String tenantId); + +} diff --git a/mallinkService/src/main/resources/mapper/TtOrderMapper.xml b/mallinkService/src/main/resources/mapper/TtOrderMapper.xml new file mode 100644 index 000000000..549109966 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/TtOrderMapper.xml @@ -0,0 +1,992 @@ + + + + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`parent_tenant_id`,`c_user_id`,`coupon_channel_id`,`product_id`,`type`,`payment_type`,`payment`,`payment_time`,`order_status`,`create_date`,`update_date`,`detail`, + `press_end_date`,`press_current_num`,`press_current_value`,`order_group_id`,`form_id`,`total_payment` + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `order_number` = #{orderNumber} + + + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + and `c_user_id` = #{cUserId} + + + + and `coupon_channel_id` = #{couponChannelId} + + + + and `product_id` = #{productId} + + + + and `type` = #{type} + + + + and `payment_type` = #{paymentType} + + + + and `payment` = #{payment} + + + + and `payment_time` = #{paymentTime} + + + + and `order_status` = #{orderStatus} + + + + and `create_date` = #{createDate} + + + + and `update_date` = #{updateDate} + + + + and `detail` like concat('%', #{detail},'%') + + + + and `press_end_date` = #{pressEndDate} + + + + and `press_current_num` = #{pressCurrentNum} + + + + and `press_current_value` = #{pressCurrentValue} + + + + and `order_group_id` = #{orderGroupId} + + + + and `form_id` = #{formId} + + + + and `order_status` in + + #{sItem} + + + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + + + + + + + + + + + + + o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status,o.create_date,o.update_date, + c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.detail,c.remark,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, + co.id as coupon_order_id,co.coupon_order_status,c.support_transfer,c.subsidy_num + + + + update wx_order set order_status=#{orderStatus} + where product_id=#{productId} + and press_end_date is not null and order_status in (6,7) + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + + update wx_order set order_status=#{orderStatus},update_date=#{updateDate} + where product_id=#{productId} and order_status in(10,15) + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + + update wx_order set order_status=#{orderStatus},update_date=#{updateDate} + where coupon_channel_id=#{couponChannelId} and order_status in(10,15) + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status,o.create_date,o.update_date, + c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + o.`id`,o.`order_number`,o.`tenant_id`,o.`parent_tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, + o.`payment_type`,o.`payment`,o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, + m.name as merchant_name, bu.name, bu.phone as bphone, + cubi.phone, cubi.nick_name, cubi.name c_user_name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + o.`id`,o.`order_number`,o.`tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, + o.`payment_type`,o.`payment`,o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, + m.name as merchant_name, bu.name, bu.phone as bphone, + cubi.phone, cubi.nick_name, cubi.name c_user_name, + po.id as pay_order_id, po.transaction_id + + + + + + + + + + + + + + + + + + + + + + wm.id as id, + wm.tenant_id as tenant_id, + wm.parent_tenant_id as parent_tenant_id, + wm.name as merchant_name, + wm.link_phone as merchant_phone, + mo.xTime as report_date, + (case when mo.amount > 0 then mo.amount else 0 end) trade_amt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status, + o.create_date,o.update_date,o.press_end_date,o.press_current_num,o.press_current_value, + c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.unit,c.press_limit_num + + + + o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status, + o.create_date,o.update_date,o.press_end_date,o.press_current_num,o.press_current_value, + c.type as coupon_type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.unit,c.detail,c.remark,c.press_limit_num, + co.id as coupon_order_id,co.coupon_order_status + + + + + + + + update wx_order set order_status=#{orderStatus} + where order_group_id=#{orderGroupId} and order_status=10 + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + + update wx_order set order_status=12 where `type`=0 and tenant_id = #{tenantId} and order_status in(10,15) and now()>press_end_date + + + diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java index 01d1d26c2..1d3cc36a6 100644 --- a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java @@ -76,8 +76,6 @@ public class TtOrderController extends BaseController { @ApiOperation(value = "取消订单", notes = "{\"orderId\":\"string\"}") @PostMapping("cancel") public ResultData cancelOrder(@RequestBody Map paramMap) { - //Assert.notNull(wxOrders.getName(), "角色名不能为空"); - //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); String orderIdStr = paramMap.get("orderId"); if (StringUtils.isBlank(orderIdStr) || orderIdStr.equalsIgnoreCase(Constant.UNDEFINED)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); From 013e429c416ce3f824044452740ca0466cd6d7b0 Mon Sep 17 00:00:00 2001 From: xhxu Date: Thu, 13 May 2021 18:19:24 +0800 Subject: [PATCH 3/6] tt --- .../com/iformall/domain/po/tt/TtCoupon.java | 2 + .../com/iformall/domain/po/tt/TtOrder.java | 10 + .../com/iformall/mapper/TtOrderMapper.java | 47 - .../iformall/service/tt/TtOrderService.java | 18 + .../service/tt/impl/TtOrderServiceImpl.java | 2501 +++++++++++++++++ .../main/resources/mapper/TtCouponMapper.xml | 10 +- .../main/resources/mapper/TtOrderMapper.xml | 956 +------ .../controller/TtOrderController.java | 66 +- 8 files changed, 2605 insertions(+), 1005 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java index f9791bf03..e6c2791fb 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java @@ -117,6 +117,8 @@ public class TtCoupon extends TenantEntity { private Long merchantId; @io.swagger.annotations.ApiModelProperty(value="",name="merchantName") private String merchantName; + @io.swagger.annotations.ApiModelProperty(value="",name="merchantPic") + private String merchantPic; @io.swagger.annotations.ApiModelProperty(value="业态",name="businessId") private Long businessId; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java index c607c9aae..47f0beb80 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java @@ -32,6 +32,8 @@ public class TtOrder extends TenantEntity { @TableField(exist = false) private String productPic; @TableField(exist = false) + private Long authorId; + @TableField(exist = false) private String author; @TableField(exist = false) private String authorPic; @@ -64,4 +66,12 @@ public class TtOrder extends TenantEntity { @TableField(exist = false) private String paymentStr; + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-起始时间",name="startdate") + private Date startdate; + + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-结束时间",name="enddate") + private Date enddate; + } diff --git a/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java index d10c6995c..29064cc4f 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java @@ -16,51 +16,4 @@ public interface TtOrderMapper extends CommonMapper { List findList(TtOrder record); - Integer countList(WxOrder wxOrder); - int countCouponConditionType1(WxOrder wxOrder); - - List findListOfUnpaidOrderByDate(Map dateMap); - - List findListOfUnpaidPressOrderByDate(Map dateMap); - List findListOfCompleteUnPaidPressOrderByDate(Map dateMap); - - List findListOfUnpaidGroupOrderByDate(Map dateMap); - - List findListOfCUser(WxOrder wxOrder); - List selectDetailOfCUser(WxOrder wxOrder); - - /** B端收银台(收款码支付) */ - Map dayMicroPayAmountList(Map dateMap); - List findListOfMicroPayOrderByDate(Map dateMap); - List findListOfExpMicroPayOrderByDate(Map dateMap); - - List queryForSceneRepotyHistory(HashMap params); - - List listOrderReportByDate(HashMap params); - - List listMicroPayOrderReportByDateAndMerchant(HashMap params); - - List findListOfMerchantMicroPayOrderByDate(@Param("wxOrderReportDto") WxOrderReportDto wxOrderReportDto, @Param("tenantEntitys")List tenantEntitys); - - List findListOrder(WxOrderQueryVo record); - - Long queryOrderForMerchantCount(Map params); - - Long queryOrderForSum(Map params); - - Long queryOrderForCount(Map params); - - /**砍价*/ - List findListOfPress(WxOrder wxOrder); - WxOrderCouponPressVo selectDetailOfPress(WxOrder wxOrder); - void updateStatusByPressCouponId(WxOrder wxOrder); - - void updateStatusByOrderGroupId(WxOrder order); - - void updateOrderGroupStatusByCouponId(WxOrder updateOrder); - - void updateOrderGroupStatusByCouponChannelId(WxOrder updateOrder); - - void updateOrderStatusForGroup(@Param("tenantId")String tenantId); - } diff --git a/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java b/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java new file mode 100644 index 000000000..d113adc52 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java @@ -0,0 +1,18 @@ +package com.iformall.service.tt; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.tt.TtOrder; + +public interface TtOrderService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(TtOrder record, Integer pageIndex, Integer pageSize); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java new file mode 100644 index 000000000..96636d798 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java @@ -0,0 +1,2501 @@ +package com.iformall.service.tt.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.ResultData; +import com.iformall.domain.dto.OrderSaveDto; +import com.iformall.domain.dto.WxSharingOrderDto; +import com.iformall.domain.po.*; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg; +import com.iformall.domain.po.tt.TtOrder; +import com.iformall.domain.vo.*; +import com.iformall.enums.*; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.*; +import com.iformall.mq.MqBaseProducer; +import com.iformall.service.*; +import com.iformall.service.tt.TtOrderService; +import com.iformall.utils.*; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +@Service +public class TtOrderServiceImpl implements TtOrderService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private TtOrderMapper ttOrderMapper; + + @Autowired + RedisLock redisLock; + + @Autowired + WxAppinfoMapper wxAppinfoMapper; + + @Autowired + WxPayAccountMapper wxPayAccountMapper; + + @Autowired + WxMallMapper wxMallMapper; + + @Autowired + WxMerchantMapper wxMerchantMapper; + + @Autowired + WxCUserMapper wxCUserMapper; + + @Autowired + WxCouponMapper wxCouponMapper; + + @Autowired + WxCouponOrderMapper wxCouponOrderMapper; + + @Autowired + WxCUserService wxCUserService; + + @Autowired + WxCUserBasicInfoService wxCUserBasicInfoService; + + @Autowired + WxPayOrderMapper wxPayOrderMapper; + + @Autowired + WxMerchantBUserMapper wxMerchantBUserMapper; + + @Autowired + WxAppinfoService wxAppinfoService; + + @Autowired + WxPayOrderService wxPayOrderService; + + @Autowired + WxScoreRulesService wxScoreRulesService; + + @Autowired + WxCUserTagsService wxCUserTagsService; + + @Autowired + WxCouponActionLogService wxCouponActionLogService; + + @Autowired + WxProfitSharingOrderService wxProfitSharingOrderService; + + @Autowired + WxCouponMerchantMapper wxCouponMerchantMapper; + + @Autowired + WxCardInfoMapper wxCardInfoMapper; + + @Autowired + WxCouponSendService wxCouponSendService; + + @Autowired + WxOrderPressMapper wxOrderPressMapper; + + @Autowired + WxOrderGroupMapper wxOrderGroupMapper; + + @Autowired + WxCreditHistoryService wxCreditHistoryService; + + @Autowired + WxCouponChannelMapper wxCouponChannelMapper; + + @Autowired + private MqBaseProducer mqBaseProducer; + + @Autowired + private WxCUserBasicInfoMapper wxCUserBasicInfoMapper; + + @Autowired + private WxCouponPasswordMapper couponPasswordMapper; + + @Autowired + ExcelService excelService; + + @Autowired + WxCouponService wxCouponService; + + @Autowired + WxCouponChannelService wxCouponChannelService; + + @Autowired + @Qualifier("couponDetailRedisTemplate") + RedisTemplate cdRedisTemplate; + + @Override + public PageInfo listAsPage(TtOrder record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> ttOrderMapper.findList(record)); + } + + @Override + public ResultData microPayListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize) { + WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(bUserId.longValue()); + if (wxMerchantBUser == null) { + logger.error("B端用户不存在:" + bUserId); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + + WxMerchant wxMerchant = wxMerchantMapper.selectById(wxMerchantBUser.getMerchantId()); + if (wxMerchant == null) { + logger.error("商户不存在:" + bUserId); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); + String dateString; + Date startDate; + Date endDate; + + if (date == null) { + endDate = new Date(); + dateString = fmt.format(new Date()); + try { + startDate = fmt.parse(dateString); + } catch (ParseException e) { + return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); + } + } else { + try { + startDate = fmt.parse(date); + } catch (ParseException e) { + return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); + } + Calendar cal = Calendar.getInstance(); + cal.setTime(startDate); + cal.add(Calendar.DATE, 1); + endDate = cal.getTime(); + } + + Map dateMap = new HashMap(); + dateMap.put("startDate", startDate); + dateMap.put("endDate", endDate); + dateMap.put("merchantId", wxMerchant.getId()); + dateMap.put("type", type); + dateMap.put("tenantId", wxMerchantBUser.getTenantId()); + dateMap.put("finalTenantId", wxMerchantBUser.getFinalTenantId()); + + Map resultMap = new HashMap(); + + if (pageIndex == null || pageSize == null) { + List list; + list = wxOrderMapper.findListOfMicroPayOrderByDate(dateMap); + logger.info("find " + list.size() + " order from " + startDate + " to " + new Date()); + int total_price = 0; + for (WxOrder order : list) { + total_price = total_price + order.getPayment(); + } + resultMap.put("amount", total_price); + } else { + resultMap.put("list", PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfMicroPayOrderByDate(dateMap))); + } + return new ResultData(resultMap); + } + + @Override + public ResultData microPayExpListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize) { + WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(bUserId.longValue()); + if (wxMerchantBUser == null) { + logger.error("B端用户不存在:" + bUserId); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + + WxMerchant wxMerchant = wxMerchantMapper.selectById(wxMerchantBUser.getMerchantId()); + if (wxMerchant == null) { + logger.error("商户不存在:" + bUserId); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); + String dateString; + Date startDate; + Date endDate; + + if (date == null) { + endDate = new Date(); + dateString = fmt.format(new Date()); + try { + startDate = fmt.parse(dateString); + } catch (ParseException e) { + return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); + } + } else { + try { + startDate = fmt.parse(date); + } catch (ParseException e) { + return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); + } + Calendar cal = Calendar.getInstance(); + cal.setTime(startDate); + cal.add(Calendar.DATE, 1); + endDate = cal.getTime(); + } + + Map dateMap = new HashMap(); + dateMap.put("startDate", startDate); + dateMap.put("endDate", endDate); + dateMap.put("merchantId", wxMerchant.getId()); + dateMap.put("type", type); + dateMap.put("tenantId", wxMerchantBUser.getTenantId()); + dateMap.put("finalTenantId", wxMerchantBUser.getFinalTenantId()); + Map resultMap = new HashMap(); + + if (pageIndex == null || pageSize == null) { + List list; + list = wxOrderMapper.findListOfExpMicroPayOrderByDate(dateMap); + logger.info("find " + list.size() + " order from " + startDate + " to " + new Date()); + int total_price = 0; + for (WxOrder order : list) { + total_price = total_price + order.getPayment(); + } + resultMap.put("amount", total_price); + } else { + resultMap.put("list", PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfExpMicroPayOrderByDate(dateMap))); + } + return new ResultData(resultMap); + } + + /** + * 拼团数量 + * + * @param user + * @param counpon + * @return + */ + private int getUserOrderGroupCount(WxCUserBasicInfo user, WxCoupon counpon) { + // + Order 待支付 + try { + WxOrder orderQ = new WxOrder(); + orderQ.updateTenantInfo(counpon); + orderQ.setProductId(counpon.getId()); + orderQ.setType(EnumOrderType.COUPON.getCode()); + orderQ.setCUserId(user.getId()); + orderQ.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + return wxOrderMapper.countList(orderQ); + } catch (Exception e) { + logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + } + + } + + + /** + * 用户购买的订单数量 + * + * @param user + * @param counpon + * @return + */ + private int getUserOrderCount(WxCUserBasicInfo user, WxCoupon counpon) { + // + Order 待支付 + try { + WxOrder orderQ = new WxOrder(); + orderQ.updateTenantInfo(counpon); + orderQ.setProductId(counpon.getId()); + orderQ.setType(EnumOrderType.COUPON.getCode()); + orderQ.setCUserId(user.getId()); + List statusS = new ArrayList<>(); + statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + orderQ.setStatusS(statusS); + return wxOrderMapper.countList(orderQ); + } catch (Exception e) { + logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + } + + } + + /** + * 用户购买的订单数量 + * + * @param user + * @param counpon + * @return + */ + public WxOrder getUnPaidOrder(WxCUserBasicInfo user, WxCoupon counpon) { + // + Order 待支付 + try { + WxOrder orderQ = new WxOrder(); + orderQ.updateTenantInfo(counpon); + orderQ.setProductId(counpon.getId()); + orderQ.setType(EnumOrderType.COUPON.getCode()); + orderQ.setCUserId(user.getId()); + List statusS = new ArrayList<>(); + statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + orderQ.setStatusS(statusS); + List orders = wxOrderMapper.findList(orderQ); + if (orders.size() >= 1) { + return orders.get(0); + } + } catch (Exception e) { + logger.error("待支付Order, couponId: " + counpon.getId() + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); + } + return null; + } + + /** + * 用户正在参加的新手活动 + * + * @param + * @return + */ + public int countCouponConditionType1(String subTenantId,Long cuserId) { + // + Order 待支付 + try { + WxOrder orderQ = new WxOrder(); + orderQ.setTenantId(subTenantId); +// orderQ.setType(EnumOrderType.COUPON.getCode()); + orderQ.setCUserId(cuserId); + List statusS = new ArrayList<>(); + statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_REFUND.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_REFUND_FAILD.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_CANCEL.getCode()); + + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_BREAK.getCode()); + + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE_REFUND.getCode()); + + orderQ.setStatusS(statusS); + return wxOrderMapper.countCouponConditionType1(orderQ); + } catch (Exception e) { + logger.error("用户正在参加的新手活动, userId: " + cuserId + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); + } + } + + /** + * 用户购买的券包数量- 待使用的券 + * + * @param user + * @param counpon + * @return + */ + private int getUserCouponOrderCount(WxCUserBasicInfo user, WxCoupon counpon) { + // + couponOrder ---待使用 + try { + WxCouponOrder couponOrderQ = new WxCouponOrder(); + couponOrderQ.updateTenantInfo(counpon); + couponOrderQ.setCouponId(counpon.getId()); + couponOrderQ.setCUserId(user.getId()); + if (counpon.getSendType().equals(EnumCouponSendType.PASSIVE)) { + couponOrderQ.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); + } + return wxCouponOrderMapper.findCount(couponOrderQ); + } catch (Exception e) { + logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + } + + } + + /** + * 商户注券减库存 + * + * @param user + * @param coupon + * @param couponIdStr + * @param wxCouponSendVo + */ + private void stockMerchantReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr, WxCouponSendVo wxCouponSendVo) { + long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; + String timeStr = String.valueOf(time); + // 库存加锁 + if (!redisLock.lock(couponIdStr, timeStr)) { + logger.error("此券被锁定, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.TOO_MANY_REQUEST.getCode(), coupon.getTitle() + ErrorCode.TOO_MANY_REQUEST.getMessage()); + } + + JSONObject jo = JSONObject.parseObject(wxCouponSendVo.getConditions()); + int merchantSend = jo.getIntValue(WxCouponSend.KEY_MERCHANT_SEND); + int merchantRemain = jo.getIntValue(WxCouponSend.KEY_MERCHANT_REMAIN); + + // 检查 优惠券 库存 + if (merchantRemain <= 0) { + //解锁 + redisLock.unlock(couponIdStr, timeStr); + logger.error("此券库存为0, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY.getCode(), coupon.getTitle() + ErrorCode.REMAIN_IS_EMPTY.getMessage()); + } + + int count = 0; + // 有价券 TODO 当前只支持系统券(免费券) +// if (coupon.getSalePrice() > 0) { +// // 检查是否未支付订单 +// try { +// count = getUserOrderCount(user, coupon); +// } catch (Exception e) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// throw new MallinkException(ErrorCode.DB_FAIL); +// } +// if (count > 0) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); +// throw new MallinkException(ErrorCode.ORDER_UNPAID); +// } +// } + // 检查用户已购买数量 + try { + count = getUserCouponOrderCount(user, coupon); + } catch (Exception e) { + //解锁 + redisLock.unlock(couponIdStr, timeStr); + throw new MallinkException(ErrorCode.DB_FAIL); + } + if (count >= coupon.getUseLimitQuantity()) { + //解锁 + redisLock.unlock(couponIdStr, timeStr); + logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); + throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(), coupon.getTitle() + ErrorCode.ORDER_IS_LIMITED.getMessage()); + } + + try { + // 减库存 + wxCouponSendService.reduceMerchantSend(coupon.getTenantId(),wxCouponSendVo.getId(), merchantRemain, merchantSend, 1); + } catch (RuntimeException e) { + logger.error("此券减库存失败, couponId: {}, error: {}", couponIdStr, e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), coupon.getTitle() + ErrorCode.ORDER_IS_LIMITED.getMessage()); + } finally { + //解锁 + redisLock.unlock(couponIdStr, timeStr); + } + } + + /** + * 减库存 + * + * @param user + * @param coupon + * @param couponIdStr + */ + private void stockReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr) { + //如果缓存中不存在这个key,则从coupon中取 + if(!redisLock.hasCouponStockCache(coupon.getId())) { + //此处需要加锁,防止并发设置 + long time = System.currentTimeMillis() + RedisLock.TIMEOUT; + String timeStr = String.valueOf(time); + boolean stocksetlock = redisLock.lock("couponLockStockSet_"+coupon.getId(), timeStr); + if (stocksetlock) { + if (!redisLock.hasCouponStockCache(coupon.getId())) { + WxCoupon cou = wxCouponMapper.selectById(coupon.getId(),coupon.getTenantId()); + if (null == cou) { + redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"未查询到券!"+coupon.getId()); + } + try { + redisLock.setCouponStock(coupon.getId(), cou.getRemainInventory()); + }catch(Exception e) { + logger.error("set couponstock to redis fail.",e); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"redis设置券库存失败"+coupon.getId()); + }finally { + redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); + } + }else { + redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); + } + } + + } + + long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr)); + if (redisStock<=0) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!:"+couponIdStr); + } + // 检查 优惠券 库存 + if (coupon.getRemainInventory() <= 0) { + throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); + } + + int count = 0; + // 有价券 + if (coupon.getSalePrice() > 0) { + // 检查是否未支付订单 + try { + count = getUserOrderCount(user, coupon); + } catch (Exception e) { + throw new MallinkException(ErrorCode.DB_FAIL); + } + if (count > 0) { + logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); + throw new MallinkException(ErrorCode.ORDER_UNPAID); + } + } + //检查拼团中的数量 + try { + count = getUserOrderGroupCount(user, coupon); + } catch (Exception e) { + throw new MallinkException(ErrorCode.DB_FAIL); + } + if (count >= coupon.getUseLimitQuantity()) { + logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); + throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); + } + + // 检查用户已购买数量 + try { + count = getUserCouponOrderCount(user, coupon); + } catch (Exception e) { + throw new MallinkException(ErrorCode.DB_FAIL); + } + if (count >= coupon.getUseLimitQuantity()) { + logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); + throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); + } + + try { + //减库存,从redis中取,然后发mq消息同步到数据库 + wxCouponService.reduceRemainInventory(coupon.getId(),coupon.getTenantId(), 1); + + long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); + if (stock < 0 ) { + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!"); + } + + +// UpdateCouponStockMsg msg = new UpdateCouponStockMsg(); +// msg.setCouponId(coupon.getId()); +// msg.setNumber(1); +// msg.setOperateType(UpdateCouponStockMsg.OPERATE_TYPE_DECREASE); +// msg.setMsgType(EnumMsgRecordType.COUPON_STOCK.getCode()); +// mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.STOCK.getCode(), "*", "decrease_stock_"+coupon.getId()); + } catch (RuntimeException e) { + logger.error("此券减库存失败, couponId: " + couponIdStr,e); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),e.getMessage()); + } + } + +// /** +// * 减库存 +// * +// * @param user +// * @param coupon +// * @param couponIdStr +// */ +// private void stockReduce(WxCUser user, WxCoupon coupon, String couponIdStr) { +// long time = System.currentTimeMillis() + RedisLock.TIMEOUT; +// String timeStr = String.valueOf(time); +// // 库存加锁 +// if (!redisLock.lock(couponIdStr, timeStr)) { +// logger.error("此券被锁定, couponId: " + couponIdStr); +// throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); +// } +// +// // 检查 优惠券 库存 +// if (coupon.getRemainInventory() <= 0) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券库存为0, couponId: " + couponIdStr); +// throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); +// } +// +// int count = 0; +// // 有价券 +// if (coupon.getSalePrice() > 0) { +// // 检查是否未支付订单 +// try { +// count = getUserOrderCount(user, coupon); +// } catch (Exception e) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// throw new MallinkException(ErrorCode.DB_FAIL); +// } +// if (count > 0) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); +// throw new MallinkException(ErrorCode.ORDER_UNPAID); +// } +// } +// //检查拼团中的数量 +// try { +// count = getUserOrderGroupCount(user, coupon); +// } catch (Exception e) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// throw new MallinkException(ErrorCode.DB_FAIL); +// } +// if (count >= coupon.getUseLimitQuantity()) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); +// throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); +// } +// +// // 检查用户已购买数量 +// try { +// count = getUserCouponOrderCount(user, coupon); +// } catch (Exception e) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// throw new MallinkException(ErrorCode.DB_FAIL); +// } +// if (count >= coupon.getUseLimitQuantity()) { +// //解锁 +// redisLock.unlock(couponIdStr, timeStr); +// logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); +// throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); +// } +// +// try { +// // 减库存 +// int num = wxCouponMapper.reduceInventory(coupon.getId(), 1); +// if (num <= 0) { +// logger.error("此券减库存失败, couponId: " + couponIdStr); +// throw new MallinkException(ErrorCode.ORDER_IS_FAIL); +// } +// } catch (RuntimeException e) { +// logger.error("此券减库存失败, couponId: " + couponIdStr); +// throw new MallinkException(ErrorCode.ORDER_IS_FAIL); +// } finally { +// // 解锁 +// redisLock.unlock(couponIdStr, timeStr); +// } +// } + + @Override + public void stockBack(WxOrder updateOrder) { + // 已取消/已退款,库存加1 + // 获取订单相关coupon + Long couponId = updateOrder.getProductId(); + String couponIdStr = "" + couponId; + //加锁 + long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; + String timeStr = String.valueOf(time); + + if (!redisLock.lock(couponIdStr, timeStr)) { + logger.error("此券被锁定, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); + } + WxCoupon coupon = null; + try { + coupon = wxCouponMapper.selectById(couponId,updateOrder.getTenantId()); + } catch (Exception e) { + logger.error("券未找到, e:" + e.getMessage()); + redisLock.unlock(couponIdStr, timeStr); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon == null) { + logger.error("券未找到, " + couponIdStr); + redisLock.unlock(couponIdStr, timeStr); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } + + try { + int num = wxCouponMapper.backInventory(coupon.getId(),coupon.getTenantId(), 1, coupon.getRemainInventory()); + if (num <= 0) { + logger.error("此券加库存失败, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券couponId:["+couponIdStr+"]库存回滚失败,更新记录条数小于等于0."); + } + redisLock.increase(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); + } catch (Exception e) { + logger.error("数据库更新失败,库存+1失败, e:" + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "库存恢复失败"); + } finally { + //解锁 + redisLock.unlock(couponIdStr, timeStr); + } + } + + /** + * 检查券商户是否可用 + * + * @param couponId + * @return + */ + private boolean isCouponMerchantValid(Long couponId,String tenantId) { + List merchantVoList = wxCouponMerchantMapper.findMerchantNameList(couponId,tenantId); + if (merchantVoList.stream().anyMatch((cm -> cm.getMerchantStatus().equals(EnumMerchantStatus.VALID.getCode())))) { + return true; + } + return false; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public WxOrder saveMicroPayOrder(WxMerchantBUser user, String totalFeeStr,EnumPayWay payWay) { + // 检查用户 + if (user == null) { + logger.error("用户不存在"); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + + // 检查商户 + WxMerchant wxMerchant = wxMerchantMapper.selectById(user.getMerchantId()); + if (wxMerchant == null) { + logger.error("商户不存在, merchantId: " + user.getMerchantId()); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + if (wxMerchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) { + logger.error("商户已禁用, merchantId: " + user.getMerchantId()); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_VALID); + } + + WxOrder record = new WxOrder(); + + Date curr = new Date(); + + BigDecimal totalFee = new BigDecimal(totalFeeStr); + totalFee.setScale(2, BigDecimal.ROUND_HALF_UP); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入) + + int payment = totalFee.multiply(new BigDecimal(100)).intValue(); + + final IdWorker idWorker = IdWorker.get(); + Long orderNumber = idWorker.nextId(); + + // body + // tenant_id + merchant_id + title + subtitle + String bodyStr = "["+payWay.getMessage()+"("+payWay.getCode()+")]刷卡支付, 金额:" + totalFeeStr; + + record.setId(orderNumber); + record.updateTenantInfo(user); + record.setOrderNumber(orderNumber); + record.setType(EnumOrderType.MICROPAY.getCode()); + record.setProductId(user.getId()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(payment); + record.setTotalPayment(payment); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + record.setDetail(bodyStr); + record.setCreateDate(curr); + record.setUpdateDate(curr); + + try { + // 保存订单 + wxOrderMapper.insert(record); + } catch (RuntimeException e) { + logger.error("保存订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + return record; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public WxOrder saveMicroPayOrderV2(WxMerchantBUser user, WxCUserBasicInfo cUser, Integer payment) { + // 检查用户 + if (user == null) { + logger.error("用户不存在"); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + + // 检查商户 + WxMerchant wxMerchant = wxMerchantMapper.selectById(user.getMerchantId()); + if (wxMerchant == null) { + logger.error("商户不存在, merchantId: " + user.getMerchantId()); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + if (wxMerchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) { + logger.error("商户已禁用, merchantId: " + user.getMerchantId()); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_VALID); + } + + WxOrder record = new WxOrder(); + + Date curr = new Date(); + + final IdWorker idWorker = IdWorker.get(); + Long orderNumber = idWorker.nextId(); + + // body + // tenant_id + merchant_id + title + subtitle + String bodyStr = "刷卡支付, 金额:" + payment; + + record.setId(orderNumber); + record.updateTenantInfo(user); + record.setOrderNumber(orderNumber); + record.setType(EnumOrderType.MICROPAY.getCode()); + record.setProductId(user.getId()); + if (cUser != null) { + record.setCUserId(cUser.getId()); + } + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(payment); + record.setTotalPayment(payment); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + record.setDetail(bodyStr); + record.setCreateDate(curr); + record.setUpdateDate(curr); + + try { + // 保存订单 + wxOrderMapper.insert(record); + } catch (RuntimeException e) { + logger.error("保存订单:" + e.getMessage(),e); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + return record; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public WxOrder saveCardPayOrder(WxMerchant merchant, Long cUserId, String totalFeeStr, Integer payment,EnumPayWay payWay) { + Date curr = new Date(); + + final IdWorker idWorker = IdWorker.get(); + Long orderNumber = idWorker.nextId(); + + // body + // tenant_id + merchant_id + title + subtitle + String bodyStr = "["+payWay.getMessage()+"("+payWay.getCode()+")]C扫B储值卡支付, 金额:" + totalFeeStr; + + WxOrder record = new WxOrder(); + record.setId(orderNumber); + record.updateTenantInfo(merchant); + record.setOrderNumber(orderNumber); + record.setType(EnumOrderType.PREPAIDCARD.getCode()); + record.setProductId(merchant.getId()); + record.setCUserId(cUserId); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(payment); + record.setTotalPayment(payment); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + record.setDetail(bodyStr); + record.setCreateDate(curr); + record.setUpdateDate(curr); + + try { + // 保存订单 + wxOrderMapper.insert(record); + } catch (RuntimeException e) { + logger.error("保存订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + return record; + } + + /** + * 创建 couponOrder + * + * @param user + * @param order + * @param coupon + */ + private WxCouponOrder createCouponOrder(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId,EnumPayWay payWay) { + Date curr = new Date(); + Date valid_date = null; + int limit_days = Constant.WX_LIMIT_DAYS; + WxPayAccount payAccount = null; + WxPayAccount payAccountQ = new WxPayAccount(); + payAccountQ.updateTenantInfo(order); + try { + payAccount = wxPayAccountMapper.selectOne(new QueryWrapper<>(payAccountQ)); + } catch (Exception e) { + logger.error("获取payAccount error: " + order.getTenantId()); + } + WxPayOrder payOrder = null; + if (coupon.getSalePrice() > 0) { + // 有价券获取payOrder,以备后续使用 + try { + WxPayOrder payOrderQ = new WxPayOrder(); + payOrderQ.updateTenantInfo(order); + payOrderQ.setOrderId(order.getId()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); + payOrder = wxPayOrderMapper.selectOne(new QueryWrapper(payOrderQ)); + } catch (Exception e) { + logger.error("payOrder not found:" + e.getMessage()); + } + } + + if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode()) || + coupon.getType().equals(EnumCouponType.COUPON_TINGCHE.getCode())) { + + if( coupon.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())){ + valid_date = coupon.getPickEndDate(); + }else{ + valid_date = coupon.getValidEndDate(); + } + if (coupon.getSalePrice() > 0 && !coupon.checkIsCard()) { + if (payOrder != null && payOrder.getShareAmount() != null) { + // 分账有价券核销有效期不能大于分账过期时间 + Date limit_date = DateUtils.getTimeAfterDays(limit_days, curr); + if (valid_date.after(limit_date)) { + valid_date = limit_date; + } + } + } + } else { + if (coupon.getSalePrice() > 0 && !coupon.checkIsCard()) { + if (payOrder != null && payOrder.getShareAmount() != null) { + // 分账有价券核销有效期不能大于分账过期时间 + if (coupon.getValidDays() < Constant.WX_LIMIT_DAYS) { + limit_days = coupon.getValidDays(); + } + } + } else { + limit_days = coupon.getValidDays(); + } + valid_date = DateUtils.getTimeAfterDays(limit_days, curr); + } + boolean isCard = false; + // 检查是否是储值卡 + if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { + isCard = true; + } + //TODO 如果orderId已经存在,则不再添加 + WxCouponOrder couponOrderQ = new WxCouponOrder(); + couponOrderQ.setOrderId(order.getId()); + couponOrderQ.updateTenantInfo(order); + WxCouponOrder couponOrder = null; + List couponorderlist = wxCouponOrderMapper.findList(couponOrderQ); + if (null != couponorderlist && couponorderlist.size() > 0 ) { + couponOrder = couponorderlist.get(0); + }else { + final IdWorker idWorker = IdWorker.get(); + couponOrder = new WxCouponOrder(); + couponOrder.setId(idWorker.nextId()); + couponOrder.updateTenantInfo(order); + couponOrder.setCouponId(order.getProductId()); + couponOrder.setCouponType(coupon.getType()); + couponOrder.setCUserId(user.getId()); + couponOrder.setOwnerId(user.getId()); + couponOrder.setAutoRefund(coupon.getAutoRefund()); + couponOrder.setOrderId(order.getOrderNumber()); + couponOrder.setExpiredTime(valid_date); + //有支付信息,从支付信息中取渠道 + if (null != payOrder) { + couponOrder.setPayVendor(payOrder.getPayVendor()); + }else { + //免费券无需支付,如商户注券,核销发券,免费券等等 + couponOrder.setPayVendor(payWay.getCode()); + } + if (!isCard) { + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); + } else { + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); + } + couponOrder.setCreateDate(curr); + couponOrder.setUpdateDate(curr); + couponOrder.setCouponPrice(order.getPayment()); + wxCouponOrderMapper.insert(couponOrder); + } + + /// 储值卡信息添加 + if (isCard) { + Integer fee = 0; + WxCardInfo cardInfo = new WxCardInfo(); + cardInfo.setId(couponOrder.getId()); + cardInfo.updateTenantInfo(order); + cardInfo.setCouponId(order.getProductId()); + cardInfo.setAmount(coupon.getPrice()); + cardInfo.setSaleAmount(coupon.getSalePrice()); + cardInfo.setRemainingAmount(coupon.getPrice()); + if (!coupon.checkIsFree()) { + //判断该transctionId是否已经存在,如果存在,则不添加 + WxCardInfo cardInfoq = new WxCardInfo(); + cardInfoq.setTransactionId(payOrder.getTransactionId()); + List cardInfoList = wxCardInfoMapper.findList(cardInfoq); + if (null != cardInfoList && cardInfoList.size() > 0) { + //do nothing + }else { + // 有价卡 + cardInfo.setTransactionId(payOrder.getTransactionId()); + if (payOrder.getShareAmount() != null) { + // 开启分账 + fee = payOrder.getPayAmount() - payOrder.getShareAmount(); + cardInfo.setShareFeeAmount(payOrder.getShareAmount()); + cardInfo.setRemainingShareFeeAmount(payOrder.getShareAmount()); + cardInfo.setRateAmount(payOrder.getRateAmount()); + } else { + // 未开启分账 + fee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRate(), false); + Integer shareAmount = payOrder.getPayAmount() - fee; + cardInfo.setShareFeeAmount(shareAmount); + cardInfo.setRemainingShareFeeAmount(shareAmount); + if (payAccount.getRealRate() != null) { + int iRealChargeFee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRealRate(), true); + if (fee > iRealChargeFee) { + cardInfo.setRateAmount(fee - iRealChargeFee); + } + } + } + } + } else { + // 免费卡 + cardInfo.setShareFeeAmount(0); + cardInfo.setRemainingShareFeeAmount(0); + cardInfo.setRateAmount(0); + if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { + WxCouponPassword updateCPwd = new WxCouponPassword(); + updateCPwd.setId(couponPasswordId); + updateCPwd.setCardId(cardInfo.getId()); + updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPasswordMapper.updateById(updateCPwd); + } + } + + cardInfo.setServiceFeeAmount(fee); + cardInfo.setCreateDate(curr); + cardInfo.setUpdateDate(curr); + cardInfo.setSupportTransfer(coupon.getSupportTransfer()); + + //检查卡是否下架,如果是,不可转赠 + WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); + if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { + cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); + } + wxCardInfoMapper.insert(cardInfo); + } + return couponOrder; + } + + /** + * 创建 couponOrder + * + * @param user + * @param order + * @param coupon + */ + private WxCouponOrder createCouponOrderForOuter(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId) { + Date curr = new Date(); + Date valid_date = null; + int limit_days = Constant.WX_LIMIT_DAYS; + if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode())) { + if( coupon.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())){ + valid_date = coupon.getPickEndDate(); + }else{ + valid_date = coupon.getValidEndDate(); + } + } else { + limit_days = coupon.getValidDays(); + valid_date = DateUtils.getTimeAfterDays(limit_days, curr); + } + boolean isCard = false; + // 检查是否是储值卡 + if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { + isCard = true; + } + final IdWorker idWorker = IdWorker.get(); + + WxCouponOrder couponOrder = new WxCouponOrder(); + couponOrder.setId(idWorker.nextId()); + couponOrder.updateTenantInfo(order); + couponOrder.setCouponId(order.getProductId()); + couponOrder.setCouponType(coupon.getType()); + couponOrder.setCUserId(user.getId()); + couponOrder.setOwnerId(user.getId()); + couponOrder.setAutoRefund(coupon.getAutoRefund()); + couponOrder.setOrderId(order.getOrderNumber()); + couponOrder.setExpiredTime(valid_date); + if (!isCard) { + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); + } else { + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); + } + couponOrder.setCreateDate(curr); + couponOrder.setUpdateDate(curr); + couponOrder.setCouponPrice(order.getPayment()); + + wxCouponOrderMapper.insert(couponOrder); + + /// 储值卡信息添加 + if (isCard) { + WxPayOrder payOrder = null; + Integer fee = 0; + WxCardInfo cardInfo = new WxCardInfo(); + cardInfo.setId(couponOrder.getId()); + cardInfo.updateTenantInfo(order); + cardInfo.setCouponId(order.getProductId()); + cardInfo.setAmount(coupon.getPrice()); + cardInfo.setSaleAmount(coupon.getSalePrice()); + cardInfo.setRemainingAmount(coupon.getPrice()); + + // 不论有价免费卡, 钱是线下支付, 所以不设分账 + cardInfo.setShareFeeAmount(0); + cardInfo.setRemainingShareFeeAmount(0); + cardInfo.setRateAmount(0); + if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { + WxCouponPassword updateCPwd = new WxCouponPassword(); + updateCPwd.setId(couponPasswordId); + updateCPwd.setCardId(cardInfo.getId()); + updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPasswordMapper.updateById(updateCPwd); + } + + cardInfo.setServiceFeeAmount(fee); + cardInfo.setCreateDate(curr); + cardInfo.setUpdateDate(curr); + cardInfo.setSupportTransfer(coupon.getSupportTransfer()); + + //检查卡是否下架,如果是,不可转赠 + WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); + if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { + cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); + } + wxCardInfoMapper.insert(cardInfo); + } + return couponOrder; + } + + @Override + @Transactional(propagation = Propagation.NESTED, readOnly = false, rollbackFor = {Exception.class}) + public WxCouponOrder sendFreeCouponToUser(Long userId,TenantEntity tenantinfo, Long couponId, WxCouponSendVo wxCouponSendVo,EnumPayWay payWay) { + // check 用户状态 + WxCUserBasicInfo user = null; + try { + user = wxCUserBasicInfoMapper.selectById(userId,tenantinfo.getFinalTenantId()); + } catch (Exception e) { + logger.error("userId : " + userId + ", e: " + e.getMessage(),e); + } + if (user == null) { + logger.error("用户不存在, userId: " + userId); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + + // 检查券状态 + String couponIdStr = String.valueOf(couponId); + WxCoupon coupon = wxCouponMapper.selectById(couponId,tenantinfo.getTenantId()); + if (coupon == null) { + logger.error("券不存在, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { + logger.error("券已下架, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF.getCode(), coupon.getTitle() + ErrorCode.COUPON_IS_TAKE_OFF.getMessage()); + } + if (coupon.getSalePrice() != 0) { + logger.error("券不免费, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.COUPON_IS_NOT_FREE.getCode(), coupon.getTitle() + ErrorCode.COUPON_IS_NOT_FREE.getMessage()); + } + + if (Objects.nonNull(wxCouponSendVo) && Objects.equals(EnumCouponSendSendType.MERCHANT.getCode(), wxCouponSendVo.getSendType())) { + // 商户注券减库存操作 + try { + stockMerchantReduce(user, coupon, couponIdStr, wxCouponSendVo); + }catch(Exception e) { + throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage()); + } + } else { + // 减库存操作 + try { + stockReduce(user, coupon, couponIdStr); + }catch(Exception e) { + throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage()); + } + } + + int payment = coupon.getSalePrice(); + + Date curr = new Date(); + + final IdWorker idWorker = IdWorker.get(); + Long orderNumber = idWorker.nextId(); + + // body + // tenant_id + merchant_id + title + subtitle + String bodyStr = coupon.getTitle() + "/" + coupon.getSubTitle(); + + WxOrder record = new WxOrder(); + record.setId(orderNumber); + record.updateTenantInfo(coupon); + record.setOrderNumber(orderNumber); + record.setProductId(couponId); + record.setType(EnumOrderType.COUPON.getCode()); + record.setCUserId(user.getId()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(payment); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + record.setDetail(bodyStr); + record.setCreateDate(curr); + record.setUpdateDate(curr); + + // 保存订单 + try { + wxOrderMapper.insert(record); + } catch (Exception e) { + logger.error("保存订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(), coupon.getTitle() + ErrorCode.ORDER_SAVE_ERR.getMessage()); + } + + // 创建couponOrder + WxCouponOrder couponOrder = null; + try { + couponOrder = createCouponOrder(record, user, coupon, null,payWay); + } catch (Exception e) { + logger.error("保存订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR.getCode(), coupon.getTitle() + ErrorCode.COUPON_ORDER_SAVE_ERR.getMessage()); + } + + return couponOrder; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public int couponOrderSuccess(WxOrder updateOrder) { + Date currentDate = new Date(); + // 检查券相关 + WxCoupon coupon = wxCouponMapper.selectById(updateOrder.getProductId(),updateOrder.getTenantId()); + if (coupon == null) { + logger.error("券不存在, couponId: " + updateOrder.getProductId()); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } + // 检查用户 + WxCUserBasicInfo user = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); + if (user == null) { + logger.error("用户不存在, userId: " + updateOrder.getCUserId()); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + // 已支付,更新支付时间 + WxOrder updateT = new WxOrder(); + updateT.setId(updateOrder.getId()); + updateT.setPaymentTime(currentDate); + updateT.updateTenantInfo(updateOrder); + //拼团到此处为已完成状态 + if (updateOrder.getOrderGroupId().equals(0L)) { + updateT.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + } else { + // 拼团设为已完成状态 + updateT.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + } + updateT.setUpdateDate(currentDate); + int ret = 0; + try { + ret = wxOrderMapper.updateById(updateT); + } catch (Exception e) { + logger.error("订单更新失败:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); + } + + // 创建couponOrder + try { + createCouponOrder(updateOrder, user, coupon, null,null); + } catch (Exception e) { + logger.error("创建券包:" + e.getMessage()); + throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); + } + + + return ret; + } + + private void sendInsideOrderSuccessMsg(WxOrder updateOrder, WxCoupon coupon, WxCUserBasicInfo user) { + FmInsideOrderSuccessMsg orderSuccess = new FmInsideOrderSuccessMsg(); + orderSuccess.setMsgType(EnumMsgRecordType.INSIDE_ORDER_SUCCESS.getCode()); + orderSuccess.updateTenantInfo(updateOrder); + orderSuccess.setOrderId(updateOrder.getId()); + orderSuccess.setCUserId(user.getId()); + orderSuccess.setCouponId(coupon.getId()); + logger.info(">>>>>>>>>>>send sendInsideOrderSuccessMsg :"+orderSuccess); + mqBaseProducer.sendMessage(orderSuccess, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); + } + + @Override + public void sendOrderSuccessActionMsg(WxOrder updateOrder) { + // 检查券相关 + WxCoupon coupon = wxCouponMapper.selectById(updateOrder.getProductId(),updateOrder.getTenantId()); + if (coupon == null) { + logger.error("券不存在, couponId: " + updateOrder.getProductId()); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } +// if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { +// logger.error("券已下架, couponId: " + updateOrder.getProductId()); +// throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF); +// } + // 检查用户 + WxCUserBasicInfo basicUser = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); + if (basicUser == null) { + logger.error("会员不存在, userId: " + updateOrder.getCUserId()); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } +// WxCUser user = wxCUserMapper.selectById(updateOrder.getCUserId()); +// if (user == null) { +// logger.error("用户不存在, userId: " + updateOrder.getCUserId()); +// throw new MallinkException(ErrorCode.USER_IS_EMPTY); +// } + + // 记录活动 + JSONObject jo = null; + try { + jo = JSONObject.parseObject(coupon.getConditions()); + } catch (Exception e) { + logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage()); + e.printStackTrace(); + } + if (jo != null) { + if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()) { + wxCUserBasicInfoMapper.incActRecordById(basicUser.getId(),coupon.getFinalTenantId()); + } + } + + sendInsideOrderSuccessMsg(updateOrder, coupon, basicUser); + } + + /** + * 下订单后操作 + * + * @param updateOrder + * @param coupon + * @param user + */ + public void actionAfterCouponOrderSuccess(WxOrder updateOrder, WxCoupon coupon, WxCUserBasicInfo user) { + /// TODO 晚上会定时打一下tag + wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_BUY, user,updateOrder); + + // 交易发券 + try { + wxCouponSendService.sendCouponToUser(EnumCouponSendSendType.C_ORDER, updateOrder,EnumPayWay.PAY_WAY_NOT_UNPAY_TRADE); + } catch (Exception e) { + logger.error("订单发券:" + e.getMessage()); + } + + } + + @Override + public Map summary(WxOrderQueryVo wxOrderQueryVo) { + List listOrder = wxOrderMapper.findListOrder(wxOrderQueryVo); + Long payment = listOrder.stream().collect(Collectors.summingLong(WxOrder::getPayment)); + Long pay = listOrder.stream().collect(Collectors.summingLong(WxOrder::getPay)); + Map data = new HashMap<>(); + data.put("payment", payment); + data.put("pay", pay); + return data; + } + + @Override + public void exportData(WxOrderQueryVo wxOrderQueryVo, HttpServletRequest request, HttpServletResponse response) { + List list = wxOrderMapper.findListOrder(wxOrderQueryVo); + Map summary = summary(wxOrderQueryVo); + Long payment = summary.get("payment"); + Long pay = summary.get("pay"); + String paymentStr = new BigDecimal(payment).divide(new BigDecimal(100)).toPlainString(); + String payStr = new BigDecimal(pay).divide(new BigDecimal(100)).toPlainString(); + WxOrder order = new WxOrder(); + order.setPayStr("支付总金额(元): " + payStr); + order.setPaymentStr("订单总金额(元): " + paymentStr); + order.setOrderStatus(-1); + order.setAttribute(-1); + list.add(order); + excelService.exportExcel(list, null, "线上交易", WxOrder.class, "线上交易.xlsx", response, false); + } + + /** + * 积分设置来源商户 + */ + private void setMerchantId(WxCoupon coupon, WxCreditHistory creditHistory) { + WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); + wxCouponMerchant.setProductId(coupon.getId()); + wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); + List list = wxCouponMerchantMapper.findList(wxCouponMerchant); + if (list != null && list.size() > 0) { + if (list.size() == 1) { + creditHistory.setMerchantId(list.get(0).getMerchantId()); + } + if (list.size() > 1) { + creditHistory.setMerchantId(Long.valueOf(EnumMerchantType.MERCHANT_MORE.getCode())); + } + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public int microPayOrderSuccess(WxOrder updateOrder) { + Date currentDate = new Date(); + // C端用户 + WxCUserBasicInfo user = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); + if (user == null) { + logger.error("用户不存在, userId: " + updateOrder.getCUserId()); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + // B端用户 + WxMerchantBUser bUser = wxMerchantBUserMapper.selectById(updateOrder.getProductId()); + if (bUser == null) { + logger.error("B端用户不存在, bUserId: " + updateOrder.getProductId()); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + // 基于B端User查找merchant + WxMerchant wxMerchant = wxMerchantMapper.selectById(bUser.getMerchantId()); + if (wxMerchant == null) { + logger.error("商户不存在, merchantId: " + bUser.getMerchantId()); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + // 已支付,更新支付时间 + updateOrder.setPaymentTime(currentDate); + updateOrder.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + updateOrder.setUpdateDate(currentDate); + int ret = 0; + try { + ret = wxOrderMapper.updateById(updateOrder); + } catch (Exception e) { + logger.error("订单更新失败:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); + } + + // 成长值 计算 + try { + wxScoreRulesService.addScore2(bUser,EnumScoreType.CONSUMPTION, updateOrder, wxMerchant.getBusinessId()); + } catch (Exception e) { + logger.error("成长值:" + e.getMessage()); + } + // 积分 计算 + try { + //扣减积分操作记录 + WxCreditHistory creditHistory = new WxCreditHistory(); + creditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode()); + creditHistory.setOperatorId(user.getId()); + creditHistory.setCUserId(user.getId()); + creditHistory.setCreateDate(new Date()); +// creditHistory.updateTenantInfo(wxMerchant); + creditHistory.setTenantId(wxMerchant.getFinalTenantId()); + creditHistory.setFinalTenantId(wxMerchant.getFinalTenantId()); + creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode()); + creditHistory.setBusinessId(wxMerchant.getBusinessId()); + creditHistory.setSpend(updateOrder.getPayment()); + creditHistory.setMerchantId(wxMerchant.getId()); + if (updateOrder.getCouponChannelId() != null) { + WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(updateOrder.getCouponChannelId(),updateOrder.getTenantId()); + creditHistory.setCouponId(wxCouponChannel.getCouponId()); + + } + + creditHistory.setChangePurpose("付款码消费:消费商户["+wxMerchant.getName()+"] 金额["+creditHistory.getSpendStr()+"元]"); + + + wxCreditHistoryService.saveOrUpdate(creditHistory,wxMerchant.getTenantId()); + } catch (Exception e) { + logger.error("积分值:" + e.getMessage()); + } + + return ret; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public int updateOrderStatus(WxOrder updateOrder, EnumOrderStatus enumOrderStatus) { + Date currentDate = new Date(); + WxOrder oldOrder = wxOrderMapper.selectById(updateOrder.getId(),updateOrder.getTenantId()); + if (!oldOrder.getOrderStatus().equals(enumOrderStatus.getCode())) { + // 状态已更新,库存不退回, 保证不会多退 + switch (enumOrderStatus) { + case ORDER_STATUS_OVERTIME_CANCEL: // 支付取消,库存退回 + case ORDER_STATUS_REFUND_SUCCESS: // 退款成功,库存退回 + case ORDER_STATUS_COOPERATING_OVERTIME: // 拼团超时,退库存 + case ORDER_STATUS_COOPERATING_CANCEL: // 拼团取消,退库存 + case ORDER_STATUS_COOPERATING_COMPLETE: // 拼团完成,退库存 + { + try { + stockBack(updateOrder); + } catch (Exception e) { + logger.error("库存+1失败, e:" + e.getMessage(),e); + throw new MallinkException(ErrorCode.REMAIN_BACK_FAIL); + } + break; + } + } + } + WxOrder refOrder = new WxOrder(); + refOrder.setId(updateOrder.getId()); + refOrder.setOrderStatus(enumOrderStatus.getCode()); + refOrder.setUpdateDate(currentDate); + refOrder.updateTenantInfo(updateOrder); + int ret = 0; + try { + ret = wxOrderMapper.updateById(refOrder); + } catch (Exception e) { + logger.error("订单状态更新失败, e:" + e.getMessage(),e); + throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); + } + return ret; + } + + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public void updateOrderStatus(WxOrder updateOrder) { + if (updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()) || + updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_CANCEL.getCode()) || + updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()) || + updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()) || + updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_BREAK.getCode())) { + try { + stockBack(updateOrder); + } catch (Exception e) { + logger.error("拼团库存+1失败, e:" + e.getMessage()); + throw new MallinkException(ErrorCode.REMAIN_BACK_FAIL); + } + } + } + + @Override + public void updateOrderGroupStatusByCouponId(Long couponId, TenantEntity tenantEntity, Integer orderStatus) { + WxOrder updateOrder = new WxOrder(); + updateOrder.updateTenantInfo(tenantEntity); + updateOrder.setOrderStatus(orderStatus); + updateOrder.setProductId(couponId); + updateOrder.setUpdateDate(new Date()); + wxOrderMapper.updateOrderGroupStatusByCouponId(updateOrder); + } + + @Override + public void updateOrderGroupStatusByCouponChannelId(Long couponChannelId, TenantEntity tenantEntity, Integer orderStatus) { + WxOrder updateOrder = new WxOrder(); + updateOrder.updateTenantInfo(tenantEntity); + updateOrder.setOrderStatus(orderStatus); + updateOrder.setCouponChannelId(couponChannelId); + updateOrder.setUpdateDate(new Date()); + wxOrderMapper.updateOrderGroupStatusByCouponChannelId(updateOrder); + } + + /** + * 微信关闭订单 + */ + @Override + public ResultData orderClose(WxOrder order,EnumPayWay payWay) { + // 1. get c appid + WxAppinfo appInfo = wxAppinfoService.getCAppInfo(order,payWay); + // 2. get pay order + WxPayOrder payOrderQ = new WxPayOrder(); + payOrderQ.updateTenantInfo(order); + payOrderQ.setOrderId(order.getId()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + List payOrders = wxPayOrderMapper.selectList(new QueryWrapper(payOrderQ)); + + // 3. wx pay order close + for (WxPayOrder payOrder : payOrders) { + try { + wxPayOrderService.payOrderClose(appInfo, payOrder); + } catch (Exception e) { + logger.error("微信关单失败:" + e.getMessage()); + throw new MallinkException(ErrorCode.PAY_ORDER_ERROR); + } + } + + return new ResultData(); + } + + @Override + public WxOrder getById(Long id,String tenantId) { + return wxOrderMapper.selectById(id,tenantId); + } + + @Override + public WxOrder getPressOrderById(Long id,String tenantId) { + return wxOrderMapper.selectById(id,tenantId); + } + + @Override + public void saveOrUpdate(WxOrder record) { + if (record.getId() == null) { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + wxOrderMapper.insert(record); + } else { + wxOrderMapper.updateById(record); + } + } + +// @Override +// public void deleteById(Long id) { +// wxOrderMapper.deleteById(id); +// } + + @Override + public List findList(WxOrder record) { + return wxOrderMapper.findList(record); + } + + @Override + public PageInfo listCUserVoAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfCUser(record)); + } + + @Override + public WxOrderCouponVo detailCUserVo(WxOrder record) { + List list = wxOrderMapper.selectDetailOfCUser(record); + if (list.size() > 0) { + return list.get(0); + } + return null; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public void shareForMicroPay(TenantEntity tenantEntity, Long orderId, Long payOrderId,EnumPayWay payWay) { + // 微信分账 + try { + WxPayOrder wxPayOrder = new WxPayOrder(); + wxPayOrder.updateTenantInfo(tenantEntity); + wxPayOrder.setId(payOrderId); + wxPayOrder.setOrderId(orderId); + wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); + wxPayOrder = wxPayOrderMapper.selectOne(new QueryWrapper(wxPayOrder)); + WxOrder wxOrder = wxOrderMapper.selectById(orderId,tenantEntity.getTenantId()); + WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(wxOrder.getProductId()); + + if (wxPayOrder != null && wxMerchantBUser != null && + wxPayOrder.getShare().equals(EnumPayShare.YES.getCode())) { + WxSharingOrderDto sharingOrder = new WxSharingOrderDto(); + sharingOrder.setCUserId(wxPayOrder.getCUserId()); + sharingOrder.setMerchantId(wxMerchantBUser.getMerchantId()); + sharingOrder.setType(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getCode()); + sharingOrder.setPayAmount(wxPayOrder.getPayAmount()); + sharingOrder.setRateAmount(wxPayOrder.getRateAmount()); + sharingOrder.setOrderId(wxPayOrder.getId()); + sharingOrder.setPayTimeStart(wxPayOrder.getPayTimeStart()); + sharingOrder.setPayTimeEnd(wxPayOrder.getPayTimeEnd()); + sharingOrder.updateTenantInfo(wxPayOrder); + sharingOrder.setTransactionId(wxPayOrder.getTransactionId()); + sharingOrder.setShareAmount(wxPayOrder.getShareAmount()); + ResultData resultData = wxProfitSharingOrderService.createSharingOrder(sharingOrder,payWay.getCode()); + } else { + logger.error("微信分账: 未找到payorder or merchant at orderid-" + orderId); + } + } catch (MallinkException e) { + logger.error("微信分账: " + e.getMessage()); + } + } + + @Override + public PageInfo listOrderAsPage(WxOrderQueryVo record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOrder(record)); + } + + @Override + public Map queryOrderSummary(TenantEntity tenantEntity) { + Map result = new HashMap<>(); + queryOrderCount(tenantEntity, result); + queryOrderSummary(tenantEntity, result); + return result; + } + + @Deprecated + public void queryMerchantCount(TenantEntity tenantEntity, Map result) { + String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); + //全部商户个数 + Map params = new HashMap<>(); + params.put("tenantId", tenantEntity.getTenantId()); + if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { + params.put("parentTenantId", tenantEntity.getParentTenantId()); + } + String thirtyTime = DateUtils.getTimeBefore(29, new Date()); + params.put("startdate", thirtyTime + " 00:00:00"); + params.put("enddate", systemTime + " 23:59:59"); + Long allMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); + result.put("allMerchantCount", allMerchantCount); + //今日 + params.put("startdate", systemTime + " 00:00:00"); + params.put("enddate", systemTime + " 23:59:59"); + Long todayMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); + result.put("todayMerchantCount", todayMerchantCount); + //昨日 + String yesterday = DateUtils.getTimeBefore(1, new Date()); + params.put("startdate", yesterday + " 00:00:00"); + params.put("enddate", yesterday + " 23:59:59"); + Long yesterdayMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); + result.put("yesterdayMerchantCount", yesterdayMerchantCount); + //上周 + String lastweek = DateUtils.getTimeBefore(7, new Date()); + params.put("startdate", lastweek + " 00:00:00"); + params.put("enddate", lastweek + " 23:59:59"); + Long lastweekMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); + result.put("lastweekMerchantCount", lastweekMerchantCount); + //商户数日环比 + if (yesterdayMerchantCount > 0) { + double hbd = (double) (todayMerchantCount - yesterdayMerchantCount) / yesterdayMerchantCount * 100; + double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + result.put("increasedPercentMerchant", hb + "%"); + } else { + result.put("increasedPercentMerchant", "--"); + } + //商户数周同比 + if (lastweekMerchantCount > 0) { + double hbd = (double) (todayMerchantCount - lastweekMerchantCount) / lastweekMerchantCount * 100; + double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + result.put("increasedPercentWeekMerchant", hb + "%"); + } else { + result.put("increasedPercentWeekMerchant", "--"); + } + } + + public void queryOrderSummary(TenantEntity tenantEntity, Map result) { + String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); + //总数 + Map params = new HashMap<>(); + params.put("tenantId", tenantEntity.getTenantId()); + if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { + params.put("parentTenantId", tenantEntity.getParentTenantId()); + } + String thirtyTime = DateUtils.getTimeBefore(29, new Date()); + params.put("startdate", thirtyTime + " 00:00:00"); + params.put("enddate", systemTime + " 23:59:59"); + params.put("order_status", "1"); + Long allPayOrderSummary = wxOrderMapper.queryOrderForSum(params); + params.put("order_status", "4"); + Long allRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); + result.put("allRefundOrderSummary", allRefundOrderSummary); + Long allOrderSummary = allPayOrderSummary - allRefundOrderSummary; + result.put("allOrderSummary", allPayOrderSummary); + //今日 + params.put("startdate", systemTime + " 00:00:00"); + params.put("enddate", systemTime + " 23:59:59"); + params.put("order_status", "1"); + Long todayPayOrderSummary = wxOrderMapper.queryOrderForSum(params); + params.put("order_status", "4"); + Long todayRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); + result.put("todayRefundOrderSummary", todayRefundOrderSummary); + result.put("todayOrderSummary", todayPayOrderSummary); + //昨日 + String yesterday = DateUtils.getTimeBefore(1, new Date()); + params.put("startdate", yesterday + " 00:00:00"); + params.put("enddate", yesterday + " 23:59:59"); + params.put("order_status", "1"); + Long yesterdayPayOrderSummary = wxOrderMapper.queryOrderForSum(params); + params.put("order_status", "4"); + Long yesterdayRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); + result.put("yesterdayRefundOrderSummary", yesterdayRefundOrderSummary); + result.put("yesterdayOrderSummary", yesterdayPayOrderSummary); + //上周 + String lastweek = DateUtils.getTimeBefore(7, new Date()); + params.put("startdate", lastweek + " 00:00:00"); + params.put("enddate", lastweek + " 23:59:59"); + params.put("order_status", "1"); + Long lastweekPayOrderSummary = wxOrderMapper.queryOrderForSum(params); + params.put("order_status", "4"); + Long lastweekRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); + result.put("lastweekRefundOrderSummary", lastweekRefundOrderSummary); + result.put("lastweekOrderSummary", lastweekPayOrderSummary); + //商户数日环比 + if (yesterdayPayOrderSummary > 0) { + double hbd = (double) (todayPayOrderSummary - yesterdayPayOrderSummary) / yesterdayPayOrderSummary * 100; + double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + result.put("increasedPercentSummary", hb + "%"); + } else { + result.put("increasedPercentSummary", "--"); + } + //商户数周同比 + if (lastweekPayOrderSummary > 0) { + double hbd = (double) (todayPayOrderSummary - lastweekPayOrderSummary) / lastweekPayOrderSummary * 100; + double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + result.put("increasedPercentWeekSummary", hb + "%"); + } else { + result.put("increasedPercentWeekSummary", "--"); + } + } + + public void queryOrderCount(TenantEntity tenantEntity, Map result) { + String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); + //总数 + Map params = new HashMap<>(); + params.put("tenantId", tenantEntity.getTenantId()); + if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { + params.put("parentTenantId", tenantEntity.getParentTenantId()); + } + String thirtyTime = DateUtils.getTimeBefore(29, new Date()); + params.put("startdate", thirtyTime + " 00:00:00"); + params.put("enddate", systemTime + " 23:59:59"); + Long allOrderCount = wxOrderMapper.queryOrderForCount(params); + result.put("allOrderCount", allOrderCount); + //今日 + params.put("startdate", systemTime + " 00:00:00"); + params.put("enddate", systemTime + " 23:59:59"); + Long todayOrderCount = wxOrderMapper.queryOrderForCount(params); + result.put("todayOrderCount", todayOrderCount); + //昨日 + String yesterday = DateUtils.getTimeBefore(1, new Date()); + params.put("startdate", yesterday + " 00:00:00"); + params.put("enddate", yesterday + " 23:59:59"); + Long yesterdayOrderCount = wxOrderMapper.queryOrderForCount(params); + result.put("yesterdayOrderCount", yesterdayOrderCount); + //上周 + String lastweek = DateUtils.getTimeBefore(7, new Date()); + params.put("startdate", lastweek + " 00:00:00"); + params.put("enddate", lastweek + " 23:59:59"); + Long lastweekOrderCount = wxOrderMapper.queryOrderForCount(params); + result.put("lastweekOrderCount", lastweekOrderCount); + //订单数日环比 + if (yesterdayOrderCount > 0) { + double hbd = (double) (yesterdayOrderCount - yesterdayOrderCount) / yesterdayOrderCount * 100; + double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + result.put("increasedPercentCount", hb + "%"); + } else { + result.put("increasedPercentCount", "--"); + } + //订单数周同比 + if (lastweekOrderCount > 0) { + double hbd = (double) (yesterdayOrderCount - lastweekOrderCount) / lastweekOrderCount * 100; + double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); + result.put("increasedPercentWeekCount", hb + "%"); + } else { + result.put("increasedPercentWeekCount", "--"); + } + } + + /** + * 砍价 + */ + @Override + public PageInfo listPressVoAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfPress(record)); + } + + @Override + public WxOrderCouponPressVo detailPressVo(WxOrder record) { + WxOrderCouponPressVo pressVo = wxOrderMapper.selectDetailOfPress(record); + if (null != pressVo) { + Map paramMap = new HashMap(); + paramMap.put("orderId", record.getId()); + paramMap.put("tenantId", record.getTenantId()); + paramMap.put("finalTenantId", record.getFinalTenantId()); + pressVo.setOrderPressList(wxOrderPressMapper.findPressList(paramMap)); + } + return pressVo; + } + + @Override + public void updateStatusByPressCouponId(Long couponId, TenantEntity tenantEntity, int orderStatus) { + WxOrder updateOrder = new WxOrder(); + updateOrder.updateTenantInfo(tenantEntity); + updateOrder.setOrderStatus(orderStatus); + updateOrder.setProductId(couponId); + updateOrder.setUpdateDate(new Date()); + wxOrderMapper.updateStatusByPressCouponId(updateOrder); + } + + @Autowired + @Qualifier("cUserBasicInfoRedisTemplate") + RedisTemplate cUserBasicInfoRedisTemplate; + + @Override + public WxOrder saveOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, OrderSaveDto orderSaveDto, boolean isPress,EnumPayWay payWay) { + WxOrder order = null; + // 防止同一用户重复抽奖(一分钟内) + // 1. 订单保存时 加入redis缓存,key --> action:userId:couponId , 时间1000ms + // 2. 如果存在,说明该用户正在下单,返回异常提示 + // 3. 方法结束时清除 key + if (checkCouponIsFree(coupon)) { + // 免费券 + String key = StringUtils.join("action", ":", user.getId(), coupon.getId()); + boolean hasKey = cUserBasicInfoRedisTemplate.hasKey(key); + if (hasKey) { + logger.error("用户正在下单,请求异常返回,user: {} " + JSON.toJSONString(user)); + throw new MallinkException(ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION); + } + cUserBasicInfoRedisTemplate.opsForValue().set(key, user, 1000, TimeUnit.MILLISECONDS); + + order = saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null,payWay); + if (order != null) { + // 6. 下订单完成,发送内部消息 + // 下订单完成,发送内部消息 + try { + sendOrderSuccessActionMsg(order); + } catch (Exception e) { + logger.error("内部消息发送失败: " + e.getMessage()); + throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR); + } + } + } else { + // 有价券 + order = saveNoFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), isPress, orderSaveDto.getOrderGroupId(), orderSaveDto.getFormId()); + } + // couponActionLog + try { + wxCouponActionLogService.addOne(order, order.getProductId(), order.getOrderNumber(), EnumCouponSendSendType.ACTIVE.getCode(), orderSaveDto.getCouponChannelId(),0L); + } catch (Exception e) { + // 库存恢复 + stockBack(order); + logger.error("保存订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + return order; + } + + @Override + public boolean checkCouponIsFree(WxCoupon coupon) { + return coupon.getSalePrice() == 0; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public WxOrder saveFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId,EnumPayWay payWay) { + // 1. check user info and coupon info + userCouponMerchantCheck(user, coupon); + if (coupon.checkIsCreditCoupon()) { + //若用户剩余积分比积分售价低则不能支付 + if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { + throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); + } + } + // 2. 减库存操作 + String couponIdStr = String.valueOf(coupon.getId()); + stockReduce(user, coupon, couponIdStr); + + // 3. 当积分券或者积分停车券时 则进行积分支付 + Integer orderType; + if (coupon.checkIsCreditCoupon()) { + creditPay(user, coupon); + orderType = EnumOrderType.CREDIT.getCode(); + } else { + orderType = EnumOrderType.COUPON.getCode(); + } + + // 4. 保存Order + WxOrder record = new WxOrder(); + record.setCouponChannelId(couponChannelId); + record.setType(orderType); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(0); + record.setFormId(formId); + record.setOrderGroupId(0L); + try { + saveFreeOrder(record, user, coupon); + } catch (Exception e) { + logger.error("下订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + + // 5. 创建couponOrder + try { + createCouponOrder(record, user, coupon, couponPasswordId,payWay); + } catch (Exception e) { + logger.error("couponOrder失败:" + e.getMessage(),e); + throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); + } + return record; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public Long saveOuterOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) { + // 1. check user info and coupon info + userCouponMerchantCheck(user, coupon); + if (coupon.checkIsCreditCoupon()) { + //若用户剩余积分比积分售价低则不能支付 + if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { + throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); + } + } + // 2. 减库存操作 + String couponIdStr = String.valueOf(coupon.getId()); + stockReduce(user, coupon, couponIdStr); + + // 3. 当积分券或者积分停车券时 则进行积分支付 + Integer orderType; + if (coupon.checkIsCreditCoupon()) { + creditPay(user, coupon); + orderType = EnumOrderType.CREDIT.getCode(); + } else { + orderType = EnumOrderType.COUPON.getCode(); + } + + // 4. 保存Order + WxOrder record = new WxOrder(); + record.setCouponChannelId(couponChannelId); + record.setType(orderType); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setPayment(0); + record.setFormId(formId); + record.setOrderGroupId(0L); + try { + saveFreeOrder(record, user, coupon); + } catch (Exception e) { + logger.error("下订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + + // 5. 创建couponOrder + try { + WxCouponOrder couponOrder = createCouponOrderForOuter(record, user, coupon, couponPasswordId); + return couponOrder.getId(); + } catch (Exception e) { + logger.error("couponOrder失败:" + e.getMessage()); + throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); + } + } + + /** + * 保存订单-免费 + * + * @param record + * @param user + * @param coupon + */ + private void saveFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon) { + Date curr = new Date(); + // body + String bodyStr = ""; + try { + bodyStr = Utility.substring(coupon.getTitle(), Math.min(62, coupon.getTitle().getBytes().length), "utf-8"); + } catch (Exception e) { + logger.error("body:" + e.getMessage()); + bodyStr = "券" + '-' + EnumCouponType.getEnum(coupon.getType()); + } + + final IdWorker idWorker = IdWorker.get(); + Long orderNumber = idWorker.nextId(); + record.setId(orderNumber); + record.updateTenantInfo(coupon); + record.setOrderNumber(orderNumber); + record.setProductId(coupon.getId()); + record.setCUserId(user.getId()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setDetail(bodyStr); + record.setCreateDate(curr); + record.setUpdateDate(curr); + // 保存订单 + wxOrderMapper.insert(record); + } + + private void userCouponMerchantCheck(WxCUserBasicInfo user, WxCoupon coupon) throws MallinkException { + // 检查用户 + if (user == null) { + logger.error("用户不存在"); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + // 检查券 + if (coupon == null) { + logger.error("券不存在"); + throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); + } + // 检查券状态 + if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { + logger.error("券已下架, couponId: " + coupon.getId()); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID); + } + // 检查券商户信息 + if (!isCouponMerchantValid(coupon.getId(),coupon.getTenantId())) { + logger.error("商户不存在, couponId: " + coupon.getId()); + throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); + } + // 检查 优惠券 库存 + if (coupon.getRemainInventory() <= 0) { + logger.error("此券库存为0, couponId: " + coupon.getId()); + throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); + } + } + + private void creditPay(WxCUserBasicInfo user, WxCoupon coupon) { + //-------此处为【积分支付】记录增加积分操作------- + WxCreditHistory creditHistory = new WxCreditHistory(); + creditHistory.setCreditNum(coupon.getCreditPrice()); + creditHistory.setCUserId(user.getId()); +// creditHistory.updateTenantInfo(coupon); + creditHistory.setTenantId(coupon.getFinalTenantId()); + creditHistory.setFinalTenantId(coupon.getFinalTenantId()); + creditHistory.setCreditType(EnumScoreType.CHANGE_CREDIT.getCode()); + + creditHistory.setCouponId(coupon.getId()); + //如果券与商户一对一 则直接将消费商户更新为此商户 若一对多 则消费商户显示多商户 + setMerchantId(coupon, creditHistory); + //记录操作人类型 操作人id + if (user.getOperatorType() == EnumUserType.MALLUSER.getCode()) { + creditHistory.setOperatorType(EnumUserType.MALLUSER.getCode()); + creditHistory.setOperatorId(user.getOperatorId()); + creditHistory.setChangePurpose("管理端积分兑换"+"["+coupon.getTitle()+"]"); + } else { + creditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode()); + creditHistory.setOperatorId(user.getId()); + creditHistory.setChangePurpose("积分兑换"+"["+coupon.getTitle()+"]"); + } + + wxCreditHistoryService.saveOrUpdate(creditHistory,coupon.getTenantId()); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public WxOrder saveNoFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, boolean isPress, Long orderGroupId, String formId) { + // 1. check user info and coupon info + userCouponMerchantCheck(user, coupon); + if (coupon.checkIsCreditCoupon()) { + //若用户剩余积分比积分售价低则不能支付 + if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { + throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); + } + } + + // 2. 拼团检查 + if (isOrderGroup(orderGroupId)) { + checkOrderGroup(user, orderGroupId,coupon); + } + String couponIdStr = String.valueOf(coupon.getId()); + // 3. 减库存操作 + stockReduce(user, coupon, couponIdStr); + + // 3. 当积分券或者积分停车券时 则进行积分支付 + Integer orderType; + if (coupon.checkIsCreditCoupon()) { + creditPay(user, coupon); + orderType = EnumOrderType.CREDIT.getCode(); + } else { + orderType = EnumOrderType.COUPON.getCode(); + } + + // 4. 保存订单 + Long orderNumber; + // 4.1 券价格 + int payment = coupon.getSalePrice(); + Integer orderStatus = EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode(); + if (isPress || coupon.getType().equals(EnumCouponType.COUPON_PRESS.getCode())) { + // 砍价券 初始是全价即面额 + payment = coupon.getPrice(); + } + if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) { + if (orderGroupId == null) { + // 拼团券 初始是全价即面额 + payment = coupon.getPrice(); + } else { + orderStatus = EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode(); + } + } + + // 4.2 保存订单 + WxOrder record = new WxOrder(); + record.setType(orderType); + record.setCouponChannelId(couponChannelId); + record.setOrderGroupId(orderGroupId); + record.setFormId(formId); + record.setPayment(payment); + record.setOrderStatus(orderStatus); + try { + orderNumber = saveNoFreeOrder(record, user, coupon, isPress); + } catch (Exception e) { + logger.error("保存订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + + if (isPress) { + // 5. 第一次砍价 + try { + firstPress(record, user, coupon, orderNumber); + } catch (Exception e) { + logger.error("第一次砍价失败:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + } + return record; + } + + /** + * 初始砍价 + * + * @param record + * @param user + * @param coupon + * @param orderNumber + */ + private void firstPress(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, Long orderNumber) { + // 保存砍价信息 + int total = coupon.getPrice() - coupon.getSalePrice(); + int left_total = total; + WxOrderPress orderPress = new WxOrderPress(); + orderPress.setId(IdWorker.get().nextId()); + orderPress.updateTenantInfo(coupon); + orderPress.setCouponId(record.getProductId()); + orderPress.setOrderId(orderNumber); + orderPress.setUserId(user.getId()); + orderPress.setCreateDate(new Date()); + orderPress.setFirst(EnumOrderPressType.FIRST.getCode()); + int lPressValue = PressUtils.stateLessPressValue(total, left_total, coupon.getPressLimitNum(), 0); + orderPress.setPressValue(lPressValue); + wxOrderPressMapper.insert(orderPress); + // 更新订单砍价信息 + WxOrder orderUpdatePress = new WxOrder(); + orderUpdatePress.setId(record.getId()); + orderUpdatePress.setPressCurrentNum(1); + orderUpdatePress.setPressCurrentValue(left_total - orderPress.getPressValue()); + orderUpdatePress.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); + orderUpdatePress.setUpdateDate(new Date()); + wxOrderMapper.updateById(orderUpdatePress); + } + + private Long saveNoFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, boolean isPress) { + Long orderNumber; + Date curr = new Date(); + + // body + // tenant_id + merchant_id + title + subtitle + String bodyStr = ""; + try { + bodyStr = Utility.substring(coupon.getTitle(), Math.min(62, coupon.getTitle().getBytes().length), "utf-8"); + } catch (Exception e) { + logger.error("body:" + e.getMessage()); + bodyStr = "券-" + EnumCouponType.getEnum(coupon.getType()).getMessage(); + } + final IdWorker idWorker = IdWorker.get(); + orderNumber = idWorker.nextId(); + record.setId(orderNumber); + record.updateTenantInfo(coupon); + record.setOrderNumber(orderNumber); + record.setProductId(coupon.getId()); + //record.setType(EnumOrderType.COUPON.getCode()); + record.setCUserId(user.getId()); + record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + record.setDetail(bodyStr); + record.setUpdateDate(curr); + record.setCreateDate(curr); + if (isPress) { + // 初始砍价信息 + record.setPressCurrentNum(0); + // 砍价券过期时间取券的过期时间和砍价限制时间中时间小的那个 + Date pressEndDate = DateUtils.getHourTimeAfter(coupon.getPressLimitHours(), new Date()); + if (pressEndDate.after(coupon.getValidEndDate())) + pressEndDate = coupon.getValidEndDate(); + record.setPressEndDate(pressEndDate); + record.setPressCurrentValue(coupon.getPrice() - coupon.getSalePrice()); + } + wxOrderMapper.insert(record); + return orderNumber; + } + + private void checkOrderGroup(WxCUserBasicInfo user, Long orderGroupId,WxCoupon coupon) { + WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId,coupon.getTenantId()); + if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) { + logger.error("下订单拼团人数已满>>>" + orderGroupId); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED); + } + + if (group.getRemainPeople()<=0) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数已满"); + } + + //判断拼团人数是否已经超出限制 + int groupCount = countGroupOrder(orderGroupId,true,group.getTenantId()); + if (groupCount>=coupon.getPressLimitNum()) { + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数超出优惠券人数限制!"); + } + + WxOrder order = new WxOrder(); + order.setOrderGroupId(group.getId()); + order.setCUserId(user.getId()); + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + long count = wxOrderMapper.selectCount(new QueryWrapper(order)); + if (count > 0) { + logger.error("重复的拼团>>>" + orderGroupId); + throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_UNPAID); + } + } + + private boolean isOrderGroup(Long orderGroupId) { + return orderGroupId != null && !orderGroupId.equals(0L); + } + + @Override + public int countGroupOrder(Long groupId,boolean ignoreUnPay,String tenantId) { + WxOrder query = new WxOrder(); + query.setOrderGroupId(groupId); + List statusS = new ArrayList(); + statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + if (!ignoreUnPay) { + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); + } + query.setStatusS(statusS); + query.setTenantId(tenantId); + return wxOrderMapper.countList(query); + } + + @Override + public int countUserCouponGroupOrder(Long cuserId, Long couponId,String tenantId) { + WxOrder query = new WxOrder(); + query.setCUserId(cuserId); + query.setProductId(couponId); + List statusS = new ArrayList(); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); + statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); + query.setStatusS(statusS); + query.setTenantId(tenantId); + return wxOrderMapper.countList(query); + } + + + @Override + public ResultData saveOrder(OrderSaveDto orderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity) { + logger.info("OrderSave: " + orderSaveDto); + if (orderSaveDto.getCouponChannelId() == null) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId不能为空"); + } + WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(orderSaveDto.getCouponChannelId(),tenantEntity.getTenantId()); + if (wxCouponChannel == null) { + logger.error("couponChannelId find error, " + orderSaveDto.getCouponChannelId()); + return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF); + } + ResultData resultData = couponChannelCheck(orderSaveDto, wxCouponChannel); + if (resultData != null) return resultData; + + WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(cUserId,tenantEntity.getFinalTenantId()); + if (wxCUserBasicInfo != null && wxCUserBasicInfo.getStatus().equals(EnumCUserBasicInfoStatus.LOCKED.getCode())) { + logger.info("会员权益被锁定:cUserId:" + cUserId); + return new ResultData(ErrorCode.MEMBER_IS_LOCKED); + } + + WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId(),wxCouponChannel.getTenantId()); + if (null == coupon) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + } + //判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制 + if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) { + int ordercount = this.countUserCouponGroupOrder(cUserId,coupon.getId(),coupon.getTenantId()); + if (ordercount>=coupon.getUseLimitQuantity()) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"您当前此券的有效拼团数量达到券的限购次数。"); + } + } + + WxCouponCVo wxCouponCVo = null; + + String key = "cc:" + orderSaveDto.getCouponChannelId(); + ValueOperations operations = cdRedisTemplate.opsForValue(); + // 缓存 + boolean hasKey = cdRedisTemplate.hasKey(key); + if (hasKey) { + // 从缓存获取用户信息 + wxCouponCVo = operations.get(key); + } else { + // 游戏没有入缓存,需要从数据库中读取 + wxCouponCVo = wxCouponChannelService.findDetailVo(orderSaveDto.getCouponChannelId(),wxCouponChannel.getTenantId()); + if (wxCouponCVo != null) { + // 游戏优化,进缓存 + cdRedisTemplate.opsForValue().set(key, wxCouponCVo, 3600, TimeUnit.SECONDS); + } + } + if (wxCouponCVo == null) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + + //此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。 + boolean hascache = redisLock.hasCouponStockCache(wxCouponCVo.getCouponId()); + if (!hascache) { + long time = System.currentTimeMillis() + RedisLock.TIMEOUT; + String timeStr = String.valueOf(time); + boolean stocksetlock = redisLock.lock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); + if (stocksetlock) { + try { + if (!redisLock.hasCouponStockCache(wxCouponCVo.getCouponId())) { + redisLock.setCouponStock(wxCouponCVo.getCouponId(), coupon.getRemainInventory()); + } + }catch(Exception e) { + logger.error("save order stock cache error.",e); + }finally { + redisLock.unlock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); + } + }else { + redisLock.unlock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); + } + } + + resultData = couponUserCheck(wxCUserBasicInfo, wxCouponCVo); + if (resultData != null) return resultData; + + Long couponId = orderSaveDto.getCouponId() == null ? wxCouponChannel.getCouponId() : orderSaveDto.getCouponId(); + if (couponId == null) { + logger.error("couponChannelId或者couponId不能为空"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId或者couponId不能为空"); + } + // 是否砍价 + boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false; + + try { + WxOrder order = this.saveOrderForCoupon(wxCUserBasicInfo, coupon, orderSaveDto, isPress,payWay); + return new ResultData(order); + } catch (MallinkException e) { + logger.error(e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.ORDER_IS_FAIL, e.getMessage()); + } + } + + private ResultData couponChannelCheck(OrderSaveDto orderSaveDto, WxCouponChannel wxCouponChannel) { + if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) { + Date now = new Date(); + if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) { + logger.error("此券活动未开始:" + orderSaveDto.getCouponChannelId()); + return new ResultData(ErrorCode.COUPON_CHANNEL_IS_NOT_STARTED); + } + if (wxCouponChannel.getEndTime().getTime() < now.getTime()) { + logger.error("此券活动已结束:" + orderSaveDto.getCouponChannelId()); + return new ResultData(ErrorCode.COUPON_CHANNEL_IS_END); + } + } + + if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) { + logger.error("此券已下架:" + orderSaveDto.getCouponChannelId()); + return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF); + } + return null; + } + + private ResultData couponUserCheck(WxCUserBasicInfo user, WxCouponCVo coupon) { + if (coupon.getConditions() == null) return null; + JSONObject jo = null; + try { + jo = JSONObject.parseObject(coupon.getConditions()); + } catch (Exception e) { + logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage()); + } + if (jo != null) { + if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()){ + + if (user != null && user.getActRecord() > 0) + return new ResultData(ErrorCode.COUPON_ONLY_FOR_NEW_MEMBER); + if (this.countCouponConditionType1(coupon.getTenantId(),user.getId()) > 0) + return new ResultData(ErrorCode.COUPON_ALREADY_IN_NEW_MEMBER); + }else if (jo.getIntValue("type") == EnumCouponConditionType.SCORE_SCOPE.getCode()){ + int max = jo.getIntValue("max"); + int min = jo.getIntValue("min"); + + if (max!=0 && min ==0 && user.getPoins() > max) { + return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); + } + if (max==0 && min !=0 && user.getPoins() < min) { + return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); + } + if (max!=0 && min !=0 && (user.getPoins() < min || user.getPoins() > max)) { + return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); + } + } + } + + return null; + } + +} diff --git a/mallinkService/src/main/resources/mapper/TtCouponMapper.xml b/mallinkService/src/main/resources/mapper/TtCouponMapper.xml index 6df1b5d25..f59e9e4bd 100644 --- a/mallinkService/src/main/resources/mapper/TtCouponMapper.xml +++ b/mallinkService/src/main/resources/mapper/TtCouponMapper.xml @@ -37,6 +37,7 @@ + @@ -47,7 +48,7 @@ `sale_price`, `orig_price`, `is_preview`, `preview_duration`, `detail`, `false_sell_count`, `dy_title`, `inventory`, `remark`, `status`, `create_date`, `update_date`, `see_count`, `sell_count`, `assess_count`, `collect_count`, `is_del`, - `column_id`, `popularity`, `merchant_id`, `merchant_name`, `business_id`, `business_name` + `column_id`, `popularity`, `merchant_id`, `merchant_name`,`merchant_pic`, `business_id`, `business_name` @@ -88,8 +89,11 @@ and `status` = #{status} - - and `create_date` between #{startdate} and #{enddate} + + and `create_date` >= #{startdate} + + + and `create_date` <= #{enddate} diff --git a/mallinkService/src/main/resources/mapper/TtOrderMapper.xml b/mallinkService/src/main/resources/mapper/TtOrderMapper.xml index 549109966..02bc84b9b 100644 --- a/mallinkService/src/main/resources/mapper/TtOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/TtOrderMapper.xml @@ -15,978 +15,100 @@ + + + + + + - `id`,`tenant_id`,`parent_tenant_id`,`c_user_id`,`coupon_channel_id`,`product_id`,`type`,`payment_type`,`payment`,`payment_time`,`order_status`,`create_date`,`update_date`,`detail`, - `press_end_date`,`press_current_num`,`press_current_value`,`order_group_id`,`form_id`,`total_payment` + o.`id`,o.`tenant_id`,o.`parent_tenant_id`,o.`c_user_id`,o.`product_id`,o.`type`,o.`payment_type`,o.`payment`, + o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`, + u.`nick_name`,u.`phone`, + c.`title` product_title,c.`coverImg` product_pic, + m.`name` author,m.`imgUrl` author_pic where 1 = 1 - and `id` = #{id} - - - - and `order_number` = #{orderNumber} + and o.`id` = #{id} - and `tenant_id` = #{tenantId} + and o.`tenant_id` = #{tenantId} - and `parent_tenant_id` = #{parentTenantId} + and o.`parent_tenant_id` = #{parentTenantId} - and `c_user_id` = #{cUserId} - - - - and `coupon_channel_id` = #{couponChannelId} + and o.`c_user_id` = #{cUserId} - and `product_id` = #{productId} + and o.`product_id` = #{productId} - and `type` = #{type} + and o.`type` = #{type} - and `payment_type` = #{paymentType} + and o.`payment_type` = #{paymentType} - - and `payment` = #{payment} + + and o.`payment_time` >= #{startdate} - - - and `payment_time` = #{paymentTime} + + and o.`payment_time` <= #{enddate} - and `order_status` = #{orderStatus} - - - - and `create_date` = #{createDate} + and o.`order_status` = #{orderStatus} - - and `update_date` = #{updateDate} + + and u.`nick_name` like concat('%', #{nickName},'%') - - and `detail` like concat('%', #{detail},'%') + + and u.`phone` like concat('%', #{phone},'%') - - and `press_end_date` = #{pressEndDate} + + and c.`title` like concat('%', #{productTitle},'%') - - and `press_current_num` = #{pressCurrentNum} + + and c.merchant_id = #{authorId} - - and `press_current_value` = #{pressCurrentValue} - - - - and `order_group_id` = #{orderGroupId} - - - - and `form_id` = #{formId} - - - - and `order_status` in - - #{sItem} - + + and m.`name` like concat('%', #{author},'%') - and id in + and o.`id` in #{idItem} - order by ${sortColumns} + order by o.`update_date` desc - - - - - - - - - - - - - - - - - - - o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status,o.create_date,o.update_date, - c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.detail,c.remark,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, - co.id as coupon_order_id,co.coupon_order_status,c.support_transfer,c.subsidy_num - - - - update wx_order set order_status=#{orderStatus} - where product_id=#{productId} - and press_end_date is not null and order_status in (6,7) - - and `tenant_id` = #{tenantId} - - - and `parent_tenant_id` = #{parentTenantId} - - - - - update wx_order set order_status=#{orderStatus},update_date=#{updateDate} - where product_id=#{productId} and order_status in(10,15) - - and `tenant_id` = #{tenantId} - - - and `parent_tenant_id` = #{parentTenantId} - - - - - update wx_order set order_status=#{orderStatus},update_date=#{updateDate} - where coupon_channel_id=#{couponChannelId} and order_status in(10,15) - - and `tenant_id` = #{tenantId} - - - and `parent_tenant_id` = #{parentTenantId} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status,o.create_date,o.update_date, - c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - o.`id`,o.`order_number`,o.`tenant_id`,o.`parent_tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, - o.`payment_type`,o.`payment`,o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, - m.name as merchant_name, bu.name, bu.phone as bphone, - cubi.phone, cubi.nick_name, cubi.name c_user_name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - o.`id`,o.`order_number`,o.`tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, - o.`payment_type`,o.`payment`,o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, - m.name as merchant_name, bu.name, bu.phone as bphone, - cubi.phone, cubi.nick_name, cubi.name c_user_name, - po.id as pay_order_id, po.transaction_id - - - - - - - - - - - - - - - - - - - - - - wm.id as id, - wm.tenant_id as tenant_id, - wm.parent_tenant_id as parent_tenant_id, - wm.name as merchant_name, - wm.link_phone as merchant_phone, - mo.xTime as report_date, - (case when mo.amount > 0 then mo.amount else 0 end) trade_amt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status, - o.create_date,o.update_date,o.press_end_date,o.press_current_num,o.press_current_value, - c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.unit,c.press_limit_num - - - - o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status, - o.create_date,o.update_date,o.press_end_date,o.press_current_num,o.press_current_value, - c.type as coupon_type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.unit,c.detail,c.remark,c.press_limit_num, - co.id as coupon_order_id,co.coupon_order_status - - - - - - - - update wx_order set order_status=#{orderStatus} - where order_group_id=#{orderGroupId} and order_status=10 - - and `tenant_id` = #{tenantId} - - - and `parent_tenant_id` = #{parentTenantId} - - - - - update wx_order set order_status=12 where `type`=0 and tenant_id = #{tenantId} and order_status in(10,15) and now()>press_end_date - diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java index 1d3cc36a6..727a85687 100644 --- a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java @@ -9,6 +9,7 @@ import com.iformall.domain.po.WxCUserBasicInfo; import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.base.BaseEntity; +import com.iformall.domain.po.tt.TtOrder; import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxOrderCouponPressVo; import com.iformall.domain.vo.WxOrderCouponVo; @@ -18,6 +19,7 @@ import com.iformall.service.WxCUserBasicInfoService; import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxCouponService; import com.iformall.service.WxOrderService; +import com.iformall.service.tt.TtOrderService; import com.iformall.utils.Constant; import com.iformall.utils.RedisLock; import io.swagger.annotations.Api; @@ -39,13 +41,16 @@ import java.util.Map; @RequestMapping("/api/order/") @Api(description = "订单相关接口") public class TtOrderController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired - private WxCouponChannelService wxCouponChannelService; + private TtOrderService ttOrderService; + + WxOrderService wxOrderService; @Autowired - private WxOrderService wxOrderService; + private WxCouponChannelService wxCouponChannelService; @Autowired private WxCouponService wxCouponService; @@ -60,6 +65,27 @@ public class TtOrderController extends BaseController { @Autowired RedisLock redisLock; + @ApiOperation("分页订单列表接口") + @GetMapping("list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true), + }) + public ResultData list(@ModelAttribute TtOrder order, Integer pageNum, Integer pageSize) { + // c端用户应该只能看到自己的订单 + if (order == null){ + order = new TtOrder(); + } + Long memberId; + try { + memberId = getMemberId(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + order.setCUserId(memberId); + return new ResultData(ttOrderService.listAsPage(order, pageNum, pageSize)); + } + @ApiOperation(value = "下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"}") @PostMapping("save") public ResultData saveOrder(@RequestBody OrderSaveDto orderSaveDto) { @@ -128,43 +154,7 @@ public class TtOrderController extends BaseController { return new ResultData(); } - @ApiOperation("分页订单列表接口") - @GetMapping("list") - @ApiImplicitParams({ - @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), - @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true), - }) - public ResultData list(@ModelAttribute WxOrder wxOrder, Integer pageNum, Integer pageSize) { - // c端用户应该只能看到自己的订单 - if (wxOrder == null){ - wxOrder = new WxOrder(); - } - Long memberId; - try { - memberId = getMemberId(); - } catch (Exception e) { - return new ResultData(Result.ERROR,e.getMessage()); - } - wxOrder.setCUserId(memberId); - wxOrder.setSortColumns(BaseEntity.SortField.UpdateDate_DESC); - final PageInfo page = wxOrderService.listCUserVoAsPage(wxOrder, pageNum, pageSize); - Date now = new Date(); - page.getList().stream().forEach(oc->{ - if (oc.getValidStartDate() != null && oc.getValidEndDate() != null ) { - if (oc.getValidStartDate().getTime() > now.getTime()) { - oc.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode()); - } else if (oc.getValidEndDate().getTime() < now.getTime()) { - oc.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode()); - } else { - oc.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode()); - } - } - }); - - - return new ResultData(page); - } @ApiOperation("订单详情接口") @GetMapping("detail") From 7234c9edd20475132347a1de462e479bb3787e25 Mon Sep 17 00:00:00 2001 From: xhxu Date: Fri, 14 May 2021 15:30:53 +0800 Subject: [PATCH 4/6] tt --- .../java/com/iformall/common/ErrorCode.java | 11 + .../com/iformall/domain/po/tt/TtCoupon.java | 8 +- .../com/iformall/domain/po/tt/TtOrder.java | 6 +- .../java/com/iformall/enums/EnumPayWay.java | 3 +- .../iformall/enums/EnumTtCouponStatus.java | 41 +++ .../com/iformall/mapper/TtOrderMapper.java | 1 + .../iformall/service/tt/TtCouponService.java | 1 + .../iformall/service/tt/TtOrderService.java | 9 + .../service/tt/impl/TtCouponServiceImpl.java | 7 +- .../service/tt/impl/TtOrderServiceImpl.java | 265 ++++++++---------- .../main/resources/mapper/TtOrderMapper.xml | 38 +++ .../controller/TtOrderController.java | 120 +++----- 12 files changed, 272 insertions(+), 238 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumTtCouponStatus.java diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java index 6547ba0c5..8e23783b3 100644 --- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java @@ -195,6 +195,11 @@ public enum ErrorCode{ ORDER_PRESS_IS_OVERTIME(3010, "砍价已过期"), ORDER_PRESS_IS_COMPLETE(3011, "砍价已完成"), ORDER_UNPAID(3012, "您有未支付的订单"), + ORDER_IS_FIND(3013, "订单已存在"), + ORDER_PAY_IN_REFUND(3014, "订单待退款"), + ORDER_PAY_REFUND(3015, "订单已退款"), + ORDER_PAY_REFUND_FAIL(3016, "订单退款失败"), + ORDER_PAY_EVALUATE(3017, "订单已评价"), ORDER_USER_NOT_MATCH(2013, "订单用户不匹配"), ORDER_COUPON_CHANNEL_NOT_MATCH(2014, "订单渠道不匹配"), ORDER_COUPON_NOT_MATCH(2015, "订单券不匹配"), @@ -609,6 +614,12 @@ public enum ErrorCode{ GOOAGOO_OPEN_FAIL(62002,"数衍信息请求失败"), + /** + * tt + */ + TTCOUPON_IS_EMPTY(63000, "课程不存在"), + TTCOUPON_IS_TAKE_OFF(63001, "课程不在上架状态"), + ; private int code; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java index e6c2791fb..1879a3761 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java @@ -4,6 +4,7 @@ import cn.afterturn.easypoi.excel.annotation.Excel; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.iformall.common.SortColumn; +import com.iformall.domain.po.WxMerchant; import com.iformall.domain.po.base.TenantEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -115,9 +116,9 @@ public class TtCoupon extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value="作者",name="merchantId") private Long merchantId; - @io.swagger.annotations.ApiModelProperty(value="",name="merchantName") + @io.swagger.annotations.ApiModelProperty(value="",name="merchantName")//弃用 private String merchantName; - @io.swagger.annotations.ApiModelProperty(value="",name="merchantPic") + @io.swagger.annotations.ApiModelProperty(value="",name="merchantPic")//弃用 private String merchantPic; @io.swagger.annotations.ApiModelProperty(value="业态",name="businessId") @@ -125,6 +126,9 @@ public class TtCoupon extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value="",name="businessName") private String businessName; + @TableField(exist = false) + private WxMerchant author; + @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value = "审批流参数", name = "columnCoupons") private List columnCoupons; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java index 47f0beb80..617cff686 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java @@ -10,6 +10,7 @@ import lombok.ToString; import java.math.BigDecimal; import java.util.Date; +import java.util.List; @TableName(value = "tt_order") @Data @@ -37,7 +38,7 @@ public class TtOrder extends TenantEntity { private String author; @TableField(exist = false) private String authorPic; - @io.swagger.annotations.ApiModelProperty(value="支付类型(1:支付宝,2:微信)",name="type") + @io.swagger.annotations.ApiModelProperty(value="支付类型(1:微信,)",name="type") private Integer type; @io.swagger.annotations.ApiModelProperty(value="0: 付款 1: 退款",name="paymentType") private Integer paymentType; @@ -66,6 +67,9 @@ public class TtOrder extends TenantEntity { @TableField(exist = false) private String paymentStr; + @TableField(exist = false) + protected List statusS; + @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value="查询-起始时间",name="startdate") private Date startdate; diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumPayWay.java b/mallinkService/src/main/java/com/iformall/enums/EnumPayWay.java index e468f7e6f..43e6a57dd 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumPayWay.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumPayWay.java @@ -10,6 +10,7 @@ public enum EnumPayWay { PAY_WAY_WECHAT_WAP(2, "微信H5",EnumPayWayType.WX_H5PAY,EnumAppPlat.WX,null), PAY_WAY_ALIPAY(3, "支付宝",EnumPayWayType.ALI_MINIPAY,EnumAppPlat.ALI,null), PAY_WAY_ALIPAY_WAP(4, "支付宝H5",EnumPayWayType.ALI_H5PAY,EnumAppPlat.ALI,null), + PAY_WAY_TT(5, "抖音担保支付",EnumPayWayType.TT_PAY,EnumAppPlat.TOUTIAO,null), PAY_WAY_POS_B(10, "POS B端",EnumPayWayType.POS,null,null), PAY_WAY_POS_NEU(11, "POS 东软",EnumPayWayType.NEU_POS,null,EnumCardSpendFrom.POS), PAY_WAY_NOT_UNPAY_MERCHANT(91, "商户注券,无需支付",null,null,null), @@ -71,6 +72,6 @@ public enum EnumPayWay { public static enum EnumPayWayType { - WX_MINIPAY,WX_H5PAY,ALI_MINIPAY,ALI_H5PAY,NEU_POS,POS + WX_MINIPAY,WX_H5PAY,ALI_MINIPAY,ALI_H5PAY,TT_PAY,NEU_POS,POS } } diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponStatus.java new file mode 100644 index 000000000..a1f47b825 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponStatus.java @@ -0,0 +1,41 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumTtCouponStatus { + + TTCOUPON_STATUS_DRAFT(1, "草稿"), + TTCOUPON_STATUS_EXAMINE(2, "审核中"), + TTCOUPON_STATUS_REJECT(3, "已驳回"), + TTCOUPON_STATUS_BEFOR_SHELF(4, "待上架"), + TTCOUPON_STATUS_SHELFING(5, "已上架"), + TTCOUPON_STATUS_AFTER_SHELF(6, "已下架"), + + ; + + public static EnumTtCouponStatus getEnum(Integer code) { + for (EnumTtCouponStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumTtCouponStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java index 29064cc4f..b16fde7c9 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java @@ -16,4 +16,5 @@ public interface TtOrderMapper extends CommonMapper { List findList(TtOrder record); + Integer findListCount(TtOrder orderQ); } diff --git a/mallinkService/src/main/java/com/iformall/service/tt/TtCouponService.java b/mallinkService/src/main/java/com/iformall/service/tt/TtCouponService.java index 5bc4f496d..16d53f592 100644 --- a/mallinkService/src/main/java/com/iformall/service/tt/TtCouponService.java +++ b/mallinkService/src/main/java/com/iformall/service/tt/TtCouponService.java @@ -38,4 +38,5 @@ public interface TtCouponService { */ void deleteById(Long id); + TtCoupon detail(Long productId); } diff --git a/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java b/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java index d113adc52..2839d9473 100644 --- a/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java @@ -1,7 +1,11 @@ package com.iformall.service.tt; import com.github.pagehelper.PageInfo; +import com.iformall.common.ResultData; +import com.iformall.domain.dto.OrderSaveDto; +import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.tt.TtOrder; +import com.iformall.enums.EnumPayWay; public interface TtOrderService { @@ -15,4 +19,9 @@ public interface TtOrderService { */ PageInfo listAsPage(TtOrder record, Integer pageIndex, Integer pageSize); + ResultData saveOrder(Long couponId, Long memberId, EnumPayWay payWay, TenantEntity tenantInfo); + + ResultData cancelOrder(Long orderId, Long memberId); + + TtOrder detail(Long orderId, Long memberId); } diff --git a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java index d65ae78f4..6e166d109 100644 --- a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java @@ -69,7 +69,6 @@ public class TtCouponServiceImpl implements TtCouponService { } else { record.setUpdateDate(new Date()); ttCouponMapper.updateById(record); - } return new ResultData(record.getId()); } @@ -78,4 +77,10 @@ public class TtCouponServiceImpl implements TtCouponService { public void deleteById(Long id) { ttCouponMapper.deleteById(id); } + + @Override + public TtCoupon detail(Long productId) { + TtCoupon byId = this.getById(productId); + return byId; + } } diff --git a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java index 96636d798..264926c39 100644 --- a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java @@ -13,6 +13,7 @@ import com.iformall.domain.dto.WxSharingOrderDto; import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg; +import com.iformall.domain.po.tt.TtCoupon; import com.iformall.domain.po.tt.TtOrder; import com.iformall.domain.vo.*; import com.iformall.enums.*; @@ -20,6 +21,7 @@ import com.iformall.exception.MallinkException; import com.iformall.mapper.*; import com.iformall.mq.MqBaseProducer; import com.iformall.service.*; +import com.iformall.service.tt.TtCouponService; import com.iformall.service.tt.TtOrderService; import com.iformall.utils.*; import org.apache.commons.lang3.StringUtils; @@ -51,6 +53,9 @@ public class TtOrderServiceImpl implements TtOrderService { @Autowired private TtOrderMapper ttOrderMapper; + @Autowired + private TtCouponService ttCouponService; + @Autowired RedisLock redisLock; @@ -153,6 +158,117 @@ public class TtOrderServiceImpl implements TtOrderService { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> ttOrderMapper.findList(record)); } + @Override + public ResultData saveOrder(Long couponId,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity) { + logger.info("OrderSave: couponId:" + couponId + "---cUserId:"+cUserId); + WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(cUserId,tenantEntity.getFinalTenantId()); + if(wxCUserBasicInfo == null){ + return new ResultData(ErrorCode.USER_IS_EMPTY); + } + TtOrder orderQ = new TtOrder(); + orderQ.setCUserId(cUserId); + orderQ.setProductId(couponId); + List statuss = new ArrayList<>(); + statuss.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + statuss.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + orderQ.setStatusS(statuss); + Integer listCount = ttOrderMapper.findListCount(orderQ); + if(listCount.intValue() > 0){ + return new ResultData(ErrorCode.ORDER_IS_FIND); + } + + if (wxCUserBasicInfo.getStatus().equals(EnumCUserBasicInfoStatus.LOCKED.getCode())) { + logger.info("会员权益被锁定:cUserId:" + cUserId); + return new ResultData(ErrorCode.MEMBER_IS_LOCKED); + } + TtCoupon coupon = ttCouponService.getById(couponId); + if (null == coupon) { + return new ResultData(ErrorCode.TTCOUPON_IS_EMPTY); + } + if (!coupon.getStatus().equals(EnumTtCouponStatus.TTCOUPON_STATUS_SHELFING.getCode())) { + return new ResultData(ErrorCode.TTCOUPON_IS_TAKE_OFF); + } + + try { + // 4.2 保存订单 + final IdWorker idWorker = IdWorker.get(); + Date now = new Date(); + TtOrder order = new TtOrder(); + order.setId(idWorker.nextId()); + order.updateTenantInfo(tenantEntity); + order.setCUserId(wxCUserBasicInfo.getId()); + order.setProductId(coupon.getId()); + order.setType(payWay.getCode()); + order.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); + order.setPayment(coupon.getSalePrice()); + if(order.getPayment() == null || order.getPayment().intValue() == 0){ + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); + order.setPaymentTime(now); + }else{ + order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); + } + order.setCreateDate(now); + order.setUpdateDate(now); + ttOrderMapper.insert(order); + return new ResultData(order); + } catch (MallinkException e) { + logger.error(e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.ORDER_IS_FAIL, e.getMessage()); + } + } + + @Override + public ResultData cancelOrder(Long orderId, Long memberId) { + TtOrder ttOrder = ttOrderMapper.selectById(orderId); + if(ttOrder == null){ + return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); + } + if(memberId != null && !ttOrder.getCUserId().equals(memberId)){ + return new ResultData(ErrorCode.ORDER_USER_NOT_MATCH); + } + if(ttOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode())){//订单待付款 + TtOrder record = new TtOrder(); + record.setId(ttOrder.getId()); + record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); + record.setUpdateDate(new Date()); + ttOrderMapper.updateById(record); + return new ResultData(); + }else + if(ttOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode())){//订单已支付 + return new ResultData(ErrorCode.ORDER_HAD_PAY); + }else + if(ttOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode())){//订单已取消 + return new ResultData(ErrorCode.ORDER_HAD_CANCEL); + }else + if(ttOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_PENDING_REFUND.getCode())){//订单待退款 + return new ResultData(ErrorCode.ORDER_PAY_IN_REFUND); + }else + if(ttOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS.getCode())){//订单已退款 + return new ResultData(ErrorCode.ORDER_PAY_REFUND); + }else + if(ttOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_REFUND_FAILD.getCode())){//订单退款失败 + return new ResultData(ErrorCode.ORDER_PAY_REFUND_FAIL); + } + return new ResultData(ErrorCode.ORDER_IS_FAIL); + } + + @Override + public TtOrder detail(Long orderId, Long memberId) { + TtOrder ttOrder = ttOrderMapper.selectById(orderId); + if(ttOrder == null){ + return null; + } + if(memberId != null && !ttOrder.getCUserId().equals(memberId)){ + return null; + } + TtCoupon coupon = ttCouponService.detail(ttOrder.getProductId()); + return null; + } + + @Override public ResultData microPayListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize) { WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(bUserId.longValue()); @@ -1899,54 +2015,8 @@ public class TtOrderServiceImpl implements TtOrderService { @Qualifier("cUserBasicInfoRedisTemplate") RedisTemplate cUserBasicInfoRedisTemplate; - @Override - public WxOrder saveOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, OrderSaveDto orderSaveDto, boolean isPress,EnumPayWay payWay) { - WxOrder order = null; - // 防止同一用户重复抽奖(一分钟内) - // 1. 订单保存时 加入redis缓存,key --> action:userId:couponId , 时间1000ms - // 2. 如果存在,说明该用户正在下单,返回异常提示 - // 3. 方法结束时清除 key - if (checkCouponIsFree(coupon)) { - // 免费券 - String key = StringUtils.join("action", ":", user.getId(), coupon.getId()); - boolean hasKey = cUserBasicInfoRedisTemplate.hasKey(key); - if (hasKey) { - logger.error("用户正在下单,请求异常返回,user: {} " + JSON.toJSONString(user)); - throw new MallinkException(ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION); - } - cUserBasicInfoRedisTemplate.opsForValue().set(key, user, 1000, TimeUnit.MILLISECONDS); - - order = saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null,payWay); - if (order != null) { - // 6. 下订单完成,发送内部消息 - // 下订单完成,发送内部消息 - try { - sendOrderSuccessActionMsg(order); - } catch (Exception e) { - logger.error("内部消息发送失败: " + e.getMessage()); - throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR); - } - } - } else { - // 有价券 - order = saveNoFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), isPress, orderSaveDto.getOrderGroupId(), orderSaveDto.getFormId()); - } - // couponActionLog - try { - wxCouponActionLogService.addOne(order, order.getProductId(), order.getOrderNumber(), EnumCouponSendSendType.ACTIVE.getCode(), orderSaveDto.getCouponChannelId(),0L); - } catch (Exception e) { - // 库存恢复 - stockBack(order); - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - return order; - } - @Override - public boolean checkCouponIsFree(WxCoupon coupon) { - return coupon.getSalePrice() == 0; - } + @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @@ -2343,107 +2413,6 @@ public class TtOrderServiceImpl implements TtOrderService { return wxOrderMapper.countList(query); } - - @Override - public ResultData saveOrder(OrderSaveDto orderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity) { - logger.info("OrderSave: " + orderSaveDto); - if (orderSaveDto.getCouponChannelId() == null) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId不能为空"); - } - WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(orderSaveDto.getCouponChannelId(),tenantEntity.getTenantId()); - if (wxCouponChannel == null) { - logger.error("couponChannelId find error, " + orderSaveDto.getCouponChannelId()); - return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF); - } - ResultData resultData = couponChannelCheck(orderSaveDto, wxCouponChannel); - if (resultData != null) return resultData; - - WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(cUserId,tenantEntity.getFinalTenantId()); - if (wxCUserBasicInfo != null && wxCUserBasicInfo.getStatus().equals(EnumCUserBasicInfoStatus.LOCKED.getCode())) { - logger.info("会员权益被锁定:cUserId:" + cUserId); - return new ResultData(ErrorCode.MEMBER_IS_LOCKED); - } - - WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId(),wxCouponChannel.getTenantId()); - if (null == coupon) { - return new ResultData(ErrorCode.COUPON_IS_EMPTY); - } - if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { - return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); - } - //判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制 - if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) { - int ordercount = this.countUserCouponGroupOrder(cUserId,coupon.getId(),coupon.getTenantId()); - if (ordercount>=coupon.getUseLimitQuantity()) { - return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"您当前此券的有效拼团数量达到券的限购次数。"); - } - } - - WxCouponCVo wxCouponCVo = null; - - String key = "cc:" + orderSaveDto.getCouponChannelId(); - ValueOperations operations = cdRedisTemplate.opsForValue(); - // 缓存 - boolean hasKey = cdRedisTemplate.hasKey(key); - if (hasKey) { - // 从缓存获取用户信息 - wxCouponCVo = operations.get(key); - } else { - // 游戏没有入缓存,需要从数据库中读取 - wxCouponCVo = wxCouponChannelService.findDetailVo(orderSaveDto.getCouponChannelId(),wxCouponChannel.getTenantId()); - if (wxCouponCVo != null) { - // 游戏优化,进缓存 - cdRedisTemplate.opsForValue().set(key, wxCouponCVo, 3600, TimeUnit.SECONDS); - } - } - if (wxCouponCVo == null) { - return new ResultData(ErrorCode.COUPON_IS_EMPTY); - } - - //此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。 - boolean hascache = redisLock.hasCouponStockCache(wxCouponCVo.getCouponId()); - if (!hascache) { - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; - String timeStr = String.valueOf(time); - boolean stocksetlock = redisLock.lock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); - if (stocksetlock) { - try { - if (!redisLock.hasCouponStockCache(wxCouponCVo.getCouponId())) { - redisLock.setCouponStock(wxCouponCVo.getCouponId(), coupon.getRemainInventory()); - } - }catch(Exception e) { - logger.error("save order stock cache error.",e); - }finally { - redisLock.unlock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); - } - }else { - redisLock.unlock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); - } - } - - resultData = couponUserCheck(wxCUserBasicInfo, wxCouponCVo); - if (resultData != null) return resultData; - - Long couponId = orderSaveDto.getCouponId() == null ? wxCouponChannel.getCouponId() : orderSaveDto.getCouponId(); - if (couponId == null) { - logger.error("couponChannelId或者couponId不能为空"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId或者couponId不能为空"); - } - // 是否砍价 - boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false; - - try { - WxOrder order = this.saveOrderForCoupon(wxCUserBasicInfo, coupon, orderSaveDto, isPress,payWay); - return new ResultData(order); - } catch (MallinkException e) { - logger.error(e.getMessage()); - return new ResultData(e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - logger.error(e.getMessage()); - return new ResultData(ErrorCode.ORDER_IS_FAIL, e.getMessage()); - } - } - private ResultData couponChannelCheck(OrderSaveDto orderSaveDto, WxCouponChannel wxCouponChannel) { if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) { Date now = new Date(); diff --git a/mallinkService/src/main/resources/mapper/TtOrderMapper.xml b/mallinkService/src/main/resources/mapper/TtOrderMapper.xml index 02bc84b9b..5bfbf940b 100644 --- a/mallinkService/src/main/resources/mapper/TtOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/TtOrderMapper.xml @@ -92,6 +92,13 @@ and m.`name` like concat('%', #{author},'%') + + and o.`order_status` in + + #{sItem} + + + and o.`id` in @@ -111,4 +118,35 @@ + + diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java index 727a85687..2db785888 100644 --- a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java @@ -79,8 +79,8 @@ public class TtOrderController extends BaseController { Long memberId; try { memberId = getMemberId(); - } catch (Exception e) { - return new ResultData(Result.ERROR,e.getMessage()); + } catch (MallinkException e) { + return new ResultData(e.getErrorCode(), e.getMessage()); } order.setCUserId(memberId); return new ResultData(ttOrderService.listAsPage(order, pageNum, pageSize)); @@ -88,14 +88,25 @@ public class TtOrderController extends BaseController { @ApiOperation(value = "下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"}") @PostMapping("save") - public ResultData saveOrder(@RequestBody OrderSaveDto orderSaveDto) { + public ResultData saveOrder(@RequestBody Map paramMap) { + String couponIdStr = paramMap.get("couponId"); + if (StringUtils.isBlank(couponIdStr) || couponIdStr.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponId不能为空"); + } + Long couponId; + try { + couponId = Long.valueOf(couponIdStr); + } catch (NumberFormatException e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL, "couponId: " + couponIdStr + ", e: " + e.getMessage()); + } Long memberId; try { - memberId = getMemberId(); - } catch (Exception e) { - return new ResultData(Result.ERROR,e.getMessage()); - } - return wxOrderService.saveOrder(orderSaveDto,memberId,EnumPayWay.PAY_WAY_WECHAT,getTenantInfo()); + memberId = getMemberId(); + } catch (MallinkException e) { + return new ResultData(e.getErrorCode(), e.getMessage()); + } + return ttOrderService.saveOrder(couponId,memberId,EnumPayWay.PAY_WAY_TT,getTenantInfo()); } @@ -106,56 +117,27 @@ public class TtOrderController extends BaseController { if (StringUtils.isBlank(orderIdStr) || orderIdStr.equalsIgnoreCase(Constant.UNDEFINED)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); } - Long orderId = 0L; + Long orderId; try { orderId = Long.valueOf(orderIdStr); } catch (NumberFormatException e) { logger.error(e.getMessage()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL, "orderId: " + orderIdStr + ", e: " + e.getMessage()); } + Long memberId; try { - WxOrder order = wxOrderService.getById(orderId,getTenantInfo().getTenantId()); - if (order != null) { - wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL); - } - } catch (Exception e) { - logger.error("取消订单失败: " + e.getMessage()); - return new ResultData(ErrorCode.ORDER_IS_FAIL.getCode(), "取消订单失败: " + e.getMessage()); - } - - return new ResultData(); - } - - @ApiOperation(value = "订单已过期", notes = "{\"orderId\":\"string\"}") - @PostMapping("expired") - public ResultData expiredOrder(@RequestBody Map paramMap) { - //Assert.notNull(wxOrders.getName(), "角色名不能为空"); - //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); - String orderIdStr = paramMap.get("orderId"); - if (StringUtils.isBlank(orderIdStr) || orderIdStr.equalsIgnoreCase(Constant.UNDEFINED)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "退款订单ID不能为空"); - } - Long orderId = 0L; - try { - orderId = Long.valueOf(orderIdStr); - } catch (NumberFormatException e) { - logger.error(e.getMessage()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "退款订单ID转换失败"); + memberId = getMemberId(); + } catch (MallinkException e) { + return new ResultData(e.getErrorCode(), e.getMessage()); } try { - WxOrder order = wxOrderService.getById(orderId,getTenantInfo().getTenantId()); - if (order != null) { - wxOrderService.updateOrderStatus(order, EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS); - } + return ttOrderService.cancelOrder(orderId,memberId); } catch (Exception e) { - logger.error("更新退款订单状态失败:" + e.getMessage()); - return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), "更新退款订单状态失败:" + e.getMessage()); + logger.error("取消订单失败: " + e.getMessage()); + return new ResultData(ErrorCode.ORDER_IS_FAIL.getCode(), "取消订单失败: " + e.getMessage()); } - return new ResultData(); } - - @ApiOperation("订单详情接口") @GetMapping("detail") @ApiImplicitParams({ @@ -165,53 +147,21 @@ public class TtOrderController extends BaseController { if (StringUtils.isBlank(orderId) || orderId.equalsIgnoreCase(Constant.UNDEFINED)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } - // c端用户应该只能看到自己的订单细节 - WxOrder wxOrder = new WxOrder(); - Long id = 0L; + Long id; try { id = Long.valueOf(orderId); } catch (NumberFormatException e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); + logger.error(e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL, "orderId: " + orderId + ", e: " + e.getMessage()); } - wxOrder.setId(id); Long memberId; try { - memberId = getMemberId(); - } catch (Exception e) { - return new ResultData(Result.ERROR,e.getMessage()); - } - wxOrder.setCUserId(memberId); - WxOrderCouponVo wxOrderCVo = wxOrderService.detailCUserVo(wxOrder); - if (wxOrderCVo == null) - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - - Date now = new Date(); - - if (wxOrderCVo.getValidStartDate() != null && wxOrderCVo.getValidEndDate() != null - && !wxOrderCVo.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())) { - if (wxOrderCVo.getValidStartDate().getTime() > now.getTime()) { - wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode()); - } else if (wxOrderCVo.getValidEndDate().getTime() < now.getTime()) { - wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode()); - } else { - wxOrderCVo.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode()); - } - } - if(wxOrderCVo.getType().equals(EnumCouponType.COUPON_PREORDER.getCode()) - && wxOrderCVo.getPickStartDate() != null && wxOrderCVo.getPickEndDate() != null){ -// wxOrderCVo.setValidStartDate(wxOrderCVo.getPickStartDate()); -// wxOrderCVo.setValidEndDate(wxOrderCVo.getPickEndDate()); - if (wxOrderCVo.getPickStartDate().getTime() > now.getTime()) { - wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode()); - } else if (wxOrderCVo.getPickEndDate().getTime() < now.getTime()) { - wxOrderCVo.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode()); - } else { - wxOrderCVo.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode()); - } + memberId = getMemberId(); + } catch (MallinkException e) { + return new ResultData(e.getErrorCode(), e.getMessage()); } - - return new ResultData(wxOrderCVo); + TtOrder order = ttOrderService.detail(id,memberId); + return new ResultData(order); } @ApiOperation(value = "根据orderId查询接口", notes = "{\"orderId\":\"string\"}") From d287777cdf257dca70f9827d0f9e8aa438bc46f1 Mon Sep 17 00:00:00 2001 From: xhxu Date: Fri, 14 May 2021 17:30:12 +0800 Subject: [PATCH 5/6] tt --- .../com/iformall/domain/po/tt/TtCoupon.java | 3 + .../com/iformall/domain/po/tt/TtOrder.java | 3 + .../com/iformall/enums/EnumTtCouponType.java | 38 + .../service/tt/impl/TtCouponServiceImpl.java | 5 + .../service/tt/impl/TtOrderServiceImpl.java | 2322 +---------------- .../controller/TtOrderController.java | 131 - .../controller/TtPayOrderController.java | 223 ++ 7 files changed, 276 insertions(+), 2449 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumTtCouponType.java create mode 100644 mallinkTTCApi/src/main/java/com/iformall/controller/TtPayOrderController.java diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java index 1879a3761..97639ad06 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java @@ -129,6 +129,9 @@ public class TtCoupon extends TenantEntity { @TableField(exist = false) private WxMerchant author; + @TableField(exist = false) + private TtCoupon couponCoumn; + @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value = "审批流参数", name = "columnCoupons") private List columnCoupons; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java index 617cff686..3ab10bb8a 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java @@ -67,6 +67,9 @@ public class TtOrder extends TenantEntity { @TableField(exist = false) private String paymentStr; + @TableField(exist = false) + protected TtCoupon ttCoupon; + @TableField(exist = false) protected List statusS; diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponType.java b/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponType.java new file mode 100644 index 000000000..154e5f123 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponType.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumTtCouponType { + + + COUPON_COLUMN(1, "专栏"), + COUPON_SINGLE(2, "单课程"), + COUPON_MORE(3, "子课程"), + ; + + public static EnumTtCouponType getEnum(Integer code) { + for (EnumTtCouponType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumTtCouponType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java index 6e166d109..095a9b5ef 100644 --- a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java @@ -7,6 +7,7 @@ import com.iformall.common.IdWorker; import com.iformall.common.ResultData; import com.iformall.domain.po.tt.TtCoupon; import com.iformall.mapper.*; +import com.iformall.service.WxMerchantService; import com.iformall.service.tt.TtCouponService; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -26,6 +27,9 @@ public class TtCouponServiceImpl implements TtCouponService { @Autowired TtCouponMapper ttCouponMapper; + @Autowired + WxMerchantService wxMerchantService; + @Override public PageInfo listAsPage(TtCoupon record, Integer pageIndex, Integer pageSize) { @@ -81,6 +85,7 @@ public class TtCouponServiceImpl implements TtCouponService { @Override public TtCoupon detail(Long productId) { TtCoupon byId = this.getById(productId); + byId.setAuthor(wxMerchantService.getById(byId.getMerchantId())); return byId; } } diff --git a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java index 264926c39..6e11fd0ec 100644 --- a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java @@ -1,48 +1,26 @@ package com.iformall.service.tt.impl; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; import com.iformall.common.IdWorker; import com.iformall.common.ResultData; -import com.iformall.domain.dto.OrderSaveDto; -import com.iformall.domain.dto.WxSharingOrderDto; import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; -import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg; import com.iformall.domain.po.tt.TtCoupon; import com.iformall.domain.po.tt.TtOrder; -import com.iformall.domain.vo.*; import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.*; -import com.iformall.mq.MqBaseProducer; -import com.iformall.service.*; +import com.iformall.service.WxCUserBasicInfoService; import com.iformall.service.tt.TtCouponService; import com.iformall.service.tt.TtOrderService; -import com.iformall.utils.*; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; @Service @@ -57,101 +35,7 @@ public class TtOrderServiceImpl implements TtOrderService { private TtCouponService ttCouponService; @Autowired - RedisLock redisLock; - - @Autowired - WxAppinfoMapper wxAppinfoMapper; - - @Autowired - WxPayAccountMapper wxPayAccountMapper; - - @Autowired - WxMallMapper wxMallMapper; - - @Autowired - WxMerchantMapper wxMerchantMapper; - - @Autowired - WxCUserMapper wxCUserMapper; - - @Autowired - WxCouponMapper wxCouponMapper; - - @Autowired - WxCouponOrderMapper wxCouponOrderMapper; - - @Autowired - WxCUserService wxCUserService; - - @Autowired - WxCUserBasicInfoService wxCUserBasicInfoService; - - @Autowired - WxPayOrderMapper wxPayOrderMapper; - - @Autowired - WxMerchantBUserMapper wxMerchantBUserMapper; - - @Autowired - WxAppinfoService wxAppinfoService; - - @Autowired - WxPayOrderService wxPayOrderService; - - @Autowired - WxScoreRulesService wxScoreRulesService; - - @Autowired - WxCUserTagsService wxCUserTagsService; - - @Autowired - WxCouponActionLogService wxCouponActionLogService; - - @Autowired - WxProfitSharingOrderService wxProfitSharingOrderService; - - @Autowired - WxCouponMerchantMapper wxCouponMerchantMapper; - - @Autowired - WxCardInfoMapper wxCardInfoMapper; - - @Autowired - WxCouponSendService wxCouponSendService; - - @Autowired - WxOrderPressMapper wxOrderPressMapper; - - @Autowired - WxOrderGroupMapper wxOrderGroupMapper; - - @Autowired - WxCreditHistoryService wxCreditHistoryService; - - @Autowired - WxCouponChannelMapper wxCouponChannelMapper; - - @Autowired - private MqBaseProducer mqBaseProducer; - - @Autowired - private WxCUserBasicInfoMapper wxCUserBasicInfoMapper; - - @Autowired - private WxCouponPasswordMapper couponPasswordMapper; - - @Autowired - ExcelService excelService; - - @Autowired - WxCouponService wxCouponService; - - @Autowired - WxCouponChannelService wxCouponChannelService; - - @Autowired - @Qualifier("couponDetailRedisTemplate") - RedisTemplate cdRedisTemplate; + private WxCUserBasicInfoService wxCUserBasicInfoService; @Override public PageInfo listAsPage(TtOrder record, Integer pageIndex, Integer pageSize) { @@ -265,2206 +149,8 @@ public class TtOrderServiceImpl implements TtOrderService { return null; } TtCoupon coupon = ttCouponService.detail(ttOrder.getProductId()); - return null; - } - - - @Override - public ResultData microPayListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize) { - WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(bUserId.longValue()); - if (wxMerchantBUser == null) { - logger.error("B端用户不存在:" + bUserId); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - WxMerchant wxMerchant = wxMerchantMapper.selectById(wxMerchantBUser.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在:" + bUserId); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); - String dateString; - Date startDate; - Date endDate; - - if (date == null) { - endDate = new Date(); - dateString = fmt.format(new Date()); - try { - startDate = fmt.parse(dateString); - } catch (ParseException e) { - return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); - } - } else { - try { - startDate = fmt.parse(date); - } catch (ParseException e) { - return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); - } - Calendar cal = Calendar.getInstance(); - cal.setTime(startDate); - cal.add(Calendar.DATE, 1); - endDate = cal.getTime(); - } - - Map dateMap = new HashMap(); - dateMap.put("startDate", startDate); - dateMap.put("endDate", endDate); - dateMap.put("merchantId", wxMerchant.getId()); - dateMap.put("type", type); - dateMap.put("tenantId", wxMerchantBUser.getTenantId()); - dateMap.put("finalTenantId", wxMerchantBUser.getFinalTenantId()); - - Map resultMap = new HashMap(); - - if (pageIndex == null || pageSize == null) { - List list; - list = wxOrderMapper.findListOfMicroPayOrderByDate(dateMap); - logger.info("find " + list.size() + " order from " + startDate + " to " + new Date()); - int total_price = 0; - for (WxOrder order : list) { - total_price = total_price + order.getPayment(); - } - resultMap.put("amount", total_price); - } else { - resultMap.put("list", PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfMicroPayOrderByDate(dateMap))); - } - return new ResultData(resultMap); - } - - @Override - public ResultData microPayExpListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize) { - WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(bUserId.longValue()); - if (wxMerchantBUser == null) { - logger.error("B端用户不存在:" + bUserId); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - WxMerchant wxMerchant = wxMerchantMapper.selectById(wxMerchantBUser.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在:" + bUserId); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); - String dateString; - Date startDate; - Date endDate; - - if (date == null) { - endDate = new Date(); - dateString = fmt.format(new Date()); - try { - startDate = fmt.parse(dateString); - } catch (ParseException e) { - return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); - } - } else { - try { - startDate = fmt.parse(date); - } catch (ParseException e) { - return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); - } - Calendar cal = Calendar.getInstance(); - cal.setTime(startDate); - cal.add(Calendar.DATE, 1); - endDate = cal.getTime(); - } - - Map dateMap = new HashMap(); - dateMap.put("startDate", startDate); - dateMap.put("endDate", endDate); - dateMap.put("merchantId", wxMerchant.getId()); - dateMap.put("type", type); - dateMap.put("tenantId", wxMerchantBUser.getTenantId()); - dateMap.put("finalTenantId", wxMerchantBUser.getFinalTenantId()); - Map resultMap = new HashMap(); - - if (pageIndex == null || pageSize == null) { - List list; - list = wxOrderMapper.findListOfExpMicroPayOrderByDate(dateMap); - logger.info("find " + list.size() + " order from " + startDate + " to " + new Date()); - int total_price = 0; - for (WxOrder order : list) { - total_price = total_price + order.getPayment(); - } - resultMap.put("amount", total_price); - } else { - resultMap.put("list", PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfExpMicroPayOrderByDate(dateMap))); - } - return new ResultData(resultMap); - } - - /** - * 拼团数量 - * - * @param user - * @param counpon - * @return - */ - private int getUserOrderGroupCount(WxCUserBasicInfo user, WxCoupon counpon) { - // + Order 待支付 - try { - WxOrder orderQ = new WxOrder(); - orderQ.updateTenantInfo(counpon); - orderQ.setProductId(counpon.getId()); - orderQ.setType(EnumOrderType.COUPON.getCode()); - orderQ.setCUserId(user.getId()); - orderQ.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - return wxOrderMapper.countList(orderQ); - } catch (Exception e) { - logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - - } - - - /** - * 用户购买的订单数量 - * - * @param user - * @param counpon - * @return - */ - private int getUserOrderCount(WxCUserBasicInfo user, WxCoupon counpon) { - // + Order 待支付 - try { - WxOrder orderQ = new WxOrder(); - orderQ.updateTenantInfo(counpon); - orderQ.setProductId(counpon.getId()); - orderQ.setType(EnumOrderType.COUPON.getCode()); - orderQ.setCUserId(user.getId()); - List statusS = new ArrayList<>(); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - orderQ.setStatusS(statusS); - return wxOrderMapper.countList(orderQ); - } catch (Exception e) { - logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - - } - - /** - * 用户购买的订单数量 - * - * @param user - * @param counpon - * @return - */ - public WxOrder getUnPaidOrder(WxCUserBasicInfo user, WxCoupon counpon) { - // + Order 待支付 - try { - WxOrder orderQ = new WxOrder(); - orderQ.updateTenantInfo(counpon); - orderQ.setProductId(counpon.getId()); - orderQ.setType(EnumOrderType.COUPON.getCode()); - orderQ.setCUserId(user.getId()); - List statusS = new ArrayList<>(); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - orderQ.setStatusS(statusS); - List orders = wxOrderMapper.findList(orderQ); - if (orders.size() >= 1) { - return orders.get(0); - } - } catch (Exception e) { - logger.error("待支付Order, couponId: " + counpon.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); - } - return null; - } - - /** - * 用户正在参加的新手活动 - * - * @param - * @return - */ - public int countCouponConditionType1(String subTenantId,Long cuserId) { - // + Order 待支付 - try { - WxOrder orderQ = new WxOrder(); - orderQ.setTenantId(subTenantId); -// orderQ.setType(EnumOrderType.COUPON.getCode()); - orderQ.setCUserId(cuserId); - List statusS = new ArrayList<>(); - statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_REFUND.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_REFUND_FAILD.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_CANCEL.getCode()); - - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_BREAK.getCode()); - - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE_REFUND.getCode()); - - orderQ.setStatusS(statusS); - return wxOrderMapper.countCouponConditionType1(orderQ); - } catch (Exception e) { - logger.error("用户正在参加的新手活动, userId: " + cuserId + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); - } - } - - /** - * 用户购买的券包数量- 待使用的券 - * - * @param user - * @param counpon - * @return - */ - private int getUserCouponOrderCount(WxCUserBasicInfo user, WxCoupon counpon) { - // + couponOrder ---待使用 - try { - WxCouponOrder couponOrderQ = new WxCouponOrder(); - couponOrderQ.updateTenantInfo(counpon); - couponOrderQ.setCouponId(counpon.getId()); - couponOrderQ.setCUserId(user.getId()); - if (counpon.getSendType().equals(EnumCouponSendType.PASSIVE)) { - couponOrderQ.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - } - return wxCouponOrderMapper.findCount(couponOrderQ); - } catch (Exception e) { - logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - - } - - /** - * 商户注券减库存 - * - * @param user - * @param coupon - * @param couponIdStr - * @param wxCouponSendVo - */ - private void stockMerchantReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr, WxCouponSendVo wxCouponSendVo) { - long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; - String timeStr = String.valueOf(time); - // 库存加锁 - if (!redisLock.lock(couponIdStr, timeStr)) { - logger.error("此券被锁定, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.TOO_MANY_REQUEST.getCode(), coupon.getTitle() + ErrorCode.TOO_MANY_REQUEST.getMessage()); - } - - JSONObject jo = JSONObject.parseObject(wxCouponSendVo.getConditions()); - int merchantSend = jo.getIntValue(WxCouponSend.KEY_MERCHANT_SEND); - int merchantRemain = jo.getIntValue(WxCouponSend.KEY_MERCHANT_REMAIN); - - // 检查 优惠券 库存 - if (merchantRemain <= 0) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券库存为0, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY.getCode(), coupon.getTitle() + ErrorCode.REMAIN_IS_EMPTY.getMessage()); - } - - int count = 0; - // 有价券 TODO 当前只支持系统券(免费券) -// if (coupon.getSalePrice() > 0) { -// // 检查是否未支付订单 -// try { -// count = getUserOrderCount(user, coupon); -// } catch (Exception e) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// throw new MallinkException(ErrorCode.DB_FAIL); -// } -// if (count > 0) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); -// throw new MallinkException(ErrorCode.ORDER_UNPAID); -// } -// } - // 检查用户已购买数量 - try { - count = getUserCouponOrderCount(user, coupon); - } catch (Exception e) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count >= coupon.getUseLimitQuantity()) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(), coupon.getTitle() + ErrorCode.ORDER_IS_LIMITED.getMessage()); - } - - try { - // 减库存 - wxCouponSendService.reduceMerchantSend(coupon.getTenantId(),wxCouponSendVo.getId(), merchantRemain, merchantSend, 1); - } catch (RuntimeException e) { - logger.error("此券减库存失败, couponId: {}, error: {}", couponIdStr, e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), coupon.getTitle() + ErrorCode.ORDER_IS_LIMITED.getMessage()); - } finally { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - } - } - - /** - * 减库存 - * - * @param user - * @param coupon - * @param couponIdStr - */ - private void stockReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr) { - //如果缓存中不存在这个key,则从coupon中取 - if(!redisLock.hasCouponStockCache(coupon.getId())) { - //此处需要加锁,防止并发设置 - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; - String timeStr = String.valueOf(time); - boolean stocksetlock = redisLock.lock("couponLockStockSet_"+coupon.getId(), timeStr); - if (stocksetlock) { - if (!redisLock.hasCouponStockCache(coupon.getId())) { - WxCoupon cou = wxCouponMapper.selectById(coupon.getId(),coupon.getTenantId()); - if (null == cou) { - redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"未查询到券!"+coupon.getId()); - } - try { - redisLock.setCouponStock(coupon.getId(), cou.getRemainInventory()); - }catch(Exception e) { - logger.error("set couponstock to redis fail.",e); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"redis设置券库存失败"+coupon.getId()); - }finally { - redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); - } - }else { - redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); - } - } - - } - - long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr)); - if (redisStock<=0) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!:"+couponIdStr); - } - // 检查 优惠券 库存 - if (coupon.getRemainInventory() <= 0) { - throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); - } - - int count = 0; - // 有价券 - if (coupon.getSalePrice() > 0) { - // 检查是否未支付订单 - try { - count = getUserOrderCount(user, coupon); - } catch (Exception e) { - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count > 0) { - logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_UNPAID); - } - } - //检查拼团中的数量 - try { - count = getUserOrderGroupCount(user, coupon); - } catch (Exception e) { - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count >= coupon.getUseLimitQuantity()) { - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); - } - - // 检查用户已购买数量 - try { - count = getUserCouponOrderCount(user, coupon); - } catch (Exception e) { - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count >= coupon.getUseLimitQuantity()) { - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - } - - try { - //减库存,从redis中取,然后发mq消息同步到数据库 - wxCouponService.reduceRemainInventory(coupon.getId(),coupon.getTenantId(), 1); - - long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); - if (stock < 0 ) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!"); - } - - -// UpdateCouponStockMsg msg = new UpdateCouponStockMsg(); -// msg.setCouponId(coupon.getId()); -// msg.setNumber(1); -// msg.setOperateType(UpdateCouponStockMsg.OPERATE_TYPE_DECREASE); -// msg.setMsgType(EnumMsgRecordType.COUPON_STOCK.getCode()); -// mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.STOCK.getCode(), "*", "decrease_stock_"+coupon.getId()); - } catch (RuntimeException e) { - logger.error("此券减库存失败, couponId: " + couponIdStr,e); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),e.getMessage()); - } - } - -// /** -// * 减库存 -// * -// * @param user -// * @param coupon -// * @param couponIdStr -// */ -// private void stockReduce(WxCUser user, WxCoupon coupon, String couponIdStr) { -// long time = System.currentTimeMillis() + RedisLock.TIMEOUT; -// String timeStr = String.valueOf(time); -// // 库存加锁 -// if (!redisLock.lock(couponIdStr, timeStr)) { -// logger.error("此券被锁定, couponId: " + couponIdStr); -// throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); -// } -// -// // 检查 优惠券 库存 -// if (coupon.getRemainInventory() <= 0) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券库存为0, couponId: " + couponIdStr); -// throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); -// } -// -// int count = 0; -// // 有价券 -// if (coupon.getSalePrice() > 0) { -// // 检查是否未支付订单 -// try { -// count = getUserOrderCount(user, coupon); -// } catch (Exception e) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// throw new MallinkException(ErrorCode.DB_FAIL); -// } -// if (count > 0) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); -// throw new MallinkException(ErrorCode.ORDER_UNPAID); -// } -// } -// //检查拼团中的数量 -// try { -// count = getUserOrderGroupCount(user, coupon); -// } catch (Exception e) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// throw new MallinkException(ErrorCode.DB_FAIL); -// } -// if (count >= coupon.getUseLimitQuantity()) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); -// throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); -// } -// -// // 检查用户已购买数量 -// try { -// count = getUserCouponOrderCount(user, coupon); -// } catch (Exception e) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// throw new MallinkException(ErrorCode.DB_FAIL); -// } -// if (count >= coupon.getUseLimitQuantity()) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); -// throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); -// } -// -// try { -// // 减库存 -// int num = wxCouponMapper.reduceInventory(coupon.getId(), 1); -// if (num <= 0) { -// logger.error("此券减库存失败, couponId: " + couponIdStr); -// throw new MallinkException(ErrorCode.ORDER_IS_FAIL); -// } -// } catch (RuntimeException e) { -// logger.error("此券减库存失败, couponId: " + couponIdStr); -// throw new MallinkException(ErrorCode.ORDER_IS_FAIL); -// } finally { -// // 解锁 -// redisLock.unlock(couponIdStr, timeStr); -// } -// } - - @Override - public void stockBack(WxOrder updateOrder) { - // 已取消/已退款,库存加1 - // 获取订单相关coupon - Long couponId = updateOrder.getProductId(); - String couponIdStr = "" + couponId; - //加锁 - long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; - String timeStr = String.valueOf(time); - - if (!redisLock.lock(couponIdStr, timeStr)) { - logger.error("此券被锁定, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); - } - WxCoupon coupon = null; - try { - coupon = wxCouponMapper.selectById(couponId,updateOrder.getTenantId()); - } catch (Exception e) { - logger.error("券未找到, e:" + e.getMessage()); - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - if (coupon == null) { - logger.error("券未找到, " + couponIdStr); - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - - try { - int num = wxCouponMapper.backInventory(coupon.getId(),coupon.getTenantId(), 1, coupon.getRemainInventory()); - if (num <= 0) { - logger.error("此券加库存失败, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券couponId:["+couponIdStr+"]库存回滚失败,更新记录条数小于等于0."); - } - redisLock.increase(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); - } catch (Exception e) { - logger.error("数据库更新失败,库存+1失败, e:" + e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "库存恢复失败"); - } finally { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - } - } - - /** - * 检查券商户是否可用 - * - * @param couponId - * @return - */ - private boolean isCouponMerchantValid(Long couponId,String tenantId) { - List merchantVoList = wxCouponMerchantMapper.findMerchantNameList(couponId,tenantId); - if (merchantVoList.stream().anyMatch((cm -> cm.getMerchantStatus().equals(EnumMerchantStatus.VALID.getCode())))) { - return true; - } - return false; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveMicroPayOrder(WxMerchantBUser user, String totalFeeStr,EnumPayWay payWay) { - // 检查用户 - if (user == null) { - logger.error("用户不存在"); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - - // 检查商户 - WxMerchant wxMerchant = wxMerchantMapper.selectById(user.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在, merchantId: " + user.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - if (wxMerchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) { - logger.error("商户已禁用, merchantId: " + user.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_VALID); - } - - WxOrder record = new WxOrder(); - - Date curr = new Date(); - - BigDecimal totalFee = new BigDecimal(totalFeeStr); - totalFee.setScale(2, BigDecimal.ROUND_HALF_UP); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入) - - int payment = totalFee.multiply(new BigDecimal(100)).intValue(); - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = "["+payWay.getMessage()+"("+payWay.getCode()+")]刷卡支付, 金额:" + totalFeeStr; - - record.setId(orderNumber); - record.updateTenantInfo(user); - record.setOrderNumber(orderNumber); - record.setType(EnumOrderType.MICROPAY.getCode()); - record.setProductId(user.getId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setTotalPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - - try { - // 保存订单 - wxOrderMapper.insert(record); - } catch (RuntimeException e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - return record; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveMicroPayOrderV2(WxMerchantBUser user, WxCUserBasicInfo cUser, Integer payment) { - // 检查用户 - if (user == null) { - logger.error("用户不存在"); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - - // 检查商户 - WxMerchant wxMerchant = wxMerchantMapper.selectById(user.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在, merchantId: " + user.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - if (wxMerchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) { - logger.error("商户已禁用, merchantId: " + user.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_VALID); - } - - WxOrder record = new WxOrder(); - - Date curr = new Date(); - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = "刷卡支付, 金额:" + payment; - - record.setId(orderNumber); - record.updateTenantInfo(user); - record.setOrderNumber(orderNumber); - record.setType(EnumOrderType.MICROPAY.getCode()); - record.setProductId(user.getId()); - if (cUser != null) { - record.setCUserId(cUser.getId()); - } - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setTotalPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - - try { - // 保存订单 - wxOrderMapper.insert(record); - } catch (RuntimeException e) { - logger.error("保存订单:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - return record; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveCardPayOrder(WxMerchant merchant, Long cUserId, String totalFeeStr, Integer payment,EnumPayWay payWay) { - Date curr = new Date(); - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = "["+payWay.getMessage()+"("+payWay.getCode()+")]C扫B储值卡支付, 金额:" + totalFeeStr; - - WxOrder record = new WxOrder(); - record.setId(orderNumber); - record.updateTenantInfo(merchant); - record.setOrderNumber(orderNumber); - record.setType(EnumOrderType.PREPAIDCARD.getCode()); - record.setProductId(merchant.getId()); - record.setCUserId(cUserId); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setTotalPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - - try { - // 保存订单 - wxOrderMapper.insert(record); - } catch (RuntimeException e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - return record; - } - - /** - * 创建 couponOrder - * - * @param user - * @param order - * @param coupon - */ - private WxCouponOrder createCouponOrder(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId,EnumPayWay payWay) { - Date curr = new Date(); - Date valid_date = null; - int limit_days = Constant.WX_LIMIT_DAYS; - WxPayAccount payAccount = null; - WxPayAccount payAccountQ = new WxPayAccount(); - payAccountQ.updateTenantInfo(order); - try { - payAccount = wxPayAccountMapper.selectOne(new QueryWrapper<>(payAccountQ)); - } catch (Exception e) { - logger.error("获取payAccount error: " + order.getTenantId()); - } - WxPayOrder payOrder = null; - if (coupon.getSalePrice() > 0) { - // 有价券获取payOrder,以备后续使用 - try { - WxPayOrder payOrderQ = new WxPayOrder(); - payOrderQ.updateTenantInfo(order); - payOrderQ.setOrderId(order.getId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); - payOrder = wxPayOrderMapper.selectOne(new QueryWrapper(payOrderQ)); - } catch (Exception e) { - logger.error("payOrder not found:" + e.getMessage()); - } - } - - if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode()) || - coupon.getType().equals(EnumCouponType.COUPON_TINGCHE.getCode())) { - - if( coupon.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())){ - valid_date = coupon.getPickEndDate(); - }else{ - valid_date = coupon.getValidEndDate(); - } - if (coupon.getSalePrice() > 0 && !coupon.checkIsCard()) { - if (payOrder != null && payOrder.getShareAmount() != null) { - // 分账有价券核销有效期不能大于分账过期时间 - Date limit_date = DateUtils.getTimeAfterDays(limit_days, curr); - if (valid_date.after(limit_date)) { - valid_date = limit_date; - } - } - } - } else { - if (coupon.getSalePrice() > 0 && !coupon.checkIsCard()) { - if (payOrder != null && payOrder.getShareAmount() != null) { - // 分账有价券核销有效期不能大于分账过期时间 - if (coupon.getValidDays() < Constant.WX_LIMIT_DAYS) { - limit_days = coupon.getValidDays(); - } - } - } else { - limit_days = coupon.getValidDays(); - } - valid_date = DateUtils.getTimeAfterDays(limit_days, curr); - } - boolean isCard = false; - // 检查是否是储值卡 - if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { - isCard = true; - } - //TODO 如果orderId已经存在,则不再添加 - WxCouponOrder couponOrderQ = new WxCouponOrder(); - couponOrderQ.setOrderId(order.getId()); - couponOrderQ.updateTenantInfo(order); - WxCouponOrder couponOrder = null; - List couponorderlist = wxCouponOrderMapper.findList(couponOrderQ); - if (null != couponorderlist && couponorderlist.size() > 0 ) { - couponOrder = couponorderlist.get(0); - }else { - final IdWorker idWorker = IdWorker.get(); - couponOrder = new WxCouponOrder(); - couponOrder.setId(idWorker.nextId()); - couponOrder.updateTenantInfo(order); - couponOrder.setCouponId(order.getProductId()); - couponOrder.setCouponType(coupon.getType()); - couponOrder.setCUserId(user.getId()); - couponOrder.setOwnerId(user.getId()); - couponOrder.setAutoRefund(coupon.getAutoRefund()); - couponOrder.setOrderId(order.getOrderNumber()); - couponOrder.setExpiredTime(valid_date); - //有支付信息,从支付信息中取渠道 - if (null != payOrder) { - couponOrder.setPayVendor(payOrder.getPayVendor()); - }else { - //免费券无需支付,如商户注券,核销发券,免费券等等 - couponOrder.setPayVendor(payWay.getCode()); - } - if (!isCard) { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - } else { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); - } - couponOrder.setCreateDate(curr); - couponOrder.setUpdateDate(curr); - couponOrder.setCouponPrice(order.getPayment()); - wxCouponOrderMapper.insert(couponOrder); - } - - /// 储值卡信息添加 - if (isCard) { - Integer fee = 0; - WxCardInfo cardInfo = new WxCardInfo(); - cardInfo.setId(couponOrder.getId()); - cardInfo.updateTenantInfo(order); - cardInfo.setCouponId(order.getProductId()); - cardInfo.setAmount(coupon.getPrice()); - cardInfo.setSaleAmount(coupon.getSalePrice()); - cardInfo.setRemainingAmount(coupon.getPrice()); - if (!coupon.checkIsFree()) { - //判断该transctionId是否已经存在,如果存在,则不添加 - WxCardInfo cardInfoq = new WxCardInfo(); - cardInfoq.setTransactionId(payOrder.getTransactionId()); - List cardInfoList = wxCardInfoMapper.findList(cardInfoq); - if (null != cardInfoList && cardInfoList.size() > 0) { - //do nothing - }else { - // 有价卡 - cardInfo.setTransactionId(payOrder.getTransactionId()); - if (payOrder.getShareAmount() != null) { - // 开启分账 - fee = payOrder.getPayAmount() - payOrder.getShareAmount(); - cardInfo.setShareFeeAmount(payOrder.getShareAmount()); - cardInfo.setRemainingShareFeeAmount(payOrder.getShareAmount()); - cardInfo.setRateAmount(payOrder.getRateAmount()); - } else { - // 未开启分账 - fee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRate(), false); - Integer shareAmount = payOrder.getPayAmount() - fee; - cardInfo.setShareFeeAmount(shareAmount); - cardInfo.setRemainingShareFeeAmount(shareAmount); - if (payAccount.getRealRate() != null) { - int iRealChargeFee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRealRate(), true); - if (fee > iRealChargeFee) { - cardInfo.setRateAmount(fee - iRealChargeFee); - } - } - } - } - } else { - // 免费卡 - cardInfo.setShareFeeAmount(0); - cardInfo.setRemainingShareFeeAmount(0); - cardInfo.setRateAmount(0); - if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { - WxCouponPassword updateCPwd = new WxCouponPassword(); - updateCPwd.setId(couponPasswordId); - updateCPwd.setCardId(cardInfo.getId()); - updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); - couponPasswordMapper.updateById(updateCPwd); - } - } - - cardInfo.setServiceFeeAmount(fee); - cardInfo.setCreateDate(curr); - cardInfo.setUpdateDate(curr); - cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - - //检查卡是否下架,如果是,不可转赠 - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); - if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { - cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); - } - wxCardInfoMapper.insert(cardInfo); - } - return couponOrder; - } - - /** - * 创建 couponOrder - * - * @param user - * @param order - * @param coupon - */ - private WxCouponOrder createCouponOrderForOuter(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId) { - Date curr = new Date(); - Date valid_date = null; - int limit_days = Constant.WX_LIMIT_DAYS; - if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode())) { - if( coupon.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())){ - valid_date = coupon.getPickEndDate(); - }else{ - valid_date = coupon.getValidEndDate(); - } - } else { - limit_days = coupon.getValidDays(); - valid_date = DateUtils.getTimeAfterDays(limit_days, curr); - } - boolean isCard = false; - // 检查是否是储值卡 - if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { - isCard = true; - } - final IdWorker idWorker = IdWorker.get(); - - WxCouponOrder couponOrder = new WxCouponOrder(); - couponOrder.setId(idWorker.nextId()); - couponOrder.updateTenantInfo(order); - couponOrder.setCouponId(order.getProductId()); - couponOrder.setCouponType(coupon.getType()); - couponOrder.setCUserId(user.getId()); - couponOrder.setOwnerId(user.getId()); - couponOrder.setAutoRefund(coupon.getAutoRefund()); - couponOrder.setOrderId(order.getOrderNumber()); - couponOrder.setExpiredTime(valid_date); - if (!isCard) { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - } else { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); - } - couponOrder.setCreateDate(curr); - couponOrder.setUpdateDate(curr); - couponOrder.setCouponPrice(order.getPayment()); - - wxCouponOrderMapper.insert(couponOrder); - - /// 储值卡信息添加 - if (isCard) { - WxPayOrder payOrder = null; - Integer fee = 0; - WxCardInfo cardInfo = new WxCardInfo(); - cardInfo.setId(couponOrder.getId()); - cardInfo.updateTenantInfo(order); - cardInfo.setCouponId(order.getProductId()); - cardInfo.setAmount(coupon.getPrice()); - cardInfo.setSaleAmount(coupon.getSalePrice()); - cardInfo.setRemainingAmount(coupon.getPrice()); - - // 不论有价免费卡, 钱是线下支付, 所以不设分账 - cardInfo.setShareFeeAmount(0); - cardInfo.setRemainingShareFeeAmount(0); - cardInfo.setRateAmount(0); - if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { - WxCouponPassword updateCPwd = new WxCouponPassword(); - updateCPwd.setId(couponPasswordId); - updateCPwd.setCardId(cardInfo.getId()); - updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); - couponPasswordMapper.updateById(updateCPwd); - } - - cardInfo.setServiceFeeAmount(fee); - cardInfo.setCreateDate(curr); - cardInfo.setUpdateDate(curr); - cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - - //检查卡是否下架,如果是,不可转赠 - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); - if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { - cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); - } - wxCardInfoMapper.insert(cardInfo); - } - return couponOrder; - } - - @Override - @Transactional(propagation = Propagation.NESTED, readOnly = false, rollbackFor = {Exception.class}) - public WxCouponOrder sendFreeCouponToUser(Long userId,TenantEntity tenantinfo, Long couponId, WxCouponSendVo wxCouponSendVo,EnumPayWay payWay) { - // check 用户状态 - WxCUserBasicInfo user = null; - try { - user = wxCUserBasicInfoMapper.selectById(userId,tenantinfo.getFinalTenantId()); - } catch (Exception e) { - logger.error("userId : " + userId + ", e: " + e.getMessage(),e); - } - if (user == null) { - logger.error("用户不存在, userId: " + userId); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - - // 检查券状态 - String couponIdStr = String.valueOf(couponId); - WxCoupon coupon = wxCouponMapper.selectById(couponId,tenantinfo.getTenantId()); - if (coupon == null) { - logger.error("券不存在, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { - logger.error("券已下架, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF.getCode(), coupon.getTitle() + ErrorCode.COUPON_IS_TAKE_OFF.getMessage()); - } - if (coupon.getSalePrice() != 0) { - logger.error("券不免费, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.COUPON_IS_NOT_FREE.getCode(), coupon.getTitle() + ErrorCode.COUPON_IS_NOT_FREE.getMessage()); - } - - if (Objects.nonNull(wxCouponSendVo) && Objects.equals(EnumCouponSendSendType.MERCHANT.getCode(), wxCouponSendVo.getSendType())) { - // 商户注券减库存操作 - try { - stockMerchantReduce(user, coupon, couponIdStr, wxCouponSendVo); - }catch(Exception e) { - throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage()); - } - } else { - // 减库存操作 - try { - stockReduce(user, coupon, couponIdStr); - }catch(Exception e) { - throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage()); - } - } - - int payment = coupon.getSalePrice(); - - Date curr = new Date(); - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = coupon.getTitle() + "/" + coupon.getSubTitle(); - - WxOrder record = new WxOrder(); - record.setId(orderNumber); - record.updateTenantInfo(coupon); - record.setOrderNumber(orderNumber); - record.setProductId(couponId); - record.setType(EnumOrderType.COUPON.getCode()); - record.setCUserId(user.getId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - - // 保存订单 - try { - wxOrderMapper.insert(record); - } catch (Exception e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(), coupon.getTitle() + ErrorCode.ORDER_SAVE_ERR.getMessage()); - } - - // 创建couponOrder - WxCouponOrder couponOrder = null; - try { - couponOrder = createCouponOrder(record, user, coupon, null,payWay); - } catch (Exception e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR.getCode(), coupon.getTitle() + ErrorCode.COUPON_ORDER_SAVE_ERR.getMessage()); - } - - return couponOrder; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public int couponOrderSuccess(WxOrder updateOrder) { - Date currentDate = new Date(); - // 检查券相关 - WxCoupon coupon = wxCouponMapper.selectById(updateOrder.getProductId(),updateOrder.getTenantId()); - if (coupon == null) { - logger.error("券不存在, couponId: " + updateOrder.getProductId()); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - // 检查用户 - WxCUserBasicInfo user = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); - if (user == null) { - logger.error("用户不存在, userId: " + updateOrder.getCUserId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - // 已支付,更新支付时间 - WxOrder updateT = new WxOrder(); - updateT.setId(updateOrder.getId()); - updateT.setPaymentTime(currentDate); - updateT.updateTenantInfo(updateOrder); - //拼团到此处为已完成状态 - if (updateOrder.getOrderGroupId().equals(0L)) { - updateT.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - } else { - // 拼团设为已完成状态 - updateT.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - } - updateT.setUpdateDate(currentDate); - int ret = 0; - try { - ret = wxOrderMapper.updateById(updateT); - } catch (Exception e) { - logger.error("订单更新失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); - } - - // 创建couponOrder - try { - createCouponOrder(updateOrder, user, coupon, null,null); - } catch (Exception e) { - logger.error("创建券包:" + e.getMessage()); - throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); - } - - - return ret; - } - - private void sendInsideOrderSuccessMsg(WxOrder updateOrder, WxCoupon coupon, WxCUserBasicInfo user) { - FmInsideOrderSuccessMsg orderSuccess = new FmInsideOrderSuccessMsg(); - orderSuccess.setMsgType(EnumMsgRecordType.INSIDE_ORDER_SUCCESS.getCode()); - orderSuccess.updateTenantInfo(updateOrder); - orderSuccess.setOrderId(updateOrder.getId()); - orderSuccess.setCUserId(user.getId()); - orderSuccess.setCouponId(coupon.getId()); - logger.info(">>>>>>>>>>>send sendInsideOrderSuccessMsg :"+orderSuccess); - mqBaseProducer.sendMessage(orderSuccess, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); - } - - @Override - public void sendOrderSuccessActionMsg(WxOrder updateOrder) { - // 检查券相关 - WxCoupon coupon = wxCouponMapper.selectById(updateOrder.getProductId(),updateOrder.getTenantId()); - if (coupon == null) { - logger.error("券不存在, couponId: " + updateOrder.getProductId()); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } -// if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { -// logger.error("券已下架, couponId: " + updateOrder.getProductId()); -// throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF); -// } - // 检查用户 - WxCUserBasicInfo basicUser = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); - if (basicUser == null) { - logger.error("会员不存在, userId: " + updateOrder.getCUserId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } -// WxCUser user = wxCUserMapper.selectById(updateOrder.getCUserId()); -// if (user == null) { -// logger.error("用户不存在, userId: " + updateOrder.getCUserId()); -// throw new MallinkException(ErrorCode.USER_IS_EMPTY); -// } - - // 记录活动 - JSONObject jo = null; - try { - jo = JSONObject.parseObject(coupon.getConditions()); - } catch (Exception e) { - logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage()); - e.printStackTrace(); - } - if (jo != null) { - if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()) { - wxCUserBasicInfoMapper.incActRecordById(basicUser.getId(),coupon.getFinalTenantId()); - } - } - - sendInsideOrderSuccessMsg(updateOrder, coupon, basicUser); - } - - /** - * 下订单后操作 - * - * @param updateOrder - * @param coupon - * @param user - */ - public void actionAfterCouponOrderSuccess(WxOrder updateOrder, WxCoupon coupon, WxCUserBasicInfo user) { - /// TODO 晚上会定时打一下tag - wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_BUY, user,updateOrder); - - // 交易发券 - try { - wxCouponSendService.sendCouponToUser(EnumCouponSendSendType.C_ORDER, updateOrder,EnumPayWay.PAY_WAY_NOT_UNPAY_TRADE); - } catch (Exception e) { - logger.error("订单发券:" + e.getMessage()); - } - - } - - @Override - public Map summary(WxOrderQueryVo wxOrderQueryVo) { - List listOrder = wxOrderMapper.findListOrder(wxOrderQueryVo); - Long payment = listOrder.stream().collect(Collectors.summingLong(WxOrder::getPayment)); - Long pay = listOrder.stream().collect(Collectors.summingLong(WxOrder::getPay)); - Map data = new HashMap<>(); - data.put("payment", payment); - data.put("pay", pay); - return data; - } - - @Override - public void exportData(WxOrderQueryVo wxOrderQueryVo, HttpServletRequest request, HttpServletResponse response) { - List list = wxOrderMapper.findListOrder(wxOrderQueryVo); - Map summary = summary(wxOrderQueryVo); - Long payment = summary.get("payment"); - Long pay = summary.get("pay"); - String paymentStr = new BigDecimal(payment).divide(new BigDecimal(100)).toPlainString(); - String payStr = new BigDecimal(pay).divide(new BigDecimal(100)).toPlainString(); - WxOrder order = new WxOrder(); - order.setPayStr("支付总金额(元): " + payStr); - order.setPaymentStr("订单总金额(元): " + paymentStr); - order.setOrderStatus(-1); - order.setAttribute(-1); - list.add(order); - excelService.exportExcel(list, null, "线上交易", WxOrder.class, "线上交易.xlsx", response, false); - } - - /** - * 积分设置来源商户 - */ - private void setMerchantId(WxCoupon coupon, WxCreditHistory creditHistory) { - WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); - wxCouponMerchant.setProductId(coupon.getId()); - wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); - List list = wxCouponMerchantMapper.findList(wxCouponMerchant); - if (list != null && list.size() > 0) { - if (list.size() == 1) { - creditHistory.setMerchantId(list.get(0).getMerchantId()); - } - if (list.size() > 1) { - creditHistory.setMerchantId(Long.valueOf(EnumMerchantType.MERCHANT_MORE.getCode())); - } - } - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public int microPayOrderSuccess(WxOrder updateOrder) { - Date currentDate = new Date(); - // C端用户 - WxCUserBasicInfo user = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); - if (user == null) { - logger.error("用户不存在, userId: " + updateOrder.getCUserId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - // B端用户 - WxMerchantBUser bUser = wxMerchantBUserMapper.selectById(updateOrder.getProductId()); - if (bUser == null) { - logger.error("B端用户不存在, bUserId: " + updateOrder.getProductId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - // 基于B端User查找merchant - WxMerchant wxMerchant = wxMerchantMapper.selectById(bUser.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在, merchantId: " + bUser.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - // 已支付,更新支付时间 - updateOrder.setPaymentTime(currentDate); - updateOrder.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - updateOrder.setUpdateDate(currentDate); - int ret = 0; - try { - ret = wxOrderMapper.updateById(updateOrder); - } catch (Exception e) { - logger.error("订单更新失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); - } - - // 成长值 计算 - try { - wxScoreRulesService.addScore2(bUser,EnumScoreType.CONSUMPTION, updateOrder, wxMerchant.getBusinessId()); - } catch (Exception e) { - logger.error("成长值:" + e.getMessage()); - } - // 积分 计算 - try { - //扣减积分操作记录 - WxCreditHistory creditHistory = new WxCreditHistory(); - creditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode()); - creditHistory.setOperatorId(user.getId()); - creditHistory.setCUserId(user.getId()); - creditHistory.setCreateDate(new Date()); -// creditHistory.updateTenantInfo(wxMerchant); - creditHistory.setTenantId(wxMerchant.getFinalTenantId()); - creditHistory.setFinalTenantId(wxMerchant.getFinalTenantId()); - creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode()); - creditHistory.setBusinessId(wxMerchant.getBusinessId()); - creditHistory.setSpend(updateOrder.getPayment()); - creditHistory.setMerchantId(wxMerchant.getId()); - if (updateOrder.getCouponChannelId() != null) { - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(updateOrder.getCouponChannelId(),updateOrder.getTenantId()); - creditHistory.setCouponId(wxCouponChannel.getCouponId()); - - } - - creditHistory.setChangePurpose("付款码消费:消费商户["+wxMerchant.getName()+"] 金额["+creditHistory.getSpendStr()+"元]"); - - - wxCreditHistoryService.saveOrUpdate(creditHistory,wxMerchant.getTenantId()); - } catch (Exception e) { - logger.error("积分值:" + e.getMessage()); - } - - return ret; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public int updateOrderStatus(WxOrder updateOrder, EnumOrderStatus enumOrderStatus) { - Date currentDate = new Date(); - WxOrder oldOrder = wxOrderMapper.selectById(updateOrder.getId(),updateOrder.getTenantId()); - if (!oldOrder.getOrderStatus().equals(enumOrderStatus.getCode())) { - // 状态已更新,库存不退回, 保证不会多退 - switch (enumOrderStatus) { - case ORDER_STATUS_OVERTIME_CANCEL: // 支付取消,库存退回 - case ORDER_STATUS_REFUND_SUCCESS: // 退款成功,库存退回 - case ORDER_STATUS_COOPERATING_OVERTIME: // 拼团超时,退库存 - case ORDER_STATUS_COOPERATING_CANCEL: // 拼团取消,退库存 - case ORDER_STATUS_COOPERATING_COMPLETE: // 拼团完成,退库存 - { - try { - stockBack(updateOrder); - } catch (Exception e) { - logger.error("库存+1失败, e:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.REMAIN_BACK_FAIL); - } - break; - } - } - } - WxOrder refOrder = new WxOrder(); - refOrder.setId(updateOrder.getId()); - refOrder.setOrderStatus(enumOrderStatus.getCode()); - refOrder.setUpdateDate(currentDate); - refOrder.updateTenantInfo(updateOrder); - int ret = 0; - try { - ret = wxOrderMapper.updateById(refOrder); - } catch (Exception e) { - logger.error("订单状态更新失败, e:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); - } - return ret; - } - - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void updateOrderStatus(WxOrder updateOrder) { - if (updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()) || - updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_CANCEL.getCode()) || - updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()) || - updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()) || - updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_BREAK.getCode())) { - try { - stockBack(updateOrder); - } catch (Exception e) { - logger.error("拼团库存+1失败, e:" + e.getMessage()); - throw new MallinkException(ErrorCode.REMAIN_BACK_FAIL); - } - } - } - - @Override - public void updateOrderGroupStatusByCouponId(Long couponId, TenantEntity tenantEntity, Integer orderStatus) { - WxOrder updateOrder = new WxOrder(); - updateOrder.updateTenantInfo(tenantEntity); - updateOrder.setOrderStatus(orderStatus); - updateOrder.setProductId(couponId); - updateOrder.setUpdateDate(new Date()); - wxOrderMapper.updateOrderGroupStatusByCouponId(updateOrder); - } - - @Override - public void updateOrderGroupStatusByCouponChannelId(Long couponChannelId, TenantEntity tenantEntity, Integer orderStatus) { - WxOrder updateOrder = new WxOrder(); - updateOrder.updateTenantInfo(tenantEntity); - updateOrder.setOrderStatus(orderStatus); - updateOrder.setCouponChannelId(couponChannelId); - updateOrder.setUpdateDate(new Date()); - wxOrderMapper.updateOrderGroupStatusByCouponChannelId(updateOrder); - } - - /** - * 微信关闭订单 - */ - @Override - public ResultData orderClose(WxOrder order,EnumPayWay payWay) { - // 1. get c appid - WxAppinfo appInfo = wxAppinfoService.getCAppInfo(order,payWay); - // 2. get pay order - WxPayOrder payOrderQ = new WxPayOrder(); - payOrderQ.updateTenantInfo(order); - payOrderQ.setOrderId(order.getId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - List payOrders = wxPayOrderMapper.selectList(new QueryWrapper(payOrderQ)); - - // 3. wx pay order close - for (WxPayOrder payOrder : payOrders) { - try { - wxPayOrderService.payOrderClose(appInfo, payOrder); - } catch (Exception e) { - logger.error("微信关单失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR); - } - } - - return new ResultData(); - } - - @Override - public WxOrder getById(Long id,String tenantId) { - return wxOrderMapper.selectById(id,tenantId); - } - - @Override - public WxOrder getPressOrderById(Long id,String tenantId) { - return wxOrderMapper.selectById(id,tenantId); - } - - @Override - public void saveOrUpdate(WxOrder record) { - if (record.getId() == null) { - //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); - final IdWorker idWorker = IdWorker.get(); - record.setId(idWorker.nextId()); - wxOrderMapper.insert(record); - } else { - wxOrderMapper.updateById(record); - } - } - -// @Override -// public void deleteById(Long id) { -// wxOrderMapper.deleteById(id); -// } - - @Override - public List findList(WxOrder record) { - return wxOrderMapper.findList(record); - } - - @Override - public PageInfo listCUserVoAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfCUser(record)); - } - - @Override - public WxOrderCouponVo detailCUserVo(WxOrder record) { - List list = wxOrderMapper.selectDetailOfCUser(record); - if (list.size() > 0) { - return list.get(0); - } - return null; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void shareForMicroPay(TenantEntity tenantEntity, Long orderId, Long payOrderId,EnumPayWay payWay) { - // 微信分账 - try { - WxPayOrder wxPayOrder = new WxPayOrder(); - wxPayOrder.updateTenantInfo(tenantEntity); - wxPayOrder.setId(payOrderId); - wxPayOrder.setOrderId(orderId); - wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); - wxPayOrder = wxPayOrderMapper.selectOne(new QueryWrapper(wxPayOrder)); - WxOrder wxOrder = wxOrderMapper.selectById(orderId,tenantEntity.getTenantId()); - WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(wxOrder.getProductId()); - - if (wxPayOrder != null && wxMerchantBUser != null && - wxPayOrder.getShare().equals(EnumPayShare.YES.getCode())) { - WxSharingOrderDto sharingOrder = new WxSharingOrderDto(); - sharingOrder.setCUserId(wxPayOrder.getCUserId()); - sharingOrder.setMerchantId(wxMerchantBUser.getMerchantId()); - sharingOrder.setType(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getCode()); - sharingOrder.setPayAmount(wxPayOrder.getPayAmount()); - sharingOrder.setRateAmount(wxPayOrder.getRateAmount()); - sharingOrder.setOrderId(wxPayOrder.getId()); - sharingOrder.setPayTimeStart(wxPayOrder.getPayTimeStart()); - sharingOrder.setPayTimeEnd(wxPayOrder.getPayTimeEnd()); - sharingOrder.updateTenantInfo(wxPayOrder); - sharingOrder.setTransactionId(wxPayOrder.getTransactionId()); - sharingOrder.setShareAmount(wxPayOrder.getShareAmount()); - ResultData resultData = wxProfitSharingOrderService.createSharingOrder(sharingOrder,payWay.getCode()); - } else { - logger.error("微信分账: 未找到payorder or merchant at orderid-" + orderId); - } - } catch (MallinkException e) { - logger.error("微信分账: " + e.getMessage()); - } - } - - @Override - public PageInfo listOrderAsPage(WxOrderQueryVo record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOrder(record)); - } - - @Override - public Map queryOrderSummary(TenantEntity tenantEntity) { - Map result = new HashMap<>(); - queryOrderCount(tenantEntity, result); - queryOrderSummary(tenantEntity, result); - return result; - } - - @Deprecated - public void queryMerchantCount(TenantEntity tenantEntity, Map result) { - String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); - //全部商户个数 - Map params = new HashMap<>(); - params.put("tenantId", tenantEntity.getTenantId()); - if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { - params.put("parentTenantId", tenantEntity.getParentTenantId()); - } - String thirtyTime = DateUtils.getTimeBefore(29, new Date()); - params.put("startdate", thirtyTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - Long allMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); - result.put("allMerchantCount", allMerchantCount); - //今日 - params.put("startdate", systemTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - Long todayMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); - result.put("todayMerchantCount", todayMerchantCount); - //昨日 - String yesterday = DateUtils.getTimeBefore(1, new Date()); - params.put("startdate", yesterday + " 00:00:00"); - params.put("enddate", yesterday + " 23:59:59"); - Long yesterdayMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); - result.put("yesterdayMerchantCount", yesterdayMerchantCount); - //上周 - String lastweek = DateUtils.getTimeBefore(7, new Date()); - params.put("startdate", lastweek + " 00:00:00"); - params.put("enddate", lastweek + " 23:59:59"); - Long lastweekMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); - result.put("lastweekMerchantCount", lastweekMerchantCount); - //商户数日环比 - if (yesterdayMerchantCount > 0) { - double hbd = (double) (todayMerchantCount - yesterdayMerchantCount) / yesterdayMerchantCount * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentMerchant", hb + "%"); - } else { - result.put("increasedPercentMerchant", "--"); - } - //商户数周同比 - if (lastweekMerchantCount > 0) { - double hbd = (double) (todayMerchantCount - lastweekMerchantCount) / lastweekMerchantCount * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentWeekMerchant", hb + "%"); - } else { - result.put("increasedPercentWeekMerchant", "--"); - } - } - - public void queryOrderSummary(TenantEntity tenantEntity, Map result) { - String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); - //总数 - Map params = new HashMap<>(); - params.put("tenantId", tenantEntity.getTenantId()); - if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { - params.put("parentTenantId", tenantEntity.getParentTenantId()); - } - String thirtyTime = DateUtils.getTimeBefore(29, new Date()); - params.put("startdate", thirtyTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - params.put("order_status", "1"); - Long allPayOrderSummary = wxOrderMapper.queryOrderForSum(params); - params.put("order_status", "4"); - Long allRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); - result.put("allRefundOrderSummary", allRefundOrderSummary); - Long allOrderSummary = allPayOrderSummary - allRefundOrderSummary; - result.put("allOrderSummary", allPayOrderSummary); - //今日 - params.put("startdate", systemTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - params.put("order_status", "1"); - Long todayPayOrderSummary = wxOrderMapper.queryOrderForSum(params); - params.put("order_status", "4"); - Long todayRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); - result.put("todayRefundOrderSummary", todayRefundOrderSummary); - result.put("todayOrderSummary", todayPayOrderSummary); - //昨日 - String yesterday = DateUtils.getTimeBefore(1, new Date()); - params.put("startdate", yesterday + " 00:00:00"); - params.put("enddate", yesterday + " 23:59:59"); - params.put("order_status", "1"); - Long yesterdayPayOrderSummary = wxOrderMapper.queryOrderForSum(params); - params.put("order_status", "4"); - Long yesterdayRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); - result.put("yesterdayRefundOrderSummary", yesterdayRefundOrderSummary); - result.put("yesterdayOrderSummary", yesterdayPayOrderSummary); - //上周 - String lastweek = DateUtils.getTimeBefore(7, new Date()); - params.put("startdate", lastweek + " 00:00:00"); - params.put("enddate", lastweek + " 23:59:59"); - params.put("order_status", "1"); - Long lastweekPayOrderSummary = wxOrderMapper.queryOrderForSum(params); - params.put("order_status", "4"); - Long lastweekRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); - result.put("lastweekRefundOrderSummary", lastweekRefundOrderSummary); - result.put("lastweekOrderSummary", lastweekPayOrderSummary); - //商户数日环比 - if (yesterdayPayOrderSummary > 0) { - double hbd = (double) (todayPayOrderSummary - yesterdayPayOrderSummary) / yesterdayPayOrderSummary * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentSummary", hb + "%"); - } else { - result.put("increasedPercentSummary", "--"); - } - //商户数周同比 - if (lastweekPayOrderSummary > 0) { - double hbd = (double) (todayPayOrderSummary - lastweekPayOrderSummary) / lastweekPayOrderSummary * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentWeekSummary", hb + "%"); - } else { - result.put("increasedPercentWeekSummary", "--"); - } - } - - public void queryOrderCount(TenantEntity tenantEntity, Map result) { - String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); - //总数 - Map params = new HashMap<>(); - params.put("tenantId", tenantEntity.getTenantId()); - if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { - params.put("parentTenantId", tenantEntity.getParentTenantId()); - } - String thirtyTime = DateUtils.getTimeBefore(29, new Date()); - params.put("startdate", thirtyTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - Long allOrderCount = wxOrderMapper.queryOrderForCount(params); - result.put("allOrderCount", allOrderCount); - //今日 - params.put("startdate", systemTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - Long todayOrderCount = wxOrderMapper.queryOrderForCount(params); - result.put("todayOrderCount", todayOrderCount); - //昨日 - String yesterday = DateUtils.getTimeBefore(1, new Date()); - params.put("startdate", yesterday + " 00:00:00"); - params.put("enddate", yesterday + " 23:59:59"); - Long yesterdayOrderCount = wxOrderMapper.queryOrderForCount(params); - result.put("yesterdayOrderCount", yesterdayOrderCount); - //上周 - String lastweek = DateUtils.getTimeBefore(7, new Date()); - params.put("startdate", lastweek + " 00:00:00"); - params.put("enddate", lastweek + " 23:59:59"); - Long lastweekOrderCount = wxOrderMapper.queryOrderForCount(params); - result.put("lastweekOrderCount", lastweekOrderCount); - //订单数日环比 - if (yesterdayOrderCount > 0) { - double hbd = (double) (yesterdayOrderCount - yesterdayOrderCount) / yesterdayOrderCount * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentCount", hb + "%"); - } else { - result.put("increasedPercentCount", "--"); - } - //订单数周同比 - if (lastweekOrderCount > 0) { - double hbd = (double) (yesterdayOrderCount - lastweekOrderCount) / lastweekOrderCount * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentWeekCount", hb + "%"); - } else { - result.put("increasedPercentWeekCount", "--"); - } - } - - /** - * 砍价 - */ - @Override - public PageInfo listPressVoAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfPress(record)); - } - - @Override - public WxOrderCouponPressVo detailPressVo(WxOrder record) { - WxOrderCouponPressVo pressVo = wxOrderMapper.selectDetailOfPress(record); - if (null != pressVo) { - Map paramMap = new HashMap(); - paramMap.put("orderId", record.getId()); - paramMap.put("tenantId", record.getTenantId()); - paramMap.put("finalTenantId", record.getFinalTenantId()); - pressVo.setOrderPressList(wxOrderPressMapper.findPressList(paramMap)); - } - return pressVo; - } - - @Override - public void updateStatusByPressCouponId(Long couponId, TenantEntity tenantEntity, int orderStatus) { - WxOrder updateOrder = new WxOrder(); - updateOrder.updateTenantInfo(tenantEntity); - updateOrder.setOrderStatus(orderStatus); - updateOrder.setProductId(couponId); - updateOrder.setUpdateDate(new Date()); - wxOrderMapper.updateStatusByPressCouponId(updateOrder); - } - - @Autowired - @Qualifier("cUserBasicInfoRedisTemplate") - RedisTemplate cUserBasicInfoRedisTemplate; - - - - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId,EnumPayWay payWay) { - // 1. check user info and coupon info - userCouponMerchantCheck(user, coupon); - if (coupon.checkIsCreditCoupon()) { - //若用户剩余积分比积分售价低则不能支付 - if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { - throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); - } - } - // 2. 减库存操作 - String couponIdStr = String.valueOf(coupon.getId()); - stockReduce(user, coupon, couponIdStr); - - // 3. 当积分券或者积分停车券时 则进行积分支付 - Integer orderType; - if (coupon.checkIsCreditCoupon()) { - creditPay(user, coupon); - orderType = EnumOrderType.CREDIT.getCode(); - } else { - orderType = EnumOrderType.COUPON.getCode(); - } - - // 4. 保存Order - WxOrder record = new WxOrder(); - record.setCouponChannelId(couponChannelId); - record.setType(orderType); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(0); - record.setFormId(formId); - record.setOrderGroupId(0L); - try { - saveFreeOrder(record, user, coupon); - } catch (Exception e) { - logger.error("下订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - - // 5. 创建couponOrder - try { - createCouponOrder(record, user, coupon, couponPasswordId,payWay); - } catch (Exception e) { - logger.error("couponOrder失败:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); - } - return record; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public Long saveOuterOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) { - // 1. check user info and coupon info - userCouponMerchantCheck(user, coupon); - if (coupon.checkIsCreditCoupon()) { - //若用户剩余积分比积分售价低则不能支付 - if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { - throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); - } - } - // 2. 减库存操作 - String couponIdStr = String.valueOf(coupon.getId()); - stockReduce(user, coupon, couponIdStr); - - // 3. 当积分券或者积分停车券时 则进行积分支付 - Integer orderType; - if (coupon.checkIsCreditCoupon()) { - creditPay(user, coupon); - orderType = EnumOrderType.CREDIT.getCode(); - } else { - orderType = EnumOrderType.COUPON.getCode(); - } - - // 4. 保存Order - WxOrder record = new WxOrder(); - record.setCouponChannelId(couponChannelId); - record.setType(orderType); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(0); - record.setFormId(formId); - record.setOrderGroupId(0L); - try { - saveFreeOrder(record, user, coupon); - } catch (Exception e) { - logger.error("下订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - - // 5. 创建couponOrder - try { - WxCouponOrder couponOrder = createCouponOrderForOuter(record, user, coupon, couponPasswordId); - return couponOrder.getId(); - } catch (Exception e) { - logger.error("couponOrder失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); - } - } - - /** - * 保存订单-免费 - * - * @param record - * @param user - * @param coupon - */ - private void saveFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon) { - Date curr = new Date(); - // body - String bodyStr = ""; - try { - bodyStr = Utility.substring(coupon.getTitle(), Math.min(62, coupon.getTitle().getBytes().length), "utf-8"); - } catch (Exception e) { - logger.error("body:" + e.getMessage()); - bodyStr = "券" + '-' + EnumCouponType.getEnum(coupon.getType()); - } - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - record.setId(orderNumber); - record.updateTenantInfo(coupon); - record.setOrderNumber(orderNumber); - record.setProductId(coupon.getId()); - record.setCUserId(user.getId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - // 保存订单 - wxOrderMapper.insert(record); - } - - private void userCouponMerchantCheck(WxCUserBasicInfo user, WxCoupon coupon) throws MallinkException { - // 检查用户 - if (user == null) { - logger.error("用户不存在"); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - // 检查券 - if (coupon == null) { - logger.error("券不存在"); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - // 检查券状态 - if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { - logger.error("券已下架, couponId: " + coupon.getId()); - throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID); - } - // 检查券商户信息 - if (!isCouponMerchantValid(coupon.getId(),coupon.getTenantId())) { - logger.error("商户不存在, couponId: " + coupon.getId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - // 检查 优惠券 库存 - if (coupon.getRemainInventory() <= 0) { - logger.error("此券库存为0, couponId: " + coupon.getId()); - throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); - } - } - - private void creditPay(WxCUserBasicInfo user, WxCoupon coupon) { - //-------此处为【积分支付】记录增加积分操作------- - WxCreditHistory creditHistory = new WxCreditHistory(); - creditHistory.setCreditNum(coupon.getCreditPrice()); - creditHistory.setCUserId(user.getId()); -// creditHistory.updateTenantInfo(coupon); - creditHistory.setTenantId(coupon.getFinalTenantId()); - creditHistory.setFinalTenantId(coupon.getFinalTenantId()); - creditHistory.setCreditType(EnumScoreType.CHANGE_CREDIT.getCode()); - - creditHistory.setCouponId(coupon.getId()); - //如果券与商户一对一 则直接将消费商户更新为此商户 若一对多 则消费商户显示多商户 - setMerchantId(coupon, creditHistory); - //记录操作人类型 操作人id - if (user.getOperatorType() == EnumUserType.MALLUSER.getCode()) { - creditHistory.setOperatorType(EnumUserType.MALLUSER.getCode()); - creditHistory.setOperatorId(user.getOperatorId()); - creditHistory.setChangePurpose("管理端积分兑换"+"["+coupon.getTitle()+"]"); - } else { - creditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode()); - creditHistory.setOperatorId(user.getId()); - creditHistory.setChangePurpose("积分兑换"+"["+coupon.getTitle()+"]"); - } - - wxCreditHistoryService.saveOrUpdate(creditHistory,coupon.getTenantId()); - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveNoFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, boolean isPress, Long orderGroupId, String formId) { - // 1. check user info and coupon info - userCouponMerchantCheck(user, coupon); - if (coupon.checkIsCreditCoupon()) { - //若用户剩余积分比积分售价低则不能支付 - if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { - throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); - } - } - - // 2. 拼团检查 - if (isOrderGroup(orderGroupId)) { - checkOrderGroup(user, orderGroupId,coupon); - } - String couponIdStr = String.valueOf(coupon.getId()); - // 3. 减库存操作 - stockReduce(user, coupon, couponIdStr); - - // 3. 当积分券或者积分停车券时 则进行积分支付 - Integer orderType; - if (coupon.checkIsCreditCoupon()) { - creditPay(user, coupon); - orderType = EnumOrderType.CREDIT.getCode(); - } else { - orderType = EnumOrderType.COUPON.getCode(); - } - - // 4. 保存订单 - Long orderNumber; - // 4.1 券价格 - int payment = coupon.getSalePrice(); - Integer orderStatus = EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode(); - if (isPress || coupon.getType().equals(EnumCouponType.COUPON_PRESS.getCode())) { - // 砍价券 初始是全价即面额 - payment = coupon.getPrice(); - } - if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) { - if (orderGroupId == null) { - // 拼团券 初始是全价即面额 - payment = coupon.getPrice(); - } else { - orderStatus = EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode(); - } - } - - // 4.2 保存订单 - WxOrder record = new WxOrder(); - record.setType(orderType); - record.setCouponChannelId(couponChannelId); - record.setOrderGroupId(orderGroupId); - record.setFormId(formId); - record.setPayment(payment); - record.setOrderStatus(orderStatus); - try { - orderNumber = saveNoFreeOrder(record, user, coupon, isPress); - } catch (Exception e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - - if (isPress) { - // 5. 第一次砍价 - try { - firstPress(record, user, coupon, orderNumber); - } catch (Exception e) { - logger.error("第一次砍价失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - } - return record; - } - - /** - * 初始砍价 - * - * @param record - * @param user - * @param coupon - * @param orderNumber - */ - private void firstPress(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, Long orderNumber) { - // 保存砍价信息 - int total = coupon.getPrice() - coupon.getSalePrice(); - int left_total = total; - WxOrderPress orderPress = new WxOrderPress(); - orderPress.setId(IdWorker.get().nextId()); - orderPress.updateTenantInfo(coupon); - orderPress.setCouponId(record.getProductId()); - orderPress.setOrderId(orderNumber); - orderPress.setUserId(user.getId()); - orderPress.setCreateDate(new Date()); - orderPress.setFirst(EnumOrderPressType.FIRST.getCode()); - int lPressValue = PressUtils.stateLessPressValue(total, left_total, coupon.getPressLimitNum(), 0); - orderPress.setPressValue(lPressValue); - wxOrderPressMapper.insert(orderPress); - // 更新订单砍价信息 - WxOrder orderUpdatePress = new WxOrder(); - orderUpdatePress.setId(record.getId()); - orderUpdatePress.setPressCurrentNum(1); - orderUpdatePress.setPressCurrentValue(left_total - orderPress.getPressValue()); - orderUpdatePress.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); - orderUpdatePress.setUpdateDate(new Date()); - wxOrderMapper.updateById(orderUpdatePress); - } - - private Long saveNoFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, boolean isPress) { - Long orderNumber; - Date curr = new Date(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = ""; - try { - bodyStr = Utility.substring(coupon.getTitle(), Math.min(62, coupon.getTitle().getBytes().length), "utf-8"); - } catch (Exception e) { - logger.error("body:" + e.getMessage()); - bodyStr = "券-" + EnumCouponType.getEnum(coupon.getType()).getMessage(); - } - final IdWorker idWorker = IdWorker.get(); - orderNumber = idWorker.nextId(); - record.setId(orderNumber); - record.updateTenantInfo(coupon); - record.setOrderNumber(orderNumber); - record.setProductId(coupon.getId()); - //record.setType(EnumOrderType.COUPON.getCode()); - record.setCUserId(user.getId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setUpdateDate(curr); - record.setCreateDate(curr); - if (isPress) { - // 初始砍价信息 - record.setPressCurrentNum(0); - // 砍价券过期时间取券的过期时间和砍价限制时间中时间小的那个 - Date pressEndDate = DateUtils.getHourTimeAfter(coupon.getPressLimitHours(), new Date()); - if (pressEndDate.after(coupon.getValidEndDate())) - pressEndDate = coupon.getValidEndDate(); - record.setPressEndDate(pressEndDate); - record.setPressCurrentValue(coupon.getPrice() - coupon.getSalePrice()); - } - wxOrderMapper.insert(record); - return orderNumber; - } - - private void checkOrderGroup(WxCUserBasicInfo user, Long orderGroupId,WxCoupon coupon) { - WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId,coupon.getTenantId()); - if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) { - logger.error("下订单拼团人数已满>>>" + orderGroupId); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED); - } - - if (group.getRemainPeople()<=0) { - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数已满"); - } - - //判断拼团人数是否已经超出限制 - int groupCount = countGroupOrder(orderGroupId,true,group.getTenantId()); - if (groupCount>=coupon.getPressLimitNum()) { - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数超出优惠券人数限制!"); - } - - WxOrder order = new WxOrder(); - order.setOrderGroupId(group.getId()); - order.setCUserId(user.getId()); - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - long count = wxOrderMapper.selectCount(new QueryWrapper(order)); - if (count > 0) { - logger.error("重复的拼团>>>" + orderGroupId); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_UNPAID); - } - } - - private boolean isOrderGroup(Long orderGroupId) { - return orderGroupId != null && !orderGroupId.equals(0L); - } - - @Override - public int countGroupOrder(Long groupId,boolean ignoreUnPay,String tenantId) { - WxOrder query = new WxOrder(); - query.setOrderGroupId(groupId); - List statusS = new ArrayList(); - statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - if (!ignoreUnPay) { - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - } - query.setStatusS(statusS); - query.setTenantId(tenantId); - return wxOrderMapper.countList(query); - } - - @Override - public int countUserCouponGroupOrder(Long cuserId, Long couponId,String tenantId) { - WxOrder query = new WxOrder(); - query.setCUserId(cuserId); - query.setProductId(couponId); - List statusS = new ArrayList(); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - query.setStatusS(statusS); - query.setTenantId(tenantId); - return wxOrderMapper.countList(query); - } - - private ResultData couponChannelCheck(OrderSaveDto orderSaveDto, WxCouponChannel wxCouponChannel) { - if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) { - Date now = new Date(); - if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) { - logger.error("此券活动未开始:" + orderSaveDto.getCouponChannelId()); - return new ResultData(ErrorCode.COUPON_CHANNEL_IS_NOT_STARTED); - } - if (wxCouponChannel.getEndTime().getTime() < now.getTime()) { - logger.error("此券活动已结束:" + orderSaveDto.getCouponChannelId()); - return new ResultData(ErrorCode.COUPON_CHANNEL_IS_END); - } - } - - if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) { - logger.error("此券已下架:" + orderSaveDto.getCouponChannelId()); - return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF); - } - return null; - } - - private ResultData couponUserCheck(WxCUserBasicInfo user, WxCouponCVo coupon) { - if (coupon.getConditions() == null) return null; - JSONObject jo = null; - try { - jo = JSONObject.parseObject(coupon.getConditions()); - } catch (Exception e) { - logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage()); - } - if (jo != null) { - if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()){ - - if (user != null && user.getActRecord() > 0) - return new ResultData(ErrorCode.COUPON_ONLY_FOR_NEW_MEMBER); - if (this.countCouponConditionType1(coupon.getTenantId(),user.getId()) > 0) - return new ResultData(ErrorCode.COUPON_ALREADY_IN_NEW_MEMBER); - }else if (jo.getIntValue("type") == EnumCouponConditionType.SCORE_SCOPE.getCode()){ - int max = jo.getIntValue("max"); - int min = jo.getIntValue("min"); - - if (max!=0 && min ==0 && user.getPoins() > max) { - return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); - } - if (max==0 && min !=0 && user.getPoins() < min) { - return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); - } - if (max!=0 && min !=0 && (user.getPoins() < min || user.getPoins() > max)) { - return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); - } - } - } - - return null; + ttOrder.setTtCoupon(coupon); + return ttOrder; } } diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java index 2db785888..5a8819006 100644 --- a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java @@ -164,135 +164,4 @@ public class TtOrderController extends BaseController { return new ResultData(order); } - @ApiOperation(value = "根据orderId查询接口", notes = "{\"orderId\":\"string\"}") - @GetMapping("/findById") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true) - }) - public ResultData findById(String orderId) { - if (orderId == null || orderId.equalsIgnoreCase(Constant.UNDEFINED)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } - Long id = 0L; - try { - id = Long.valueOf(orderId); - } catch (NumberFormatException e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); - } - WxOrder order = null; - try { - order = wxOrderService.getById(id,getTenantInfo().getTenantId()); - if (order != null) { - return new ResultData(Result.SUCCESS, "查询成功", order); - } else { - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - } - } catch (Exception e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.DB_FAIL.getCode(), "订单查询未成功,e:" + e.getMessage()); - } - } - - @ApiOperation(value = "获取未支付订单", notes = "{\"couponId\":\"string\"}") - @GetMapping("getUnPaidOrder") - @ApiImplicitParams({ - @ApiImplicitParam(name = "couponId", value = "券id", dataType = "String", paramType = "query", required = true) - }) - public ResultData getUnPaidOrder(String couponId) { - if (couponId == null || couponId.equalsIgnoreCase(Constant.UNDEFINED)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } - Long id = 0L; - try { - id = Long.valueOf(couponId); - } catch (NumberFormatException e) { - logger.error("parse couponId failed"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "券ID转换异常"); - } - WxCoupon wxCoupon = null; - try { - wxCoupon = wxCouponService.getById(id,getTenantInfo().getTenantId()); - } catch (Exception e) { - logger.error("券ID获取券信息失败, couponId: " + couponId); - return new ResultData(ErrorCode.COUPON_IS_EMPTY); - } - if(wxCoupon == null) { - logger.error("券ID获取券信息失败, couponId: " + couponId); - return new ResultData(ErrorCode.COUPON_IS_EMPTY); - } - - WxOrder order = null; - try { - WxCUserBasicInfo member = wxCUserBasicInfoService.getById(getMemberId(),getTenantInfo().getFinalTenantId()); - if(member == null) { - logger.error("会员用户未找到: " + getMemberId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "会员用户未找到" + getMemberId()); - } - order = wxOrderService.getUnPaidOrder(member, wxCoupon); - if (order != null) { - return new ResultData(Result.SUCCESS, "查询成功", order); - } else { - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - } - } catch (Exception e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.DB_FAIL.getCode(), "订单查询未成功,e:" + e.getMessage()); - } - } - - @ApiOperation("我的砍价-分页列表接口") - @GetMapping("pressOrderList") - @ApiImplicitParams({ - @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), - @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) - public ResultData pressOrderList(@ModelAttribute WxOrder wxOrder, Integer pageNum, Integer pageSize) { - // c端用户应该只能看到自己的订单 - if (wxOrder == null) wxOrder = new WxOrder(); - Long memberId; - try { - memberId = getMemberId(); - } catch (Exception e) { - return new ResultData(Result.ERROR,e.getMessage()); - } - wxOrder.setCUserId(memberId); - wxOrder.setSortColumns(BaseEntity.SortField.CreateDate_DESC); - final PageInfo page = wxOrderService.listPressVoAsPage(wxOrder, pageNum, pageSize); - return new ResultData(page); - } - - @ApiOperation("砍价订单-详情接口") - @GetMapping("pressOrderDetail") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true) - }) - public ResultData pressOrderDetail(String orderId) { - // c端用户应该只能看到自己的订单细节 - WxOrder wxOrder = new WxOrder(); - if(StringUtils.isBlank(orderId)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID不能为空"); - } - Long id = 0L; - try { - id = Long.valueOf(orderId); - } catch (NumberFormatException e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); - } - wxOrder.setId(id); - wxOrder.updateTenantInfo(getTenantInfo()); - try { - final WxOrderCouponPressVo orderCouponPressVo = wxOrderService.detailPressVo(wxOrder); - if (orderCouponPressVo == null) { - logger.error("orderCouponPressVo is null: " + orderId); - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - } - return new ResultData(orderCouponPressVo); - } catch (Exception e) { - logger.error("SQL: " + e.getMessage()); - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - } - } - - } diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtPayOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtPayOrderController.java new file mode 100644 index 000000000..007e75380 --- /dev/null +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtPayOrderController.java @@ -0,0 +1,223 @@ +package com.iformall.controller; + +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.*; +import com.iformall.domain.po.tt.TtCUser; +import com.iformall.enums.EnumCreditLockedStatus; +import com.iformall.enums.EnumOrderStatus; +import com.iformall.enums.EnumPayStatus; +import com.iformall.enums.EnumPayWay; +import com.iformall.exception.MallinkException; +import com.iformall.service.*; +import com.iformall.service.pay.entity.PayExtraParam; +import com.iformall.utils.IPUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +@RestController +@RequestMapping("/api/pay") +@Api(description = "支付相关接口") +public class TtPayOrderController extends BaseController { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxPayOrderService wxPayOrderService; + + @Autowired + private WxOrderService wxOrderService; + + @Autowired + private WxCUserBasicInfoService wxCUserBasicInfoService; + + @Autowired + private WxPayAccountService wxPayAccountService; + + @Autowired + private WxCouponService wxCouponService; + + @Autowired + private WxAppinfoService wxAppinfoService; + + /** + * 微信支付 + * @param paramMap + * @param request + * @return + * @throws Exception + */ + //@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") + @RequestMapping(value = "/create", method = RequestMethod.POST) + public ResultData _create(@RequestBody Map paramMap, HttpServletRequest request) throws Exception { + logger.info("/api/pay/create" + paramMap.toString()); + String orderIdStr = paramMap.get("orderId"); + if (StringUtils.isBlank(orderIdStr)) { + logger.info("orderId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); + } + + TtCUser user = getTtCUser(); + if (!user.basicInfoIs()) { + logger.error("暂未成为会员,请授权手机号"); + return new ResultData(ErrorCode.USER_IS_NOT_MEMBER.getCode(), "暂未成为会员,请授权手机号"); + } + + return _create(orderIdStr,user.getUserId(),EnumPayWay.PAY_WAY_TT,user.getAppId(),new PayExtraParam("openId",user.getOpenId()),request); + } + + private ResultData _create(String orderIdStr,Long userId, EnumPayWay payWay,String appId,PayExtraParam parm,HttpServletRequest request) { + WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(userId,getTenantInfo().getFinalTenantId()); + if ( null == wxCUserBasicInfo) { + logger.error("会员用户不存在."+userId); + return new ResultData(ErrorCode.USER_IS_EMPTY.getCode(),"会员用户不存在."+userId); + } + if (null != wxCUserBasicInfo && EnumCreditLockedStatus.CLOSE.getCode().equals(wxCUserBasicInfo.getStatus())) { + return new ResultData(ErrorCode.MEMBER_IS_LOCKED); + } + WxAppinfo appInfo = wxAppinfoService.getByAppId(appId); + if(appInfo == null) { + return new ResultData(ErrorCode.APP_ID_NOT_FOUND); + } + Long orderId = 0L; + try { + orderId = Long.valueOf(orderIdStr); + } catch (NumberFormatException e) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId参数不正确"); + } + WxPayOrder record = new WxPayOrder(); + record.setOrderId(orderId); + try { + record.setIp(IPUtil.getIpAddr(request)); + return wxPayOrderService.createPayOrder(appInfo, wxCUserBasicInfo, record, payWay,parm); + } catch (MallinkException e) { + logger.error("payment wechat, order create error, req 2: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error("payment wechat, order create error, req 3: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.PAY_ORDER_ERROR, e.getMessage()); + } + } + + @ApiOperation(value = "更新支付订单状态", notes = "{\"payOrderId\":\"string\",\"orderId\":\"string\",\"status\":integer,\"reason\":\"string\"}") + @PostMapping("/updatePayOrder") + public ResultData updatePayOrder(@RequestBody Map paramMap) { + logger.info("/api/pay/updatePayOrder" + paramMap.toString()); + String payOrderIdStr = (String) paramMap.get("payOrderId"); + String orderIdStr = (String) paramMap.get("orderId"); + String reasonStr = (String) paramMap.get("reason"); + Integer status = (Integer) paramMap.get("status"); + if (StringUtils.isBlank(orderIdStr)) { + logger.info("orderId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); + } + Long payOrderId = 0L, orderId = 0L; + try { + orderId = Long.valueOf(orderIdStr); + } catch (NumberFormatException e) { + logger.error("orderId参数不正确: " + paramMap.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId参数不正确"); + } + if (!StringUtils.isBlank(payOrderIdStr)) { + try { + payOrderId = Long.valueOf(payOrderIdStr); + } catch (NumberFormatException e) { + logger.error("payOrderId参数不正确: " + paramMap.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId参数不正确"); + } + } + + if(payOrderIdStr.equalsIgnoreCase("0")) { + // 免费券直接返回成功 + return new ResultData(Result.SUCCESS, "免费券支付状态更新成功"); + } + + WxPayOrder payOrder = new WxPayOrder(); + payOrder.setId(payOrderId); + payOrder.setPayOrderNo(String.valueOf(payOrderId)); + payOrder.setOrderId(orderId); + payOrder.setPayOrderStatus(status); + payOrder.setFailReason(reasonStr); + payOrder.updateTenantInfo(getTenantInfo()); + payOrder.setPayVendor(EnumPayWay.PAY_WAY_WECHAT.getCode()); + + try { + //有价券支付成功 + if (status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { + // 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态 + // 有价券不走update, callback更新 + if (payOrderId<=0) { + logger.error("/api/pay/updatePayOrder error : payOrderId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId非法"+payOrderId+"[payOrderIdStr:"+payOrderIdStr+"]"); + } + payOrder = wxPayOrderService.getById(payOrderId,payOrder.getTenantId()); + if (null == payOrder) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder."); + } + WxOrder order = wxOrderService.getById(orderId,payOrder.getTenantId()); + if (null == order) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到Order["+orderId+"]."); + } + WxCoupon wxCoupon = wxCouponService.getById(order.getProductId(),order.getTenantId()); + if (null == wxCoupon) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到优惠券[orderId:"+orderId+"]."); + } + + //拼团的订单,如果查询到是拼团待付款的,则重新查询是否已经真的支付,其他的直接返回订单信息 + if (wxPayOrderService.isOrderGroupCoupon(payOrder, wxCoupon)) { + if (!order.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode())) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + }else { + //非拼团的订单,支付成功,关闭订单,撤销支付订单,支付转退款的,直接返回订单信息,其他需要查询真实支付状态 + if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_CLOSE.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REVERSE.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REFUND.getCode())) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + } + //查询微信订单状态并更新 + + WxAppinfo appInfo = wxAppinfoService.getCAppInfo(payOrder, EnumPayWay.getEnum(payOrder.getPayVendor())); + //WxCUser user = getUser(); + //WxAppinfo appInfo = getAppInfo(user.getAppId()); + if (null == appInfo) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前支付类型["+payOrder.getPayVendor()+"]找不到C端appInfo"); + } + WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId()); + try { + WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false); + if (null != wo) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + }catch(MallinkException e) { + //已经同步了微信的支付状态,表示已经更新 + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!"); + } else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) { + // 有价券支付失败 + wxPayOrderService.handlePayOrderFail(payOrder, EnumPayStatus.PAY_STATUS_FAIL.getCode()); + } + return new ResultData(Result.SUCCESS, "支付状态更新成功"); + } catch (MallinkException e) { + logger.error("支付状态更新失败2: " + payOrder.toString() + ", e:" + e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error("支付状态更新失败3: " + payOrder.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付状态更新失败3: " + payOrder.toString() + ", e:" + e.getMessage()); + } + } +} From d46c0a9645b58f52386fd43704484f9bae5abbb9 Mon Sep 17 00:00:00 2001 From: xhxu Date: Mon, 17 May 2021 10:17:24 +0800 Subject: [PATCH 6/6] tt --- .../controller/UserBasicInfoController.java | 73 +++++++++++++++++-- .../service/WxCUserBasicInfoService.java | 2 +- .../AliBusinessCircleOrderServiceImpl.java | 2 +- .../impl/WxCUserBasicInfoServiceImpl.java | 16 +++- .../impl/WxThirdPartyOrdersServiceImpl.java | 2 +- .../main/resources/mapper/WxCUserMapper.xml | 6 +- 6 files changed, 88 insertions(+), 13 deletions(-) diff --git a/mallinkPublicApi/src/main/java/com/iformall/controller/UserBasicInfoController.java b/mallinkPublicApi/src/main/java/com/iformall/controller/UserBasicInfoController.java index 227def7c5..0f380d2c0 100644 --- a/mallinkPublicApi/src/main/java/com/iformall/controller/UserBasicInfoController.java +++ b/mallinkPublicApi/src/main/java/com/iformall/controller/UserBasicInfoController.java @@ -2,10 +2,12 @@ package com.iformall.controller; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; +import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxCUserBasicInfo; import com.iformall.domain.po.WxLevelConfig; import com.iformall.domain.po.base.TenantEntity; import com.iformall.service.WxCUserBasicInfoService; +import com.iformall.service.WxCUserService; import com.iformall.service.WxLevelConfigService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -26,6 +28,9 @@ public class UserBasicInfoController extends BaseController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private WxCUserService wxCUserService; + @Autowired private WxCUserBasicInfoService wxCUserBasicInfoService; @@ -42,6 +47,9 @@ public class UserBasicInfoController extends BaseController { public ResultData userRegister(@RequestBody Map map) { logger.info("UserBasicInfoController >>>>>>>>>>>> userRegister >>>>>>>>>>>>>"+map.toString()); String phone = (String) map.get("phone"); + String nickName = (String) map.get("nickName"); + String sexStr = (String) map.get("sex"); + String avatarUrl = (String) map.get("avatarUrl"); if(StringUtils.isBlank(phone)){ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"手机号不能为空"); } @@ -49,22 +57,71 @@ public class UserBasicInfoController extends BaseController { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"手机号格式不正确"); } + Integer sex = 0; + if(StringUtils.isNotBlank(sexStr)){ + try { + sex = Integer.parseInt(sexStr); + } catch (NumberFormatException e) { +// e.printStackTrace(); + } + } + TenantEntity tenantEntity = getTenantInfo(); - WxCUserBasicInfo userBasicInfo = wxCUserBasicInfoService.registerByPhone(tenantEntity, phone); + WxCUserBasicInfo userBasicInfo = wxCUserBasicInfoService.registerByPhone(tenantEntity, phone,nickName,sex,avatarUrl); + + this.setLevel(userBasicInfo,tenantEntity); + + return new ResultData(userBasicInfo); + } + /** + * + * @param + * @return + */ + @PostMapping("/get") + @ApiOperation(value = "会员", notes = "") + public ResultData getUserInfo(@RequestBody Map map) { + logger.info("UserBasicInfoController >>>>>>>>>>>> getUserInfo >>>>>>>>>>>>>"+map.toString()); + String phone = (String) map.get("phone"); + String openId = (String) map.get("openId"); + WxCUserBasicInfo basicInfo = null; + if(StringUtils.isBlank(phone) && StringUtils.isBlank(openId)){ + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + if(StringUtils.isNotBlank(phone)){ + basicInfo = wxCUserBasicInfoService.findInfoByPhone(getTenantInfo(), phone); + } + if(basicInfo == null && StringUtils.isNotBlank(openId)){ + WxCUser wxCUserQ = new WxCUser(); + wxCUserQ.updateTenantInfo(getTenantInfo()); + wxCUserQ.setOpenId(openId); + WxCUser byOpenId = wxCUserService.getByOpenId(wxCUserQ); + if(byOpenId != null && byOpenId.basicInfoIs()){ + basicInfo = wxCUserBasicInfoService.getById(byOpenId.getUserId(),getTenantInfo().getFinalTenantId()); + } + } + if(basicInfo == null){ + return new ResultData(ErrorCode.USER_IS_EMPTY); + } + + this.setLevel(basicInfo,getTenantInfo()); + + return new ResultData(basicInfo); + } + + private void setLevel(WxCUserBasicInfo basicInfo,TenantEntity tenantEntity){ List levelList = wxLevelConfigService.getByTenantInfo(tenantEntity); - userBasicInfo.setLevelList(levelList); - userBasicInfo.setLevel(WxLevelConfigService.DEFAULT_LEVEL); - if(userBasicInfo.getPoins() != null && userBasicInfo.getPoins() > 0){ + basicInfo.setLevelList(levelList); + basicInfo.setLevel(WxLevelConfigService.DEFAULT_LEVEL); + if(basicInfo.getPoins() != null && basicInfo.getPoins() > 0){ for (WxLevelConfig levelConfig : levelList) { - if (userBasicInfo.getPoins() >= levelConfig.getPoints()) { - userBasicInfo.setLevel(levelConfig.getLevel()); + if (basicInfo.getPoins() >= levelConfig.getPoints()) { + basicInfo.setLevel(levelConfig.getLevel()); } } } - - return new ResultData(userBasicInfo); } } diff --git a/mallinkService/src/main/java/com/iformall/service/WxCUserBasicInfoService.java b/mallinkService/src/main/java/com/iformall/service/WxCUserBasicInfoService.java index 6ddbadcef..5bcc4ab3c 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCUserBasicInfoService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCUserBasicInfoService.java @@ -175,7 +175,7 @@ public interface WxCUserBasicInfoService { void updateQrCode(WxCUserBasicInfo wxCUserBasicInfo); - WxCUserBasicInfo registerByPhone(TenantEntity tenantEntity, String phone); + WxCUserBasicInfo registerByPhone(TenantEntity tenantEntity, String phone, String nickName, Integer sex, String avatarUrl); int addCredit(Long userId, TenantEntity tenantInfo, EnumScoreType wechatPhone); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/AliBusinessCircleOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/AliBusinessCircleOrderServiceImpl.java index 05eebad67..a6c058d9d 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/AliBusinessCircleOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/AliBusinessCircleOrderServiceImpl.java @@ -117,7 +117,7 @@ public class AliBusinessCircleOrderServiceImpl implements AliBusinessCircleOrder AliPayCUser aliUser = aliPayCUserService.getByAliPayUserId(userQ); if(aliUser != null){ // WxCUserBasicInfo infoByPhone = wxCUserBasicInfoService.findInfoByPhone(aliUser, aliUser.getPhone()); - WxCUserBasicInfo infoByPhone = wxCUserBasicInfoService.registerByPhone(aliUser, aliUser.getPhone()); + WxCUserBasicInfo infoByPhone = wxCUserBasicInfoService.registerByPhone(aliUser, aliUser.getPhone(),aliUser.getName(),null,null); if(infoByPhone != null ){ record.setCUserId(infoByPhone.getId()); }else{ diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCUserBasicInfoServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCUserBasicInfoServiceImpl.java index d9cac6379..8de95cd9e 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCUserBasicInfoServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCUserBasicInfoServiceImpl.java @@ -638,7 +638,7 @@ public class WxCUserBasicInfoServiceImpl implements WxCUserBasicInfoService,IExc } @Override - public WxCUserBasicInfo registerByPhone(TenantEntity tenantEntity, String phone) { + public WxCUserBasicInfo registerByPhone(TenantEntity tenantEntity, String phone, String nickName, Integer sex, String avatarUrl) { if (StringUtils.isBlank(phone)) return null; @@ -648,7 +648,21 @@ public class WxCUserBasicInfoServiceImpl implements WxCUserBasicInfoService,IExc basicInfo.setTenantId("," + tenantEntity.getTenantId() + ","); basicInfo.setFinalTenantId(tenantEntity.getFinalTenantId()); basicInfo.setPhone(phone); + basicInfo.setNickName(nickName); + basicInfo.setSex(sex); + basicInfo.setAvatarUrl(avatarUrl); this.save(basicInfo); + }else{ + if(StringUtils.isNotBlank(nickName)){ + basicInfo.setNickName(nickName); + } + if(sex != null){ + basicInfo.setSex(sex); + } + if(StringUtils.isNotBlank(avatarUrl)){ + basicInfo.setAvatarUrl(avatarUrl); + } + wxCUserBasicInfoMapper.updateById(basicInfo); } return basicInfo; diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxThirdPartyOrdersServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxThirdPartyOrdersServiceImpl.java index 7e7bb4914..e49f86517 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxThirdPartyOrdersServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxThirdPartyOrdersServiceImpl.java @@ -131,7 +131,7 @@ public class WxThirdPartyOrdersServiceImpl implements WxThirdPartyOrdersService basicInfo = wxCUserBasicInfoService.getById(userId, record.getFinalTenantId()); } if(basicInfo == null){ - basicInfo = wxCUserBasicInfoService.registerByPhone(record, record.getUserPhone()); + basicInfo = wxCUserBasicInfoService.registerByPhone(record, record.getUserPhone(),null,null,null); } if(basicInfo != null){ diff --git a/mallinkService/src/main/resources/mapper/WxCUserMapper.xml b/mallinkService/src/main/resources/mapper/WxCUserMapper.xml index cd4ca2b36..091a26c95 100644 --- a/mallinkService/src/main/resources/mapper/WxCUserMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCUserMapper.xml @@ -269,7 +269,11 @@