Просмотр исходного кода

[收银台][修改]:收银台支持券

release_toaliyun_real
Stormeye Wu 6 лет назад
Родитель
Сommit
1f59b790c7
9 измененных файлов: 297 добавлений и 237 удалений
  1. +2
    -0
      mallinkAdmin/src/main/resources/db/migration/V201910211705__ALTER_VERIFY.sql
  2. +135
    -179
      mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java
  3. +2
    -0
      mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java
  4. +1
    -1
      mallinkService/src/main/java/com/iformall/domain/po/PosCouponOrderVerify.java
  5. +1
    -1
      mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java
  6. +5
    -2
      mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java
  7. +2
    -2
      mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java
  8. +119
    -47
      mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java
  9. +30
    -5
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java

+ 2
- 0
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`;

+ 135
- 179
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<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);
}
}

+ 2
- 0
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);


+ 1
- 1
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;


+ 1
- 1
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;


+ 5
- 2
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<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);

}

+ 2
- 2
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);

/**
* 支付状态处理


+ 119
- 47
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<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;
}

}

+ 30
- 5
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 {


Загрузка…
Отмена
Сохранить