From 1f59b790c7a63e9516cfdfa2af3d85d7dfcdf258 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Tue, 22 Oct 2019 08:41:14 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=94=B6=E9=93=B6=E5=8F=B0][=E4=BF=AE?= =?UTF-8?q?=E6=94=B9]:=E6=94=B6=E9=93=B6=E5=8F=B0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migration/V201910211705__ALTER_VERIFY.sql | 2 + .../controller/WxMicroPayController.java | 314 ++++++++---------- .../iformall/service/impl/PosServiceImpl.java | 2 + .../domain/po/PosCouponOrderVerify.java | 2 +- .../com/iformall/domain/po/WxPayOrder.java | 2 +- .../service/WxCouponOrderService.java | 7 +- .../iformall/service/WxPayOrderService.java | 4 +- .../impl/WxCouponOrderServiceImpl.java | 166 ++++++--- .../service/impl/WxPayOrderServiceImpl.java | 35 +- 9 files changed, 297 insertions(+), 237 deletions(-) create mode 100644 mallinkAdmin/src/main/resources/db/migration/V201910211705__ALTER_VERIFY.sql diff --git a/mallinkAdmin/src/main/resources/db/migration/V201910211705__ALTER_VERIFY.sql b/mallinkAdmin/src/main/resources/db/migration/V201910211705__ALTER_VERIFY.sql new file mode 100644 index 000000000..2be81efc8 --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V201910211705__ALTER_VERIFY.sql @@ -0,0 +1,2 @@ +ALTER TABLE `pos_coupon_order_verify` +ADD COLUMN `order_from` int(11) NULL COMMENT '来源,0-inside,1-POS' after `pos_order_id`; \ No newline at end of file diff --git a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java index ebf3cddf1..3dbf1c175 100644 --- a/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java +++ b/mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java @@ -1,10 +1,10 @@ package com.iformall.controller; +import com.alibaba.fastjson.JSONArray; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.domain.po.*; -import com.iformall.domain.vo.WxCouponOrderCVo; import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.service.*; @@ -21,9 +21,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; -import java.util.Date; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -119,124 +117,12 @@ public class WxMicroPayController extends BaseController { } } - @ApiOperation(value = "付款码支付订单v2", notes = "params:{\"payPrice\":\"总支付金额\",\"cUserId\":\"会员ID\"},\n" + - "注意:\n" + - "提醒1:提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);\n" + - "提醒2:在调用查询接口返回后,如果交易状况不明晰,请调用【撤销订单API】,此时如果交易失败则关闭订单,该单不能再支付成功;如果交易成功,则将扣款退回到用户账户。当撤销无返回或错误时,请再次调用。注意:请勿扣款后立即调用【撤销订单API】,建议至少15秒后再调用。撤销订单API需要双向证书。") - @PostMapping("order_create_v2") - public ResultData saveMicopayOrderV2(@RequestBody Map paramMap, HttpServletRequest request) { - logger.info("saveMicopayOrderV2: " + paramMap.toString()); - WxMerchantBUser user = getUser(); - String cUserIdStr = paramMap.get("cUserId"); - String payPriceStr = paramMap.get("payPrice"); - if (StringUtils.isBlank(cUserIdStr)) { - logger.error("cUserId不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } - if (StringUtils.isBlank(payPriceStr)) { - logger.error("payPriceStr不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } - - Long cUserId = 0L; - try { - cUserId = Long.valueOf(cUserIdStr); - } catch (NumberFormatException e) { - cUserId = 0L; - logger.error("cUserId参数不正确: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_CLASSCAST_ERROR); - } - - WxCUser cUser = wxCUserService.getById(Long.valueOf(cUserIdStr)); - if (cUser == null) { - logger.error("cUser不存在: " + cUserIdStr); - return new ResultData(ErrorCode.USER_IS_EMPTY); - } - - String ipStr = IPUtil.getIpAddr(request); - - BigDecimal payPrice = new BigDecimal(payPriceStr); - payPrice.setScale(2, BigDecimal.ROUND_HALF_UP); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入) - - int payment = payPrice.multiply(new BigDecimal(100)).intValue(); - - WxOrder order = null; - try { - order = wxOrderService.saveMicroPayOrderV2(user, cUser, payment); - } catch (MallinkException e) { - logger.error("saveMicopayOrder 1" + e.getMessage()); - return new ResultData(e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - logger.error("saveMicopayOrder 2" + e.getMessage()); - return new ResultData(ErrorCode.ORDER_IS_FAIL, e.getMessage()); - } - - List avaList = wxCouponOrderService.queryMicroPayCouponOrder(user, cUser, payment); - Map retMap = new HashMap(); - if (order != null) { - retMap.put("order", order); - } - if (avaList.size() > 0) { - retMap.put("avaList", avaList); - } - return new ResultData(retMap); - } - - @ApiOperation(value = "付款码支付订单", notes = "params:{\"orderId\":\"订单\",\"authCode\":\"String\",\"payment\":\"支付金额\"},\n" + - "注意:\n" + - "提醒1:提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);\n" + - "提醒2:在调用查询接口返回后,如果交易状况不明晰,请调用【撤销订单API】,此时如果交易失败则关闭订单,该单不能再支付成功;如果交易成功,则将扣款退回到用户账户。当撤销无返回或错误时,请再次调用。注意:请勿扣款后立即调用【撤销订单API】,建议至少15秒后再调用。撤销订单API需要双向证书。") - @PostMapping("pay_order_create_v2") - public ResultData saveMicopayPayOrder(@RequestBody Map paramMap, HttpServletRequest request) { - logger.info("saveMicopayPayOrder: " + paramMap.toString()); - WxMerchantBUser user = getUser(); - String orderIdStr = paramMap.get("orderId"); - String authCode = paramMap.get("authCode"); - String paymentStr = paramMap.get("payment"); - - if (StringUtils.isBlank(orderIdStr)) { - logger.error("orderId不能为空"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); - } - if (StringUtils.isBlank(authCode)) { - logger.error("authCode不能为空"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "authCode不能为空"); - } - if (StringUtils.isBlank(paymentStr)) { - logger.error("payment不能为空"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payment不能为空"); - } - - String ipStr = IPUtil.getIpAddr(request); - - WxOrder order = wxOrderService.getById(Long.valueOf(orderIdStr)); - if (order == null) { - logger.error("订单未找到" + orderIdStr); - return new ResultData(ErrorCode.ORDER_IS_FAIL); - } - - WxPayOrder record = new WxPayOrder(); - record.setTenantId(user.getTenantId()); - record.setOrderId(order.getId()); - record.setAuthCode(authCode); - record.setPayAmount(Integer.valueOf(paymentStr)); - record.setIp(ipStr); - - try { - return wxPayOrderService.createMicroPayOrder(user, record, EnumPayWay.PAY_WAY_WECHAT); - } 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\"}") @PostMapping("order_query") public ResultData queryMicopayOrder(@RequestBody Map paramMap) { logger.info("queryMicopayOrder: " + paramMap.toString()); + WxMerchantBUser user = getUser(); + String payOrderIdStr = paramMap.get("payOrderId"); String orderIdStr = paramMap.get("orderId"); @@ -248,7 +134,6 @@ public class WxMicroPayController extends BaseController { logger.error("orderId不能为空"); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); } - WxMerchantBUser user = getUser(); Long payOrderId = 0L; Long orderId = 0L; @@ -274,7 +159,7 @@ public class WxMicroPayController extends BaseController { record.setOrderId(orderId); try { - ResultData resultData = wxPayOrderService.payOrderQuery(record); + ResultData resultData = wxPayOrderService.payOrderQuery(user, record); return resultData; } catch (MallinkException e) { logger.error("payment wechat, order query error, req 2: " + record.toString() + ", e:" + e.getMessage()); @@ -388,36 +273,122 @@ public class WxMicroPayController extends BaseController { } } - @ApiOperation(value = "收银台核销券", notes = "{\"orderId\":\"必填\",\"couponOrderId\":\"必填\",\"payPrice\":\"支付金额(分)\"}") - @PostMapping("userCouponOrderForMicroPay") - public ResultData userCouponOrderForMicroPay(@RequestBody Map paramMap) { - logger.info("couponOrderController.verify:"+paramMap.toString()); + @ApiOperation(value = "付款码支付订单v2", notes = "params:{\"payPrice\":\"总支付金额\",\"cUserId\":\"会员ID(非必填)\",\"phone\":\"会员手机号(非必填)\"},\n" + + "注意:\n" + + "提醒1:提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);\n" + + "提醒2:在调用查询接口返回后,如果交易状况不明晰,请调用【撤销订单API】,此时如果交易失败则关闭订单,该单不能再支付成功;如果交易成功,则将扣款退回到用户账户。当撤销无返回或错误时,请再次调用。注意:请勿扣款后立即调用【撤销订单API】,建议至少15秒后再调用。撤销订单API需要双向证书。") + @PostMapping("order_create_v2") + public ResultData saveMicopayOrderV2(@RequestBody Map paramMap, HttpServletRequest request) { + logger.info("saveMicopayOrderV2: " + paramMap.toString()); + WxMerchantBUser user = getUser(); + String cUserIdStr = paramMap.get("cUserId"); + String phone = paramMap.get("phone"); + String payPriceStr = paramMap.get("payPrice"); + if (StringUtils.isBlank(cUserIdStr) && StringUtils.isBlank(phone)) { + logger.error("cUserId/phone不能同时为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + if (StringUtils.isBlank(payPriceStr)) { + logger.error("payPriceStr不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + + // 获取C用户 + WxCUser cUser = null; + if (StringUtils.isNotBlank(cUserIdStr)) { + Long cUserId = 0L; + try { + cUserId = Long.valueOf(cUserIdStr); + } catch (NumberFormatException e) { + cUserId = 0L; + logger.error("cUserId参数不正确: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_CLASSCAST_ERROR); + } + cUser = wxCUserService.getById(cUserId); + } else { + WxCUser userQ = new WxCUser(); + userQ.setTenantId(user.getTenantId()); + userQ.setPhone(phone); + cUser = wxCUserService.getByObject(userQ); + } + if (cUser == null) { + logger.error("cUser不存在: " + cUserIdStr); + return new ResultData(ErrorCode.USER_IS_EMPTY); + } + + String ipStr = IPUtil.getIpAddr(request); + + BigDecimal payPrice = new BigDecimal(payPriceStr); + payPrice.setScale(2, BigDecimal.ROUND_HALF_UP); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入) + + int payment = payPrice.multiply(new BigDecimal(100)).intValue(); + + WxOrder order = null; + try { + order = wxOrderService.saveMicroPayOrderV2(user, cUser, payment); + } catch (MallinkException e) { + logger.error("saveMicopayOrder 1" + e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error("saveMicopayOrder 2" + e.getMessage()); + return new ResultData(ErrorCode.ORDER_IS_FAIL, e.getMessage()); + } + + JSONArray avaList = wxCouponOrderService.queryMicroPayCouponOrder(user, cUser, payment); + Map retMap = new HashMap(); + if (order != null) { + retMap.put("order", order); + } + if (avaList.size() > 0) { + retMap.put("avaList", avaList); + } + return new ResultData(retMap); + } + + @ApiOperation(value = "付款码支付订单", notes = "params:{\"orderId\":\"订单号\",\"couponOrderId\":\"券码\",\"authCode\":\"String\",\"payPrice\":\"总支付金额\"},\n" + + "注意:\n" + + "提醒1:提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);\n" + + "提醒2:在调用查询接口返回后,如果交易状况不明晰,请调用【撤销订单API】,此时如果交易失败则关闭订单,该单不能再支付成功;如果交易成功,则将扣款退回到用户账户。当撤销无返回或错误时,请再次调用。注意:请勿扣款后立即调用【撤销订单API】,建议至少15秒后再调用。撤销订单API需要双向证书。") + @PostMapping("pay_order_create_v2") + public ResultData saveMicopayPayOrder(@RequestBody Map paramMap, HttpServletRequest request) { + logger.info("saveMicopayPayOrder: " + paramMap.toString()); + WxMerchantBUser user = getUser(); String orderIdStr = paramMap.get("orderId"); String couponOrderIdStr = paramMap.get("couponOrderId"); + String authCode = paramMap.get("authCode"); String payPriceStr = paramMap.get("payPrice"); + if (StringUtils.isBlank(orderIdStr)) { - logger.error("orderId不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + logger.error("orderId不能为空"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); } - if (StringUtils.isBlank(couponOrderIdStr)) { - logger.error("couponOrderId不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + if (StringUtils.isBlank(authCode)) { + logger.error("authCode不能为空"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "authCode不能为空"); } if (StringUtils.isBlank(payPriceStr)) { - logger.error("payPrice不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + logger.error("payPrice不能为空"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payPrice不能为空"); + } + + String ipStr = IPUtil.getIpAddr(request); + + WxMerchantBUser wxMerchantBUser = wxMerchantBUserService.getById(user.getId()); + if (wxMerchantBUser == null) { + logger.error("核销员ID不存在:" + user.getId()); + throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "核销员ID不存在或者无权限"); } + wxMerchantBUser.setBuserId(getBuserId()); + Long couponOrderId = 0L, orderId = 0L; BigDecimal totalFee = new BigDecimal(payPriceStr); totalFee.setScale(2, BigDecimal.ROUND_HALF_UP); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入) Integer payPrice = totalFee.multiply(new BigDecimal(100)).intValue(); try { - couponOrderId = Long.valueOf(couponOrderIdStr); orderId = Long.valueOf(orderIdStr); } catch (NumberFormatException e) { - couponOrderId = 0L; orderId = 0L; - logger.error("couponOrderId参数不正确: " + paramMap.toString()); + logger.error("orderId参数不正确: " + paramMap.toString()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } @@ -426,61 +397,46 @@ public class WxMicroPayController extends BaseController { return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); } - WxCouponOrderCVo wxCouponOrderCVo = wxCouponOrderService.detailCUserVo(couponOrderIdStr); - if (wxCouponOrderCVo == null) { - return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL); - } - - WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(wxCouponOrderCVo.getcUserId()); - if (wxCUserBasicInfo != null && EnumCreditLockedStatus.CLOSE.getCode().equals(wxCUserBasicInfo.getStatus())) { - return new ResultData(ErrorCode.MEMBER_IS_LOCKED); - } - - if (wxCouponOrderCVo.getValidStartDate() != null && wxCouponOrderCVo.getValidEndDate() != null ) { - Date now = new Date(); - if (wxCouponOrderCVo.getValidStartDate().getTime() > now.getTime()) { - logger.error("此券有效期未开始:" + couponOrderIdStr); - return new ResultData(ErrorCode.COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE); - } - if (wxCouponOrderCVo.getValidEndDate().getTime() < now.getTime()) { - logger.error("此券有效期已结束:" + couponOrderIdStr); - return new ResultData(ErrorCode.COUPON_ORDER_IS_LATER_THAN_VALIDDATE); + WxCouponOrder wxCouponOrder = null; + if (StringUtils.isNotBlank(couponOrderIdStr)) { + try { + couponOrderId = Long.valueOf(couponOrderIdStr); + } catch (NumberFormatException e) { + couponOrderId = 0L; + logger.error("couponOrderId参数不正确: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } + wxCouponOrder = wxCouponOrderService.getById(couponOrderId); } - - WxCouponOrder wxCouponOrder = wxCouponOrderService.getById(couponOrderId); - if (wxCouponOrder == null) { - logger.error("券ID不存在:" + couponOrderId); - return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL); - } - - WxMerchantBUser wxMerchantBUser = wxMerchantBUserService.getById(getUser().getId()); - if (wxMerchantBUser == null) { - logger.error("核销员ID不存在:" + getUser().getId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "核销员ID不存在或者无权限"); + Integer remainPrice = payPrice; + if (wxCouponOrder != null) { + try { + remainPrice = wxCouponOrderService.microPayPreVerify(microOrder, wxCouponOrder, wxMerchantBUser, payPrice); + } 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.VERIFY_ERROR, e.getMessage()); + } } - wxMerchantBUser.setBuserId(getBuserId()); - + WxPayOrder record = new WxPayOrder(); + record.setTenantId(user.getTenantId()); + record.setOrderId(microOrder.getId()); + record.setCUserId(microOrder.getCUserId()); + record.setAuthCode(authCode); + record.setPayAmount(remainPrice); + record.setIp(ipStr); - WxCouponOrder couponOrder = null; - Integer remainPrice = payPrice; try { - remainPrice = wxCouponOrderService.microPayVerify(microOrder, wxCouponOrder, wxMerchantBUser, payPrice); + return wxPayOrderService.createMicroPayOrder(user, record, EnumPayWay.PAY_WAY_WECHAT); } catch (MallinkException e) { - logger.error("核销异常: " + e.getMessage()); + 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("核销异常: " + e.getMessage()); - return new ResultData(ErrorCode.VERIFY_ERROR, e.getMessage()); - } - - if(couponOrder != null) { - wxCouponOrderService.sendInsideCouponVerifyMsg(couponOrder.getTenantId(), couponOrderId, wxMerchantBUser.getId()); + logger.error("payment wechat, order create error, req 3: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.PAY_ORDER_ERROR, e.getMessage()); } - Double remainPriceD = Double.valueOf(remainPrice); - String remainPriceStr = String.format("%.2f", remainPriceD); - - return new ResultData(remainPrice); } } diff --git a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java index dc5cdd69e..a4c4bcbde 100644 --- a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java +++ b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java @@ -1178,6 +1178,7 @@ public class PosServiceImpl implements PosService { posCouponOrderVerify.setTenantId(couponOrderCVo.getTenantId()); posCouponOrderVerify.setCouponOrderId(couponOrderCVo.getId()); posCouponOrderVerify.setPosOrderId(posOrderId); + posCouponOrderVerify.setOrderFrom(EnumOrderFrom.POS.getCode()); posCouponOrderVerify.setState(EnumEnableType.Enable.getCode()); posCouponOrderVerify.setCreateDate(new Date()); posCouponOrderVerify.setUpdateDate(new Date()); @@ -1272,6 +1273,7 @@ public class PosServiceImpl implements PosService { posCouponOrderVerify.setTenantId(couponOrderCVo.getTenantId()); posCouponOrderVerify.setCouponOrderId(couponOrderCVo.getId()); posCouponOrderVerify.setPosOrderId(posOrderId); + posCouponOrderVerify.setOrderFrom(EnumOrderFrom.POS.getCode()); posCouponOrderVerify.setState(EnumEnableType.Enable.getCode()); try { posCouponOrderVerifyService.saveOrUpdate(posCouponOrderVerify); diff --git a/mallinkService/src/main/java/com/iformall/domain/po/PosCouponOrderVerify.java b/mallinkService/src/main/java/com/iformall/domain/po/PosCouponOrderVerify.java index 8b6f4495d..f54522d65 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/PosCouponOrderVerify.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/PosCouponOrderVerify.java @@ -20,7 +20,7 @@ public class PosCouponOrderVerify extends BaseEntity { private Long couponOrderId; @io.swagger.annotations.ApiModelProperty(value="POS订单ID",name="posOrderId") private Long posOrderId; - @io.swagger.annotations.ApiModelProperty(value="状态,0-inside,1-POS",name="orderFrom") + @io.swagger.annotations.ApiModelProperty(value="来源,0-inside,1-POS",name="orderFrom") private Integer orderFrom; @io.swagger.annotations.ApiModelProperty(value="状态,0-使用中,1-禁用",name="state") private Integer state; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java index 627fe49fb..955396a7d 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java @@ -62,7 +62,7 @@ public class WxPayOrder extends BaseEntity { @io.swagger.annotations.ApiModelProperty(value="支付后结果来源(0:inside, 1:POS支付)",name="payFrom") private Integer payFrom; - @io.swagger.annotations.ApiModelProperty(value="支付订单号,来源于POS",name="posPayOrderId") + @io.swagger.annotations.ApiModelProperty(value="支付订单号,来源于POS, inside时,填写couponOrderId",name="posPayOrderId") private Long posPayOrderId; @io.swagger.annotations.ApiModelProperty(value="支付订单创建时间,来源于POS",name="posPayOrderTime") private Long posPayOrderTime; diff --git a/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java index 2509eaed2..de22711c8 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java @@ -1,5 +1,6 @@ package com.iformall.service; +import com.alibaba.fastjson.JSONArray; import com.github.pagehelper.PageInfo; import com.iformall.common.ResultData; import com.iformall.domain.po.WxCUser; @@ -195,8 +196,10 @@ public interface WxCouponOrderService { /** * B端-收银台-支持优惠券 */ - List queryMicroPayCouponOrder(WxMerchantBUser user, WxCUser cUser, Integer price); + JSONArray queryMicroPayCouponOrder(WxMerchantBUser user, WxCUser cUser, Integer price); - Integer microPayVerify(WxOrder microOrder, WxCouponOrder couponOrder, WxMerchantBUser bUser, Integer price); + Integer microPayPreVerify(WxOrder microOrder, WxCouponOrder couponOrder, WxMerchantBUser bUser, Integer price); + + Integer microPayVerify(WxMerchantBUser bUser, Long couponOrderId); } diff --git a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java index 1ad407660..333eb0a41 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java @@ -34,7 +34,7 @@ public interface WxPayOrderService { * 微信支付订单查询 * @param record 支付订单 */ - ResultData payOrderQuery(WxPayOrder record); + ResultData payOrderQuery(WxMerchantBUser user, WxPayOrder record); /** * 微信支付关闭订单 @@ -73,7 +73,7 @@ public interface WxPayOrderService { * @param record * @param transactionId */ - void handleMicroOrderPaySuccess(WxPayOrder record, String transactionId, String openId, String isSubscribe); + void handleMicroOrderPaySuccess(WxMerchantBUser user, WxPayOrder record, String transactionId, String openId, String isSubscribe); /** * 支付状态处理 diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java index 798326f59..657b6e9ca 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -1,5 +1,6 @@ package com.iformall.service.impl; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; @@ -20,6 +21,7 @@ import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.*; import com.iformall.mq.MqBaseProducer; +import com.iformall.pay.WxPayConstant; import com.iformall.service.*; import com.iformall.utils.DateUtils; import com.iformall.utils.PayUtils; @@ -125,6 +127,8 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { @Autowired WxPayOrderMapper payOrderMapper; + private final SimpleDateFormat mydateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @Override public PageInfo listAsPage(WxCouponOrder record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findList(record)); @@ -364,7 +368,11 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { logger.error("核销异常:updatete num " + num); throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); } + doAfterVerify(couponOrder, bUser, wxCoupon); + return couponOrder; + } + private void doAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser, WxCoupon wxCoupon) { // 成长值 try { WxOrder order = wxOrderMapper.selectById(couponOrder.getOrderId()); @@ -393,8 +401,6 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { } catch (Exception e) { logger.error("积分值:" + e.getMessage()); } - - return couponOrder; } @Override @@ -1042,29 +1048,106 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { } @Override - public List queryMicroPayCouponOrder(WxMerchantBUser user, WxCUser cUser, Integer payPrice) { + public JSONArray queryMicroPayCouponOrder(WxMerchantBUser user, WxCUser cUser, Integer payPrice) { Map coQ = new HashMap<>(); coQ.put("tenantId", user.getTenantId()); coQ.put("cUserId", user.getId()); coQ.put("merchantId", user.getMerchantId()); List avaCoList = wxCouponOrderMapper.findAvailCouponOrder(coQ); - List avaCouponOrderList = avaCoList.stream().filter(couponOrderCVo -> { - if (couponOrderCVo.getType().equals(EnumCouponType.COUPON_MANJIAN.getCode())) { - if (payPrice > couponOrderCVo.getUsePrice()) { - return true; - } - } else { - return true; + JSONArray couponList = new JSONArray(); + for(int i=0;i curDate.getTime()) { + logger.error("此券有效期未开始:" + couponOrderCVo.getId()); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE); + } + if (couponOrderCVo.getValidEndDate().getTime() < curDate.getTime()) { + logger.error("此券有效期已结束:" + couponOrderCVo.getId()); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE); + } + } + // 4 券已过期 + if (couponOrderCVo.getExpiredTime().before(curDate)) { + logger.error("此券已过期:" + couponOrderCVo.getId()); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE); + } + + // 5. 满减券检查使用金额 + if (couponType.equals(EnumCouponType.COUPON_MANJIAN)) { + if (payPrice < couponOrderCVo.getUsePrice()) { + logger.error(ErrorCode.VERIFY_MANJIAN_USER_PRICE_NOT_TOUCH.getMessage()); + throw new MallinkException(ErrorCode.VERIFY_MANJIAN_USER_PRICE_NOT_TOUCH); + } + } + + // 6. 生成优惠券抵扣信息 + retObj.put(WxPayConstant.COUPON_ID, couponOrderCVo.getId().toString()); + retObj.put(WxPayConstant.TITLE, couponOrderCVo.getTitle()); + retObj.put(WxPayConstant.COUPON_TYPE, couponType.getMessage()); + retObj.put(WxPayConstant.PRICE, couponOrderCVo.getPrice()); + if (couponType.equals(EnumCouponType.COUPON_MANJIAN)) { + retObj.put(WxPayConstant.USE_PRICE, couponOrderCVo.getUsePrice()); + String des = String.format("%s-满%s元可用,可抵%s元, 过期时间: %s", + couponType.getMessage(), couponOrderCVo.getUsePriceStr(), couponOrderCVo.getPriceStr(), + mydateFormat.format(couponOrderCVo.getExpiredTime())); + retObj.put(WxPayConstant.COUPON_DES, des); + } else { + String des = String.format("%s-可抵%s元, 过期时间: %s", + couponType.getMessage(), couponOrderCVo.getPriceStr(), + mydateFormat.format(couponOrderCVo.getExpiredTime())); + retObj.put(WxPayConstant.COUPON_DES, des); + } + return retObj; } @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public Integer microPayVerify(WxOrder microOrder, WxCouponOrder couponOrder, WxMerchantBUser bUser, Integer payPrice) { - + public Integer microPayPreVerify(WxOrder microOrder, WxCouponOrder couponOrder, WxMerchantBUser bUser, Integer payPrice) { // 1. 获取券信息 WxCoupon wxCoupon = wxCouponMapper.selectById(couponOrder.getCouponId()); if (wxCoupon == null) { @@ -1128,7 +1211,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { int num = 0; try { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()); //1核销 + couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.POS_PRE_VERIFY.getCode()); //预核销 couponOrder.setBUserId(bUser.getId()); couponOrder.setVerifyType(EnumCouponVerifyType.VERIFY_B.getCode()); couponOrder.setUpdateDate(new Date()); @@ -1158,9 +1241,10 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { setPayOrderNo(String.valueOf(id)); setPayAmount(wxCoupon.getPrice()); setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode()); - setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); + setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); setShare(EnumPayShare.NO.getCode()); setPayFrom(EnumPayFrom.INSIDE_B.getCode()); + setPosPayOrderId(couponOrder.getId()); }}; try { @@ -1178,37 +1262,25 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { updateOrder.setId(microOrder.getId()); updateOrder.setRealPayment(remainPrice); wxOrderMapper.updateById(updateOrder); - - // 成长值 - try { - WxOrder orderByCoupon = wxOrderMapper.selectById(couponOrder.getOrderId()); - wxScoreRulesService.addScore2(EnumScoreType.CONSUMPTION, orderByCoupon, wxCoupon.getBusiness()); - } catch (Exception e) { - logger.error("成长值:" + e.getMessage()); - } - - // 积分 - try { - //-------此处为【现金支付】记录增加积分操作------- - WxCreditHistory creditHistory = new WxCreditHistory(); - creditHistory.setOperatorType(EnumUserType.BUSER.getCode()); - creditHistory.setOperatorId(bUser.getId()); - creditHistory.setCUserId(couponOrder.getcUserId()); - creditHistory.setCreateDate(new Date()); - creditHistory.setTenantId(couponOrder.getTenantId()); - creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode()); - creditHistory.setCouponId(wxCoupon.getId()); - creditHistory.setBusinessId(wxCoupon.getBusiness()); - creditHistory.setSpend(couponOrder.getCouponPrice()); - //如果券与商户一对一 则直接将消费商户更新为此商户 若一对多 则消费商户显示多商户 - creditHistory.setMerchantId(bUser.getMerchantId()); - creditHistory.setBuserId(bUser.getBuserId()); - wxCreditHistoryService.saveOrUpdate(creditHistory); - } catch (Exception e) { - logger.error("积分值:" + e.getMessage()); - } - return remainPrice; } + @Override + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public Integer microPayVerify(WxMerchantBUser bUser, Long couponOrderId) { + WxCouponOrder updateCouponOrder = new WxCouponOrder(); + updateCouponOrder.setId(couponOrderId); + updateCouponOrder.setBUserId(bUser.getId()); + updateCouponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()); + updateCouponOrder.setUpdateDate(new Date()); + // 核销状态更新 + int num = wxCouponOrderMapper.updateById(updateCouponOrder); + if (num == 1) { + WxCouponOrder couponOrder = wxCouponOrderMapper.selectById(couponOrderId); + WxCoupon coupon = wxCouponMapper.selectById(couponOrder.getCouponId()); + doAfterVerify(couponOrder, bUser, coupon); + } + return 0; + } + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java index 6b1d46336..9691bad22 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java @@ -521,7 +521,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { String transactionId = returnMap.get("transaction_id"); record.setTransactionId(transactionId); record.setUpdateTime(new Date()); - handleMicroOrderPaySuccess(record, transactionId, openId, isSubscribe); + handleMicroOrderPaySuccess(user, record, transactionId, openId, isSubscribe); return new ResultData(Result.SUCCESS, "刷卡支付成功", returnMap); } else { String err_code = returnMap.get("err_code"); @@ -592,7 +592,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { String transactionId = returnMap.get("transaction_id"); record.setTransactionId(transactionId); record.setUpdateTime(new Date()); - handleMicroOrderPaySuccess(record, transactionId, openId, isSubscribe); + handleMicroOrderPaySuccess(user, record, transactionId, openId, isSubscribe); return new ResultData(Result.SUCCESS, "刷卡支付成功", returnMap); } else { String err_code = returnMap.get("err_code"); @@ -685,7 +685,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { * 微信订单查询 */ @Override - public ResultData payOrderQuery(WxPayOrder record) { + public ResultData payOrderQuery(WxMerchantBUser user, WxPayOrder record) { try { if (StringUtils.isBlank(record.getPayOrderNo())) { @@ -727,7 +727,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { String transactionId = returnMap.get("transaction_id"); String tradeType = returnMap.get("trade_type"); if ("MICROPAY".equals(tradeType)) { - handleMicroOrderPaySuccess(record, transactionId, openId, sub_is_subscribe); + handleMicroOrderPaySuccess(user, record, transactionId, openId, sub_is_subscribe); } else { handleOrderPaySuccess(record, transactionId, EnumPayEndFrom.QUERY.getCode()); } @@ -1237,7 +1237,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { @Override @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void handleMicroOrderPaySuccess(WxPayOrder record, String transactionId, String openId, String isSubscribe) { + public void handleMicroOrderPaySuccess(WxMerchantBUser user, WxPayOrder record, String transactionId, String openId, String isSubscribe) { Date currentDate = new Date(); EnumPayStatus payStatus = EnumPayStatus.getEnum(record.getPayOrderStatus()); // 判断支付状态 @@ -1312,6 +1312,29 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "支付订单数据库更新失败: " + e.getMessage()); } + // B端收银台核销券处理 + WxPayOrder payOrderQ = new WxPayOrder(); + payOrderQ.setOrderId(order.getId()); + payOrderQ.setCUserId(userQ.getId()); + payOrderQ.setPayFrom(EnumPayFrom.INSIDE_B.getCode()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); + try { + WxPayOrder unPayOrder = wxPayOrderMapper.selectOne(new QueryWrapper<>(payOrderQ)); + if (unPayOrder != null) { + if (unPayOrder.getPosPayOrderId() != null) { + try { + wxCouponOrderService.microPayVerify(user, unPayOrder.getPosPayOrderId()); + } catch (Exception e) { + logger.error(e.getMessage()); + } + // 更新后处理 + wxCouponOrderService.sendInsideCouponVerifyMsg(unPayOrder.getTenantId(), unPayOrder.getPosPayOrderId(), user.getId()); + } + } + } catch (Exception e) { + logger.error(e.getMessage()); + } + // 修改订单状态 order.setCUserId(userQ.getId()); try { @@ -1325,6 +1348,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService { throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单更新"); } + // TODO B端收银台支付,核销券相关操作 + // B端刷卡支付发券 logger.info("订单刷卡发券 开始"); try {