package com.hongqiang.shop.modules.shipping.dao;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.persistence.FlushModeType;
import javax.persistence.LockModeType;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.stereotype.Repository;
import com.hongqiang.shop.common.base.persistence.BaseDaoImpl;
import com.hongqiang.shop.common.base.persistence.Page;
import com.hongqiang.shop.common.utils.Filter;
import com.hongqiang.shop.common.utils.Order;
import com.hongqiang.shop.common.utils.Pageable;
import com.hongqiang.shop.modules.entity.Member;
import com.hongqiang.shop.modules.entity.OrderItem;
import com.hongqiang.shop.modules.entity.Product;
@Repository
public class OrderDaoImpl extends
BaseDaoImpl<com.hongqiang.shop.modules.entity.Order,Long> implements OrderDaoCustom {
@Override
public com.hongqiang.shop.modules.entity.Order findBySn(String sn) {
if (sn == null)
return null;
String str = "select orders from Order orders where lower(orders.sn) = lower(:sn)";
try {
return (com.hongqiang.shop.modules.entity.Order) this.getEntityManager()
.createQuery(str, com.hongqiang.shop.modules.entity.Order.class)
.setFlushMode(FlushModeType.COMMIT).setParameter("sn", sn)
.getSingleResult();
} catch (Exception exception) {
return null;
}
}
@Override
public List<com.hongqiang.shop.modules.entity.Order> findList(
Member member, Integer count, List<Filter> filters,List<Order> orders) {
if (member == null)
return Collections.emptyList();
String qlString = "select o from Order o where 1=1 and o.member = ? ";
List<Object> parameter = new ArrayList<Object>();
parameter.add(member);
return super.findList(qlString, parameter, null, count, filters, orders);
}
@Override
public Page<com.hongqiang.shop.modules.entity.Order> findPage(Member member, Pageable pageable) {
if (member == null){
List<com.hongqiang.shop.modules.entity.Order> orders =
new ArrayList<com.hongqiang.shop.modules.entity.Order>();
return new Page<com.hongqiang.shop.modules.entity.Order>(orders,0L,pageable);
}
String qlString = "select o from Order o where 1=1 and o.member = ? ";
List<Object> parameter = new ArrayList<Object>();
parameter.add(member);
return super.findPage(qlString, parameter, pageable);
}
@Override
public Page<com.hongqiang.shop.modules.entity.Order> findPage(
com.hongqiang.shop.modules.entity.Order.OrderStatus orderStatus,
com.hongqiang.shop.modules.entity.Order.PaymentStatus paymentStatus,
com.hongqiang.shop.modules.entity.Order.ShippingStatus shippingStatus,
Boolean hasExpired, Pageable pageable) {
String qlString = "select o from Order o where 1=1 ";
List<Object> parameter = new ArrayList<Object>();
if (orderStatus != null) {
qlString += " and o.orderStatus= ? ";
parameter.add(orderStatus);
}
if (paymentStatus != null) {
qlString += " and o.paymentStatus= ? ";
parameter.add(paymentStatus);
}
if (shippingStatus != null) {
qlString += " and o.shippingStatus= ? ";
parameter.add(shippingStatus);
}
Date nowadays = new Date();
if (hasExpired != null) {
if (hasExpired.booleanValue()) {
qlString += " and o.expire is not null and o.expire < ? ";
parameter.add(nowadays);
} else {
qlString += " and (o.expire is null or o.expire >= ?) ";
parameter.add(nowadays);
}
}
return super.findPage(qlString, parameter, pageable);
}
@Override
public Long count(
com.hongqiang.shop.modules.entity.Order.OrderStatus orderStatus,
com.hongqiang.shop.modules.entity.Order.PaymentStatus paymentStatus,
com.hongqiang.shop.modules.entity.Order.ShippingStatus shippingStatus,
Boolean hasExpired) {
String qlString = "select o from Order o where 1=1 ";
List<Object> parameter = new ArrayList<Object>();
if (orderStatus != null) {
qlString += " and o.orderStatus= ? ";
parameter.add(orderStatus);
}
if (paymentStatus != null) {
qlString += " and o.paymentStatus= ? ";
parameter.add(paymentStatus);
}
if (shippingStatus != null) {
qlString += " and o.shippingStatus= ? ";
parameter.add(shippingStatus);
}
Date nowadays = new Date();
if (hasExpired != null) {
if (hasExpired.booleanValue()) {
qlString += " and o.expire is not null and o.expire < ? ";
parameter.add(nowadays);
} else {
qlString += " and (o.expire is null or o.expire >= ?) ";
parameter.add(nowadays);
}
}
StringBuilder stringBuilder = new StringBuilder(qlString);
return super.count(stringBuilder, null, parameter);
}
@Override
public Long waitingPaymentCount(Member member) {
String qlString = "select o from Order o where 1=1 ";
List<Object> parameter = new ArrayList<Object>();
qlString += " and o.orderStatus <> ? and o.orderStatus <> ? ";
parameter.add(com.hongqiang.shop.modules.entity.Order.OrderStatus.completed);
parameter.add(com.hongqiang.shop.modules.entity.Order.OrderStatus.cancelled);
qlString += " and (o.paymentStatus = ? or o.paymentStatus = ?) ";
parameter.add(com.hongqiang.shop.modules.entity.Order.PaymentStatus.unpaid);
parameter.add(com.hongqiang.shop.modules.entity.Order.PaymentStatus.partialPayment);
qlString += " and (o.expire is null or o.expire >= ? ) ";
parameter.add(new Date());
if (member != null) {
qlString += " and o.member = ? ";
parameter.add(member);
}
StringBuilder stringBuilder = new StringBuilder(qlString);
return super.count(stringBuilder, null, parameter);
}
@Override
public Long waitingShippingCount(Member member) {
String qlString = "select o from Order o where 1=1 ";
List<Object> parameter = new ArrayList<Object>();
qlString += " and o.orderStatus <> ? and o.orderStatus <> ? ";
parameter.add(com.hongqiang.shop.modules.entity.Order.OrderStatus.completed);
parameter.add(com.hongqiang.shop.modules.entity.Order.OrderStatus.cancelled);
qlString += " and (o.paymentStatus = ? and o.shippingStatus = ?)";
parameter.add(com.hongqiang.shop.modules.entity.Order.PaymentStatus.paid);
parameter.add(com.hongqiang.shop.modules.entity.Order.ShippingStatus.unshipped);
qlString += " and (o.expire is null or o.expire >= ? )";
parameter.add(new Date());
if (member != null) {
qlString += " and o.member = ? ";
parameter.add(member);
}
StringBuilder stringBuilder = new StringBuilder(qlString);
return super.count(stringBuilder, null, parameter);
}
@SuppressWarnings("unchecked")
@Override
public BigDecimal getSalesAmount(Date beginDate, Date endDate) {
CriteriaBuilder localCriteriaBuilder = this.getEntityManager().getCriteriaBuilder();
CriteriaQuery<BigDecimal> localCriteriaQuery = localCriteriaBuilder.createQuery(BigDecimal.class);
@SuppressWarnings("rawtypes")
Root localRoot = localCriteriaQuery.from(com.hongqiang.shop.modules.entity.Order.class);
localCriteriaQuery.select(localCriteriaBuilder.sum(localRoot.get("amountPaid")));
Predicate localPredicate = localCriteriaBuilder.conjunction();
localPredicate = localCriteriaBuilder.and(localPredicate,
localCriteriaBuilder.equal(localRoot.get("orderStatus"),
com.hongqiang.shop.modules.entity.Order.OrderStatus.completed));
if (beginDate != null)
localPredicate = localCriteriaBuilder.and(localPredicate,
localCriteriaBuilder.greaterThanOrEqualTo(localRoot.get("createDate"), beginDate));
if (endDate != null)
localPredicate = localCriteriaBuilder.and(localPredicate,
localCriteriaBuilder.lessThanOrEqualTo(localRoot.get("createDate"), endDate));
localCriteriaQuery.where(localPredicate);
return (BigDecimal) this.getEntityManager().createQuery(localCriteriaQuery)
.setFlushMode(FlushModeType.COMMIT).getSingleResult();
}
@SuppressWarnings("unchecked")
@Override
public Integer getSalesVolume(Date beginDate, Date endDate) {
CriteriaBuilder localCriteriaBuilder = this.getEntityManager().getCriteriaBuilder();
CriteriaQuery<Integer> localCriteriaQuery = localCriteriaBuilder.createQuery(Integer.class);
@SuppressWarnings("rawtypes")
Root localRoot = localCriteriaQuery.from(com.hongqiang.shop.modules.entity.Order.class);
localCriteriaQuery.select(localCriteriaBuilder.sum(localRoot.join("orderItems").get("shippedQuantity")));
Predicate localPredicate = localCriteriaBuilder.conjunction();
localPredicate = localCriteriaBuilder.and(localPredicate,
localCriteriaBuilder.equal(localRoot.get("orderStatus"),
com.hongqiang.shop.modules.entity.Order.OrderStatus.completed));
if (beginDate != null)
localPredicate = localCriteriaBuilder.and(localPredicate,
localCriteriaBuilder.greaterThanOrEqualTo(localRoot.get("createDate"), beginDate));
if (endDate != null)
localPredicate = localCriteriaBuilder.and(localPredicate,
localCriteriaBuilder.lessThanOrEqualTo(localRoot.get("createDate"), endDate));
localCriteriaQuery.where(localPredicate);
return (Integer) this.getEntityManager().createQuery(localCriteriaQuery)
.setFlushMode(FlushModeType.COMMIT).getSingleResult();
}
@Override
public void releaseStock() {
String query = "select orders from Order orders where orders.isAllocatedStock = :isAllocatedStock "+
"and orders.expire is not null and orders.expire <= :now";
List<com.hongqiang.shop.modules.entity.Order> orders = this.getEntityManager()
.createQuery(query, com.hongqiang.shop.modules.entity.Order.class)
.setParameter("isAllocatedStock", Boolean.valueOf(true))
.setParameter("now", new Date()).getResultList();
if (orders != null) {
Iterator<com.hongqiang.shop.modules.entity.Order> iterator = orders.iterator();
while (iterator.hasNext()) {
com.hongqiang.shop.modules.entity.Order order = (com.hongqiang.shop.modules.entity.Order) iterator.next();
if ((order == null) || (order.getOrderItems() == null))
continue;
Iterator<OrderItem> orderItemIterator = order.getOrderItems().iterator();
while (orderItemIterator.hasNext()) {
OrderItem orderItem = (OrderItem) orderItemIterator.next();
if (orderItem == null)
continue;
Product product = orderItem.getProduct();
if (product == null)
continue;
this.getEntityManager().lock(product,LockModeType.PESSIMISTIC_WRITE);
product.setAllocatedStock(Integer.valueOf(product.getAllocatedStock().intValue()
- (orderItem.getQuantity().intValue() - orderItem.getShippedQuantity().intValue())));
}
order.setIsAllocatedStock(Boolean.valueOf(false));
}
}
}
}