AdminCheckQuartz.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. package com.iotechn.unimall.admin;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.mapper.EntityWrapper;
  6. import com.baomidou.mybatisplus.mapper.Wrapper;
  7. import com.dangdang.openplatform.openapi.sdk.ApiException;
  8. import com.dangdang.openplatform.openapi.sdk.SdkClient;
  9. import com.dangdang.openplatform.openapi.sdk.internal.util.FileItem;
  10. import com.dangdang.openplatform.openapi.sdk.request.order.OrderDetailsGetRequest;
  11. import com.dangdang.openplatform.openapi.sdk.request.order.OrderGoodsSendRequest;
  12. import com.dangdang.openplatform.openapi.sdk.request.order.OrdersContentDecryptRequest;
  13. import com.dangdang.openplatform.openapi.sdk.requestmodel.order.EncryptDTO;
  14. import com.dangdang.openplatform.openapi.sdk.requestmodel.order.OrderDetailsGet;
  15. import com.dangdang.openplatform.openapi.sdk.response.order.OrderDetailsGetResponse;
  16. import com.dangdang.openplatform.openapi.sdk.response.order.OrderGoodsSendResponse;
  17. import com.dangdang.openplatform.openapi.sdk.response.order.OrdersContentDecryptResponse;
  18. import com.dangdang.openplatform.openapi.sdk.responsemodel.order.CryptUserInfo;
  19. import com.dangdang.openplatform.openapi.sdk.responsemodel.order.OrdersContentDecryptDTO;
  20. import com.iotechn.unimall.admin.api.user.AdminUserServiceImpl;
  21. import com.iotechn.unimall.biz.service.order.OrderBizService;
  22. import com.iotechn.unimall.core.exception.AdminServiceException;
  23. import com.iotechn.unimall.core.exception.ExceptionDefinition;
  24. import com.iotechn.unimall.data.component.LockComponent;
  25. import com.iotechn.unimall.data.domain.GroupShopDO;
  26. import com.iotechn.unimall.data.domain.OrderDO;
  27. import com.iotechn.unimall.data.domain.SpuDO;
  28. import com.iotechn.unimall.data.domain.shop.ShopAccount;
  29. import com.iotechn.unimall.data.domain.shop.ShopLog;
  30. import com.iotechn.unimall.data.domain.shop.ShopOrder;
  31. import com.iotechn.unimall.data.domain.shop.ShopTran;
  32. import com.iotechn.unimall.data.dto.shop.XmlObject.OrderDetail;
  33. import com.iotechn.unimall.data.dto.shop.XmlObject.SendGood;
  34. import com.iotechn.unimall.data.dto.shop.XmlObject.SendGoodsInfo;
  35. import com.iotechn.unimall.data.enums.GroupShopAutomaticRefundType;
  36. import com.iotechn.unimall.data.enums.OrderStatusType;
  37. import com.iotechn.unimall.data.enums.StatusType;
  38. import com.iotechn.unimall.data.mapper.GroupShopMapper;
  39. import com.iotechn.unimall.data.mapper.OrderMapper;
  40. import com.iotechn.unimall.data.mapper.SpuMapper;
  41. import com.iotechn.unimall.data.mapper.shop.ShopAccountMapper;
  42. import com.iotechn.unimall.data.mapper.shop.ShopLogMapper;
  43. import com.iotechn.unimall.data.mapper.shop.ShopOrderMapper;
  44. import com.iotechn.unimall.data.mapper.shop.ShopTranMapper;
  45. import com.iotechn.unimall.data.util.XMLUtil;
  46. import org.apache.commons.httpclient.Cookie;
  47. import org.apache.commons.httpclient.HttpClient;
  48. import org.apache.commons.httpclient.NameValuePair;
  49. import org.apache.commons.httpclient.cookie.CookiePolicy;
  50. import org.apache.commons.httpclient.methods.GetMethod;
  51. import org.apache.commons.httpclient.methods.PostMethod;
  52. import org.apache.http.HttpEntity;
  53. import org.apache.http.HttpResponse;
  54. import org.apache.http.HttpStatus;
  55. import org.apache.http.client.entity.UrlEncodedFormEntity;
  56. import org.apache.http.client.methods.CloseableHttpResponse;
  57. import org.apache.http.client.methods.HttpGet;
  58. import org.apache.http.client.methods.HttpPost;
  59. import org.apache.http.impl.client.BasicCookieStore;
  60. import org.apache.http.impl.client.CloseableHttpClient;
  61. import org.apache.http.impl.client.HttpClientBuilder;
  62. import org.apache.http.impl.client.HttpClients;
  63. import org.apache.http.message.BasicNameValuePair;
  64. import org.apache.http.util.EntityUtils;
  65. import org.slf4j.Logger;
  66. import org.slf4j.LoggerFactory;
  67. import org.springframework.beans.factory.annotation.Autowired;
  68. import org.springframework.scheduling.annotation.EnableScheduling;
  69. import org.springframework.scheduling.annotation.Scheduled;
  70. import org.springframework.stereotype.Component;
  71. import org.springframework.transaction.TransactionStatus;
  72. import org.springframework.transaction.annotation.Transactional;
  73. import org.springframework.transaction.support.TransactionCallbackWithoutResult;
  74. import org.springframework.transaction.support.TransactionTemplate;
  75. import org.springframework.util.CollectionUtils;
  76. import java.io.*;
  77. import java.text.SimpleDateFormat;
  78. import java.util.*;
  79. import java.util.concurrent.ExecutorService;
  80. import java.util.concurrent.Executors;
  81. import java.util.regex.Matcher;
  82. import java.util.regex.Pattern;
  83. import java.util.stream.Collectors;
  84. /**
  85. * Created by rize on 2019/7/21.
  86. */
  87. @Component
  88. @EnableScheduling
  89. public class AdminCheckQuartz {
  90. private static final Logger logger = LoggerFactory.getLogger(AdminCheckQuartz.class);
  91. private static final String ORDER_STATUS_LOCK = "ORDER_STATUS_QUARTZ_LOCK";
  92. private static final String GROUP_SHOP_START_LOCK = "GROUP_SHOP_START_LOCK";
  93. private static final String GROUP_SHOP_END_LOCK = "GROUP_SHOP_END_LOCK";
  94. private static final String GROUP_SHOP_LOCK_LOCK = "GROUP_SHOP_LOCK_LOCK";
  95. @Autowired
  96. private ShopOrderMapper shopOrderMapper;
  97. @Autowired
  98. private ShopAccountMapper shopAccountMapper;
  99. @Autowired
  100. private ShopTranMapper shopTranMapper;
  101. @Autowired
  102. private ShopLogMapper shopLogMapper;
  103. ExecutorService pool = Executors.newFixedThreadPool(2);
  104. /**
  105. * 订单数据定时轮训处理 每小时执行一次
  106. */
  107. @Scheduled(cron = "0 0 7-22 * * ? ")
  108. public void task1(){
  109. new Thread(new Runnable() {
  110. @Override
  111. public void run() {
  112. doSomething1();
  113. }
  114. }).start();
  115. }
  116. /**
  117. * 订单数据定时轮训处理 每3小时执行一次
  118. */
  119. // @Scheduled(cron = "0 0 0 1/1 * ? ")
  120. public void task2(){
  121. new Thread(new Runnable() {
  122. @Override
  123. public void run() {
  124. doSomething2();
  125. }
  126. }).start();
  127. }
  128. public void dealOrder() throws Exception {
  129. try{
  130. List<ShopOrder> shopOrders = shopOrderMapper.selectList(new EntityWrapper<ShopOrder>()
  131. .eq("dang_order_status","未发货")
  132. .eq("order_status_name","卖家已发货"));
  133. for (ShopOrder qqq:shopOrders
  134. ) {
  135. ShopAccount shopAccount = shopAccountMapper.selectById(qqq.getAccountId());
  136. flushCookie(shopAccount);
  137. CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  138. HttpGet get = new HttpGet("https://shop.kongfz.com/buyer/order/index/?pageCurr=1&pageShow=9999&orderId="+qqq.getOrderId());
  139. //这里可以设置请求参数,token等
  140. get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
  141. get.addHeader("cookie",shopAccount.getFuziCookie());
  142. get.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  143. CloseableHttpResponse response = httpClient.execute(get);//执行获取响应
  144. try{
  145. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){//根据状态码处理
  146. String strTmp= EntityUtils.toString(response.getEntity(),"UTF-8");
  147. //返回字符串
  148. String res = unicodeToString(strTmp);
  149. JSONObject datas = JSONObject.parseObject(res);//转换成JSON格式
  150. Boolean status = (Boolean) datas.get("status");//获取返回数据状态,get获取的字段需要根据提供的返回值去获取
  151. List<ShopOrder> data = JSONArray.parseArray(datas.get("data").toString(),ShopOrder.class);//"data"是根据返回值设定
  152. for (ShopOrder tmp: data
  153. ) {
  154. //正则表达式,用于匹配非数字串,+号用于匹配出多个非数字串
  155. String regEx="[^0-9]+";
  156. Pattern pattern = Pattern.compile(regEx);
  157. //用定义好的正则表达式拆分字符串,把字符串中的数字留出来
  158. String[] cs = pattern.split(tmp.getRemarkText());
  159. String dangOrder = "";
  160. for (String str:cs
  161. ) {
  162. if(dangOrder.length()>= 11 || str.equals("*")){
  163. break;
  164. }
  165. dangOrder += str;
  166. }
  167. tmp.setDangOrder(dangOrder);
  168. tmp.setAccountId(shopAccount.getId());
  169. Long time = Long.parseLong(tmp.getShippingTime())+8*60*60;
  170. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  171. sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
  172. String time1 = sdf.format(new Date(time * 1000));
  173. tmp.setShippingTime(time1);
  174. tmp.setDeleteFlag(0);
  175. tmp.setGmtUpdate(new Date());
  176. tmp.setGmtCreate(new Date());
  177. if(tmp.getShippingComName().equals("快递包裹")||tmp.getShippingComName().equals("挂号印刷品")){
  178. tmp.setShippingComName("中国邮政");
  179. }
  180. ShopOrder tt = new ShopOrder();
  181. tt.setOrderId(tmp.getOrderId());
  182. tt = shopOrderMapper.selectOne(tt);
  183. if(tt == null){
  184. shopOrderMapper.insert(tmp);
  185. }
  186. else{
  187. if(!tt.getDangOrder().equals(tmp.getDangOrder())||!tt.getShippingComName().equals(tmp.getShippingComName())){
  188. shopOrderMapper.update(tmp,new EntityWrapper<ShopOrder>().eq("order_id",tt.getOrderId()));
  189. }
  190. dangOrderDeal(shopAccount,qqq);
  191. }
  192. }
  193. }
  194. } catch (IOException e) {
  195. throw e;
  196. }
  197. finally {
  198. response.close();
  199. httpClient.close();
  200. }
  201. }
  202. }
  203. catch (Exception e) {
  204. ShopLog shopLog = new ShopLog();
  205. shopLog.setGmtCreate(new Date());
  206. shopLog.setTitle("同步定时任务异常");
  207. shopLog.setContent(e.getMessage());
  208. shopLogMapper.insert(shopLog);
  209. e.printStackTrace();
  210. }
  211. }
  212. public void pullOrderList() throws Exception {
  213. try{
  214. List<ShopAccount> listAccount = shopAccountMapper.selectList(new EntityWrapper<ShopAccount>().eq("delete_flag",0));
  215. for (ShopAccount shopAccount:listAccount
  216. ) {
  217. flushCookie(shopAccount);
  218. for(int i=1;i<=5;i++){
  219. CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  220. HttpGet get = new HttpGet("https://shop.kongfz.com/buyer/order/index/?pageCurr="+i+"&pageShow=300&orderStatus=ShippedToReceipt");
  221. //这里可以设置请求参数,token等
  222. get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
  223. get.addHeader("cookie",shopAccount.getFuziCookie());
  224. CloseableHttpResponse response = httpClient.execute(get);//执行获取响应
  225. try{
  226. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){//根据状态码处理
  227. String strTmp= EntityUtils.toString(response.getEntity(),"UTF-8");
  228. //返回字符串
  229. String res = unicodeToString(strTmp);
  230. JSONObject datas = JSONObject.parseObject(res);//转换成JSON格式
  231. Boolean status = (Boolean) datas.get("status");//获取返回数据状态,get获取的字段需要根据提供的返回值去获取
  232. List<ShopOrder> data = JSONArray.parseArray(datas.get("data").toString(),ShopOrder.class);//"data"是根据返回值设定
  233. if(data.size() == 0){
  234. break;
  235. }
  236. for (ShopOrder tmp: data
  237. ) {
  238. //正则表达式,用于匹配非数字串,+号用于匹配出多个非数字串
  239. String regEx="[^0-9]+";
  240. Pattern pattern = Pattern.compile(regEx);
  241. //用定义好的正则表达式拆分字符串,把字符串中的数字留出来
  242. String[] cs = pattern.split(tmp.getRemarkText());
  243. String dangOrder = "";
  244. for (String str:cs
  245. ) {
  246. if(dangOrder.length()>= 11 || str.equals("*")){
  247. break;
  248. }
  249. dangOrder += str;
  250. }
  251. tmp.setDangOrder(dangOrder);
  252. tmp.setAccountId(shopAccount.getId());
  253. Long time = Long.parseLong(tmp.getShippingTime())+8*60*60;
  254. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  255. sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
  256. String time1 = sdf.format(new Date(time * 1000));
  257. tmp.setShippingTime(time1);
  258. tmp.setDeleteFlag(0);
  259. tmp.setGmtUpdate(new Date());
  260. tmp.setGmtCreate(new Date());
  261. if(tmp.getShippingComName().equals("快递包裹")||tmp.getShippingComName().equals("挂号印刷品")){
  262. tmp.setShippingComName("中国邮政");
  263. }
  264. ShopOrder tt = new ShopOrder();
  265. tt.setOrderId(tmp.getOrderId());
  266. tt = shopOrderMapper.selectOne(tt);
  267. if(tt == null){
  268. shopOrderMapper.insert(tmp);
  269. }
  270. else{
  271. if(tt.getDangOrderStatus().equals("未发货")&&!tt.getDangOrder().equals(tmp.getDangOrder())){
  272. shopOrderMapper.update(tmp,new EntityWrapper<ShopOrder>().eq("order_id",tt.getOrderId()));
  273. }
  274. }
  275. }
  276. }
  277. } catch (IOException e) {
  278. throw e;
  279. }
  280. finally {
  281. response.close();
  282. httpClient.close();
  283. }
  284. }
  285. }
  286. }
  287. catch (Exception e){
  288. ShopLog shopLog = new ShopLog();
  289. shopLog.setGmtCreate(new Date());
  290. shopLog.setTitle("爬取定时任务异常");
  291. shopLog.setContent(e.getMessage());
  292. shopLogMapper.insert(shopLog);
  293. e.printStackTrace();
  294. }
  295. }
  296. public void flushCookie(ShopAccount shopAccount){
  297. try{
  298. CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  299. HttpGet getMethod = new HttpGet("https://shop.kongfz.com/buyer/order/index/?pageCurr=1&pageShow=30");
  300. getMethod.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
  301. getMethod.addHeader("cookie",shopAccount.getFuziCookie());
  302. httpClient.execute(getMethod);
  303. CloseableHttpResponse response = httpClient.execute(getMethod);//执行获取响应
  304. try{
  305. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//根据状态码处理
  306. String strTmp= EntityUtils.toString(response.getEntity(),"UTF-8");
  307. JSONObject datas = JSONObject.parseObject(strTmp);//转换成JSON格式
  308. Boolean status = (Boolean) datas.get("status");//获取返回数据状态,get获取的字段需要根据提供的返回值去获取
  309. if(status){
  310. return;
  311. }
  312. }
  313. }
  314. catch (Exception e){
  315. throw e;
  316. }
  317. finally {
  318. response.close();
  319. httpClient.close();
  320. }
  321. System.out.println("原cookies = "+shopAccount.getFuziCookie());
  322. // 登陆 Url
  323. String loginUrl = "https://login.kongfz.com/Pc/Login/account";
  324. BasicCookieStore store= new BasicCookieStore();
  325. httpClient =HttpClients.custom().setDefaultCookieStore(store).build();
  326. // 模拟登陆,按实际服务器端要求选用 Post 或 Get 请求方式
  327. HttpPost httpPost = new HttpPost(loginUrl);
  328. // 装填参数
  329. List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>();
  330. nvps.add(new BasicNameValuePair("loginName", shopAccount.getFuziAccount()));
  331. nvps.add(new BasicNameValuePair("loginPass", shopAccount.getFuziPassword()));
  332. // 设置参数到请求对象中
  333. httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
  334. // 设置header信息
  335. // 指定报文头【Content-type】、【User-Agent】
  336. httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
  337. // 执行请求操作,并拿到结果(同步阻塞)
  338. response = httpClient.execute(httpPost);
  339. if(response.getStatusLine().getStatusCode() == 302){
  340. List<org.apache.http.cookie.Cookie> cookielist = store.getCookies();
  341. String nCookie = "";
  342. for(org.apache.http.cookie.Cookie cookie: cookielist){
  343. String name=cookie.getName();
  344. String value=cookie.getValue();
  345. nCookie += name + "="+value+";";
  346. }
  347. System.out.println("nCookie:" + nCookie);
  348. shopAccount.setFuziCookie(nCookie);
  349. shopAccountMapper.updateById(shopAccount);
  350. ShopLog shopLog = new ShopLog();
  351. shopLog.setGmtCreate(new Date());
  352. shopLog.setTitle("更新cookie成功");
  353. shopLog.setContent("账号:"+shopAccount.getFuziAccount()+",cookie:"+nCookie);
  354. shopLogMapper.insert(shopLog);
  355. }
  356. else{
  357. ShopLog shopLog = new ShopLog();
  358. shopLog.setGmtCreate(new Date());
  359. shopLog.setTitle("更新cookie失败");
  360. shopLog.setContent(response.toString());
  361. shopLogMapper.insert(shopLog);
  362. }
  363. // 释放链接
  364. response.close();
  365. }catch (Exception e) {
  366. e.printStackTrace();
  367. ShopLog shopLog = new ShopLog();
  368. shopLog.setGmtCreate(new Date());
  369. shopLog.setTitle("更新cookie异常");
  370. shopLog.setContent(e.getMessage());
  371. shopLogMapper.insert(shopLog);
  372. }
  373. }
  374. /**
  375. * Unicode转 汉字字符串
  376. *
  377. * @param str
  378. * \u6728
  379. * @return '木' 26408
  380. */
  381. public static String unicodeToString(String str) {
  382. Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
  383. Matcher matcher = pattern.matcher(str);
  384. char ch;
  385. while (matcher.find()) {
  386. // group 6728
  387. String group = matcher.group(2);
  388. // ch:'木' 26408
  389. ch = (char) Integer.parseInt(group, 16);
  390. // group1 \u6728
  391. String group1 = matcher.group(1);
  392. str = str.replace(group1, ch + "");
  393. }
  394. return str;
  395. }
  396. public void dangOrderDeal(ShopAccount shopAccount, ShopOrder shopOrder) throws Exception {
  397. try{
  398. /**
  399. * 获取一下店铺的所有静态参数
  400. */
  401. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  402. SdkClient sdkClient = new SdkClient(shopAccount.getDangAppKey(),shopAccount.getDangAppSecret(),shopAccount.getDangSession(),shopAccount.getDangVersion());
  403. OrderDetailsGetRequest ss = new OrderDetailsGetRequest();
  404. OrderDetailsGet orderDetailsGet = new OrderDetailsGet();
  405. orderDetailsGet.setO(shopOrder.getDangOrder());
  406. ss.setOrderDetailsGet(orderDetailsGet);
  407. OrderDetailsGetResponse resultt = null;
  408. try {
  409. resultt = sdkClient.excute(ss);
  410. if(resultt.getOrderID() == null){
  411. shopOrder.setDangOrderStatus("订单错误");
  412. shopOrderMapper.updateById(shopOrder);
  413. ShopLog shopLog = new ShopLog();
  414. shopLog.setGmtCreate(new Date());
  415. shopLog.setTitle("当当订单编号错误");
  416. shopLog.setContent("店铺:"+shopAccount.getDangName()+",孔网订单:"+shopOrder.getOrderId()+",当当订单:"+shopOrder.getDangOrder());
  417. shopLogMapper.insert(shopLog);
  418. return;
  419. }
  420. } catch (ApiException e) {
  421. throw e;
  422. }
  423. /**
  424. * 从当当获取订单内应当有的所有图书
  425. */
  426. OrderDetailsGetRequest odgr = new OrderDetailsGetRequest();
  427. OrderDetailsGet ogg = new OrderDetailsGet();
  428. ogg.setO(shopOrder.getDangOrder());
  429. odgr.setOrderDetailsGet(ogg);
  430. OrderDetailsGetResponse odgrp = null;
  431. try {
  432. odgrp = sdkClient.excute(odgr);
  433. } catch (ApiException e) {
  434. throw e;
  435. }
  436. SdkClient jiemi = new SdkClient(shopAccount.getDangAppKey(),shopAccount.getDangAppSecret(),shopAccount.getDangSession(),shopAccount.getDangVersion());
  437. OrdersContentDecryptRequest ordersContentDecryptRequest=new OrdersContentDecryptRequest();
  438. List<EncryptDTO> encryptVOS = new ArrayList<EncryptDTO>();
  439. EncryptDTO encryptVO1 = new EncryptDTO();
  440. encryptVO1.setO(resultt.getOrderID().toString());
  441. encryptVO1.setEncrypt_content(resultt.getEncrypt_content());
  442. encryptVOS.add(encryptVO1);
  443. ordersContentDecryptRequest.setO_cryptStr(JSON.toJSONString(encryptVOS));
  444. OrdersContentDecryptResponse ordersContentDecryptResponse = null;
  445. try {
  446. ordersContentDecryptResponse=jiemi.excute(ordersContentDecryptRequest);
  447. } catch (ApiException e) {
  448. throw e;
  449. }
  450. List<OrdersContentDecryptDTO> data = ordersContentDecryptResponse.getData();
  451. CryptUserInfo cryptUserInfo = data.get(0).getCryptUserInfo();
  452. OrderDetail o = (OrderDetail) XMLUtil.convertXmlStrToObject(OrderDetail.class, odgrp.getBody());
  453. SendGoodsInfo sgi = new SendGoodsInfo();
  454. sgi.setConsigneeAddr(cryptUserInfo.getConsigneeAddr());
  455. sgi.setConsigneeMobileTel(cryptUserInfo.getConsigneeMobileTel());
  456. sgi.setConsigneeTel(cryptUserInfo.getConsigneeTel());
  457. sgi.setConsigneeName(cryptUserInfo.getConsigneeName());
  458. o.setSendGoodsInfo(sgi);
  459. List<com.iotechn.unimall.data.dto.shop.XmlObject.ItemInfo> itemInfo = o.getItemsList().getItemInfo();
  460. /**
  461. * 将多个图书拼接XML
  462. */
  463. String itemsStr = "";
  464. for (com.iotechn.unimall.data.dto.shop.XmlObject.ItemInfo ii : itemInfo) {
  465. Map<String, Object> hashMap = new HashMap<>();
  466. hashMap.put("DANG_DANG_ITEM_ID", ii.getItemID());
  467. hashMap.put("SHU_LIANG", ii.getOrderCount());
  468. hashMap.put("PRODUCT_ID", ii.getProductItemId());
  469. itemsStr += SendGood.processTemplate(SendGood.ONE_ITEM, hashMap);
  470. }
  471. /**
  472. * 组成OrderInfo
  473. */
  474. Wrapper wrapper = new EntityWrapper();
  475. wrapper.like("fuzi_name",shopOrder.getShippingComName());
  476. wrapper.eq("delete_flag",0);
  477. List<ShopTran> list = shopTranMapper.selectList(wrapper);
  478. HashMap<String, Object> stringObjectHashMap = new HashMap<>();
  479. stringObjectHashMap.put("DANG_DANG_ORDER", shopOrder.getDangOrder());
  480. if(list.size() == 0 ){
  481. // throw new Exception("物流公司不存在");
  482. System.out.println("物流公司不存在");
  483. stringObjectHashMap.put("KUAI_DI_GONG_SI", "99999");
  484. stringObjectHashMap.put("KUAI_DI_BIANMA", "99999");
  485. stringObjectHashMap.put("KUAI_DI_GONG_SI_DIAN_HUA", "99999");
  486. }
  487. else{
  488. stringObjectHashMap.put("KUAI_DI_GONG_SI", list.get(0).getName());
  489. stringObjectHashMap.put("KUAI_DI_BIANMA", list.get(0).getCode1());
  490. stringObjectHashMap.put("KUAI_DI_GONG_SI_DIAN_HUA", list.get(0).getPhone());
  491. }
  492. stringObjectHashMap.put("KUAI_DI_DAN_HAO", shopOrder.getShipmentNum());
  493. stringObjectHashMap.put("SEND_ITEMS", itemsStr);
  494. String orderListStr = SendGood.processTemplate(SendGood.ONE_ORDER, stringObjectHashMap);
  495. HashMap<String, Object> tmplHash = new HashMap<>();
  496. tmplHash.put("SEND_TIME", dateFormat.format(new Date()));
  497. tmplHash.put("ORDER_LIST", orderListStr);
  498. String xmlFileStr = SendGood.processTemplate(SendGood.TMPL, tmplHash);
  499. System.out.println(xmlFileStr);
  500. PrintWriter out = null;
  501. try {
  502. out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("sendGoodNotPlat.xml"), "GBK")));
  503. }catch (Exception e) {
  504. throw e;
  505. }
  506. out.write(xmlFileStr);
  507. out.close();
  508. System.out.println("XML文件创建成功!");
  509. /**
  510. * 发货!!
  511. */
  512. OrderGoodsSendRequest sendGoodsRequest = new OrderGoodsSendRequest();
  513. sendGoodsRequest.setSendGoodsFile(new FileItem(new File("sendGoodNotPlat.xml")));
  514. OrderGoodsSendResponse result = null;
  515. try {
  516. result = sdkClient.excute(sendGoodsRequest);
  517. } catch (ApiException e) {
  518. throw e;
  519. }
  520. System.out.println(result.toString());
  521. if(result.getResult().getOrdersList().get(0).getOrderOperCode() == 0 || result.getResult().getOrdersList().get(0).getOrderOperCode() == 605){
  522. ShopLog shopLog = new ShopLog();
  523. shopLog.setGmtCreate(new Date());
  524. shopLog.setTitle("当当订单发货成功");
  525. shopLog.setContent("店铺:"+shopAccount.getDangName()+",孔网订单:"+shopOrder.getOrderId()+",当当订单:"+shopOrder.getDangOrder());
  526. shopLogMapper.insert(shopLog);
  527. shopOrder.setDangOrderStatus("已发货");
  528. shopOrderMapper.update(shopOrder,new EntityWrapper<ShopOrder>().eq("order_id",shopOrder.getOrderId()));
  529. }
  530. else{
  531. ShopLog shopLog = new ShopLog();
  532. shopLog.setGmtCreate(new Date());
  533. shopLog.setTitle("当当订单发货失败");
  534. shopLog.setContent("店铺:"+shopAccount.getDangName()+",孔网订单:"+shopOrder.getOrderId()+",当当订单:"+shopOrder.getDangOrder()+",快递:"+shopOrder.getShippingComName());
  535. shopLogMapper.insert(shopLog);
  536. }
  537. }
  538. catch (Exception e){
  539. e.printStackTrace();
  540. ShopLog shopLog = new ShopLog();
  541. shopLog.setGmtCreate(new Date());
  542. shopLog.setTitle("当当发货异常");
  543. shopLog.setContent(e.getMessage());
  544. shopLogMapper.insert(shopLog);
  545. }
  546. }
  547. /**
  548. * 需要处理的任务
  549. * */
  550. private void doSomething1() {
  551. try{
  552. List<ShopAccount> list = shopAccountMapper.selectList(new EntityWrapper<>());
  553. for (ShopAccount shopAccount:list
  554. ) {
  555. flushCookie(shopAccount);
  556. List<ShopOrder> shopOrders = shopOrderMapper.selectList(new EntityWrapper<ShopOrder>()
  557. .eq("dang_order_status","未发货")
  558. .eq("account_id",shopAccount.getId())
  559. .eq("order_status_name","卖家已发货"));
  560. for (ShopOrder qqq:shopOrders
  561. ) {
  562. CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  563. HttpGet get = new HttpGet("https://shop.kongfz.com/buyer/order/index/?pageCurr=1&pageShow=9999&orderId="+qqq.getOrderId());
  564. //这里可以设置请求参数,token等
  565. get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
  566. get.addHeader("cookie",shopAccount.getFuziCookie());
  567. get.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  568. CloseableHttpResponse response = httpClient.execute(get);//执行获取响应
  569. try{
  570. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){//根据状态码处理
  571. String strTmp= EntityUtils.toString(response.getEntity(),"UTF-8");
  572. //返回字符串
  573. String res = unicodeToString(strTmp);
  574. JSONObject datas = JSONObject.parseObject(res);//转换成JSON格式
  575. Boolean status = (Boolean) datas.get("status");//获取返回数据状态,get获取的字段需要根据提供的返回值去获取
  576. List<ShopOrder> data = JSONArray.parseArray(datas.get("data").toString(),ShopOrder.class);//"data"是根据返回值设定
  577. for (ShopOrder tmp: data
  578. ) {
  579. //正则表达式,用于匹配非数字串,+号用于匹配出多个非数字串
  580. String regEx="[^0-9]+";
  581. Pattern pattern = Pattern.compile(regEx);
  582. //用定义好的正则表达式拆分字符串,把字符串中的数字留出来
  583. String[] cs = pattern.split(tmp.getRemarkText());
  584. String dangOrder = "";
  585. for (String str:cs
  586. ) {
  587. if(dangOrder.length()>= 11 || str.equals("*")){
  588. break;
  589. }
  590. dangOrder += str;
  591. }
  592. tmp.setDangOrder(dangOrder);
  593. tmp.setAccountId(shopAccount.getId());
  594. Long time = Long.parseLong(tmp.getShippingTime())+8*60*60;
  595. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  596. sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
  597. String time1 = sdf.format(new Date(time * 1000));
  598. tmp.setShippingTime(time1);
  599. tmp.setDeleteFlag(0);
  600. tmp.setGmtUpdate(new Date());
  601. tmp.setGmtCreate(new Date());
  602. if(tmp.getShippingComName().equals("快递包裹")||tmp.getShippingComName().equals("挂号印刷品")){
  603. tmp.setShippingComName("中国邮政");
  604. }
  605. ShopOrder tt = new ShopOrder();
  606. tt.setOrderId(tmp.getOrderId());
  607. tt = shopOrderMapper.selectOne(tt);
  608. if(tt == null){
  609. shopOrderMapper.insert(tmp);
  610. }
  611. else{
  612. if(!tt.getDangOrder().equals(tmp.getDangOrder())||!tt.getShippingComName().equals(tmp.getShippingComName())){
  613. shopOrderMapper.update(tmp,new EntityWrapper<ShopOrder>().eq("order_id",tt.getOrderId()));
  614. }
  615. dangOrderDeal(shopAccount,qqq);
  616. }
  617. }
  618. }
  619. } catch (IOException e) {
  620. throw e;
  621. }
  622. finally {
  623. response.close();
  624. httpClient.close();
  625. }
  626. }
  627. }
  628. }
  629. catch (Exception e) {
  630. ShopLog shopLog = new ShopLog();
  631. shopLog.setGmtCreate(new Date());
  632. shopLog.setTitle("同步定时任务异常");
  633. shopLog.setContent(e.getMessage());
  634. shopLogMapper.insert(shopLog);
  635. e.printStackTrace();
  636. }
  637. }
  638. private void doSomething2() {
  639. try{
  640. List<ShopAccount> list = shopAccountMapper.selectList(new EntityWrapper<>());
  641. for (ShopAccount shopAccount:list
  642. ) {
  643. flushCookie(shopAccount);
  644. for (int i = 1; i <= 5; i++) {
  645. CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  646. HttpGet get = new HttpGet("https://shop.kongfz.com/buyer/order/index/?pageCurr=" + i + "&pageShow=300&orderStatus=ShippedToReceipt");
  647. //这里可以设置请求参数,token等
  648. get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
  649. get.addHeader("cookie", shopAccount.getFuziCookie());
  650. CloseableHttpResponse response = httpClient.execute(get);//执行获取响应
  651. try {
  652. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//根据状态码处理
  653. String strTmp = EntityUtils.toString(response.getEntity(), "UTF-8");
  654. //返回字符串
  655. String res = unicodeToString(strTmp);
  656. JSONObject datas = JSONObject.parseObject(res);//转换成JSON格式
  657. Boolean status = (Boolean) datas.get("status");//获取返回数据状态,get获取的字段需要根据提供的返回值去获取
  658. List<ShopOrder> data = JSONArray.parseArray(datas.get("data").toString(), ShopOrder.class);//"data"是根据返回值设定
  659. if (data.size() == 0) {
  660. break;
  661. }
  662. for (ShopOrder tmp : data
  663. ) {
  664. //正则表达式,用于匹配非数字串,+号用于匹配出多个非数字串
  665. String regEx = "[^0-9]+";
  666. Pattern pattern = Pattern.compile(regEx);
  667. //用定义好的正则表达式拆分字符串,把字符串中的数字留出来
  668. String[] cs = pattern.split(tmp.getRemarkText());
  669. String dangOrder = "";
  670. for (String str : cs
  671. ) {
  672. if (dangOrder.length() >= 11 || str.equals("*")) {
  673. break;
  674. }
  675. dangOrder += str;
  676. }
  677. tmp.setDangOrder(dangOrder);
  678. tmp.setAccountId(shopAccount.getId());
  679. Long time = Long.parseLong(tmp.getShippingTime())+8*60*60;
  680. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  681. sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
  682. String time1 = sdf.format(new Date(time * 1000));
  683. tmp.setShippingTime(time1);
  684. tmp.setDeleteFlag(0);
  685. tmp.setGmtUpdate(new Date());
  686. tmp.setGmtCreate(new Date());
  687. if (tmp.getShippingComName().equals("快递包裹") || tmp.getShippingComName().equals("挂号印刷品")) {
  688. tmp.setShippingComName("中国邮政");
  689. }
  690. ShopOrder tt = new ShopOrder();
  691. tt.setOrderId(tmp.getOrderId());
  692. tt = shopOrderMapper.selectOne(tt);
  693. if (tt == null) {
  694. shopOrderMapper.insert(tmp);
  695. } else {
  696. if (tt.getDangOrderStatus().equals("未发货") && !tt.getDangOrder().equals(tmp.getDangOrder())) {
  697. shopOrderMapper.update(tmp, new EntityWrapper<ShopOrder>().eq("order_id", tt.getOrderId()));
  698. }
  699. }
  700. }
  701. }
  702. } catch (IOException e) {
  703. throw e;
  704. } finally {
  705. response.close();
  706. httpClient.close();
  707. }
  708. }
  709. }
  710. doSomething2();
  711. }
  712. catch (Exception e){
  713. ShopLog shopLog = new ShopLog();
  714. shopLog.setGmtCreate(new Date());
  715. shopLog.setTitle("爬取定时任务异常");
  716. shopLog.setContent(e.getMessage());
  717. shopLogMapper.insert(shopLog);
  718. e.printStackTrace();
  719. }
  720. }
  721. }