- 浏览: 228127 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
netwelfare:
文章的格式有点乱啊,看起来很费事啊。推荐看这个系列的json教 ...
java 操作JSON -
yangqingandjay:
ijoi刚好一个月[color=orange][align=c ...
spring 定时器配置 -
Jxdwuao:
不错, 很好用
spring 定时器配置 -
1870702720:
3楼说的可以,之前我一直以为想配置在一个定时器中,可是实现不了 ...
spring 定时器配置 -
taiwei.peng:
你可以配置两个定时器,这是我个人的想法,仅供参考。
spring 定时器配置
public class CapacityGrapCache extends ReloadableSpringBean {
private static final Logger logger = LoggerFactory.getLogger(CapacityGrapCache.class);
//中转流量流向基本数据
@StoreFillin(name = StoreNameConstants.STORE_TRANS_BATCH_CONVEYANCE_FLOW, type = StoreFillin.StoreType.EXTERNAL_QUERY_STORE)
private IExternalDataQueryStore<TransBatchConveyanceFlowEntity> transBatchConveyanceStore;
//运力缺口配置基本信息cache
private CvyBreachCfgCache breachCfgCache;
//运力缺口满载信息cache
private BreachFillCapacityCache breachFillCapacityCache;
//部门缓存
private DepartmentCache departmentCache;
//满载标准
private final double FULLCONVERY=0.8;
//存放快件路由信息集合
private Map<Long, Map<String, List<CvyBreachCfg>>> expressBreachFilterMap = new ConcurrentHashMap<Long, Map<String,List<CvyBreachCfg>>>();
//存放运力满载的集合
private List<CvyBreachCfg> fullBreachList=new ArrayList<CvyBreachCfg>();
private boolean isFirst=true;
@Override
public void reload(){
if(isFirst){
isFirst=false;
return;
}
//清空满载数据
fullBreachList.clear();
//用于快件路由的Map
Map<String,List<CvyBreachCfg>> expressBreachCfgMap=new HashMap<String,List<CvyBreachCfg>>();
//根据基础信息计算满载信息
this.calcBreachMap(expressBreachCfgMap);
//用于快件路由的Map
this.convertExpress(expressBreachCfgMap);
//判断是否满载
this.checkConveryFull(expressBreachCfgMap);
//清除快件路由Map缓存
this.clearExpressMap();
}
/**
* 根据基础信息计算满载信息
* Feb 26, 2015
* @param cvyBreachCfgMap
* @param expressBreachCfgMap
*/
private void calcBreachMap(Map<String,List<CvyBreachCfg>> expressBreachCfgMap){
List<CvyBreachCfg> cvyBreachCfgCfgList=breachCfgCache.getCvyBreachCfgCfgList();
Date curDate=new Date();
Map<String,Double> planBillWeightMap=new HashMap<String,Double>();
for(CvyBreachCfg breachBean:cvyBreachCfgCfgList){
StringBuilder builder=new StringBuilder();
builder.append(DateTimeFormatUtils.formatYyyyMmDd(curDate)).append("-");
builder.append(breachBean.getTransferBatchCode()).append("-");
builder.append(breachBean.getCargoCityCode()).append("-");
builder.append(breachBean.getTakegoodsZoneCode());
String planWeightKey=builder.toString();
//计算模糊应发重量
this.calcPlanDepartWeight(planBillWeightMap, breachBean, planWeightKey);
//设置模糊应发重量
breachBean.setBillWeight(planBillWeightMap.get(planWeightKey));
//设置快件路由需要的Map
this.setExpressMap(expressBreachCfgMap,breachBean);
}
}
/**
* 计算模糊应发重量
* Feb 28, 2015
* @param planBillWeightMap
* @param breachBean
* @param planWeightKey
* @return
*/
private Map<String,Double> calcPlanDepartWeight(Map<String,Double> planBillWeightMap,CvyBreachCfg breachBean,String planWeightKey){
Double actualPlanDepartBillWeightQty=0d;
if(!planBillWeightMap.containsKey(planWeightKey)){
QueryCapaCityConditon condition=findQueryCondition(breachBean);
StoreCriteria criteria = getStoreCriteria(condition);
try{
Collection<String> keys=transBatchConveyanceStore.searchKeys(criteria);
if(!BlankUtil.isBlank(keys)){
Collection<TransBatchConveyanceFlowEntity> entities = transBatchConveyanceStore.get(keys);
for(TransBatchConveyanceFlowEntity transBatchConveyance:entities){
//产品类型
String productType=transBatchConveyance.getProductType();
if(productType.contains(breachBean.getProductType())){
actualPlanDepartBillWeightQty+=transBatchConveyance.getFuzzyPlanDepartBillWeightQty();
}
}
planBillWeightMap.put(planWeightKey, actualPlanDepartBillWeightQty);
}
}catch(Exception ce){
logger.warn("transBatchConveyanceStore search error!");
}
}
return planBillWeightMap;
}
/**
* 设置快件路由Map
* Feb 28, 2015
* @param expressBreachCfgMap
* @param breachKey
* @param breachBean
*/
private void setExpressMap(Map<String,List<CvyBreachCfg>> expressBreachCfgMap,CvyBreachCfg breachBean){
List<String> deptCodeList=null;
//判断区部代码是否为空
if(null!=breachBean.getSrcAreaCode()){
deptCodeList=departmentCache.getDeptListByArea(breachBean.getSrcAreaCode(),null);
}else if(null!=breachBean.getSrcCityCode()){
deptCodeList=departmentCache.getDeptListByCity(breachBean.getSrcCityCode(), null);
}else if(null!=breachBean.getSrcZoneCode()){
deptCodeList=new ArrayList<String>();
deptCodeList.add(breachBean.getSrcZoneCode());
}
this.setCommonMap(breachBean, deptCodeList,expressBreachCfgMap);
}
/**
* 设置Map值
* Mar 19, 2015
* @param breachCfg
* @param deptCodeList
* @param expressBreachCfgMap
*/
private void setCommonMap(CvyBreachCfg breachCfg,List<String> deptCodeList,Map<String,List<CvyBreachCfg>> expressBreachCfgMap){
for(String deptCode:deptCodeList){
CvyBreachCfg cvyBreachCfg=null;
try{
cvyBreachCfg = (CvyBreachCfg)BeanUtilsBean.getInstance().cloneBean(breachCfg);
}catch(Exception ce){
logger.warn("clone CvyBreachCfg bean faild!",ce);
}
cvyBreachCfg.setSrcZoneCode(deptCode);
cvyBreachCfg.setTransferDate(DateTimeFormatUtils.parseYyyyMmDdSplit(this.getCurdateStr()));
StringBuilder builder=new StringBuilder();
builder.append(deptCode).append("-");
builder.append(breachCfg.getCargoCityCode()).append("-");
builder.append(breachCfg.getProductType()).append("-");
builder.append(deptCode+breachCfg.getPickupBatch());
String breachKey=builder.toString();
List<CvyBreachCfg> breachList=null;
if((breachList=expressBreachCfgMap.get(breachKey))==null){
breachList=new ArrayList<CvyBreachCfg>();
expressBreachCfgMap.put(breachKey, breachList);
}
breachList.add(cvyBreachCfg);
}
}
/**
* 设置查询条件
* Feb 10, 2015
* @param breachBean
* @return
*/
private QueryCapaCityConditon findQueryCondition(CvyBreachCfg breachBean){
QueryCapaCityConditon condition=new QueryCapaCityConditon();
Date curDate=new Date();
String versionDate="";
//跨越天数
if(!BlankUtil.isBlank(breachBean.getAcrossDay())){
if(breachBean.getAcrossDay()==0){
versionDate=DateTimeFormatUtils.formatYyyyMmDd(curDate);
}else{
versionDate=findAcorssDate(curDate,breachBean.getAcrossDay());
}
}else{
versionDate=DateTimeFormatUtils.formatYyyyMmDd(curDate);
}
condition.setDate(versionDate);
condition.setBatchCode(breachBean.getTransferBatchCode());
condition.setDestCity(breachBean.getCargoCityCode());
condition.setNextNodeCode(breachBean.getTakegoodsZoneCode());
return condition;
}
/**
* 获取Store查询对象
* Feb 10, 2015
* @param condition
* @return
*/
private StoreCriteria getStoreCriteria(QueryCapaCityConditon condition) {
StoreCriteria criteria = new StoreCriteria();
//日期
criteria.equal("date", condition.getDate());
//班次编码
criteria.equal("batchCode", condition.getBatchCode());
//配置代码
criteria.like("configCode", condition.getDestCity());
//下一环节网点
criteria.like("nextNodeCode", condition.getNextNodeCode());
//有效数据
criteria.equal("deleteFlag", 0);
return criteria;
}
/**
* 判断运力满载(应发重量/审核载量(百分比)大于80%(含)以上,则为运力满载。)
* Feb 26, 2015
* @param breachBean
*/
private void checkConveryFull(Map<String,List<CvyBreachCfg>> expressBreachCfgMap){
Set<String> breachSets=expressBreachCfgMap.keySet();
for(String breachKey:breachSets){
List<CvyBreachCfg> breachList=expressBreachCfgMap.get(breachKey);
for(CvyBreachCfg breachBean:breachList){
if(!BlankUtil.isBlank(breachBean.getBillWeight())){
//模糊应发重量
Double shouldWeight=breachBean.getBillWeight();
//审核载量
Double checkLoad=breachBean.getCheckLoadCapacity();
double ratio=shouldWeight/checkLoad;
//满载
if(ratio>=FULLCONVERY){
fullBreachList.add(breachBean);
}
}
}
}
}
/**
* 设置快件路由需要的信息
* Feb 26, 2015
* @param expressBreachCfgMap
*/
private void convertExpress(Map<String,List<CvyBreachCfg>> expressBreachCfgMap){
Set<String> breachSets=expressBreachCfgMap.keySet();
for(String breachKey:breachSets){
List<CvyBreachCfg> breachList=expressBreachCfgMap.get(breachKey);
Map<String,List<CvyBreachCfg>> transferZoneMap=new HashMap<String,List<CvyBreachCfg>>();
for(CvyBreachCfg breachCfg:breachList){
//流向
String takegoodsZoneCode=breachCfg.getTakegoodsZoneCode();
//机场
String transferZoneCode=breachCfg.getTransferZoneCode();
//流向-机场作为key
String transferZoneKey=takegoodsZoneCode+"-"+transferZoneCode;
List<CvyBreachCfg> transferZoneList=null;
if((transferZoneList=transferZoneMap.get(transferZoneKey))==null){
transferZoneList=new ArrayList<CvyBreachCfg>();
transferZoneMap.put(transferZoneKey, transferZoneList);
}
transferZoneList.add(breachCfg);
}
this.filterExpressMap(transferZoneMap,breachKey);
}
}
/**
* 根据原始Map,封装需要返回的Map
* 1、流向相同,机场相同,按班次升序排列,返回最早的班次(第一个)。
* 2、流向相同,机场不相同,返回多条。
* Feb 13, 2015
* @return
*/
private void filterExpressMap(Map<String,List<CvyBreachCfg>> transferZoneMap,String breachKey){
Set<String> transferZoneSet=transferZoneMap.keySet();
List<CvyBreachCfg> breachCfgList=new ArrayList<CvyBreachCfg>();
for(String transerZone:transferZoneSet){
CvyBreachCfg breachCfg=null;
List<CvyBreachCfg> transerZoneList=transferZoneMap.get(transerZone);
if(transerZoneList.size()>1){
breachCfg=this.getFirsttransBatch(transerZoneList);
}else{
breachCfg=transerZoneList.get(0);
}
breachCfgList.add(breachCfg);
}
Long zeroDateTime=this.convertCureDateExpressMap(0);
if(!expressBreachFilterMap.containsKey(zeroDateTime)){
expressBreachFilterMap.put(zeroDateTime,new HashMap<String,List<CvyBreachCfg>>());
}
expressBreachFilterMap.get(zeroDateTime).put(breachKey, breachCfgList);
}
/**
* 获取班次最早的一条数据
* Feb 13, 2015
* @param transerZoneList
* @return
*/
private CvyBreachCfg getFirsttransBatch(List<CvyBreachCfg> transerZoneList){
List<String> batchCodeList=new ArrayList<String>();
Map<String,CvyBreachCfg> transferBatchMap=new HashMap<String,CvyBreachCfg>();
for(CvyBreachCfg breachCfg:transerZoneList){
//中转班次编码
String transferBatchCode=breachCfg.getTransferBatchCode();
batchCodeList.add(transferBatchCode);
transferBatchMap.put(transferBatchCode, breachCfg);
}
this.sortTransferBatchCode(batchCodeList);
String firstBatchCode=batchCodeList.get(0);
return transferBatchMap.get(firstBatchCode);
}
/**
* 班次编码排序
* Feb 13, 2015
* @param batchCodeList
*/
private void sortTransferBatchCode(List<String> batchCodeList){
Comparator<String> com = new Comparator<String>() {
public int compare(String batchCode1, String batchCode2){
return batchCode1.compareTo(batchCode2);
}
};
Collections.sort(batchCodeList, com);
}
/**
* 获取当前日期
* Feb 9, 2015
* @return
*/
private String getCurdateStr(){
String month="";
String date="";
Calendar cal=Calendar.getInstance();
int y=cal.get(Calendar.YEAR);
int m=cal.get(Calendar.MONTH)+1;
int d=cal.get(Calendar.DATE);
if(m<10){
month="0"+m;
}else{
month=m+"";
}
if(d<10){
date="0"+d;
}else{
date=d+"";
}
String curDateStr=y+"-"+month+"-"+date;
return curDateStr;
}
/**
* 提供给快件路由调用
* Mar 6, 2015
* @param srcZoneCode
* @param cargoCityCode
* @param produceType
* @param pickupBatch
* @return
*/
public List<CvyBreachCfg> findFullConveryInfo(String srcZoneCode,String cargoCityCode,String produceType,String pickupBatch){
StringBuilder builder=new StringBuilder();
builder.append(srcZoneCode).append("-");
builder.append(cargoCityCode).append("-");
builder.append(produceType).append("-");
builder.append(pickupBatch);
String mapKey=builder.toString();
List<CvyBreachCfg> list = null;
for(Map<String, List<CvyBreachCfg>> breachMap:expressBreachFilterMap.values()){
if (breachMap.containsKey(mapKey)) {
list = breachMap.get(mapKey);
break;
}
}
return list;
}
/**
* 如果不是当前日期,就从满载缓存获取数据提供给快件路由
* Mar 13, 2015
* @param srcZoneCode
* @param cargoCityCode
* @param produceType
* @param pickupBatch
* @return
*/
public List<CapacityGrapBean> findCapacityFullInfo(String srcZoneCode,String cargoCityCode,String produceType,String pickupBatch,Date versionDate){
StringBuilder builder=new StringBuilder();
builder.append(srcZoneCode).append("-");
builder.append(cargoCityCode).append("-");
builder.append(produceType).append("-");
builder.append(pickupBatch);
String mapKey=builder.toString();
Map<Long, Map<String, List<CapacityGrapBean>>> capacityFillMap=breachFillCapacityCache.getCapacityFillMap();
List<CapacityGrapBean> list = null;
if(!BlankUtil.isBlank(capacityFillMap)){
Long versionDateTime=breachFillCapacityCache.getZeroTime(versionDate);
Map<String, List<CapacityGrapBean>> breachMap=capacityFillMap.get(versionDateTime);
if(!BlankUtil.isBlank(breachMap)){
logger.info("find expressVersionDate mapKey:"+mapKey);
if (breachMap.containsKey(mapKey)) {
list = breachMap.get(mapKey);
logger.info("find expressVersionDate mapKey List size:"+list.size());
}
}
}
return list;
}
/**
* 获取凌晨时间点
* Mar 12, 2015
*/
private Long convertCureDateExpressMap(int addDays){
Date curDate=new Date();
Date keyTime=DateTimeUtils.addTimes(curDate,addDays,DateTimeUtils.TIME_TYPE_DATE);
String zeroDateStr = DateTimeFormatUtils.formatYyyyMmDdSplit(keyTime);
Date zeroDate = DateTimeFormatUtils.parseYyyyMmDdSplit(zeroDateStr);
long zeroDateTime = zeroDate.getTime();
return zeroDateTime;
}
/**
* 清除1天以前的快件路由缓存
* Mar 12, 2015
*/
private void clearExpressMap(){
//获取1天以前的数据
Long beforeTwozeroDateTime=this.convertCureDateExpressMap(-1);
Set<Long> dateSets=expressBreachFilterMap.keySet();
for(Long zeroTime :dateSets){
if(zeroTime<=beforeTwozeroDateTime){
expressBreachFilterMap.remove(zeroTime);
}
}
}
/**
* 获取跨越天数后的日期
* Mar 16, 2015
* @param curDate
* @param acrossDay
* @return
*/
@SuppressWarnings("unchecked")
private String findAcorssDate(Date curDate,Integer acrossDay){
Calendar calendar = new GregorianCalendar();
calendar.setTime(curDate);
calendar.add(calendar.DATE,acrossDay);//把日期往后增加acrossDay天
curDate=calendar.getTime();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String dateString = formatter.format(curDate);
String versionDate=dateString.replace("-", "");
return versionDate;
}
public void setTransBatchConveyanceStore(
IExternalDataQueryStore<TransBatchConveyanceFlowEntity> transBatchConveyanceStore) {
this.transBatchConveyanceStore = transBatchConveyanceStore;
}
public CvyBreachCfgCache getBreachCfgCache() {
return breachCfgCache;
}
public void setBreachCfgCache(CvyBreachCfgCache breachCfgCache) {
this.breachCfgCache = breachCfgCache;
}
public List<CvyBreachCfg> getFullBreachList() {
return fullBreachList;
}
public void setFullBreachList(List<CvyBreachCfg> fullBreachList) {
this.fullBreachList = fullBreachList;
}
public BreachFillCapacityCache getBreachFillCapacityCache() {
return breachFillCapacityCache;
}
public void setBreachFillCapacityCache(
BreachFillCapacityCache breachFillCapacityCache) {
this.breachFillCapacityCache = breachFillCapacityCache;
}
public DepartmentCache getDepartmentCache() {
return departmentCache;
}
public void setDepartmentCache(DepartmentCache departmentCache) {
this.departmentCache = departmentCache;
}
private static final Logger logger = LoggerFactory.getLogger(CapacityGrapCache.class);
//中转流量流向基本数据
@StoreFillin(name = StoreNameConstants.STORE_TRANS_BATCH_CONVEYANCE_FLOW, type = StoreFillin.StoreType.EXTERNAL_QUERY_STORE)
private IExternalDataQueryStore<TransBatchConveyanceFlowEntity> transBatchConveyanceStore;
//运力缺口配置基本信息cache
private CvyBreachCfgCache breachCfgCache;
//运力缺口满载信息cache
private BreachFillCapacityCache breachFillCapacityCache;
//部门缓存
private DepartmentCache departmentCache;
//满载标准
private final double FULLCONVERY=0.8;
//存放快件路由信息集合
private Map<Long, Map<String, List<CvyBreachCfg>>> expressBreachFilterMap = new ConcurrentHashMap<Long, Map<String,List<CvyBreachCfg>>>();
//存放运力满载的集合
private List<CvyBreachCfg> fullBreachList=new ArrayList<CvyBreachCfg>();
private boolean isFirst=true;
@Override
public void reload(){
if(isFirst){
isFirst=false;
return;
}
//清空满载数据
fullBreachList.clear();
//用于快件路由的Map
Map<String,List<CvyBreachCfg>> expressBreachCfgMap=new HashMap<String,List<CvyBreachCfg>>();
//根据基础信息计算满载信息
this.calcBreachMap(expressBreachCfgMap);
//用于快件路由的Map
this.convertExpress(expressBreachCfgMap);
//判断是否满载
this.checkConveryFull(expressBreachCfgMap);
//清除快件路由Map缓存
this.clearExpressMap();
}
/**
* 根据基础信息计算满载信息
* Feb 26, 2015
* @param cvyBreachCfgMap
* @param expressBreachCfgMap
*/
private void calcBreachMap(Map<String,List<CvyBreachCfg>> expressBreachCfgMap){
List<CvyBreachCfg> cvyBreachCfgCfgList=breachCfgCache.getCvyBreachCfgCfgList();
Date curDate=new Date();
Map<String,Double> planBillWeightMap=new HashMap<String,Double>();
for(CvyBreachCfg breachBean:cvyBreachCfgCfgList){
StringBuilder builder=new StringBuilder();
builder.append(DateTimeFormatUtils.formatYyyyMmDd(curDate)).append("-");
builder.append(breachBean.getTransferBatchCode()).append("-");
builder.append(breachBean.getCargoCityCode()).append("-");
builder.append(breachBean.getTakegoodsZoneCode());
String planWeightKey=builder.toString();
//计算模糊应发重量
this.calcPlanDepartWeight(planBillWeightMap, breachBean, planWeightKey);
//设置模糊应发重量
breachBean.setBillWeight(planBillWeightMap.get(planWeightKey));
//设置快件路由需要的Map
this.setExpressMap(expressBreachCfgMap,breachBean);
}
}
/**
* 计算模糊应发重量
* Feb 28, 2015
* @param planBillWeightMap
* @param breachBean
* @param planWeightKey
* @return
*/
private Map<String,Double> calcPlanDepartWeight(Map<String,Double> planBillWeightMap,CvyBreachCfg breachBean,String planWeightKey){
Double actualPlanDepartBillWeightQty=0d;
if(!planBillWeightMap.containsKey(planWeightKey)){
QueryCapaCityConditon condition=findQueryCondition(breachBean);
StoreCriteria criteria = getStoreCriteria(condition);
try{
Collection<String> keys=transBatchConveyanceStore.searchKeys(criteria);
if(!BlankUtil.isBlank(keys)){
Collection<TransBatchConveyanceFlowEntity> entities = transBatchConveyanceStore.get(keys);
for(TransBatchConveyanceFlowEntity transBatchConveyance:entities){
//产品类型
String productType=transBatchConveyance.getProductType();
if(productType.contains(breachBean.getProductType())){
actualPlanDepartBillWeightQty+=transBatchConveyance.getFuzzyPlanDepartBillWeightQty();
}
}
planBillWeightMap.put(planWeightKey, actualPlanDepartBillWeightQty);
}
}catch(Exception ce){
logger.warn("transBatchConveyanceStore search error!");
}
}
return planBillWeightMap;
}
/**
* 设置快件路由Map
* Feb 28, 2015
* @param expressBreachCfgMap
* @param breachKey
* @param breachBean
*/
private void setExpressMap(Map<String,List<CvyBreachCfg>> expressBreachCfgMap,CvyBreachCfg breachBean){
List<String> deptCodeList=null;
//判断区部代码是否为空
if(null!=breachBean.getSrcAreaCode()){
deptCodeList=departmentCache.getDeptListByArea(breachBean.getSrcAreaCode(),null);
}else if(null!=breachBean.getSrcCityCode()){
deptCodeList=departmentCache.getDeptListByCity(breachBean.getSrcCityCode(), null);
}else if(null!=breachBean.getSrcZoneCode()){
deptCodeList=new ArrayList<String>();
deptCodeList.add(breachBean.getSrcZoneCode());
}
this.setCommonMap(breachBean, deptCodeList,expressBreachCfgMap);
}
/**
* 设置Map值
* Mar 19, 2015
* @param breachCfg
* @param deptCodeList
* @param expressBreachCfgMap
*/
private void setCommonMap(CvyBreachCfg breachCfg,List<String> deptCodeList,Map<String,List<CvyBreachCfg>> expressBreachCfgMap){
for(String deptCode:deptCodeList){
CvyBreachCfg cvyBreachCfg=null;
try{
cvyBreachCfg = (CvyBreachCfg)BeanUtilsBean.getInstance().cloneBean(breachCfg);
}catch(Exception ce){
logger.warn("clone CvyBreachCfg bean faild!",ce);
}
cvyBreachCfg.setSrcZoneCode(deptCode);
cvyBreachCfg.setTransferDate(DateTimeFormatUtils.parseYyyyMmDdSplit(this.getCurdateStr()));
StringBuilder builder=new StringBuilder();
builder.append(deptCode).append("-");
builder.append(breachCfg.getCargoCityCode()).append("-");
builder.append(breachCfg.getProductType()).append("-");
builder.append(deptCode+breachCfg.getPickupBatch());
String breachKey=builder.toString();
List<CvyBreachCfg> breachList=null;
if((breachList=expressBreachCfgMap.get(breachKey))==null){
breachList=new ArrayList<CvyBreachCfg>();
expressBreachCfgMap.put(breachKey, breachList);
}
breachList.add(cvyBreachCfg);
}
}
/**
* 设置查询条件
* Feb 10, 2015
* @param breachBean
* @return
*/
private QueryCapaCityConditon findQueryCondition(CvyBreachCfg breachBean){
QueryCapaCityConditon condition=new QueryCapaCityConditon();
Date curDate=new Date();
String versionDate="";
//跨越天数
if(!BlankUtil.isBlank(breachBean.getAcrossDay())){
if(breachBean.getAcrossDay()==0){
versionDate=DateTimeFormatUtils.formatYyyyMmDd(curDate);
}else{
versionDate=findAcorssDate(curDate,breachBean.getAcrossDay());
}
}else{
versionDate=DateTimeFormatUtils.formatYyyyMmDd(curDate);
}
condition.setDate(versionDate);
condition.setBatchCode(breachBean.getTransferBatchCode());
condition.setDestCity(breachBean.getCargoCityCode());
condition.setNextNodeCode(breachBean.getTakegoodsZoneCode());
return condition;
}
/**
* 获取Store查询对象
* Feb 10, 2015
* @param condition
* @return
*/
private StoreCriteria getStoreCriteria(QueryCapaCityConditon condition) {
StoreCriteria criteria = new StoreCriteria();
//日期
criteria.equal("date", condition.getDate());
//班次编码
criteria.equal("batchCode", condition.getBatchCode());
//配置代码
criteria.like("configCode", condition.getDestCity());
//下一环节网点
criteria.like("nextNodeCode", condition.getNextNodeCode());
//有效数据
criteria.equal("deleteFlag", 0);
return criteria;
}
/**
* 判断运力满载(应发重量/审核载量(百分比)大于80%(含)以上,则为运力满载。)
* Feb 26, 2015
* @param breachBean
*/
private void checkConveryFull(Map<String,List<CvyBreachCfg>> expressBreachCfgMap){
Set<String> breachSets=expressBreachCfgMap.keySet();
for(String breachKey:breachSets){
List<CvyBreachCfg> breachList=expressBreachCfgMap.get(breachKey);
for(CvyBreachCfg breachBean:breachList){
if(!BlankUtil.isBlank(breachBean.getBillWeight())){
//模糊应发重量
Double shouldWeight=breachBean.getBillWeight();
//审核载量
Double checkLoad=breachBean.getCheckLoadCapacity();
double ratio=shouldWeight/checkLoad;
//满载
if(ratio>=FULLCONVERY){
fullBreachList.add(breachBean);
}
}
}
}
}
/**
* 设置快件路由需要的信息
* Feb 26, 2015
* @param expressBreachCfgMap
*/
private void convertExpress(Map<String,List<CvyBreachCfg>> expressBreachCfgMap){
Set<String> breachSets=expressBreachCfgMap.keySet();
for(String breachKey:breachSets){
List<CvyBreachCfg> breachList=expressBreachCfgMap.get(breachKey);
Map<String,List<CvyBreachCfg>> transferZoneMap=new HashMap<String,List<CvyBreachCfg>>();
for(CvyBreachCfg breachCfg:breachList){
//流向
String takegoodsZoneCode=breachCfg.getTakegoodsZoneCode();
//机场
String transferZoneCode=breachCfg.getTransferZoneCode();
//流向-机场作为key
String transferZoneKey=takegoodsZoneCode+"-"+transferZoneCode;
List<CvyBreachCfg> transferZoneList=null;
if((transferZoneList=transferZoneMap.get(transferZoneKey))==null){
transferZoneList=new ArrayList<CvyBreachCfg>();
transferZoneMap.put(transferZoneKey, transferZoneList);
}
transferZoneList.add(breachCfg);
}
this.filterExpressMap(transferZoneMap,breachKey);
}
}
/**
* 根据原始Map,封装需要返回的Map
* 1、流向相同,机场相同,按班次升序排列,返回最早的班次(第一个)。
* 2、流向相同,机场不相同,返回多条。
* Feb 13, 2015
* @return
*/
private void filterExpressMap(Map<String,List<CvyBreachCfg>> transferZoneMap,String breachKey){
Set<String> transferZoneSet=transferZoneMap.keySet();
List<CvyBreachCfg> breachCfgList=new ArrayList<CvyBreachCfg>();
for(String transerZone:transferZoneSet){
CvyBreachCfg breachCfg=null;
List<CvyBreachCfg> transerZoneList=transferZoneMap.get(transerZone);
if(transerZoneList.size()>1){
breachCfg=this.getFirsttransBatch(transerZoneList);
}else{
breachCfg=transerZoneList.get(0);
}
breachCfgList.add(breachCfg);
}
Long zeroDateTime=this.convertCureDateExpressMap(0);
if(!expressBreachFilterMap.containsKey(zeroDateTime)){
expressBreachFilterMap.put(zeroDateTime,new HashMap<String,List<CvyBreachCfg>>());
}
expressBreachFilterMap.get(zeroDateTime).put(breachKey, breachCfgList);
}
/**
* 获取班次最早的一条数据
* Feb 13, 2015
* @param transerZoneList
* @return
*/
private CvyBreachCfg getFirsttransBatch(List<CvyBreachCfg> transerZoneList){
List<String> batchCodeList=new ArrayList<String>();
Map<String,CvyBreachCfg> transferBatchMap=new HashMap<String,CvyBreachCfg>();
for(CvyBreachCfg breachCfg:transerZoneList){
//中转班次编码
String transferBatchCode=breachCfg.getTransferBatchCode();
batchCodeList.add(transferBatchCode);
transferBatchMap.put(transferBatchCode, breachCfg);
}
this.sortTransferBatchCode(batchCodeList);
String firstBatchCode=batchCodeList.get(0);
return transferBatchMap.get(firstBatchCode);
}
/**
* 班次编码排序
* Feb 13, 2015
* @param batchCodeList
*/
private void sortTransferBatchCode(List<String> batchCodeList){
Comparator<String> com = new Comparator<String>() {
public int compare(String batchCode1, String batchCode2){
return batchCode1.compareTo(batchCode2);
}
};
Collections.sort(batchCodeList, com);
}
/**
* 获取当前日期
* Feb 9, 2015
* @return
*/
private String getCurdateStr(){
String month="";
String date="";
Calendar cal=Calendar.getInstance();
int y=cal.get(Calendar.YEAR);
int m=cal.get(Calendar.MONTH)+1;
int d=cal.get(Calendar.DATE);
if(m<10){
month="0"+m;
}else{
month=m+"";
}
if(d<10){
date="0"+d;
}else{
date=d+"";
}
String curDateStr=y+"-"+month+"-"+date;
return curDateStr;
}
/**
* 提供给快件路由调用
* Mar 6, 2015
* @param srcZoneCode
* @param cargoCityCode
* @param produceType
* @param pickupBatch
* @return
*/
public List<CvyBreachCfg> findFullConveryInfo(String srcZoneCode,String cargoCityCode,String produceType,String pickupBatch){
StringBuilder builder=new StringBuilder();
builder.append(srcZoneCode).append("-");
builder.append(cargoCityCode).append("-");
builder.append(produceType).append("-");
builder.append(pickupBatch);
String mapKey=builder.toString();
List<CvyBreachCfg> list = null;
for(Map<String, List<CvyBreachCfg>> breachMap:expressBreachFilterMap.values()){
if (breachMap.containsKey(mapKey)) {
list = breachMap.get(mapKey);
break;
}
}
return list;
}
/**
* 如果不是当前日期,就从满载缓存获取数据提供给快件路由
* Mar 13, 2015
* @param srcZoneCode
* @param cargoCityCode
* @param produceType
* @param pickupBatch
* @return
*/
public List<CapacityGrapBean> findCapacityFullInfo(String srcZoneCode,String cargoCityCode,String produceType,String pickupBatch,Date versionDate){
StringBuilder builder=new StringBuilder();
builder.append(srcZoneCode).append("-");
builder.append(cargoCityCode).append("-");
builder.append(produceType).append("-");
builder.append(pickupBatch);
String mapKey=builder.toString();
Map<Long, Map<String, List<CapacityGrapBean>>> capacityFillMap=breachFillCapacityCache.getCapacityFillMap();
List<CapacityGrapBean> list = null;
if(!BlankUtil.isBlank(capacityFillMap)){
Long versionDateTime=breachFillCapacityCache.getZeroTime(versionDate);
Map<String, List<CapacityGrapBean>> breachMap=capacityFillMap.get(versionDateTime);
if(!BlankUtil.isBlank(breachMap)){
logger.info("find expressVersionDate mapKey:"+mapKey);
if (breachMap.containsKey(mapKey)) {
list = breachMap.get(mapKey);
logger.info("find expressVersionDate mapKey List size:"+list.size());
}
}
}
return list;
}
/**
* 获取凌晨时间点
* Mar 12, 2015
*/
private Long convertCureDateExpressMap(int addDays){
Date curDate=new Date();
Date keyTime=DateTimeUtils.addTimes(curDate,addDays,DateTimeUtils.TIME_TYPE_DATE);
String zeroDateStr = DateTimeFormatUtils.formatYyyyMmDdSplit(keyTime);
Date zeroDate = DateTimeFormatUtils.parseYyyyMmDdSplit(zeroDateStr);
long zeroDateTime = zeroDate.getTime();
return zeroDateTime;
}
/**
* 清除1天以前的快件路由缓存
* Mar 12, 2015
*/
private void clearExpressMap(){
//获取1天以前的数据
Long beforeTwozeroDateTime=this.convertCureDateExpressMap(-1);
Set<Long> dateSets=expressBreachFilterMap.keySet();
for(Long zeroTime :dateSets){
if(zeroTime<=beforeTwozeroDateTime){
expressBreachFilterMap.remove(zeroTime);
}
}
}
/**
* 获取跨越天数后的日期
* Mar 16, 2015
* @param curDate
* @param acrossDay
* @return
*/
@SuppressWarnings("unchecked")
private String findAcorssDate(Date curDate,Integer acrossDay){
Calendar calendar = new GregorianCalendar();
calendar.setTime(curDate);
calendar.add(calendar.DATE,acrossDay);//把日期往后增加acrossDay天
curDate=calendar.getTime();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String dateString = formatter.format(curDate);
String versionDate=dateString.replace("-", "");
return versionDate;
}
public void setTransBatchConveyanceStore(
IExternalDataQueryStore<TransBatchConveyanceFlowEntity> transBatchConveyanceStore) {
this.transBatchConveyanceStore = transBatchConveyanceStore;
}
public CvyBreachCfgCache getBreachCfgCache() {
return breachCfgCache;
}
public void setBreachCfgCache(CvyBreachCfgCache breachCfgCache) {
this.breachCfgCache = breachCfgCache;
}
public List<CvyBreachCfg> getFullBreachList() {
return fullBreachList;
}
public void setFullBreachList(List<CvyBreachCfg> fullBreachList) {
this.fullBreachList = fullBreachList;
}
public BreachFillCapacityCache getBreachFillCapacityCache() {
return breachFillCapacityCache;
}
public void setBreachFillCapacityCache(
BreachFillCapacityCache breachFillCapacityCache) {
this.breachFillCapacityCache = breachFillCapacityCache;
}
public DepartmentCache getDepartmentCache() {
return departmentCache;
}
public void setDepartmentCache(DepartmentCache departmentCache) {
this.departmentCache = departmentCache;
}
发表评论
-
Elasticsearch 笔记
2019-09-25 15:33 283查询数据结构 GET ibmpdb_hk/_mapping ... -
模块之间调用form 表单提交
2018-11-30 14:11 379package com.soft.util; imp ... -
ELK搭建笔记
2018-11-20 16:41 341一. 安装elasticsearch 1.yum安装 ... -
Mybatis xml 写法
2017-09-28 11:14 541<?xml version="1.0&qu ... -
maven
2017-07-03 14:48 422项目中pom.xml 文件 <repositorie ... -
qq 微信第三方登录
2017-06-20 15:53 0QQ互联 https://connect.qq.com ... -
Active Mq 扫盲
2017-05-17 19:33 3591.下载ActiveMQ 去官方网站下载:http://a ... -
金融知识点
2017-04-15 16:24 0国信证券地址 http://weixin.guosen.c ... -
java 集合初始化
2017-01-04 14:55 393ArrayList1.ArrayList构造一个默认初始容 ... -
log 4j
2017-09-28 10:51 359### set log levels ### log4j ... -
POI 导出Excel
2016-08-15 11:07 435import java.io.OutputStream; ... -
demo
2016-07-29 17:17 0<div class="iteye-blog- ... -
ETL
2016-05-09 11:25 3081.在D 视图下创建 数据源 在工具栏中找到sourc ... -
java 配置linux 启动节点
2016-04-28 17:06 675source ../jar.cfg nohup java ... -
搭建框架
2016-02-29 15:41 0package com.soft.util; import ... -
hibernate 分页方法
2015-04-03 16:09 771@Repository public class BulkCa ... -
java 开发 oracle分页通用方法
2014-11-21 15:03 716package com.richsum.hyoa.dao.im ... -
Spring 配置
2013-06-05 20:34 792<?xml version="1.0" ... -
Hibernate 注解映射联合主键的三种方式
2012-10-31 10:27 1074联合主键用Hibernate注解映射方式主要有三种:第一、将联 ... -
jdbc 操作 批量插入数据
2012-10-21 15:20 887package com.soft.dzkj.dao; ...
相关推荐
如何使用 Stream API 对集合进行过滤、映射和归约操作? 如何使用 Java 8 中的新特性 Optional 类型来处理可能为 null 的集合元素? 如何使用 ConcurrentHashMap 类来实现高效的并发缓存? 如何使用 Spliterator ...
ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 ...Java集合详解8:Java集合类细节精讲 JavaWeb
Apache Commons:一个流行的Java类库,提供了许多实用的工具和组件,如Commons Lang(用于处理核心Java类库中的核心类)、Commons IO(用于处理I/O操作)、Commons Collections(提供了许多额外的集合类)等。...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列...
JAVA面试秘籍一份通向理想...二、Java集合 三、JVM 四、Java并发 五、线程池专题 六、AQS 七、Atomic 原子类 八、MySQL 九、Redis 十、Spring 十一、MyBatis 十二、MQ 十三、计算机网络 十四、操作系统 十五、Dubbo
Hibernate允许在类和集合的粒度上设置第二级缓存。在映射文件中,和元素都有一个子元素,这个子元素用来配置二级缓存。 示例:以category(产品类别)和product(产品)的映射为例: 1) 修改要配置缓存的那个持久化类的...
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益! 本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...
学生提问:Java为什么要对这些数据进行缓存呢? 67 3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 ...
第13章 Java集合类 13.1 Set(集) 13.1.1 Set的一般用法 13.1.2 HashSet类 13.1.3 TreeSet类 13.1.4 向Set中加入持久化类的对象 13.2 List(列表) 13.3 Map(映射) 13.4 小结 13.5 思考题 第14...
其中,讨论了Java为什么不支持多继承、==和equals的区别、方法重载的条件、String为何设计成不可变、包装类的应用场景、Integer的高速缓存机制等多个方面。 通过面试题的逐一解答,读者可以了解到Java语言的一些...
Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大 commons-lang.jar Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 commons-...
Java基础知识:数据类型、关键字、面向对象、集合框架、异常处理等 Java核心技术:I/O、多线程、网络编程、反射、泛型等 Java虚拟机:内存模型、垃圾收集器、类加载机制等 Java企业级开发:Spring、Hibernate、MyBatis等...
Java面试题63:怎么操作linux服务器 Java面试题64:有没有使用过云主机 Java面试题65:数据库优化方面的事情 Java面试题66:如果查询和定位慢查询 Java面试题67:数据库优化之数据库表设计遵循范式 Java面试题68:...
2.2 Java的体系结构对平台无关的支持 2.2.1 Java平台 2.2.2 Java语言 2.3.3 Java class文件 . 2.2.4 可伸缩性 2.3 影响平台无关性的因素 2.3.1 Java平台的部署 2.3.2 Java平台的版本 2.3.3 ...
13.1.2 泛型与jdk 5.0中的集合类 13.2 使用泛型 13.2.1 创建支持泛型的类 13.2.2 泛型的自动解包装与自动包装的功能 13.2.4 限制泛型中类型参数的范围 小结 第14章 ajax技术与web应用性能优化 14.1 了解ajax 14.2 ...
16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling ...
30.哪些集合类是线程安全的? 31.迭代器 Iterator 是什么? 32.Iterator 怎么使用?有什么特点? 33.Iterator 和 ListIterator 有什么区别? 34.怎么确保一个集合不能被修改? 三、多线程 35.并行和并发有什么区别?...