| @@ -476,6 +476,7 @@ public class PosServiceImpl implements PosService { | |||
| } | |||
| try { | |||
| cancelPreVerify(couponOrderCVo, buUserId, posOrderId); | |||
| return retMap; | |||
| } catch (MallinkException e) { | |||
| logger.error(e.getMessage()); | |||
| throw new MallinkException(e.getErrorCode(), e.getMessage()); | |||
| @@ -487,6 +488,7 @@ public class PosServiceImpl implements PosService { | |||
| logger.info("券已被核销: " + couponOrderIdStr); | |||
| try { | |||
| cancelVerify(couponOrderCVo, buUserId, posOrderId); | |||
| return retMap; | |||
| } catch (MallinkException e) { | |||
| logger.error(e.getMessage()); | |||
| throw new MallinkException(e.getErrorCode(), e.getMessage()); | |||
| @@ -688,11 +690,12 @@ public class PosServiceImpl implements PosService { | |||
| creditHistory.setCouponId(couponOrderCVo.getCouponId()); | |||
| int num = creditHistoryService.cancelCredit(creditHistory); | |||
| if (num <= 1) { | |||
| logger.error("核销积分历史回退失败: " + creditHistory.toString()); | |||
| return; | |||
| logger.warn("核销积分历史回退: " + creditHistory.toString()); | |||
| } | |||
| } catch (Exception e) { | |||
| logger.error("核销积分历史回退:" + e.getMessage()); | |||
| String errMessage = "核销积分历史回退:" + e.getMessage(); | |||
| logger.error(errMessage); | |||
| throw new MallinkException(500, errMessage); | |||
| } | |||
| // 2. 成长值历史回退 | |||
| try { | |||
| @@ -703,11 +706,12 @@ public class PosServiceImpl implements PosService { | |||
| scoreHistory.setOrderId(couponOrderCVo.getOrderId()); | |||
| int num = scoreRulesService.cancelScore(scoreHistory); | |||
| if (num <= 1) { | |||
| logger.error("核销成长值历史回退失败: " + scoreHistory.toString()); | |||
| return; | |||
| logger.warn("核销成长值历史回退: " + scoreHistory.toString()); | |||
| } | |||
| } catch (Exception e) { | |||
| logger.error("核销成长值历史回退:" + e.getMessage()); | |||
| String errMessage = "核销成长值历史回退:" + e.getMessage(); | |||
| logger.error(errMessage); | |||
| throw new MallinkException(500, errMessage); | |||
| } | |||
| // 3. update posOrderId | |||
| @@ -718,29 +722,28 @@ public class PosServiceImpl implements PosService { | |||
| posCouponOrderVerify.setState(EnumEnableType.Enable.getCode()); | |||
| List<PosCouponOrderVerify> posCouponOrderVerifyList = posCouponOrderVerifyService.getList(posCouponOrderVerify); | |||
| if (posCouponOrderVerifyList.size() == 1) { | |||
| try { | |||
| PosCouponOrderVerify updateOrder = new PosCouponOrderVerify(); | |||
| updateOrder.setId(posCouponOrderVerify.getId()); | |||
| updateOrder.setState(EnumEnableType.Disable.getCode()); | |||
| updateOrder.setUpdateDate(new Date()); | |||
| posCouponOrderVerifyService.saveOrUpdate(updateOrder); | |||
| } catch (Exception e) { | |||
| logger.error("db failed: couponOrder-" + couponOrderCVo.getId() + ", e:" + e.getMessage()); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); | |||
| posCouponOrderVerify = posCouponOrderVerifyList.get(0); | |||
| if (posCouponOrderVerify != null) { | |||
| try { | |||
| posCouponOrderVerifyService.deleteById(posCouponOrderVerify.getId()); | |||
| } catch(Exception e){ | |||
| logger.error("db failed: couponOrder-" + couponOrderCVo.getId() + ", e:" + e.getMessage()); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); | |||
| } | |||
| } | |||
| } else { | |||
| logger.error(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL.getMessage() + ": " + posOrderId); | |||
| throw new MallinkException(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL); | |||
| logger.error(ErrorCode.VERIFY_POS_ORDER_NOT_EQUAL.getMessage() + ": " + posOrderId); | |||
| throw new MallinkException(ErrorCode.VERIFY_POS_ORDER_NOT_EQUAL); | |||
| } | |||
| // 4. update couponOrder | |||
| int num = 0; | |||
| try { | |||
| WxCouponOrder couponOrder = new WxCouponOrder(); | |||
| couponOrder.setId(couponOrderCVo.getId()); | |||
| couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()); //1核销 | |||
| couponOrder.setBUserId(buUserId); | |||
| couponOrder.setTenantId(couponOrderCVo.getTenantId()); | |||
| couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); | |||
| couponOrder.setUpdateDate(new Date()); | |||
| num = couponOrderMapper.updateVerifyCouponOrder(couponOrder); | |||
| num = couponOrderMapper.cancelVerifyCouponOrder(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()); | |||
| @@ -149,7 +149,7 @@ public class PosAppTest { | |||
| } | |||
| @Test | |||
| public void couponOrderIndependForVerifyTest() throws Exception { | |||
| public void couponOrderIndependentVerifyTest() throws Exception { | |||
| Map<String, String> reqObj = new HashMap<>(); | |||
| reqObj.put(WxPayConstant.DEV_ID, devId); | |||
| reqObj.put(WxPayConstant.TENANT_ID, "456"); | |||
| @@ -173,4 +173,30 @@ public class PosAppTest { | |||
| System.out.println("response sign: " + resSigned); | |||
| Assert.assertEquals(resSigned, true); | |||
| } | |||
| @Test | |||
| public void couponOrderVerifyCancelTest() throws Exception { | |||
| Map<String, String> 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("/couponOrderVerifyCancel") | |||
| .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<String,String> respMap = mapper.readValue(responseStr, Map.class); | |||
| boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); | |||
| System.out.println("response sign: " + resSigned); | |||
| Assert.assertEquals(resSigned, true); | |||
| } | |||
| } | |||
| @@ -281,6 +281,7 @@ public enum ErrorCode{ | |||
| VERIFY_PRE_POS_ORDER_IS_EMPTY(12052, "预核销POS订单ID为空"), | |||
| VERIFY_PRE_POS_ORDER_NOT_EQUAL(12053, "预核销POS订单不一致,请先取消上次预核销"), | |||
| VERIFY_BUSER_MERCHANT_NOT_BELONG(12054, "核销员不属于此商户"), | |||
| VERIFY_POS_ORDER_NOT_EQUAL(12055, "核销POS订单不一致,请先取消上次预核销"), | |||
| MSG_REPEAT_SEND(12061, "短信重复发送"), | |||
| VERIFY_COUPON_ORDER_MERCHANT_IS_NULL(12062, "卡券核销失败,请查看适用门店"), | |||
| @@ -1,6 +1,8 @@ | |||
| package com.iformall.domain.po; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import javax.persistence.*; | |||
| import java.util.*; | |||
| import javax.persistence.Transient; | |||
| @@ -9,6 +11,7 @@ import javax.persistence.Id; | |||
| @Table(name = "th_dev_info") | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| public class ThDevInfo extends BaseEntity { | |||
| @Id | |||
| @@ -23,6 +23,7 @@ public interface WxCouponOrderMapper extends CommonMapper<WxCouponOrder, Long> { | |||
| // 券包核销 | |||
| int updateVerifyCouponOrder(WxCouponOrder wxCouponOrder); | |||
| int cancelVerifyCouponOrder(WxCouponOrder wxCouponOrder); | |||
| //统一的计数接口 | |||
| int findCount(WxCouponOrder wxCouponOrder); | |||
| @@ -246,10 +246,12 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService { | |||
| if (wxCreditHistory != null) { | |||
| num = wxCreditHistoryMapper.deleteByPrimaryKey(wxCreditHistory.getId()); | |||
| if (num != 1) { | |||
| logger.error("删除积分历史出错"+ wxCreditHistory.toString()); | |||
| String errMessage = "删除积分历史出错"; | |||
| logger.error(errMessage + wxCreditHistory.toString()); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), errMessage); | |||
| } | |||
| } else { | |||
| logger.error("未找到积分历史"); | |||
| logger.info("未找到积分历史"); | |||
| return 0; | |||
| } | |||
| // 2. user | |||
| @@ -2,11 +2,13 @@ package com.iformall.service.impl; | |||
| import com.alibaba.fastjson.JSONArray; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.IdWorker; | |||
| import com.iformall.domain.po.*; | |||
| import com.iformall.enums.EnumBusiness; | |||
| import com.iformall.enums.EnumScoreRules; | |||
| import com.iformall.enums.EnumScoreType; | |||
| import com.iformall.exception.MallinkException; | |||
| import com.iformall.mapper.WxCUserBasicInfoMapper; | |||
| import com.iformall.mapper.WxCUserMapper; | |||
| import com.iformall.mapper.WxScoreHistoryMapper; | |||
| @@ -198,6 +200,7 @@ public class WxScoreRulesServiceImpl implements WxScoreRulesService { | |||
| num = wxScoreHistoryMapper.deleteByPrimaryKey(history.getId()); | |||
| if (num != 1) { | |||
| logger.error("删除成长值历史出错"+ history.toString()); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "删除成长值历史出错"); | |||
| } | |||
| } else { | |||
| logger.error("未找到成长值历史"); | |||
| @@ -103,6 +103,14 @@ | |||
| where `tenant_id`=#{tenantId} and id=#{id} and `b_user_id` is null | |||
| </update> | |||
| <update id="cancelVerifyCouponOrder" parameterType="com.iformall.domain.po.WxCouponOrder"> | |||
| update wx_coupon_order | |||
| set `coupon_order_status` = #{couponOrderStatus}, | |||
| `b_user_id` = null, | |||
| `update_date` = #{updateDate} | |||
| where `tenant_id`=#{tenantId} and id=#{id} | |||
| </update> | |||
| <select id="couponDataMap" resultType="com.iformall.domain.vo.MarkingCouponDataReportVo" parameterType="hashmap"> | |||
| SELECT DATE_FORMAT(create_date,'%m/%d') as createTime, | |||
| COUNT(DISTINCT c_user_id) as couponUserCount, | |||