AdGroupService.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. package com.cloudcross.ssp.service.impl;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.apache.commons.lang.ArrayUtils;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Service;
  10. import com.cloudcross.ssp.base.dao.GenericIBatisDao;
  11. import com.cloudcross.ssp.common.consts.AdvertiserDirectType;
  12. import com.cloudcross.ssp.common.consts.DirectType;
  13. import com.cloudcross.ssp.common.utils.AdvertiserScheduleAclsUtis;
  14. import com.cloudcross.ssp.common.utils.Assert;
  15. import com.cloudcross.ssp.common.utils.MapBuilder;
  16. import com.cloudcross.ssp.common.utils.Pager;
  17. import com.cloudcross.ssp.common.utils.SqlHelper;
  18. import com.cloudcross.ssp.model.Acls;
  19. import com.cloudcross.ssp.model.AdGroup;
  20. import com.cloudcross.ssp.model.AdGroupPlace;
  21. import com.cloudcross.ssp.model.AdGroupSchedule;
  22. import com.cloudcross.ssp.model.Direct;
  23. import com.cloudcross.ssp.model.Location;
  24. import com.cloudcross.ssp.service.IAdGroupPlaceService;
  25. import com.cloudcross.ssp.service.IAdGroupScheduleService;
  26. import com.cloudcross.ssp.service.IAdGroupService;
  27. import com.cloudcross.ssp.service.IAdGroupZoneService;
  28. import com.cloudcross.ssp.service.IBannerService;
  29. import com.cloudcross.ssp.service.IDirectService;
  30. import com.cloudcross.ssp.service.ILocationService;
  31. import com.cloudcross.ssp.web.widget.SelectorController.ISelector;
  32. import com.cloudcross.ssp.web.widget.SelectorController.ISelectorProvider;
  33. import org.json.JSONArray;
  34. import org.json.JSONException;
  35. import org.json.JSONObject;
  36. @Service
  37. public class AdGroupService implements IAdGroupService, ISelectorProvider {
  38. @Autowired
  39. private GenericIBatisDao myBatisDao;
  40. @Autowired
  41. private IAdGroupZoneService adGroupZoneService;
  42. @Autowired
  43. private IAdGroupPlaceService adGroupPlaceService;
  44. @Autowired
  45. private ILocationService locationService;
  46. @Autowired
  47. private IAdGroupScheduleService adGroupScheduleService;
  48. @Autowired
  49. private IDirectService directService;
  50. @Autowired
  51. private IBannerService bannerService;
  52. @Override
  53. public AdGroup findById(Long id) {
  54. return myBatisDao.get("adGroupSqlMapper.findById", id);
  55. }
  56. @Override
  57. public int countByParams(Map<String, Object> paramMap) {
  58. return myBatisDao.get("adGroupSqlMapper.countByParams", paramMap);
  59. }
  60. @Override
  61. public List<AdGroup> findByParams(Map<String, Object> paramMap, Pager pager) {
  62. paramMap.put("pager", pager);
  63. return myBatisDao.getList("adGroupSqlMapper.findByParams", paramMap);
  64. }
  65. @Override
  66. public boolean add(AdGroup t) {
  67. myBatisDao.save("adGroupSqlMapper.addAdGroup", t);
  68. return true;
  69. }
  70. @Override
  71. public boolean edit(AdGroup t) {
  72. myBatisDao.save("adGroupSqlMapper.editAdGroup", t);
  73. return true;
  74. }
  75. @Override
  76. public boolean updateStatus(List<Long> idList, int status) {
  77. myBatisDao.save("adGroupSqlMapper.updateAdGroupStatus",MapBuilder.create(HashMap.class)
  78. .add("status", status)
  79. .add("idList", idList)
  80. .add("updated", new Date())
  81. .map());
  82. return true;
  83. }
  84. @Override
  85. public List<AdGroup> findByCampaignId(Long campaignId) {
  86. return myBatisDao.getList("adGroupSqlMapper.findByCampaignId", campaignId);
  87. }
  88. @Override
  89. public boolean save(AdGroup adGroup, Map<String, Object> targetParamsMap) {
  90. //创建策略
  91. add(adGroup);
  92. //处理带定向的问题
  93. MapBuilder mapBuilder = MapBuilder.create(HashMap.class).add("adGroup", adGroup);
  94. //地域定向
  95. commonSaveDriect(targetParamsMap, mapBuilder.add("uiKey", "areas")
  96. .add("uiType",DirectType.locateType)
  97. .map());
  98. //时间定向
  99. commonSaveDriect(targetParamsMap, mapBuilder.add("uiKey","dayParting")
  100. .add("uiType",DirectType.timeType)
  101. .map());
  102. return true;
  103. }
  104. @Override
  105. public boolean edit(AdGroup adGroup, Map<String, Object> targetParamsMap) {
  106. edit(adGroup);
  107. /**
  108. * 时段定向的数据更新
  109. */
  110. //先删除原来的信息
  111. adGroupScheduleService.deleteByAdGroupId(adGroup.getId());
  112. // directService.deleteByadGroupId(adGroup.getId(), DirectType.timeType);
  113. //处理带定向的问题
  114. // MapBuilder mapBuilder = MapBuilder.create(HashMap.class).add("adGroup", adGroup);
  115. //时间定向
  116. //banner 表的compiledLimitation aclPlugins字段 默认值是 "true" null
  117. StringBuilder compiledLimitationStr=new StringBuilder();
  118. StringBuilder aclPluginsStr=new StringBuilder();
  119. //获取策略下的所有创意
  120. // List<Ad> adList = myBatisDao.getList("adSqlMapper.findByParams", MapBuilder.create(HashMap.class)
  121. // .add("adGroupId",adGroup.getId())
  122. // .map());
  123. List<Long> idList = null;
  124. //把创意List的id保存到idList
  125. // if(adList!=null&&adList.size()>0) {
  126. // idList = new ArrayList<Long> ();
  127. // for (Ad tempAd : adList) {
  128. // idList.add(tempAd.getId());
  129. // }
  130. // }
  131. //公共的参数
  132. MapBuilder mapBuilder = MapBuilder.create(HashMap.class).add("adGroup", adGroup)
  133. .add("idList", idList)
  134. .add("compiledLimitationStr", compiledLimitationStr)
  135. .add("aclPluginsStr",aclPluginsStr);
  136. //添加策略通用处理方法
  137. //地域定向
  138. commonEditDirect(targetParamsMap, mapBuilder.add("uiKey", "areas")
  139. .add("uiType",DirectType.locateType)
  140. .add("logical","and")
  141. .add("comparison","=x")
  142. .add("suffix", new String[] { "MAX_checkGeo_City('","', '=x')"})
  143. .map());
  144. commonEditDirect(targetParamsMap, mapBuilder.add("uiKey", "dayParting")
  145. .add("uiType",DirectType.timeType)
  146. .add("logical","and")
  147. .add("comparison","=~")
  148. .add("suffix", new String[] { "MAX_checkTime_Day('","', '=~')"})
  149. .map());
  150. //修改创意的字段
  151. //修改创意的compiledLimitation aclPluginsStr的字段
  152. if(idList!=null){
  153. if(compiledLimitationStr.length()<=0){
  154. myBatisDao.save("adSqlMapper.editBatch", MapBuilder.create(HashMap.class)
  155. .add("compiledLimitation","true")
  156. .add("aclPlugins",null)
  157. .add("idList",idList)
  158. .map());
  159. }else {
  160. myBatisDao.save("adSqlMapper.editBatch", MapBuilder.create(HashMap.class)
  161. .add("compiledLimitation", compiledLimitationStr.toString())
  162. .add("aclPlugins",aclPluginsStr.toString())
  163. .add("idList",idList)
  164. .map());
  165. }
  166. }else {
  167. }
  168. return true;
  169. }
  170. @Override
  171. public void front2dbplace(String str, AdGroup adGroup) {
  172. AdGroupPlace adGroupPlace = new AdGroupPlace();
  173. if(null != str) {
  174. String[] strArr = str.split(",");
  175. for(int i = 0; i < strArr.length; i++) {
  176. adGroupPlace.setPlaceId(Long.valueOf(strArr[i]).longValue());
  177. adGroupPlace.setAdGroupId(adGroup.getId());
  178. adGroupPlaceService.add(adGroupPlace);
  179. }
  180. }
  181. }
  182. @Override
  183. public boolean updatedAdgroupSupdated(Long adGroupId) {
  184. myBatisDao.save("adGroupSqlMapper.updatedSupdated", adGroupId);
  185. return true;
  186. }
  187. @Override
  188. public List<AdGroup> findByParams(Map<String, Object> paramMap) {
  189. return myBatisDao.getList("adGroupSqlMapper.findByParams1", paramMap);
  190. }
  191. @Override
  192. public List<Long> findAllAdGroudByAdvertiserId(Long advertiserId) {
  193. return myBatisDao.getList("adGroupSqlMapper.findAllAdGroudByAdvertiserId", advertiserId);
  194. }
  195. @Override
  196. public boolean updateSupdatedByAdvertiserId(List<Long> advertiserIdList,
  197. Date date) {
  198. myBatisDao.save("adGroupSqlMapper.updateSupdatedByAdvertiserID",
  199. MapBuilder.create(HashMap.class)
  200. .add("advertiserIdList", advertiserIdList)
  201. .add("modifyDate", date).map());
  202. return true;
  203. }
  204. @Override
  205. public boolean updateSupdatedByOrderId(List<Long> orderIdList, Date date) {
  206. myBatisDao.save("adGroupSqlMapper.updateSupdatedByOrderId",
  207. MapBuilder.create(HashMap.class)
  208. .add("orderIdList", orderIdList)
  209. .add("modifyDate",date).map());
  210. return true;
  211. }
  212. @Override
  213. public boolean updateSupdatedByCampaignId(List<Long> campaignIdList,
  214. Date date) {
  215. myBatisDao.save("adGroupSqlMapper.updateSupdatedByCampaignId",
  216. MapBuilder.create(HashMap.class)
  217. .add("campaignIdList", campaignIdList)
  218. .add("modifyDate",date).map());
  219. return true;
  220. }
  221. @Override
  222. public boolean updateStatusByAdvertiserId(List<Long> advertiserIdList,
  223. int status) {
  224. myBatisDao.save("adGroupSqlMapper.updateStatusByAdvertiserId",
  225. MapBuilder.create(HashMap.class)
  226. .add("advertiserIdList", advertiserIdList)
  227. .add("modifyDate", new Date())
  228. .add("status", status).map());
  229. return true;
  230. }
  231. @Override
  232. public boolean updateStatusByOrderId(List<Long> orderIdList, int status) {
  233. myBatisDao.save("adGroupSqlMapper.updateStatusByOrderId",
  234. MapBuilder.create(HashMap.class)
  235. .add("orderIdList", orderIdList)
  236. .add("modifyDate", new Date())
  237. .add("status", status).map());
  238. return true;
  239. }
  240. @Override
  241. public boolean updateStatusByCampaignId(List<Long> campaignIdList,
  242. int status) {
  243. myBatisDao.save("adGroupSqlMapper.updateStatusByCampaignId",
  244. MapBuilder.create(HashMap.class)
  245. .add("campaignIdList", campaignIdList)
  246. .add("modifyDate", new Date())
  247. .add("status", status).map());
  248. return true;
  249. }
  250. @Override
  251. public boolean updateStatusAll(List<Long> adGroupIdList, int status) {
  252. Boolean adGroupFlag = updateStatus(adGroupIdList, status);
  253. Boolean bannerFlag = this.bannerService.updateStatusByAdGroupId(adGroupIdList,status);
  254. return adGroupFlag&&bannerFlag;
  255. }
  256. @Override
  257. public Map findAreasBack(Long adGroupId) {
  258. return myBatisDao.get("adGroupSqlMapper.findAreasBack", adGroupId);
  259. }
  260. @Override
  261. public Map<String, List<? extends ISelector>> provideData(String[] parentId) {
  262. Assert.isTrue(ArrayUtils.isNotEmpty(parentId));
  263. String campaignId = parentId[0];
  264. List<AdGroup> adGroupList = findByCampaignId(Long.parseLong(campaignId));
  265. return MapBuilder.create(HashMap.class).add(campaignId, adGroupList)
  266. .map();
  267. }
  268. public void commonSaveDriect(Map<String,Object> targetParamsMap,Map<String,Object> map){
  269. String uiKey = (String)map.get("uiKey");
  270. Integer uiType = (Integer) map.get("uiType");
  271. AdGroup adGroup= (AdGroup)map.get("adGroup");
  272. Long adGroupId = adGroup.getId();
  273. if (targetParamsMap != null && targetParamsMap.containsKey(uiKey)
  274. && !targetParamsMap.get(uiKey).equals("")) {
  275. // 添加地域 rv_traget_show
  276. Direct direct = new Direct();
  277. direct.setAdGroupId(adGroup.getId());
  278. direct.setBackShow((String) targetParamsMap.get(uiKey));
  279. // 将地域定向的数据转化为后台需要的数据格式
  280. if(uiType == AdvertiserDirectType.locateType) {
  281. direct.setData(front2dblocate((String) targetParamsMap.get(uiKey)));
  282. }
  283. if(uiType == AdvertiserDirectType.timeType) {
  284. // 将数据批量存入排期表
  285. List<AdGroupSchedule> scheduleList = AdvertiserScheduleAclsUtis.getScheduleList(
  286. adGroupId, (String) targetParamsMap.get(uiKey));
  287. //调用接口batchschedule
  288. adGroupScheduleService.batchAdd(scheduleList);
  289. //将时间排期的数据转化为后台需要的数据格式
  290. String data = AdvertiserScheduleAclsUtis.scheduleRoleStr(scheduleList);
  291. if(data != null && data.trim() != ""){
  292. data = data.concat("@Asia/Shanghai");
  293. }
  294. direct.setData(data);
  295. try {
  296. JSONArray sdayParting = new JSONArray(targetParamsMap.get("sdayParting").toString());
  297. JSONArray result = new JSONArray();
  298. for (int i = 0; i < sdayParting.length(); i++) {
  299. JSONObject obj = (JSONObject) sdayParting.get(i);
  300. //默认24个时间点
  301. 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";
  302. //如果传过来的dehours是-1或空或者是空字符串,表示全选
  303. if(null == obj.get("dehours") || "-1".equals(String.valueOf(obj.getString("dehours"))) ||
  304. "".equals(String.valueOf(obj.getString("dehours")))) {
  305. obj.put("dehours", allHours);
  306. }
  307. result.put(obj);
  308. }
  309. direct.setBackShow(result.toString());
  310. } catch (JSONException e) {
  311. direct.setBackShow(targetParamsMap.get("sdayParting").toString());
  312. e.printStackTrace();
  313. }
  314. }
  315. direct.setDirectType(uiType);
  316. myBatisDao.save("directSqlMapper.addDirect", direct);
  317. }
  318. }
  319. // uiKey地域: "areas" uiType地域: DirectType.locateType
  320. //targetParamsMap 前台UI传入的表单
  321. public void commonEditDirect(Map<String,Object> targetParamsMap,Map<String,Object> map){
  322. String uiKey = (String)map.get("uiKey");
  323. Integer uiType = (Integer)map.get("uiType");
  324. AdGroup adGroup= (AdGroup)map.get("adGroup");
  325. List<Long> idList = (List<Long>) map.get("idList");
  326. String logical = (String) map.get("logical");
  327. String comparison = (String)map.get("comparison");
  328. StringBuilder compiledLimitationStr=(StringBuilder) map.get("compiledLimitationStr");
  329. String [] suffix=(String[]) map.get("suffix");
  330. StringBuilder aclPluginsStr=(StringBuilder) map.get("aclPluginsStr");
  331. //处理策略 地域定向的情况
  332. if(targetParamsMap.containsKey(uiKey)){
  333. //删除数据库对应的历史数据
  334. myBatisDao.delete("directSqlMapper.deleteDirect", MapBuilder.create(HashMap.class)
  335. .add("adGroupId", adGroup.getId())
  336. .add("directType",uiType)
  337. .map());
  338. if(idList!=null){
  339. myBatisDao.delete("aclsSqlMapper.deleteAclsBatch", MapBuilder.create(HashMap.class)
  340. .add("idList", idList)
  341. .add("type",uiType)
  342. .map());
  343. }
  344. if(!((String)targetParamsMap.get(uiKey)).equalsIgnoreCase("")){
  345. //添加对应的定向数据
  346. Direct direct = new Direct();
  347. direct.setAdGroupId(adGroup.getId());
  348. direct.setBackShow((String) targetParamsMap.get(uiKey));
  349. // 将地域定向的数据转化为后台需要的数据格式
  350. if(uiType == AdvertiserDirectType.locateType) {
  351. direct.setData(front2dblocate((String) targetParamsMap.get(uiKey)));
  352. }
  353. if(uiType == AdvertiserDirectType.timeType) {
  354. // 将数据批量存入排期表
  355. List<AdGroupSchedule> scheduleList = AdvertiserScheduleAclsUtis.getScheduleList(
  356. adGroup.getId(), (String) targetParamsMap.get(uiKey));
  357. //调用接口batchschedule
  358. adGroupScheduleService.batchAdd(scheduleList);
  359. String data = AdvertiserScheduleAclsUtis.scheduleRoleStr(scheduleList);
  360. if(data != null && data.trim() != ""){
  361. data = data.concat("@Asia/Shanghai");
  362. }
  363. direct.setData(data);
  364. try {
  365. JSONArray sdayParting = new JSONArray(targetParamsMap.get("sdayParting").toString());
  366. JSONArray result = new JSONArray();
  367. for (int i = 0; i < sdayParting.length(); i++) {
  368. JSONObject obj = (JSONObject) sdayParting.get(i);
  369. //默认24个时间点
  370. 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";
  371. //如果传过来的dehours是-1或空或者是空字符串,表示全选
  372. if(null == obj.get("dehours") || "-1".equals(String.valueOf(obj.getString("dehours"))) ||
  373. "".equals(String.valueOf(obj.getString("dehours")))) {
  374. obj.put("dehours", allHours);
  375. }
  376. result.put(obj);
  377. }
  378. direct.setBackShow(result.toString());
  379. } catch (JSONException e) {
  380. direct.setBackShow(targetParamsMap.get("sdayParting").toString());
  381. e.printStackTrace();
  382. }
  383. /* data = data.concat("@Asia/Shanghai");
  384. direct.setData(data);
  385. direct.setBackShow(targetParamsMap.get("sdayParting").toString());*/
  386. }
  387. direct.setDirectType(uiType);
  388. myBatisDao.save("directSqlMapper.addDirect", direct);
  389. //增加对应策略下的acls数据
  390. if(idList!=null) {
  391. Acls acls = new Acls();
  392. acls.setLogical(logical);
  393. acls.setType(direct.getDirectType());
  394. acls.setComparison(comparison);
  395. acls.setData(direct.getData());
  396. acls.setAdGroupId(adGroup.getId());
  397. myBatisDao.save("aclsSqlMapper.addAclsBatch",MapBuilder.create(HashMap.class)
  398. .add("idList",idList)
  399. .add("acls",acls)
  400. .add("adGroupId", adGroup.getId())
  401. .map());
  402. if(compiledLimitationStr.length()<=0){
  403. compiledLimitationStr.append(suffix[0]+ direct.getData() +suffix[1]);
  404. aclPluginsStr.append(direct.getDirectType());
  405. }else {
  406. compiledLimitationStr.append(" and "+suffix[0]+ direct.getData() +suffix[1]);
  407. aclPluginsStr.append(","+direct.getDirectType());
  408. }
  409. }
  410. }else {
  411. //处理定向没有设置的情况
  412. }
  413. }
  414. }
  415. /**
  416. * 把前台获取的数据转化成后台数据库需要的数据格式 CN|/CNXAXA00|CNSHSH00|CNBJBJ00|CNAHHZ00/
  417. */
  418. private String front2dblocate(String str) {
  419. if (null != str) {
  420. StringBuilder sb = new StringBuilder();
  421. sb.append("CN|/");
  422. String[] strArr = str.split(",");
  423. for (String tmp : strArr) {
  424. if (tmp.length() == 6) {
  425. sb.append(tmp + "00|");
  426. } else if (tmp.length() == 4) {
  427. ArrayList<Location> locateList = (ArrayList<Location>) locationService
  428. .findByProvince(tmp);
  429. if (null != locateList) {
  430. for (Location locate : locateList) {
  431. sb.append(locate.getLocationT() + "|");
  432. }
  433. }
  434. }
  435. }
  436. sb.deleteCharAt(sb.length() - 1);
  437. sb.append("/");
  438. return sb.toString();
  439. }
  440. return null;
  441. }
  442. @Override
  443. public int countByParamsBack(Map<String, Object> paramMap) {
  444. //这里的搜索只是对投放名称进行搜索
  445. String searchValue = SqlHelper.doLike(paramMap.get("adGroupName"));
  446. paramMap.put("adGroupName", searchValue);
  447. return myBatisDao.get("adGroupSqlMapper.countByParamsBack", paramMap);
  448. }
  449. @Override
  450. public List<AdGroup> findByParamsBack(Map<String, Object> paramMap,
  451. Pager pager) {
  452. //这里的搜索只是对投放名称进行搜索
  453. String searchValue = SqlHelper.doLike(paramMap.get("adGroupName"));
  454. paramMap.put("adGroupName", searchValue);
  455. paramMap.put("pager", pager);
  456. return myBatisDao.getList("adGroupSqlMapper.findByParams", paramMap);
  457. }
  458. }