From eee8e04e227b044ee62f33e27b23e60e36cccf7f Mon Sep 17 00:00:00 2001 From: winter Date: Sat, 11 Mar 2023 08:28:32 +0800 Subject: [PATCH 1/6] fix card --- .../com/iformall/controller/WxCouponPasswordController.java | 6 +++--- .../java/com/iformall/service/impl/WxOrderServiceImpl.java | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java index 8ac08bf23..5fc0877ad 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java @@ -95,9 +95,9 @@ public class WxCouponPasswordController extends BaseController { if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); } - if (coupon.getPrice() <= 0) { - return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"卡面值未设置,请联系管理员."); - } +// if (coupon.getPrice() <= 0) { +// return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"卡面值未设置,请联系管理员."); +// } // 卡密领取卡券 Integer pwdStatus = couponPassword.getStatus(); diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index aaeb2149f..dff4f6140 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -1507,6 +1507,8 @@ public class WxOrderServiceImpl implements WxOrderService { if (null != couponPassWord) { cardInfo.setCouponPasswordId(couponPassWord.getId()); cardInfo.setCouponPassword(couponPassWord.getPassword()); + //后置卡券可能没有面额 + cardInfo.setAmount(couponPassWord.getPrice()); } cardInfo.setCUserId(user.getId()); cardInfo.setOwnerUserId(user.getId()); From bfb77d9d5b058e6b69c07d557c2665bdccc07a37 Mon Sep 17 00:00:00 2001 From: winter Date: Sat, 11 Mar 2023 09:06:47 +0800 Subject: [PATCH 2/6] fix card --- .../WxCouponPasswordController.java | 40 ++++++++++++++++--- .../enums/EnumCouponPasswordPayCheck.java | 36 +++++++++++++++++ 2 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordPayCheck.java diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java index 5fc0877ad..6fb625f51 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java @@ -42,30 +42,60 @@ public class WxCouponPasswordController extends BaseController { @Autowired OrderFactory orderFactory; - @ApiOperation(value = "根据卡密领卡", notes = "{\"password\":\"String\",\"formId\":\"String\"}") + @ApiOperation(value = "根据卡密领卡", notes = "{\"password\":\"String\",\"formId\":\"String\",\"payCheck\":\"String\"}") @PostMapping("getCouponOrderByPassword") public ResultData getCouponOrderByPassword(@RequestBody Map params) { logger.info("getCouponOrderByPassword: " + getIpAddr() + params.toString()); String password = params.get("password"); String formId = params.get("formId"); + String payCheck = params.get("payCheck"); Long memberId; try { memberId = getMemberId(); } catch (Exception e) { return new ResultData(Result.ERROR,e.getMessage()); } - return getCouponOrderByPassword(password, formId, memberId,EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD,EnumPayVersion.NO_VERSION); + return getCouponOrderByPassword(password, formId,payCheck, memberId,EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD,EnumPayVersion.NO_VERSION); } - private ResultData getCouponOrderByPassword(String password,String formId,Long memberId,EnumPayWay payWay,EnumPayVersion payVersion) { - + private ResultData getCouponOrderByPassword(String password,String formId,String payCheck,Long memberId,EnumPayWay payWay,EnumPayVersion payVersion) { + password = StringUtils.trimToNull(password); if (StringUtils.isBlank(password) || password.equalsIgnoreCase(Constant.UNDEFINED)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "password不能为空"); } + + if (StringUtils.isBlank(payCheck) || payCheck.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payCheck不能为空"); + } + + EnumCouponPasswordPayCheck payCheckEnum = null; + try { + payCheckEnum = EnumCouponPasswordPayCheck.getEnum(Integer.parseInt(payCheck)); + }catch (Exception e) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payCheck非法"); + } + if (null == payCheckEnum) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payCheck非法"); + } + + boolean isCardId = false; + if (password.length() > 10) { + isCardId = true; + } + // 1. 根据password获取领取的couponId WxCouponPassword couponPasswordQ = new WxCouponPassword(); couponPasswordQ.updateTenantInfo(getTenantInfo()); - couponPasswordQ.setPassword(password); + if (isCardId) { + try { + Long cardId = Long.parseLong(password); + couponPasswordQ.setId(cardId); + }catch (Exception e) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "password参数非法"); + } + }else { + couponPasswordQ.setPassword(password); + } couponPasswordQ.setExpireDate(new Date()); WxCouponPassword couponPassword = null; try { diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordPayCheck.java b/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordPayCheck.java new file mode 100644 index 000000000..aff7b5200 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumCouponPasswordPayCheck.java @@ -0,0 +1,36 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumCouponPasswordPayCheck { + + NO_CHECK(0, "无验证"), + PASSWORD(1, "密码"), + ZHIWEN(2, "指纹识别"); + + public static EnumCouponPasswordPayCheck getEnum(Integer code) { + for (EnumCouponPasswordPayCheck value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumCouponPasswordPayCheck(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} From 70c68f648bcc353b4c81bed859d64915454687e3 Mon Sep 17 00:00:00 2001 From: winter Date: Sat, 11 Mar 2023 14:09:26 +0800 Subject: [PATCH 3/6] fix card --- .../WxCouponPasswordController.java | 129 ++++++++++++------ .../impl/WxCouponPasswordServiceImpl.java | 29 +--- 2 files changed, 90 insertions(+), 68 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java index 6fb625f51..2644fd5dc 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java @@ -29,6 +29,9 @@ public class WxCouponPasswordController extends BaseController { @Autowired private WxCouponPasswordService couponPasswordService; + + @Autowired + private WxCardInfoService wxCardInfoService; @Autowired private WxCouponService couponService; @@ -42,41 +45,46 @@ public class WxCouponPasswordController extends BaseController { @Autowired OrderFactory orderFactory; - @ApiOperation(value = "根据卡密领卡", notes = "{\"password\":\"String\",\"formId\":\"String\",\"payCheck\":\"String\"}") + @ApiOperation(value = "根据卡密领卡", notes = "{\"password\":\"String\",\"formId\":\"String\",\"payCheck\":\"String\",\"payPassword\":\"String\"}") @PostMapping("getCouponOrderByPassword") public ResultData getCouponOrderByPassword(@RequestBody Map params) { logger.info("getCouponOrderByPassword: " + getIpAddr() + params.toString()); String password = params.get("password"); String formId = params.get("formId"); String payCheck = params.get("payCheck"); + String payPassword = params.get("payPassword"); Long memberId; try { memberId = getMemberId(); } catch (Exception e) { return new ResultData(Result.ERROR,e.getMessage()); } - return getCouponOrderByPassword(password, formId,payCheck, memberId,EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD,EnumPayVersion.NO_VERSION); + return getCouponOrderByPassword(password, formId,payCheck,payPassword, memberId,EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD,EnumPayVersion.NO_VERSION); } - private ResultData getCouponOrderByPassword(String password,String formId,String payCheck,Long memberId,EnumPayWay payWay,EnumPayVersion payVersion) { + private ResultData getCouponOrderByPassword(String password,String formId,String payCheck,String payPassword,Long memberId,EnumPayWay payWay,EnumPayVersion payVersion) { password = StringUtils.trimToNull(password); + payPassword = StringUtils.trimToNull(payPassword); if (StringUtils.isBlank(password) || password.equalsIgnoreCase(Constant.UNDEFINED)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "password不能为空"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "卡号或者卡密不能为空"); } - if (StringUtils.isBlank(payCheck) || payCheck.equalsIgnoreCase(Constant.UNDEFINED)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payCheck不能为空"); + payCheck = String.valueOf(EnumCouponPasswordPayCheck.NO_CHECK.getCode()); } - EnumCouponPasswordPayCheck payCheckEnum = null; try { payCheckEnum = EnumCouponPasswordPayCheck.getEnum(Integer.parseInt(payCheck)); }catch (Exception e) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payCheck非法"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "支付校验方式非法"); } if (null == payCheckEnum) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payCheck非法"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "支付校验方式非法"); } + if (payCheckEnum.getCode().intValue() == EnumCouponPasswordPayCheck.PASSWORD.getCode().intValue()) { + if (StringUtils.isBlank(payPassword) || payPassword.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "支付密码不能为空"); + } + } boolean isCardId = false; if (password.length() > 10) { @@ -97,22 +105,46 @@ public class WxCouponPasswordController extends BaseController { couponPasswordQ.setPassword(password); } couponPasswordQ.setExpireDate(new Date()); - WxCouponPassword couponPassword = null; - try { - couponPassword = couponPasswordService.getByObj(couponPasswordQ); - } catch (MallinkException e) { - logger.error(e.getMessage()); - return new ResultData(e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - logger.error(e.getMessage()); - return new ResultData(500, e.getMessage()); + WxCouponPassword couponPassword = couponPasswordService.getByObj(couponPasswordQ); + if (null == couponPassword) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "卡未查询到"); + } + + WxCardInfo cardInfo = null; + Long cardId = couponPassword.getCardId(); + //如果卡已经被激活,但是绑定的用户是系统默认用户,则是线下卡进行绑定,仍然可以继续 + boolean isDefaultUser = false; + if (null != cardId) { + cardInfo = wxCardInfoService.getById(cardId); + if (null == cardInfo) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "当前卡已激活电子卡,但是电子卡未查询到,请联系管理员"); + } + if (cardInfo.getOwnerUserId().equals(memberId)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "当前卡已经属于您,无需再次激活"); + } + if (cardInfo.getOwnerUserId().equals(Constant.defaultCUserId)) { + isDefaultUser = true; + } + } + + if (!isDefaultUser) { + if (couponPassword.getStatus().equals(EnumCouponPasswordStatus.USED.getCode())) { + throw new MallinkException(ErrorCode.COUPON_PASSWORD_NOT_FOUND.getCode(), "卡已经激活过,不允许当前操作"); + } } + + if (couponPassword.getStatus().equals(EnumCouponPasswordStatus.CANCEL.getCode())) { + throw new MallinkException(ErrorCode.COUPON_PASSWORD_NOT_FOUND.getCode(), "卡已作废,不能激活"); + } + if (couponPassword.getIsStop().intValue() == EnumYesOrNo.YES.getCode().intValue()) { - return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"卡密已经停用"); + return new ResultData(ErrorCode.COUPON_IS_EMPTY.getCode(),"卡已经停用"); } + if (couponPassword.getPrice() <= 0) { - return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"卡密面值未设置,请联系管理员."); + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"卡面值未设置,请联系管理员."); } + WxCUserBasicInfo member = userService.getById(memberId,getFinalTenantId()); if(member == null) { throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "会员用户未找到" + memberId); @@ -122,41 +154,54 @@ public class WxCouponPasswordController extends BaseController { if (coupon == null) { return new ResultData(ErrorCode.COUPON_IS_EMPTY); } - if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { - return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + //如果是线下已经使用的卡,券作废了,卡仍然可以进行绑定 + if (!isDefaultUser) { + if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + } } -// if (coupon.getPrice() <= 0) { -// return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"卡面值未设置,请联系管理员."); -// } // 卡密领取卡券 Integer pwdStatus = couponPassword.getStatus(); - setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.USED); + setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.USED,payCheckEnum,payPassword); couponPassword.setStatus(EnumCouponPasswordStatus.USED.getCode()); // 3. 领取free coupon - try { - WxComposeOrder composeOrder = orderFactory.getOrderAdapterService(EnumComposeOrder.SINGLE.getCode()).createDBMainOrder(coupon, member, 0, payWay,payVersion); - WxOrder order = orderService.saveFreeOrderForCoupon(new Date(),false,composeOrder,member, coupon, 1, - null, formId, couponPassword,null,payWay,payVersion, - EnumOrderShopingType.ONLINE_PURCHASE.getCode(),null,false); - } catch (MallinkException e) { - setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.getEnum(pwdStatus)); - logger.error(e.getMessage(),e); - return new ResultData(e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.getEnum(pwdStatus)); - logger.error(e.getMessage(),e); - return new ResultData(500, e.getMessage()); - } + if (null == cardInfo) { + try { + WxComposeOrder composeOrder = orderFactory.getOrderAdapterService(EnumComposeOrder.SINGLE.getCode()).createDBMainOrder(coupon, member, 0, payWay,payVersion); + WxOrder order = orderService.saveFreeOrderForCoupon(new Date(),false,composeOrder,member, coupon, 1, + null, formId, couponPassword,null,payWay,payVersion, + EnumOrderShopingType.ONLINE_PURCHASE.getCode(),null,false); + } catch (MallinkException e) { + setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.getEnum(pwdStatus),null,null); + logger.error(e.getMessage(),e); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.getEnum(pwdStatus),null,null); + logger.error(e.getMessage(),e); + return new ResultData(500, e.getMessage()); + } + }else { + try { + cardInfo.setOwnerUserId(memberId); + cardInfo.setUpdateDate(new Date()); + wxCardInfoService.saveOrUpdate(cardInfo); + }catch(Exception e) { + logger.error(e.getMessage(),e); + return new ResultData(500, e.getMessage()); + } + } return new ResultData(); } - private void setCouponPasswordStatus(WxCouponPassword couponPassword, EnumCouponPasswordStatus pwdStatus) { + private void setCouponPasswordStatus(WxCouponPassword couponPassword, EnumCouponPasswordStatus pwdStatus,EnumCouponPasswordPayCheck payCheckEnum,String payPassword) { WxCouponPassword updateCouponPwd = new WxCouponPassword(); updateCouponPwd.setId(couponPassword.getId()); updateCouponPwd.setStatus(pwdStatus.getCode()); + if (null != payCheckEnum && payCheckEnum.getCode().intValue() == EnumCouponPasswordPayCheck.PASSWORD.getCode().intValue()) { + updateCouponPwd.setPayPassword(payPassword); + } couponPasswordService.saveOrUpdate(updateCouponPwd); } - } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java index 68448e5dd..f224a7c0f 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java @@ -198,34 +198,11 @@ public class WxCouponPasswordServiceImpl implements WxCouponPasswordService { @Override public WxCouponPassword getByObj(WxCouponPassword obj) { - String errMsg = "兑换码已失效"; List pwdList = wxCouponPasswordMapper.findList(obj); - if (pwdList.size() <= 0) { - logger.error(ErrorCode.COUPON_PASSWORD_NOT_FOUND.getMessage()); - throw new MallinkException(ErrorCode.COUPON_PASSWORD_NOT_FOUND.getCode(), errMsg); - } - - WxCouponPassword password = null; - Integer errCode = EnumCouponPasswordStatus.INIT.getCode(); - for( WxCouponPassword pwd: pwdList) { - if (pwd.getStatus().equals(EnumCouponPasswordStatus.USED.getCode())) { - errCode = EnumCouponPasswordStatus.USED.getCode(); - continue; - } - if (!pwd.getStatus().equals(EnumCouponPasswordStatus.USED.getCode()) && - !pwd.getStatus().equals(EnumCouponPasswordStatus.CANCEL.getCode())) { - password = pwd; - } - } - if (password == null) { - if (errCode.equals(EnumCouponPasswordStatus.USED.getCode())) { - logger.error(ErrorCode.COUPON_PASSWORD_HAD_USED.getMessage()); - throw new MallinkException(ErrorCode.COUPON_PASSWORD_HAD_USED.getCode(), errMsg); - } else { - logger.error(ErrorCode.COUPON_PASSWORD_IS_CANCELED.getMessage()); - throw new MallinkException(ErrorCode.COUPON_PASSWORD_IS_CANCELED.getCode(), errMsg); - } + if (null == pwdList || pwdList.size() != 1 ) { + return null; } + WxCouponPassword password = pwdList.get(0); return password; } From f357261d20b1132518411a1ce0cd84a18f3130fc Mon Sep 17 00:00:00 2001 From: winter Date: Sat, 11 Mar 2023 14:55:21 +0800 Subject: [PATCH 4/6] fix card --- .../WxCouponPasswordController.java | 63 +++++++++++++++++++ .../schedule/CouponOrderNoticeSchedule.java | 4 +- .../impl/WxCouponOrderServiceImpl.java | 16 ++--- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java index 2644fd5dc..4df560f7c 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java @@ -11,6 +11,8 @@ import com.iformall.service.order.OrderFactory; import com.iformall.service.order.entity.WxComposeOrder; import com.iformall.utils.Constant; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -19,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Date; +import java.util.HashMap; import java.util.Map; @RestController @@ -204,4 +207,64 @@ public class WxCouponPasswordController extends BaseController { } couponPasswordService.saveOrUpdate(updateCouponPwd); } + + @ApiOperation(value = "查询卡详情") + @GetMapping("getCardDetail") + @ApiImplicitParams({ + @ApiImplicitParam(name = "cardId", value = "券ID", dataType = "String", paramType = "query", required = true) + }) + public ResultData getCardDetail(String cardId) { + if (StringUtils.isBlank(cardId) || cardId.equalsIgnoreCase(Constant.UNDEFINED)) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"参数错误."); + } + cardId = StringUtils.trimToNull(cardId); + WxCouponPassword password = null; + try { + password = couponPasswordService.getById(Long.parseLong(cardId)); + if (null == password) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"参数错误."); + } + }catch(Exception e) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"参数错误."); + } + WxCoupon coupon = couponService.getById(password.getCouponId(),password.getTenantId()); + if (coupon == null) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + + Map retMap = new HashMap(); + retMap.put("title", coupon.getTitle()); + retMap.put("couponPasswordId", password.getId()); + if (null != password.getCardId()) { + WxCardInfo cardInfo = wxCardInfoService.getById(password.getCardId()); + if (null != cardInfo) { + Long owner = cardInfo.getOwnerUserId(); + if (!owner.equals(Constant.defaultCUserId)) { + WxCUserBasicInfo user = userService.getById(owner, password.getFinalTenantId()); + if (null != user) { + retMap.put("owner", user.getPhone()); + } + } + } + } + + return new ResultData(retMap); + } + + @ApiOperation(value = "实体卡转赠", notes = "{\"cardId\":\"String\",\"formId\":\"String\",\"payCheck\":\"String\",\"payPassword\":\"String\"}") + @PostMapping("transfer") + public ResultData transfer(@RequestBody Map params) { + logger.info("getCouponOrderByPassword: " + getIpAddr() + params.toString()); + String password = params.get("password"); + String formId = params.get("formId"); + String payCheck = params.get("payCheck"); + String payPassword = params.get("payPassword"); + Long memberId; + try { + memberId = getMemberId(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + return getCouponOrderByPassword(password, formId,payCheck,payPassword, memberId,EnumPayWay.PAY_WAY_NOT_UNPAY_PASSWD,EnumPayVersion.NO_VERSION); + } } diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderNoticeSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderNoticeSchedule.java index fc784a541..e8868ec24 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderNoticeSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderNoticeSchedule.java @@ -121,7 +121,7 @@ public class CouponOrderNoticeSchedule { public void couponOrderExpiringSchedule() { List malls = getMalls(); for (WxMall mall: malls) { - Date oneDayBefore = DateUtils.getTimeAfterDays(-1, new Date()); + Date oneDayBefore = DateUtils.getTimeAfterDays(1, new Date()); List list = wxCouponOrderMapper.findExpiredFreeCouponOrderByValidDate(mall.getTenantId(),oneDayBefore); if (null != list && list.size() > 0 ) { list.stream().forEach(co -> { @@ -143,7 +143,7 @@ public class CouponOrderNoticeSchedule { public void couponOrderRefundSchedule() { List malls = getMalls(); for (WxMall mall: malls) { - Date oneDayBefore = DateUtils.getTimeAfterDays(-1, new Date()); + Date oneDayBefore = DateUtils.getTimeAfterDays(1, new Date()); List list = wxCouponOrderMapper.findExpiredCouponOrderByValidDate(mall.getTenantId(),oneDayBefore); if (null != list && list.size() > 0 ) { list.stream().forEach(co -> { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java index 02c1eb2db..14c38ee76 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java @@ -2555,10 +2555,10 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { //判断卡是否已消费 //面额与余额是否相同 - if (!cardCVo.getAmount().equals(cardCVo.getRemainingAmount())) { - logger.info("面额与余额不相同"); - return new ResultData(ErrorCode.CARD_TRANSFER_INVALID); - } +// if (!cardCVo.getAmount().equals(cardCVo.getRemainingAmount())) { +// logger.info("面额与余额不相同"); +// return new ResultData(ErrorCode.CARD_TRANSFER_INVALID); +// } //保存到转赠表中 id,coupon_order_id,tenant_id,title,amount,remain_amount,from_user,to_user,status,create_date,update_date try { saveCardTransfer(record, cardCVo); @@ -2611,10 +2611,10 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { //判断卡是否已消费 //面额与余额是否相同 - if (!cardCVo.getAmount().equals(cardCVo.getRemainingAmount())) { - logger.info("面额与余额不相同"); - return new ResultData(ErrorCode.CARD_TRANSFER_INVALID); - } +// if (!cardCVo.getAmount().equals(cardCVo.getRemainingAmount())) { +// logger.info("面额与余额不相同"); +// return new ResultData(ErrorCode.CARD_TRANSFER_INVALID); +// } return new ResultData(Result.SUCCESS, "查询成功"); } From 654b6721f4abaddac2e23320c5472e8ebf774e65 Mon Sep 17 00:00:00 2001 From: winter Date: Sat, 11 Mar 2023 15:42:17 +0800 Subject: [PATCH 5/6] fix card --- .../controller/WxCouponPasswordController.java | 2 ++ .../iformall/domain/vo/WxCardPriceTemplate.java | 4 ++-- .../service/impl/WxCouponPasswordServiceImpl.java | 14 ++++++++++++-- .../iformall/service/impl/WxOrderServiceImpl.java | 3 ++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java index 4df560f7c..0bc03401b 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java @@ -127,6 +127,8 @@ public class WxCouponPasswordController extends BaseController { } if (cardInfo.getOwnerUserId().equals(Constant.defaultCUserId)) { isDefaultUser = true; + }else { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "当前卡已经绑定激活,不能进行此操作"); } } diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxCardPriceTemplate.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxCardPriceTemplate.java index f4c7bb282..28accfcaa 100644 --- a/mallinkService/src/main/java/com/iformall/domain/vo/WxCardPriceTemplate.java +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxCardPriceTemplate.java @@ -14,11 +14,11 @@ public class WxCardPriceTemplate implements Serializable { private static final long serialVersionUID = -2321650008236516884L; @NotNull - @Excel(name="卡ID",width = 20,orderNum = "1") + @Excel(name="*卡ID",width = 20,orderNum = "1") @io.swagger.annotations.ApiModelProperty(value="ID",name="couponPasswordId") private String couponPasswordId; @NotNull - @Excel(name="面额(元)",width = 20,orderNum = "2") + @Excel(name="*面额(元)",width = 20,orderNum = "2") @io.swagger.annotations.ApiModelProperty(value="面额(元)",name="price") private String price; } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java index f224a7c0f..2885a6826 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCouponPasswordServiceImpl.java @@ -330,10 +330,20 @@ public class WxCouponPasswordServiceImpl implements WxCouponPasswordService { public void exportTemplate(HttpServletRequest request, HttpServletResponse response) { List list = new ArrayList<>(); WxCardPriceTemplate u1 = new WxCardPriceTemplate(); - u1.setCouponPasswordId("输入卡号ID"); - u1.setPrice("输入面额"); + u1.setCouponPasswordId("336482251798482944"); + u1.setPrice("500"); + + WxCardPriceTemplate u2 = new WxCardPriceTemplate(); + u2.setCouponPasswordId("336482251802677248"); + u2.setPrice("500.5"); + + WxCardPriceTemplate u3 = new WxCardPriceTemplate(); + u3.setCouponPasswordId("336482251802677249"); + u3.setPrice("500.53"); list.add(u1); + list.add(u2); + list.add(u3); excelService.exportExcel(list, null, "卡设置面额模板", WxCardPriceTemplate.class, "卡设置面额模板.xlsx", response, true); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index dff4f6140..6720f4140 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -1503,16 +1503,17 @@ public class WxOrderServiceImpl implements WxOrderService { cardInfo.updateTenantInfo(order); cardInfo.setCouponId(order.getProductId()); cardInfo.setAmount(coupon.getPrice()); + cardInfo.setRemainingAmount(coupon.getPrice()); cardInfo.setSaleAmount(coupon.getSalePrice()); if (null != couponPassWord) { cardInfo.setCouponPasswordId(couponPassWord.getId()); cardInfo.setCouponPassword(couponPassWord.getPassword()); //后置卡券可能没有面额 cardInfo.setAmount(couponPassWord.getPrice()); + cardInfo.setRemainingAmount(couponPassWord.getPrice()); } cardInfo.setCUserId(user.getId()); cardInfo.setOwnerUserId(user.getId()); - cardInfo.setRemainingAmount(coupon.getPrice()); if (!coupon.checkIsFree()) { //判断该transctionId是否已经存在,如果存在,则不添加 WxCardInfo cardInfoq = new WxCardInfo(); From 6da858567ab4f0d819a84438abd576dce21ed236 Mon Sep 17 00:00:00 2001 From: winter Date: Sat, 11 Mar 2023 16:29:34 +0800 Subject: [PATCH 6/6] fix card --- .../WxCouponPasswordController.java | 17 +- .../iformall/domain/po/WxCouponPassword.java | 5 + .../service/impl/WxOrderServiceImpl.java | 172 ++++++++++-------- 3 files changed, 103 insertions(+), 91 deletions(-) diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java index 0bc03401b..ee206d5b3 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java @@ -112,7 +112,7 @@ public class WxCouponPasswordController extends BaseController { if (null == couponPassword) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "卡未查询到"); } - + couponPassword.setDefaultUser(false); WxCardInfo cardInfo = null; Long cardId = couponPassword.getCardId(); //如果卡已经被激活,但是绑定的用户是系统默认用户,则是线下卡进行绑定,仍然可以继续 @@ -127,6 +127,8 @@ public class WxCouponPasswordController extends BaseController { } if (cardInfo.getOwnerUserId().equals(Constant.defaultCUserId)) { isDefaultUser = true; + couponPassword.setDefaultUser(true); + couponPassword.setWxCardInfo(cardInfo); }else { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "当前卡已经绑定激活,不能进行此操作"); } @@ -172,7 +174,7 @@ public class WxCouponPasswordController extends BaseController { couponPassword.setStatus(EnumCouponPasswordStatus.USED.getCode()); // 3. 领取free coupon - if (null == cardInfo) { + if (null == cardInfo || couponPassword.isDefaultUser()) { try { WxComposeOrder composeOrder = orderFactory.getOrderAdapterService(EnumComposeOrder.SINGLE.getCode()).createDBMainOrder(coupon, member, 0, payWay,payVersion); WxOrder order = orderService.saveFreeOrderForCoupon(new Date(),false,composeOrder,member, coupon, 1, @@ -187,16 +189,7 @@ public class WxCouponPasswordController extends BaseController { logger.error(e.getMessage(),e); return new ResultData(500, e.getMessage()); } - }else { - try { - cardInfo.setOwnerUserId(memberId); - cardInfo.setUpdateDate(new Date()); - wxCardInfoService.saveOrUpdate(cardInfo); - }catch(Exception e) { - logger.error(e.getMessage(),e); - return new ResultData(500, e.getMessage()); - } - } + } return new ResultData(); } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPassword.java b/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPassword.java index 5b9d1ed0d..ab90e940f 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPassword.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxCouponPassword.java @@ -61,5 +61,10 @@ public class WxCouponPassword extends TenantEntity { @TableField(exist = false) private String statusStr; + + @TableField(exist = false) + private boolean isDefaultUser; + @TableField(exist = false) + private WxCardInfo wxCardInfo; } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 6720f4140..849b564d2 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -1498,71 +1498,80 @@ public class WxOrderServiceImpl implements WxOrderService { /// 储值卡信息添加 if (isCard) { Integer fee = 0; - WxCardInfo cardInfo = new WxCardInfo(); - cardInfo.setId(couponOrder.getId()); - cardInfo.updateTenantInfo(order); - cardInfo.setCouponId(order.getProductId()); - cardInfo.setAmount(coupon.getPrice()); - cardInfo.setRemainingAmount(coupon.getPrice()); - cardInfo.setSaleAmount(coupon.getSalePrice()); - if (null != couponPassWord) { - cardInfo.setCouponPasswordId(couponPassWord.getId()); - cardInfo.setCouponPassword(couponPassWord.getPassword()); - //后置卡券可能没有面额 - cardInfo.setAmount(couponPassWord.getPrice()); - cardInfo.setRemainingAmount(couponPassWord.getPrice()); - } - cardInfo.setCUserId(user.getId()); - cardInfo.setOwnerUserId(user.getId()); - if (!coupon.checkIsFree()) { - //判断该transctionId是否已经存在,如果存在,则不添加 - WxCardInfo cardInfoq = new WxCardInfo(); - cardInfoq.setTransactionId(payOrder.getTransactionId()); - List cardInfoList = wxCardInfoMapper.findList(cardInfoq); - if (null != cardInfoList && cardInfoList.size() > 0) { - //do nothing - }else { - WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(cardInfo.getTenantId(), EnumAppPlat.WX); - if(cAppInfo == null){ - throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND); - } - WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); - if(payAccount == null){ - throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND); - } - // 有价卡 - cardInfo.setTransactionId(payOrder.getTransactionId()); - WxComposeChildOrderShare share = payOrder.getChildOrderShare(order.getId()); - fee = OrderHelper.getRealRateAmount(share.getRealPayMent(), payAccount); - Integer shareAmount = share.getRealPayMent() - fee; - cardInfo.setShareFeeAmount(shareAmount); - cardInfo.setRemainingShareFeeAmount(shareAmount); - cardInfo.setRateAmount(0); - } - } else { - // 免费卡 - cardInfo.setShareFeeAmount(0); - cardInfo.setRemainingShareFeeAmount(0); - cardInfo.setRateAmount(0); - if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { - WxCouponPassword updateCPwd = new WxCouponPassword(); - updateCPwd.setId(couponPassWord.getId()); - updateCPwd.setCardId(cardInfo.getId()); - updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); - couponPasswordMapper.updateById(updateCPwd); - } - } - - cardInfo.setServiceFeeAmount(fee); - cardInfo.setCreateDate(curr); - cardInfo.setUpdateDate(curr); - cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - //检查卡是否下架,如果是,不可转赠 - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); - if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { - cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); - } - wxCardInfoMapper.insert(cardInfo); + WxCardInfo cardInfo = null; + if (null != couponPassWord && couponPassWord.isDefaultUser()) { + cardInfo = couponPassWord.getWxCardInfo(); + cardInfo.setUpdateDate(curr); + cardInfo.setOwnerUserId(user.getId()); + cardInfo.setCUserId(user.getId()); + wxCardInfoMapper.updateById(cardInfo); + }else { + cardInfo = new WxCardInfo(); + cardInfo.setId(couponOrder.getId()); + cardInfo.updateTenantInfo(order); + cardInfo.setCouponId(order.getProductId()); + cardInfo.setAmount(coupon.getPrice()); + cardInfo.setRemainingAmount(coupon.getPrice()); + cardInfo.setSaleAmount(coupon.getSalePrice()); + if (null != couponPassWord) { + cardInfo.setCouponPasswordId(couponPassWord.getId()); + cardInfo.setCouponPassword(couponPassWord.getPassword()); + //后置卡券可能没有面额 + cardInfo.setAmount(couponPassWord.getPrice()); + cardInfo.setRemainingAmount(couponPassWord.getPrice()); + } + cardInfo.setCUserId(user.getId()); + cardInfo.setOwnerUserId(user.getId()); + if (!coupon.checkIsFree()) { + //判断该transctionId是否已经存在,如果存在,则不添加 + WxCardInfo cardInfoq = new WxCardInfo(); + cardInfoq.setTransactionId(payOrder.getTransactionId()); + List cardInfoList = wxCardInfoMapper.findList(cardInfoq); + if (null != cardInfoList && cardInfoList.size() > 0) { + //do nothing + }else { + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfoFromRedis(cardInfo.getTenantId(), EnumAppPlat.WX); + if(cAppInfo == null){ + throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND); + } + WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(cAppInfo.getPayId()); + if(payAccount == null){ + throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND); + } + // 有价卡 + cardInfo.setTransactionId(payOrder.getTransactionId()); + WxComposeChildOrderShare share = payOrder.getChildOrderShare(order.getId()); + fee = OrderHelper.getRealRateAmount(share.getRealPayMent(), payAccount); + Integer shareAmount = share.getRealPayMent() - fee; + cardInfo.setShareFeeAmount(shareAmount); + cardInfo.setRemainingShareFeeAmount(shareAmount); + cardInfo.setRateAmount(0); + } + } else { + // 免费卡 + cardInfo.setShareFeeAmount(0); + cardInfo.setRemainingShareFeeAmount(0); + cardInfo.setRateAmount(0); + if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { + WxCouponPassword updateCPwd = new WxCouponPassword(); + updateCPwd.setId(couponPassWord.getId()); + updateCPwd.setCardId(cardInfo.getId()); + updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPasswordMapper.updateById(updateCPwd); + } + } + + cardInfo.setServiceFeeAmount(fee); + cardInfo.setCreateDate(curr); + cardInfo.setUpdateDate(curr); + cardInfo.setSupportTransfer(coupon.getSupportTransfer()); + //检查卡是否下架,如果是,不可转赠 + WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); + if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { + cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); + } + wxCardInfoMapper.insert(cardInfo); + } } try{ @@ -3061,8 +3070,25 @@ public class WxOrderServiceImpl implements WxOrderService { Integer shippingType, UserBasicInfoAddress address,boolean isPressOrder) { WxOrderServiceImpl proxy = (WxOrderServiceImpl) AopContext.currentProxy(); - // 减库存操作 - StockReduceResult stockReduceResult = proxy.stockReduce(allowUnPayOrder,user, coupon,couponChannel,couponNumber,isPressOrder); + //实体卡未激活的,已经消费了,不用再扣库存 + if (null != wxCouponPassword && wxCouponPassword.isDefaultUser()) { + //do nothing + }else { + // 减库存操作 + StockReduceResult stockReduceResult = proxy.stockReduce(allowUnPayOrder,user, coupon,couponChannel,couponNumber,isPressOrder); + //渠道的库存和价格可以随时修改。这里需要校验一下 + if (stockReduceResult.isChannelStockReduce()) { + //再查询一下,此时有可能价格已经修改 + WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(couponChannel.getId(),coupon.getTenantId()); + //如果这个时候渠道价格已经清空了 + if (null == wxCouponChannel.getChannelPrice()) { + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]渠道价格已变动[清空],请刷新后重新下单."); + } + if (wxCouponChannel.getChannelPrice().intValue() > 0 ) { + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]渠道价格已非免费,请刷新后重新下单."); + } + } + } // 当积分券或者积分停车券时 则进行积分支付 Integer orderType; @@ -3073,18 +3099,6 @@ public class WxOrderServiceImpl implements WxOrderService { orderType = EnumOrderType.COUPON.getCode(); } - //渠道的库存和价格可以随时修改。这里需要校验一下 - if (stockReduceResult.isChannelStockReduce()) { - //再查询一下,此时有可能价格已经修改 - WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(couponChannel.getId(),coupon.getTenantId()); - //如果这个时候渠道价格已经清空了 - if (null == wxCouponChannel.getChannelPrice()) { - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]渠道价格已变动[清空],请刷新后重新下单."); - } - if (wxCouponChannel.getChannelPrice().intValue() > 0 ) { - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]渠道价格已非免费,请刷新后重新下单."); - } - } // 4. 保存Order WxOrder record = new WxOrder();