Browse Source

修改广告主信息加载到内存的方法,修改场景报表后台权限

jun.zhou 9 years ago
parent
commit
22991ec14a

+ 1 - 2
src/main/java/com/cloudcross/ssp/listener/ApplicationListener.java

@@ -1,8 +1,6 @@
 package com.cloudcross.ssp.listener;
 package com.cloudcross.ssp.listener;
 
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletContextListener;
@@ -39,6 +37,7 @@ public class ApplicationListener implements ServletContextListener{
 		for(Advertiser a:list){
 		for(Advertiser a:list){
 			AdvertiserLoader.ADVERTISER_LIST.add(a);
 			AdvertiserLoader.ADVERTISER_LIST.add(a);
 		}
 		}
+		AdvertiserLoader.setAgentIdAdvertiserIdMap();
 	}
 	}
 
 
 	
 	

+ 73 - 25
src/main/java/com/cloudcross/ssp/loader/AdvertiserLoader.java

@@ -1,7 +1,14 @@
 package com.cloudcross.ssp.loader;
 package com.cloudcross.ssp.loader;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
 
 
 import com.cloudcross.ssp.model.Advertiser;
 import com.cloudcross.ssp.model.Advertiser;
 
 
@@ -12,43 +19,84 @@ import com.cloudcross.ssp.model.Advertiser;
  *
  *
  */
  */
 public class AdvertiserLoader {
 public class AdvertiserLoader {
+	private static final Logger log = Logger.getLogger(AdvertiserLoader.class);
 	
 	
 	public static List<Advertiser> ADVERTISER_LIST = new ArrayList<Advertiser>();//存放所有的广告主信息
 	public static List<Advertiser> ADVERTISER_LIST = new ArrayList<Advertiser>();//存放所有的广告主信息
-	private static List<Advertiser> ADVERTISERID_List = new ArrayList<Advertiser>();//存放代理商相同的广告主信息
+	private static Map<Long,String> AGENTID_ADVERTISERID_MAP = new HashMap<Long,String>();//存放agentId,advertiserId键值对
+
 	/**
 	/**
-	 * 根据代理商ID得到该代理商的所有广告主ID字符串
-	 * @param agentId
-	 * @return {id1,id2,id3,...}
+	 * 获取所有的agentId放入set集合
+	 * @return
 	 */
 	 */
-	public static String getAdvertiserIdByAgentId(Long agentId){
-		if(ADVERTISER_LIST != null && ADVERTISER_LIST.size() > 0){
-			for(Advertiser a:ADVERTISER_LIST){
-				//注意引用类型的比较
-				if(agentId.equals(a.getAgentId())){
-					ADVERTISERID_List.add(a);
-				}
+	private static Set<Long> setAgentIdSet(){
+		Set<Long> agentIdSet = new HashSet<Long>();
+		if(ADVERTISER_LIST != null && ADVERTISER_LIST.size()>0){
+			for(Advertiser adv:ADVERTISER_LIST){
+				agentIdSet.add(adv.getAgentId());
 			}
 			}
+		}else{
+			log.debug("ADVERTISER_LIST为空,广告主信息为空或没有加载到内存,请检查!");
 		}
 		}
-		return AdvertiserLoader.getAdvertiserStr();
+		return agentIdSet;
 	}
 	}
 	
 	
 	/**
 	/**
-	 * 将同个代理商的广告主id拼接成字符串
-	 * @return {id1,id2,id3,...}
+	 * 处理加载内存中的广告主的数据,根据agentId把数据分成不同的组
+	 * key:agentId
+	 * value:List<Advertiser> list里面的数据有共同的agentId
+	 * @return
 	 */
 	 */
-	private static String getAdvertiserStr(){
-		String ids = "";
-		if(ADVERTISERID_List != null && ADVERTISERID_List.size() > 0){
-			Integer count = ADVERTISERID_List.size();
-			for(int i=0;i<count;i++){
-				if(i != count-1){
-					ids += ADVERTISERID_List.get(i).getId() + ",";
-				}else{
-					ids += ADVERTISERID_List.get(i).getId();
+	private static Map<Long,List<Advertiser>> setAgentIdKeyMap(){
+		Map<Long,List<Advertiser>> agentKeyMap = new HashMap<Long, List<Advertiser>>();
+		Set<Long> agentIdSet = setAgentIdSet();
+		Iterator<Long> it = agentIdSet.iterator();
+		while(it.hasNext()){
+			Long agentId = it.next();
+			List<Advertiser> advList = new ArrayList<Advertiser>();
+			for(int i=0;i<ADVERTISER_LIST.size();i++){
+				if(agentId.equals(ADVERTISER_LIST.get(i).getAgentId())){
+					advList.add(ADVERTISER_LIST.remove(i));
+					i--;
 				}
 				}
-				
 			}
 			}
+			agentKeyMap.put(agentId, advList);
+		}
+		return agentKeyMap;
+	}
+	
+	/**
+	 * 将通过agentId分类的数据广告主List集合中的广告主Id拼接成字符串,结果放到AGENTID_ADVERTISERID_MAP中
+	 * key:agenyId
+	 * value:{advertiserId1,advertiserId2,advertiserId3,...}
+	 */
+	public static void setAgentIdAdvertiserIdMap(){
+		Map<Long,List<Advertiser>> map = setAgentIdKeyMap();
+		List<Advertiser> list = null;
+		for(Map.Entry<Long, List<Advertiser>> entry:map.entrySet()){
+			Long l = entry.getKey();
+			list = entry.getValue();
+			Integer count = list.size();
+			String str = "";
+			for(int i=0;i<count-1;i++){
+				str = str+list.get(i).getId()+",";
+			}
+			str = str + list.get(count-1).getId();
+			AGENTID_ADVERTISERID_MAP.put(l, str);
+		}
+	}
+	
+	/**
+	 * 提供外部访问内存数据的方法
+	 * @param agentId
+	 * @return
+	 */
+	public static String getAgentIdAdvertiserIdMap(Long agentId){
+		if(AGENTID_ADVERTISERID_MAP != null && AGENTID_ADVERTISERID_MAP.size()>0){
+			log.debug(AGENTID_ADVERTISERID_MAP.get(agentId));
+			return AGENTID_ADVERTISERID_MAP.get(agentId);
+		}else{
+			log.debug("无法从内存获取数据");
+			return "";
 		}
 		}
-		return ids;
 	}
 	}
 }
 }

