View Javadoc
1   package com.foxinmy.weixin4j.model.card;
2   
3   import java.io.Serializable;
4   import java.util.ArrayList;
5   import java.util.Arrays;
6   import java.util.List;
7   
8   import com.alibaba.fastjson.JSONObject;
9   import com.alibaba.fastjson.annotation.JSONField;
10  import com.foxinmy.weixin4j.type.Week;
11  import com.foxinmy.weixin4j.util.NameValue;
12  import com.foxinmy.weixin4j.util.StringUtil;
13  
14  /**
15   * 卡券高级信息: <li>1.高级字段为商户额外展示信息字段,非必填,但是填入某些结构体后,须填充完整方可显示:如填入text_image_list结构体
16   * 时,须同时传入image_url和text,否则也会报错; <li>
17   * 2.填入时间限制字段(time_limit),只控制显示,不控制实际使用逻辑,不填默认不显示 <li>
18   * 3.创建卡券时,开发者填入的时间戳须注意时间戳溢出时间,设置的时间戳须早于2038年1月19日
19   *
20   * @className CouponAdvancedInfo
21   * @author jinyu(foxinmy@gmail.com)
22   * @date 2016年6月1日
23   * @since JDK 1.6
24   * @see Builder
25   */
26  public class CouponAdvanceInfo implements Serializable {
27  
28  	private static final long serialVersionUID = 3626615706377721404L;
29  	/**
30  	 * 使用门槛(条件)字段,若不填写使用条件则在券面拼写 :无最低消费限制,全场通用,不限品类;并在使用说明显示: 可与其他优惠共享
31  	 */
32  	@JSONField(name = "use_condition")
33  	private final JSONObject useCondition;
34  	/**
35  	 * 封面摘要结构
36  	 */
37  	@JSONField(name = "abstract")
38  	private final JSONObject abstractConver;
39  	/**
40  	 * 图文列表,显示在详情内页 ,优惠券券开发者须至少传入 一组图文列表
41  	 */
42  	@JSONField(name = "text_image_list")
43  	private final List<JSONObject> slideImages;
44  	/**
45  	 * 使用时段限制
46  	 */
47  	@JSONField(name = "time_limit")
48  	private final List<JSONObject> timeLimits;
49  	/**
50  	 * 商家服务类型
51  	 */
52  	@JSONField(name = "business_service")
53  	private final List<BusinessService> businessServices;
54  
55  	private CouponAdvanceInfo(Builder builder) {
56  		this.useCondition = builder.useCondition;
57  		this.abstractConver = builder.abstractConver;
58  		this.slideImages = builder.slideImages;
59  		this.timeLimits = builder.timeLimits;
60  		this.businessServices = builder.businessServices;
61  	}
62  
63  
64  	public JSONObject getUseCondition() {
65  		return useCondition;
66  	}
67  
68  	public JSONObject getAbstractConver() {
69  		return abstractConver;
70  	}
71  
72  	public List<JSONObject> getSlideImages() {
73  		return slideImages;
74  	}
75  
76  	public List<JSONObject> getTimeLimits() {
77  		return timeLimits;
78  	}
79  
80  	public List<BusinessService> getBusinessServices() {
81  		return businessServices;
82  	}
83  
84  	/**
85  	 * 卡券高级信息构造器
86  	 * 
87  	 * @className Builder
88  	 * @author jinyu(foxinmy@gmail.com)
89  	 * @date 2016年8月4日
90  	 * @since JDK 1.6
91  	 */
92  	public static final class Builder {
93  		/**
94  		 * 使用门槛(条件)字段,若不填写使用条件则在券面拼写 :无最低消费限制,全场通用,不限品类;并在使用说明显示: 可与其他优惠共享
95  		 */
96  		private JSONObject useCondition;
97  		/**
98  		 * 封面摘要结构
99  		 */
100 		private JSONObject abstractConver;
101 		/**
102 		 * 图文列表,显示在详情内页 ,优惠券券开发者须至少传入 一组图文列表
103 		 */
104 		private List<JSONObject> slideImages;
105 		/**
106 		 * 使用时段限制
107 		 */
108 		private List<JSONObject> timeLimits;
109 		/**
110 		 * 商家服务类型
111 		 */
112 		private List<BusinessService> businessServices;
113 
114 		public Builder() {
115 		}
116 
117 
118 
119 		/**
120 		 * 设置使用门槛(条件)字段,若不填写使用条件则在券面拼写 :无最低消费限制,全场通用,不限品类;并在使用说明显示: 可与其他优惠共享
121 		 * 
122 		 * @param acceptCategory
123 		 *            指定可用的商品类目,仅用于代金券类型 ,填入后将在券面拼写适用于xxx
124 		 * @param rejectCategory
125 		 *            指定可用的商品类目,仅用于代金券类型 ,填入后将在券面拼写不适用于xxxx
126 		 * @return
127 		 */
128 		public Builder useCondition(String acceptCategory, String rejectCategory) {
129 			return useCondition(acceptCategory, rejectCategory, 0, null, true);
130 		}
131 
132 		/**
133 		 * 设置使用门槛(条件)字段,若不填写使用条件则在券面拼写 :无最低消费限制,全场通用,不限品类;并在使用说明显示: 可与其他优惠共享
134 		 * 
135 		 * @param leastCost
136 		 *            满减门槛字段,可用于兑换券和代金券 ,填入后将在全面拼写消费满xx元可用。
137 		 * @param objectUseFor
138 		 *            购买xx可用类型门槛,仅用于兑换 ,填入后自动拼写购买xxx可用。
139 		 * @return
140 		 */
141 		public Builder useCondition(int leastCost, String objectUseFor) {
142 			return useCondition(null, null, leastCost, objectUseFor, true);
143 		}
144 
145 		/**
146 		 * 设置使用门槛(条件)字段,若不填写使用条件则在券面拼写 :无最低消费限制,全场通用,不限品类;并在使用说明显示: 可与其他优惠共享
147 		 * 
148 		 * @param acceptCategory
149 		 *            指定可用的商品类目,仅用于代金券类型 ,填入后将在券面拼写适用于xxx
150 		 * @param rejectCategory
151 		 *            指定可用的商品类目,仅用于代金券类型 ,填入后将在券面拼写不适用于xxxx
152 		 * @param leastCost
153 		 *            满减门槛字段,可用于兑换券和代金券 ,填入后将在全面拼写消费满xx元可用。
154 		 * @param objectUseFor
155 		 *            购买xx可用类型门槛,仅用于兑换 ,填入后自动拼写购买xxx可用。
156 		 * @param canUseWithOtherDiscount
157 		 *            不可以与其他类型共享门槛 ,填写false时系统将在使用须知里 拼写“不可与其他优惠共享”,
158 		 *            填写true时系统将在使用须知里 拼写“可与其他优惠共享”, 默认为true
159 		 * @return
160 		 */
161 		public Builder useCondition(String acceptCategory,
162 				String rejectCategory, int leastCost, String objectUseFor,
163 				boolean canUseWithOtherDiscount) {
164 			if(useCondition == null)
165 				useCondition = new JSONObject();
166 			useCondition.clear();
167 			if (StringUtil.isNotBlank(acceptCategory)) {
168 				useCondition.put("accept_category", acceptCategory);
169 			}
170 			if (StringUtil.isNotBlank(rejectCategory)) {
171 				useCondition.put("reject_category", rejectCategory);
172 			}
173 			if (leastCost > 0) {
174 				useCondition.put("least_cost", leastCost);
175 			}
176 			if (StringUtil.isNotBlank(objectUseFor)) {
177 				useCondition.put("object_use_for", objectUseFor);
178 			}
179 			useCondition.put("can_use_with_other_discount",
180 					canUseWithOtherDiscount);
181 			return this;
182 		}
183 
184 		/**
185 		 * 设置封面摘要
186 		 * 
187 		 * @param abstracts
188 		 *            封面摘要简介
189 		 * @param convers
190 		 *            封面图片列表
191 		 * @return
192 		 */
193 		public Builder abstractConver(String abstracts, String... convers) {
194 			if(abstractConver == null)
195 				abstractConver = new JSONObject();
196 			abstractConver.clear();
197 			abstractConver.put("abstract", abstracts);
198 			abstractConver.put("icon_url_list", convers);
199 			return this;
200 		}
201 
202 		/**
203 		 * 设置图文列表,显示在详情内页 ,优惠券券开发者须至少传入 一组图文列表
204 		 * 
205 		 * @param slideImages
206 		 *            图文列表,name为图片描述,value为图片链接
207 		 * @return
208 		 */
209 		public Builder slideImages(NameValue... slideImages) {
210 			if(this.slideImages == null)
211 				this.slideImages = new ArrayList<JSONObject>();
212 			this.slideImages.clear();
213 			for (NameValue nv : slideImages) {
214 				JSONObject slide = new JSONObject();
215 				slide.put("text", nv.getName());
216 				slide.put("image_url", nv.getValue());
217 				this.slideImages.add(slide);
218 			}
219 			return this;
220 		}
221 
222 		/**
223 		 * 设置图文列表,显示在详情内页 ,优惠券券开发者须至少传入 一组图文列表
224 		 * 
225 		 * @param title
226 		 *            图片标题
227 		 * @param url
228 		 *            图片链接
229 		 * @return
230 		 */
231 		public Builder slideImage(String title, String url) {
232 			if(this.slideImages == null)
233 				this.slideImages = new ArrayList<JSONObject>();
234 			JSONObject slide = new JSONObject();
235 			slide.put("text", title);
236 			slide.put("image_url", url);
237 			this.slideImages.add(slide);
238 			return this;
239 		}
240 
241 		/**
242 		 * 设置使用时段限制
243 		 * 
244 		 * @param week
245 		 *            星期,此处只控制显示, 不控制实际使用逻辑,不填默认不显示
246 		 * @param beginHour
247 		 *            当前week类型下的起始时间(小时) ,如当前结构体内填写了MONDAY, 此处填写了10,则此处表示周一
248 		 *            10:00可用
249 		 * @param beignMinute
250 		 *            当前week类型下的起始时间(分钟) ,如当前结构体内填写了MONDAY,
251 		 *            begin_hour填写10,此处填写了59, 则此处表示周一 10:59可用
252 		 * @return
253 		 */
254 		public Builder timeLimit(Week week, int beginHour, int beignMinute) {
255 			return timeLimit(week, beginHour, beignMinute, 0, 0);
256 		}
257 
258 		/**
259 		 * 设置 使用时段限制
260 		 * 
261 		 * @param week
262 		 *            星期,此处只控制显示, 不控制实际使用逻辑,不填默认不显示
263 		 * @param beginHour
264 		 *            当前week类型下的起始时间(小时) ,如当前结构体内填写了MONDAY, 此处填写了10,则此处表示周一
265 		 *            10:00可用
266 		 * @param beignMinute
267 		 *            当前week类型下的起始时间(分钟) ,如当前结构体内填写了MONDAY,
268 		 *            begin_hour填写10,此处填写了59, 则此处表示周一 10:59可用
269 		 * @param endHour
270 		 *            当前week类型下的结束时间(小时) ,如当前结构体内填写了MONDAY, 此处填写了20,则此处表示周一
271 		 *            10:00-20:00可用
272 		 * @param endMinute
273 		 *            当前week类型下的结束时间(分钟) ,如当前结构体内填写了MONDAY,
274 		 *            begin_hour填写10,此处填写了59, 则此处表示周一 10:59-00:59可用
275 		 * @return
276 		 */
277 		public Builder timeLimit(Week week, int beginHour, int beignMinute,
278 				int endHour, int endMinute) {
279 			if(this.timeLimits == null)
280 				this.timeLimits = new ArrayList<JSONObject>();
281 			JSONObject timeLimit = new JSONObject();
282 			if (week != null) {
283 				timeLimit.put("type", week.name());
284 			}
285 			timeLimit.put("begin_hour", beginHour);
286 			if (beignMinute > 0) {
287 				timeLimit.put("begin_minute", beignMinute);
288 			}
289 			timeLimit.put("end_hour", endHour);
290 			if (endMinute > 0) {
291 				timeLimit.put("end_minute", endMinute);
292 			}
293 			this.timeLimits.add(timeLimit);
294 			return this;
295 		}
296 
297 		/**
298 		 * 设置商家服务类型
299 		 * 
300 		 * @param businessServices
301 		 *            服务类型
302 		 * @return
303 		 */
304 		public Builder businessServices(BusinessService... businessServices) {
305 			if(this.businessServices == null)
306 				this.businessServices = new ArrayList<BusinessService>();
307 			this.businessServices.addAll(Arrays.asList(businessServices));
308 			return this;
309 		}
310 
311 		public CouponAdvanceInfo build(){
312 			return new CouponAdvanceInfo(this);
313 		}
314 	}
315 
316 	/**
317 	 * 商家服务
318 	 * 
319 	 * @className BusinessService
320 	 * @author jinyu(foxinmy@gmail.com)
321 	 * @date 2016年8月5日
322 	 * @since JDK 1.6
323 	 */
324 	public enum BusinessService {
325 		/**
326 		 * 外卖服务
327 		 */
328 		BIZ_SERVICE_DELIVER,
329 		/**
330 		 * 停车位
331 		 */
332 		BIZ_SERVICE_FREE_PARK,
333 		/**
334 		 * 可带宠物
335 		 */
336 		BIZ_SERVICE_WITH_PET,
337 		/**
338 		 * 免费wifi
339 		 */
340 		BIZ_SERVICE_FREE_WIFI;
341 	}
342 }