| @@ -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`; | |||
| @@ -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<String, String> 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<WxCouponOrderCVo> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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); | |||
| } | |||
| } | |||
| @@ -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); | |||
| @@ -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; | |||
| @@ -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; | |||
| @@ -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<WxCouponOrderCVo> 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); | |||
| } | |||
| @@ -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); | |||
| /** | |||
| * 支付状态处理 | |||
| @@ -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<WxCouponOrder> 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<WxCouponOrderCVo> queryMicroPayCouponOrder(WxMerchantBUser user, WxCUser cUser, Integer payPrice) { | |||
| public JSONArray queryMicroPayCouponOrder(WxMerchantBUser user, WxCUser cUser, Integer payPrice) { | |||
| Map<String, Object> coQ = new HashMap<>(); | |||
| coQ.put("tenantId", user.getTenantId()); | |||
| coQ.put("cUserId", user.getId()); | |||
| coQ.put("merchantId", user.getMerchantId()); | |||
| List<WxCouponOrderCVo> avaCoList = wxCouponOrderMapper.findAvailCouponOrder(coQ); | |||
| List<WxCouponOrderCVo> 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<avaCoList.size();i++) { | |||
| WxCouponOrderCVo couponOrderCVo = avaCoList.get(i); | |||
| try { | |||
| JSONObject couponObj = calcOneCouponPay(couponOrderCVo, payPrice); | |||
| couponList.add(couponObj); | |||
| } catch (MallinkException e) { | |||
| logger.error(e.getMessage()); | |||
| } catch (Exception e) { | |||
| logger.error(e.getMessage()); | |||
| } | |||
| return false; | |||
| }).collect(Collectors.toList()); | |||
| return avaCouponOrderList; | |||
| } | |||
| return couponList; | |||
| } | |||
| /** | |||
| * 券支付计算 | |||
| * @param couponOrderCVo | |||
| * @return | |||
| */ | |||
| private JSONObject calcOneCouponPay(WxCouponOrderCVo couponOrderCVo, Integer payPrice) { | |||
| JSONObject retObj = new JSONObject(); | |||
| Date curDate = new Date(); | |||
| // 2. 检查券类型 支付可用(1, 2, 6), | |||
| EnumCouponType couponType = EnumCouponType.getEnum(couponOrderCVo.getCouponType()); | |||
| if (!(couponType.getCode().equals(EnumCouponType.COUPON_MULTIMCH.getCode()) || | |||
| couponType.getCode().equals(EnumCouponType.COUPON_MANJIAN.getCode()) || | |||
| couponType.getCode().equals(EnumCouponType.COUPON_DAIJIN.getCode()))) { | |||
| logger.error(ErrorCode.VERIFY_COUPON_TYPE_NOT_SUPPORT.getMessage()); | |||
| throw new MallinkException(ErrorCode.VERIFY_COUPON_TYPE_NOT_SUPPORT); | |||
| } | |||
| // 2. 券包状态检查 | |||
| if (couponOrderCVo.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode()) { | |||
| logger.error("已过期: couponOrder-" + couponOrderCVo.getId()); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); | |||
| } | |||
| if (couponOrderCVo.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode()) { | |||
| logger.error("已作废: couponOrder-" + couponOrderCVo.getId()); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID); | |||
| } | |||
| if (couponOrderCVo.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()) { | |||
| logger.error("已经核销过的券: couponOrder-" + couponOrderCVo.getId()); | |||
| throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED); | |||
| } | |||
| // 3. 检查有效期 | |||
| if (couponOrderCVo.getValidStartDate() != null && couponOrderCVo.getValidEndDate() != null) { | |||
| if (couponOrderCVo.getValidStartDate().getTime() > 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; | |||
| } | |||
| } | |||
| @@ -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 { | |||