TaoBaoDownLoadTask.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package com.uas.eis.task;
  2. import com.taobao.api.DefaultTaobaoClient;
  3. import com.taobao.api.TaobaoClient;
  4. import com.taobao.api.domain.Order;
  5. import com.taobao.api.domain.Trade;
  6. import com.taobao.api.request.TopOaidDecryptRequest;
  7. import com.taobao.api.request.TradesSoldGetRequest;
  8. import com.taobao.api.response.TopOaidDecryptResponse;
  9. import com.taobao.api.response.TradesSoldGetResponse;
  10. import com.uas.eis.core.config.TaoBaoConfig;
  11. import com.uas.eis.dao.BaseDao;
  12. import com.uas.eis.utils.CollectionUtil;
  13. import com.uas.eis.utils.DateUtil;
  14. import com.uas.eis.utils.StringUtil;
  15. import oracle.sql.DATE;
  16. import org.apache.log4j.Logger;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.scheduling.annotation.Scheduled;
  19. import org.springframework.stereotype.Component;
  20. import java.util.*;
  21. @Component
  22. public class TaoBaoDownLoadTask {
  23. public static Logger logger = Logger.getLogger(TaoBaoDownLoadTask.class);
  24. @Autowired
  25. private TaoBaoConfig taoBaoConfig;
  26. @Autowired
  27. private BaseDao baseDao;
  28. /**
  29. * 下载订单
  30. * */
  31. @Scheduled(cron = "0 0/10 * * * ?")
  32. public void DownLoadOrder(){
  33. /**
  34. * 有效店铺
  35. * */
  36. List<Map<String,Object>> shopList = baseDao.queryForList("SELECT TB_ID,TB_CODE,TB_LASTSYNCDATE,TB_OPENUID,TB_NICK from TBAUTHORIZATION where validflag=1 ORDER BY TB_LASTSYNCDATE ASC");
  37. logger.info("Start downLoad SaleOrder---");
  38. final boolean[] downLoadFlag = {false};
  39. TaobaoClient client = new DefaultTaobaoClient(taoBaoConfig.getServerUrl(), taoBaoConfig.getAppKey(), taoBaoConfig.getAppSecret());
  40. TradesSoldGetRequest req = new TradesSoldGetRequest();
  41. req.setFields("total_results,has_next,trades,seller_nick,pic_path,payment,seller_rate,post_fee,receiver_name,receiver_state,receiver_address,receiver_zip,receiver_mobile"+
  42. ",receiver_phone,consign_time,received_payment,receiver_country,receiver_town,order_tax_fee,shop_pick,tid,num,num_iid,status,title,type,price,discount_fee"+
  43. ",total_fee,created,pay_time,modified,end_time,seller_flag,buyer_nick,has_buyer_message,credit_card_fee,step_trade_status,step_paid_fee,mark_desc,shipping_type"+
  44. ",adjust_fee,trade_from,service_orders,oid,item_oid,service_id,service_detail_url,num,price,payment,title,total_fee,buyer_nick,refund_id,seller_nick,pic_path"+
  45. ",tmser_spu_code,oid_str,buyer_rate,receiver_city,receiver_district,o2o,o2o_guide_id,o2o_delivery,orders,item_meal_name,pic_path,seller_nick,buyer_nick,refund_status,outer_iid,snapshot_url,snapshot,timeout_action_time,buyer_rate,seller_rate"+
  46. ",seller_type,cid,sub_order_tax_fee,sub_order_tax_rate,oid,status,title,item_oid,type,sku_properties_name,order_attr,shipping_type"+
  47. ",md_qualification,customization,inv_type,shipper,f_type,f_status,f_term,assembly_rela,cl_down_payment,cl_month_payment,cl_tail_payment"+
  48. ",cl_installment_num,cal_penalty,cl_service_fee,cl_car_taker,cl_car_taker_phone,cl_car_taker_i_d_num,cl_car_taker_id_num,down_payment"+
  49. ",down_payment_ratio,month_payment,tail_payment,installment_num,penalty,service_fee,oid_str,nr_reduce_inv_fail,sort_info"+
  50. ",rt_omni_outer_sc_id,rt_omni_sc_id,modify_address,ti_modify_address_time,omni_jxs_outerid,propoint,brand_light_shop_source,special_refund_type"+
  51. ",extend_info,service_type,threepl_timing,is_o2o_passport,delivery_time,sign_time");
  52. shopList.stream().forEach(shop -> {
  53. String tbOpenuid = String.valueOf(shop.get("TB_OPENUID"));
  54. String TB_NICK = String.valueOf(shop.get("TB_NICK"));
  55. List<String> executeSQLS = new ArrayList<>();
  56. String sessionKey = String.valueOf(shop.get("TB_CODE"));
  57. Calendar calendar = Calendar.getInstance();
  58. calendar.setTime(DateUtil.parse(String.valueOf(shop.get("TB_LASTSYNCDATE")),"yyyy-MM-dd HH:mm:ss"));
  59. calendar.add(Calendar.DATE, -1);
  60. //若超过三个月则结束日期= 上次对接时间+3个月
  61. Calendar calendarEnd = Calendar.getInstance();
  62. calendarEnd.setTime(DateUtil.parse(String.valueOf(shop.get("TB_LASTSYNCDATE")), "yyyy-MM-dd HH:mm:ss"));
  63. calendarEnd.add(Calendar.MONTH, 3);
  64. Date endDate = new Date();
  65. if (calendarEnd.getTime().getTime() < endDate.getTime()) {
  66. endDate = calendarEnd.getTime();
  67. }
  68. req.setStartCreated(calendar.getTime());
  69. req.setEndCreated(endDate);
  70. //本地调试用
  71. /*
  72. Calendar calendartest1 = Calendar.getInstance();
  73. calendartest1.setTime(DateUtil.parse("2025-05-05 00:00:00","yyyy-MM-dd HH:mm:ss"));
  74. Calendar calendartest2 = Calendar.getInstance();
  75. calendartest2.setTime(DateUtil.parse("2025-05-06 00:00:00","yyyy-MM-dd HH:mm:ss"));
  76. req.setStartCreated(calendartest1.getTime());
  77. req.setEndCreated(calendartest2.getTime());
  78. */
  79. req.setUseHasNext(true);
  80. List<Trade> trades = new ArrayList<>();
  81. try {
  82. TradesSoldGetResponse rsp = client.execute(req, sessionKey);
  83. if(rsp.getMsg()!=null&&"Invalid session".equals(rsp.getMsg())){
  84. baseDao.execute("update TBAUTHORIZATION set validflag=0,unvalidtime=sysdate, UNVALIDREMARK='"+ "("+StringUtil.nvl(rsp.getSubCode(),rsp.getErrorCode())+")"+StringUtil.nvl(rsp.getSubMsg(),rsp.getMsg()) +"' where tb_id = "+shop.get("TB_ID"));
  85. }else {
  86. if(!CollectionUtil.isEmpty(rsp.getTrades())){
  87. Long pageCount = 1L;
  88. getNextTBOrder(pageCount,trades,rsp,req,client,sessionKey);
  89. logger.info(TB_NICK+"("+tbOpenuid+")店铺获取单数"+trades.size());
  90. for(Trade trade: trades){
  91. formatTrade(trade, sessionKey,tbOpenuid, executeSQLS);
  92. }
  93. if(executeSQLS.size()>0){
  94. downLoadFlag[0] = true;
  95. System.out.println("执行SQL条数:"+executeSQLS.size());
  96. // System.out.println("SQL:"+executeSQLS.toString());
  97. baseDao.execute(executeSQLS);
  98. }
  99. //更新当前店铺的最近更新时间
  100. baseDao.updateByCondition("TBAUTHORIZATION","TB_LASTSYNCDATE=to_date ( '" + DateUtil.format(endDate, DateUtil.FORMAT_YMD_HMS) + "','YYYY-MM-DD hh24:mi:ss') ","TB_CODE ='"+sessionKey+"'");
  101. }
  102. }
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. logger.info("淘宝未响应并返回订单数据");
  106. }
  107. });
  108. //部分信息处理
  109. if(downLoadFlag[0]){
  110. baseDao.callProcedure("SP_UPDATE_SALEINFO");
  111. }
  112. }
  113. private void getNextTBOrder(Long pageNo,List<Trade> trades,TradesSoldGetResponse rsp,TradesSoldGetRequest req,TaobaoClient client,String sessionKey ){
  114. if(!CollectionUtil.isEmpty(rsp.getTrades())){
  115. trades.addAll(rsp.getTrades());
  116. if(rsp.getHasNext()!=null&&rsp.getHasNext()){
  117. Long pageSize = 40L;
  118. pageNo = pageNo + 1;
  119. req.setPageNo(pageNo);
  120. req.setPageSize(pageSize);
  121. try {
  122. TradesSoldGetResponse rsp1 = client.execute(req, sessionKey);
  123. getNextTBOrder(pageNo,trades,rsp1,req,client,sessionKey);
  124. } catch (Exception e) {
  125. throw new RuntimeException(e);
  126. }
  127. }
  128. }
  129. }
  130. private void formatTrade(Trade trade ,String sessionKey,String tbOpenuid, List<String> executeSqls){
  131. String oaid=trade.getOaid();
  132. String tid=trade.getTid().toString();
  133. boolean isEXISTS = baseDao.checkIf("SALE", "SA_CODE='"+tid+"'");
  134. if(isEXISTS) {
  135. return;
  136. }
  137. logger.info("订单信息:单号{"+trade.getTid()+"},状态{"+trade.getStatus()+"},店铺{"+trade.getSellerNick()+"}");
  138. TopOaidDecryptRequest req= new TopOaidDecryptRequest();
  139. List<TopOaidDecryptRequest.ReceiverQuery> queryList = new ArrayList<TopOaidDecryptRequest.ReceiverQuery>();
  140. TopOaidDecryptRequest.ReceiverQuery receiverQuery = new TopOaidDecryptRequest.ReceiverQuery();
  141. receiverQuery.setOaid(oaid);
  142. receiverQuery.setTid(tid);
  143. receiverQuery.setScene("1001");
  144. queryList.add(receiverQuery);
  145. req.setQueryList(queryList);
  146. TaobaoClient client = new DefaultTaobaoClient(taoBaoConfig.getServerUrl(), taoBaoConfig.getAppKey(), taoBaoConfig.getAppSecret());
  147. String name_oaid=trimNull(trade.getReceiverName() );
  148. String receiver_mobile=trimNull(trade.getReceiverMobile() );
  149. String address=trimNull(trade.getReceiverState() ) + trimNull(trade.getReceiverCity() ) + trimNull(trade.getReceiverDistrict() ) + trimNull(trade.getReceiverAddress() );
  150. if(oaid!=null) {
  151. try {
  152. TopOaidDecryptResponse rep = client.execute(req, sessionKey);
  153. name_oaid = rep.getReceiverList().get(0).getName();
  154. receiver_mobile=rep.getReceiverList().get(0).getMobile();
  155. address=trimNull(rep.getReceiverList().get(0).getState() ) + trimNull(rep.getReceiverList().get(0).getCity() ) + trimNull(rep.getReceiverList().get(0).getDistrict() ) + trimNull( rep.getReceiverList().get(0).getAddressDetail() );
  156. } catch (Exception e) {
  157. logger.info("淘宝返回敏感信息失败,"+e.getMessage());
  158. }
  159. }
  160. name_oaid=name_oaid.replaceAll("'","");
  161. String modified = DateUtil.format((trade.getModified() == null ? trade.getCreated() : trade.getModified()), DateUtil.FORMAT_YMD_HMS);
  162. String end_time = DateUtil.format((trade.getEndTime() == null ? trade.getCreated() : trade.getEndTime()), DateUtil.FORMAT_YMD_HMS);
  163. String consigntime = DateUtil.format((trade.getConsignTime() == null ? trade.getCreated() : trade.getConsignTime()), DateUtil.FORMAT_YMD_HMS);
  164. if(!"TRADE_NO_CREATE_PAY".equals(trade.getStatus())
  165. &&!"WAIT_BUYER_PAY".equals(trade.getStatus())
  166. &&!"PAY_PENDING".equals(trade.getStatus())
  167. &&!"WAIT_BUYER_CONFIRM_GOODS".equals(trade.getStatus())
  168. &&!"TRADE_CLOSED_BY_TAOBAO".equals(trade.getStatus())
  169. &&!"TRADE_CLOSED".equals(trade.getStatus())
  170. &&!"TRADE_FINISHED".equals(trade.getStatus())) {
  171. Long said = baseDao.queryForObject("select sale_seq.nextval from dual", Long.class);
  172. executeSqls.add("INSERT INTO SALESECRETINFO(SAID, NAME,MOBILE, PLACE,SACODE) SELECT "+said+",pkg_security.encrypt_data('"+taoBaoConfig.getPublicKey()+"','"+name_oaid+"')," +
  173. "pkg_security.encrypt_data('"+taoBaoConfig.getPublicKey()+"','"+receiver_mobile+"'), pkg_security.encrypt_data('"+taoBaoConfig.getPublicKey()+"','"+address+"'),'" + tid + "' FROM DUAL");
  174. String INSERTSALESql = "insert into sale( SA_NEEDUPDATE,SA_DISCOUNTFEE,SA_TRADESTATUS, sa_sellernick,sa_custcode,sa_paymentscode" +
  175. ",SA_TAOBAOID,sa_payments,sa_custname,sa_kind,sa_wwh_user,sa_need15" +
  176. " ,sa_id,sa_tradeid,sa_code,sa_date,sa_recorder,sa_currency,sa_rate" +
  177. ",sa_apcustname,sa_need9,sa_toplace" +
  178. ",sa_transport,sa_seller,sa_updatedate" +
  179. ",sa_enddate,sa_statuscode,sa_status,sa_fare,sa_total" +
  180. ",sa_recamount,sa_recorddate,sa_printstatuscode,sa_remark,sa_tbopenuid)" +
  181. " SELECT 1,'" + trade.getDiscountFee() + "','" + trimNull(trade.getStatus()) + "',trim(nvl('" + trimNull(trade.getSellerNick()) + "','静夜思solong')),'GN0008358','P001'" +
  182. ", " + tid + " ,'现结','HLK淘宝','国内标准销售订单','" + trimNull(name_oaid) + "','" + trimNull(receiver_mobile) + "'" +
  183. " , " + said + "," + tid + ",'" + tid + "', to_date ('" + end_time + "','YYYY-MM-DD hh24:mi:ss') ,'管理员','RMB','1'" +
  184. ",'"+ trimNull(name_oaid) + "','" + trimNull(trade.getBuyerNick()) + "','" + address.replaceAll("'", "") + "'" +
  185. ",'"+ trimNull(trade.getShippingType()) + "','" + trimNull(trade.getO2oGuideName()) + "', to_date ('" + modified + "','YYYY-MM-DD hh24:mi:ss') " +
  186. ", to_date ('" + end_time + "','YYYY-MM-DD hh24:mi:ss') ,'ENTERING','在录入','" + trimNull(trade.getPostFee()) + "','" + trimNull(trade.getPayment()) + "'" +
  187. ",'"+ trimNull(trade.getPayment()) + "', to_date ('" + consigntime + "','YYYY-MM-DD hh24:mi:ss') ,'unprint','淘宝自动抓取','"+tbOpenuid+"' FROM DUAL " +
  188. " WHERE NOT EXISTS ( select 1 from sale WHERE SA_TAOBAOID=" + tid + " ) ";
  189. executeSqls.add(INSERTSALESql);
  190. List<Order> orders = trade.getOrders();
  191. for (int j = 0; j < orders.size(); j++) {
  192. String INSERTSALEDETAILSql = "insert into saledetail(SD_PROPERTIES,sd_remark,sd_id,sd_said,sd_code,sd_detno,sd_prodcode,sd_qty,sd_price,sd_total" +
  193. ",sd_statuscode,sd_status,sd_discount,SD_DIVIDE_ORDER_FEE,SD_PART_MJZ_DISCOUNT,SD_OID)" +
  194. " SELECT '" + trimNull(orders.get(j).getSkuPropertiesName()) + "','" + orders.get(j).getTitle() + "', saledetail_seq.nextval ," + said + " ,'" + tid + "'," + (j+1) + ",'" + trimNull(orders.get(j).getOuterIid()) + "'," + orders.get(j).getNum() + "," + orders.get(j).getPrice() + " ," + orders.get(j).getPayment() +
  195. ",'ENTERING','在录入', " + orders.get(j).getDiscountFee() + "," + orders.get(j).getDivideOrderFee() + "," + orders.get(j).getPartMjzDiscount() +","+orders.get(j).getOid()
  196. + " FROM DUAL WHERE NOT EXISTS ( select sd_id from saledetail WHERE SD_CODE = '" + tid + "' and sd_detno = " + (j+1) + " ) ";
  197. executeSqls.add(INSERTSALEDETAILSql);
  198. }
  199. }
  200. }
  201. public String trimNull(String str){
  202. if("".equals(str)||str==null||"null".equals(str)){
  203. return "";
  204. }else{
  205. return str.trim();
  206. }
  207. }
  208. }