Commit 1adf1af1 by chongli

单笔订单多人时可使用多券功能

parent b93acafe
......@@ -558,7 +558,7 @@ public class VoucherDao extends GenericHibernateDao<Voucher, Integer> {
@SuppressWarnings("unchecked")
public PagedResponseBean<VoucherItemDTO> queryListForOrder(VoucherQueryDto queryBean) {
StringBuilder sb = new StringBuilder(
"select SQL_CALC_FOUND_ROWS v.Id as id,v.No as no,v.Type as type,v.Amount as amount,v.StartUseDate as startUseDate,v.EndUseDate as endUseDate,v.Used as used,v.UseDate as useDate,v.OrderNo as orderNo,v.UID as uid,v.Source as source,v.ruleId as ruleId from bsc_voucher v where 1=1 ");
"select SQL_CALC_FOUND_ROWS v.Id as id,v.No as no,v.Type as type,v.Amount as amount,v.StartUseDate as startUseDate,v.EndUseDate as endUseDate,v.Used as used,v.UseDate as useDate,v.OrderNo as orderNo,v.UID as uid,v.Source as source,v.ruleId as ruleId,exclusive,canUseAmount,fullCutAmount from bsc_voucher v where 1=1 ");
sb.append(" and Used=0 and DATE_FORMAT(StartUseDate, '%Y-%m-%d') <= DATE_FORMAT(now(), '%Y-%m-%d') and DATE_FORMAT(EndUseDate, '%Y-%m-%d') >= DATE_FORMAT(now(), '%Y-%m-%d') ");
if (queryBean.getPlayDate() != null) {
sb.append(" and DATE_FORMAT(StartUseDate, '%Y-%m-%d') <= '")
......@@ -649,7 +649,7 @@ public class VoucherDao extends GenericHibernateDao<Voucher, Integer> {
int perNum) {
String query = userQuerySql + " limit " + start + "," + perNum;
StringBuffer insertSql = new StringBuffer(
"insert into bsc_voucher (type, amount,startUseDate,endUseDate,uid,source,ruleId,userLimit,remark,description,shared) values ");
"insert into bsc_voucher (type, amount,startUseDate,endUseDate,uid,source,ruleId,userLimit,remark,description,exclusive,canUseAmount,fullCutAmount,shared) values ");
StringBuffer insertSmsSql = new StringBuffer(
"insert into bsc_sms(message, status, mobileNo,type,messageId) values ");
int source = VoucherSourceEnum.NORMAL.getValue();
......@@ -676,8 +676,12 @@ public class VoucherDao extends GenericHibernateDao<Voucher, Integer> {
insertSql.append(",'" + voucherRule.getId() + "'");
insertSql.append(",'" + voucherRule.getUserLimit() + "'");
insertSql.append(",'" + StringUtils.escapeSql(voucherRule.getRemark()) + "'");
insertSql
.append(",'" + StringUtils.escapeSql(voucherRule.getDescription()) + "'");
insertSql.append(",'" + StringUtils.escapeSql(voucherRule.getDescription()) + "'");
insertSql.append(",'" + voucherRule.getExclusive() + "'");
insertSql.append(",'" + voucherRule.getCanUseAmount() + "'");
insertSql.append(",'" + voucherRule.getFullCutAmount() + "'");
insertSql.append(",'" + voucherRule.getShared() + "'),");
}
......@@ -933,4 +937,13 @@ public class VoucherDao extends GenericHibernateDao<Voucher, Integer> {
}
return result;
}
public List<Voucher> findByIds(List<Integer> ids) {
StringBuilder sb = new StringBuilder("from Voucher where id in (:ids)");
Session session = this.getSession();
Query query = session.createQuery(sb.toString());
query.setParameterList("ids", ids);
List<Voucher> result = query.list();
return result;
}
}
......@@ -61,6 +61,15 @@ public class Voucher implements java.io.Serializable {
//领券人限制:不限制,vpi,社员,社员并且vip
private int userLimit;//0,2,4,6
//是否可以和其他种类券一起用
private int exclusive;//0否 1是
//一单可以使用的张数
private int canUseAmount;//限制同类型的券一单可以使用几张
//每满多少减多少 列:如值为100,则 200<=订单金额<300可以使用两张
private BigDecimal fullCutAmount;
public Voucher() {
}
......@@ -285,4 +294,34 @@ public class Voucher implements java.io.Serializable {
this.sourceRemark = sourceRemark;
}
@Column(name = "exclusive")
public int getExclusive() {
return exclusive;
}
public void setExclusive(int exclusive) {
this.exclusive = exclusive;
}
@Column(name = "canUseAmount")
public int getCanUseAmount() {
return canUseAmount;
}
public void setCanUseAmount(int canUseAmount) {
this.canUseAmount = canUseAmount;
}
@Column(name = "fullCutAmount")
public BigDecimal getFullCutAmount() {
return fullCutAmount;
}
public void setFullCutAmount(BigDecimal fullCutAmount) {
this.fullCutAmount = fullCutAmount;
}
}
......@@ -136,6 +136,17 @@ public class VoucherRule {
* 分享获取券的用户的等级性质
*/
private int userLimit;
//是否可以和其他种类券一起用
private int exclusive;//0否 1是
//一单可以使用的张数
private int canUseAmount;//限制同类型的券一单可以使用几张
//每满多少减多少 列:如值为100,则 200<=订单金额<300可以使用两张
private BigDecimal fullCutAmount;
@Id
@GeneratedValue(strategy = IDENTITY)
......@@ -351,6 +362,31 @@ public class VoucherRule {
this.userLimit = userLimit;
}
@Column(name = "exclusive")
public int getExclusive() {
return exclusive;
}
public void setExclusive(int exclusive) {
this.exclusive = exclusive;
}
@Column(name = "canUseAmount")
public int getCanUseAmount() {
return canUseAmount;
}
public void setCanUseAmount(int canUseAmount) {
this.canUseAmount = canUseAmount;
}
@Column(name = "fullCutAmount")
public BigDecimal getFullCutAmount() {
return fullCutAmount;
}
public void setFullCutAmount(BigDecimal fullCutAmount) {
this.fullCutAmount = fullCutAmount;
}
}
......@@ -1143,6 +1143,9 @@ public class VoucherService {
voucher.setDescription(voucherRule.getDescription());
voucher.setShared(voucherRule.getShared());
voucher.setUserLimit(voucherRule.getUserLimit());
voucher.setExclusive(voucherRule.getExclusive());
voucher.setCanUseAmount(voucherRule.getCanUseAmount());
voucher.setFullCutAmount(voucherRule.getFullCutAmount());
voucher.setCreatedTime(new Date());
return voucher;
}
......
......@@ -7,7 +7,9 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.slf4j.Logger;
......@@ -789,6 +791,23 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
if (!CollectionUtils.isEmpty(abstractOrderBean.getVoucherList())) {
// 检查抵用券数量是否匹配
checkVourcherCount(abstractOrderBean);
List<Integer> list = new ArrayList<Integer>();
for(VoucherItemBean voucherItemBean :abstractOrderBean.getVoucherList()){
list.add(voucherItemBean.getId());
}
List<Voucher> vouchers = voucherDao.findByIds(list);
if(!this.checkVourcherExclusive(vouchers)){
throw new OrderException(-10, "多种类型的券无法同时使用");
}
if(!this.checkVourcherCanUseAmount(vouchers)){
throw new OrderException(-10, "超出使用数量");
}
if(!this.checkVourcherFullCutAmount(vouchers,abstractOrderBean.getAmount())){
throw new OrderException(-10, "不符合满减规则");
}
this.checkVourcherFullCutAmount(vouchers, abstractOrderBean.getAmount());
//多张:每个订单中不能超过多张限制数量
for (int i = 0; i < abstractOrderBean.getVoucherList().size(); i++) {
VoucherItemBean voucherItemBean = abstractOrderBean.getVoucherList().get(i);
Voucher voucher = voucherDao.findById(voucherItemBean.getId());
......@@ -836,7 +855,63 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
}
}
//检查互斥属性:检查,使用的多张券都是非互斥,则通过; 如果有一张互斥券,那么检查其它的券ruleid和该券是否相同,相同通过,否则不通过
private boolean checkVourcherExclusive(List<Voucher> list){
Voucher firsExclusiveVoucher = null;
for(Voucher voucher:list){
if(voucher.getExclusive()==1){
firsExclusiveVoucher=voucher;
break;
}
}
if(firsExclusiveVoucher==null){
return true;
}else{
for(Voucher voucher:list){
if(voucher.getRuleId()!=firsExclusiveVoucher.getRuleId()){
return false;
}
}
return true;
}
}
//检查抵用券数量是否匹配
private boolean checkVourcherCanUseAmount(List<Voucher> list){
Map<String,List<Voucher>> map = new HashMap<String,List<Voucher>>();
for(Voucher voucher:list){
if(map.get(voucher.getRuleId()+"")==null){
List<Voucher> voucherList = new ArrayList<Voucher>();
voucherList.add(voucher);
map.put(voucher.getRuleId()+"",voucherList);
}else{
map.get(voucher.getRuleId()+"").add(voucher);
}
}
for (String key : map.keySet()) {
List<Voucher> voucherList = map.get(key);
if(voucherList.size()>0){
if(voucherList.get(0).getCanUseAmount()<voucherList.size()){
return false;
}
}
}
return true;
}
//检查满减属性:订单金额大于等于使用的券的满减总和
private boolean checkVourcherFullCutAmount(List<Voucher> list,BigDecimal orderAmount){
BigDecimal totalFullCutAmount = new BigDecimal("0");
for(Voucher voucher:list){
totalFullCutAmount = totalFullCutAmount.add(voucher.getFullCutAmount());
}
if(orderAmount.compareTo(totalFullCutAmount)>=0){
return true;
}
return false;
}
protected abstract void checkVourcherCount(H abstractOrderBean);
protected abstract void checkVourcherType(Voucher voucher, H abstractOrderBean);
......
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