package com.lst.lc.web.service;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.lst.lc.dao.CategoryDao;
import com.lst.lc.dao.CourseDao;
import com.lst.lc.dao.DirectionDao;
import com.lst.lc.entities.Category;
import com.lst.lc.entities.Course;
import com.lst.lc.entities.Direction;
import com.lst.lc.page.Page;
import com.lst.lc.page.PageHandler;
import com.lst.lc.utils.PropertiesUtil;
import com.lst.lc.utils.StringUtils;
import com.lst.lc.web.bean.CourseMenu;
import com.lst.lc.web.bean.CourseTag;
@Service
public class CourseMenuHandler {
@Autowired
private PageHandler<Course> pageHandler;
@Autowired
@Qualifier("categoryDao")
private CategoryDao categoryDao;
@Autowired
@Qualifier("directionDao")
private DirectionDao directionDao;
@Autowired
@Qualifier("courseDao")
private CourseDao courseDao;
String[] difficulties = { "初级", "中级", "高级" };
public CourseMenu getCourseMenu(String directionId, String categoryId,
String difficulty, String type, String pageNum, String pageSize) {
/*
* 初始化所需参数
*/
CourseMenu courseMenu = new CourseMenu();
List<CourseTag> directionTags = new ArrayList<CourseTag>();
List<CourseTag> categoryTags = new ArrayList<CourseTag>();
List<CourseTag> difficultyTags = new ArrayList<CourseTag>();
Page<Course> page;
// 方向信息无论哪种情况都是全部的
List<Direction> directions = directionDao.getAllDirections();
// 分类信息不一定是全部,也可能是某个方向下的分类
List<Category> categories;
/*
* 初始化页码和每页大小
*/
int pageNow, pagesize;
if (StringUtils.isNull(pageNum)) {
pageNow = 1;
} else {
pageNow = Integer.valueOf(pageNum);
}
if (StringUtils.isNull(pageSize)) {
pagesize = Integer.valueOf(PropertiesUtil.getValue("pageSize"));
} else {
pagesize = Integer.valueOf(pageSize);
}
//主键查询参数
int idParamNum = 0;
int idParam = 0;
//难度查询参数
int difficultyParamNum = 0;
String difficultyParam = null;
//起始查询语句
String hql = "from Course as course ";
/*
* 先做一个处理,即当方向与分类都有参数,且他们是冲突的,以方向为准,分类置空
*/
if(directionId != null && directionId.equals("0")){
categoryId = null;
}
if(!StringUtils.isNull(categoryId) && !StringUtils.isNull(directionId)){
Category category = categoryDao.getCategory(Integer.valueOf(categoryId));
if(category.getDirection().getDirectionId() != Integer.valueOf(directionId)){
categoryId = null;
}
}
/*
* 分类不为空的情况下,不论方向是否指定,均可以确定为改分类所属的方向
*/
if (!StringUtils.isNull(categoryId)) {
int categoryid = Integer.valueOf(categoryId);
Category category = categoryDao.getCategory(categoryid);
int directionid = category.getDirection().getDirectionId();
/*
* 添加方向标签行信息;
* 方向标签行的"全部"置为不活跃;
* 将与分类所属方向相同的方向标签置为活跃;
*/
CourseTag directionAllTag = new CourseTag(0, "全部", false);
directionTags.add(directionAllTag);
for (int i = 0; i < directions.size(); i++) {
CourseTag directionTag = new CourseTag(directions.get(i)
.getDirectionId(),
directions.get(i).getDirectionName(), false);
if (directionTag.getId() == directionid) {
directionTag.setActive(true);
}
directionTags.add(directionTag);
}
/*
* 添加分类标签行信息;
* 分类标签行的"全部"置为不活跃;
* 将与该分类相同的标签置为活跃;
*/
CourseTag categoryAllTag = new CourseTag(0, "全部", false);
categoryTags.add(categoryAllTag);
categories = categoryDao.getCategories(directionid);
for (int i = 0; i < categories.size(); i++) {
CourseTag categoryTag = new CourseTag(categories.get(i)
.getCategoryId(),
categories.get(i).getCategoryName(), false);
if (categoryTag.getId() == categoryid) {
categoryTag.setActive(true);
}
categoryTags.add(categoryTag);
}
//拼接查询语句
hql = hql + "where course.category.categoryId = ? ";
idParamNum += 1;
idParam = categoryid;
}
/*
*分类为空,即没有指定分类,需要判断方向是否为空
*/
else {
/*
* 如果方向不为空,即指定了方向,那么该方向要标记活跃,同时分类取该方向下的分类
*/
if(!StringUtils.isNull(directionId)) {
int directionid = Integer.valueOf(directionId);
/*
* 添加方向标签行信息;
* 方向标签行的"全部"置为不活跃;
* 将与分类所属方向相同的方向标签置为活跃;
*/
CourseTag directionAllTag = new CourseTag(0, "全部", false);
directionTags.add(directionAllTag);
for (int i = 0; i < directions.size(); i++) {
CourseTag directionTag = new CourseTag(directions.get(i)
.getDirectionId(),
directions.get(i).getDirectionName(), false);
if (directionTag.getId() == directionid) {
directionTag.setActive(true);
}
directionTags.add(directionTag);
}
/*
* 添加分类标签行信息;
* 分类标签行的"全部"置为活跃;
* 分类取该方向下的分类,不活跃;
*/
CourseTag categoryAllTag = new CourseTag(0, "全部", true);
categoryTags.add(categoryAllTag);
categories = categoryDao.getCategories(directionid);
for (int i = 0; i < categories.size(); i++) {
CourseTag categoryTag = new CourseTag(categories.get(i)
.getCategoryId(),
categories.get(i).getCategoryName(), false);
categoryTags.add(categoryTag);
}
//拼接查询语句
hql = hql + "where course.direction.directionId = ? ";
idParamNum += 1;
idParam = directionid;
}
/*
* 如果方向为空,即既没有指定方向也没有指定分类,那么分类取全部分类
*/
else {
/*
* 添加方向标签行信息;
* 方向标签行的"全部"置为活跃;
* 所有方向均不活跃;
*/
CourseTag directionAllTag = new CourseTag(0, "全部", true);
directionTags.add(directionAllTag);
for (int i = 0; i < directions.size(); i++) {
CourseTag directionTag = new CourseTag(directions.get(i)
.getDirectionId(),
directions.get(i).getDirectionName(), false);
directionTags.add(directionTag);
}
/*
* 添加分类标签行信息;
* 分类标签行的"全部"置为活跃;
* 分类取所有分类,不活跃;
*/
CourseTag categoryAllTag = new CourseTag(0, "全部", true);
categoryTags.add(categoryAllTag);
categories = categoryDao.getAllCategories();
for (int i = 0; i < categories.size(); i++) {
CourseTag categoryTag = new CourseTag(categories.get(i)
.getCategoryId(),
categories.get(i).getCategoryName(), false);
categoryTags.add(categoryTag);
}
//查询语句不需要处理
}
}
/*
*难度标签需要根据difficulty传值判断,如果difficulty为空,则"全部"为活跃;否则,该难度活跃
*/
CourseTag difficultyAllTag = new CourseTag(0, "全部", true);
difficultyTags.add(difficultyAllTag);
for (int i = 0; i < 3; i++) {
CourseTag difficultyTag = new CourseTag(i + 1, difficulties[i], false);
difficultyTags.add(difficultyTag);
}
/*
* 如果difficulty不为空,则"全部"不活跃
*/
if (!StringUtils.isNull(difficulty)) {
difficultyTags.get(0).setActive(false);
int index = Integer.valueOf(difficulty);
difficultyTags.get(index).setActive(true);
//处理查询语句
if(idParamNum > 0)
hql = hql + "and ";
else
hql = hql + "where ";
hql = hql + "course.difficulty = ? ";
difficultyParam = difficulty;
difficultyParamNum += 1;
}
//如果排序方式不为空
if(!StringUtils.isNull(type)){
hql = hql + "order by course.studentNums desc";
}
Query query = courseDao.getQuery(hql);
if(idParamNum > 0){
query.setInteger(0, idParam);
}
if(difficultyParamNum > 0)
query.setString(idParamNum, difficultyParam);
page = pageHandler.getPage(pageNow, pagesize, Course.class, query);
courseMenu.setCategoryTags(categoryTags);
courseMenu.setDifficultyTags(difficultyTags);
courseMenu.setDirectionTags(directionTags);
courseMenu.setPage(page);
return courseMenu;
}
}