Browse Source

新投放

jun.zhou 9 years ago
parent
commit
c58badbbc5
19 changed files with 445 additions and 17 deletions
  1. 2 0
      src/main/java/com/cloudcross/ssp/model/mapper/ad-group.sql.xml
  2. 10 0
      src/main/java/com/cloudcross/ssp/model/mapper/adgroup-wifi.sql.xml
  3. 10 0
      src/main/java/com/cloudcross/ssp/model/mapper/adgroup-zone.sql.xml
  4. 4 0
      src/main/java/com/cloudcross/ssp/model/mapper/place-class.sql.xml
  5. 2 2
      src/main/java/com/cloudcross/ssp/model/mapper/zone.sql.xml
  6. 1 0
      src/main/java/com/cloudcross/ssp/service/IAdGroupPlaceService.java
  7. 2 0
      src/main/java/com/cloudcross/ssp/service/IAdGroupService.java
  8. 10 0
      src/main/java/com/cloudcross/ssp/service/IAdgroupWifiService.java
  9. 1 0
      src/main/java/com/cloudcross/ssp/service/IAdgroupZoneService.java
  10. 3 0
      src/main/java/com/cloudcross/ssp/service/IPlaceClassService.java
  11. 70 1
      src/main/java/com/cloudcross/ssp/service/impl/AdGroupService.java
  12. 25 0
      src/main/java/com/cloudcross/ssp/service/impl/AdgroupWifiService.java
  13. 9 0
      src/main/java/com/cloudcross/ssp/service/impl/AdgroupZoneService.java
  14. 5 0
      src/main/java/com/cloudcross/ssp/service/impl/PlaceClassService.java
  15. 270 9
      src/main/java/com/cloudcross/ssp/web/advertiser/main/ad/target/AdGroupAlloperatorController.java
  16. 1 0
      src/main/webapp/WEB-INF/pages/advertiser/main/ad/target/ad-group-alloperator/create.ftl
  17. 1 1
      src/main/webapp/WEB-INF/pages/advertiser/main/ad/target/ad-group-alloperator/operatorPlaceWindow.ftl
  18. 1 1
      src/main/webapp/assets/js/advertiser/operatoradAllGroup.js
  19. 18 3
      src/main/webapp/assets/js/advertiser/operatoradAllGroup_dialog.js

+ 2 - 0
src/main/java/com/cloudcross/ssp/model/mapper/ad-group.sql.xml

@@ -266,6 +266,7 @@
 			<if test="site !=null">site,</if>
 			<if test="position !=null">position,</if>
 			<if test="os !=null">os,</if>
