package com.uas.eis.serviceImpl; import com.uas.eis.dao.BaseDao; import com.uas.eis.dao.EdiLogDao; import com.uas.eis.dao.EdiPostLogDao; import com.uas.eis.dao.SqlRowList; import com.uas.eis.entity.EdiLog; import com.uas.eis.entity.EdiPostLog; import com.uas.eis.service.StockService; import com.uas.eis.utils.*; import org.apache.commons.collections.map.HashedMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * Created by luhg on 2018/4/19. * 出入库相关 */ @Service public class StockServiceImpl implements StockService{ private static final String sendStockToYundingUrl = "http://dc.oclean.com/putinstorage"; private static final String stockGetPostFromYundingUrl = "http://dc.oclean.com/getinstorage"; private static final String sendStockPostConfirmToYundingUrl = "http://dc.oclean.com/setconfirmstatus"; @Autowired BaseDao baseDao; @Autowired EdiLogDao ediLogDao; @Autowired EdiPostLogDao ediPostLogDao; @Override public Map postStockToYunding(Integer id) { Map data = getMainData(id); List> datas = new LinkedList<>(); datas.add(data); String timestamp = String.valueOf(System.currentTimeMillis()/1000); String outerNo = String.valueOf(data.get("outer_no")); Map postMapData = new HashMap<>(); postMapData.put("app_key", Constant.yundingAppKey); postMapData.put("time_stamp",timestamp); postMapData.put("data",datas); return postData(outerNo,postMapData,timestamp); } private Map postData(String outerNo,Map data,String timestamp){ Map res = new HashMap<>(); String jsonData = JacksonUtil.toSortJson(data); try{ HttpUtil.Response response = HttpUtil.doPostToYunding(sendStockToYundingUrl,jsonData,timestamp); String responseText = response.getResponseText(); System.out.println("responseText:" + responseText); System.out.println("responseCode:" + response.getStatusCode()); if(response.getStatusCode()!=200){ throw new RuntimeException("yunding server error:" + responseText); } Map responseMap = JacksonUtil.fromJson(response.getResponseText()); if(!"0".equals(String.valueOf(responseMap.get("code")))){ res.put("success",false); res.put("remark",responseMap.get("message")); }else{ Map msgJson = (Map) responseMap.get("msg_json"); List successCodes = (List)msgJson.get("s_no"); if(successCodes.contains(outerNo)){ res.put("success",true); ediLogDao.save(LogUtil.getSendSuccessLog(outerNo,jsonData,"send success")); }else{ res.put("success",false); res.put("remark","云顶处理失败!"); } } }catch (Exception e){ e.printStackTrace(); res.put("success",false); res.put("remark",e.getMessage()); } return res; } @Override public void autoPost(){ String timestamp = String.valueOf(System.currentTimeMillis()/1000); Map postMapData = new HashMap<>(); postMapData.put("app_key", Constant.yundingAppKey); postMapData.put("time_stamp",timestamp); postMapData.put("start_time","1970-01-01 00:00:00"); postMapData.put("end_time","2099-01-01 00:00:00"); postMapData.put("status",2); postMapData.put("page_size",100); postMapData.put("page_index",0); String jsonData = JacksonUtil.toSortJson(postMapData); String responseText = null; try { HttpUtil.Response response = HttpUtil.doPostToYunding(stockGetPostFromYundingUrl,jsonData,timestamp); if(response.getStatusCode()!=200){ responseText = "yunding server error"; throw new RuntimeException(response.getResponseText()); } responseText = response.getResponseText(); System.out.println("responseText" + responseText); Map responseMap = JacksonUtil.fromJson(response.getResponseText()); if(!"0".equals(String.valueOf(responseMap.get("code")))){ ediLogDao.save(LogUtil.getRequestFailLog(responseText)); return; } if(responseMap.get("data")==null){ return; } List> datas = (List>) responseMap.get("data"); if(datas.size()>0){ execPostProcedure(datas,responseText); } }catch (Exception e){ e.printStackTrace(); ediLogDao.save(LogUtil.getPostFailLog(responseText,e.getMessage())); } } public void execPostProcedure(List> datas,String responseText){ String code = null; String piClass = null; EdiPostLog postHist = null; for(Map data:datas){ code = String.valueOf(data.get("outer_no")); piClass = String.valueOf(data.get("src_order_type")); postHist = null; try { postHist = ediPostLogDao.findByCodeAndPiClass(code,piClass); if(postHist!=null){ //说明之前已经过账成功 postConfirmToYunding(code,1); }else{ //没有记录,说明没有过账成功 String out = baseDao.callProcedure("SP_YUNDING_STOCKPOST",new Object[]{code,piClass}); if (out!=null){ ediLogDao.save(LogUtil.getPostFailLog(code,responseText,out)); }else{ ediLogDao.save(LogUtil.getPostSuccessLog(code,responseText)); ediPostLogDao.save(LogUtil.getLogToAvoidRepeatPost(code,piClass)); //记录到edi_post_log,防止调用接口失败,下次重复过账 postConfirmToYunding(code,1); } } }catch (Exception e){ e.printStackTrace(); ediLogDao.save(LogUtil.getPostFailLog(code,responseText,e.getMessage())); } } } public void postConfirmToYunding(String code,int type){ String timestamp = String.valueOf(System.currentTimeMillis()/1000); Map postMapData = new HashMap<>(); postMapData.put("app_key", Constant.yundingAppKey); postMapData.put("time_stamp",timestamp); postMapData.put("type",type); postMapData.put("outer_no",code); String jsonData = JacksonUtil.toSortJson(postMapData); try{ HttpUtil.Response response = HttpUtil.doPostToYunding(sendStockPostConfirmToYundingUrl,jsonData,timestamp); System.out.println("confirm response:" + response.getResponseText()); }catch (Exception e){ e.printStackTrace(); } } private Map getMainData(Integer id){ Map data = new HashMap<>(); SqlRowSet rs = baseDao.getJdbcTemplate().queryForRowSet("select pi_id,pi_class,pi_inoutno,pi_whcode,pi_purpose,pi_remark from prodinout where pi_id=" + id); String piClass = null; if(rs.next()){ piClass = rs.getString("pi_class"); data.put("outer_no",rs.getString("pi_inoutno")); data.put("warehouse_no",getWarehouseCode(piClass,rs.getString("pi_whcode"),rs.getString("pi_purpose"))); data.put("out_warehouse_no",rs.getString("pi_whcode")); data.put("remark",rs.getString("pi_remark")); data.put("order_type",getOrderType(piClass)); data.put("src_order_type",piClass); data.put("details_list",getDetailData(id)); } return data; } private String getWarehouseCode(String piClass,String piWhCode,String piPurpose){ if("拨出单".equals(piClass)){ return piPurpose; } return piWhCode; } private List> getDetailData(Integer id){ List> datas = new LinkedList<>(); Map data = new HashMap<>(); SqlRowList rs = baseDao.queryForRowSet("select pd_piclass,pd_id,pd_ordercode,pd_orderdetno,pd_batchcode,pd_prodcode,pd_inqty,pd_outqty,pd_description from prodiodetail where pd_piid=" + id); while (rs.next()){ data = new HashMap<>(); data.put("child_no",rs.getString("pd_id")); data.put("purchase_no",rs.getString("pd_ordercode")); data.put("purchase_detno",rs.getString("pd_orderdetno")); data.put("batch_no",rs.getString("pd_batchcode")); data.put("stockin_num",getQty(rs.getString("pd_piclass"),rs.getInt("pd_inqty"),rs.getInt("pd_outqty"))); data.put("spec_no",rs.getString("pd_prodcode")); data.put("remark",rs.getString("pd_description")); datas.add(data); } return datas; } private int getQty(String piClass,int inQty,int outQty){ int correctQty = 0; switch (piClass){ case "采购验收单": correctQty = inQty; break; case "采购验退单": correctQty = outQty; break; case "委外验收单": correctQty = inQty; break; case "委外验退单": correctQty = outQty; break; case "拨出单": correctQty = outQty; break; case "其它出库单": correctQty = outQty; break; case "其它入库单": correctQty = inQty; break; default:break; } return correctQty; } private int getOrderType(String piClass){ int orderType = -1; switch (piClass){ case "采购验收单": orderType = 0; break; case "委外验收单": orderType = 0; break; case "其它入库单": orderType = 0; break; case "拨出单": orderType = 1; break; case "采购验退单": orderType = 2; break; case "委外验退单": orderType = 2; break; case "其它出库单": orderType = 2; break; default:break; } return orderType; } }