`
收藏列表
标题 标签 来源
mongodb查车服务 mongodb
package com.autoyol.mongodb;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.geo.Metrics;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import com.autoyol.mapper.CarMapper;
import com.autoyol.mapper.CityMapper;
import com.autoyol.mapper.HolidayMapper;
import com.autoyol.mapper.MemberMapper;
import com.autoyol.mongodb.domain.CarFilterInfo;
import com.autoyol.mongodb.domain.CarInfo;
import com.autoyol.mongodb.domain.TransInfo;
import com.autoyol.mongodb.util.MongoUtils;
import com.autoyol.mongodb.vo.CarListVo;
import com.autoyol.mongodb.vo.ResData;
import com.autoyol.service.SysConstantService;
import com.autoyol.util.BizAreaUtil;
import com.autoyol.util.CalendarUtils;
import com.autoyol.util.trans.Calculator;
import com.autoyol.vo.MemBaseInfoVo;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
/**
 * 提供对外接口
 * @author zhiping.li
 *
 */
@Service
public class CarMongoDBService extends MongoDBService {

	@Autowired
	private MemberMapper memMapper;

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Autowired
	private SysConstantService sysConstantService;

	@Autowired
	private CityMapper cityMapper;

	@Autowired
	private HolidayMapper holidayMapper;

	@Autowired
	private CarMapper carMapper;

	private double r = Metrics.KILOMETERS.getMultiplier();
	private static final  Map<String, Integer> CARTYPE_MAPPING = new HashMap<String, Integer>() {
		private static final long serialVersionUID = 8335510196884659392L;
		{//转换为  1:MPV,2:SUV,3:中型车,4:中大型车,5:其它,6:客车,7:小型车,8:微型车,9:房车,10:皮卡,11:紧凑型车,12:豪华车,13:跑车,14:面包车
			put("1", 7);//小型车
			put("2", 3);//中型车
			put("3", 12);//豪华车
			put("4", 2);//SUV
			put("5", 1);//MPV
			put("6", 13);//跑车
		}};

		/**
		 * 设置查询参数
		 * @param carListVo
		 * @return
		 * @throws Exception 
		 */
		private Criteria setQueryParam(CarListVo carListVo) throws Exception{
			double lon = carListVo.getLon();  //经度
			double lat = carListVo.getLat(); //纬度
			int gbType = carListVo.getGbType(); //变速箱类型, 1:手动 ,2:自动
			String carType = carListVo.getCarType();  //车型

			String token = carListVo.getToken(); //用户token
			int startTime = carListVo.getStartTime(); //开始时间
			int endTime = carListVo.getEndTime();  //结束时间
			int brandId = carListVo.getBrandId();  //品牌id
			long startTimeLong = carListVo.getStartTimeLong(); //开始时间
			long endTimeLong = carListVo.getEndTimeLong();  //结束时间
			int city = carListVo.getCity();   //所在城市
			int isLocal = carListVo.getIsLocal();  //是否本地车
			int seatNum = carListVo.getSeatNum();  //座位数
			int driveType = carListVo.getDriveType(); //驱动方式
			int skylightsType = carListVo.getSkylightsType();  //天窗
			int seatType = carListVo.getSeatType();  //座位是否为真皮    真皮则为1没有则送0
			int radar = carListVo.getRadar();   //倒车雷达
			String area = carListVo.getArea();  //商圈 字符

			int minPrice = carListVo.getMinPrice();  //最低价
			int maxPrice = carListVo.getMaxPrice();  //最高价

			Integer avigraphType = carListVo.getAvigraphType();  //导航仪
			Integer tachographType = carListVo.getTachographType(); //行车记录仪


			int areaCode = carListVo.getAreaCode();  //区编号
			String colorCode = carListVo.getColorCode()==null?"0":carListVo.getColorCode();  //颜色号
			//int seq = carListVo.getSeq();
			//判断是否按距离排序

			if (city == 0){//如果城市代码上送0,则认为是上海
				city = 310100;
			}
			Criteria criteria = Criteria.where("city").is(city+"");
			//添加区编号参数
			if (areaCode != 0){
				criteria.and("districtId").is(areaCode+"");
			}
			//添加颜色筛选
			if(StringUtils.isNotEmpty(colorCode)&&!"0".equals(colorCode)){
				criteria.and("colorCode").in(Arrays.asList(colorCode.split(",")));
			}

			Calendar c = Calendar.getInstance();
			if (isLocal!=0) {
				criteria.and("isLocal").is(isLocal+"");
			}
			if (driveType!=0) {
				criteria.and("driveType").is(driveType+"");
			}
			if (skylightsType!=0) {
				criteria.and("skylightsType").in("2","3","4");
			}
			if (seatNum != 0){
				criteria.and("seatNum").is(seatNum+"");
			}
			if (seatType != 0){
				criteria.and("seatType").is(seatType+"");
			}
			if (radar != 0){
				criteria.and("radar").in("2","3");
			}
			if (maxPrice != 0){
				criteria.and("dayPrice").gte(minPrice).lte(maxPrice);
			}
			if (brandId != 0){
				criteria.and("brandId").is(brandId+"");
			}


			if(carListVo.getTypeId() != 0){
				criteria.and("typeId").is(carListVo.getTypeId()+"");
			}
			if(carListVo.getCarAge() != 0){
				criteria.and("year").gte((c.get(Calendar.YEAR)-carListVo.getCarAge())+"");
			}
			if(carListVo.getEngineCap() != 0){
				if (carListVo.getEngineCap()==1) {
					criteria.and("cylinderCapacity").lte(1.5+"").and("ccUnit").is("L");
				}
				if (carListVo.getEngineCap()==2) {
					if (StringUtils.isNotEmpty(area)){
						criteria.and("cylinderCapacity").lte(1.6+"").and("ccUnit").is("T").orOperator(Criteria.where("cylinderCapacity").lte(2.0+"").gte(1.6+"").and("ccUnit").is("L"),Criteria.where("area").is(area),Criteria.where("area1").is(area),Criteria.where("area2").is(area));
					}else {
						criteria.and("cylinderCapacity").lte(1.6+"").and("ccUnit").is("T")
						.orOperator(Criteria.where("cylinderCapacity").lte(2.0+"").gte(1.6+"").and("ccUnit").is("L"));
					}
				}
				if (carListVo.getEngineCap()==3) {
					if (StringUtils.isNotEmpty(area)){
						criteria.and("cylinderCapacity").lte(2.0+"").gte(1.7+"").and("ccUnit").is("T")
						.orOperator(Criteria.where("cylinderCapacity").lte(2.5).gte(2.1).and("ccUnit").is("L")
								,Criteria.where("area").is(area),Criteria.where("area1").is(area),Criteria.where("area2").is(area));
					}else {
						criteria.and("cylinderCapacity").lte(2.0+"").gte(1.7+"").and("ccUnit").is("T")
						.orOperator(Criteria.where("cylinderCapacity").lte(2.5+"").gte(2.1+"").and("ccUnit").is("L"));
					}

				}
				if (carListVo.getEngineCap()==4) {
					if (StringUtils.isNotEmpty(area)){
						criteria.and("cylinderCapacity").gte(2.6+"").and("ccUnit").is("L").orOperator(
								Criteria.where("cylinderCapacity").gte(2.1+"").and("ccUnit").is("T"),
								Criteria.where("area").is(area),Criteria.where("area1").is(area),Criteria.where("area2").is(area));
					}else {
						criteria.and("cylinderCapacity").gte(2.6+"").and("ccUnit").is("L")	.orOperator(
								Criteria.where("cylinderCapacity").gte(2.1+"").and("ccUnit").is("T"));
					}

				}

			}else {
				if (StringUtils.isNotEmpty(area)){
					criteria.orOperator(Criteria.where("area").is(area),Criteria.where("area1").is(area),Criteria.where("area2").is(area));
				}
			}

			if(avigraphType != null && avigraphType != 0){
				criteria.and("avigraphType").is(avigraphType+"");
			}
			if(tachographType != null && tachographType != 0){
				criteria.and("tachographType").is(tachographType+"");
			}
			if (startTime != 0 && endTime != 0){//分空闲时间车辆过滤
				List<Integer> carNoList = new ArrayList<Integer>();
				List<Integer> carNoListBusy = this.inBusyTime(startTime, endTime);
				List<Integer> carNoListRevery = this.inRevertTime(startTimeLong + 1, endTimeLong-1);
				if (carNoListBusy != null && carNoListBusy.size() != 0){
					carNoList.addAll(carNoListBusy);
				}
				if (carNoListRevery != null && carNoListRevery.size() != 0){
					carNoList.addAll(carNoListRevery);
				}
				if (carNoList.size() != 0){
					criteria.and("carNo").nin(carNoList);
				}
			}
			if(startTimeLong != 0 && endTimeLong != 0){
				if(Calculator.currTimeLessOrEqHours(startTimeLong, 4)){
					criteria.and("status").is("1");
				}
				if(Calculator.currTimeBeforeRentTimeHours(startTimeLong, 12)){
					criteria.and("status").in("1","7");
				}
				if(Calculator.currTimeBeforeRentTimeHours(startTimeLong, 4) && Calculator.currTimeLessOrEqHours(startTimeLong, 12)){
					String stStr = String.valueOf(startTimeLong);
					int h = 0;
					if(stStr.length() == 14){
						h = Integer.parseInt(stStr.substring(8, 10));
					}
					if(h>= 11 && h <= 20){
						criteria.and("status").in("1","7");
					}else{
						criteria.and("status").is("1");
					}
				}
			}else {
				criteria.and("status").in("1","7");
			}
			if (lon == 0 && lat == 0){//没有开gps,默认值为上海市中心
				lon = 121.491121;
				lat = 31.243466;
			}
			if (gbType!=0) {
				criteria.and("gbType").is(gbType+"");
			}
			if (carType == null){
				carType = "0";
			}
			List<String> carTypes = new ArrayList<String>();
			if(!carType.equals("0")){
				String[] carTypeArray = carType.split(","); 
				for (String n : carTypeArray){
					Integer value = CARTYPE_MAPPING.get(n);
					if (value==null) {
						continue;
					}
					if (value == 7){
						carTypes = Arrays.asList("7","8","11"); 
					} else if (value == 3){
						carTypes = Arrays.asList("3","4"); 
					} else {
						carTypes.add(value+"");
					}
				}
			}
			if (CollectionUtils.isEmpty(carTypes)&&!"0".equals(carType)) {
				criteria.and("useType").in(carTypes);
			}
			criteria.and("isPlatformShow").is(1+"");
			/**
			 * 过滤掉1V4邀请车主的成功车辆号  150710 huangjing
			 */
			if(carListVo.getInviteSuccCarNos() != null && carListVo.getInviteSuccCarNos().length() > 0){
				List<Integer> carNos = new ArrayList<Integer>();
				String carNosa[] = carListVo.getInviteSuccCarNos().split(",");
				if (carNosa.length>0) {
					for (String carNo:carNosa) {
						carNos.add(Integer.valueOf(carNo));
					}
				}
				criteria.and("carNo").nin(carNos);
			}

			//	logger.info("当前的token值:" + token);
			if("0".equals(token)){//没有登录
				//logger.info("没有登录的情况seq值:{}", seq);
				criteria.and("rating").lte(1+"");  //默认是找出第一级别的车辆
			}else{
				MemBaseInfoVo memInfo = memMapper.getMemBaseInfoByToken(token);
				if(memInfo == null){//token无效,等同于没有登录
					//logger.info("token无效,等同于没有登录seq值:", seq);
					criteria.and("rating").lte(1+"");   //默认是找出第一级别的车辆
				}else{
					criteria.and("rating").lte(memInfo.getRenterRating()+""); 
				}
			}
			return criteria;
		}
		/**
		 * 根据查询条件分页查询车辆信息
		 * @param carListVo
		 * @return
		 * @throws Exception 
		 */
		public List<CarInfo> findCarInfos(CarListVo carListVo) throws Exception{
			int tag = carListVo.getTag();  //是否使用小图,1为小图
			double lon = carListVo.getLon();  //经度
			double lat = carListVo.getLat(); //纬度
			Criteria criteria = setQueryParam(carListVo);

			int pageNum = carListVo.getPageNum();
			int pageSize = carListVo.getPageSize();
			int seq = carListVo.getSeq();  //排序规则
			int nearby = carListVo.getNearby();
			if (lon == 0 && lat == 0){//没有开gps,默认值为上海市中心
				lon = 121.491121;
				lat = 31.243466;
			}else{
				String lonStr = String.valueOf(lon);
				String latStr = String.valueOf(lat);
				int lo = Integer.valueOf(lonStr.substring(0,lonStr.indexOf(".")));
				int la = Integer.valueOf(latStr.substring(0,latStr.indexOf(".")));
				if(lo >= 115 && lo <= 117 && (la == 39 || la == 40)){
					//如果上送的是北京的经纬度,则按好评率排序
					if(seq == 0){
						seq = 2;
					}
				}
			}
			//判断是否按距离排序
			int sortValue = 0;
			if(seq == 1 || seq == 0 || seq == 4){
				//默认排序统一采用综合排序
				if(seq == 0){
					seq = 4;
				}
				if(lon != 0 && lat != 0){
					sortValue = seq;
				}else{
					sortValue = 2;
					logger.info("没有上送经纬度(lon={},lat={}),无法进行距离排序",lon,lat);
				}
			}else{
				sortValue = seq;
			}
			DBObject sortFileds = new BasicDBObject();
			DBObject geoNearFileds = new BasicDBObject();
			geoNearFileds.put("near", new double[]{lon,lat});
			geoNearFileds.put("distanceMultiplier", r);
			geoNearFileds.put("spherical",true);
			geoNearFileds.put("distanceField", "distance");
			geoNearFileds.put("includeLocs", "position");
			geoNearFileds.put("num", Integer.MAX_VALUE);//如果该值不设置,因为limit默认是100,就会出现查出的数据超过100,也只会显示100
			geoNearFileds.put("query", criteria.getCriteriaObject());
			if (nearby!=0) {//选择了附近
				geoNearFileds.put("maxDistance", nearby/r);
				if (sortValue==0||sortValue==4) {
					sortFileds.put("seqScore", -1);
					sortFileds.put("evalGoodCount", -1);
					sortFileds.put("distance", 1);
					if (nearby == 0) {
						sortFileds.put("seqRating", 1);
					}
					sortFileds.put("carNo", 1);
				}
				sortFileds = sort(sortValue, sortFileds);
			}else{//未选择附近
				if (sortValue==0||sortValue==4) {
					sortFileds.put("seqRating", -1);
					sortFileds.put("carNo", 1);
					sortFileds.put("distance", 1);
				}else {
					sortFileds = sort(sortValue, sortFileds);
				}
			} 

			DBObject geoNear = new BasicDBObject("$geoNear", geoNearFileds);

			DBObject sort = new BasicDBObject("$sort", sortFileds);

			DBObject skip  = new BasicDBObject("$skip",(pageNum-1)*pageSize);

			DBObject limit  = new BasicDBObject("$limit",pageSize);

			List<DBObject> dbObjects =  super.aggregate(CarInfo.class, geoNear,skip,limit,sort);

			List<CarInfo> carInfos = new ArrayList<CarInfo>();

			if (CollectionUtils.isEmpty(dbObjects)) {
				return null;
			}
			for (DBObject dbObject : dbObjects) {
				CarInfo carInfo = new CarInfo();
				carInfo = MongoUtils.dbObject2Bean(dbObject, carInfo);
				carInfo.setId(dbObject.get("_id").toString());
				if (tag==1) {
					carInfo.setCoverPic("1"+carInfo.getCoverPic());
				}else {
					carInfo.setCoverPic("2"+carInfo.getCoverPic());
				}
				carInfo.setEvalCount((Integer.valueOf(dbObject.get("evalGoodCount")+"")+Integer.valueOf(dbObject.get("evalMediumCount")+"")+Integer.valueOf(dbObject.get("evalBadCount")+"")));
				carInfos.add(carInfo);
			}
			return carInfos;
		}


		/**
		 * 排序
		 * @param seq
		 * @param sortOperation
		 * @return
		 */
		private DBObject sort(int seq, DBObject sortFileds) {
			if (seq == 1) {
				sortFileds.put("distance", 1);
				sortFileds.put("carNo", 1);
			}
			if (seq == 2) {
				sortFileds.put("evalGoodCount", -1);
				sortFileds.put("carNo", 1);
			}
			if (seq == 3) {
				sortFileds.put("dayPrice", 1);
				sortFileds.put("carNo", 1);
			}
			if (seq == 5) {
				sortFileds.put("receptance", -1);
				sortFileds.put("carNo", 1);
			}
			if (seq == 6) {
				sortFileds.put("dayPrice", -1);
				sortFileds.put("carNo", 1);
			}
			return sortFileds;
		}



		/**
		 * 根据查询统计车辆信息
		 * @param carListVo
		 * @return
		 * @throws Exception
		 */
		public int getCarInfoCount(CarListVo carListVo) throws Exception{
			Criteria  criteria = setQueryParam(carListVo);
			double lon = carListVo.getLon();
			double lat = carListVo.getLat();
			if (lon == 0 && lat == 0){//没有开gps,默认值为上海市中心
				lon = 121.491121;
				lat = 31.243466;
			}
			int nearby = carListVo.getNearby();   //附近
			DBObject geoNearFileds = new BasicDBObject();
			geoNearFileds.put("near", new double[]{lon,lat});
			geoNearFileds.put("distanceMultiplier", r);
			geoNearFileds.put("spherical",true);
			geoNearFileds.put("distanceField", "distance");
			geoNearFileds.put("includeLocs", "position");
			geoNearFileds.put("num", Integer.MAX_VALUE);
			geoNearFileds.put("query", criteria.getCriteriaObject());
			DBObject geoNear = new BasicDBObject();
			if (nearby!=0) {
				geoNearFileds.put("maxDistance", nearby/r);
			}
			geoNear.put("$geoNear", geoNearFileds);

			DBObject count = new BasicDBObject("$sum",1);
			DBObject groupFileds = new BasicDBObject("_id", null);//如果设置值,这不能保证类似于select count(id)的统计,这样就保证了统计的正确
			groupFileds.put("count", count);
			DBObject group = new BasicDBObject("$group", groupFileds);

			List<DBObject> dbObjects = super.aggregate(CarInfo.class,geoNear/*,match*/,group);
			if (CollectionUtils.isEmpty(dbObjects)) {
				return 0;
			}
			return (int) dbObjects.get(0).get("count");
		}
		/**
		 * 修改车辆信息
		 * @param carInfo
		 * @return
		 */
		public boolean updateCarInfoByCarNo(Query query,Update update){
			boolean flag = false;
			try {
				super.modify(query, update, CarInfo.class);
				flag = true;
			} catch (Exception e) {
				flag = false;
			}
			return flag;
		}
		/**
		 * 修改Trans信息
		 * @param carInfo
		 * @return
		 */
		public boolean updateTransInfoByCarNo(Query query,Update update){
			boolean flag = false;
			try {
				super.modify(query, update, TransInfo.class);
				flag = true;
			} catch (Exception e) {
				flag = false;
			}
			return flag;
		}

		/**
		 * 修改CarFilterInfo信息
		 * @param carInfo
		 * @return
		 */
		public boolean updateCarFilterInfoByCarNo(Query query,Update update){
			boolean flag = false;
			try {
				super.modify(query, update, CarFilterInfo.class);
				flag = true;
			} catch (Exception e) {
				flag = false;
			}
			return flag;
		}
		/**
		 * 根据carNo删除数据
		 * @param id
		 * @return
		 * @throws Exception 
		 */
		public void deleteCarInfoByCarNo(int carNo) throws Exception{
			Query query = new Query(Criteria.where("carNo").is(carNo));
			if (!isExist(CarInfo.class, query)) {
				throw new Exception("车辆号carNo为:"+carNo+"不存在");
			}
			super.remove(query, CarInfo.class);

		}
		/**
		 * 根据carNo、orderNo删除数据
		 * @param id
		 * @return
		 * @throws Exception 
		 */
		public void deleteTransInfoByCarNoAndOrderNo(int carNo,String orderNo) throws Exception{
			Query query = new Query(Criteria.where("carNo").is(carNo).and("orderNo").is(orderNo));
			if (!super.isExist(TransInfo.class, query)) {
				throw new Exception("车辆号carNo:"+carNo+"订单号orderNo:"+orderNo+"已不存在");
			}
			super.remove(query, TransInfo.class);

		}
		/**
		 * 根据carNo或者carNo、tv删除数据
		 * @param tv 
		 * @param id
		 * @return
		 * @throws Exception 
		 */
		public void deleteCarFilterInfoByCarNo(int carNo, String tv) throws Exception{
			Criteria criteria = Criteria.where("carNo").is(carNo);
			Query query = new Query();
			if (StringUtils.isNotEmpty(tv)) {
				criteria.and("tv").is(tv);
			}
			query.addCriteria(criteria);
			if (!super.isExist(CarFilterInfo.class, query)) {
				throw new Exception("车辆号carNo:"+carNo+"在日期tv:"+tv+"已不存在");
			}
			super.remove(query, CarFilterInfo.class);
		}
		/**
		 * 保存车辆信息
		 * @param carInfo
		 * @return
		 */
		public  void saveCarInfo(CarInfo carInfo){

			try {
				carInfo.setPosition(new double[]{carInfo.getLon(),carInfo.getLat()});
				super.insert(carInfo);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		/**
		 * 保存Trans信息
		 * @param carInfo
		 * @return
		 * @throws Exception 
		 */
		public  void saveTransInfo(TransInfo transInfo) throws Exception{
			if (transInfo.getCarNo()==0) {
				throw new Exception("请填入车辆号码carNo");
			}
			if (!StringUtils.isNotEmpty(transInfo.getOrderNo())) {
				throw new Exception("请输入订单号码orderNo");
			}
			if (super.isExist(TransInfo.class, new Query(Criteria.where("carNo").is(transInfo.getCarNo()).and("orderNo").is(transInfo.getOrderNo())))) {
				throw new Exception("车辆号carNo:"+transInfo.getCarNo()+"订单orderNo:"+transInfo.getOrderNo()+"已经存在不能添加");
			}
			if (!StringUtils.isNotEmpty(transInfo.getRentTime())) {
				throw new Exception("请输入起租时间rentTime");
			}
			if (!MongoUtils.isValidDate(transInfo.getRentTime(),"yyyyMMddHHmmss")) {
				throw new Exception("请输入正确的起租时间rentTime:yyyyMMddHHmmss,例如:20150909121012");
			}
			if (!StringUtils.isNotEmpty(transInfo.getRevertTime())) {
				throw new Exception("请输入归还时间revertTime");
			}
			if (!MongoUtils.isValidDate(transInfo.getRevertTime(),"yyyyMMddHHmmss")) {
				throw new Exception("请输入正确的归还时间revertTime:yyyyMMddHHmmss,例如:20150909121012");
			}
			if (!StringUtils.isNotEmpty(transInfo.getRentTimeLock())) {
				throw new Exception("请填入租车时间锁定状态rentTimeLock");
			}
			if (!StringUtils.isNotEmpty(transInfo.getStatus())) {
				throw new Exception("请填入租车状态status");
			}
			super.insert(transInfo);

		}

		/**
		 * 保存CarFilter信息
		 * @param carInfo
		 * @return
		 */
		public  void saveCarFilterInfo(CarFilterInfo carFilterInfo)throws Exception{
			if (carFilterInfo.getCarNo()==0) {
				throw new Exception("请填入车辆号码carNo");
			}
			if (!StringUtils.isNotEmpty(carFilterInfo.getTv())) {
				throw new Exception("请填入日期tv");
			}
			if (!StringUtils.isNotEmpty(carFilterInfo.getWeek())) {
				throw new Exception("请填入星期week");
			}
			if (!MongoUtils.isValidDate(carFilterInfo.getTv(),"yyyyMMdd")) {
				throw new Exception("请输入正确的日期tv:yyyyMMdd,例如:20150909");
			}
			if (!MongoUtils.isInteger(carFilterInfo.getWeek())) {
				throw new Exception("星期week只能是1-7的数字");
			}
			if (Integer.parseInt(carFilterInfo.getWeek())<1 || Integer.parseInt(carFilterInfo.getWeek())>7) {
				throw new Exception("星期week只能是1-7的数字");
			}
			//	carFilterInfo.setWeek(MongoUtils.dayForWeek(carFilterInfo.getTv(),"yyyyMMdd")+"");
			if (super.isExist(CarFilterInfo.class, new Query(Criteria.where("carNo").is(carFilterInfo.getCarNo()).and("tv").is(carFilterInfo.getTv())))) {
				throw new Exception("车辆号carNo:"+carFilterInfo.getCarNo()+"在日期tv:"+carFilterInfo.getTv()+"已经存在,不能添加");
			}
			super.insert(carFilterInfo);
		}

		/**
		 * 批量保存车辆信息
		 * @param carInfos
		 * @param carFilterInfos 
		 * @param transInfos 
		 */
		public void batchSave(List<CarInfo> carInfos, List<CarFilterInfo> carFilterInfos, List<TransInfo> transInfos)throws Exception{
			super.insert(carFilterInfos, CarFilterInfo.class);
			super.insert(transInfos, TransInfo.class);
			super.insert(carInfos, CarInfo.class);
		}

		/**
		 * 查询空闲车辆
		 * @param startTime
		 * @param endTime
		 * @return
		 */
		@SuppressWarnings("unchecked")
		public List<Integer> inBusyTime(int startTime, int endTime)throws Exception{
			Query query = new Query(Criteria.where("tv").gte(startTime).lte(endTime));
			return (List<Integer>) super.distinct(CarFilterInfo.class, "carNo", query.getQueryObject());
		}

		public <T> List<T> findByCarNo(int carNo,Class<T> entityClass)throws Exception{
			Query query = new Query(Criteria.where("carNo").is(carNo));
			return super.find(query, entityClass);
		}
		/**
		 * 
		 * @param startTime
		 * @param endTime
		 * @return
		 */
		@SuppressWarnings("unchecked")
		public List<Integer> inRevertTime( long startTime, long endTime)throws Exception{
			Query query = new Query();
			Criteria criteria = Criteria.where("rentTime").gte(startTime).lte(endTime);
			criteria.orOperator(Criteria.where("revertTime").gte(startTime).lte(endTime),Criteria.where("rentTime").lte(startTime).and("revertTime").gte(endTime),Criteria.where("status").gte(2).lte(13));
			criteria.and("rentTimeLock").is(1);
			query.addCriteria(criteria);
			return (List<Integer>) super.distinct(TransInfo.class, "carNo", query.getQueryObject());
		}

		/**
		 * 初始化数据到mongodb
		 */
		public void initData()throws Exception{
			try {
				//清空mongodb数据
				super.clear();
				int totalNum = 1;
				int pageSize = 1000;
				int rowCount = jdbcTemplate.queryForObject("select count(id) from car",Integer.class);
				if (rowCount%pageSize==0) {
					totalNum = rowCount/pageSize;
				}else {
					totalNum = rowCount/pageSize+1;
				}
				ExecutorService service = Executors.newCachedThreadPool();
				for (int i = 1; i <= totalNum; i++) {
					service.execute(new ProcessCarTask(pageSize, i)); 
				}
				service.shutdownNow();
				List<TransInfo> transInfos = jdbcTemplate.query("SELECT car_no,order_no,id,revert_time,rent_time,rent_time_lock,status FROM trans",  BeanPropertyRowMapper.newInstance(TransInfo.class));
				insert(transInfos, TransInfo.class);
				List<CarFilterInfo> carFilterInfos = jdbcTemplate.query("SELECT id,week,tv,car_no,IFNULL(type,0) as type FROM car_filter", BeanPropertyRowMapper.newInstance(CarFilterInfo.class));
				insert(carFilterInfos, CarFilterInfo.class);
				logger.info("初始化数据成功");
			} catch (DataAccessException e) {
				logger.error("初始化数据异常:"+e.getMessage(),e);
				//e.printStackTrace();
				throw new Exception(e);
			}
		}

		/**
		 * 处理car表中的数据
		 * @author zhiping.li
		 *
		 */
		private class ProcessCarTask implements Runnable{
			int pageSize; 
			int i;
			private  ProcessCarTask(int pageSize, int i) {
				this.pageSize = pageSize;
				this.i = i;
			}
			@Override
			public void run() {
				List<Object> args = new ArrayList<Object>();
				StringBuffer sb = new StringBuffer();
				sb.append("SELECT ");
				sb.append("id,");
				sb.append("reg_no as carNo,");
				sb.append("mem_no,");
				sb.append("brand as brandId,");
				sb.append("brand_txt as brand,");
				sb.append("type as typeId,");
				sb.append("type_txt as type,");
				sb.append("IFNULL(c.year,'') AS year, ");
				sb.append("month ,");
				sb.append("model as modelId,");
				sb.append("model_txt as model,");
				sb.append("seat_num,");
				sb.append("reg_time,");
				sb.append("status,");
				sb.append("tran_status,");
				sb.append("color_code,");
				sb.append("color,");
				sb.append("radar,");
				sb.append("cc_unit,");
				sb.append("cylinder_capacity as cylinderCapacity , ");
				sb.append("IFNULL(is_local,1) as isLocal,          ");
				sb.append("IFNULL(c.gearbox_type,1) as gbType,      ");
				sb.append("IFNULL(use_type,5) as userType,          ");
				sb.append("drive_type,");
				sb.append("is_platform_show ,");
				sb.append("day_price,");
				sb.append("district_id as districtId,       ");
				sb.append("area_id as areaId,      ");
				sb.append("rating as rating,       ");
				sb.append("succ_trans_count as succTransCount, ");
				sb.append("hour_price,");
				sb.append("week_price,");
				sb.append("eval_good_count,");
				sb.append("eval_medium_count,eval_bad_count,");
				sb.append("(eval_good_count+eval_medium_count+eval_bad_count) as evalCount,");
				sb.append("receptance,");
				sb.append("seq_rating,");
				sb.append("IF(holiday_price IS NULL||holiday_price=0,day_price,holiday_price) as holidayPrice,");
				sb.append("city, ");
				sb.append("area_id as areaId ,");
				sb.append("area ,");
				sb.append("area1 ,");
				sb.append("area2, ");
				sb.append("use_type, ");
				sb.append("drive_type, ");
				sb.append("skylights_type, ");
				sb.append("seat_num, ");
				sb.append("seat_type, ");
				sb.append("radar, ");
				sb.append("avigraph_type, ");
				sb.append("tachograph_type ,");
				sb.append("mem_token as token,");
				sb.append("color_code,  ");
				sb.append("seq_rating,  ");
				sb.append("cover_pic,  ");
				sb.append("district,");
				sb.append("get_car_addr as carAddr,  ");
				sb.append("seq_score,individuality_url,");
				sb.append("IFNULL(get_car_lat,0) as lat ,IFNULL(get_car_lon,0) as lon, ");
				sb.append("LEFT(plate_num,2) as plateNum,IFNULL((SELECT (SUM(eval.punctual)+SUM(eval.car_status))/COUNT(eval.car_no)/2 FROM trans_eval eval WHERE eval.car_no=c.reg_no and eval.eval_type=1),0) as evalScore ");
				sb.append("FROM ");
				sb.append("car  c   order by id asc  limit ?,?  ");
				args.add((i-1)*pageSize);
				args.add(pageSize);
				List<CarInfo> carInfos = jdbcTemplate.query(sb.toString(),args.toArray(), BeanPropertyRowMapper.newInstance(CarInfo.class));
				for (CarInfo carInfo : carInfos) {
					carInfo.setPosition(new double[]{carInfo.getLon(),carInfo.getLat()});
				}
				try {
					insert(carInfos, CarInfo.class);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}

		}



		/**
		 * 根据车辆号码查询诚信度
		 * @param carNo
		 * @return
		 */
		public Double getTransEvalByCarNo(int carNo){
			return jdbcTemplate.queryForObject("SELECT (SUM(eval.punctual)+SUM(eval.car_status))/COUNT(eval.car_no)/2 FROM trans_eval eval WHERE eval.car_no = ? and eval.eval_type=1",new Object[]{carNo},Double.class);
		}
		/**
		 * 查询车辆信息
		 * @param carListVo
		 * @return
		 * @throws Exception
		 */
		public ResData queryCarList(CarListVo carListVo) throws Exception{
			try {
				double latitude = carListVo.getLat();
				double longitude = carListVo.getLon();
				if (longitude == 0 && latitude == 0){//没有开gps,默认值为上海市中心
					longitude = 121.491121;
					latitude = 31.243466;
				}
				int city = carListVo.getCity();
				if (city == 0){//如果城市代码上送0,则认为是上海
					city = 310100;
				}
				Map<String, String> placeMap =  BizAreaUtil.getPlaceFromAMap(longitude, latitude);
				Map<String, Object> cityInfoMap = cityMapper.findCityInfoByCityCode(city);

				String cityNameFromAMap = placeMap.get("city");
				String cityNameFromDatabase = cityInfoMap.get("name") == null ? "" : cityInfoMap.get("name").toString();

				boolean isContained = cityNameFromAMap.contains(cityNameFromDatabase) || placeMap.get("province").contains(cityNameFromDatabase);

				if (!isContained) {
					carListVo.setLat(Double.valueOf(cityInfoMap.get("lat").toString()));
					carListVo.setLon(Double.valueOf(cityInfoMap.get("lon").toString()));
				}
			} catch (Exception e) {
				throw new Exception("获取车辆列表->定位其它城市异常。{}"+ e.getMessage());
			}
			int rowCount = this.getCarInfoCount(carListVo);
			List<CarInfo> dataList = this.findCarInfos(carListVo);

			ResData resData = new ResData();
			resData.setCount(rowCount);
			if (CollectionUtils.isEmpty(dataList)) {
				resData.setCars(dataList);
				return resData;
			}
			//公里数格式转换
			for (CarInfo carInfo : dataList){
				//评分计算v9添加
				evalCalculate(carInfo);

				double distance = Double.valueOf(carInfo.getDistance());
				carInfo.setDistance(String.format("%.2f", distance) + "km");
				//map.put("distance", String.format("%.2f", distance) + "km");
				String carAddr = carInfo.getCarAddr();
				if (StringUtils.isNotEmpty(carAddr)){
					if (carAddr.startsWith("上海市")){
						carAddr = carAddr.substring(3);
					}
					if (carAddr.startsWith("上海")){
						carAddr = carAddr.substring(2);
					}
					carInfo.setCarAddr(carAddr);
				}

				//查询车辆标签。 huangjing 150317
				//				Integer carNo = (Integer)map.get("carNo");
				//				Integer isReplyTag = carMapper.queryCarTags(carNo,1);   //这个地方还是需要根据carNo+memNo车主的注册号来查询。解决车辆移动到另外一个人名下的问题。150813 huangjing
				Integer carNo = Integer.valueOf(carInfo.getCarNo()); //车辆号
				Integer memNo =  Integer.valueOf(carInfo.getMemNo()); //车主号
				Integer isReplyTag = carMapper.queryCarTags(carNo,memNo); 
				//				map.put("carTags", carTags);
				if(isReplyTag > 0){
					//map.put("replyTag", 1);
					carInfo.setReplyTag("1");
				}else{
					//map.put("replyTag", 0);
					carInfo.setReplyTag("0");
				}
				//添加价格日历 2015.8.24
				addCalendarPrice(carInfo);

				//计算车辆列表均价 150827 huangjing
				calcCarAveragePrice(carListVo, carInfo);
			}
			resData.setCars(dataList);
			return resData;
		}
		private void calcCarAveragePrice(CarListVo carListVo, CarInfo carInfo) {
			try {
				//选择日期
				if(carListVo.getStartTimeLong() != 0 && carListVo.getEndTimeLong() != 0){
					Integer carNo = Integer.valueOf(carInfo.getCarNo()); //车辆号
					logger.info("计算车辆的均价开始,carNo={}",carNo);
					Integer dayPrice = carInfo.getDayPrice();
					Integer holidayPrice = Integer.valueOf(carInfo.getHolidayPrice());   //转换成整型
					if(holidayPrice != dayPrice){  //平日价和节假日价不同才处理,SQL中做了如果holidayPrice为NULL或者0,默认等于dayPrice
						List<String> holidayList = carInfo.getHolidayList();
						float totalHours = CalendarUtils.getHolidayTotalRentHours(carListVo.getStartTimeLong(), carListVo.getEndTimeLong());  //总的小时数,根据小时数计算天数。
						int average = CalendarUtils.getHolidayAverageRentAMT(carListVo.getStartTimeLong(), carListVo.getEndTimeLong(), holidayPrice, dayPrice, holidayList, totalHours);
						if(average != 1){
							//map.put("dayPrice", average);  //最终覆盖均价的值。
							carInfo.setDayPrice(average);
						}
					}
					logger.info("计算车辆的均价结束,carNo={}",carNo);
				}
			} catch (Exception e) {
				logger.error("calcCarAveragePrice Exception:",e);
			}

		}
		/**
		 * 综合评分计算,需求按0.5档位规则计算,如:4.1-4.5转换为4.5,4.6-5.0转换为5.0
		 * 
		 * @author by linqincai
		 * @param map
		 */
		private static void evalCalculate(CarInfo carInfo){
			Object evalValue = carInfo.getEvalScore();
			//没评价时,默认为5分
			double finalEvalScore = 5;
			if (evalValue != null){
				double evalScore = Double.valueOf(evalValue.toString());
				double result = evalScore * 10;// 乘以10表示小数点后第一位左移
				int tenTh = (int) (result % 10);// 取十分位的值
				int unit = (int) (result / 10 % 10);// 取个位数

				if (tenTh > 1 && tenTh <= 5){
					finalEvalScore = Double.parseDouble(unit + ".5");
				}else{
					if (tenTh == 0){
						finalEvalScore = Double.parseDouble((unit) + "");
					}else{
						finalEvalScore = Double.parseDouble((unit + 1) + "");
					}
				}
			}
			carInfo.setEvalScore(finalEvalScore);
		}
		/**
		 * 添加日历价格
		 * @param carInfo
		 * @return
		 */
		private Map<String,Object> addCalendarPrice(CarInfo carInfo){
			Object objectDayPrice = carInfo.getDayPrice();
			Object objectHolidayPrice = carInfo.getHolidayPrice();
			String dayPrice = objectDayPrice==null?"0":objectDayPrice.toString();
			String holidayPrice = objectHolidayPrice==null||objectHolidayPrice.toString().equals("0")?dayPrice:objectHolidayPrice.toString();
			//节假日列表
			List<String> holidayList = holidayMapper.selectHolidayList();
			//carInfo.put("holidayList", holidayList);  //封装参数
			carInfo.setHolidayList(holidayList);
			//获取当前月,和下个月的日历及价格
			Map<String,Object> map = new HashMap<String,Object>();

			// 当月最大天数
			int currentMonthLastDays = CalendarUtils.getCurrentMonthLastDay();
			// 当月日历集合
			List<String> currentMonthDaysList = CalendarUtils.getCurrentMonthDays();	
			List<Map<String,Object>> monthOfDayPriceList = getMonthOfDayPriceList(holidayList, holidayPrice, dayPrice, currentMonthLastDays, currentMonthDaysList);

			//下月天数
			Calendar calendar = Calendar.getInstance();
			int currentMonth = calendar.get(Calendar.MONTH);
			int nextMonthDays = CalendarUtils.getMonthLastDay(currentMonth+1);
			List<String> nextMonthDaysList = CalendarUtils.getNextMonthDays();
			List<Map<String,Object>> nextMonthOfDayPriceList = getMonthOfDayPriceList(holidayList, holidayPrice, dayPrice, nextMonthDays, nextMonthDaysList);
			//合并两个月的日历价格
			monthOfDayPriceList.addAll(nextMonthOfDayPriceList);
			carInfo.setPriceCalendar(monthOfDayPriceList);
			return map;
		}
		/**
		 * 根据当月天数及日历集合获取日历价格
		 * @param holidayList
		 * @param holidayPrice
		 * @param dailyPrice
		 * @param monthLastDays
		 * @param monthDaysList
		 * @return
		 */
		private List<Map<String, Object>> getMonthOfDayPriceList(
				List<String> holidayList, String holidayPrice, String dailyPrice,
				int monthLastDays, List<String> monthDaysList) {
			List<Map<String,Object>> currentMonthList = new ArrayList<Map<String,Object>>();
			for (int i = 0; i < monthLastDays; i++){
				String date = monthDaysList.get(i);
				Map<String, Object> dayPrice = new HashMap<String, Object>();
				dayPrice.put("day",date.substring(0, 4)+date.substring(5, 7)+date.substring(8));
				// 在节假日的添加到节假日价格
				if (holidayList.contains(monthDaysList.get(i))){
					dayPrice.put("price", holidayPrice);
				}else{
					dayPrice.put("price", dailyPrice);
				}
				currentMonthList.add(dayPrice);
			}
			return currentMonthList;
		}

}
mongodb服务 mongodb
package com.autoyol.mongodb;

import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.mongodb.core.CollectionCallback;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import com.autoyol.mongodb.domain.CarFilterInfo;
import com.autoyol.mongodb.domain.CarInfo;
import com.autoyol.mongodb.domain.TransInfo;
import com.mongodb.AggregationOutput;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
/**
 * mongodb服务
 * @author zhiping.li
 *
 */
public class MongoDBService {
	protected final Logger logger = LoggerFactory.getLogger(getClass());
	@Autowired
	private MongoTemplate mongoTemplate;
	
	protected void insert(Object objectToSave)throws Exception{
		mongoTemplate.insert(objectToSave);
	}

	/**
	 * 添加数据到mongodb
	 * @param obj
	 */
	public <T> void insert(List<? extends Object> batchToSave,Class<T> entityClass)throws Exception{
		mongoTemplate.insert(batchToSave, entityClass);
	}
	/**
	 * 修改数据
	 * @param query
	 * @param update
	 * @param entityClass
	 * @return
	 */
	public <T> T modify(Query query,Update update,Class<T> entityClass)throws Exception{
		//mongoTemplate.updateMulti(query, update, entityClass);
	    return mongoTemplate.findAndModify(query, update, entityClass);
	}
	
	/**
	 * 删除数据
	 * @param query
	 * @param entityClass
	 * @return
	 */
	protected <T> void remove(Query query,Class<T> entityClass)throws Exception{
		mongoTemplate.remove(query, entityClass);
		//return mongoTemplate.findAndRemove(query, entityClass);
	}
	
	/**
	 * 根据id查找实体
	 * @param id
	 * @param entityClass
	 * @return
	 */
	protected <T> T findById(int id,Class<T> entityClass)throws Exception{
		return mongoTemplate.findById(id, entityClass);
	}
	
	/**
	 * 根据条件查找实体集合
	 * @param query
	 * @param entityClass
	 * @return
	 */
	protected <T> List<T> find(Query query,Class<T> entityClass)throws Exception{
		return mongoTemplate.find(query, entityClass);
	}
	
	/**
	 * 根据条件统计记录
	 * @param query
	 * @param entityClass
	 * @return
	 */
	protected <T> long count(Query query,Class<T> entityClass)throws Exception{
		return mongoTemplate.count(query, entityClass);
	}
	
	
	/**
	 * 清除mongodb记录
	 * @return
	 */
	protected String clear()throws Exception{
		if (mongoTemplate.collectionExists(CarInfo.class)) {
			mongoTemplate.remove(new Query(), CarInfo.class);
		}
		if (mongoTemplate.collectionExists(CarFilterInfo.class)) {
			mongoTemplate.remove(new Query(), CarFilterInfo.class);
		}
		if (mongoTemplate.collectionExists(TransInfo.class)) {
			mongoTemplate.remove(new Query(), TransInfo.class);
		}
		return "OK";
	}
	
	/**
	 * 查询不重复的记录
	 * @param claz
	 * @param key
	 * @param query
	 * @return
	 */
	protected <T> List<?> distinct(Class<T> claz,String key,DBObject query)throws Exception{
		return mongoTemplate.execute(claz, new CollectionCallback<List<?>>() {
			@SuppressWarnings("unchecked")
			@Override
			public List<Integer> doInCollection(DBCollection collection)
					throws MongoException, DataAccessException {
				return 	collection.distinct(key, query);
			}
		});	 
	}
	
	/**
	 * 聚合查询
	 * @param clasz
	 * @param dbObject
	 * @return
	 */
	protected <T> List<DBObject> aggregate(Class<T> clasz,DBObject... dbObject){
		return mongoTemplate.execute(clasz, new CollectionCallback<List<DBObject> >() {
			@Override
			public List<DBObject>  doInCollection(DBCollection collection)
					throws MongoException, DataAccessException {
				System.out.println("参数:"+Arrays.asList(dbObject));
			    AggregationOutput output = collection.aggregate(Arrays.asList(dbObject));
				return (List<DBObject>) output.results();
			}
		});
		 
	}
	
	/**
	 * 根据条件查询该实体是否存在
	 * @param entityClass
	 * @param query
	 * @return
	 * @throws Exception 
	 */
	public <T> boolean isExist(Class<T> entityClass,Query query) throws Exception{
		return mongoTemplate.exists(query, entityClass);
	}
}
MongoDB通过GridFsB操作文件 mongodb
@Resource(name="mongoTemplate")
	private MongoTemplate mongoTemplate;
	@Resource(name = "converter")
	private MongoConverter converter;
	@Override
	public List<GridFSDBFile> findGridFSDBFiles(String collectionName,
			int start, int end) throws Exception {
		//反射处理文件输出报no gridfs错误问题
		Field _fs = GridFSFile.class.getDeclaredField("_fs"); // _fs字段所在的类为GridFSFile
		DB db = mongoTemplate.getDb();
		GridFS fs  = new GridFS(db, collectionName);
		_fs.setAccessible(true); 
		DBCursor cursor = fs
				.getFileList(
						new BasicDBObject("convertStatus",
								ConvertStatus.wait.getValue())).skip(start)
				.limit(end);
		List<GridFSDBFile> list = new ArrayList<GridFSDBFile>();
		while (cursor.hasNext()) {
			Object object = cursor.next();
			if (object instanceof GridFSDBFile) {
				GridFSDBFile gridFSDBFile = (GridFSDBFile) object;
				 _fs.set(gridFSDBFile, fs); 
				list.add(gridFSDBFile);
			}
		}
		return list;
	}

	@Override
	public boolean modifyFile(String collectionName, GridFSFile gridFSFile,
			int convertStatus) {
		gridFSFile.put("convertStatus", convertStatus);
		gridFSFile.save();
		System.out.println(gridFSFile.toString());
		return true;
	}
	private GridFS getGridFs(String bucket) {
		DB db = mongoTemplate.getDb();
		return bucket == null ? new GridFS(db) : new GridFS(db, bucket);
	}

	@Override
	public GridFSFile store(String collectionName, InputStream content,
			String filename, int fileId, int convertStatus, int fileType) {
		
		return store(collectionName, content,filename, fileId, (Object)null, convertStatus, fileType);
	}

	@Override
	public GridFSFile store(String collectionName, InputStream content,
			int fileId, Object metadata, int convertStatus, int fileType) {
	
		return store(collectionName, content,null, fileId, metadata, convertStatus, fileType);
	}

	@Override
	public GridFSFile store(String collectionName, InputStream content,
			int fileId, DBObject metadata, int convertStatus, int fileType) {
		
		return store(collectionName, content, null,fileId, metadata, convertStatus, fileType);
	}

	@Override
	public GridFSFile store(String collectionName, InputStream content,
			String filename, int fileId, Object metadata, int convertStatus,
			int fileType) {
		
		return store(collectionName, content, filename,fileId,null, metadata, convertStatus, fileType);
	}

	@Override
	public GridFSFile store(String collectionName, InputStream content,
			String filename, int fileId, String contentType, int convertStatus,
			int fileType) {
		return store(collectionName, content, filename, fileId, contentType, (Object)null, convertStatus, fileType);
	}

	@Override
	public GridFSFile store(String collectionName, InputStream content,
			String filename, int fileId, String contentType, Object metadata,
			int convertStatus, int fileType) {
		DBObject dbObject = null;
		if (metadata != null) {
			dbObject = new BasicDBObject();
			converter.write(metadata, dbObject);
		}
		return store(collectionName, content, filename,fileId, contentType, dbObject,
				convertStatus,fileType);
	}

	@Override
	public GridFSFile store(String collectionName, InputStream content,
			String filename, int fileId, DBObject metadata, int convertStatus,
			int fileType) {
	
		return store(collectionName, content, filename, fileId, null, metadata, convertStatus, fileType);
	}

	@Override
	public GridFSFile store(String collectionName, InputStream content,
			String filename, int fileId, String contentType, DBObject metadata,
			int convertStatus, int fileType) {
		Assert.notNull(content);
		GridFSInputFile file = getGridFs(collectionName).createFile(content);
		if (filename != null) {
			file.setFilename(filename);
		}
		if (metadata != null) {
			file.put("metadata", metadata);
		}
		if (contentType != null) {
			file.setContentType(contentType);
		}
		file.put("convertStatus", convertStatus);
		file.put("_id", fileId);
		file.put("fileType", fileType);
		file.save();
		return file;
	}
mpp文件导入
@Override
	@Transactional(rollbackFor = Exception.class)
	public void addWBSTask(File file,String importParTaskCode,
			String importParTaskId,
			Integer orgId,OnlineInfo onlineInfo)throws Exception{
	 long startTime = System.currentTimeMillis();
     List<Task> tasks = ParseProjectMpp.getTasks(file);
     iterProjectNode(tasks,importParTaskCode,importParTaskId,orgId,onlineInfo);
     logger.info("导入mpp花费的时间:"+(System.currentTimeMillis()-startTime));
	}
	
	public Integer getWBSOrderByParTask(String taskId, int orgId, int entId)
			throws Exception {
		int maxCode = 1;
		List<Integer> codeList = this.scheduleWBSDao.getWBSChildOrderListTaskId(taskId, orgId);
		if (codeList == null) return maxCode;
		for (Integer code : codeList) {
				int codeNum = code;
				if (maxCode < codeNum) {
					maxCode = codeNum;
				}
		}
		
		return ++maxCode;
	}

	private void iterProjectNode(List<Task> tasks,
			String importParTaskCode,String importParTaskId,
			Integer orgId,OnlineInfo onlineInfo) throws Exception{
		//遍历使用i
		int i = 0;
		//用于排序使用
		int j = 0;
		
		if (StringUtils.isNotEmpty(importParTaskId)) {
			j = getWBSOrderByParTask(importParTaskId, orgId, onlineInfo.getCompanyId());
		}
		//存放上一节点MAP,用于下一节点使用
		Map<String, String> parTaskIdMap = new HashMap<String, String>();
		//存放前置任务编码,用于取出关联id
		Map<String, String> relationMap = new HashMap<String, String>();
		//存放所有任务编码已经taskid
		Map<String, String> taskCodeMap = new HashMap<String, String>();
		//存放前置任务关联id
		Map<String, String>  taskLinkMap = new HashMap<String, String>();
		//存放子节点中最大的编码
		Map<String, Integer> maxTaskCodeMap = new HashMap<String, Integer>();
		//存放前置缺关联id列表
		List<QjTaskLink> taskRelations  = new ArrayList<QjTaskLink>();
		//
		List<QjTaskLink> taskLinks = new ArrayList<QjTaskLink>();

		List<QjTaskAuth> qjTaskAuths = new ArrayList<QjTaskAuth>();

		List<QjScheduleTask> qjScheduleTasks = new ArrayList<QjScheduleTask>();

		//遍历任务
		for (Task oneTask : tasks) {
			
			if (i==0) {
				i++;
				continue;
			}
			//获得任务中的前置任务
			List<Relation> pr = oneTask.getPredecessors();
			String taskId = "";
			//第一次进入存放任务第一条任务id
			if (i==1) {
				//获得地调任务父节点编码最大值
				String maxTaskCode = getWBSCodeByParTask(importParTaskId, orgId, onlineInfo.getCompanyId());
				//生成第一条任务id
			    taskId = addCommon(oneTask, maxTaskCode, importParTaskId, orgId,onlineInfo,0,qjScheduleTasks,qjTaskAuths,j);
			    //存放父节点下子节点最大的编码
				maxTaskCodeMap.put(taskId, Integer.valueOf(maxTaskCode));
			}else{
			    taskId = parTaskIdMap.get("taskId"+(i-1));
				Integer maxTaskCode = maxTaskCodeMap.get(taskId)==null?1:Integer.valueOf(maxTaskCodeMap.get(taskId));
				int taskGrade=0;
				System.out.println(oneTask.getOutlineNumber());
				int n =0;
				if (oneTask.getOutlineNumber().contains(".")) {
					 n = Integer.parseInt(oneTask.getOutlineNumber().substring(oneTask.getOutlineNumber().lastIndexOf(".")+1, oneTask.getOutlineNumber().length()));
					//判断该节点父节点,取得父节点的id
					if (parTaskIdMap.containsKey(oneTask.getOutlineNumber().substring(0, oneTask.getOutlineNumber().lastIndexOf(".")))) {
						taskId = parTaskIdMap.get(oneTask.getOutlineNumber().substring(0, oneTask.getOutlineNumber().lastIndexOf("."))); 
					}
					maxTaskCode = getMaxTaskCode(maxTaskCodeMap, taskId);
				}else {
					n = Integer.parseInt(oneTask.getOutlineNumber());
				}
				//判断是否有子节点,如果没有子节点,表示该节点为任务节点,否则为WBS节点
				if (oneTask.getChildTasks().size()==0) {
					taskGrade =1;
				}
				if (n==1) {
					maxTaskCode = 1;
				}
				//存放父节点下子节点最大的编码
				maxTaskCodeMap.put(taskId, maxTaskCode);
				taskId = addCommon(oneTask,maxTaskCode+"",taskId,orgId,onlineInfo,taskGrade,qjScheduleTasks,qjTaskAuths,j);
			}
			//存放第一条任务id,用于第二条任务使用(可能第一条任务是父节点,那么该id用于子节点的父节点使用)
			parTaskIdMap.put("taskId"+i, taskId);
			//存放编码用于前置任务使用
			taskCodeMap.put(oneTask.getOutlineNumber(), taskId);
			//添加前置任务
			addrelationTask(parTaskIdMap, relationMap, taskRelations, oneTask, pr, taskId);
			i++;
			j++;
		}
		//遍历
		Iterator<String> it = relationMap.keySet().iterator();
		while (it.hasNext()) {
			String key = it.next();
			if (taskCodeMap.containsKey(key)) {
				taskLinkMap.put(relationMap.get(key), taskCodeMap.get(key));
			}
		}
		if (taskRelations!=null && taskRelations.size() > 0) {
			for (QjTaskLink qjTaskLink : taskRelations) {
				if (taskLinkMap.containsKey(qjTaskLink.getTaskId())) {
					qjTaskLink.setLinkTaskId(taskLinkMap.get(qjTaskLink.getTaskId()));
					taskLinks.add(qjTaskLink);
				}
			}
		}
		//批量处理数据
		scheduleWBSDao.batchSaveScheduleTask(qjScheduleTasks,taskLinks,qjTaskAuths);
	}
    /**
     * 记录前置任务信息
     * @param map
     * @param mapRelMap
     * @param list
     * @param oneTask
     * @param pr
     * @param taskId
     */
	private void addrelationTask(Map<String, String> map,
			Map<String, String> mapRelMap, List<QjTaskLink> list, Task oneTask,
			List<Relation> pr, String taskId) {
		//记录前置任务信息
		if (pr!=null && pr.size() > 0) {
			for (Relation relation : pr) {
				QjTaskLink qjTaskLink = new QjTaskLink();
				qjTaskLink.setTaskId(taskId);
				qjTaskLink.setLinkType(relation.getType().toString());
				mapRelMap.put(relation.getTargetTask().getOutlineNumber(), taskId);
				qjTaskLink.setDelayDate(Integer.parseInt(new java.text.DecimalFormat("0").format(relation.getLag().getDuration())));
				list.add(qjTaskLink);
			}
		}
		if (oneTask.getChildTasks()!=null && oneTask.getChildTasks().size()>1) {
			map.put(oneTask.getOutlineNumber(), taskId);
		}
	}
    /**
     * 保存导入数据到数据库
     * @param oneTask
     * @param importParTaskCode
     * @param importParTaskId
     * @param orgId
     * @param online
     * @param taskGrade
     * @param qjScheduleTasks
     * @param authList
     * @param maxTaskOrder
     * @return
     * @throws Exception
     */
    private String addCommon(Task oneTask,String importParTaskCode,String importParTaskId,Integer orgId,
    		OnlineInfo online,int taskGrade,List<QjScheduleTask> qjScheduleTasks,List<QjTaskAuth> authList,int maxTaskOrder) throws Exception{
		QjScheduleTask task = new QjScheduleTask();
		task.setTaskId(UUID.randomUUID().toString());
		task.setTaskCode(importParTaskCode);
		task.setTaskName(oneTask.getName());
		task.setTaskGrade(taskGrade);
		task.setTaskType(0);
		task.setTaskStatus(0);
		task.setInherit(1);
		task.setParTaskId("0");
		
		if (!"0".equals(importParTaskId)) {
			task.setParTaskId(importParTaskId);
		} else {
			task.setParTaskId("");
		}
		task.setPlanStartDate(oneTask.getStart());
		task.setPlanEndDate(oneTask.getFinish());
		task.setTaskOrder(maxTaskOrder + 1);
		task.setOrgId(orgId);
		task.setEntId(online.getCompanyId());
		
	
		qjScheduleTasks.add(task);
		
		if (taskGrade==1) {
			// 添加该wbs节点角色权限
			QjTaskAuth auth = new QjTaskAuth();
			auth.setOrgId(task.getOrgId());
			auth.setRoleId(online.getRoleId());
			auth.setTaskId(task.getTaskId());
			auth.setAuthCodes("001;002;003;004;005");
			authList.add(auth);
		}
	
		return task.getTaskId();
    }
    /**
     * 取出子节点中TaskCode最大的一个
     * @param map
     * @param taskId
     * @return
     */
    private Integer getMaxTaskCode(Map<String, Integer> map,String taskId){
    	int maxCode = 1;
    	Integer maxTaskCode = map.get(taskId);
    	if (maxTaskCode == null ) return maxCode;
    	int codeNum = maxTaskCode;
    	if (maxCode < codeNum) {
    		maxCode = codeNum;

    	}	

    	return ++maxCode ;
    }
Global site tag (gtag.js) - Google Analytics