+			<if test="priority !=null">priority,</if>
 			status,updated)
 		values
 			(#{adGroupName},#{campaignId},#{orderId},#{agentId},#{advertiserId},#{startDate},#{endDate},#{totalBudget},#{mode},
@@ -287,6 +288,7 @@
 			<if test="site !=null">#{site},</if>
 			<if test="position !=null">#{position},</if>
 			<if test="os !=null">#{os},</if>
+			<if test="priority !=null">#{priority},</if>
 			#{status},NOW())
 	</insert>
 	

+ 10 - 0
src/main/java/com/cloudcross/ssp/model/mapper/adgroup-wifi.sql.xml

@@ -6,4 +6,14 @@
 		insert into t_adgroup_wifi (adgroup_id,wifi_id,status,supdated)
 		values (#{adGroupId},#{wifiId},#{status},#{supdated})
 	</insert>
+	
+	<!-- 批量插入 -->
+	<insert id="addAdGroupWifiBatch" parameterType="java.util.Map">
+		insert into t_adgroup_wifi 
+		(adgroup_id,wifi_id,status,supdated)
+		values
+		<foreach collection="wifiIdList" item="wifiId" index="index" separator=",">
+			(#{adgroupWifi.adgroupId},#{wifiId},#{adgroupWifi.status},#{adgroupWifi.supdated})
+		</foreach>
+	</insert>
 </mapper>

+ 10 - 0
src/main/java/com/cloudcross/ssp/model/mapper/adgroup-zone.sql.xml

@@ -18,4 +18,14 @@
 	<update id="updateAdgroupZoneByAdgroupId" parameterType="java.util.Map">
 		update t_adgroup_zone set status = -1 and supdated = #{supdated} where adgroup_id = #{adgroupId} 
 	</update>
+	
+	<!-- 批量插入 -->
+	<insert id="addAdGroupZoneBatch" parameterType="java.util.Map">
+		insert into t_adgroup_zone
+		(adgroup_id,zone_id,status,supdated)
+		values
+		<foreach collection="zoneIdList" item="zoneId" index="index" separator=",">
+			(#{adgroupZone.adgroupId},#{zoneId},#{adgroupZone.status},#{adgroupZone.supdated})
+		</foreach>
+	</insert>
 </mapper>

+ 4 - 0
src/main/java/com/cloudcross/ssp/model/mapper/place-class.sql.xml

@@ -19,4 +19,8 @@
 	<select id="findAll" resultType="PlaceClass">
 		select class_id as classId, place_id as placeId from t_place_class
 	</select>
+	
+	<select id="queryPlaceIdByCondition" parameterType="java.util.Map" resultType="java.lang.Long">
+		select place_id as placeId from t_place_class where class_id in (#{placeId})
+	</select>
 </mapper>

+ 2 - 2
src/main/java/com/cloudcross/ssp/model/mapper/zone.sql.xml

@@ -237,10 +237,10 @@
      
      <select id="queryZone" parameterType="java.util.Map" resultType="com.cloudcross.ssp.model.Zone">
      	select tz.id id,tz.name name from t_zone tz where tz.status != -1 
-     	<if test="operatorId != null">
+     	<if test="operatorId != null and operatorId != ''">
      	 	and tz.operator_id in (#{operatorId})
      	</if>
-     	<if test="position != null">
+     	<if test="position != null and position != ''">
      		 and tz.position in (#{position})
      	</if> 
      </select>

+ 1 - 0
src/main/java/com/cloudcross/ssp/service/IAdGroupPlaceService.java

@@ -17,4 +17,5 @@ public interface IAdGroupPlaceService extends IGenericService<AdGroupPlace>{
 	public List<Long> queryPlaceByAdgroupId(Long adgroupId);
 	
 	public boolean updateAdgroupPlaceByAdgroupId(Long adgroupId);
+	
 }

+ 2 - 0
src/main/java/com/cloudcross/ssp/service/IAdGroupService.java

@@ -61,4 +61,6 @@ public interface IAdGroupService extends IGenericService<AdGroup> {
 	
 	public void front2dbplaceorgroup(AdGroup adGroup,String place);
 	public void updatePleaceOrGroup(AdGroup adGroup,String place);
+	
+	public void saveAllOperator(AdGroup adGroup,Map<String,Object>condition);
 }

+ 10 - 0
src/main/java/com/cloudcross/ssp/service/IAdgroupWifiService.java

@@ -0,0 +1,10 @@
+package com.cloudcross.ssp.service;
+
+import java.util.List;
+
+import com.cloudcross.ssp.model.AdgroupWifi;
+
+public interface IAdgroupWifiService {
+
+	public void saveAdgroupWifi(AdgroupWifi adgroupWifi,List<Long>wifiList);
+}

+ 1 - 0
src/main/java/com/cloudcross/ssp/service/IAdgroupZoneService.java

@@ -12,4 +12,5 @@ public interface IAdgroupZoneService{
 	public void saveAdgroupZone(AdgroupZone adgroupZone);
 	public boolean updateZoneIdByAdgroupId(Map<String,Object>map);
 	public List<Long> queryZoneIdByAdgroupId(Long adgroupId);
+	public void saveAdgroupZoneList(AdgroupZone adgroupZone,List<Long>zoneIdList);
 }

+ 3 - 0
src/main/java/com/cloudcross/ssp/service/IPlaceClassService.java

@@ -1,6 +1,7 @@
 package com.cloudcross.ssp.service;
 
 import java.util.List;
+import java.util.Map;
 
 import com.cloudcross.ssp.base.service.IGenericService;
 import com.cloudcross.ssp.model.PlaceClass;
@@ -24,4 +25,6 @@ public interface IPlaceClassService extends IGenericService<PlaceClass> {
 	 * @return
 	 */
 	List<PlaceClass> findAll();
+	
+	public List<Long> queryPlaceIdByCondition(Map<String,Object>condition);
 }

+ 70 - 1
src/main/java/com/cloudcross/ssp/service/impl/AdGroupService.java

@@ -22,6 +22,7 @@ import com.cloudcross.ssp.model.Acls;
 import com.cloudcross.ssp.model.AdGroup;
 import com.cloudcross.ssp.model.AdGroupPlace;
 import com.cloudcross.ssp.model.AdGroupSchedule;
+import com.cloudcross.ssp.model.AdgroupWifi;
 import com.cloudcross.ssp.model.AdgroupWifigroup;
 import com.cloudcross.ssp.model.AdgroupZone;
 import com.cloudcross.ssp.model.Direct;
@@ -30,6 +31,7 @@ import com.cloudcross.ssp.model.Log;
 import com.cloudcross.ssp.service.IAdGroupPlaceService;
 import com.cloudcross.ssp.service.IAdGroupScheduleService;
 import com.cloudcross.ssp.service.IAdGroupService;
+import com.cloudcross.ssp.service.IAdgroupWifiService;
 import com.cloudcross.ssp.service.IAdgroupWifigroupService;
 import com.cloudcross.ssp.service.IAdgroupZoneService;
 import com.cloudcross.ssp.service.IBannerService;
@@ -64,7 +66,9 @@ public class AdGroupService implements IAdGroupService, ISelectorProvider {
 	private IAdgroupWifigroupService adgroupWifigroupService;
 	@Autowired
 	private IPlaceClassService placeClassService;
-	
+	@Autowired
+	private IAdgroupWifiService adgroupWifiService;
+
 	private static final Logger LOG = Logger.getLogger(AdGroupService.class);
 
 	@Override
@@ -688,4 +692,69 @@ public void commonSaveDriect(Map<String,Object> targetParamsMap,Map<String,Objec
 			
 			
 		}
+
+		public void saveAllOperator(AdGroup adGroup,Map<String,Object>condition){
+			//保存投放,定向
+			save(adGroup,condition);
+			//保存场景
+			savePlace(adGroup,condition);
+			//保存wifi
+			saveWifi(adGroup,condition);
+			//保存广告位
+			saveZone(adGroup,condition);
+		}
+		
+		public void savePlace(AdGroup adGroup,Map<String,Object>condition){
+			String placeId = String.valueOf(condition.get("placeId"));
+			List<Long> idList = new ArrayList<Long>();
+			Long supdated = new Date().getTime()/1000;
+			AdGroupPlace adgroupPlace = new AdGroupPlace();
+			adgroupPlace.setAdGroupId(adGroup.getId());
+			adgroupPlace.setStatus(0);
+			adgroupPlace.setSupdated(supdated);
+			if(placeId.contains("c")){
+				//数聚场景,要获取小场景
+				placeId = placeId.substring(2);
+				Map<String,Object>map = new HashMap<String,Object>();
+				map.put("placeId", placeId);
+				idList = placeClassService.queryPlaceIdByCondition(map);
+			}else{
+				String[] placeStr = placeId.split(",");
+				for(int i=1;i<placeStr.length;i++){
+					idList.add(Long.parseLong(placeStr[i].trim()));
+				}
+			}
+			adGroupPlaceService.saveAdGroupPlace(adgroupPlace,idList);
+		}
+		
+		public void saveWifi(AdGroup adGroup,Map<String,Object>condition){
+			Long supdated = new Date().getTime()/1000;
+			AdgroupWifi adgroupWifi = new AdgroupWifi();
+			adgroupWifi.setAdgroupId(adGroup.getId());
+			adgroupWifi.setStatus(0);
+			adgroupWifi.setSupdated(supdated);
+			String wifiIds = String.valueOf(condition.get("wifiIds"));
+			List<Long> wifiIdList = new ArrayList<Long>();
+			String[] wifiIdStr = wifiIds.split(",");
+			for(int i=0;i<wifiIdStr.length;i++){
+				wifiIdList.add(Long.parseLong(wifiIdStr[i].trim()));
+			}
+			adgroupWifiService.saveAdgroupWifi(adgroupWifi, wifiIdList);
+		}
+		
+		public void saveZone(AdGroup adGroup,Map<String,Object>condition){
+			Long supdated = new Date().getTime()/1000;
+			AdgroupZone adgroupZone = new AdgroupZone();
+			adgroupZone.setAdgroupId(adGroup.getId());
+			adgroupZone.setStatus(0);
+			adgroupZone.setSupdated(supdated);
+			
+			String zoneId = String.valueOf(condition.get("zoneId"));
+			List<Long> zoneIdList = new ArrayList<Long>();
+			String[] zoneIdStr = zoneId.split(",");
+			for(int i=0;i<zoneIdStr.length;i++){
+				zoneIdList.add(Long.parseLong(zoneIdStr[i].trim()));
+			}
+			adgroupZoneService.saveAdgroupZoneList(adgroupZone, zoneIdList);
+		}
 }

+ 25 - 0
src/main/java/com/cloudcross/ssp/service/impl/AdgroupWifiService.java

@@ -0,0 +1,25 @@
+package com.cloudcross.ssp.service.impl;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.cloudcross.ssp.base.dao.GenericIBatisDao;
+import com.cloudcross.ssp.common.utils.MapBuilder;
+import com.cloudcross.ssp.model.AdgroupWifi;
+import com.cloudcross.ssp.service.IAdgroupWifiService;
+@Service
+public class AdgroupWifiService implements IAdgroupWifiService {
+
+	@Autowired
+	private GenericIBatisDao mbatisDao;
+	
+	public void saveAdgroupWifi(AdgroupWifi adgroupWifi,List<Long>wifiList){
+		mbatisDao.save("adgroupWifiSqlMapper.addAdGroupWifiBatch",MapBuilder.create(HashMap.class)
+				.add("wifiIdList",wifiList)
+				.add("adgroupWifi",adgroupWifi)
+				.map());
+	}
+}

+ 9 - 0
src/main/java/com/cloudcross/ssp/service/impl/AdgroupZoneService.java

@@ -11,6 +11,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.cloudcross.ssp.base.dao.GenericIBatisDao;
+import com.cloudcross.ssp.common.utils.MapBuilder;
+import com.cloudcross.ssp.model.AdgroupWifi;
 import com.cloudcross.ssp.model.AdgroupZone;
 import com.cloudcross.ssp.service.IAdgroupZoneService;
 
@@ -33,5 +35,12 @@ public class AdgroupZoneService implements IAdgroupZoneService {
 	public List<Long> queryZoneIdByAdgroupId(Long adgroupId){
 		return myBatisDao.getList("adgroupZoneSqlMapper.queryZoneIdByAdgroupId", adgroupId);
 	}
+	
+	public void saveAdgroupZoneList(AdgroupZone adgroupZone,List<Long>zoneIdList){
+		myBatisDao.save("adgroupZoneSqlMapper.addAdGroupZoneBatch",MapBuilder.create(HashMap.class)
+				.add("zoneIdList",zoneIdList)
+				.add("adgroupZone",adgroupZone)
+				.map());
+	}
 
 }

+ 5 - 0
src/main/java/com/cloudcross/ssp/service/impl/PlaceClassService.java

@@ -67,4 +67,9 @@ public class PlaceClassService implements IPlaceClassService {
 	public List<PlaceClass> findAll() {
 		return myBatisDao.getList("placeClassSqlMapper.findAll");
 	}
+
+	@Override
+	public List<Long> queryPlaceIdByCondition(Map<String, Object> condition) {
+		return myBatisDao.getList("placeClassSqlMapper.queryPlaceIdByCondition",condition);
+	}
 }

+ 270 - 9
src/main/java/com/cloudcross/ssp/web/advertiser/main/ad/target/AdGroupAlloperatorController.java

@@ -1,7 +1,12 @@
 package com.cloudcross.ssp.web.advertiser.main.ad.target;
 
 import java.io.UnsupportedEncodingException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -9,18 +14,32 @@ import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.ibatis.logging.LogFactory;
+import org.apache.log4j.Logger;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import com.cloudcross.ssp.base.web.SimpleController;
+import com.cloudcross.ssp.common.utils.AdvertiserSortByDate;
+import com.cloudcross.ssp.common.utils.Common;
 import com.cloudcross.ssp.common.utils.Pager;
 import com.cloudcross.ssp.common.utils.Pager1;
 import com.cloudcross.ssp.model.Account;
+import com.cloudcross.ssp.model.AdGroup;
+import com.cloudcross.ssp.model.AdGroupPlace;
+import com.cloudcross.ssp.model.DayParting;
+import com.cloudcross.ssp.model.Direct;
 import com.cloudcross.ssp.model.Location;
+import com.cloudcross.ssp.model.Log;
 import com.cloudcross.ssp.model.Operator;
 import com.cloudcross.ssp.model.Place;
 import com.cloudcross.ssp.model.PlaceClassInformation;
@@ -28,8 +47,12 @@ import com.cloudcross.ssp.model.PlaceOperator;
 import com.cloudcross.ssp.model.Wifi;
 import com.cloudcross.ssp.model.Zone;
 import com.cloudcross.ssp.model.pojo.CampaignPojo;
+import com.cloudcross.ssp.service.IAdGroupPlaceService;
+import com.cloudcross.ssp.service.IAdGroupService;
 import com.cloudcross.ssp.service.ICampaignService;
+import com.cloudcross.ssp.service.IDirectService;
 import com.cloudcross.ssp.service.ILocationService;
+import com.cloudcross.ssp.service.ILogService;
 import com.cloudcross.ssp.service.IOperatorService;
 import com.cloudcross.ssp.service.IPlaceClassInformationService;
 import com.cloudcross.ssp.service.IPlaceOperatorService;
@@ -40,7 +63,7 @@ import com.cloudcross.ssp.service.IZoneService;
 @Controller
 @RequestMapping("/advertiser/main/ad/target/ad-group-alloperator")
 public class AdGroupAlloperatorController extends SimpleController{
-	
+	private static final Logger LOG = Logger.getLogger(AdGroupAlloperatorController.class);
 	@Autowired
 	private ICampaignService campaignService;
 	@Autowired
@@ -57,6 +80,12 @@ public class AdGroupAlloperatorController extends SimpleController{
 	private IWifiService wifiService;
 	@Autowired
 	private IZoneService zoneService;
+	@Autowired
+	private ILogService logService;
+	@Autowired
+	private IAdGroupService adGroupService;
+	@Autowired
+	private IDirectService directService;
 	
 	@RequestMapping("create")
 	public String create(Model model, @RequestParam Long campaignId) {
@@ -87,7 +116,7 @@ public class AdGroupAlloperatorController extends SimpleController{
 	 */
 	@RequestMapping("chooseZone")
 	@ResponseBody
-	public List<Zone> queryZoneByCondition(Model model,String operatorId,String position){
+	public List<Zone> queryZoneByCondition(String operatorId,String position){
 		Map<String,Object> condition = new HashMap<String,Object>();
 		//处理operatorID
 		if(operatorId != null && !"".equals(operatorId)){
@@ -201,21 +230,20 @@ public class AdGroupAlloperatorController extends SimpleController{
 		Map<String,Object> condition = new HashMap<String,Object>();
 		if( null != cnCity && !"".equals(cnCity)){
 			condition.put("cnCity", cnCity);
+		}else{
+			cnCity = "市";
 		}
 		if( null != cn && !"".equals(cn)){
 			condition.put("cn", cn);
+		}else{
+			cn = "省";
 		}
 		
 		Integer count = this.wifiService.queryWifiCount(condition);
 		Pager pager = new Pager();
 		pager.setPage(page);
 		pager.setTotalRow(count);
-		if(cn == null || "".equals(cn)){
-			cn = "省";
-		}
-		if(cnCity == null || "".equals(cnCity)){
-			cnCity = "市";
-		}
+		
 		condition.put("pager", pager);
 		List<Wifi> list = this.wifiService.queryWifi(condition);
 		model.addAttribute("pager", pager);
@@ -265,6 +293,7 @@ public class AdGroupAlloperatorController extends SimpleController{
 		return map;
 	}
 	
+
 	/**
 	 * 保存方法
 	 * @param request
@@ -272,7 +301,239 @@ public class AdGroupAlloperatorController extends SimpleController{
 	 * @return
 	 */
 	@RequestMapping("/save")
-	public String save(HttpServletRequest request, Model model){
+	public String save(HttpServletRequest request, Model model,@ModelAttribute("form") AdGroup adGroup
+			,@RequestParam String areas,@RequestParam Map<String, Object> paramMap) {
+		adGroup.setStatus(0);
+		
+		/**
+		 * 在这里做时间定向的功能处理
+		 */
+		//将前台转换的排期数据转换成需要存储的数据--选择的时间段,以及未选择时间段按照策略的曝光率
+		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
+		
+		//把投放日期进行转换
+    	String activeTime = (String) paramMap.get("activeTime");
+		String[] tmpDate = activeTime.split("to");
+		String startDateFront = tmpDate[0].trim();
+		String endDateFront = tmpDate[1].trim();			
+		try {
+			adGroup.setStartDate(sdf.parse(startDateFront));
+		} catch (ParseException e2) {
+			// TODO Auto-generated catch block
+			e2.printStackTrace();
+		}
+		try {
+			adGroup.setEndDate(sdf.parse(endDateFront));
+		} catch (ParseException e2) {
+			// TODO Auto-generated catch block
+			e2.printStackTrace();
+		}	
+		
+		//先获得策略的投放周期
+		Date startDate = adGroup.getStartDate();
+		Date endDate = adGroup.getEndDate();
+		//获得前端传递过来的已选择时间段
+		String sdayParting = (String)paramMap.get("sdayParting");
+		//用来存储转换结果的JSONArray
+		JSONArray result = new JSONArray();
+		//用来存储传过来时间段信息集合
+		List<DayParting> dayList = new ArrayList<DayParting>();    
+		//用来存储没选的时间段信息
+		List<DayParting> daySurplus = new ArrayList<DayParting>();
+		//默认24个时间点
+		String allHours = "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23";
+		
+		  try {
+			    //传过来已选择的时间JSONArray
+				JSONArray jsonArray = new JSONArray(sdayParting);
+				//当没选一个时间段时,默认从开始时间段到结束时间段都为默认曝光上限
+				if(jsonArray.length() == 0){                           				
+					JSONObject object = new JSONObject();
+					object.put("startDate", sdf.format(startDate));
+					object.put("endDate", sdf.format(endDate));
+					object.put("dehours",allHours);
+					result.put(object);
+				}
+				
+				for (int i = 0; i < jsonArray.length(); i++) {
+					JSONObject object = jsonArray.getJSONObject(i);
+					DayParting day = new DayParting();
+					
+					//如果传过来的dehours是-1或空或者是空字符串,表示全选
+					if(null == object.get("dehours") || "-1".equals(String.valueOf(object.getString("dehours"))) ||
+							"".equals(String.valueOf(object.getString("dehours")))) {
+						day.setDehours(allHours);
+					} else {
+						day.setDehours(object.getString("dehours"));
+					}
+					
+					try {
+						day.setStartDate(sdf.parse(object.getString("startDate")));
+						day.setEndDate(sdf.parse(object.getString("endDate")));
+					} catch (ParseException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+					dayList.add(day);
+				}
+				
+				//按照开始时间的先后顺序给dayList进行排序,排序后,比较相邻的2个时间段,能够得出未选择的时间段
+				Collections.sort(dayList, new AdvertiserSortByDate());
+				
+				for(int i = 0; i < dayList.size(); i++){
+					DayParting dayP = dayList.get(i);
+					JSONObject object = new JSONObject();
+					object.put("startDate", sdf.format(dayP.getStartDate()));
+					object.put("endDate", sdf.format(dayP.getEndDate()));
+					//将已选择的时间段放入result中
+					object.put("dehours",dayP.getDehours());
+					result.put(object);
+					
+					//当只选择一个时间段时,无法对前后两段时间进行比较,需特殊处理
+					if(dayList.size() == 1){
+						//所选时间段在开始时间之后--在开始时间到所选时间段中间有空缺时间段
+						if(dayP.getStartDate().getTime() > startDate.getTime()){                     
+							DayParting dayS = new DayParting();
+							dayS.setStartDate(startDate);
+							//减一天
+							dayS.setEndDate(new Date(dayP.getStartDate().getTime() - 24*60*60*1000));
+							dayS.setDehours(allHours);
+							daySurplus.add(dayS);
+						}
+						//所选时间段在开始时间之前--在结束时间到所选时间段中间有空缺时间段
+						if(dayP.getEndDate().getTime() < endDate.getTime()){						
+							DayParting dayS = new DayParting();
+							//加一天
+							dayS.setStartDate(new Date(dayP.getEndDate().getTime() + 24*60*60*1000));      
+							dayS.setEndDate(endDate);
+							dayS.setDehours(allHours);
+							daySurplus.add(dayS);
+						}
+						break;
+					}
+					
+					//排序后的第一条记录,与开始时间比较,得出在开始时间到第一条记录之间是否有空缺时间段
+					if(i==0){
+						//第一条记录的开始时间大于策略开始时间
+						if(dayP.getStartDate().getTime() > startDate.getTime()){     
+							DayParting dayS = new DayParting();
+							dayS.setStartDate(startDate);
+							dayS.setEndDate(new Date(dayP.getStartDate().getTime() - 24*60*60*1000));
+							dayS.setDehours(allHours);
+							//添加第一条记录开始时间到策略开始时间的空缺段到daySurplus中
+							daySurplus.add(dayS);																
+							//与后面的一条记录做比较,前一条记录的结束时间小于后一条记录的开始时间,中间有空缺时间段
+							DayParting nextDay = dayList.get(i + 1);								
+							if(dayP.getEndDate().getTime() < nextDay.getStartDate().getTime() - 24*60*60*1000){
+								DayParting dayS2 = new DayParting();
+								dayS2.setStartDate(new Date(dayP.getEndDate().getTime() + 24*60*60*1000));
+								dayS2.setEndDate(new Date(nextDay.getStartDate().getTime() - 24*60*60*1000));
+								dayS2.setDehours(allHours);
+								daySurplus.add(dayS2);
+							}
+						}else{
+							//与后面的一条记录做比较,前一条记录的结束时间小于后一条记录的开始时间,中间有空缺时间段
+							DayParting nextDay = dayList.get(i + 1);							
+							if(dayP.getEndDate().getTime() < nextDay.getStartDate().getTime() - 24*60*60*1000){
+								DayParting dayS = new DayParting();
+								dayS.setStartDate(new Date(dayP.getEndDate().getTime() + 24*60*60*1000));
+								dayS.setEndDate(new Date(nextDay.getStartDate().getTime() - 24*60*60*1000));
+								dayS.setDehours(allHours);
+								daySurplus.add(dayS);
+							}
+						}
+					}else if(i == dayList.size() - 1){		
+						//最后一条记录的结束时间小于策略结束时间,中间有空缺时间段
+						if(dayP.getEndDate().getTime() < endDate.getTime()){
+							DayParting dayS = new DayParting();
+							dayS.setStartDate(new Date(dayP.getEndDate().getTime() + 24*60*60*1000));
+							dayS.setEndDate(endDate);
+							dayS.setDehours(allHours);
+							daySurplus.add(dayS);
+						}
+					} else{
+						DayParting nextDay = dayList.get(i + 1);				//与后面的一条记录做比较,前一条记录的结束时间小于后一条记录的开始时间,中间有空缺时间段
+						if(dayP.getEndDate().getTime() < nextDay.getStartDate().getTime() - 24*60*60*1000){
+							DayParting dayS = new DayParting();
+							dayS.setStartDate(new Date(dayP.getEndDate().getTime() + 24*60*60*1000));
+							dayS.setEndDate(new Date(nextDay.getStartDate().getTime() - 24*60*60*1000));
+							dayS.setDehours(allHours);
+							daySurplus.add(dayS);
+						}
+					}
+				}
+				
+				//将空缺时间段添加到result中
+				for(int i = 0; i < daySurplus.size(); i++){						
+					DayParting dayP = daySurplus.get(i);
+					JSONObject object = new JSONObject();
+					object.put("startDate", sdf.format(dayP.getStartDate()));
+					object.put("endDate", sdf.format(dayP.getEndDate()));
+					object.put("dehours",dayP.getDehours());
+					result.put(object);
+				}
+				
+				//将已处理的时间段存储起来
+				paramMap.put("dayParting", result.toString());					
+			} catch (JSONException e) {
+				// TODO Auto-generated catch block
+				LOG.info("@@@@@@@@排期日期解析错误");
+				e.printStackTrace();
+			}
+		    // 千次转换
+		    if (adGroup.getMaxImpression() != null) {
+		      adGroup.setMaxImpression(adGroup.getMaxImpression() * 1000);
+		    }
+		    if (adGroup.getDailyMaxImpression() != null) {
+		      adGroup.setDailyMaxImpression(adGroup.getDailyMaxImpression() * 1000);
+		    }
+			
+		    
+	    if (adGroup.getId() == null) {	
+	    	try {
+	    		if (getLoginUser().getOperatorId()!=0) {
+					adGroup.setOperatorId(getLoginUser().getOperatorId());
+				}else{
+					adGroup.setOperatorId(new Long(0));
+				}
+			} catch (Exception e) {
+				// TODO: handle exception
+				e.printStackTrace();
+			}
+	    	
+			adGroupService.saveAllOperator(adGroup, paramMap);
+			/**
+			 * 新增投放成功后同时会新增地域定向,时段定向,wifi定向以及下面的场景
+			 * 所以这里的日志新增记录应该把这些都加进去
+			 */
+			/**
+			 * 先做投放的新增记录
+			 */
+			Log log = new Log();
+			//对应模块
+			log.setModule("AdGroup");
+			//对应表名
+			log.setTableName("t_adgroup");
+			//增加对应的投放id
+			log.setRecordId(adGroup.getId());
+			//对应操作类型
+			log.setActionType("新增");
+			//对应的操作
+			String str = "新增一个投放为:"+adGroup.getAdGroupName();
+			/*String place = String.valueOf(paramMap.get("place"));
+			if(place != null && !"".equals(place)){
+				str = str + ";添加了场景为:"+place;
+			}*/
+			log.setAction(str);
+			//下面这几个字段目前后端数据没有得到。所以仅作测试用!
+			log.setActionTime("100");
+			log.setAccountId(new Long(getLoginUser().getId()));
+			log.setUserIp(Common.toIpAddr(request));
+			log.setAccountName(getLoginUser().getAccountName());
+			logService.add(log);
+		} 
+	    
+		model.addAttribute("campaignId", adGroup.getCampaignId());
 		return OK;
 	}
 	

+ 1 - 0
src/main/webapp/WEB-INF/pages/advertiser/main/ad/target/ad-group-alloperator/create.ftl

@@ -221,6 +221,7 @@
 	                <a id="btn-selectOperatorPlace" class="btn2">媒体场景</a>
 				    <a id="btn-selectPlace" class="btn2">小场景</a>
 				    <a id="btn-selectPlaceClass" class="btn2">数聚场景</a>
+				    <input type="hidden" id="selectId" value=""/>
 				    <input type="hidden" name="placeId" id="selectPlaceId" value=""/>
 				    <input type="hidden" name="placeName" id="selectPlaceName" value=""/>
                 </div>

+ 1 - 1
src/main/webapp/WEB-INF/pages/advertiser/main/ad/target/ad-group-alloperator/operatorPlaceWindow.ftl

@@ -10,7 +10,7 @@
 			<#if list ??>
 			<#list list as operatorPlace>
 			<div class="single_div">
-				<input class="single_div_radio" name="operatorPlace" type="checkbox" value="${operatorPlace.id!}" title="${operatorPlace.operatorShowName!}">
+				<input class="single_div_radio" name="operatorPlace" type="checkbox" value="${operatorPlace.id!}" placeIdValue="${operatorPlace.placeId!}" title="${operatorPlace.operatorShowName!}">
 				<span class="single_div_span" title="${operatorPlace.operatorShowName!}">${operatorPlace.operatorShowName!}</span>
 			</div>
 			</#list>

+ 1 - 1
src/main/webapp/assets/js/advertiser/operatoradAllGroup.js

@@ -519,7 +519,7 @@ $(document).ready(function(){
 	
 	/******  媒体场景  *****/
 	$("#btn-selectOperatorPlace").click(function(){
-		if($("#selectPlaceId").val() == "" || $("#selectPlaceId").val().indexOf("a") != -1){
+		if($("#selectId").val() == "" || $("#selectId").val().indexOf("a") != -1){
 			layer.open({
 			    type: 2,
 				title: '选择媒体场景',

+ 18 - 3
src/main/webapp/assets/js/advertiser/operatoradAllGroup_dialog.js

@@ -37,27 +37,42 @@ $(document).ready(function(){
 	$(".selectOperatorPlace_save").click(function(){
 		var checkboxs = $("#selectOperatorPlaceDiv input[type='checkbox']:checked");
 		var placeId = "a";
+		var tempId = "a";
 		var placeName= "";
 		if(checkboxs.length > 0){
 			checkboxs.each(function(){
 				var id = parseInt($(this).val());
-				placeId += ","+id;
+				if(placeId.indexOf($(this).attr("placeIdValue")) == -1){
+					placeId += ","+$(this).attr("placeIdValue");
+				}
 				placeName += $(this).attr("title")+",";
+				tempId += ","+id;
 			});
 			parent.$("#btn-selectPlace").addClass("aChange");
 			parent.$("#btn-selectPlaceClass").addClass("aChange");
 		}else{
-			placeId = "";
+			placeId = "";tempId = "";
 			parent.$("#btn-selectPlace").removeClass("aChange");
 			parent.$("#btn-selectPlaceClass").removeClass("aChange");
 		}
+		parent.$("#selectId").val(tempId);//父层的元素
 		parent.$("#selectPlaceId").val(placeId);//父层的元素
 		parent.$("#selectPlaceName").val(placeName);//父层的元素
 		var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
 		parent.layer.close(index);//再执行关闭
 	});
 	
-	$("#selectOperatorPlaceDiv input[type='checkbox'],#selectPlaceDiv input[type='checkbox'],#selectPlaceClassDiv input[type='checkbox']").each(function(){
+	$("#selectOperatorPlaceDiv input[type='checkbox']").each(function(){
+		var obj = $(this);
+		var ids = parent.$("#selectId").val().split(",");
+		for(var i = 1,l=ids.length;i<l;i++){
+			if(obj.val() == ids[i]){
+				obj.attr('checked',true);
+			}
+		}
+	});
+	
+	$("#selectPlaceDiv input[type='checkbox'],#selectPlaceClassDiv input[type='checkbox']").each(function(){
 		var obj = $(this);
 		var ids = parent.$("#selectPlaceId").val().split(",");
 		for(var i = 1,l=ids.length;i<l;i++){