From ccdd94593369d7c24f05442d59af050d3d88119b Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Thu, 8 Aug 2019 14:30:36 +0800 Subject: [PATCH] =?UTF-8?q?[POS][=E4=BF=AE=E6=94=B9]:code=E6=95=B4?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iformall/service/impl/PosServiceImpl.java | 119 +++++++++++------- .../com/iformall/pos/test/PosAppTest.java | 29 +++++ .../iformall/mapper/WxCouponOrderMapper.java | 1 + .../resources/mapper/WxCouponOrderMapper.xml | 17 +++ 4 files changed, 123 insertions(+), 43 deletions(-) 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 93d0a71f7..a94cf0b00 100644 --- a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java +++ b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java @@ -304,13 +304,13 @@ public class PosServiceImpl implements PosService { logger.error("已经核销过的券: couponOrder-" + couponOrderCVo.getId()); throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED); } - if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.POS_PRE_VERIFY.getCode())) { - logger.info("券已被预核销: " + couponOrderIdStr); - if (!couponOrderCVo.getBUserId().equals(buUserId)) { - logger.error(ErrorCode.VERIFY_PRE_BUSER_NOT_EQUAL.getMessage() + ": " + buUserIdStr); - throw new MallinkException(ErrorCode.VERIFY_PRE_BUSER_NOT_EQUAL); - } - if (actionType.equals(EnumVerifyActionType.CHECK)) { + if (actionType.equals(EnumVerifyActionType.CHECK)) { + if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.POS_PRE_VERIFY.getCode())) { + logger.info("券已被预核销: " + couponOrderIdStr); + if (!couponOrderCVo.getBUserId().equals(buUserId)) { + logger.error(ErrorCode.VERIFY_PRE_BUSER_NOT_EQUAL.getMessage() + ": " + buUserIdStr); + throw new MallinkException(ErrorCode.VERIFY_PRE_BUSER_NOT_EQUAL); + } if (StringUtils.isBlank(posOrderIdStr)) { logger.error(ErrorCode.VERIFY_PRE_POS_ORDER_IS_EMPTY.getMessage()); throw new MallinkException(ErrorCode.VERIFY_PRE_POS_ORDER_IS_EMPTY); @@ -322,41 +322,45 @@ public class PosServiceImpl implements PosService { throw new MallinkException(ErrorCode.SYS_PARAMETER_CAST_ERROR.getCode(), ErrorCode.SYS_PARAMETER_CAST_ERROR.getMessage() + ", pos_order_id:" + posOrderIdStr); } - } - // check pos order是否一致 - PosCouponOrderVerify posCouponOrderVerifyQ = new PosCouponOrderVerify(); - posCouponOrderVerifyQ.setTenantId(tenantId); - posCouponOrderVerifyQ.setCouponOrderId(couponOrderId); - posCouponOrderVerifyQ.setPosOrderId(posOrderId); - posCouponOrderVerifyQ.setState(EnumEnableType.Enable.getCode()); - List posCouponOrderVerifyList = posCouponOrderVerifyService.getList(posCouponOrderVerifyQ); - if (posCouponOrderVerifyList.size() != 1) { - logger.error(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL.getMessage() + ": " + posOrderIdStr); - throw new MallinkException(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL); - } - logger.info("券可以核销: " + couponOrderIdStr); - if (actionType.equals(EnumVerifyActionType.CHECK)) { + // check pos order是否一致 + PosCouponOrderVerify posCouponOrderVerifyQ = new PosCouponOrderVerify(); + posCouponOrderVerifyQ.setTenantId(tenantId); + posCouponOrderVerifyQ.setCouponOrderId(couponOrderId); + posCouponOrderVerifyQ.setPosOrderId(posOrderId); + posCouponOrderVerifyQ.setState(EnumEnableType.Enable.getCode()); + List posCouponOrderVerifyList = posCouponOrderVerifyService.getList(posCouponOrderVerifyQ); + if (posCouponOrderVerifyList.size() != 1) { + logger.error(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL.getMessage() + ": " + posOrderIdStr); + throw new MallinkException(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL); + } + logger.info("券可以被核销: " + couponOrderIdStr); + return retMap; + } else if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode())) { + logger.info("券可以被核销: " + couponOrderIdStr); return retMap; } - if (actionType.equals(EnumVerifyActionType.VERIFY_INDEPENT) || actionType.equals(EnumVerifyActionType.VERIFY_PAY)) { - try { - doVerify(couponOrderCVo, wxCoupon, merchantId, buUserId, posOrderId, retMap); - return retMap; - } catch (MallinkException e) { - logger.error(e.getMessage()); - throw new MallinkException(e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - logger.error(e.getMessage()); - throw new MallinkException(500, e.getMessage()); + } else if (actionType.equals(EnumVerifyActionType.PRE_VERIFY)) { + if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.POS_PRE_VERIFY.getCode())) { + logger.info("券已被预核销: " + couponOrderIdStr); + if (!couponOrderCVo.getBUserId().equals(buUserId)) { + logger.error(ErrorCode.VERIFY_PRE_BUSER_NOT_EQUAL.getMessage() + ": " + buUserIdStr); + throw new MallinkException(ErrorCode.VERIFY_PRE_BUSER_NOT_EQUAL); + } + // check pos order是否一致 + PosCouponOrderVerify posCouponOrderVerifyQ = new PosCouponOrderVerify(); + posCouponOrderVerifyQ.setTenantId(tenantId); + posCouponOrderVerifyQ.setCouponOrderId(couponOrderId); + posCouponOrderVerifyQ.setPosOrderId(posOrderId); + posCouponOrderVerifyQ.setState(EnumEnableType.Enable.getCode()); + List posCouponOrderVerifyList = posCouponOrderVerifyService.getList(posCouponOrderVerifyQ); + if (posCouponOrderVerifyList.size() != 1) { + logger.error(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL.getMessage() + ": " + posOrderIdStr); + throw new MallinkException(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL); } - } - } - if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode())) { - logger.info("券可以核销: " + couponOrderIdStr); - if (actionType.equals(EnumVerifyActionType.CHECK)) { return retMap; } - if (actionType.equals(EnumVerifyActionType.PRE_VERIFY)) { + if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode())) { + logger.info("券可以被预核销: " + couponOrderIdStr); try { doPreVerify(couponOrderCVo, buUserId, posOrderId); return retMap; @@ -368,7 +372,32 @@ public class PosServiceImpl implements PosService { throw new MallinkException(500, e.getMessage()); } } - if (actionType.equals(EnumVerifyActionType.VERIFY_INDEPENT) || actionType.equals(EnumVerifyActionType.VERIFY_PAY)) { + } else { + // if (actionType.equals(EnumVerifyActionType.VERIFY_INDEPENT ) ||actionType.equals(EnumVerifyActionType.VERIFY_PAY)) + boolean blVerify = false; + if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.POS_PRE_VERIFY.getCode())) { + logger.info("券已被预核销: " + couponOrderIdStr); + if (!couponOrderCVo.getBUserId().equals(buUserId)) { + logger.error(ErrorCode.VERIFY_PRE_BUSER_NOT_EQUAL.getMessage() + ": " + buUserIdStr); + throw new MallinkException(ErrorCode.VERIFY_PRE_BUSER_NOT_EQUAL); + } + // check pos order是否一致 + PosCouponOrderVerify posCouponOrderVerifyQ = new PosCouponOrderVerify(); + posCouponOrderVerifyQ.setTenantId(tenantId); + posCouponOrderVerifyQ.setCouponOrderId(couponOrderId); + posCouponOrderVerifyQ.setPosOrderId(posOrderId); + posCouponOrderVerifyQ.setState(EnumEnableType.Enable.getCode()); + List posCouponOrderVerifyList = posCouponOrderVerifyService.getList(posCouponOrderVerifyQ); + if (posCouponOrderVerifyList.size() != 1) { + logger.error(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL.getMessage() + ": " + posOrderIdStr); + throw new MallinkException(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL); + } + blVerify = true; + } else if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode())) { + logger.info("券可以被预核销: " + couponOrderIdStr); + blVerify = true; + } + if (blVerify) { try { doVerify(couponOrderCVo, wxCoupon, merchantId, buUserId, posOrderId, retMap); return retMap; @@ -381,7 +410,7 @@ public class PosServiceImpl implements PosService { } } } - String errMessage = "核销异常:未知的核销状态" + couponOrderCVo.getCouponOrderStatus(); + String errMessage = "核销异常:未知的核销状态-" + couponOrderCVo.getCouponOrderStatus() + ", 核销action-" + actionType.getCode(); logger.error(errMessage); throw new MallinkException(500, errMessage); } @@ -501,7 +530,7 @@ public class PosServiceImpl implements PosService { throw new MallinkException(e.getErrorCode(), e.getMessage()); } } - String errMessage = "取消异常:未知的核销状态" + couponOrderCVo.getCouponOrderStatus(); + String errMessage = "取消异常:未知的核销状态-" + couponOrderCVo.getCouponOrderStatus()+ ", 核销action-" + actionType.getCode(); logger.error(errMessage); throw new MallinkException(500, errMessage); } @@ -538,15 +567,16 @@ public class PosServiceImpl implements PosService { couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.POS_PRE_VERIFY.getCode()); couponOrder.setBUserId(buUserId); couponOrder.setUpdateDate(new Date()); - num = couponOrderMapper.updateVerifyCouponOrder(couponOrder); + num = couponOrderMapper.updateVerifyCouponOrderStatus(couponOrder); } catch (Exception e) { logger.error("db failed: couponOrder-" + couponOrderCVo.getId() + ", e:" + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); } if (num != 1) { - logger.error("核销异常:updatete num " + num); + logger.error("预核销异常:updatete num " + num); throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); } + logger.info("预核销已完成: " + couponOrderCVo.getId()); } /** @@ -602,6 +632,7 @@ public class PosServiceImpl implements PosService { logger.error("核销异常:updatete num " + num); throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); } + logger.info("预核销已取消: " + couponOrderCVo.getId()); } /** @@ -641,7 +672,7 @@ public class PosServiceImpl implements PosService { couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()); //1核销 couponOrder.setBUserId(buUserId); couponOrder.setUpdateDate(new Date()); - num = couponOrderMapper.updateVerifyCouponOrder(couponOrder); + num = couponOrderMapper.updateVerifyCouponOrderStatus(couponOrder); } catch (Exception e) { logger.error("db failed: couponOrder-" + couponOrderCVo.getId() + ", e:" + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); @@ -682,6 +713,7 @@ public class PosServiceImpl implements PosService { } catch (Exception e) { logger.error("核销积分值异常:" + e.getMessage()); } + logger.info("核销已完成: " + couponOrderCVo.getId()); } /** @@ -771,5 +803,6 @@ public class PosServiceImpl implements PosService { logger.error("核销异常:updatete num " + num); throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num); } + logger.info("核销已取消: " + couponOrderCVo.getId()); } } diff --git a/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java b/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java index 681f1f3da..ca1819d8a 100644 --- a/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java +++ b/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java @@ -6,8 +6,10 @@ import com.iformall.PosApplication; import com.iformall.pay.WxPayConstant; import com.iformall.pay.WxPayment; import org.junit.Assert; +import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -33,6 +35,7 @@ import java.util.Map; @SpringBootTest(classes = { PosApplication.class}) @ActiveProfiles("dev") @AutoConfigureMockMvc +@FixMethodOrder(MethodSorters.JVM) public class PosAppTest { @Autowired @@ -251,4 +254,30 @@ public class PosAppTest { System.out.println("response sign: " + resSigned); Assert.assertEquals(resSigned, true); } + + @Test + public void couponOrderPayVerifyTest() throws Exception { + Map reqObj = new HashMap<>(); + reqObj.put(WxPayConstant.DEV_ID, devId); + reqObj.put(WxPayConstant.TENANT_ID, "456"); + reqObj.put(WxPayConstant.MERCHANT_ID, "317109453987631104"); + reqObj.put(WxPayConstant.BUSER_ID, "317111133332426752"); + reqObj.put(WxPayConstant.COUPON_ORDER_ID, "318978990426783744"); + reqObj.put(WxPayConstant.NONCE_STR, "1"); + reqObj.put(WxPayConstant.POS_ORDER_ID, "1"); + reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); + String reqJsonStr = JSONObject.toJSONString(reqObj); + RequestBuilder request = MockMvcRequestBuilders.post("/couponOrderPayVerify") + .contentType(MediaType.APPLICATION_JSON) + .content(reqJsonStr); + MvcResult result = mockMvc.perform(request).andReturn(); + String responseStr = result.getResponse().getContentAsString(); + System.out.println(responseStr); + + ObjectMapper mapper = new ObjectMapper(); + Map respMap = mapper.readValue(responseStr, Map.class); + boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + System.out.println("response sign: " + resSigned); + Assert.assertEquals(resSigned, true); + } } diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java index 4c6980b6a..84358c08a 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java @@ -23,6 +23,7 @@ public interface WxCouponOrderMapper extends CommonMapper { // 券包核销 int updateVerifyCouponOrder(WxCouponOrder wxCouponOrder); + int updateVerifyCouponOrderStatus(WxCouponOrder wxCouponOrder); int cancelVerifyCouponOrder(WxCouponOrder wxCouponOrder); //统一的计数接口 diff --git a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml index c1b2aeba4..b76e7fcbd 100644 --- a/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml @@ -103,6 +103,23 @@ where `tenant_id`=#{tenantId} and id=#{id} and `b_user_id` is null + + update wx_coupon_order + set `coupon_order_status` = #{couponOrderStatus}, + `b_user_id` = #{bUserId}, + `update_date` = #{updateDate} + where 1=1 + and `tenant_id`=#{tenantId} + and id=#{id} + + and `b_user_id` is null + + + and `b_user_id` = #{bUserId} + + + + update wx_coupon_order set `coupon_order_status` = #{couponOrderStatus},