fs-danaus
2021-03-05 a6a76f98715a5539c8fd77676d0ea1af5c9c5a4c
提交 | 用户 | age
a6a76f 1 package com.yc.sdk.shopping.action;
F 2
3 import java.text.DecimalFormat;
4 import java.text.NumberFormat;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Map.Entry;
8 import java.util.stream.Collectors;
9
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 import javax.servlet.http.HttpSession;
13
14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.context.annotation.Scope;
16 import org.springframework.dao.DataAccessException;
17 import org.springframework.stereotype.Controller;
18 import org.springframework.web.bind.annotation.RequestMapping;
19
20 import com.google.gson.Gson;
21 import com.google.gson.JsonArray;
22 import com.google.gson.JsonObject;
23 import com.google.gson.reflect.TypeToken;
24 import com.yc.action.BaseAction;
25 import com.yc.entity.DataSourceEntity;
26 import com.yc.multiData.MultiDataSource;
27 import com.yc.multiData.SpObserver;
28 import com.yc.sdk.shopping.action.api.ShopCcCode;
29 import com.yc.sdk.shopping.entity.CartEntity;
30 import com.yc.sdk.shopping.entity.CurrencyEntity;
31 import com.yc.sdk.shopping.entity.MatCodeEntity;
32 import com.yc.sdk.shopping.entity.OptionEntity;
33 import com.yc.sdk.shopping.entity.OrderDetailEntity;
34 import com.yc.sdk.shopping.entity.SettingEntity;
35 import com.yc.sdk.shopping.entity.ShopCcCodeEntity;
36 import com.yc.sdk.shopping.service.CartIfc;
37 import com.yc.sdk.shopping.service.CurrencyIfc;
38 import com.yc.sdk.shopping.service.MatCodeIfc;
39 import com.yc.sdk.shopping.service.MatOptionIfc;
40 import com.yc.sdk.shopping.service.SettingIfc;
41 import com.yc.sdk.shopping.service.imagedata.ShoppingImageDataIfc;
42 import com.yc.sdk.shopping.service.order.OrderIfc;
43 import com.yc.sdk.shopping.util.SettingKey;
44 import com.yc.utils.SessionKey;
45
46 @Controller
47 @Scope("prototype")
48 @RequestMapping("/shopping/cart.do")
49 public class Cart extends BaseAction {
50     static Gson gson = new Gson();
51     @Autowired
52     CartIfc cartIfc;
53     @Autowired
54     MatCodeIfc matCodeIfc;
55     @Autowired
56     CurrencyIfc currencyIfc;
57     @Autowired
58     MatOptionIfc matOptionIfc;
59     @Autowired
60     OrderIfc orderIfc;
61     @Autowired
62     SettingIfc settingIfc;
63     static double maxQuantity = 9999999 ;
64     @Autowired
65     ShoppingImageDataIfc imgData;
66     
67     /**
68      * 选中购物车中的某个商品准备提交订单
69      * @param request
70      * @param response
71      */
72     @RequestMapping(params = "m=checkbox")
73     public void checkbox(HttpServletRequest request, HttpServletResponse response) {
74         HttpSession session = request.getSession();
75         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
76         String hostUrl = SettingKey.getHostUrl(request);
77         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
78         // 将微信corpid组装成url
79         String wxQueryString = SettingKey.getQueryStringByWx(request);
80         boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
81         String selectedCartIds = request.getParameter(SettingKey.CHECKBOX);
82         if (selectedCartIds != null && !"".equals(selectedCartIds)) {
83             selectedCartIds = selectedCartIds.replace(SettingKey.CHECKBOX+"_", "");
84             session.setAttribute(SettingKey.CHECKBOX, selectedCartIds);
85         }else {
86             session.removeAttribute(SettingKey.CHECKBOX);
87         }
88         
89         String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? "" 
90                 : (String)session.getAttribute(SessionKey.USERCODE));
91         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? "" 
92                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID) ) ;
93         String sessionId = session.getId();
94         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null?"": (String)session.getAttribute(SettingKey.CLTCODE)) ;
95         
96         
97         DecimalFormat df=(DecimalFormat)NumberFormat.getInstance(); 
98         df.setMaximumFractionDigits(2); 
99         JsonObject json = new JsonObject();
100         JsonObject errJson = new JsonObject();
101         SettingEntity settingEntity = null ;
102         try {
103             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
104             SpObserver.setDBtoInstance("_" + dataSourceEntity.getDbId());// 切换数据源
105             settingEntity = settingIfc.getSettingEntity() ;
106             //取网店 shopcccode
107             ShopCcCodeEntity shopCcCodeEntity = ShopCcCode.getShopCcCode(settingEntity,request);
108             
109             //选择购物车中商品 
110             cartIfc.saveSelectedCartIds(userCode, sessionId,openId,cltCode,shopCcCodeEntity.getShopCcCode(),selectedCartIds);
111             
112             //List<CartEntity> cartList = cartIfc.getCarts(selectedCartIds);
113             List<CartEntity> cartList = cartIfc.getCartList(userCode, sessionId, openId, cltCode,shopCcCodeEntity.getShopCcCode()); // 重新取一次数,确保购物车显示正确
114             CurrencyEntity currencyEntity = currencyIfc.getUserCurrency(userCode);
115             /******** 购物车 开始清单输出 *************/
116             //DecimalFormat df = new DecimalFormat("0.00");
117             double selectTotalAmount = 0 ;  //给 footer.jsp 页面使用,用于赋初值
118             int selectItems = 0 ;    //给 footer.jsp 页面使用,用于赋初值
119             int cartItems = 0 ; //给 footer.jsp 页面使用,用于赋初值
120             if (cartList!= null) {
121                 cartItems = cartList.size();
122             }
123             
124             //取已经选择的金额数 
125             List<CartEntity> selectedCartList = cartList.stream().filter((CartEntity c)->c.isSelected()).collect(Collectors.toList());
126             for (int i = 0; selectedCartList!=null&&i < selectedCartList.size(); i++) {
127                 selectTotalAmount += selectedCartList.get(i).getAmount() ;
128                 selectItems ++ ;
129             }
130             
131             //组装 json array 输出 
132             JsonArray cartListJsonArray = this.getCartJsonArray(request, settingEntity, cartList, currencyEntity, dataSourceEntity);
133             json.add("list", cartListJsonArray);
134             
135             json.addProperty("SelectTotalAmount",df.format(selectTotalAmount));
136             json.addProperty("SelectItems", selectItems);
137             json.addProperty("CartItems", cartItems);
138             /******** 购物车 结束清单输出 *************/
139             
140             
141             
142             //预估配送费用
143             double freeCost = SettingKey.getFreeCost(request) ;
144             //优惠券
145             double couponCost = SettingKey.getCouponCost(request) ;           
146             //礼品劵
147             double voucherCost = SettingKey.getVoucherCost(request) ;
148             
149             //余额
150             double balance = SettingKey.getBalance(request) ;
151             
152             //double totalQuantity = (list!=null&&list.size()>0?list.get(0).getTotalQuantity():0);
153             double selectcdTotalWeight = (cartList!=null&&cartList.size()>0?cartList.get(0).getSelectedTotalWeight():0);
154             
155             double paymentAmount = selectTotalAmount + freeCost - couponCost - voucherCost - balance;
156             String mytitle = "购物车内的商品";
157             if (settingEntity.getCartWeight()) { 
158                 mytitle += "&nbsp;(" +selectcdTotalWeight + settingEntity.getWeightClassId() + ")";
159             }
160             //json.addProperty("selecttotalamount",(totalAmount <= 0?"0.0 (无需支付)":df.format(totalAmount)+"")); 
161             //json.addProperty("selectitems",(cartList!=null?cartList.size():0)+"");
162             
163             json.addProperty("PaymentAmount",(paymentAmount <= 0?"0.0 (无需支付)":df.format(paymentAmount)+""));
164             json.addProperty("mytitle",mytitle); 
165             json.addProperty("cart-num",(cartList!=null?cartList.size():0));
166             
167             json.addProperty("redirect", hostUrl +"/shopping/"+ ( isMoblieBrowser?"mobile/":"") +"checkoutnew/index.jsp"
168                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString));
169             this.printJson(response, json.toString());
170         } catch (Exception e ){
171             e.printStackTrace();
172             errJson.addProperty("warning",(e.getCause()!=null?e.getCause().getMessage(): e.getMessage()));
173             json.add("error", errJson);
174             this.printJson(response, json.toString());
175             return;
176         }finally {
177             SpObserver.setDBtoInstance();
178         }
179     }
180     
181     @RequestMapping(params = "m=checkboxByPicture")
182     public void checkboxByPicture(HttpServletRequest request, HttpServletResponse response) {
183         HttpSession session = request.getSession();
184         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
185         String hostUrl = SettingKey.getHostUrl(request);
186         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
187         // 将微信corpid组装成url
188         String wxQueryString = SettingKey.getQueryStringByWx(request);
189         boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
190         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
191                 : (String) session.getAttribute(SettingKey.CLTCODE));
192         String checkbox = request.getParameter(SettingKey.CHECKBOX);
193         if (checkbox != null && !"".equals(checkbox)) {
194             checkbox = checkbox.replace(SettingKey.CHECKBOX+"_", "");
195             session.setAttribute(SettingKey.CHECKBOXBYPICTURE, checkbox);
196         }else{
197             session.removeAttribute(SettingKey.CHECKBOXBYPICTURE);
198         }
199         
200         DecimalFormat df=(DecimalFormat)NumberFormat.getInstance(); 
201         df.setMaximumFractionDigits(2); 
202         JsonObject json = new JsonObject();
203         JsonObject errJson = new JsonObject();
204         SettingEntity settingEntity = null ;
205         try {
206             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
207             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
208             settingEntity = settingIfc.getSettingEntity() ;
209             List<CartEntity> list = cartIfc.getCartsByPicture(checkbox,cltCode);
210             
211             
212             //余额
213             double balance = SettingKey.getBalance(request) ;
214             
215             //double totalQuantity = (list!=null&&list.size()>0?list.get(0).getTotalQuantity():0);
216             double totalWeight = (list!=null&&list.size()>0?list.get(0).getTotalWeight():0);
217             
218             double totalAmount = (list!=null&&list.size()>0?list.get(0).getTotalAmount():0) - balance;
219             String mytitle = "购物车内的商品";
220             if (settingEntity.getCartWeight()) { 
221                 mytitle += "&nbsp;(" +totalWeight + settingEntity.getWeightClassId() + ")";
222             }
223             json.addProperty("selecttotalamount",(totalAmount <= 0?"0.0 (无需支付)":df.format(totalAmount)+"")); 
224             json.addProperty("selectitems",(list!=null?list.size():0)+"");
225             json.addProperty("mytitle",mytitle); 
226             json.addProperty("cart-num",(list!=null?list.size():0));
227             
228             json.addProperty("redirect", hostUrl +"/shopping/"+ ( isMoblieBrowser?"mobile/":"") +"purchase/checkout.jsp"
229                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString));
230             this.printJson(response, json.toString());
231         }catch (Exception e) {
232             e.printStackTrace();
233             errJson.addProperty("warning", e.getCause() !=null? e.getCause().getMessage():e.getMessage());
234             json.add("error", errJson);
235             this.printJson(response, json.toString());
236             return;
237         } finally {
238             SpObserver.setDBtoInstance();
239         }
240     }
241
242     /**
243      * 删除购物车中的商品
244      * @param request
245      * @param response
246      */
247     @RequestMapping(params = "m=del")
248     public void del(HttpServletRequest request, HttpServletResponse response) {
249         HttpSession session = request.getSession();
250         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
251
252         String sessionId = session.getId();
253         String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? ""
254                 : (String) session.getAttribute(SessionKey.USERCODE));
255         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
256                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
257         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
258                 : (String) session.getAttribute(SettingKey.CLTCODE));
259         // String cltName = (session.getAttribute(SettingKey.CLTNAME) ==
260         // null?"": (String)session.getAttribute(SettingKey.CLTNAME)) ;
261         SettingEntity settingEntity = null;
262         CurrencyEntity currencyEntity = null;
263         JsonObject json = new JsonObject();
264         JsonObject errJson = new JsonObject();
265         try {
266             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
267             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
268             currencyEntity = currencyIfc.getUserCurrency(userCode);
269             settingEntity = settingIfc.getSettingEntity();
270             
271             //取网店 shopcccode
272             ShopCcCodeEntity shopCcCodeEntity = ShopCcCode.getShopCcCode(settingEntity,request);
273             
274             
275             String cartIds = request.getParameter("key") ;
276
277             //Integer cartId = (request.getParameter("key") == null ? 0 : Integer.parseInt(request.getParameter("key")));
278             cartIfc.delCart(cartIds);
279             List<CartEntity> cartList = cartIfc.getCartList(userCode, sessionId, openId, cltCode,shopCcCodeEntity.getShopCcCode()); // 重新取一次数,确保购物车显示正确
280             /******** 购物车 开始清单输出 *************/
281             DecimalFormat df = new DecimalFormat("0.00");
282             double selectTotalAmount = 0 ;  //给 footer.jsp 页面使用,用于赋初值
283             int selectItems = 0 ;    //给 footer.jsp 页面使用,用于赋初值
284             int cartItems = 0 ; //给 footer.jsp 页面使用,用于赋初值
285             if (cartList!= null) {
286                 cartItems = cartList.size();
287             }
288             
289             //取已经选择的金额数 
290             List<CartEntity> selectedCartList = cartList.stream().filter((CartEntity c)->c.isSelected()).collect(Collectors.toList());
291             for (int i = 0; selectedCartList!=null&&i < selectedCartList.size(); i++) {
292                 selectTotalAmount += selectedCartList.get(i).getAmount() ;
293                 selectItems ++ ;
294             }
295             
296             //组装 json array 输出 
297             JsonArray cartListJsonArray = this.getCartJsonArray(request, settingEntity, cartList, currencyEntity, dataSourceEntity);
298             json.add("list", cartListJsonArray);
299             
300             json.addProperty("SelectTotalAmount",df.format(selectTotalAmount));
301             json.addProperty("SelectItems", selectItems);
302             json.addProperty("CartItems", cartItems);
303             /******** 购物车 结束清单输出 *************/
304             
305             //double totalQuantity = (list!=null&&list.size()>0?list.get(0).getTotalQuantity():0);
306             //double totalWeight = (list!=null&&list.size()>0?list.get(0).getTotalWeight():0);
307             
308             double totalAmount = (cartList!=null&&cartList.size()>0?cartList.get(0).getTotalAmount():0) ;
309             
310             
311             
312             json.addProperty("total", cartList.size() + "个商品"
313                     + (settingEntity.isShowPrice() ? " - " + currencyEntity.getCurrencySign() + totalAmount : ""));
314             SettingKey.setCartHintMsg(session, "您已成功更新了购物车!");
315             
316             //预估配送费用
317             double freeCost = SettingKey.getFreeCost(request) ;
318             //优惠券
319             double couponCost = SettingKey.getCouponCost(request) ;           
320             //礼品劵
321             double voucherCost = SettingKey.getVoucherCost(request) ;
322             
323             double sumTotalAmount = totalAmount + freeCost - couponCost - voucherCost;
324             json.addProperty("matcodetotal",totalAmount+"");   //购物车页面使用  /shopping/mobile/cart/index.jsp
325             json.addProperty("totalamount",sumTotalAmount+"");  //购物车页面使用  /shopping/mobile/cart/index.jsp
326             json.addProperty("cart-num",(cartList!=null?cartList.size():0));
327             
328             this.printJson(response, json.toString());
329         } catch(Exception e){
330             e.printStackTrace();
331             errJson.addProperty("warning", e.getMessage());
332             json.add("error", errJson);
333             this.printJson(response, json.toString());
334             return;
335         }finally {
336             SpObserver.setDBtoInstance();
337         }
338     }
339     
340     @RequestMapping(params = "m=delByPicture")
341     public void delByPicture(HttpServletRequest request, HttpServletResponse response) {
342         HttpSession session = request.getSession();
343         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
344
345 //        String sessionId = session.getId();
346         String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? ""
347                 : (String) session.getAttribute(SessionKey.USERCODE));
348 //        String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
349 //                : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
350         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
351                 : (String) session.getAttribute(SettingKey.CLTCODE));
352         // String cltName = (session.getAttribute(SettingKey.CLTNAME) ==
353         // null?"": (String)session.getAttribute(SettingKey.CLTNAME)) ;
354         SettingEntity settingEntity = null;
355         CurrencyEntity currencyEntity = null;
356         
357         JsonObject json = new JsonObject();
358         JsonObject errJson = new JsonObject();
359         try {
360             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
361             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
362             currencyEntity = currencyIfc.getUserCurrency(userCode);
363             settingEntity = settingIfc.getSettingEntity();
364
365             Integer cartId = (request.getParameter("key") == null ? 0 : Integer.parseInt(request.getParameter("key")));
366             cartIfc.delCartByPicture(cartId);
367             List<CartEntity> list = cartIfc.getCartsByPicture(cltCode); // 重新取一次数,确保购物车显示正确
368
369             //double totalQuantity = (list!=null&&list.size()>0?list.get(0).getTotalQuantity():0);
370             //double totalWeight = (list!=null&&list.size()>0?list.get(0).getTotalWeight():0);
371             
372             double totalAmount = (list!=null&&list.size()>0?list.get(0).getTotalAmount():0) ;
373             
374             
375             
376             json.addProperty("total", list.size() + "个商品"
377                     + (settingEntity.isShowPrice() ? " - " + currencyEntity.getCurrencySign() + totalAmount : ""));
378             SettingKey.setCartHintMsg(session, "您已成功更新了购物车!");
379             
380             
381             
382             double sumTotalAmount = totalAmount ;
383             json.addProperty("matcodetotal",totalAmount+"");   //购物车页面使用  /shopping/mobile/cart/index.jsp
384             json.addProperty("totalamount",sumTotalAmount+"");  //购物车页面使用  /shopping/mobile/cart/index.jsp
385             json.addProperty("cart-num",(list!=null?list.size():0));
386             
387             this.printJson(response, json.toString());
388         }catch (Exception e) {
389             e.printStackTrace();
390             errJson.addProperty("warning", e.getCause() !=null? e.getCause().getMessage():e.getMessage());
391             json.add("error", errJson);
392             this.printJson(response, json.toString());
393             return;
394         } finally {
395             SpObserver.setDBtoInstance();
396         }
397     }
398
399     /**
400      * 编辑购物车中的数量
401      * @param request
402      * @param response
403      */
404     @RequestMapping(params = "m=edit")
405     public void edit(HttpServletRequest request, HttpServletResponse response) {
406         HttpSession session = request.getSession();
407         String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
408         String jsonFormat = request.getParameter("json") ;
409         
410         String sessionId = session.getId();
411         String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? ""
412                 : (String) session.getAttribute(SessionKey.USERCODE));
413         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
414                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
415         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
416                 : (String) session.getAttribute(SettingKey.CLTCODE));
417         
418         
419         String hostUrl = SettingKey.getHostUrl(request);
420         // 将微信corpid组装成url
421         String wxQueryString = SettingKey.getQueryStringByWx(request);
422         boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
423         try {
424             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
425             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
426             SettingEntity settingEntity = settingIfc.getSettingEntity(); 
427             //取网店 shopcccode
428             ShopCcCodeEntity shopCcCodeEntity = ShopCcCode.getShopCcCode(settingEntity,request);
429             
430             Map<String, String[]> params = request.getParameterMap();
431             for (String key : params.keySet()) {
432                 if (!key.startsWith("quantity")) {
433                     continue;
434                 }
435                 int pos = key.indexOf("_")  ;
436                 Integer cartId = Integer.valueOf(key.substring(pos + 1, key.length()));
437                 String[] values = params.get(key);
438                 double quantity = 0;
439                 for (int i = 0; i < values.length; i++) {
440                     if (values[i] == null || "".equals(values[i])) {
441                         
442                         if (jsonFormat != null && ! "".equals(jsonFormat)) {
443                             JsonObject success = new JsonObject();
444                             success.addProperty("error","必须录入数量!");   //购物车页面使用  /shopping/mobile/cart/index.jsp
445                             this.printJson(response, success.toString());
446                             return ;
447                         }else {
448                             SettingKey.setCartHintMsg(session, "必须录入数量!");
449                             String url = "<script language=\"javascript\" type=\"text/javascript\">window.location.href=\"" + hostUrl
450                                     + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"cart/" + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString)
451                                     + "\"</script>";
452                             this.print(response, url);
453                             return ;
454                         }
455                     }
456                     
457                     quantity = Double.parseDouble(values[i].toString());
458                     if (quantity > maxQuantity) {
459                         JsonObject success = new JsonObject();
460                         success.addProperty("error", "数量不能大于 " + maxQuantity +" !");
461                         this.printJson(response, success.toString());
462                         return;
463                     }
464
465                 }
466
467                 cartIfc.updateCartQuantity(cartId, quantity,cltCode);
468             }
469             
470             if (jsonFormat != null && ! "".equals(jsonFormat)) {
471                 //预估配送费用
472                 double freeCost = SettingKey.getFreeCost(request) ;
473                 //优惠券
474                 double couponCost = SettingKey.getCouponCost(request) ;           
475                 //礼品劵
476                 double voucherCost = SettingKey.getVoucherCost(request) ;
477                 List<CartEntity> cartList = cartIfc.getCartList(userCode, sessionId, openId, cltCode,shopCcCodeEntity.getShopCcCode()); // 重新取一次数,确保购物车显示正确
478                 CurrencyEntity currencyEntity = currencyIfc.getUserCurrency(userCode);
479                 JsonObject json = new JsonObject();
480                 
481                 /******** 购物车 开始清单输出 *************/
482                 DecimalFormat df = new DecimalFormat("0.00");
483                 double selectTotalAmount = 0 ;  //给 footer.jsp 页面使用,用于赋初值
484                 int selectItems = 0 ;    //给 footer.jsp 页面使用,用于赋初值
485                 int cartItems = 0 ; //给 footer.jsp 页面使用,用于赋初值
486                 if (cartList!= null) {
487                     cartItems = cartList.size();
488                 }
489                 
490                 //取已经选择的金额数 
491                 List<CartEntity> selectedCartList = cartList.stream().filter((CartEntity c)->c.isSelected()).collect(Collectors.toList());
492                 for (int i = 0; selectedCartList!=null&&i < selectedCartList.size(); i++) {
493                     selectTotalAmount += selectedCartList.get(i).getAmount() ;
494                     selectItems ++ ;
495                 }
496                 
497                 //组装 json array 输出 
498                 JsonArray cartListJsonArray = this.getCartJsonArray(request, settingEntity, cartList, currencyEntity, dataSourceEntity);
499                 json.add("list", cartListJsonArray);
500                 
501                 json.addProperty("SelectTotalAmount",df.format(selectTotalAmount));
502                 json.addProperty("SelectItems", selectItems);
503                 json.addProperty("CartItems", cartItems);
504                 /******** 购物车 结束清单输出 *************/
505                 
506                 
507                 //double totalQuantity = (list!=null&&list.size()>0?list.get(0).getTotalQuantity():0);
508                 //double totalWeight = (list!=null&&list.size()>0?list.get(0).getTotalWeight():0);
509                 
510                 double totalAmount = (cartList!=null&&cartList.size()>0?cartList.get(0).getTotalAmount():0) ;
511                 
512                 double sumTotalAmount = (cartList!=null&&cartList.size()>0?cartList.get(0).getTotalAmount():0) + freeCost - couponCost - voucherCost;
513                 
514                 json.addProperty("matcodetotal",totalAmount+"");   //购物车页面使用  /shopping/mobile/cart/index.jsp
515                 json.addProperty("totalamount",sumTotalAmount+"");  //购物车页面使用  /shopping/mobile/cart/index.jsp
516                 json.addProperty("cart-num",(cartList!=null?cartList.size():0));
517                 this.printJson(response, json.toString());
518             } else {
519                 SettingKey.setCartHintMsg(session, "您已成功更新了购物车!");
520                 String url = "<script language=\"javascript\" type=\"text/javascript\">window.location.href=\"" + hostUrl
521                         + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"cart/" + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString)
522                         + "\"</script>";
523                 this.print(response, url);
524             }
525             return;
526         } catch (Exception e) {
527             e.printStackTrace();
528             JsonObject success = new JsonObject();
529             success.addProperty("error","SpObserver.getCurrentInstance():" + SpObserver.getCurrentInstance()
530             + " SessionKey.SHOPPING_DBID:" + dbId + " error:" + e.getMessage());
531             this.printJson(response, success.toString());
532             return;
533         } finally {
534             SpObserver.setDBtoInstance();
535         }
536     }
537     
538     
539     @RequestMapping(params = "m=editByPicture")
540     public void editByPicture(HttpServletRequest request, HttpServletResponse response) {
541         HttpSession session = request.getSession();
542         String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
543         String jsonFormat = request.getParameter("json") ;
544         
545 //        String sessionId = session.getId();
546 //        String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? ""
547 //                : (String) session.getAttribute(SessionKey.USERCODE));
548 //        String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
549 //                : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
550         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
551                 : (String) session.getAttribute(SettingKey.CLTCODE));
552         
553         
554         String hostUrl = SettingKey.getHostUrl(request);
555         // 将微信corpid组装成url
556         String wxQueryString = SettingKey.getQueryStringByWx(request);
557         boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
558         try {
559             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
560             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
561             Map<String, String[]> params = request.getParameterMap();
562             for (String key : params.keySet()) {
563                 if (!key.startsWith("quantity")) {
564                     continue;
565                 }
566                 int pos = key.indexOf("_")  ;
567                 Integer cartId = Integer.valueOf(key.substring(pos + 1, key.length()));
568                 String[] values = params.get(key);
569                 double quantity = 0;
570                 for (int i = 0; i < values.length; i++) {
571                     if (values[i] == null || "".equals(values[i])) {
572                         
573                         if (jsonFormat != null && ! "".equals(jsonFormat)) {
574                             JsonObject success = new JsonObject();
575                             success.addProperty("error","必须录入数量!");   //购物车页面使用  /shopping/mobile/cart/index.jsp
576                             this.printJson(response, success.toString());
577                             return ;
578                         }else {
579                             SettingKey.setCartHintMsg(session, "必须录入数量!");
580                             String url = "<script language=\"javascript\" type=\"text/javascript\">window.location.href=\"" + hostUrl
581                                     + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"purchase/cart.jsp" + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString)
582                                     + "\"</script>";
583                             this.print(response, url);
584                             return ;
585                         }
586                     }
587                     
588                     quantity = Double.parseDouble(values[i].toString());
589                     if (quantity > maxQuantity) {
590                         JsonObject success = new JsonObject();
591                         success.addProperty("error", "数量不能大于 " + maxQuantity +" !");
592                         this.printJson(response, success.toString());
593                         return;
594                     }
595
596                 }
597
598                 cartIfc.updateCartQuantityByPicture(cartId, quantity);
599             }
600             
601             if (jsonFormat != null && ! "".equals(jsonFormat)) {
602                 
603                 List<CartEntity> list = cartIfc.getCartsByPicture(cltCode); // 重新取一次数,确保购物车显示正确
604                 
605                 double totalAmount = (list!=null&&list.size()>0?list.get(0).getTotalAmount():0) ;
606                 
607                 double sumTotalAmount = (list!=null&&list.size()>0?list.get(0).getTotalAmount():0) ;
608                 JsonObject success = new JsonObject();
609                 success.addProperty("matcodetotal",totalAmount+"");   //购物车页面使用  /shopping/mobile/cart/index.jsp
610                 success.addProperty("totalamount",sumTotalAmount+"");  //购物车页面使用  /shopping/mobile/cart/index.jsp
611                 success.addProperty("cart-num",(list!=null?list.size():0));
612                 this.printJson(response, success.toString());
613             } else {
614                 SettingKey.setCartHintMsg(session, "您已成功更新了购物车!");
615                 String url = "<script language=\"javascript\" type=\"text/javascript\">window.location.href=\"" + hostUrl
616                         + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"purchase/cart.jsp" + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString)
617                         + "\"</script>";
618                 this.print(response, url);
619             }
620             return;
621         } catch (Exception e) {
622             e.printStackTrace();
623             JsonObject success = new JsonObject();
624             success.addProperty("error","SpObserver.getCurrentInstance():" + SpObserver.getCurrentInstance()
625             + " SessionKey.SHOPPING_DBID:" + dbId + " error:" + e.getMessage());
626             this.printJson(response, success.toString());
627             return;
628         } finally {
629             SpObserver.setDBtoInstance();
630         }
631     }
632
633     /**
634      * 清空购物车
635      * @param request
636      * @param response
637      */
638     @RequestMapping(params = "m=delall")
639     public void delAll(HttpServletRequest request, HttpServletResponse response) {
640         HttpSession session = request.getSession();
641         String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
642
643         String sessionId = session.getId();
644         String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? ""
645                 : (String) session.getAttribute(SessionKey.USERCODE));
646         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
647                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
648         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
649                 : (String) session.getAttribute(SettingKey.CLTCODE));
650         // String cltName = (session.getAttribute(SettingKey.CLTNAME) ==
651         // null?"": (String)session.getAttribute(SettingKey.CLTNAME)) ;
652         try {
653             SpObserver.setDBtoInstance("_" + dbId);// 切换数据源
654             SettingEntity settingEntity = settingIfc.getSettingEntity();
655             //取网店 shopcccode
656             ShopCcCodeEntity shopCcCodeEntity = ShopCcCode.getShopCcCode(settingEntity,request);
657             
658             CurrencyEntity currencyEntity = currencyIfc.getUserCurrency(userCode);
659             //userCode, sessionId, openId, cltCode,shopCcCodeEntity.getShopCcCode()
660             cartIfc.delAllCart(userCode, sessionId, openId);
661             List<CartEntity> list = cartIfc.getCartList(userCode, sessionId, openId, cltCode,shopCcCodeEntity.getShopCcCode()); // 重新取一次数,确保购物车显示正确
662             
663             //double totalQuantity = (list!=null&&list.size()>0?list.get(0).getTotalQuantity():0);
664             //double totalWeight = (list!=null&&list.size()>0?list.get(0).getTotalWeight():0);
665             
666             double totalAmount = (list!=null&&list.size()>0?list.get(0).getTotalAmount():0) ;
667             JsonObject success = new JsonObject();
668             success.addProperty("total", list.size() + "个商品"
669                     + (settingEntity.isShowPrice() ? " - " + currencyEntity.getCurrencySign() + totalAmount : ""));
670             SettingKey.setCartHintMsg(session, "您已成功更新了购物车!");
671             success.addProperty("cart-num",(list!=null?list.size():0));
672             this.printJson(response, success.toString());
673         }catch (Exception e) {
674             e.printStackTrace();
675             JsonObject success = new JsonObject();
676             success.addProperty("error","SpObserver.getCurrentInstance():" + SpObserver.getCurrentInstance()
677             + " SessionKey.SHOPPING_DBID:" + dbId + " error:" + e.getMessage());
678             this.printJson(response, success.toString());
679             return;
680         } finally {
681             SpObserver.setDBtoInstance();
682         }
683     }
684
685     /**
686      * 加入购物车
687      * @param request
688      * @param response
689      */
690     @RequestMapping(params = "m=add")
691     public void add(HttpServletRequest request, HttpServletResponse response) {
692         String hostUrl = SettingKey.getHostUrl(request);
693         // 将微信corpid组装成url
694         String wxQueryString = SettingKey.getQueryStringByWx(request);
695         String action = request.getParameter("action") ;
696
697         HttpSession session = request.getSession();
698         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
699
700         String sessionId = session.getId();
701         String userCode = (session.getAttribute(SessionKey.HRCODE) == null ? ""
702                 : (String) session.getAttribute(SessionKey.HRCODE));
703         String userName = (session.getAttribute(SessionKey.HRNAME) == null ? ""
704                 : (String) session.getAttribute(SessionKey.HRNAME));
705         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
706                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
707
708         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
709                 : (String) session.getAttribute(SettingKey.CLTCODE));
710         String cltName = (session.getAttribute(SettingKey.CLTNAME) == null ? ""
711                 : (String) session.getAttribute(SettingKey.CLTNAME));
712
713         String matCode = (request.getParameter(SettingKey.MATCODE) == null ? ""
714                 : request.getParameter(SettingKey.MATCODE));
715         double quantity = (request.getParameter("quantity") == null ? 0
716                 : Double.parseDouble(request.getParameter("quantity")));
717         Integer recurringId = (request.getParameter("recurringid") == null ? 0
718                 : Integer.parseInt(request.getParameter("recurringid")));
719         boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
720         
721         Map<String, String[]> params = request.getParameterMap();
722         JsonObject json = new JsonObject();
723         JsonObject errJson = null;
724         SettingEntity settingEntity = null;
725         try {
726             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
727             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
728             settingEntity = settingIfc.getSettingEntity() ;
729             
730             //取网店 shopcccode
731             ShopCcCodeEntity shopCcCodeEntity = ShopCcCode.getShopCcCode(settingEntity,request);
732
733             // 必录检查
734             errJson = this.checkRequired(params, matCode, hostUrl, wxQueryString,isMoblieBrowser);
735
736             if (errJson != null && errJson.has("error")) {
737                 this.printJson(response, errJson.toString()); 
738                 return;
739             }
740
741             // save
742
743             if (quantity <= 0) {
744                 if (errJson == null) {
745                     errJson = new JsonObject();
746                 }
747                 errJson.addProperty("quantity", "数量必须录入!");
748                 json.add("error", errJson);
749                 this.printJson(response, json.toString());
750                 return;
751             }
752
753             if (quantity > maxQuantity) {
754                 if (errJson == null) {
755                     errJson = new JsonObject();
756                 }
757                 errJson.addProperty("quantity", "数量不能大于 " + maxQuantity +" !");
758                 json.add("error", errJson);
759                 this.printJson(response, json.toString());
760                 return;
761             }
762
763             
764             boolean found = false;
765             for (String key : params.keySet()) {
766                 if (!key.startsWith("option")) {
767                     continue;
768                 }
769
770                 String optionId = key.substring(key.indexOf("[") + 1, key.indexOf("]"));
771                 String[] values = params.get(key);
772                 String value = "";
773                 for (int i = 0; i < values.length; i++) {
774                     value = (value != null && !"".equals(value) ? value + "," : "") + values[i];
775                 }
776                 json.addProperty(optionId, value);
777                 found = true;
778             }
779             String optionStrJson = null;
780             if (found) {
781                 optionStrJson = json.toString();
782             }
783
784             CartEntity cart = new CartEntity();
785             cart.setMatCode(matCode);
786             cart.setCltCode(cltCode);
787             cart.setCltName(cltName);
788
789             // 如果是客户登录了,则设置当前购物车的“主人” 为客户编号
790             if ((cltCode != null && !"".equals(cltCode)) || (openId != null && !"".equals(openId))) {
791                 cart.setUserCode("");
792                 cart.setUserName("");
793                 cart.setSessionId("");
794             } else {
795                 cart.setUserCode(userCode);
796                 cart.setUserName(userName);
797                 cart.setSessionId(sessionId);
798             }
799
800             cart.setRecurringId(recurringId);
801             cart.setOptionJson(optionStrJson);
802             cart.setQuantity(quantity);
803
804             cart.setRefreshPrice(true);
805             cart.setOpenId(openId);
806
807             //MatCodeEntity matCodeEntity = matCodeIfc.getMatCode(matCode,shopCcCodeEntity.getShopCcCode());
808             String optionText = "";
809             if (optionStrJson != null) {
810                 optionText = getOptionText(optionStrJson);
811             }
812             cart.setOptionText(optionText);
813             cart.setGoShop("goshop".equals(action));   //是否立即下单,购物车中已存在此商品,则直接更新购物车中的数量为本次数量,不要累加这个数量
814             
815             
816             String skuId1 = request.getParameter("skuId1") ;
817             String skuId2 = request.getParameter("skuId2") ;
818             String skuId3 = request.getParameter("skuId3") ;
819             String skuId4 = request.getParameter("skuId4") ;
820             String skuId5 = request.getParameter("skuId5") ;
821             String skuId6 = request.getParameter("skuId6") ;
822             String skuId7 = request.getParameter("skuId7") ;
823             String skuId8 = request.getParameter("skuId8") ;
824             String skuId9 = request.getParameter("skuId9") ;
825             String skuId10 = request.getParameter("skuId10");
826             cart.setSkuId1(skuId1==null||"".equals(skuId1)?null:Integer.parseInt(skuId1))
827             .setSkuId2(skuId2==null||"".equals(skuId2)?null:Integer.parseInt(skuId2))
828             .setSkuId3(skuId3==null||"".equals(skuId3)?null:Integer.parseInt(skuId3))
829             .setSkuId4(skuId4==null||"".equals(skuId4)?null:Integer.parseInt(skuId4))
830             .setSkuId5(skuId5==null||"".equals(skuId5)?null:Integer.parseInt(skuId5))
831             .setSkuId6(skuId6==null||"".equals(skuId6)?null:Integer.parseInt(skuId6))
832             .setSkuId7(skuId7==null||"".equals(skuId7)?null:Integer.parseInt(skuId7))
833             .setSkuId8(skuId8==null||"".equals(skuId8)?null:Integer.parseInt(skuId8))
834             .setSkuId9(skuId9==null||"".equals(skuId9)?null:Integer.parseInt(skuId9))
835             .setSkuId10(skuId10==null||"".equals(skuId10)?null:Integer.parseInt(skuId10));
836             
837             Integer cartId = cartIfc.addToCart(cart);
838             if (cartId != null) {
839                 //立即下单
840                 String selectedCattIds = (String)session.getAttribute(SettingKey.CHECKBOX);
841                 if (selectedCattIds == null||"goshop".equals(action))  {
842                     selectedCattIds = ";" +cartId + ";" ;
843                 }else if (selectedCattIds.indexOf(cartId+";") <=0) {
844                     selectedCattIds += cartId +";" ;
845                 }
846                 session.setAttribute(SettingKey.CHECKBOX, selectedCattIds);
847             }
848             
849             List<CartEntity> cartList = cartIfc.getCartList(userCode, sessionId, cart.getOpenId(), cltCode,shopCcCodeEntity.getShopCcCode()); // 重新取一次数,确保购物车显示正确
850             CurrencyEntity currencyEntity = currencyIfc.getUserCurrency(userCode);
851
852             /******** 购物车 开始清单输出 *************/
853             DecimalFormat df = new DecimalFormat("0.00");
854             double selectTotalAmount = 0 ;  //给 footer.jsp 页面使用,用于赋初值
855             int selectItems = 0 ;    //给 footer.jsp 页面使用,用于赋初值
856             int cartItems = 0 ; //给 footer.jsp 页面使用,用于赋初值
857             if (cartList!= null) {
858                 cartItems = cartList.size();
859             }
860             
861             //取已经选择的金额数 
862             List<CartEntity> selectedCartList = cartList.stream().filter((CartEntity c)->c.isSelected()).collect(Collectors.toList());
863             for (int i = 0; selectedCartList!=null&&i < selectedCartList.size(); i++) {
864                 selectTotalAmount += selectedCartList.get(i).getAmount() ;
865                 selectItems ++ ;
866             }
867             
868             //组装 json array 输出 
869             JsonArray cartListJsonArray = this.getCartJsonArray(request, settingEntity, cartList, currencyEntity, dataSourceEntity);
870             json.add("list", cartListJsonArray);
871             
872             json.addProperty("SelectTotalAmount",df.format(selectTotalAmount));
873             json.addProperty("SelectItems", selectItems);
874             json.addProperty("CartItems", cartItems);
875             /******** 购物车 结束清单输出 *************/
876             
877             
878             double totalQuantity = (cartList!=null&&cartList.size()>0?cartList.get(0).getTotalQuantity():0);
879             //double totalWeight = (list!=null&&list.size()>0?list.get(0).getTotalWeight():0);
880             
881             double totalAmount = (cartList!=null&&cartList.size()>0?cartList.get(0).getTotalAmount():0) ;
882             
883             //取刚才加入购物车的物料信息
884             List<CartEntity> matCodeEntityList = cartList.stream().filter((CartEntity c)->c.getCartId().equals(cartId)).collect(Collectors.toList());
885             CartEntity cartEntity = matCodeEntityList!=null && matCodeEntityList.size()>0 ? matCodeEntityList.get(0):null;
886             
887             json.addProperty("success", "成功添加商品 <a href=\"" + hostUrl + SettingKey.getMatCodeUrl(null, matCode,isMoblieBrowser)
888                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "&" + wxQueryString) + "\">"
889                     + (cartEntity == null ? "" : (settingEntity.isShowMatName()? cartEntity.getMatName():"商品")) + "</a>到您的 <a href=\"" + hostUrl
890                     + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"cart/" + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString)
891                     + "\">购物车</a>!");
892             json.addProperty("toastmessage", "成功添加商品到您的 <a href=\"" + hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"cart/"
893                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString) + "\">购物车</a>!");
894             json.addProperty("total", (cartList!=null?cartList.size():0) + "种商品(共" + (new Double(totalQuantity)).intValue()
895                     + "件)"
896                     + (settingEntity.isShowPrice() ? " - " + currencyEntity.getCurrencySign() + totalAmount : ""));
897             json.addProperty("cart-num",(cartList!=null?cartList.size():0));
898             //如果是立即购买
899             if (action != null && "goshop".equals(action)) {
900                 json.addProperty("redirect",hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"checkoutnew/?selectedCartIds="+cartId + (wxQueryString == null || "".equals(wxQueryString) ? "" : "&" + wxQueryString));
901             }
902             json.addProperty("CartId", cartId);
903             this.printJson(response, json.toString());
904             return;
905         } catch (Exception e) {
906             e.printStackTrace();
907             errJson.addProperty("warning", e.getCause() !=null? e.getCause().getMessage():e.getMessage());
908             json.add("error", errJson);
909             this.printJson(response, json.toString());
910             return;
911         } finally {
912             SpObserver.setDBtoInstance();
913         }
914     }
915
916     
917     @RequestMapping(params = "m=addByPicture")
918     public void addByPicture(HttpServletRequest request, HttpServletResponse response) {
919         String hostUrl = SettingKey.getHostUrl(request);
920         // 将微信corpid组装成url
921         String wxQueryString = SettingKey.getQueryStringByWx(request);
922         String action = request.getParameter("action") ;
923
924         HttpSession session = request.getSession();
925         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
926
927         String sessionId = session.getId();
928         String userCode = (session.getAttribute(SessionKey.HRCODE) == null ? ""
929                 : (String) session.getAttribute(SessionKey.HRCODE));
930         String userName = (session.getAttribute(SessionKey.HRNAME) == null ? ""
931                 : (String) session.getAttribute(SessionKey.HRNAME));
932         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
933                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
934
935         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
936                 : (String) session.getAttribute(SettingKey.CLTCODE));
937         String cltName = (session.getAttribute(SettingKey.CLTNAME) == null ? ""
938                 : (String) session.getAttribute(SettingKey.CLTNAME));
939
940         String matCode = (request.getParameter(SettingKey.MATCODE) == null ? ""
941                 : request.getParameter(SettingKey.MATCODE));
942         double quantity = (request.getParameter("quantity") == null ? 0
943                 : Double.parseDouble(request.getParameter("quantity")));
944
945         boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
946         
947
948         JsonObject json = new JsonObject();
949         JsonObject errJson = null;
950         SettingEntity settingEntity = null;
951         try {
952             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
953             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
954             settingEntity = settingIfc.getSettingEntity() ;
955             
956             //取网店 shopcccode
957             //ShopCcCodeEntity shopCcCodeEntity = ShopCcCode.getShopCcCode(settingEntity,request);
958
959             
960             // save
961
962             if (quantity <= 0) {
963                 if (errJson == null) {
964                     errJson = new JsonObject();
965                 }
966                 errJson.addProperty("quantity", "数量必须录入!");
967                 json.add("error", errJson);
968                 this.printJson(response, json.toString());
969                 return;
970             }
971
972             if (quantity > maxQuantity) {
973                 if (errJson == null) {
974                     errJson = new JsonObject();
975                 }
976                 errJson.addProperty("quantity", "数量不能大于 " + maxQuantity +" !");
977                 json.add("error", errJson);
978                 this.printJson(response, json.toString());
979                 return;
980             }
981             
982
983             CartEntity cart = new CartEntity();
984             cart.setMatCode(matCode);
985             cart.setCltCode(cltCode);
986             cart.setCltName(cltName);
987
988             // 如果是客户登录了,则设置当前购物车的“主人” 为客户编号
989             if ((cltCode != null && !"".equals(cltCode)) || (openId != null && !"".equals(openId))) {
990                 cart.setUserCode("");
991                 cart.setUserName("");
992                 cart.setSessionId("");
993             } else {
994                 cart.setUserCode(userCode);
995                 cart.setUserName(userName);
996                 cart.setSessionId(sessionId);
997             }
998
999             MatCodeEntity matCodeEntity = matCodeIfc.getMatCodeByPicture(matCode);
1000             cart.setPrice(matCodeEntity.getSalesPriceByPicture());
1001             cart.setQuantity(quantity);
1002
1003             cart.setRefreshPrice(true);
1004             cart.setOpenId(openId);
1005
1006             Integer cartId = cartIfc.saveCartByPicture(cart);
1007             if (cartId != null) {
1008                 //立即下单
1009                 String checkbox = (String)session.getAttribute(SettingKey.CHECKBOXBYPICTURE);
1010                 if (checkbox == null||"goshop".equals(action))  {
1011                     checkbox = ";" +cartId + ";" ;
1012                 }else if (checkbox.indexOf(cartId+";") <=0) {
1013                     checkbox += cartId +";" ;
1014                 }
1015                 session.setAttribute(SettingKey.CHECKBOXBYPICTURE, checkbox);
1016             }
1017             
1018             List<CartEntity> list = cartIfc.getCartsByPicture( cltCode); // 重新取一次数,确保购物车显示正确
1019             CurrencyEntity currencyEntity = currencyIfc.getUserCurrency(userCode);
1020
1021             double totalQuantity = (list!=null&&list.size()>0?list.get(0).getTotalQuantity():0);
1022             //double totalWeight = (list!=null&&list.size()>0?list.get(0).getTotalWeight():0);
1023             
1024             double totalAmount = (list!=null&&list.size()>0?list.get(0).getTotalAmount():0) ;
1025             
1026             
1027             JsonObject success = new JsonObject();
1028             success.addProperty("success", "成功添加商品 <a href=\"" + hostUrl + SettingKey.getMatCodeUrl(null, matCode,isMoblieBrowser)
1029                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "&" + wxQueryString) + "\">"
1030                     + (matCodeEntity == null ? "" : (settingEntity.isShowMatName()? matCodeEntity.getMatName():"商品")) + "</a>到您的 <a href=\"" + hostUrl
1031                     + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"purchase/cart.jsp" + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString)
1032                     + "\">购物车</a>!");
1033             success.addProperty("toastmessage", "成功添加商品到您的 <a href=\"" + hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"purchase/cart.jsp"
1034                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString) + "\">购物车</a>!");
1035             success.addProperty("total", (list!=null?list.size():0) + "种商品(共" + (new Double(totalQuantity)).intValue()
1036                     + "件)"
1037                     + (settingEntity.isShowPrice() ? " - " + currencyEntity.getCurrencySign() + totalAmount : ""));
1038             success.addProperty("cart-num",(list!=null?list.size():0));
1039             //如果是立即购买
1040             if (action != null && "goshop".equals(action)) {
1041                 success.addProperty("redirect",hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"purchase/checkout.jsp"+ (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString));
1042             }
1043             this.printJson(response, success.toString());
1044             return;
1045         } catch (Exception e) {
1046             e.printStackTrace();
1047             errJson.addProperty("warning", e.getCause() !=null? e.getCause().getMessage():e.getMessage());
1048             json.add("error", errJson);
1049             this.printJson(response, json.toString());
1050             return;
1051         } finally {
1052             SpObserver.setDBtoInstance();
1053         }
1054     }
1055
1056     /**
1057      * 获取购物车 json 数据格式(小程序需要用到)
1058      * @param request
1059      * @param response
1060      */
1061     @RequestMapping(params = "m=getCartList")
1062     public void getCartList(HttpServletRequest request, HttpServletResponse response) {
1063         HttpSession session = request.getSession();
1064         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
1065         String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? "" 
1066                 : (String)session.getAttribute(SessionKey.USERCODE));
1067         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? "" 
1068                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID) ) ;
1069         String sessionId = session.getId();
1070         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null?"": (String)session.getAttribute(SettingKey.CLTCODE)) ;
1071         
1072         //String hostUrl = SettingKey.getHostUrl(request) ;
1073         //将微信corpid组装成url
1074         //String wxQueryString = SettingKey.getQueryStringByWx(request);
1075         
1076         JsonObject json = new JsonObject();
1077         JsonObject errJson = new JsonObject();
1078         //JsonObject jsonObject = new JsonObject();
1079         //Gson gson = new Gson();
1080         
1081         
1082         SettingEntity settingEntity = null ;
1083         CurrencyEntity currencyEntity = null;
1084         List<CartEntity> cartList = null;
1085         //boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
1086         //String checkboxs = (String)session.getAttribute(SettingKey.CHECKBOX);
1087         try {
1088             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
1089             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
1090             settingEntity = settingIfc.getSettingEntity() ;
1091             //取网店 shopcccode
1092             ShopCcCodeEntity shopCcCodeEntity = ShopCcCode.getShopCcCode(settingEntity,request);
1093             
1094             currencyEntity = currencyIfc.getUserCurrency(userCode);
1095             cartList = cartIfc.getCartList(userCode, sessionId,openId,cltCode,shopCcCodeEntity.getShopCcCode());    
1096             
1097             /******** 购物车 开始清单输出 *************/
1098             DecimalFormat df = new DecimalFormat("0.00");
1099             double selectTotalAmount = 0 ;  //给 footer.jsp 页面使用,用于赋初值
1100             int selectItems = 0 ;    //给 footer.jsp 页面使用,用于赋初值
1101             int cartItems = 0 ; //给 footer.jsp 页面使用,用于赋初值
1102             if (cartList!= null) {
1103                 cartItems = cartList.size();
1104             }
1105             
1106             //取已经选择的金额数 
1107             List<CartEntity> selectedCartList = cartList.stream().filter((CartEntity c)->c.isSelected()).collect(Collectors.toList());
1108             for (int i = 0; selectedCartList!=null&&i < selectedCartList.size(); i++) {
1109                 selectTotalAmount += selectedCartList.get(i).getAmount() ;
1110                 selectItems ++ ;
1111             }
1112             
1113             //组装 json array 输出 
1114             JsonArray cartListJsonArray = this.getCartJsonArray(request, settingEntity, cartList, currencyEntity, dataSourceEntity);
1115             json.add("list", cartListJsonArray);
1116             
1117             json.addProperty("SelectTotalAmount",df.format(selectTotalAmount));
1118             json.addProperty("SelectItems", selectItems);
1119             json.addProperty("CartItems", cartItems);
1120             /******** 购物车 结束清单输出 *************/
1121             
1122             
1123             //json.add("list", jsonObject);
1124             this.printJson(response, json.toString());
1125             return;
1126
1127         } catch (DataAccessException e) {
1128             e.printStackTrace();
1129             errJson.addProperty("warning", (e.getCause()!=null? e.getCause().getMessage():e.getMessage()));
1130             json.add("error", errJson);
1131             this.printJson(response, json.toString());
1132             return;
1133         } catch (Exception e) {
1134             e.printStackTrace();
1135             errJson.addProperty("warning", (e.getCause()!=null? e.getCause().getMessage():e.getMessage()));
1136             json.add("error", errJson);
1137             this.printJson(response, json.toString());
1138             return;
1139         } finally {
1140             SpObserver.setDBtoInstance();
1141         }
1142     }
1143     
1144     private JsonArray getCartJsonArray(HttpServletRequest request,SettingEntity settingEntity,List<CartEntity> cartList,CurrencyEntity currencyEntity,DataSourceEntity dataSourceEntity) {
1145         JsonArray cartListJsonArray = new JsonArray();
1146         String hostUrl = SettingKey.getHostUrl(request) ;
1147         //将微信corpid组装成url
1148         String wxQueryString = SettingKey.getQueryStringByWx(request);
1149         boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
1150         for (int i = 0 ; cartList!= null && i < cartList.size();i++) {
1151             CartEntity cartEntity = cartList.get(i);
1152             //boolean isChecked = (SettingKey.isExistsCheckbox(checkboxs, cartEntity.getCartId()+"")?true:false) ;
1153             boolean isChecked = cartEntity.isSelected() ;
1154 //                if (isChecked) {
1155 //                    if (cartEntity.getAmount()!=null) {
1156 //                        selectTotalAmount += cartEntity.getAmount() ;
1157 //                }
1158 //                selectItems ++ ;
1159 //            }
1160                 JsonObject cartEntityJsonObject = new JsonObject();
1161                 if (settingEntity.getDefaultShopCcCode()!=null&&!"".equals(settingEntity.getDefaultShopCcCode())){
1162                     cartEntityJsonObject.addProperty("ShopCcCode", cartEntity.getShopCcCode());
1163                     cartEntityJsonObject.addProperty("ShopCcName", cartEntity.getShopCcName());
1164                 }
1165                 cartEntityJsonObject.addProperty("CartId", cartEntity.getCartId());
1166                 cartEntityJsonObject.addProperty("isChecked",isChecked) ;
1167                 //最小起订数量
1168                 cartEntityJsonObject.addProperty("Mininum", cartEntity.getMininum());
1169                 
1170                 String url = hostUrl + SettingKey.getMatCodeUrl("", cartEntity.getMatCode(), isMoblieBrowser)
1171                         + (wxQueryString == null || "".equals(wxQueryString) ? "" : "&" + wxQueryString);
1172
1173                 cartEntityJsonObject.addProperty("url", url);
1174               //主图片
1175               cartEntityJsonObject.addProperty("PhotoPath", SettingKey.getUrl(hostUrl, cartEntity.getPhotoPathUrl(),  dataSourceEntity.getDbId()+"",null) ) ;
1176                 //                    cartEntityJsonObject.addProperty("PhotoPath",
1177 //                      imgData.getImageUrl(cartEntity.getPhotoPath(), settingEntity.getImageProductWidth(),
1178 //                              settingEntity.getImageProductHeight(), settingEntity.isShowProductOrgImage(),
1179 //                              settingEntity.isFromCached(), request)
1180 //                              + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString));
1181             
1182               if (settingEntity.isShowBrand()) {
1183                   cartEntityJsonObject.addProperty("Brand", cartEntity.getBrand());
1184               }
1185             if (settingEntity.isShowMatName()) {
1186                 cartEntityJsonObject.addProperty("MatName", cartEntity.getMatName());
1187             }
1188
1189             cartEntityJsonObject.addProperty("MatCode", cartEntity.getMatCode());
1190             cartEntityJsonObject.addProperty("isShowMatCode", settingEntity.isShowMatCode());
1191             cartEntityJsonObject.addProperty("isShowMatName", settingEntity.isShowMatName());
1192             cartEntityJsonObject.addProperty("isShowSpecial", settingEntity.isShowSpecial());
1193             cartEntityJsonObject.addProperty("isShowPrice", settingEntity.isShowPrice());
1194             cartEntityJsonObject.addProperty("ShopMatCode", cartEntity.getShopMatCode());
1195             cartEntityJsonObject.addProperty("isShowPoints", settingEntity.isShowPoints());
1196             cartEntityJsonObject.addProperty("isShowBrand", settingEntity.isShowBrand());
1197             cartEntityJsonObject.addProperty("StockDisplay", settingEntity.getStockDisplay());
1198             
1199             if (settingEntity.isShowSpecial()) {
1200                 cartEntityJsonObject.addProperty("Special", cartEntity.getSpecial());
1201             }
1202             if (settingEntity.isStartupMatName2()) {
1203                 cartEntityJsonObject.addProperty("MatName2Label", settingEntity.getMatName2Label());
1204                 cartEntityJsonObject.addProperty("MatName2", cartEntity.getMatName2());
1205             }
1206
1207             if (settingEntity.isStartupMatName3()) {
1208                 cartEntityJsonObject.addProperty("MatName3Label", settingEntity.getMatName3Label());
1209                 cartEntityJsonObject.addProperty("MatName3", cartEntity.getMatName3());
1210             }
1211
1212             if (settingEntity.isStartupMatName4()) {
1213                 cartEntityJsonObject.addProperty("MatName4Label", settingEntity.getMatName4Label());
1214                 cartEntityJsonObject.addProperty("MatName4", cartEntity.getMatName4());
1215             }
1216             
1217             if (cartEntity.getOptionJson() !=null && !"".equals(cartEntity.getOptionJson()))  {
1218                 //Map<String,Object> lists=gson.fromJson(cartEntity.getOptionJson(),new TypeToken<Map<String,Object>>(){}.getType());
1219                 cartEntityJsonObject.addProperty("OptionJson", cartEntity.getOptionJson()) ; //gson.toJson(settingEntity));
1220             }
1221             
1222             if (settingEntity.isShowPrice()&&cartEntity.getPrice()!=null) {
1223                 cartEntityJsonObject.addProperty("Price", cartEntity.getPrice() ); // 实际价格
1224                 cartEntityJsonObject.addProperty("Currency", currencyEntity.getCurrencySign());
1225                 cartEntityJsonObject.addProperty("CurrencySign", currencyEntity.getCurrencySign());
1226             }
1227             
1228             cartEntityJsonObject.addProperty("Quantity", cartEntity.getQuantity()) ;
1229             
1230             cartEntityJsonObject.addProperty("skuId1", cartEntity.getSkuId1());
1231             cartEntityJsonObject.addProperty("skuName1", cartEntity.getSkuName1());
1232             cartEntityJsonObject.addProperty("skuId2", cartEntity.getSkuId2());
1233             cartEntityJsonObject.addProperty("skuName2", cartEntity.getSkuName2());
1234             cartEntityJsonObject.addProperty("skuId3", cartEntity.getSkuId3());
1235             cartEntityJsonObject.addProperty("skuName3", cartEntity.getSkuName3());
1236             cartEntityJsonObject.addProperty("skuId4", cartEntity.getSkuId4());
1237             cartEntityJsonObject.addProperty("skuName4", cartEntity.getSkuName4());
1238             cartEntityJsonObject.addProperty("skuId5", cartEntity.getSkuId5());
1239             cartEntityJsonObject.addProperty("skuName5", cartEntity.getSkuName5());
1240             cartEntityJsonObject.addProperty("skuId6", cartEntity.getSkuId6());
1241             cartEntityJsonObject.addProperty("skuName6", cartEntity.getSkuName6());
1242             cartEntityJsonObject.addProperty("skuId7", cartEntity.getSkuId7());
1243             cartEntityJsonObject.addProperty("skuName7", cartEntity.getSkuName7());
1244             cartEntityJsonObject.addProperty("skuId8", cartEntity.getSkuId8());
1245             cartEntityJsonObject.addProperty("skuName8", cartEntity.getSkuName8());
1246             cartEntityJsonObject.addProperty("skuId9", cartEntity.getSkuId9());
1247             cartEntityJsonObject.addProperty("skuName9", cartEntity.getSkuName9());
1248             cartEntityJsonObject.addProperty("skuId10", cartEntity.getSkuId10());
1249             cartEntityJsonObject.addProperty("skuName10", cartEntity.getSkuName10());
1250             
1251             cartListJsonArray.add(cartEntityJsonObject);
1252         }
1253         return cartListJsonArray ;
1254     }
1255     
1256     /**
1257      * 再次购买
1258      * @param request
1259      * @param response
1260      */
1261     @RequestMapping(params = "m=readd") // 从订单明细行再次生成购物车记录(再次购买)
1262     public void readd(HttpServletRequest request, HttpServletResponse response) {
1263
1264         String hostUrl = SettingKey.getHostUrl(request);
1265         // 将微信corpid组装成url
1266         String wxQueryString = SettingKey.getQueryStringByWx(request);
1267
1268         HttpSession session = request.getSession();
1269         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
1270
1271         String sessionId = session.getId();
1272         String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? ""
1273                 : (String) session.getAttribute(SessionKey.USERCODE));
1274         String userName = (session.getAttribute(SessionKey.USERNAME) == null ? ""
1275                 : (String) session.getAttribute(SessionKey.USERNAME));
1276         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
1277                 : (String) session.getAttribute(SettingKey.CLTCODE));
1278         String cltName = (session.getAttribute(SettingKey.CLTNAME) == null ? ""
1279                 : (String) session.getAttribute(SettingKey.CLTNAME));
1280         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
1281                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
1282
1283         String docCode = (request.getParameter(SettingKey.DOCCODE) == null ? ""
1284                 : request.getParameter(SettingKey.DOCCODE));
1285         String rowId = (request.getParameter(SettingKey.ROWID) == null ? "" : request.getParameter(SettingKey.ROWID));
1286         boolean isMoblieBrowser = SettingKey.isMoblieBrowser(request);
1287         
1288         if (docCode == null || rowId == null) {
1289             SettingKey.setCartHintMsg(session, "错误的引用,订单行不存在,请重新选择!");
1290             this.print(response, SettingKey.getRedirectUrl(hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"account/order.jsp"
1291                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString)));
1292             return;
1293         }
1294         OrderDetailEntity orderDetailEntity = null;
1295         SettingEntity settingEntity = null ;
1296         try {
1297             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
1298             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
1299             settingEntity = settingIfc.getSettingEntity();
1300             orderDetailEntity = orderIfc.getOrderDetailEntity(docCode, rowId);
1301             if (orderDetailEntity == null) {
1302                 SettingKey.setCartHintMsg(session, "订单行不存在,请重新选择!");
1303                 this.print(response,
1304                         SettingKey.getRedirectUrl(hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"account/orderdetail.jsp?" + SettingKey.DOCCODE
1305                                 + "=" + docCode + (wxQueryString == null || "".equals(wxQueryString) ? "": "&" + wxQueryString)));
1306                 return;
1307             }
1308
1309             // save
1310             CartEntity cart = new CartEntity();
1311             cart.setMatCode(orderDetailEntity.getMatCode());
1312             cart.setCltCode(cltCode);
1313             cart.setCltName(cltName);
1314
1315             // 如果是客户登录了,则设置当前购物车的“主人” 为客户编号
1316             if ((cltCode != null && !"".equals(cltCode)) || (openId != null && !"".equals(openId))) {
1317                 cart.setUserCode("");
1318                 cart.setUserName("");
1319                 cart.setSessionId("");
1320             } else {
1321                 cart.setUserCode(userCode);
1322                 cart.setUserName(userName);
1323                 cart.setSessionId(sessionId);
1324             }
1325
1326             cart.setRecurringId(null);
1327             cart.setOptionJson(orderDetailEntity.getOptionJson());
1328             cart.setQuantity(orderDetailEntity.getDigit());
1329             cart.setOpenId(openId);
1330
1331             String optionText = "";
1332             if (orderDetailEntity.getOptionJson() != null) {
1333                 optionText = getOptionText(orderDetailEntity.getOptionJson());
1334             }
1335
1336             cart.setOptionText(optionText);
1337             String skuId1 = request.getParameter("skuId1") ;
1338             String skuId2 = request.getParameter("skuId2") ;
1339             String skuId3 = request.getParameter("skuId3") ;
1340             String skuId4 = request.getParameter("skuId4") ;
1341             String skuId5 = request.getParameter("skuId5") ;
1342             String skuId6 = request.getParameter("skuId6") ;
1343             String skuId7 = request.getParameter("skuId7") ;
1344             String skuId8 = request.getParameter("skuId8") ;
1345             String skuId9 = request.getParameter("skuId9") ;
1346             String skuId10 = request.getParameter("skuId10");
1347             cart.setSkuId1(skuId1==null||"".equals(skuId1)?null:Integer.parseInt(skuId1))
1348             .setSkuId2(skuId2==null||"".equals(skuId2)?null:Integer.parseInt(skuId2))
1349             .setSkuId3(skuId3==null||"".equals(skuId3)?null:Integer.parseInt(skuId3))
1350             .setSkuId4(skuId4==null||"".equals(skuId4)?null:Integer.parseInt(skuId4))
1351             .setSkuId5(skuId5==null||"".equals(skuId5)?null:Integer.parseInt(skuId5))
1352             .setSkuId6(skuId6==null||"".equals(skuId6)?null:Integer.parseInt(skuId6))
1353             .setSkuId7(skuId7==null||"".equals(skuId7)?null:Integer.parseInt(skuId7))
1354             .setSkuId8(skuId8==null||"".equals(skuId8)?null:Integer.parseInt(skuId8))
1355             .setSkuId9(skuId9==null||"".equals(skuId9)?null:Integer.parseInt(skuId9))
1356             .setSkuId10(skuId10==null||"".equals(skuId10)?null:Integer.parseInt(skuId10));
1357             
1358             Integer cartId = cartIfc.addToCart(cart);
1359             session.setAttribute(SettingKey.CHECKBOX, cartId+"");   //将选择的购物车保存到会话中,供页面选择需要  
1360             String cartHint = "成功添加商品 <a href=\"" + hostUrl
1361                     + SettingKey.getMatCodeUrl(null, orderDetailEntity.getMatCode(),isMoblieBrowser)
1362                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "&" + wxQueryString) + "\">"
1363                     + (orderDetailEntity.getMatName() == null ? "" : (settingEntity.isShowMatName()? orderDetailEntity.getMatName():"商品"))
1364                     + "</a>到您的 <a href=\"" + hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"cart/"
1365                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString) + "\">购物车</a>!";
1366             SettingKey.setCartHintMsg(session, cartHint);
1367         } catch (DataAccessException e) {
1368             e.printStackTrace();
1369             String cartHint = "添加商品失败,失败原因:" + e.getCause().getMessage() + ",查看原商品信息请点击 <a href=\"" + hostUrl
1370                     + SettingKey.getMatCodeUrl(null, orderDetailEntity.getMatCode(),isMoblieBrowser)
1371                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "&" + wxQueryString) + "\">"
1372                     + (orderDetailEntity.getMatName() == null ? "" : (settingEntity.isShowMatName()? orderDetailEntity.getMatName():"商品"))
1373                     + "</a>到您的 <a href=\"" + hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"cart/"
1374                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString) + "\">购物车</a>!";
1375             SettingKey.setCartHintMsg(session, cartHint);
1376         }catch (Exception e) {
1377             e.printStackTrace();
1378             String cartHint = "添加商品失败,失败原因:" + e.getCause().getMessage() + ",查看原商品信息请点击 <a href=\"" + hostUrl
1379                     + SettingKey.getMatCodeUrl(null, orderDetailEntity.getMatCode(),isMoblieBrowser)
1380                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "&" + wxQueryString) + "\">"
1381                     + (orderDetailEntity.getMatName() == null ? "" : (settingEntity.isShowMatName()? orderDetailEntity.getMatName():"商品"))
1382                     + "</a>到您的 <a href=\"" + hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"cart/"
1383                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString) + "\">购物车</a>!";
1384             SettingKey.setCartHintMsg(session, cartHint);
1385         } finally {
1386             SpObserver.setDBtoInstance();
1387         }
1388         this.print(response,
1389                 SettingKey.getRedirectUrl(hostUrl + "/shopping/" + (isMoblieBrowser?"mobile/":"")+"cart/index.jsp" 
1390                         + (wxQueryString == null || "".equals(wxQueryString) ? "" : "?" + wxQueryString)));
1391         return;
1392     }
1393
1394     public String getOptionText(String optionStr) {
1395         String ret = "";
1396         Map<String, Object> lists = null;
1397         if (optionStr != null && !"".equals(optionStr)) {
1398             lists = gson.fromJson(optionStr, new TypeToken<Map<String, Object>>() {
1399             }.getType());
1400             for (Entry<String, Object> entry : lists.entrySet()) {
1401                 ret += cartIfc.getOptionStr(Integer.parseInt(entry.getKey()), (String) entry.getValue()) + "\n";
1402             }
1403         }
1404         return ret;
1405     }
1406
1407     // 检查必录选项
1408     // {"error":{"option":{"228":"aa \u8981\u6c42\uff01","218":"Radio
1409     // \u8981\u6c42\uff01","223":"Checkbox \u8981\u6c42\uff01","217":"Select
1410     // \u8981\u6c42\uff01","209":"Textarea \u8981\u6c42\uff01","222":"File
1411     // \u8981\u6c42\uff01"}},"redirect":"http:\/\/localhost\/index.php?route=product\/product&product_id=42"}
1412     public JsonObject checkRequired(Map<String, String[]> params, String matCode, String hostUrl,
1413             String wxQueryString,boolean isMoblieBrowser) {
1414         List<OptionEntity> list = matOptionIfc.getOptionEntityRequired(matCode);
1415
1416         JsonObject msgJson = null;
1417         boolean found = false;
1418
1419         for (int k = 0; list != null && k < list.size(); k++) {
1420             found = false;
1421             OptionEntity optionEntity = list.get(k);
1422             for (String key : params.keySet()) {
1423                 if (!key.startsWith("option")) {
1424                     continue;
1425                 }
1426                 String optionId = key.substring(key.indexOf("[") + 1, key.indexOf("]"));
1427                 if (optionId != null && !optionId.equals(optionEntity.getOptionId().toString())) {
1428                     continue;
1429                 }
1430
1431                 String[] values = params.get(key);
1432                 for (int i = 0; i < values.length; i++) {
1433                     if (values[i] != null && !"".equals(values[i])) {
1434                         found = true;
1435                         break;
1436                     }
1437                 }
1438                 if (found)
1439                     break;
1440             }
1441
1442             // 没有找到,则提示必录
1443             if (!found) {
1444                 String hintMsg = optionEntity.getOptionName() + "  要求!";
1445                 if (msgJson == null) {
1446                     msgJson = new JsonObject();
1447                 }
1448                 msgJson.addProperty(optionEntity.getOptionId().toString(), hintMsg);
1449             }
1450         }
1451
1452         if (msgJson != null) {
1453             JsonObject json = new JsonObject();
1454             JsonObject optionJson = new JsonObject();
1455             optionJson.add("option", msgJson);
1456             json.add("error", optionJson);
1457             json.addProperty("redirect", hostUrl + SettingKey.getMatCodeUrl(null, matCode,isMoblieBrowser)
1458                     + (wxQueryString == null || "".equals(wxQueryString) ? "" : "&" + wxQueryString));
1459             return json;
1460         } else {
1461             return null;
1462         }
1463     }
1464
1465     @RequestMapping(params = "m=info")
1466     public void info(HttpServletRequest request, HttpServletResponse response) {
1467         response.setContentType("text/html;charset=utf-8");
1468         response.setStatus(HttpServletResponse.SC_OK);
1469         HttpSession session = request.getSession();
1470         String sessionId = session.getId();
1471         //String dbId = (String) session.getAttribute(SessionKey.SHOPPING_DBID);
1472
1473         String userCode = (session.getAttribute(SessionKey.USERCODE) == null ? ""
1474                 : (String) session.getAttribute(SessionKey.USERCODE));
1475         String openId = (session.getAttribute(SessionKey.WEIXIN_OPENID) == null ? ""
1476                 : (String) session.getAttribute(SessionKey.WEIXIN_OPENID));
1477         String cltCode = (session.getAttribute(SettingKey.CLTCODE) == null ? ""
1478                 : (String) session.getAttribute(SettingKey.CLTCODE));
1479         // String cltName = (session.getAttribute(SettingKey.CLTNAME) ==
1480         // null?"": (String)session.getAttribute(SettingKey.CLTNAME)) ;
1481         JsonObject json = new JsonObject();
1482         JsonObject errJson = new JsonObject();
1483         
1484         String hostUrl = SettingKey.getHostUrl(request);
1485         // 将微信corpid组装成url
1486         String wxQueryString = SettingKey.getQueryStringByWx(request);
1487
1488         // 预优配送费用
1489         Integer freeId = session.getAttribute(SettingKey.FREEID) == null ? null
1490                 : (Integer) session.getAttribute(SettingKey.FREEID);
1491         String freeName = session.getAttribute(SettingKey.FREENAME) == null ? ""
1492                 : (String) session.getAttribute(SettingKey.FREENAME);
1493         double freeCost = 0;
1494         if (freeId != null) {
1495             freeCost = (Double) session.getAttribute(SettingKey.FREECOST);
1496         }
1497         // 优惠劵
1498         String couponCode = session.getAttribute(SettingKey.COUPONCODE) == null ? null
1499                 : (String) session.getAttribute(SettingKey.COUPONCODE);
1500         String couponName = session.getAttribute(SettingKey.COUPONNAME) == null ? ""
1501                 : (String) session.getAttribute(SettingKey.COUPONNAME);
1502         double couponCost = 0;
1503         if (couponCode != null) {
1504             couponCost = (Double) session.getAttribute(SettingKey.COUPONCOST);
1505         }
1506         // 礼品劵
1507         String voucherCode = session.getAttribute(SettingKey.VOUCHERCODE) == null ? null
1508                 : (String) session.getAttribute(SettingKey.VOUCHERCODE);
1509         double voucherCost = 0;
1510         if (voucherCode != null) {
1511             voucherCost = (Double) session.getAttribute(SettingKey.VOUCHERCOST);
1512         }
1513         String ret = null;
1514         try {
1515             DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap( request) ;
1516             SpObserver.setDBtoInstance("_" +dataSourceEntity.getDbId());// 切换数据源
1517             SettingEntity settingEntity = settingIfc.getSettingEntity() ;
1518             //取网店 shopcccode
1519             ShopCcCodeEntity shopCcCodeEntity = ShopCcCode.getShopCcCode(settingEntity,request);
1520             
1521             ret = cartIfc.getCartsHtml(userCode, sessionId, openId, cltCode, hostUrl, freeId, freeCost, freeName,
1522                     couponCode, couponCost, couponName, voucherCode, voucherCost, wxQueryString, shopCcCodeEntity.getShopCcCode(),request);
1523         }catch (Exception e) {
1524             e.printStackTrace();
1525             errJson.addProperty("warning", e.getCause() !=null? e.getCause().getMessage():e.getMessage());
1526             json.add("error", errJson);
1527             this.printJson(response, json.toString());
1528             return;
1529         }finally {
1530             SpObserver.setDBtoInstance();
1531         }
1532
1533         this.print(response, ret);
1534
1535         return;
1536     }
1537
1538 }