Commit 8dccdef1 by unknown

add the vipmemberdiscount in order

parent 91a10df5
......@@ -711,6 +711,27 @@ public class OrderDao extends GenericHibernateDao<Order, Integer> {
return criteria.list();
}
/**指定一天下单*/
public List<Order> queryOrders(Date priceDate, String uid) {
String sql = "select t.orderId from ord_orderitem t where t.playDate=:playDate";
Session session = this.getSession();
Query query = session.createSQLQuery(sql);
query.setParameter("playDate", priceDate);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> list = query.list();
if (list == null || list.isEmpty()) {
return null;
}
List<Integer> orderIds = new ArrayList<Integer>();
for (Map<String, Object> map : list) {
orderIds.add((Integer) map.get("orderId"));
}
Criteria criteria = this.getCriteria();
criteria.add(Restrictions.eq("uid", uid));
criteria.add(Restrictions.in("orderId", orderIds));
return criteria.list();
}
public List<Order> queryEventActivityOrders(Date priceDate, String uid, int resourceId) {
......
......@@ -120,6 +120,12 @@ public class UserExtDao extends GenericHibernateDao<UserExt, Integer> {
return query.executeUpdate();
}
public int updateVipMemberInfo(String uid, BigDecimal discount, int discounted){
String sql = "update UserExt set vipmemberSaveAmount = vipmemberSaveAmount + "+discount.toString()+ ",vipmemberDiscounted=" + discounted + " where UID = :uid";
Query query = getSession().createQuery(sql);
query.setParameter("uid", uid);
return query.executeUpdate();
}
public UserExt GetUserExtInfoByPhone(String phone) {
String hsql = "from UserExt t where t.bindedMobilePhone = :phone";
Query query = getSession().createQuery(hsql);
......
......@@ -197,6 +197,13 @@ public class Order extends AbstractOrder implements java.io.Serializable {
* 用户类型(活跃用户,非活跃用户,新用户未下单)
*/
private String userType;
/**订单总的立减金额*/
private BigDecimal vipmemberDiscount;
/**订单总的随机立减折扣*/
private BigDecimal vipmemberDiscountRate;
public Order() {
}
......@@ -1350,4 +1357,20 @@ public class Order extends AbstractOrder implements java.io.Serializable {
this.userType = userType;
}
public BigDecimal getVipmemberDiscount() {
return vipmemberDiscount;
}
public void setVipmemberDiscount(BigDecimal vipmemberDiscount) {
this.vipmemberDiscount = vipmemberDiscount;
}
public BigDecimal getVipmemberDiscountRate() {
return vipmemberDiscountRate;
}
public void setVipmemberDiscountRate(BigDecimal vipmemberDiscountRate) {
this.vipmemberDiscountRate = vipmemberDiscountRate;
}
}
......@@ -60,6 +60,13 @@ public class OrderItem implements java.io.Serializable {
* 球场佣金
*/
private Double commission;
/**vip会员首次立减价*/
private Double vipFirstReduction;
/**vip会员随机减最低价*/
private Double vipMinRandom;
/**vip会员随机减最高价*/
private Double vipMaxRandom;
public OrderItem() {
}
......@@ -323,6 +330,33 @@ public class OrderItem implements java.io.Serializable {
public void setCommission(Double commission) {
this.commission = commission;
}
@Column(name="VipFirstReduction", nullable = false, precision = 11)
public Double getVipFirstReduction() {
return vipFirstReduction;
}
public void setVipFirstReduction(Double vipFirstReduction) {
this.vipFirstReduction = vipFirstReduction;
}
@Column(name="VipMinRandom", nullable = false, precision = 11)
public Double getVipMinRandom() {
return vipMinRandom;
}
public void setVipMinRandom(Double vipMinRandom) {
this.vipMinRandom = vipMinRandom;
}
@Column(name="VipMaxRandom", nullable = false, precision = 11)
public Double getVipMaxRandom() {
return vipMaxRandom;
}
public void setVipMaxRandom(Double vipMaxRandom) {
this.vipMaxRandom = vipMaxRandom;
}
......
......@@ -122,6 +122,7 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
// 返回支付页面后再次进入支付页面
if (!abstractOrderBean.isNeedCreate()) {
this.checkRebookStatus(order);
this.adjustOrderPayAmount(abstractOrderBean);
order = updateOrder(abstractOrderBean);
this.deleteOrderItems(order.getOrderId());
this.deleteCustomers(order.getOrderId());
......@@ -135,6 +136,7 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
return this.submitOrder(abstractOrderBean, order);
} else {
// 继续预订的逻辑
this.adjustOrderPayAmount(abstractOrderBean);
order.setEnable(false);
Order order2 = this.saveOrder(abstractOrderBean);
order.setRelationOrderNo(order2.getOrderNo());
......@@ -191,9 +193,16 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
order.setVoucherIDList(orderDetailBean.fetchVoucherIds());
order.setVoucherCount(orderDetailBean.getVoucherList() == null ? 0 : orderDetailBean.getVoucherList().size());
/* BigDecimal actualAmount = totalAmount.subtract(orderDetailBean.getTmoney()).subtract(orderDetailBean.getLimitedEmoneyAmount()).subtract(orderDetailBean.getUnlimitedEmoneyAmount())
.subtract(orderDetailBean.getOnPayAmount());*/
BigDecimal actualAmount = totalAmount.subtract(orderDetailBean.getTmoney()).subtract(orderDetailBean.getLimitedEmoneyAmount()).subtract(orderDetailBean.getUnlimitedEmoneyAmount())
.subtract(orderDetailBean.getOnPayAmount());
.subtract(orderDetailBean.getOnPayAmount()).subtract(orderDetailBean.getDiscountAfterOrderAmount());;
if (actualAmount.compareTo(BigDecimal.ZERO) < 0) {
actualAmount = new BigDecimal(0);
}
order.setActualAmount(actualAmount);
order.setVipmemberDiscount(orderDetailBean.getDiscountAfterOrderAmount());
order.setVipmemberDiscountRate(orderDetailBean.getDiscountRate());
this.setRebookDefault(order);
order.setOrderDate(new Date());
order.setEnable(true);
......@@ -204,6 +213,7 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
public Response<PlaceOrderResponseBean> placeOrder(H abstractOrderBean) {
this.checkParameters(abstractOrderBean);
if (this.beforePlaceOrder(abstractOrderBean)) {
this.adjustOrderPayAmount(abstractOrderBean);
Order order = this.saveOrder(abstractOrderBean);
this.saveOrUpdateInvoice(abstractOrderBean.getInvoice(), order);
this.saveOrderItems(abstractOrderBean, order.getOrderId());
......@@ -214,7 +224,10 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
}
return null;
}
protected void adjustOrderPayAmount(H abstractOrderBean) {
}
public H callback(OrderCallBackBean body) {
String resData = body.getResData();
try {
......@@ -306,6 +319,9 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
abstractOrderBean.setPreAuthAmount(order.getPreAuthAmount());
abstractOrderBean.setTmoney(order.getTmoney());
abstractOrderBean.setDiscountAmount(order.getDiscountAmount());
//add vipdiscount by caosy
abstractOrderBean.setDiscountAfterOrderAmount(order.getVipmemberDiscount());
abstractOrderBean.setOrderDate(order.getOrderDate());
abstractOrderBean.setPayMode(order.getPayMode());
OrderStatusEnum orderStatusEnum = OrderStatusEnum.getOrderStatus(order.getOrderType(), order.getPayMode(), order.getConfirmType(), order.getProcessStatus(), false);
......@@ -608,9 +624,6 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
}
this.checkVourcher(abstractOrderBean);
this.checkInsurance(abstractOrderBean);
//add by caosy
this.checkVipMemberInfo(abstractOrderBean);
this.checkOrderItem(abstractOrderBean);
this.checkTotalAmount(abstractOrderBean);
if (this.getTotalVoucherAmount(abstractOrderBean.getVoucherList()).compareTo(abstractOrderBean.getVoucherAmount()) != 0) {
......@@ -1125,9 +1138,17 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
order.setPrePayCardDeductFlag(PrePayCardStatusEnum.UNUSED.getValue());
order.setVoucherIDList(abstractOrderBean.fetchVoucherIds());
order.setVoucherCount(abstractOrderBean.getVoucherList() == null ? 0 : abstractOrderBean.getVoucherList().size());
/* BigDecimal actualAmount = totalAmount.subtract(abstractOrderBean.getTmoney()).subtract(abstractOrderBean.getLimitedEmoneyAmount())
.subtract(abstractOrderBean.getUnlimitedEmoneyAmount()).subtract(abstractOrderBean.getOnPayAmount());*/
//modify by caosy,重新调整实付金额
BigDecimal actualAmount = totalAmount.subtract(abstractOrderBean.getTmoney()).subtract(abstractOrderBean.getLimitedEmoneyAmount())
.subtract(abstractOrderBean.getUnlimitedEmoneyAmount()).subtract(abstractOrderBean.getOnPayAmount());
.subtract(abstractOrderBean.getUnlimitedEmoneyAmount()).subtract(abstractOrderBean.getOnPayAmount()).subtract(abstractOrderBean.getDiscountAfterOrderAmount());
if(actualAmount.compareTo(BigDecimal.ZERO) < 0){
actualAmount = new BigDecimal(0);
}
order.setActualAmount(actualAmount);
order.setVipmemberDiscount(abstractOrderBean.getDiscountAfterOrderAmount());
order.setVipmemberDiscountRate(abstractOrderBean.getDiscountRate());
order.setRemark(abstractOrderBean.getRemarks());
order.setUserType(userExtService.getByUid(abstractOrderBean.getUid()).getUserType());
}
......
......@@ -34,11 +34,13 @@ import com.ctrip.fun.common.vo.order.CourseOrderBean;
import com.ctrip.fun.common.vo.order.CourseOrderListItemBean;
import com.ctrip.fun.common.vo.order.CourseOrderResourceBean;
import com.ctrip.fun.common.vo.order.CustomerInfoBean;
import com.ctrip.fun.common.vo.order.InvoiceBean;
import com.ctrip.fun.common.vo.order.OrderQuery;
import com.ctrip.fun.common.vo.order.OrderSourceEnum;
import com.ctrip.fun.common.vo.order.OrderStatusEnum;
import com.ctrip.fun.common.vo.order.PlaceOrderResponseBean;
import com.ctrip.fun.common.vo.order.UserOperateModeEnum;
import com.ctrip.fun.common.vo.order.VoucherItemBean;
import com.ctrip.fun.common.vo.payment.CreatePayOrderResponseBean;
import com.ctrip.fun.common.vo.product.CourseResourceStatusEnum;
import com.ctrip.fun.common.vo.product.CourseStatusEnum;
......@@ -446,8 +448,115 @@ public class CourseOrderService extends AbstractOrderService<CourseOrderBean, Co
this.checkTotalCashRebate(courseOrderBean);
return true;
}
/**
@Override
protected void adjustOrderPayAmount(CourseOrderBean abstractOrderBean) {
CourseOrderBean orderBean = abstractOrderBean;
//暂时只支持预付
if(!ProductPaymentTypeEnum.PREPAY.getName().equalsIgnoreCase(orderBean.getPayMode().toLowerCase())) return;
//目前针对vip会员优惠进行最后支付价格的调整
UserExt user = getUserExtService().getVipMember(orderBean.getUid());
boolean isVipMember = getUserExtService().isVipMember(user.getVipGrade());
if(orderBean.getResourceList() == null || orderBean.getResourceList().size()==0) return;
CourseOrderResourceBean resInfo = orderBean.getResourceList().get(0);
AsmCourseresource asmCourseresource = asmCourseResourceDao.getSingalAsmCourseresource(resInfo.getPlayDate(), resInfo.getResourceId());
if(asmCourseresource == null) return;
Double vipFirstReduction = asmCourseresource.getVipFirstReduction() == null? 0:asmCourseresource.getVipFirstReduction();
Double vipMinRandom = asmCourseresource.getVipMinRandom() == null? 0:asmCourseresource.getVipMinRandom();
Double vipMaxRandom = asmCourseresource.getVipMaxRandom() == null? 0:asmCourseresource.getVipMaxRandom();
if(vipFirstReduction == 0) return;
BigDecimal vipDiscountAmount = new BigDecimal(0);
List<Order> orderList = this.getOrderDao().queryOrders(resInfo.getPlayDate(), orderBean.getUid());
boolean isFirstOrderToday = true;
for (Order order : orderList) {
if(order.isPay()&&order.getDiscountAmount().compareTo(BigDecimal.ZERO)>0){
isFirstOrderToday = false;
break;
}
}
if(isVipMember && isFirstOrderToday){
if(user.getVipmemberDiscounted() == 0){
//新用户
vipDiscountAmount = BigDecimal.valueOf(vipFirstReduction.doubleValue());
}else{
VipMemberDiscount vipMemberDiscount = vipmemberDiscountDao.getVipmemberDiscountByUid(orderBean.getUid());
if(vipMemberDiscount != null){
BigDecimal rate = vipMemberDiscount.getDiscountRate();
if(rate.compareTo(BigDecimal.ZERO) != 0){
BigDecimal vipRandomD = BigDecimal.valueOf(vipMaxRandom.doubleValue()).subtract(BigDecimal.valueOf(vipMinRandom.doubleValue()));
vipDiscountAmount = BigDecimal.valueOf(vipMinRandom.doubleValue()).add(rate.multiply(vipRandomD));
orderBean.setDiscountRate(rate);
}
}
}
//如果没有vip优惠就返回
if(vipDiscountAmount.doubleValue() <= 0) return;
BigDecimal newPrePayAmount = orderBean.getPrePayAmount().subtract(vipDiscountAmount);
BigDecimal newPrePayCardAmount = orderBean.getPrePayCardAmount();
BigDecimal newVoucherAmount = orderBean.getVoucherAmount();
List<VoucherItemBean> newVoucherList = orderBean.getVoucherList();
boolean hasInvoice = orderBean.isHasInvoice();
//只算球场本身的价格, 发票,保险,快递费等不参与优惠。
if(newPrePayAmount.compareTo(BigDecimal.ZERO) < 0 || newPrePayAmount.compareTo(BigDecimal.ZERO) == 0){
//最多只能这么多优惠
vipDiscountAmount = newPrePayAmount;
newPrePayAmount = new BigDecimal(0);
}
//所有需要在线支付价格(去掉发票)
BigDecimal postageAmount = orderBean.getPostageAmount()==null? new BigDecimal(0):orderBean.getPostageAmount();
BigDecimal insuranceAmount = orderBean.getInsuranceAmount()==null? new BigDecimal(0):orderBean.getInsuranceAmount();
BigDecimal allOnlinePayAmount = newPrePayAmount.add(postageAmount).add(insuranceAmount);//add(orderBean.getInvoiceAmount())
BigDecimal adjustPrePayCard = allOnlinePayAmount.subtract(orderBean.getPrePayCardAmount());
if(adjustPrePayCard.compareTo(BigDecimal.ZERO)<0 || adjustPrePayCard.compareTo(BigDecimal.ZERO) == 0){
//余额足够付优惠过后的金额
//1,重新调整余额数量
newPrePayCardAmount = allOnlinePayAmount;
//2,将抵用券退掉
newVoucherAmount = new BigDecimal(0);
newVoucherList = new ArrayList<VoucherItemBean>();
//3,发票去掉
// newInvoiceAmount = new BigDecimal(0);
hasInvoice = false;
}else{
BigDecimal adjustLast = adjustPrePayCard;
adjustPrePayCard = adjustPrePayCard.subtract(orderBean.getVoucherAmount());
if(adjustPrePayCard.compareTo(BigDecimal.ZERO)<0 || adjustPrePayCard.compareTo(BigDecimal.ZERO) == 0){
//抵用券足够付优惠过后的金额
BigDecimal voucherAmount = new BigDecimal(0);
List<VoucherItemBean> voucherList = new ArrayList<VoucherItemBean>();
for (VoucherItemBean voucherItemBean : newVoucherList) {
voucherList.add(voucherItemBean);
voucherAmount = voucherAmount.add(voucherItemBean.getAmount());
if(voucherAmount.compareTo(adjustLast) > 0){
break;
}
}
newVoucherAmount = voucherAmount;
newVoucherList = voucherList;
//发票去掉
hasInvoice = false;
}
}
//调整发票
orderBean.setHasInvoice(hasInvoice);
if(!hasInvoice){
orderBean.setAmount(orderBean.getAmount().subtract(orderBean.getInvoiceAmount()));
orderBean.setInvoiceAmount(new BigDecimal(0));
orderBean.setInvoice(new InvoiceBean());
}
orderBean.setPrePayAmount(newPrePayAmount);
orderBean.setPrePayCardAmount(newPrePayCardAmount);
orderBean.setVoucherAmount(newVoucherAmount);
orderBean.setVoucherList(newVoucherList);
orderBean.setDiscountAfterOrderAmount(vipDiscountAmount);
}
}
/**
* @param courseOrderBean
*/
private void checkMemberOrder(CourseOrderBean courseOrderBean) {
......@@ -578,31 +687,12 @@ public class CourseOrderService extends AbstractOrderService<CourseOrderBean, Co
throw new OrderException(-5, "返现金额有误");
}
}
checkVipMemberResPrice(asmCourseresource, resourceInfo);
}
}
}
private void checkVipMemberResPrice(AsmCourseresource asmCourseresource, CourseOrderResourceBean resourceInfo){
if(resourceInfo == null || asmCourseresource == null) return;
boolean isError=false;
//判断资源
if(asmCourseresource.getVipFirstReduction() != null && asmCourseresource.getVipFirstReduction().compareTo(resourceInfo.getVipFirstReduction()) != 0){
isError = true;
}
if(asmCourseresource.getVipMaxRandom() != null && asmCourseresource.getVipMaxRandom().compareTo(resourceInfo.getVipMaxRandom()) != 0){
isError = true;
}
if(asmCourseresource.getVipMinRandom() != null && asmCourseresource.getVipMinRandom().compareTo(resourceInfo.getVipMinRandom()) != 0){
isError = true;
}
if(isError){
throw new OrderException(-6, "该球场资源出错,请退出重试!");
}
}
@Override
/*@Override
protected void checkVipMemberInfo(CourseOrderBean courseOrderBean) {
if(courseOrderBean.getVipmemberDiscount() == null || courseOrderBean.getVipmemberDiscountRate() == null || courseOrderBean.getVipmemberDiscount().compareTo(BigDecimal.ZERO) == 0){
return;
......@@ -660,7 +750,7 @@ public class CourseOrderService extends AbstractOrderService<CourseOrderBean, Co
if(isError){
throw new OrderException(-8, "vip会员优惠价格出错 ,请退出重试!");
}
}
}*/
/**
* @param findById
......@@ -730,7 +820,6 @@ public class CourseOrderService extends AbstractOrderService<CourseOrderBean, Co
orderItem.setQuantity(orderItemBean.getQuantity());
orderItem.setPlayDate(orderItemBean.getPlayDate());
orderItem.setCashRebate(orderItemBean.getCashRebate() == null ? 0 : orderItemBean.getCashRebate().doubleValue());
orderItem.setTeeTime(orderItemBean.getTeeTime());
orderItem.setRealPlayTime("");
orderItem.setCurrency(orderItemBean.getCurrency());
......@@ -742,6 +831,12 @@ public class CourseOrderService extends AbstractOrderService<CourseOrderBean, Co
orderItem.setSupplierId(supplier.getId());
orderItem.setSupplierName(supplier.getName());
orderItem.setProductManager(courseProduct.getProductManager());
//add by caosy
orderItem.setVipFirstReduction(asmCourseResource.getVipFirstReduction());
orderItem.setVipMaxRandom(asmCourseResource.getVipMaxRandom());
orderItem.setVipMinRandom(asmCourseResource.getVipMinRandom());
this.getOrderItemDao().save(orderItem);
try {
userService.saveOrderedCourse(asmCourseResource.getCourseId(), courseOrderBean.getUid());
......
......@@ -940,6 +940,10 @@ public class OpCourseOrderService extends AbstractOpOrderService<CourseOrderProc
orderBean.setOnlineOrderFlag(order.getOnlineOrderFlag() == null ? true : order.getOnlineOrderFlag());
orderBean.setUserType(order.getUserType());
//针对vip会员的优惠
orderBean.setDiscountAfterOrderAmount(order.getVipmemberDiscount());
orderBean.setDiscountRate(order.getVipmemberDiscountRate());
return orderBean;
}
......
......@@ -72,6 +72,8 @@ public class CourseNotifyService extends AbstractNotifyService {
*/
@Override
protected void doPaySuccess(Order order) {
//更新用户vip优惠金额
updateVipmemberInfo(order);
if (order.getCampaignID() > 0) {
successPayCampaign(order);
}
......@@ -80,9 +82,16 @@ public class CourseNotifyService extends AbstractNotifyService {
} else {
this.sendMessage(order, 5);
}
}
private void updateVipmemberInfo(Order order){
BigDecimal discount = order.getVipmemberDiscount();
if(discount != null && discount.compareTo(BigDecimal.ZERO)>0){
getUserExtDao().updateVipMemberInfo(order.getUid(), discount, 1);
}
}
/**
* @param order
* @see com.ctrip.fun.golf.service.payment.AbstractNotifyService#doFailRefund(com.ctrip.fun.golf.domain.order.Order)
......
......@@ -113,12 +113,16 @@ public class UserExtService extends GenericService<UserExtDao, UserExt, Integer,
if (vipmemberExpireDays < 0) {
// 代表已经过期, 进行消除身份
vipGrade = (user.getVipGrade() & ~VipGradeEnum.VIP4.getKey());
user.setVipGrade(vipGrade);
//user.setVipGrade(vipGrade);
}
}
user.setVipGrade(vipGrade);
// user.setVipGrade(vipGrade);
return vipGrade;
}
public boolean isVipMember(int vipGrade){
return (vipGrade & VipGradeEnum.VIP4.getKey()) == VipGradeEnum.VIP4.getKey();
}
public boolean isVipMember(String uid){
UserExt user = this.userExtDao.getByUid(uid);
......@@ -126,6 +130,12 @@ public class UserExtService extends GenericService<UserExtDao, UserExt, Integer,
return (vipGrade & VipGradeEnum.VIP4.getKey()) == VipGradeEnum.VIP4.getKey();
}
public UserExt getVipMember(String uid){
UserExt user = this.userExtDao.getByUid(uid);
updateUserIdentity(user);
return user;
}
public boolean isVipMemberByPhone(String phone){
UserExt user = this.userExtDao.GetUserExtInfoByPhone(phone);
int vipGrade = updateUserIdentity(user);
......
......@@ -1415,7 +1415,7 @@ public class UserService {
vipGrade = (vipGrade & ~VipGradeEnum.VIP4.getKey());
}
}
user.setVipGrade(vipGrade);
//user.setVipGrade(vipGrade);
return vipGrade;
}
......@@ -1449,14 +1449,12 @@ public class UserService {
userBean.setUserGradeImgUrl(this.imageServer + "UserGrade" + userExt.getUserGrade()
+ ".png");
userBean.setVipGradeAll(userExt.getVipGrade());
/* int vipGrade = userExt.getVipGrade() & VipGradeEnum.VIP2.getKey();
int vipGrade = userExt.getVipGrade() & VipGradeEnum.VIP2.getKey();
if (vipGrade == 0) {
vipGrade = userExt.getVipGrade() & VipGradeEnum.VIP1.getKey();
}*/
}
int vipGrade = updateUserIdentity(userExt);
userBean.setVipGrade(vipGrade);
vipGrade = userExt.getVipGrade() & VipGradeEnum.VIP2.getKey();
userBean.setVipGrade(updateUserIdentity(userExt));
userBean.setVipGradeName(VipGradeEnum.valueOf(vipGrade).getValue());
userBean.setVipGradeImgUrl(this.imageServer + "VipGrade" + vipGrade + ".png");
userBean.setUserName(userExt.getUserName());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment