diff --git a/jpress-service-api/src/main/java/io/jpress/service/CouponCodeService.java b/jpress-service-api/src/main/java/io/jpress/service/CouponCodeService.java index 7ad292db1a628f88bf858fbd750d90c4fe24a93a..bf06a38b0f9798babad4ce8f69320d348ee1e0d1 100644 --- a/jpress-service-api/src/main/java/io/jpress/service/CouponCodeService.java +++ b/jpress-service-api/src/main/java/io/jpress/service/CouponCodeService.java @@ -91,4 +91,13 @@ public interface CouponCodeService extends JbootServiceJoiner { public long queryCountByCouponId(long couponId); -} \ No newline at end of file + + + List findAvailableByUserId(Long userid, BigDecimal orderTotalAmount); + + List findAvailableList(long userid); + + List findExpire(long userid); + + List findUsed(long userid); +} diff --git a/jpress-service-api/src/main/java/io/jpress/service/MemberService.java b/jpress-service-api/src/main/java/io/jpress/service/MemberService.java index e083715bb04e571ad9b402b709c8fb4861b0a234..370cb23708012b22139662bbbedad49f8c791cd5 100644 --- a/jpress-service-api/src/main/java/io/jpress/service/MemberService.java +++ b/jpress-service-api/src/main/java/io/jpress/service/MemberService.java @@ -83,4 +83,6 @@ public interface MemberService { public Member findByGroupIdAndUserId(Long groupId, Long payerUserId); -} \ No newline at end of file + + boolean isMember(long userid); +} diff --git a/jpress-service-provider/src/main/java/io/jpress/service/provider/CouponCodeServiceProvider.java b/jpress-service-provider/src/main/java/io/jpress/service/provider/CouponCodeServiceProvider.java index d96858942b781767e70bae88f435459bc5eabda3..7d88d68819ff17a42280452eafe2de1acd22d192 100644 --- a/jpress-service-provider/src/main/java/io/jpress/service/provider/CouponCodeServiceProvider.java +++ b/jpress-service-provider/src/main/java/io/jpress/service/provider/CouponCodeServiceProvider.java @@ -9,17 +9,14 @@ import io.jboot.db.model.Columns; import io.jboot.service.JbootServiceBase; import io.jpress.model.Coupon; import io.jpress.model.CouponCode; +import io.jpress.model.CouponUsedRecord; import io.jpress.model.Member; -import io.jpress.service.CouponCodeService; -import io.jpress.service.CouponService; -import io.jpress.service.MemberService; -import io.jpress.service.UserService; +import io.jpress.service.*; import org.apache.commons.lang.time.DateUtils; import java.math.BigDecimal; import java.text.DecimalFormat; -import java.util.Date; -import java.util.List; +import java.util.*; @Bean public class CouponCodeServiceProvider extends JbootServiceBase implements CouponCodeService { @@ -34,6 +31,9 @@ public class CouponCodeServiceProvider extends JbootServiceBase impl @Inject private MemberService memberService; + @Inject + private CouponUsedRecordService couponUsedRecordService; + @Override public Page paginateByCouponId(int page, int pageSize, Long couponId) { return userService.join(paginateByColumns(page, pageSize, Columns.create("coupon_id", couponId), "id desc"), "user_id"); @@ -125,4 +125,186 @@ public class CouponCodeServiceProvider extends JbootServiceBase impl public long queryCountByCouponId(long couponId) { return findCountByColumns(Columns.create("coupon_id",couponId)); } -} \ No newline at end of file + + /**& + * 支付时,找出可用的优惠券 + * @param couponCode + * @param currentUserId + * @param orderTotalAmount 总价格 + * @return + */ + private boolean checkCouponCode(CouponCode couponCode,long currentUserId,BigDecimal orderTotalAmount){ + + //该优惠码不存在或已失效 + if (couponCode == null || !couponCode.isNormal()) { + return false; + } + Coupon coupon = couponService.findById(couponCode.getCouponId()); + // 该优惠券不可用 + if (coupon == null || !coupon.isNormal()) { + return false; + } + couponCode.put("coupon",coupon); + //是否是只有优惠券拥有者可用 + Boolean withOwner = coupon.getWithOwner(); + if (withOwner) { + if (!couponCode.getUserId().equals(currentUserId)){ + return false; + } + } + //是不是会员可用 + if (coupon.getWithMember()){ + if (!memberService.isMember(currentUserId)){ + return false; + } + } + if (checkCouponCodeDiscount(orderTotalAmount, coupon)) { + return false; + } + + if (!isCouponCodeUnExpire(coupon,couponCode)){ + return false; + } + + + return true; + } + /** + * 检查使用的优惠券价格是否有效;满减券生效 + * @return + */ + private boolean checkCouponCodeDiscount(BigDecimal orderTotalAmount, Coupon coupon) { + //如果是满减券,检查价格是否有效 + int couponType = coupon.getType(); + if (couponType == Coupon.TYPE_FULL_DISCOUNT){ + BigDecimal withAmount = coupon.getWithAmount(); + if (withAmount == null || withAmount.compareTo(BigDecimal.ZERO) < 0) { + return true; + } + + if (orderTotalAmount.compareTo(coupon.getWithAmount()) < 0) { + return true; + } + + } + return false; + } + + + + /** + * 检查优惠券有效期是否正常 + * @param coupon + * @param couponCode + * @return + */ + private boolean isCouponCodeUnExpire(Coupon coupon, CouponCode couponCode){ + //检查优惠券时效 + Date validTime = couponCode.getValidTime(); + int validtype = coupon.getValidType(); + + //绝对时间内有效 + if (validtype == Coupon.VALID_TYPE_ABSOLUTELY_EFFECTIVE) { + boolean timeValide = validTime.getTime() > coupon.getValidStartTime().getTime() + && validTime.getTime() < coupon.getValidEndTime().getTime(); + + if (!timeValide) { + return false; + } + } + //相对时间内有效 + else if (validtype == Coupon.VALID_TYPE_RELATIVELY_EFFECTIVE) { + boolean timeValide = System.currentTimeMillis() < DateUtils.addDays(validTime, coupon.getValidDays()).getTime(); + if (!timeValide) { + return false; + } + } + return true; + } + + + /** + * 支付时可选择;获取用户可用的券码 + */ + @Override + public List findAvailableByUserId(Long userid, BigDecimal orderTotalAmount){ + List couponCodes = findListByColumns(Columns.create().add("user_id", userid)); + List removeList = new ArrayList<>(); + for(CouponCode code:couponCodes){ + if (!checkCouponCode(code,userid,orderTotalAmount)){ + removeList.add(code); + } + } + couponCodes.removeAll(removeList); + return couponCodes; + } + + /** + * 获取有效的优惠券码列表,个人中心中使用 + * @param userid + * @return + */ + @Override + public List findAvailableList(long userid){ + List couponCodes = findListByColumns(Columns.create().add("user_id", userid).add("status",CouponCode.STATUS_NORMAL)); + List finalList = new ArrayList<>(); + for(CouponCode couponCode:couponCodes){ + //没过期,normal状态的 + Coupon coupon = couponService.findById(couponCode.getCouponId()); + if (coupon!=null){ + boolean couponCodeUnExpire = isCouponCodeUnExpire(coupon, couponCode); + if (couponCodeUnExpire && coupon.isNormal()){ + couponCode.put("coupon",coupon); + finalList.add(couponCode); + } + } + } + return finalList; + } + + /** + * 获取过期的优惠券码,个人中心中使用 + */ + @Override + public List findExpire(long userid){ + + List couponCodes = findListByColumns(Columns.create().add("user_id", userid).add("status",CouponCode.STATUS_NORMAL)); + List finalList = new ArrayList<>(); + for(CouponCode couponCode:couponCodes){ + //没过期,normal状态的 + Coupon coupon = couponService.findById(couponCode.getCouponId()); + if (coupon!=null){ + boolean couponCodeUnExpire = isCouponCodeUnExpire(coupon, couponCode); + if (!couponCodeUnExpire && coupon.isNormal()){ + couponCode.put("coupon",coupon); + finalList.add(couponCode); + } + } + } + return finalList; + } + + /** + * 获取不可用的优惠券 + * @param userid + * @return + */ + @Override + public List findUsed(long userid){ + List couponCodes = findListByColumns(Columns.create().add("user_id", userid).add("status", CouponCode.STATUS_USED)); + + List finalList = new ArrayList<>(); + for(CouponCode couponCode:couponCodes){ + //没过期,normal状态的 + Coupon coupon = couponService.findById(couponCode.getCouponId()); + if (coupon!=null){ + if (coupon.isNormal()){ + couponCode.put("coupon",coupon); + finalList.add(couponCode); + } + } + } + return finalList; + } + +} diff --git a/jpress-service-provider/src/main/java/io/jpress/service/provider/CouponUsedRecordServiceProvider.java b/jpress-service-provider/src/main/java/io/jpress/service/provider/CouponUsedRecordServiceProvider.java index b8e7969aa12bd94df9d46415393e47bd18febce0..4a0525b1a1c9cbe9c238aeaa951b69fe4cd50d51 100644 --- a/jpress-service-provider/src/main/java/io/jpress/service/provider/CouponUsedRecordServiceProvider.java +++ b/jpress-service-provider/src/main/java/io/jpress/service/provider/CouponUsedRecordServiceProvider.java @@ -10,6 +10,8 @@ import io.jpress.service.CouponCodeService; import io.jpress.service.CouponUsedRecordService; import io.jpress.service.UserOrderService; +import java.util.List; + @Bean public class CouponUsedRecordServiceProvider extends JbootServiceBase implements CouponUsedRecordService { @@ -34,4 +36,5 @@ public class CouponUsedRecordServiceProvider extends JbootServiceBase implements M return null; } -} \ No newline at end of file + + /** + * 用户是否是会员 + * @return + */ + @Override + public boolean isMember(long userid){ + List members = findListByUserId(userid); + if (members.size()==0){ + return false; + } + //检查会员是否有效 + for (Member member : members) { + if (member.isNormal()) { + return true; + } + } + return false; + } +} diff --git a/jpress-web/src/main/java/io/jpress/web/admin/_CouponController.java b/jpress-web/src/main/java/io/jpress/web/admin/_CouponController.java index 3066e66e7cffa9c307775a458fb03a5be6e3536d..0fbcde4a84424e7c43cc7978f32b06c3200b3828 100644 --- a/jpress-web/src/main/java/io/jpress/web/admin/_CouponController.java +++ b/jpress-web/src/main/java/io/jpress/web/admin/_CouponController.java @@ -113,6 +113,7 @@ public class _CouponController extends AdminControllerBase { } + @EmptyValidate({@Form(name = "userId",message = "用户ID不能为空")}) public void doCodeSave() { Coupon coupon = couponService.findById(getPara("couponId")); if (coupon == null) { @@ -138,7 +139,7 @@ public class _CouponController extends AdminControllerBase { } public void doCodeDel() { - CouponCode code = couponCodeService.findByCode(getPara()); + CouponCode code = couponCodeService.findById(getPara()); if (code != null){ couponCodeService.deleteById(getPara()); couponService.doSyncTakeCount(code.getCouponId()); diff --git a/jpress-web/src/main/java/io/jpress/web/front/AddressController.java b/jpress-web/src/main/java/io/jpress/web/front/AddressController.java index ad59157476919e610156be023ec1ca962c8221a6..045a99ed764d04a3d93bd0170769e520dd01e35e 100644 --- a/jpress-web/src/main/java/io/jpress/web/front/AddressController.java +++ b/jpress-web/src/main/java/io/jpress/web/front/AddressController.java @@ -87,6 +87,11 @@ public class AddressController extends UcenterControllerBase { /** * 新增/编辑地址 */ + @EmptyValidate({ + @Form(name = "address.username",message = "请填写联系人"), + @Form(name = "address.mobile",message = "请填写联系方式"), + @Form(name = "address.detail",message = "请填写联系地址"), + }) public void doAdd() { UserAddress address = getBean(UserAddress.class, "address"); userAddressService.addUserAddress(address,getLoginedUser().getId()); diff --git a/jpress-web/src/main/java/io/jpress/web/front/CouponController.java b/jpress-web/src/main/java/io/jpress/web/front/CouponController.java new file mode 100644 index 0000000000000000000000000000000000000000..e3b9538c48dad4d8ff3e7b412946b7358387b3c5 --- /dev/null +++ b/jpress-web/src/main/java/io/jpress/web/front/CouponController.java @@ -0,0 +1,66 @@ +package io.jpress.web.front; + +import com.jfinal.aop.Inject; +import com.jfinal.plugin.activerecord.Page; +import io.jboot.web.controller.annotation.RequestMapping; +import io.jpress.core.menu.annotation.UCenterMenu; +import io.jpress.model.CouponCode; +import io.jpress.model.User; +import io.jpress.model.UserAddress; +import io.jpress.service.CouponCodeService; +import io.jpress.service.CouponService; +import io.jpress.web.base.UcenterControllerBase; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * @author haicuan139 (haicuan139@163.com) + * @Date: 2019/12/24 + */ +@RequestMapping(value = "/ucenter/coupon", viewPath = "/WEB-INF/views/ucenter/coupon") +public class CouponController extends UcenterControllerBase { + + @Inject + private CouponService couponService; + + @Inject + private CouponCodeService couponCodeService; + + /** + * 用户优惠券列表 + */ + public void index() { + int action = getParaToInt("action",0); + List renderList = new ArrayList<>(); + User loginedUser = getLoginedUser(); + if (action == 0){ + //未过期的,未使用的,正常状态的 + renderList = couponCodeService.findAvailableList(loginedUser.getId()); + } + if (action == 1){ + //已经过期的 + renderList = couponCodeService.findExpire(loginedUser.getId()); + } + if (action == 2){ + //已经使用的 + renderList = couponCodeService.findUsed(loginedUser.getId()); + } + setAttr("couponCodeList",renderList); + render("coupon_code_list.html"); + } + + + /** + * 选择优惠券的弹出层 + */ + public void layer() { + String price = getPara("price"); + List couponCodes = couponCodeService.findAvailableByUserId(getLoginedUser().getId(), new BigDecimal(price)); + setAttr("couponCodeList", couponCodes); + render("coupon_code_layer.html"); + } + + +} diff --git a/jpress-web/src/main/webapp/WEB-INF/views/admin/finance/coupon_edit.html b/jpress-web/src/main/webapp/WEB-INF/views/admin/finance/coupon_edit.html index 219af304eaf3c5ad1bbd1ed6eab85f71b9753e83..7dc3d2239b5e3168c2ecab129d36fd52773b1999 100755 --- a/jpress-web/src/main/webapp/WEB-INF/views/admin/finance/coupon_edit.html +++ b/jpress-web/src/main/webapp/WEB-INF/views/admin/finance/coupon_edit.html @@ -1,10 +1,6 @@ #@layout() #define script() - - #end #define content()
diff --git a/jpress-web/src/main/webapp/WEB-INF/views/admin/finance/coupon_take_edit.html b/jpress-web/src/main/webapp/WEB-INF/views/admin/finance/coupon_take_edit.html index 0e85cbe08db918e6370d37d22ba98160af712fca..953047dd1e89cfc3d59691a9ab4f129a0a5b62db 100755 --- a/jpress-web/src/main/webapp/WEB-INF/views/admin/finance/coupon_take_edit.html +++ b/jpress-web/src/main/webapp/WEB-INF/views/admin/finance/coupon_take_edit.html @@ -1,9 +1,9 @@ #@layout() #define script() - + #end #define content() diff --git a/jpress-web/src/main/webapp/WEB-INF/views/ucenter/_layout/_left_menu.html b/jpress-web/src/main/webapp/WEB-INF/views/ucenter/_layout/_left_menu.html index e8375a40014cbd9aaaae28ea536384b94b96d233..968c628b32c1e4d868fa65345358dd06c5bd2de6 100755 --- a/jpress-web/src/main/webapp/WEB-INF/views/ucenter/_layout/_left_menu.html +++ b/jpress-web/src/main/webapp/WEB-INF/views/ucenter/_layout/_left_menu.html @@ -31,7 +31,9 @@ - +
  • 个人信息