+ 24 - 24
src/main/java/com/cloudcross/ssp/model/mapper/report.sql.xml

@@ -1905,13 +1905,13 @@ sum(click) as totalClick, if(sum(a.impression) > 0,sum(a.click)/sum(a.impression
 	<select id="queryPlaceName" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.DeliverAnalysis">
 	<select id="queryPlaceName" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.DeliverAnalysis">
 		select d.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 		select d.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 		100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
 		100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
-		from t_rpt_adv_place a,t_place b,t_place_class c,t_place_class_info d,t_account e where a.place_id = b.id and b.id = c.place_id and c.place_id = d.id and e.advertiser_id = a.advertiser_id
-		<if test="agentId != null">
-			and e.agent_id  = #{agentId}
-		</if>
+		from t_rpt_adv_place a,t_place b,t_place_class c,t_place_class_info d where a.place_id = b.id and b.id = c.place_id and c.place_id = d.id 
 		<if test="advertiserId != null">
 		<if test="advertiserId != null">
 			and a.advertiser_id = #{advertiserId}
 			and a.advertiser_id = #{advertiserId}
 		</if>
 		</if>
+		<if test="ids != null and ids != ''">
+			and a.advertiser_id in (#{ids})
+		</if>
 		<if test="orderId != null">
 		<if test="orderId != null">
 			and a.order_id = #{orderId}
 			and a.order_id = #{orderId}
 		</if>
 		</if>
@@ -1933,13 +1933,13 @@ sum(click) as totalClick, if(sum(a.impression) > 0,sum(a.click)/sum(a.impression
 		select count(1) from (
 		select count(1) from (
 			select d.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 			select d.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 			100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
 			100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
-			from t_rpt_adv_place a,t_place b,t_place_class c,t_place_class_info d,t_account e where a.place_id = b.id and b.id = c.place_id and c.place_id = d.id and e.advertiser_id = a.advertiser_id
-			<if test="agentId != null">
-				and e.agent_id  = #{agentId}
-			</if>
+			from t_rpt_adv_place a,t_place b,t_place_class c,t_place_class_info d where a.place_id = b.id and b.id = c.place_id and c.place_id = d.id 
 			<if test="advertiserId != null">
 			<if test="advertiserId != null">
 				and a.advertiser_id = #{advertiserId}
 				and a.advertiser_id = #{advertiserId}
 			</if>
 			</if>
+			<if test="ids != null and ids != ''">
+				and a.advertiser_id in (#{ids})
+			</if>
 			<if test="orderId != null">
 			<if test="orderId != null">
 				and a.order_id = #{orderId}
 				and a.order_id = #{orderId}
 			</if>
 			</if>
@@ -1960,13 +1960,13 @@ sum(click) as totalClick, if(sum(a.impression) > 0,sum(a.click)/sum(a.impression
 		select count(1) from (
 		select count(1) from (
 			select b.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 			select b.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 			100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
 			100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
-			from t_rpt_adv_place a,t_place_operator b,t_account c  where a.place_id = b.place_id and a.advertiser_id = c.advertiser_id  
-			<if test="agentId != null">
-				and c.agent_id = #{agentId}
-			</if>
+			from t_rpt_adv_place a,t_place_operator b where a.place_id = b.place_id
 			<if test="advertiserId != null">
 			<if test="advertiserId != null">
 				and a.advertiser_id = #{advertiserId}
 				and a.advertiser_id = #{advertiserId}
 			</if>
 			</if>
+			<if test="ids != null and ids != ''">
+				and a.advertiser_id in (#{ids})
+			</if>
 			<if test="orderId != null">
 			<if test="orderId != null">
 				and a.order_id = #{orderId}
 				and a.order_id = #{orderId}
 			</if>
 			</if>
@@ -1986,13 +1986,13 @@ sum(click) as totalClick, if(sum(a.impression) > 0,sum(a.click)/sum(a.impression
 	<select id="queryPlaceNameWithOperator" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.DeliverAnalysis">
 	<select id="queryPlaceNameWithOperator" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.DeliverAnalysis">
 		select b.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 		select b.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 		100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
 		100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
-		from t_rpt_adv_place a,t_place_operator b,t_account c  where a.place_id = b.place_id and a.advertiser_id = c.advertiser_id  
-		<if test="agentId != null">
-			and c.agent_id = #{agentId}
-		</if>
+		from t_rpt_adv_place a,t_place_operator b where a.place_id = b.place_id   
 		<if test="advertiserId != null">
 		<if test="advertiserId != null">
 			and a.advertiser_id = #{advertiserId}
 			and a.advertiser_id = #{advertiserId}
 		</if>
 		</if>
+		<if test="ids != null and ids != ''">
+			and a.advertiser_id in (#{ids})
+		</if>
 		<if test="orderId != null">
 		<if test="orderId != null">
 			and a.order_id = #{orderId}
 			and a.order_id = #{orderId}
 		</if>
 		</if>
@@ -2013,13 +2013,13 @@ sum(click) as totalClick, if(sum(a.impression) > 0,sum(a.click)/sum(a.impression
 	<select id="queryPlaceNameExt" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.DeliverAnalysis">
 	<select id="queryPlaceNameExt" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.DeliverAnalysis">
 		select d.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 		select d.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 		100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
 		100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
-		from t_rpt_adv_place a,t_place b,t_place_class c,t_place_class_info d,t_account e where a.place_id = b.id and b.id = c.place_id and c.place_id = d.id and e.advertiser_id = a.advertiser_id
-		<if test="agentId != null">
-			and e.agent_id  = #{agentId}
-		</if>
+		from t_rpt_adv_place a,t_place b,t_place_class c,t_place_class_info d where a.place_id = b.id and b.id = c.place_id and c.place_id = d.id
 		<if test="advertiserId != null">
 		<if test="advertiserId != null">
 			and a.advertiser_id = #{advertiserId}
 			and a.advertiser_id = #{advertiserId}
 		</if>
 		</if>
+		<if test="ids != null and ids != ''">
+			and a.advertiser_id in (#{ids})
+		</if>
 		<if test="orderId != null">
 		<if test="orderId != null">
 			and a.order_id = #{orderId}
 			and a.order_id = #{orderId}
 		</if>
 		</if>
@@ -2038,13 +2038,13 @@ sum(click) as totalClick, if(sum(a.impression) > 0,sum(a.click)/sum(a.impression
 	<select id="queryPlaceNameWithOperatorExt" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.DeliverAnalysis">
 	<select id="queryPlaceNameWithOperatorExt" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.DeliverAnalysis">
 		select b.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 		select b.name placeName,SUM(a.impression) impression, SUM(a.click) click,100*SUM(a.click)/SUM(a.impression) clickRate,SUM(a.visit) visit,
 		100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
 		100*SUM(a.visit)/SUM(a.click) visitRate,SUM(a.conversion) conversion,100*SUM(a.conversion)/SUM(a.visit) conversionRate,SUM(a.ecpm) as ecpm, SUM(a.consume) consume
-		from t_rpt_adv_place a,t_place_operator b,t_account c  where a.place_id = b.place_id and a.advertiser_id = c.advertiser_id  
-		<if test="agentId != null">
-			and c.agent_id = #{agentId}
-		</if>
+		from t_rpt_adv_place a,t_place_operator b where a.place_id = b.place_id  
 		<if test="advertiserId != null">
 		<if test="advertiserId != null">
 			and a.advertiser_id = #{advertiserId}
 			and a.advertiser_id = #{advertiserId}
 		</if>
 		</if>
+		<if test="ids != null and ids != ''">
+			and a.advertiser_id in (#{ids})
+		</if>
 		<if test="orderId != null">
 		<if test="orderId != null">
 			and a.order_id = #{orderId}
 			and a.order_id = #{orderId}
 		</if>
 		</if>

+ 11 - 9
src/main/java/com/cloudcross/ssp/web/advertiser/main/ad/report/AdvertiserReportController.java

@@ -67,7 +67,7 @@ public class AdvertiserReportController extends SimpleController {
 		//判断前端传过来的登录账户id确定权限
 		//判断前端传过来的登录账户id确定权限
 		Account account = getLoginUser();
 		Account account = getLoginUser();
 		Long agentId = account.getAgentId();
 		Long agentId = account.getAgentId();
-		String ids = AdvertiserLoader.getAdvertiserIdByAgentId(agentId);
+		String ids = AdvertiserLoader.getAgentIdAdvertiserIdMap(agentId);
 		paramMap.put("agentId",agentId);
 		paramMap.put("agentId",agentId);
 		
 		
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@@ -790,7 +790,10 @@ public class AdvertiserReportController extends SimpleController {
 	//下面是场景报表
 	//下面是场景报表
 	@RequestMapping("/sceneReport")
 	@RequestMapping("/sceneReport")
 	public String sceneReport(Model model,@RequestParam HashMap<String, Object> paramMap,@RequestParam(defaultValue="1") int page) {
 	public String sceneReport(Model model,@RequestParam HashMap<String, Object> paramMap,@RequestParam(defaultValue="1") int page) {
-		
+		Account account = getLoginUser();
+		paramMap.put("agentId", account.getAgentId());
+		Long operatorId = account.getOperatorId();
+		String ids = "";
 		//日期
 		//日期
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 		String startDate = null;
 		String startDate = null;
@@ -817,12 +820,16 @@ public class AdvertiserReportController extends SimpleController {
 					|| "".equals(paramMap.get("selectedadvertiserId"))) {
 					|| "".equals(paramMap.get("selectedadvertiserId"))) {
 				advertiserId = null;
 				advertiserId = null;
 				advertiserName = "全部广告主";
 				advertiserName = "全部广告主";
+				ids = AdvertiserLoader.getAgentIdAdvertiserIdMap(account.getAgentId());
+				paramMap.put("ids", ids);//只有代理商登录选择全部广告主时才会执行这个方法,广告主登录advertiserId是固定值
 			} else {
 			} else {
 				// 如果要查询的是所有广告主则让广告主id为空
 				// 如果要查询的是所有广告主则让广告主id为空
 				if (-1 == Long.parseLong((String) paramMap
 				if (-1 == Long.parseLong((String) paramMap
 						.get("selectedadvertiserId"))) {
 						.get("selectedadvertiserId"))) {
 					advertiserId = null;
 					advertiserId = null;
 					advertiserName = "全部广告主";
 					advertiserName = "全部广告主";
+					ids = AdvertiserLoader.getAgentIdAdvertiserIdMap(account.getAgentId());
+					paramMap.put("ids", ids);
 				} else {
 				} else {
 					advertiserId = Long.parseLong((String) paramMap
 					advertiserId = Long.parseLong((String) paramMap
 							.get("selectedadvertiserId"));
 							.get("selectedadvertiserId"));
@@ -909,12 +916,7 @@ public class AdvertiserReportController extends SimpleController {
 		List<DeliverAnalysis> reportList = null;
 		List<DeliverAnalysis> reportList = null;
 		Pager pager = new Pager();
 		Pager pager = new Pager();
 		pager.setPage(page);
 		pager.setPage(page);
-		Account account = getLoginUser();
-		paramMap.put("agentId", account.getAgentId());
-		if(account.getAdvertiserId() != 0){
-			paramMap.put("advertiserId", account.getAdvertiserId());
-		}
-		Long operatorId = getLoginUser().getOperatorId();
+		
 		if(operatorId == 0){//当前账户没有关联媒体,显示大场景
 		if(operatorId == 0){//当前账户没有关联媒体,显示大场景
 			totalRow = adReportService.queryPlaceCount(paramMap);
 			totalRow = adReportService.queryPlaceCount(paramMap);
 			pager.setTotalRow(totalRow);
 			pager.setTotalRow(totalRow);
@@ -967,7 +969,7 @@ public class AdvertiserReportController extends SimpleController {
 			@RequestParam(defaultValue="1") int page){
 			@RequestParam(defaultValue="1") int page){
 		
 		
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-		String ids = AdvertiserLoader.getAdvertiserIdByAgentId(getLoginUser().getAgentId());
+		String ids = AdvertiserLoader.getAgentIdAdvertiserIdMap(getLoginUser().getAgentId());
 		String startDate = null;
 		String startDate = null;
 		String endDate = null;
 		String endDate = null;
 		Long advertiserId = null; 
 		Long advertiserId = null;