ExternalDockPolyApiHandler.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926
  1. package com.iamberry.wechat.handles.polyapi;
  2. import com.alibaba.fastjson.JSON;
  3. import com.iamberry.app.tool.des.MD5;
  4. import com.iamberry.wechat.core.entity.order.Order;
  5. import com.iamberry.wechat.core.entity.order.OrderItem;
  6. import com.iamberry.wechat.core.entity.product.Product;
  7. import com.iamberry.wechat.core.entity.product.ProductColor;
  8. import com.iamberry.wechat.face.order.AdminOrderService;
  9. import com.iamberry.wechat.face.porduct.ProductService;
  10. import com.iamberry.wechat.tools.NameUtils;
  11. import com.iamberry.wechat.tools.ResultInfo;
  12. import com.iamberry.wechat.tools.SendMessageUtil;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Controller;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.ResponseBody;
  19. import javax.servlet.http.HttpServletRequest;
  20. import java.awt.*;
  21. import java.text.ParseException;
  22. import java.text.SimpleDateFormat;
  23. import java.util.ArrayList;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Map;
  27. /**
  28. * 对接菠萝派接口
  29. */
  30. @Controller
  31. public class ExternalDockPolyApiHandler {
  32. private static Logger logger = LoggerFactory.getLogger(ExternalDockPolyApiHandler.class);
  33. @Autowired
  34. private AdminOrderService adminOrderService;
  35. @Autowired
  36. private ProductService productService;
  37. @Autowired
  38. private SendMessageUtil sendMessageUtil;
  39. /**
  40. * DES对称加密
  41. */
  42. private static MD5 md5 = new MD5();
  43. private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  44. /**
  45. * 请求示例:
  46. * appkey=438b2f6ff103422a98a9349507293bb2
  47. * &method=Differ.JH.Business.GetOrder
  48. * &bizcontent={"OrderStatus":"JH_01","PlatOrderNo":"20182270207","StartTime":"2016-07-26 10:59:10","EndTime":"2016-08-02 10:59:10","TimeType":"JH_02","PageIndex":"1","PageSize":"20"}
  49. * &token=9415c33b04d24c7dae320b0185f42fb0
  50. * &sign=347e07a557e2720256e64e1e828eff1b
  51. */
  52. /**
  53. * 请求响应
  54. * @param request
  55. * @return
  56. * @throws Exception
  57. */
  58. @ResponseBody
  59. @RequestMapping("/select_order")
  60. public Map<String,Object> getOrder(HttpServletRequest request) throws Exception {
  61. Map<String,Object> map = new HashMap<String,Object>();
  62. Map<String,Object> requstMap = new HashMap<String,Object>();
  63. try{
  64. requstMap = verification(request);
  65. }catch (Exception e){
  66. map.put("code","40000");
  67. map.put("message","请求未能识别");
  68. map.put("submessage","参数有误");
  69. map.put("numtotalorder",0);
  70. return map;
  71. }
  72. if(requstMap == null ){
  73. map.put("code","40000");
  74. map.put("message","请求未能识别");
  75. map.put("submessage","参数有误");
  76. map.put("numtotalorder",0);
  77. return map;
  78. }
  79. String method = request.getParameter("method");
  80. switch (method){
  81. case "Differ.JH.Business.GetOrder" : //订单下载
  82. map = selectSalesOrder(requstMap);
  83. break;
  84. case "Differ.JH.Business.CheckRefundStatus" : //退款检测 :即使没有退款功能,该接口也需要有,否则影响发货流程,可以统一返回没有退款)
  85. map = selectOrderRefundStatus(requstMap);
  86. break;
  87. case "Differ.JH.Business.Send" : //订单发货
  88. map = orderDelivery(requstMap);
  89. break;
  90. case "Differ.JH.Business.UpdateSellerMemo" : //修改订单备注
  91. map = updateOrderRemark(requstMap);
  92. break;
  93. case "Differ.JH.Business.DownloadProduct" : //商品下载
  94. //map = downProduct(requstMap);
  95. break;
  96. case "Differ.JH.Business.SyncStock" : //商品库存同步
  97. break;
  98. case "Differ.JH.Business.GetRefund" : //退货退款单下载
  99. map = downRefundOrder(requstMap);
  100. break;
  101. default:
  102. map.put("code","40000");
  103. map.put("message","请求未能识别");
  104. map.put("submessage","参数有误");
  105. map.put("numtotalorder",0);
  106. break;
  107. }
  108. return map;
  109. }
  110. /**
  111. * 订单查询(订单下载)
  112. * @param requstMap
  113. * @return
  114. */
  115. private Map<String,Object> selectSalesOrder(Map<String,Object> requstMap){
  116. Map<String,Object> map = new HashMap<String,Object>();
  117. /*订单交易状态(等待买家付款=JH_01,等待卖家发货=JH_02,等待买家确认收货=JH_03,交易成功=JH_04,交易关闭=JH_05,所有订单=JH_99)*/
  118. String orderStatus = (String) requstMap.get("OrderStatus");
  119. String platOrderNo = (String) requstMap.get("PlatOrderNo"); //平台订单号,若不为空,则代表查询单个订单的数据,查询单个订单时,可不传时间、状态等
  120. String startTime = (String) requstMap.get("StartTime");
  121. String endTime = (String) requstMap.get("EndTime");
  122. String timeType = (String) requstMap.get("TimeType"); //订单时间类别(订单修改时间=JH_01,订单创建时间=JH_02) (管家抓单默认JH_01)
  123. Integer pageIndex = Integer.valueOf(requstMap.get("PageIndex").toString());
  124. Integer pageSize = Integer.valueOf(requstMap.get("PageSize").toString());
  125. Order order = new Order();
  126. if(platOrderNo != null && !"".equals(platOrderNo)){
  127. order.setSalesOrderid(platOrderNo);
  128. }
  129. // TODO: 2018/2/7 只查询代发货的信息,
  130. if(orderStatus == null || "".equals(orderStatus) || "JH_01".equals(orderStatus) || "JH_03".equals(orderStatus)
  131. || "JH_04".equals(orderStatus) || "JH_05".equals(orderStatus) ){
  132. List<Map<String,Object>> orders = new ArrayList<>();
  133. map.put("code","10000");
  134. map.put("message","SUCCESS");
  135. map.put("orders",orders);
  136. map.put("numtotalorder",0);
  137. }else if("JH_99".equals(orderStatus)){
  138. orderStatus = "JH_02";
  139. }
  140. //设置订单状态
  141. this.setStatus(order,orderStatus);
  142. //只查询创建时间的订单
  143. order.setSelectDateType(2);
  144. try {
  145. order.setBeginDate(sdf.parse(startTime));
  146. order.setEndDate(sdf.parse(endTime));
  147. }catch (ParseException e){
  148. logger.info("=========日期转换失败=========");
  149. map.put("code","40000");
  150. map.put("message","查询出错");
  151. map.put("submessage","查询出错");
  152. map.put("numtotalorder",0);
  153. return map;
  154. }
  155. order.getPage().setPageSize(pageSize);
  156. order.getPage().setPageNumber(pageIndex);
  157. order.getPage().initRecordBegin();
  158. Integer orderNum = adminOrderService.selectOrderNum(order);
  159. List<Order> orderList = adminOrderService.selectShopOrderByPola(order);
  160. List<Map<String,Object>> orders = new ArrayList<>();
  161. map.put("code","10000");
  162. map.put("message","SUCCESS");
  163. for(Order or : orderList){
  164. List<OrderItem> orderItemList = adminOrderService.getShopOrderItemByOrderIdToPola(or.getSalesOrderid());
  165. or.setOrderItemList(orderItemList);
  166. try {
  167. orders.add(getOrderMap(or));
  168. }catch (Exception e){
  169. logger.info("订单无法被转换为接口所需要的数据!");
  170. }
  171. }
  172. map.put("orders",orders);
  173. map.put("numtotalorder",orderNum);
  174. logger.info("------返回订单个数:" + orderList.size() + "---------");
  175. return map;
  176. }
  177. /**
  178. * 订单退款状态查询
  179. * @param requstMap
  180. * @return
  181. */
  182. private Map<String,Object> selectOrderRefundStatus(Map<String,Object> requstMap){
  183. Map<String,Object> map = new HashMap<String,Object>();
  184. String orderId = (String) requstMap.get("OrderID"); //平台订单号
  185. Order order;
  186. if(orderId != null && !"".equals(orderId)){
  187. order = adminOrderService.selectShopOrderByPolaById(orderId);
  188. if(order == null){
  189. map.put("code","40000");
  190. map.put("message","未查询到该订单");
  191. map.put("submessage","未查询到该订单");
  192. return map;
  193. }
  194. }else{
  195. map.put("code","40000");
  196. map.put("message","订单号不能为空");
  197. map.put("submessage","订单号不能为空");
  198. return map;
  199. }
  200. map.put("refundStatus",this.getOrderRefundStatus(order.getSalesStatus())); //退款状态 必填
  201. String refundStatusdescription = "";
  202. if(order.getSalesReturnDes() != null){
  203. refundStatusdescription = order.getSalesReturnDes();
  204. }
  205. map.put("refundStatusdescription",refundStatusdescription); //选填 退款说明
  206. List<Map<String,Object>> childrenrefundStatus = new ArrayList<>();
  207. List<OrderItem> orderItemList = adminOrderService.getShopOrderItemByOrderIdToPola(order.getSalesOrderid());
  208. for(OrderItem orderItem : orderItemList){
  209. Map<String,Object> childrenrefund = new HashMap<String, Object>();
  210. childrenrefund.put("refundno",""); //退款订单号 可选
  211. childrenrefund.put("ProductName",orderItem.getItemProductName()); //退款商品名称 可选
  212. childrenrefund.put("refundStatus",this.getOrderRefundStatus(order.getSalesStatus())); //退款状态 可选
  213. childrenrefund.put("refundStatusdescription",refundStatusdescription); //选填 退款说明
  214. childrenrefundStatus.add(childrenrefund);
  215. }
  216. map.put("childrenrefundStatus",childrenrefundStatus); //子订单退款说明
  217. map.put("code","10000");
  218. map.put("message","返回订单退款状态成功,订单id:"+ order.getSalesOrderid() +"订单状态为:"+ this.getDescription(order.getSalesStatus()));
  219. map.put("submessage","返回订单退款状态成功");
  220. return map;
  221. }
  222. /**
  223. * 订单发货
  224. * @param requstMap
  225. * @return
  226. */
  227. private Map<String,Object> orderDelivery(Map<String,Object> requstMap){
  228. Map<String,Object> map = new HashMap<String,Object>();
  229. /*订单发货类别(自己联系物流=JH_01,在线下单=JH_02,无需物流=JH_03,自定义物流=JH_04,家装发货=JH_05,国际物流=JH_06)*/
  230. String SendType = (String) requstMap.get("SendType");
  231. String LogisticName = (String) requstMap.get("LogisticName"); //快递名称
  232. String LogisticType = (String) requstMap.get("LogisticType"); //快递类别(JH前缀为国内快递 ,JHI为国际快递)详见物流公司代码对照表
  233. String LogisticNo = (String) requstMap.get("LogisticNo"); //快递运单号
  234. String PlatOrderNo = (String) requstMap.get("PlatOrderNo"); //平台订单号
  235. Integer IsSplit = Integer.valueOf(requstMap.get("IsSplit").toString()) ; //是否拆单发货(拆单=1 ,不拆单=0)
  236. /*平台子订单交易单号,支持订单拆分为不同商品不同数量发货,
  237. 多个商品用"|"隔开, 为空则视为整单发货
  238. 包含子订单编号和商品发货数量,格式suborderno1:count1|suborderno2:count2发货数量需为大于0的整数
  239. */
  240. String SubPlatOrderNo = (String) requstMap.get("SubPlatOrderNo");
  241. String SenderName = (String) requstMap.get("SenderName"); //发货人姓名
  242. String SenderTel = (String) requstMap.get("SenderTel"); //发货人联系电话
  243. String SenderAddress = (String) requstMap.get("SenderAddress"); //发货人地址(省市区之间以空格分隔)
  244. Integer IsHwgFlag = Integer.valueOf(requstMap.get("IsHwgFlag").toString()); //是否为海外购(是=1;否=0)
  245. Order order;
  246. if(PlatOrderNo != null && !"".equals(PlatOrderNo)) {
  247. order = adminOrderService.selectShopOrderByPolaById(PlatOrderNo);
  248. if(order == null){
  249. map.put("code","40000");
  250. map.put("message","未查询到该订单");
  251. map.put("submessage","未查询到该订单");
  252. return map;
  253. }
  254. }else{
  255. map.put("code","40000");
  256. map.put("message","订单号不能为空");
  257. map.put("submessage","订单号不能为空");
  258. return map;
  259. }
  260. Boolean flag = false;
  261. if(order.getSalesStatus() == 2){ //判断订单是否支持发货
  262. Order or = new Order();
  263. or.setSalesOrderid(PlatOrderNo);
  264. or.setSalesPostFirm(this.selectFirm(LogisticType)); //设置快递公司
  265. or.setSalesPostNum(LogisticNo); //设置快递单号
  266. or.setSalesStatus(5); //发货
  267. flag = adminOrderService.deliverOrderByOrderId(or);
  268. //给用户发送消息-已发货的通知
  269. String firm = this.selectFirm(LogisticType); //快递公司
  270. String num = LogisticNo; //快递单号
  271. try {
  272. /*微信推送发货信息*/
  273. sendMessageUtil.orderSendSuccess(
  274. "尊敬的朵粉,您的订单已发货,物流信息:",
  275. order.getSalesOrderid(),
  276. SendMessageUtil.hashmap.get(firm),
  277. num,
  278. order.getSalesAddressInfo(),
  279. "如有问题请致电400-678-1860或直接在微信留言,soodo上朵将第一时间为您服务!(点击查看订单详情)",
  280. order.getSalesOpenid(),
  281. ResultInfo.ORDER_DETAIL+order.getSalesOrderid()
  282. );
  283. } catch (Exception e) {
  284. logger.info("订单号:"+ order.getSalesOrderid() +"的订单已发货,发送微信消息失败!");
  285. logger.info("失败原因:订单编号"+order.getSalesOrderid() + "快递公司:"+SendMessageUtil.hashmap.get(firm) +"快递单号"+num+"地址" +order.getSalesAddressInfo()+"openid:"+order.getSalesOpenid()+"remark:"+ResultInfo.ORDER_DETAIL+order.getSalesOrderid());
  286. }
  287. }
  288. if(flag){
  289. map.put("code","10000");
  290. map.put("message","订单发货成功");
  291. map.put("submessage","订单发货成功");
  292. }else{
  293. logger.info("订单发货失败,不支持发货操作,订单id:" + order.getSalesOrderid());
  294. map.put("code","40000");
  295. map.put("message","参数有误");
  296. map.put("submessage","订单不支持发货操作");
  297. }
  298. return map;
  299. }
  300. /**
  301. * 修改备注
  302. * @param requstMap
  303. * @return
  304. */
  305. private Map<String,Object> updateOrderRemark(Map<String,Object> requstMap){
  306. Map<String,Object> map = new HashMap<String,Object>();
  307. String orderId = (String) requstMap.get("PlatOrderNo"); //订单id
  308. String remark = (String) requstMap.get("SellerMemo"); //备注
  309. //卖家旗帜(无=JH_None,灰=JH_Gray,红=JH_Red,黄=JH_Yellow,绿=JH_Green,蓝=JH_Blue,紫=JH_Purple)
  310. String sellerFlag = (String) requstMap.get("SellerFlag");
  311. Order order = new Order();
  312. order.setSalesOrderid(orderId);
  313. if(orderId != null && !"".equals(orderId)) {
  314. order = adminOrderService.selectShopOrderByPolaById(orderId);
  315. if(order == null){
  316. map.put("code","40000");
  317. map.put("message","未查询到该订单");
  318. map.put("submessage","未查询到该订单");
  319. return map;
  320. }
  321. }else{
  322. map.put("code","40000");
  323. map.put("message","订单号不能为空");
  324. map.put("submessage","订单号不能为空");
  325. return map;
  326. }
  327. Order or = new Order();
  328. or.setSalesOrderid(orderId);
  329. or.setSalesUserRemark(remark);
  330. Integer flag = adminOrderService.updateOrderByPola(or);
  331. if(flag > 0){
  332. map.put("code","10000");
  333. map.put("message","修改订单备注成功");
  334. map.put("submessage","修改订单备注成功");
  335. }else{
  336. logger.info("修改订单备注失败,订单id:" + order.getSalesOrderid());
  337. map.put("code","40000");
  338. map.put("message","参数有误");
  339. map.put("submessage","修改订单备注失败");
  340. }
  341. return map;
  342. }
  343. /**
  344. * 退货退款单下载
  345. * @param requstMap
  346. * @return
  347. */
  348. private Map<String,Object> downRefundOrder(Map<String,Object> requstMap){
  349. Map<String,Object> map = new HashMap<String,Object>();
  350. String beginTime = (String) requstMap.get("BeginTime"); //开始时间
  351. String endTime = (String) requstMap.get("EndTime"); //结束时间
  352. String pageIndex = (String) requstMap.get("PageIndex"); //页码(默认值:1)
  353. String pageSize = (String) requstMap.get("PageSize"); //每页条数(默认值:10)
  354. // map.put("code","10000");
  355. // map.put("message","退货退款单下载");
  356. // map.put("submessage","退货退款单下载");
  357. return map;
  358. }
  359. /**
  360. * 获取商品
  361. * @param requstMap
  362. * @return
  363. */
  364. private Map<String,Object> downProduct(Map<String,Object> requstMap){
  365. Map<String,Object> map = new HashMap<String,Object>();
  366. Integer productId = null;
  367. String ProductId = requstMap.get("ProductId").toString();
  368. if(ProductId != null && !"".equals(ProductId) ){
  369. productId = Integer.valueOf(ProductId); //可选,商品外部商家编码(注,网店管家目前尚未支持此参数的查询)
  370. }
  371. String productName = (String) requstMap.get("ProductName"); //商品名称
  372. String status = (String) requstMap.get("Status"); //商品状态(已上架商品=JH_01,已下架商品=JH_02,所有商品=JH_99)
  373. Integer pageIndex = Integer.valueOf(requstMap.get("PageIndex").toString()) ; //开始时间
  374. Integer pageSize = Integer.valueOf(requstMap.get("PageSize").toString()); //开始时间
  375. Product product = new Product();
  376. if(status == null || "".equals(status) || "JH_99".equals(status)){
  377. product.setProductStatus(1);
  378. }else if("JH_02".equals(status)){
  379. List<Map<String,Object>> goodslist = new ArrayList<>();
  380. map.put("code","40000");
  381. map.put("totalcount",0);
  382. map.put("goodslist",goodslist);
  383. map.put("message","获取商品集合成功");
  384. map.put("submessage","获取商品集合成功");
  385. return map;
  386. }
  387. product.setProductId(productId);
  388. product.getPage().setPageSize(pageSize);
  389. product.getPage().setPageNumber(pageIndex);
  390. List<Product> productList = productService.selectAllProductInfo(product);
  391. Integer num = productService.selectAllProductNum(product);
  392. if(num < 1){
  393. num = 1;
  394. }
  395. map.put("totalcount",num); //商品总数量(默认值:1)
  396. List<Map<String,Object>> goodslist = new ArrayList<>();
  397. for (Product pt : productList){
  398. Map<String,Object> goods = new HashMap<String,Object>();
  399. goods.put("PlatProductID",String.valueOf(pt.getProductId())); //平台商品ID 必填
  400. goods.put("name",pt.getProductName()); //商品名称 必填
  401. //外部商家编码(注:若与管家对接,这里需要返回与管家商品相匹配的编号,方便管家商品与平台商品的匹配)
  402. goods.put("OuterID",String.valueOf(pt.getProductId())); //
  403. double discount = pt.getProductDiscount().intValue() / 100;
  404. goods.put("price",discount); //商品价格
  405. // TODO: 2018/2/8 商品库存待确定
  406. goods.put("num",10000); //商品数量
  407. goods.put("pictureurl",""); //图片URL 可选
  408. goods.put("whsecode",""); //商品所在仓库编号 可选
  409. List<ProductColor> colors = pt.getColorList(); //获取颜色集合
  410. List<Map<String,Object>> colorList = new ArrayList<>();
  411. for(ProductColor productColor : colors){
  412. Map<String,Object> colorMap = new HashMap<String,Object>();
  413. colorMap.put("SkuID",String.valueOf(productColor.getColorId())); //平台规格ID
  414. // TODO: 2018/2/21 判断是否是货号编码
  415. //规格外部商家编码(注:若与管家对接,这里需要返回与管家商品相匹配的编号,方便管家商品与平台商品的匹配)
  416. colorMap.put("skuOuterID",productColor.getColorPolyCode());
  417. double colorDiscount = productColor.getColorDiscount().intValue() / 100;
  418. colorMap.put("skuprice",colorDiscount); //规格价格
  419. colorMap.put("skuQuantity",10000); //规格数量
  420. colorMap.put("skuname",productColor.getColorName()); //规格名称
  421. colorMap.put("colors",""); //规格属性 可选
  422. colorMap.put("skupictureurl",""); //规格图片URL 可选
  423. colorList.add(colorMap);
  424. }
  425. goods.put("skus",colorList); //规格集合
  426. goodslist.add(goods);
  427. }
  428. map.put("goodslist",goodslist);
  429. map.put("code","10000");
  430. map.put("message","获取商品集合成功");
  431. map.put("submessage","获取商品集合成功");
  432. return map;
  433. }
  434. /**
  435. * 获取快递公司代号,
  436. * @param LogisticType
  437. * @return
  438. */
  439. private String selectFirm(String LogisticType){
  440. switch (LogisticType){
  441. case "JH_001": //EMS
  442. return "ems";
  443. case "JH_002": //圆通
  444. return "yto";
  445. case "JH_003": //韵达
  446. return "yunda";
  447. case "JH_004": //天天快递
  448. return "ttkdex";
  449. case "JH_005": //申通
  450. return "sto";
  451. case "JH_006": //中通
  452. return "zto";
  453. case "JH_007": //宅急送
  454. return "zjs";
  455. // case "JH_008": //快捷快递
  456. // return "";
  457. // case "JH_009": //全峰快递
  458. // return "";
  459. // case "JH_010": //国通快递
  460. // return "";
  461. // case "JH_011": //德邦物流
  462. // return "";
  463. case "JH_012": //百世汇通
  464. return "htky";
  465. // case "JH_013": //优速快递
  466. // return "";
  467. case "JH_014": //顺丰
  468. return "sf";
  469. // case "JH_015": //中铁快运
  470. // return "";
  471. case "JH_019": //龙邦速递
  472. return "longbanwuliu";
  473. case "JH_028": //汇通快运
  474. return "htky";
  475. // case "JH_037": //邮政包裹平邮
  476. // return "";
  477. // case "JH_046": //京东快递
  478. // return "";
  479. case "JH_092": //EMS经济快递
  480. return "ems";
  481. // case "JH_115": //万象
  482. // return "";
  483. // case "JH_091": //百世物流
  484. // return "";
  485. default:
  486. return LogisticType;
  487. }
  488. }
  489. /**
  490. * 查询退款状态
  491. *
  492. * 本系统状态 0:取消订单 1:待支付 2:已支付、待发货 3:退款申请中 4:已退款 5:已发货 6:申请退货中
  493. * 7:退货中 8:订单退货,订单关闭 9:换货中 10:换货完成 11申请换货中 12订单完成
  494. *
  495. * 退款状态(没有退款=JH_07,买家已经申请退款等待卖家同意=JH_01,卖家已经同意退款等待买家退货=JH_02,
  496. * 买家已经退货等待卖家确认收货=JH_03,卖家拒绝退款=JH_04,退款关闭=JH_05,退款成功=JH_06,其他=JH_99)
  497. *
  498. * @param status
  499. * @return
  500. */
  501. private String getOrderRefundStatus(Integer status){
  502. switch (status){
  503. case 0:
  504. return "JH_07";
  505. case 1:
  506. return "JH_07";
  507. case 2:
  508. return "JH_07";
  509. case 3:
  510. return "JH_01";
  511. case 4:
  512. return "JH_06";
  513. case 5:
  514. return "JH_07";
  515. case 6:
  516. return "JH_01";
  517. case 7:
  518. return "JH_02";
  519. case 8:
  520. return "JH_06";
  521. case 9:
  522. return "JH_07";
  523. case 10:
  524. return "JH_07";
  525. case 11:
  526. return "JH_07";
  527. case 12:
  528. return "JH_07";
  529. default:
  530. return "JH_07";
  531. }
  532. }
  533. /***
  534. * 订单下载 拼接map
  535. * 如果不用传参数请去掉,否则有可能会报错
  536. * @param order
  537. * @return
  538. */
  539. private Map<String,Object> getOrderMap(Order order){
  540. String[] addressInfo = order.getSalesAddressInfo().split("-");
  541. String town = ""; //获取街道
  542. if(addressInfo.length > 3){
  543. Integer qu = order.getSalesAddressInfo().indexOf(addressInfo[3]);
  544. town = order.getSalesAddressInfo().substring(qu,order.getSalesAddressInfo().length());
  545. }
  546. Map<String,Object> orderMap = new HashMap<String,Object>();
  547. orderMap.put("PlatOrderNo",order.getSalesOrderid()); //订单号
  548. orderMap.put("tradeStatus",this.getStatus(order.getSalesStatus())); //订单状态
  549. orderMap.put("tradeStatusdescription",this.getDescription(order.getSalesStatus())); //订单交易说明, 可选
  550. orderMap.put("tradetime",sdf.format(order.getSalesCreateDate())); //订单生成时间 必选 //交易时间(格式:yyyy-MM-dd HH:mm:ss)
  551. orderMap.put("payorderno",""); //支付单号
  552. orderMap.put("country","CN"); //国家简称
  553. orderMap.put("province",addressInfo[0]); //省 必填
  554. orderMap.put("city",addressInfo[1]); //市 必填
  555. orderMap.put("area",addressInfo[2]); //区 必填
  556. orderMap.put("town",town);
  557. orderMap.put("address",order.getSalesAddressInfo()); //全部地址 必填
  558. orderMap.put("zip",order.getSalesAddressPostnum()); //邮编
  559. orderMap.put("phone",order.getSalesAddressTel()); //手机号码 必填
  560. //orderMap.put("mobile","");
  561. // orderMap.put("email","");
  562. String remark = order.getSalesUserRemark();
  563. if(remark == null){
  564. orderMap.put("customerremark",""); //买家备注
  565. }else{
  566. orderMap.put("customerremark",order.getSalesUserRemark()); //买家备注
  567. }
  568. //orderMap.put("sellerremark","");
  569. orderMap.put("postfee",0); //邮资
  570. orderMap.put("goodsfee",0); //货款金额
  571. double yetAmount = order.getSalesYetAmount().intValue() / 100;
  572. double amount = order.getSalesAmount().intValue() / 100;
  573. orderMap.put("totalmoney",yetAmount); //合计应收(针对卖家)
  574. orderMap.put("favourablemoney",amount-yetAmount); //订单总优惠金额
  575. orderMap.put("commissionvalue",0); //佣金
  576. //orderMap.put("taxamount",""); //订单税费总额
  577. //orderMap.put("tariffamount",""); //订单关税金额
  578. // orderMap.put("addedvalueamount",""); //订单增值税金额
  579. // orderMap.put("consumptiondutyamount",""); //订单消费税金额
  580. orderMap.put("sendstyle",this.getSendstyle(order.getSalesPostFirm())); //货运方式 可选
  581. //orderMap.put("qq","");
  582. if(order.getSalesTransactionDate() != null){
  583. orderMap.put("paytime",sdf.format(order.getSalesTransactionDate())); //支付时间 ,必填 支付时间(格式:yyyy-MM-dd HH:mm:ss)
  584. }
  585. //orderMap.put("invoicetitle",""); //发票抬头
  586. //orderMap.put("codservicefee",""); //纳税人识别号
  587. //orderMap.put("couponprice",""); //货币类型
  588. //orderMap.put("cardtype",""); //证件类型(身份证=JH_01,护照=JH_02,港澳通行证=JH_03)
  589. //orderMap.put("idcard",""); //证件号码
  590. //orderMap.put("idcardtruename",""); //证件真实姓名
  591. orderMap.put("receivername",order.getSalesAddressName()); //收货人真实姓名
  592. orderMap.put("nick",order.getUserNickname()); //必填 买家昵称
  593. //orderMap.put("whsecode",""); //商品所在仓库编号
  594. //orderMap.put("IsHwgFlag",""); //是否为海外购(是=1;否=0)
  595. orderMap.put("ShouldPayType","担保交易"); //必填 结算方式(可选值有:担保交易;银行收款;现金收款;货到付款;欠款记应收;客户预付款;多种结算)
  596. List<Map<String,Object>> goodinfos = new ArrayList<>();
  597. for (OrderItem orderItem: order.getOrderItemList()){
  598. Map<String,Object> orderItemMap = new HashMap<String,Object>();
  599. orderItemMap.put("ProductId",orderItem.getColorPolyCode()); //必填 平台商品ID或SKUID(SKUID优先)
  600. orderItemMap.put("suborderno",orderItem.getItemId()); //子订单号(若需要支持拆单发货,则必填)
  601. orderItemMap.put("tradegoodsno",orderItem.getColorPolyCode()); //必填 部商家编码或外部SKU编码(SKU编码优先)。注意,如果要与管家对接,这里一般返回管家的商品编码,作为平台的外部商家编码,与管家商品映射。
  602. orderItemMap.put("tradegoodsname",orderItem.getItemProductName()); //必填 商品交易名称
  603. orderItemMap.put("tradegoodsspec",orderItem.getProductColor()); //颜色 必填 商品交易规格
  604. orderItemMap.put("goodscount",orderItem.getItemNum()); //必填 商品数量 int
  605. double money = orderItem.getItemProductDiscount().intValue() / 100;
  606. orderItemMap.put("price",money); //单价 必填 decimal
  607. orderItemMap.put("discountmoney",0); //子订单优惠金额 decimal
  608. orderItemMap.put("taxamount",0); //商品税费 decimal
  609. orderItemMap.put("refundStatus",this.getRefundStatus(order.getSalesStatus())); //退款状态(没有退款=JH_07,买家已经申请退款等待卖家同意=JH_01,卖家已经同意退款等待买家退货=JH_02,买家已经退货等待卖家确认收货=JH_03,卖家拒绝退款=JH_04,退款关闭=JH_05,退款成功=JH_06,其他=JH_99)
  610. orderItemMap.put("Status",this.getOrderItemStatus(order.getSalesStatus())); //子订单交易状态(其他=JH_99,等待买家付款=JH_01,等待卖家发货=JH_02,等待买家确认收货=JH_03,交易成功=JH_04,交易关闭=JH_05)
  611. orderItemMap.put("remark",""); //货品备注
  612. goodinfos.add(orderItemMap);
  613. }
  614. orderMap.put("goodinfos",goodinfos);
  615. return orderMap;
  616. }
  617. /**
  618. * 设置查询的订单状态
  619. *
  620. * 本系统状态 0:取消订单 1:待支付 2:已支付、待发货 3:退款申请中 4:已退款 5:已发货
  621. * 6:申请退货中 7:退货中 8:订单退货,订单关闭 9:换货中 10:换货完成 11申请换货中 12订单完成
  622. *
  623. * 订单交易状态(等待买家付款=JH_01,等待卖家发货=JH_02,等待买家确认收货=JH_03,交易成功=JH_04,交易关闭=JH_05,所有订单=JH_99)
  624. *
  625. * @param order
  626. * @param status
  627. */
  628. private void setStatus(Order order,String status){
  629. switch (status){
  630. case "JH_01":
  631. order.setSalesStatus(1);
  632. break;
  633. case "JH_02":
  634. order.setSalesStatus(2);
  635. break;
  636. case "JH_03":
  637. order.setSalesStatus(12);
  638. break;
  639. case "JH_04":
  640. order.setSalesStatus(12);
  641. break;
  642. case "JH_05":
  643. order.setSalesStatus(8);
  644. break;
  645. case "JH_99":
  646. break;
  647. default:
  648. order.setSalesStatus(2);
  649. break;
  650. }
  651. }
  652. /**
  653. * 返回订单状态
  654. *
  655. * 状态 0:取消订单 1:待支付 2:已支付、待发货 3:退款申请中 4:已退款 5:已发货
  656. * 6:申请退货中 7:退货中 8:订单退货,订单关闭 9:换货中 10:换货完成 11申请换货中 12订单完成
  657. *
  658. * 订单交易状态(等待买家付款=JH_01,等待卖家发货=JH_02,等待买家确认收货=JH_03,交易成功=JH_04,交易关闭=JH_05,所有订单=JH_99)
  659. *
  660. * @param status
  661. * @return
  662. */
  663. private String getStatus(int status){
  664. switch (status){
  665. case 0:
  666. return "JH_05";
  667. case 1:
  668. return "JH_01";
  669. case 2:
  670. return "JH_02";
  671. case 3:
  672. return "JH_03";
  673. case 4:
  674. return "JH_05";
  675. case 5:
  676. return "JH_03";
  677. case 6:
  678. return "JH_03";
  679. case 7:
  680. return "JH_03";
  681. case 8:
  682. return "JH_05";
  683. case 9:
  684. return "JH_03";
  685. case 10:
  686. return "JH_05";
  687. case 11:
  688. return "JH_03";
  689. case 12:
  690. return "JH_04";
  691. default:
  692. return "JH_05";
  693. }
  694. }
  695. /**
  696. * 返回子订单退款状态(可选值)
  697. *
  698. * 本系统状态 0:取消订单 1:待支付 2:已支付、待发货 3:退款申请中 4:已退款 5:已发货
  699. * 6:申请退货中 7:退货中 8:订单退货,订单关闭 9:换货中 10:换货完成 11申请换货中 12订单完成
  700. *
  701. * 退款状态(没有退款=JH_07,买家已经申请退款等待卖家同意=JH_01,卖家已经同意退款等待买家退货=JH_02,买家已经退货等待卖家确认收货=JH_03,
  702. * 卖家拒绝退款=JH_04,退款关闭=JH_05,退款成功=JH_06,其他=JH_99)
  703. *
  704. * @param status
  705. * @return
  706. */
  707. private String getRefundStatus(int status){
  708. switch (status){
  709. case 0:
  710. return "";
  711. case 1:
  712. return "";
  713. case 2:
  714. return "";
  715. case 3:
  716. return "JH_01";
  717. case 4:
  718. return "JH_06";
  719. case 5:
  720. return "";
  721. case 6:
  722. return "";
  723. case 7:
  724. return "JH_02";
  725. case 8:
  726. return "JH_06";
  727. case 9:
  728. return "";
  729. case 10:
  730. return "";
  731. case 11:
  732. return "";
  733. case 12:
  734. return "";
  735. default:
  736. return "";
  737. }
  738. }
  739. /**
  740. * 返回子订单状态(可选值)
  741. *
  742. * 本系统状态 0:取消订单 1:待支付 2:已支付、待发货 3:退款申请中 4:已退款 5:已发货
  743. * 6:申请退货中 7:退货中 8:订单退货,订单关闭 9:换货中 10:换货完成 11申请换货中 12订单完成
  744. *
  745. * 订单交易状态(等待买家付款=JH_01,等待卖家发货=JH_02,等待买家确认收货=JH_03,交易成功=JH_04,交易关闭=JH_05,所有订单=JH_99)
  746. *
  747. * @param status
  748. * @return
  749. */
  750. private String getOrderItemStatus(int status){
  751. switch (status){
  752. case 0:
  753. return "";
  754. case 1:
  755. return "JH_01";
  756. case 2:
  757. return "JH_02";
  758. case 3:
  759. return "";
  760. case 4:
  761. return "JH_05";
  762. case 5:
  763. return "";
  764. case 6:
  765. return "";
  766. case 7:
  767. return "";
  768. case 8:
  769. return "JH_05";
  770. case 9:
  771. return "";
  772. case 10:
  773. return "";
  774. case 11:
  775. return "";
  776. case 12:
  777. return "JH_04";
  778. default:
  779. return "";
  780. }
  781. }
  782. /**
  783. * 获取订单交易说明
  784. * 状态 0:取消订单 1:待支付 2:已支付、待发货 3:退款申请中 4:已退款 5:已发货
  785. * 6:申请退货中 7:退货中 8:订单退货,订单关闭 9:换货中 10:换货完成 11申请换货中 12订单完成
  786. * @param status
  787. * @return
  788. */
  789. private String getDescription(int status){
  790. switch (status){
  791. case 0:
  792. return "取消订单";
  793. case 1:
  794. return "等待买家付款";
  795. case 2:
  796. return "等待发货";
  797. case 3:
  798. return "退款申请中";
  799. case 4:
  800. return "已退款";
  801. case 5:
  802. return "已发货";
  803. case 6:
  804. return "申请退货中";
  805. case 7:
  806. return "退货中";
  807. case 8:
  808. return "订单已退货";
  809. case 9:
  810. return "换货中";
  811. case 10:
  812. return "换货完成";
  813. case 11:
  814. return "申请换货中";
  815. case 12:
  816. return "订单完成";
  817. default:
  818. return "其他";
  819. }
  820. }
  821. /**
  822. * 返回配送方式
  823. * @param sendsStyle
  824. * @return
  825. */
  826. private String getSendstyle(String sendsStyle){
  827. String sendStyle = SendMessageUtil.hashmap.get(sendsStyle);
  828. if(sendStyle == null){
  829. sendStyle = "";
  830. }
  831. return sendStyle;
  832. }
  833. /**
  834. * 校验请求和返回参数
  835. * @param request
  836. * @return
  837. */
  838. private Map<String,Object> verification(HttpServletRequest request) throws Exception {
  839. String bizcontent = request.getParameter("bizcontent");
  840. String appkey = request.getParameter("appkey");
  841. String method = request.getParameter("method");
  842. String token = request.getParameter("token");
  843. String sign = request.getParameter("sign");
  844. String polyapiAppKey = NameUtils.getConfig("polyapi_appKey");
  845. String polyapiAppSecret = NameUtils.getConfig("polyapi_AppSecret");
  846. if(appkey != null && appkey.equals(polyapiAppKey)){
  847. /**
  848. * 签名验证:
  849. * 将除Sign参数外的所有“参数 参数值”进行字典排序生成串,而后将AppSecret加到该串的首尾,将得到的字符串转小写,进行MD5加密,此时的生成的串即为Sign。
  850. */
  851. String signatureText = polyapiAppSecret + "appkey" + appkey + "bizcontent" + bizcontent + "method" + method + "token" + token + polyapiAppSecret;
  852. signatureText = signatureText.toLowerCase();
  853. String signaTrue = md5.GetMD5Code(signatureText);
  854. if(sign == null || !sign.equals(signaTrue)){
  855. logger.info("-----------签名验证失败---------------,signaTrue:"+signaTrue);
  856. logger.info("-----------签名验证失败---------------,sign:"+sign);
  857. throw new Exception("签名验证失败");
  858. }
  859. logger.info("-----------菠萝派调用接口,签名验证通过。接口调用方法名:"+method);
  860. }
  861. Map requstMap = (Map) JSON.parse(bizcontent);
  862. return requstMap;
  863. }
  864. }