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;
}
}
|
@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;
}
|
@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 ;
}
|