ERPServiceImpl.java 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. package com.uas.eis.service.Impl;
  2. import com.uas.eis.core.config.SpObserver;
  3. import com.uas.eis.core.support.TokenProperties;
  4. import com.uas.eis.dao.*;
  5. import com.uas.eis.service.ERPService;
  6. import com.uas.eis.utils.*;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.http.HttpStatus;
  11. import org.springframework.stereotype.Service;
  12. import java.util.*;
  13. import java.util.stream.Collectors;
  14. /**
  15. * @author koul
  16. * @email koul@usoftchina.com
  17. * @date 2021-12-06 18:27
  18. */
  19. @Service
  20. public class ERPServiceImpl implements ERPService {
  21. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  22. private static Map<String, String> tokenConfig = TokenProperties.getAllProperty();
  23. @Autowired
  24. private BaseDao baseDao;
  25. @Override
  26. public Map<String, Object> createSticker(String master, Integer id) {
  27. Map<String,Object> retMap = new HashMap<>();
  28. retMap.put("success",true);
  29. logger.info("createSticker-Begin:master {} id {}",master,id);
  30. SpObserver.putSp(master);
  31. SqlRowList docLoist = baseDao.queryForRowSet("select cd_cpn,min(CD_DC) ztcnno,pc_zbzsmount_user zzbsmount,pc_zzxsmount_user zzxsmount,pc_zzbsmount_user zbzsmount " +
  32. " ,sum(CD_QTY) zmount,cd_wflag zwidth,cd_remark zremark,min(cd_lotno) zzstz " +
  33. "from CatlDocDetail left join CatlDoc on ca_id = cd_caid left join customer on cu_code = CA_CUSTCODE left join product on pr_code = CD_PRCODE left join PRODUCTCUSTOMER on pc_custid= cu_id and pc_prodid=pr_id " +
  34. "where cd_caid = ? and CD_PANID is null and nvl(pc_zbzsmount_user,0)>0 " +
  35. "group by CD_CPN,pc_zbzsmount_user,pc_zzxsmount_user,pc_zzbsmount_user,cd_wflag,cd_remark order by min(cd_detno)",id);
  36. if(!docLoist.hasNext()){
  37. // System.out.println("no docLoist!");
  38. retMap.put("success",false);
  39. retMap.put("message","没有需要对接的明细.");
  40. logger.info("createSticker-F:master {} id {} no docLoist!",master,id);
  41. }
  42. Object[] obs = baseDao.getFieldsDataByCondition("YITOA_DATACENTER.dock_catl_config A "
  43. , new String[]{"URL_","deipaaskeyauth","appKey", "appSecret","VENDCODE"}
  44. , "username='"+master+"' and A.ENVTYPE = (SELECT B.ENVTYPE FROM YITOA_DATACENTER.DOCK_CATL_EVCONFIG B WHERE A.username = B.username )");
  45. String url = String.valueOf(obs[0]);
  46. String deipaaskeyauth = String.valueOf(obs[1]);
  47. String vendcode = String.valueOf(obs[4]);
  48. Map<String,String> map = new HashMap<>();
  49. map.put("url",url);
  50. map.put("deipaaskeyauth",deipaaskeyauth);
  51. map.put("appKey",String.valueOf(obs[2]));
  52. map.put("appSecret",String.valueOf(obs[3]));
  53. Map<String,Object> tokenMap = getToken(map);
  54. if(!(boolean)tokenMap.get("success")){
  55. return tokenMap;
  56. }
  57. String action="/SNC/outer_SNC_createSticker?sap-client=810&interfacename=ZIRFC_TP2SNC_CREATESTICKER";
  58. String deipaasjwt = "Bearer "+tokenMap.get("token");
  59. map.put("deipaasjwt",deipaasjwt);
  60. StringBuffer errMsg = new StringBuffer();
  61. for (Map<String,Object> docMap: docLoist.getResultList()) {
  62. try {
  63. // CD_CPN,pr_capacity,pr_zxbzs,cd_wflag,cd_remark
  64. String matnr = String.valueOf(docMap.get("cd_cpn"));
  65. String zwidth = StringUtil.nvl(docMap.get("zwidth"),"");
  66. String zremark = StringUtil.nvl(docMap.get("zremark"),"");
  67. Map<String,Object> paraMap=new HashMap<>();
  68. paraMap.put("matnr",matnr);//物料号:客户料号
  69. paraMap.put("ztcnno",docMap.get("ztcnno"));//制造日期: 取最小DC
  70. paraMap.put("zzstz",docMap.get("zzstz"));//供应商批次: 用最小批次作为虚拟批次
  71. // paraMap.put("zeiar",docMap.get("zeiar"));//版本
  72. paraMap.put("zwidth",zwidth);//宽度
  73. paraMap.put("zmount",docMap.get("zmount"));//本次生产总数量
  74. paraMap.put("zzbsmount",docMap.get("zzbsmount"));//栈板容量
  75. paraMap.put("zzxsmount",docMap.get("zzxsmount"));//纸箱容量
  76. paraMap.put("zbzsmount",docMap.get("zbzsmount"));//包装袋容量
  77. paraMap.put("zremark",zremark);//备注
  78. paraMap.put("partner",vendcode);//供应商编码 固定值
  79. HttpUtil.Response response = HttpUtil.doPost(url+action, JacksonUtil.toJson(paraMap), deipaaskeyauth,deipaasjwt);
  80. if (response.getStatusCode() == HttpStatus.OK.value()){
  81. String res = response.getResponseText();
  82. if(res!=null && !"".equals(res)){
  83. // System.out.println("res:"+res);
  84. Map<String,Object> resData = JacksonUtil.fromJson(res);
  85. if("S".equals(String.valueOf(resData.get("e_type")))){
  86. List<Map<String,Object>> outdata = (List) resData.get("outdata");
  87. // System.out.println("outdata.size:"+outdata.size());
  88. //栈ID
  89. // List<Map<String,Object>> palletIdList = outdata.stream().filter(od->{
  90. // return (Double.valueOf(od.get("levels").toString().trim()) == 0);
  91. // }).collect(Collectors.toList());
  92. //箱ID
  93. List<Map<String,Object>> boxIdList = outdata.stream().filter(od->{
  94. return (Double.valueOf(od.get("levels").toString().trim()) == 1);
  95. }).collect(Collectors.toList());
  96. //袋ID
  97. List<Map<String,Object>> panIdList = outdata.stream().filter(od->{
  98. return (Double.valueOf(od.get("levels").toString().trim()) == 2);
  99. }).collect(Collectors.toList());
  100. //更新箱ID、袋ID
  101. List<String> sqls = new ArrayList<>();
  102. // CD_CPN,pr_capacity,pr_zxbzs,cd_wflag,cd_remark
  103. // matnr,zwidth,zremark
  104. SqlRowList updateList = baseDao.queryForRowSet("select cd_id,cd_lotno,cd_dc,nvl(cd_ed,to_char(to_date(cd_dc,'yyyymmdd')+365,'yyyymmdd')) cd_ed from CatlDocDetail " +
  105. " where cd_caid = "+id+" and CD_PANID is null and CD_CPN = '"+matnr+"' " +
  106. " and nvl(cd_wflag,' ') = '"+StringUtil.nvl(zwidth," ")+"'" +
  107. " and nvl(cd_remark,' ') = '"+StringUtil.nvl(zremark," ")+"'" +
  108. " order by cd_dc,cd_detno");
  109. List<Map<String,Object>> updateStickerList = new ArrayList<>();
  110. if(panIdList.size() == updateList.getResultList().size()){
  111. for (int i = 0; i < updateList.getResultList().size(); i++) {
  112. Map<String,Object> updateMap = updateList.getResultList().get(i);
  113. Map<String,Object> idMap = panIdList.get(i);
  114. String panId = idMap.get("zalt_id").toString();
  115. String boxId = idMap.get("zalt_id_upper").toString();
  116. //获取栈ID
  117. String palletId = "";
  118. Optional<Map<String,Object>> boxMsg = boxIdList.stream()
  119. .filter(bMap -> bMap.get("zalt_id").equals(boxId))
  120. .findFirst();
  121. if(boxMsg.isPresent()&&!boxMsg.get().isEmpty()){
  122. palletId = boxMsg.get().get("zalt_id_upper").toString();
  123. }
  124. sqls.add("update CatlDocDetail set cd_palletid='"+StringUtil.nvl(palletId,"")+"' ,CD_PANID='"+panId+"',CD_BOXID='"+boxId+"'" +
  125. ",cd_batchid='"+idMap.get("batch_id")+"',cd_wbs='"+idMap.get("wbs")+"' " +
  126. "where cd_id = "+updateMap.get("cd_id"));
  127. if(!updateMap.get("cd_lotno").equals(idMap.get("prtbatchid"))){
  128. Map<String,Object> updatePanMap = new HashMap<>();
  129. updatePanMap.put("matnr",matnr);//物料号
  130. updatePanMap.put("zalt_id",panId);//贴纸ID
  131. updatePanMap.put("prtbatchid",updateMap.get("cd_lotno"));//供应商批次
  132. updatePanMap.put("manufacturing_date",updateMap.get("cd_dc"));//生产日期
  133. updatePanMap.put("atlyx",updateMap.get("cd_ed"));//有效日期
  134. updateStickerList.add(updatePanMap);
  135. Map<String,Object> updateBoxMap = new HashMap<>();
  136. updateBoxMap.put("matnr",matnr);//物料号
  137. updateBoxMap.put("zalt_id",boxId);//贴纸ID
  138. updateBoxMap.put("prtbatchid",updateMap.get("cd_lotno"));//供应商批次
  139. updateBoxMap.put("manufacturing_date",updateMap.get("cd_dc"));//生产日期
  140. updateBoxMap.put("atlyx",updateMap.get("cd_ed"));//有效日期
  141. updateStickerList.add(updateBoxMap);
  142. }
  143. }
  144. // 更新栈ID、箱ID、袋ID
  145. if(sqls.size()>0){
  146. baseDao.execute(sqls);
  147. //第二个接口 更新供应商批次
  148. Map<String,Object> updateStickerMap = updateStickerByList(master, id,map,updateStickerList);
  149. if(!(boolean) updateStickerMap.get("success")){
  150. errMsg.append("更新供应商批次失败:客户料号:"+matnr).append(updateStickerMap.get("message")).append("</br>");
  151. }
  152. }
  153. }else {
  154. errMsg.append("条码创建数与实际不一致,型号:"+matnr).append("创建数:"+panIdList.size()+",待更新数量:"+updateList.getResultList().size()).append("</br>");
  155. }
  156. }else {
  157. logger.info("getToken-F:"+res);
  158. if(StringUtil.hasText(resData.get("e_message"))){
  159. errMsg.append("客户料号:"+matnr).append(resData.get("e_message")).append("</br>");
  160. }else {
  161. errMsg.append("客户料号:"+matnr).append("创建条码失败").append("</br>");
  162. }
  163. }
  164. }else{
  165. logger.info("getToken-F:No ResponseText");
  166. retMap.put("success",false);
  167. retMap.put("message", "No ResponseText");
  168. }
  169. }else {
  170. logger.info("createSticker-F:StatusCode {} ResponseText {}",response.getStatusCode(),response.getResponseText());
  171. retMap.put("success",false);
  172. retMap.put("message", response.getStatusCode()+":"+response.getResponseText());
  173. }
  174. }catch (Exception e){
  175. e.printStackTrace();
  176. retMap.put("success",false);
  177. retMap.put("message","创建条码异常。");
  178. }
  179. }
  180. if(errMsg.length()>0){
  181. // System.out.println("errMsg:"+errMsg.toString());
  182. retMap.put("success",false);
  183. retMap.put("message","对接失败:</br>"+errMsg.toString());
  184. }else {
  185. baseDao.execute("update CatlDoc set CA_DOCSTATE=1 where ca_id = "+id);
  186. }
  187. logger.info("createSticker-End:master {} id {} retMap {}",master,id,retMap.toString());
  188. return retMap;
  189. }
  190. @Override
  191. public Map<String, Object> createSticker2(String master, Integer id) {
  192. Map<String,Object> retMap = new HashMap<>();
  193. retMap.put("success",true);
  194. logger.info("createSticker-Begin:master {} id {}",master,id);
  195. SpObserver.putSp(master);
  196. SqlRowList docMain = baseDao.queryForRowSet("select nvl(ca_centerflag,0) ca_centerflag,nvl(ca_docstate,0) ca_docstate from CATLDOC where ca_id = "+id);
  197. if(docMain.next()){
  198. if(docMain.getGeneralInt("ca_docstate") == 1){
  199. retMap.put("success",false);
  200. retMap.put("message","单据已创建CATL条码。");
  201. logger.info("createSticker-F:master {} id {} 单据已创建CATL条码。",master,id);
  202. return retMap;
  203. }
  204. if(docMain.getGeneralInt("ca_docstate") == 2){
  205. retMap.put("success",false);
  206. retMap.put("message","CATL条码正在创建中,请勿重复点击。");
  207. logger.info("createSticker-F:master {} id {} CATL条码正在创建中,请勿重复点击。",master,id);
  208. return retMap;
  209. }
  210. if(docMain.getGeneralInt("ca_centerflag")<0){
  211. return createStickerByCenter(master,id);
  212. }
  213. }else {
  214. retMap.put("success",false);
  215. retMap.put("message","没有需要对接的单据。");
  216. logger.info("createSticker-F:master {} id {} no 没有需要对接的单据",master,id);
  217. return retMap;
  218. }
  219. //创建中
  220. baseDao.execute("update CatlDoc set ca_docstate=2 where ca_id = "+id);
  221. SqlRowList docLoist = baseDao.queryForRowSet(
  222. "SELECT * FROM ( select CD_CPN matnr,CD_DC ztcnno,pc_zbzsmount_user zzbsmount,pc_zzxsmount_user zzxsmount,pc_zzbsmount_user zbzsmount " +
  223. " ,sum(CD_QTY) zmount,cd_wflag zwidth,cd_lotno zzstz " +
  224. ",cd_newboxcode||(case when cd_remark is not null then ' '||cd_remark else '' end) zremark,count(1) codecount " +
  225. " from CatlDocDetail left join CatlDoc on ca_id = cd_caid left join customer on cu_code = CA_CUSTCODE left join product on pr_code = CD_PRCODE left join PRODUCTCUSTOMER on pc_custid= cu_id and pc_prodid=pr_id " +
  226. " where cd_caid = ? and CD_PANID is null and nvl(pc_zbzsmount_user,0)>0 " +
  227. " group by CD_CPN,CD_DC,pc_zbzsmount_user,pc_zzxsmount_user,pc_zzbsmount_user,cd_lotno,cd_wflag,cd_newboxcode||(case when cd_remark is not null then ' '||cd_remark else '' end) " +
  228. " ) order by ztcnno,zremark ",id);
  229. if(!docLoist.hasNext()){
  230. // System.out.println("no docLoist!");
  231. retMap.put("success",false);
  232. retMap.put("message","没有需要对接的明细.");
  233. logger.info("createSticker-F:master {} id {} no docLoist!",master,id);
  234. }
  235. Object[] obs = baseDao.getFieldsDataByCondition("YITOA_DATACENTER.dock_catl_config A "
  236. , new String[]{"URL_","deipaaskeyauth","appKey", "appSecret","VENDCODE"}
  237. , "username='"+master+"' and A.ENVTYPE = (SELECT B.ENVTYPE FROM YITOA_DATACENTER.DOCK_CATL_EVCONFIG B WHERE A.username = B.username )");
  238. String url = String.valueOf(obs[0]);
  239. String deipaaskeyauth = String.valueOf(obs[1]);
  240. String vendcode = String.valueOf(obs[4]);
  241. Map<String,String> map = new HashMap<>();
  242. map.put("url",url);
  243. map.put("deipaaskeyauth",deipaaskeyauth);
  244. map.put("appKey",String.valueOf(obs[2]));
  245. map.put("appSecret",String.valueOf(obs[3]));
  246. Map<String,Object> tokenMap = getToken(map);
  247. if(!(boolean)tokenMap.get("success")){
  248. return tokenMap;
  249. }
  250. String action="/SNC/outer_SNC_createSticker?sap-client=810&interfacename=ZIRFC_TP2SNC_CREATESTICKER";
  251. String deipaasjwt = "Bearer "+tokenMap.get("token");
  252. map.put("deipaasjwt",deipaasjwt);
  253. StringBuffer errMsg = new StringBuffer();
  254. for (Map<String,Object> docMap: docLoist.getResultList()) {
  255. try {
  256. int codeCount = Integer.valueOf(String.valueOf(docMap.get("codecount")));
  257. // CD_CPN,pr_capacity,pr_zxbzs,cd_wflag,cd_remark
  258. String matnr = String.valueOf(docMap.get("matnr"));
  259. String zwidth = StringUtil.nvl(docMap.get("zwidth"),"");
  260. String zremark = StringUtil.nvl(docMap.get("zremark"),"");
  261. String ztcnno = String.valueOf(docMap.get("ztcnno"));
  262. String zzstz = String.valueOf(docMap.get("zzstz"));
  263. Map<String,Object> paraMap=new HashMap<>();
  264. paraMap.put("matnr",matnr);//物料号:客户料号
  265. paraMap.put("ztcnno",ztcnno);//制造日期: 取最小DC
  266. paraMap.put("zzstz",zzstz);//供应商批次: 用最小批次作为虚拟批次
  267. // paraMap.put("zeiar",docMap.get("zeiar"));//版本
  268. paraMap.put("zwidth",zwidth);//宽度
  269. paraMap.put("zmount",docMap.get("zmount"));//本次生产总数量
  270. paraMap.put("zzbsmount",docMap.get("zzbsmount"));//栈板容量
  271. paraMap.put("zzxsmount",docMap.get("zzxsmount"));//纸箱容量
  272. paraMap.put("zbzsmount",docMap.get("zbzsmount"));//包装袋容量
  273. paraMap.put("zremark",zremark);//备注
  274. paraMap.put("partner",vendcode);//供应商编码 固定值
  275. HttpUtil.Response response = HttpUtil.doPost(url+action, JacksonUtil.toJson(paraMap), deipaaskeyauth,deipaasjwt);
  276. if (response.getStatusCode() == HttpStatus.OK.value()){
  277. String res = response.getResponseText();
  278. if(res!=null && !"".equals(res)){
  279. // System.out.println("res:"+res);
  280. Map<String,Object> resData = JacksonUtil.fromJson(res);
  281. if("S".equals(String.valueOf(resData.get("e_type")))){
  282. List<Map<String,Object>> outdata = (List) resData.get("outdata");
  283. // System.out.println("outdata.size:"+outdata.size());
  284. //栈ID
  285. // List<Map<String,Object>> palletIdList = outdata.stream().filter(od->{
  286. // return (Double.valueOf(od.get("levels").toString().trim()) == 0);
  287. // }).collect(Collectors.toList());
  288. //箱ID
  289. List<Map<String,Object>> boxIdList = outdata.stream().filter(od->{
  290. return (Double.valueOf(od.get("levels").toString().trim()) == 1);
  291. }).collect(Collectors.toList());
  292. //袋ID
  293. List<Map<String,Object>> panIdList = outdata.stream().filter(od->{
  294. return (Double.valueOf(od.get("levels").toString().trim()) == 2);
  295. }).collect(Collectors.toList());
  296. //更新箱ID、袋ID
  297. List<String> sqls = new ArrayList<>();
  298. // if(outdata.size() != codeCount){
  299. // errMsg.append("条码创建数与实际不一致,型号:"+matnr).append("创建数:"+outdata.size()+",待更新数量:"+codeCount).append("</br>");
  300. // continue;
  301. // }
  302. // CD_CPN matnr,CD_DC ztcnno,cd_wflag zwidth,cd_lotno zzstz,cd_newboxcode||(case when cd_remark is not null then ' '||cd_remark else '' end) zremark,count(1) codecount " +
  303. SqlRowList updateList = baseDao.queryForRowSet("select cd_id from CatlDocDetail " +
  304. " where cd_caid = "+id+" and CD_PANID is null " +
  305. " and CD_CPN = '"+matnr+"' " +
  306. " and nvl(CD_DC,' ') = '"+StringUtil.nvl(ztcnno," ")+"'" +
  307. " and nvl(cd_wflag,' ') = '"+StringUtil.nvl(zwidth," ")+"'" +
  308. " and nvl(cd_lotno,' ') = '"+StringUtil.nvl(zzstz," ")+"'" +
  309. " and cd_newboxcode||(case when cd_remark is not null then ' '||cd_remark else '' end) = '"+StringUtil.nvl(zremark," ")+"'" +
  310. " order by cd_dc,cd_detno");
  311. if(panIdList.size() != updateList.getResultList().size()){
  312. errMsg.append("条码创建数与实际不一致,型号:"+matnr).append("创建数:"+panIdList.size()+",待更新数量:"+updateList.getResultList().size()).append("</br>");
  313. continue;
  314. }
  315. for (int i = 0; i < updateList.getResultList().size(); i++) {
  316. Map<String,Object> updateMap = updateList.getResultList().get(i);
  317. Map<String,Object> idMap = panIdList.get(i);
  318. String panId = idMap.get("zalt_id").toString();
  319. String boxId = idMap.get("zalt_id_upper").toString();
  320. //获取栈ID
  321. String palletId = "";
  322. Optional<Map<String,Object>> boxMsg = boxIdList.stream()
  323. .filter(bMap -> bMap.get("zalt_id").equals(boxId))
  324. .findFirst();
  325. if(boxMsg.isPresent()&&!boxMsg.get().isEmpty()){
  326. palletId = boxMsg.get().get("zalt_id_upper").toString();
  327. }
  328. sqls.add("update CatlDocDetail set cd_palletid='"+StringUtil.nvl(palletId,"")+"' ,CD_PANID='"+panId+"',CD_BOXID='"+boxId+"'" +
  329. ",cd_batchid='"+idMap.get("batch_id")+"',cd_wbs='"+idMap.get("wbs")+"' " +
  330. "where cd_id = "+updateMap.get("cd_id"));
  331. }
  332. // 更新栈ID、箱ID、袋ID
  333. if(sqls.size()>0){
  334. // System.out.println(sqls);
  335. baseDao.execute(sqls);
  336. }
  337. }else {
  338. logger.info("getToken-F:"+res);
  339. if(StringUtil.hasText(resData.get("e_message"))){
  340. errMsg.append("客户料号:"+matnr).append(resData.get("e_message")).append("</br>");
  341. }else {
  342. errMsg.append("客户料号:"+matnr).append("创建条码失败").append("</br>");
  343. }
  344. }
  345. }else{
  346. logger.info("getToken-F:No ResponseText");
  347. retMap.put("success",false);
  348. retMap.put("message", "No ResponseText");
  349. }
  350. }else {
  351. logger.info("createSticker-F:StatusCode {} ResponseText {}",response.getStatusCode(),response.getResponseText());
  352. retMap.put("success",false);
  353. retMap.put("message", response.getStatusCode()+":"+response.getResponseText());
  354. }
  355. }catch (Exception e){
  356. e.printStackTrace();
  357. retMap.put("success",false);
  358. retMap.put("message","创建条码异常。");
  359. }
  360. }
  361. if(errMsg.length()>0){
  362. // System.out.println("errMsg:"+errMsg.toString());
  363. retMap.put("success",false);
  364. retMap.put("message","对接失败:</br>"+errMsg.toString());
  365. }else {
  366. baseDao.execute("update CatlDoc set CA_DOCSTATE=1 where ca_id = "+id);
  367. }
  368. logger.info("createSticker-End:master {} id {} retMap {}",master,id,retMap.toString());
  369. return retMap;
  370. }
  371. private Map<String, Object> createStickerByCenter(String master, Integer id) {
  372. Map<String,Object> retMap = new HashMap<>();
  373. retMap.put("success",true);
  374. logger.info("createStickerByCenter-Begin:master {} id {}",master,id);
  375. SpObserver.putSp(master);
  376. //创建中
  377. baseDao.execute("update CatlDoc set CA_DOCSTATE=2 where ca_id = "+id);
  378. SqlRowList docList = baseDao.queryForRowSet("SELECT * FROM ( " +
  379. "select cd_cpn,min(CD_DC) ztcnno,pc_zbzsmount_user zzbsmount,pc_zzxsmount_user zzxsmount,pc_zzbsmount_user zbzsmount ,cd_newboxcode " +
  380. " ,sum(CD_QTY) zmount,cd_wflag zwidth,ca_code||'_'||cd_newboxcode zzstz " +
  381. " ,cd_newboxcode||(case when cd_remark is not null then ' '||cd_remark else '' end) zremark,count(1) codecount,wm_concat(cd_id) cd_ids " +
  382. "from CatlDocDetail left join CatlDoc on ca_id = cd_caid left join customer on cu_code = CA_CUSTCODE left join product on pr_code = CD_PRCODE left join PRODUCTCUSTOMER on pc_custid= cu_id and pc_prodid=pr_id " +
  383. "where cd_caid = ? and nvl(pc_zbzsmount_user,0)>0 " +
  384. " and CD_PANID is null "+
  385. " group by CD_CPN,pc_zbzsmount_user,pc_zzxsmount_user,pc_zzbsmount_user,cd_wflag,cd_remark,cd_newboxcode,ca_code||'_'||cd_newboxcode order by min(cd_detno)" +
  386. " ) order by to_number(cd_newboxcode)",id);
  387. if(!docList.hasNext()){
  388. retMap.put("success",false);
  389. retMap.put("message","没有需要对接的明细.");
  390. logger.info("createStickerByCenter-F:master {} id {} no docList!",master,id);
  391. }
  392. Object[] obs = baseDao.getFieldsDataByCondition("YITOA_DATACENTER.dock_catl_config A "
  393. , new String[]{"URL_","deipaaskeyauth","appKey", "appSecret","VENDCODE"}
  394. , "username='"+master+"' " +
  395. // "and a.ENVTYPE=0"
  396. " and A.ENVTYPE = (SELECT B.ENVTYPE FROM YITOA_DATACENTER.DOCK_CATL_EVCONFIG B WHERE A.username = B.username )"
  397. );
  398. String url = String.valueOf(obs[0]);
  399. String deipaaskeyauth = String.valueOf(obs[1]);
  400. String vendcode = String.valueOf(obs[4]);
  401. Map<String,String> map = new HashMap<>();
  402. map.put("url",url);
  403. map.put("deipaaskeyauth",deipaaskeyauth);
  404. map.put("appKey",String.valueOf(obs[2]));
  405. map.put("appSecret",String.valueOf(obs[3]));
  406. Map<String,Object> tokenMap = getToken(map);
  407. if(!(boolean)tokenMap.get("success")){
  408. return tokenMap;
  409. }
  410. String action="/SNC/outer_SNC_createSticker?sap-client=810&interfacename=ZIRFC_TP2SNC_CREATESTICKER";
  411. String deipaasjwt = "Bearer "+tokenMap.get("token");
  412. map.put("deipaasjwt",deipaasjwt);
  413. StringBuffer errMsg = new StringBuffer();
  414. List<Map<String, Object>> docMapList = docList.getResultList();
  415. for (int j = 0; j < docMapList.size(); j++) {
  416. Map<String,Object> docMap = docMapList.get(j);
  417. // CD_CPN,pr_capacity,pr_zxbzs,cd_wflag,cd_remark
  418. String matnr = String.valueOf(docMap.get("cd_cpn"));
  419. String zwidth = StringUtil.nvl(docMap.get("zwidth"),"");
  420. String zremark = StringUtil.nvl(docMap.get("zremark"),"");
  421. String cd_ids = StringUtil.nvl(docMap.get("cd_ids"),"0");
  422. Map<String,Object> paraMap=new HashMap<>();
  423. paraMap.put("matnr",matnr);//物料号:客户料号
  424. paraMap.put("ztcnno",docMap.get("ztcnno"));//制造日期: 取最小DC
  425. paraMap.put("zzstz",docMap.get("zzstz"));//供应商批次: 用最小批次作为虚拟批次
  426. // paraMap.put("zeiar",docMap.get("zeiar"));//版本
  427. paraMap.put("zwidth",zwidth);//宽度
  428. paraMap.put("zmount",docMap.get("zmount"));//本次生产总数量
  429. paraMap.put("zzbsmount",docMap.get("zzbsmount"));//栈板容量
  430. paraMap.put("zzxsmount",docMap.get("zzxsmount"));//纸箱容量
  431. paraMap.put("zbzsmount",docMap.get("zbzsmount"));//包装袋容量
  432. paraMap.put("zremark",zremark);//备注
  433. paraMap.put("partner",vendcode);//供应商编码 固定值
  434. logger.info("createSticker-begin: zremark {} matnr {} zmount {} zzbsmount {} zzxsmount {} zbzsmount {}"
  435. , zremark,matnr,docMap.get("zmount"),docMap.get("zzbsmount"),docMap.get("zzxsmount"),docMap.get("zbzsmount"));
  436. boolean isDoc = baseDao.checkIf("CatlDocDetail " ," cd_caid = "+id+" and CD_PANID is null and CD_id in ("+cd_ids+") ");
  437. if(!isDoc){
  438. logger.info("createSticker-F-重复: zremark {} matnr {} zmount {} zzbsmount {} zzxsmount {} zbzsmount {}"
  439. , zremark,matnr,docMap.get("zmount"),docMap.get("zzbsmount"),docMap.get("zzxsmount"),docMap.get("zbzsmount"));
  440. continue;
  441. }
  442. try {
  443. HttpUtil.Response response = HttpUtil.doPost(url+action, JacksonUtil.toJson(paraMap), deipaaskeyauth,deipaasjwt);
  444. if (response.getStatusCode() == HttpStatus.OK.value()){
  445. String res = response.getResponseText();
  446. if(res!=null && !"".equals(res)){
  447. // System.out.println("res:"+res);
  448. Map<String,Object> resData = JacksonUtil.fromJson(res);
  449. if("S".equals(String.valueOf(resData.get("e_type")))){
  450. List<Map<String,Object>> outdata = (List) resData.get("outdata");
  451. logger.info("outdata.size {}", outdata.size());
  452. for (Map<String,Object> odMap: outdata) {
  453. List<String> odsqls = new ArrayList<>();
  454. odsqls.add("insert into CATLDOC_OUTDATA(CDO_ID, CDO_CAID, CDO_DOCDATE,CDO_CDIDS" +
  455. ", ZALT_ID, BATCH_ID, MATNR, ZEIVR, ZEIAR, ZLABEL_STOCK, ZLABEL_TRANSFER, PRTBATCHID, ZMANUFACTURING_DATE, ZEFFECTIVE_DATE, WBS, ZREMARKS" +
  456. ", LEVELS_, ZALT_ID_UPPER)" +
  457. "values (CATLDOC_OUTDATA_SEQ.NEXTVAL,"+id+",SYSDATE,'"+cd_ids+"'"
  458. +",'"+odMap.get("zalt_id")+"' ,'"+odMap.get("batch_id")+"' ,'"+odMap.get("matnr")+"' ,'"+odMap.get("zeivr")+"' ,'"+odMap.get("zeiar")+"' ,'"+odMap.get("zlabel_stock")+"' ,'"+odMap.get("zlabel_transfer")+"' ,'"+odMap.get("prtbatchid")+"' ,'"+odMap.get("zmanufacturing_date")+"' ,'"+odMap.get("zeffective_date")+"' ,'"+odMap.get("wbs") +"' ,'"+odMap.get("zremarks")+"' " +
  459. ",'"+odMap.get("levels")+"' ,'"+odMap.get("zalt_id_upper")+"')");
  460. baseDao.execute(odsqls);
  461. }
  462. //栈ID 对应外箱
  463. // List<Map<String,Object>> palletIdList = outdata.stream().filter(od->{
  464. // return (Double.valueOf(od.get("levels").toString().trim()) == 0);
  465. // }).collect(Collectors.toList());
  466. //箱ID 对应内箱
  467. List<Map<String,Object>> boxIdList = outdata.stream().filter(od->{
  468. return (Double.valueOf(od.get("levels").toString().trim()) == 1);
  469. }).collect(Collectors.toList());
  470. //袋ID 对应包装
  471. List<Map<String,Object>> panIdList = outdata.stream().filter(od->{
  472. return (Double.valueOf(od.get("levels").toString().trim()) == 2);
  473. }).collect(Collectors.toList());
  474. // 根据标签ID排序
  475. panIdList.sort(Comparator.comparing(
  476. pm -> (String) pm.get("zalt_id"),
  477. Comparator.nullsFirst(String::compareTo)
  478. ));
  479. String zeivr = StringUtil.nvl(outdata.get(0).get("zeivr"),"");
  480. String zeiar = StringUtil.nvl(outdata.get(0).get("zeiar"),"");
  481. //更新箱ID、袋ID
  482. List<String> sqls = new ArrayList<>();
  483. SqlRowList updateList = baseDao.queryForRowSet("select cd_id,cd_lotno,cd_dc,nvl(cd_ed,to_char(to_date(cd_dc,'yyyymmdd')+365,'yyyymmdd')) cd_ed from CatlDocDetail " +
  484. " where cd_caid = "+id+" and CD_PANID is null and CD_id in ("+cd_ids+") order by cd_detno");
  485. List<Map<String,Object>> updateStickerList = new ArrayList<>();
  486. Map<String,Map<String,Object>> updateBoxStickers = new HashMap<>();
  487. if(panIdList.size() == updateList.getResultList().size()){
  488. for (int i = 0; i < updateList.getResultList().size(); i++) {
  489. Map<String,Object> updateMap = updateList.getResultList().get(i);
  490. Map<String,Object> idMap = panIdList.get(i);
  491. String panId = idMap.get("zalt_id").toString();
  492. String boxId = idMap.get("zalt_id_upper").toString();
  493. //获取栈ID
  494. String palletId = "";
  495. Optional<Map<String,Object>> boxMsg = boxIdList.stream()
  496. .filter(bMap -> bMap.get("zalt_id").equals(boxId))
  497. .findFirst();
  498. if(boxMsg.isPresent()&&!boxMsg.get().isEmpty()){
  499. palletId = boxMsg.get().get("zalt_id_upper").toString();
  500. }
  501. sqls.add("update CatlDocDetail set cd_palletid='"+StringUtil.nvl(palletId,"")+"' ,cd_panid='"+panId+"',cd_boxid='"+boxId+"'" +
  502. ",cd_batchid='"+idMap.get("batch_id")+"',cd_wbs='"+idMap.get("wbs")+"',cd_zeivr='" +zeivr+"',cd_zeiar='"+zeiar+"' "+
  503. " where cd_id = "+updateMap.get("cd_id"));
  504. //更新内箱、内包装袋真实DC LOTNO
  505. if(!idMap.get("prtbatchid").equals(updateMap.get("cd_lotno"))){
  506. Map<String,Object> updatePanMap = new HashMap<>();
  507. updatePanMap.put("matnr",matnr);//物料号
  508. updatePanMap.put("zalt_id",panId);//贴纸ID
  509. updatePanMap.put("prtbatchid",updateMap.get("cd_lotno"));//供应商批次
  510. updatePanMap.put("manufacturing_date",updateMap.get("cd_dc"));//生产日期
  511. updatePanMap.put("atlyx",updateMap.get("cd_ed"));//有效日期
  512. updateStickerList.add(updatePanMap);
  513. Map<String,Object> updateBoxMap = new HashMap<>();
  514. if(docMap.get("zzxsmount").equals(docMap.get("zbzsmount"))){//箱容量 = 盘容量 一起更
  515. updateBoxMap.put("matnr",matnr);//物料号
  516. updateBoxMap.put("zalt_id",boxId);//贴纸ID
  517. updateBoxMap.put("prtbatchid",updateMap.get("cd_lotno"));//供应商批次
  518. updateBoxMap.put("manufacturing_date",updateMap.get("cd_dc"));//生产日期
  519. updateBoxMap.put("atlyx",updateMap.get("cd_ed"));//有效日期
  520. updateStickerList.add(updateBoxMap);
  521. }else {
  522. if(!updateBoxStickers.containsKey(boxId)) {
  523. updateBoxMap.put("matnr",matnr);//物料号
  524. updateBoxMap.put("zalt_id",boxId);//贴纸ID
  525. updateBoxMap.put("prtbatchid",updateMap.get("cd_lotno"));//供应商批次
  526. updateBoxMap.put("manufacturing_date",updateMap.get("cd_dc"));//生产日期
  527. updateBoxMap.put("atlyx",updateMap.get("cd_ed"));//有效日期
  528. updateBoxStickers.put(boxId,updateBoxMap);
  529. }else{
  530. updateBoxMap = updateBoxStickers.get(boxId);
  531. if(DateUtil.compare(updateBoxMap.get("manufacturing_date").toString(),updateMap.get("cd_dc").toString(),Constant.YMD2)>0){//取最小DC
  532. updateBoxMap.put("prtbatchid",updateMap.get("cd_lotno"));//供应商批次
  533. updateBoxMap.put("manufacturing_date",updateMap.get("cd_dc"));//生产日期
  534. updateBoxMap.put("atlyx",updateMap.get("cd_ed"));//有效日期
  535. updateBoxStickers.put(boxId,updateBoxMap);
  536. }
  537. }
  538. }
  539. }
  540. }
  541. if(!docMap.get("zzxsmount").equals(docMap.get("zbzsmount"))){
  542. logger.info("updateSticker-begin: boxcode {}", docMap.get("cd_newboxcode"));
  543. for(String boxId:updateBoxStickers.keySet()){
  544. updateStickerList.add(updateBoxStickers.get(boxId));
  545. // logger.info("updateSticker-begin: boxId {} LOTNO {} DC {}", boxId,updateBoxStickers.get(boxId).get("prtbatchid"), updateBoxStickers.get(boxId).get("manufacturing_date"));
  546. }
  547. }
  548. // 更新栈ID、箱ID、袋ID
  549. if(sqls.size()>0){
  550. baseDao.execute(sqls);
  551. //第二个接口 更新供应商批次
  552. // logger.info("updateSticker-begin: cd_ids {}", cd_ids);
  553. Map<String,Object> updateStickerMap = updateStickerByList(master, id,map,updateStickerList);
  554. if(!(boolean) updateStickerMap.get("success")){
  555. errMsg.append("更新供应商批次失败:客户料号:"+matnr).append(updateStickerMap.get("message")).append("</br>");
  556. }
  557. }
  558. }else {
  559. errMsg.append("条码创建数与实际不一致,型号:"+matnr).append("【cd_ids:").append(cd_ids).append("】创建数:"+panIdList.size()+",待更新数量:"+updateList.getResultList().size()).append("</br>");
  560. }
  561. }else {
  562. logger.info("createStickerByCenter-F:"+res);
  563. if(StringUtil.hasText(resData.get("e_message"))){
  564. errMsg.append("客户料号:"+matnr).append(resData.get("e_message")).append("</br>");
  565. }else {
  566. errMsg.append("客户料号:"+matnr).append("创建条码失败").append("</br>");
  567. }
  568. }
  569. }else{
  570. logger.info("createStickerByCenter-F:No ResponseText");
  571. retMap.put("success",false);
  572. retMap.put("message", "No ResponseText");
  573. }
  574. }else {
  575. logger.info("createStickerByCenter-F:StatusCode {} ResponseText {}",response.getStatusCode(),response.getResponseText());
  576. retMap.put("success",false);
  577. retMap.put("message", response.getStatusCode()+":"+response.getResponseText());
  578. }
  579. }catch (Exception e){
  580. e.printStackTrace();
  581. retMap.put("success",false);
  582. retMap.put("message","创建条码异常。");
  583. }
  584. }
  585. if(errMsg.length()>0){
  586. // System.out.println("errMsg:"+errMsg.toString());
  587. retMap.put("success",false);
  588. retMap.put("message","对接失败,请取消条码重新创建:</br>"+errMsg.toString());
  589. }else {
  590. baseDao.execute("update CatlDoc set CA_DOCSTATE=1 where ca_id = "+id);
  591. }
  592. if(errMsg.length()>0){
  593. // System.out.println("errMsg:"+errMsg.toString());
  594. retMap.put("success",false);
  595. retMap.put("message","对接失败,请取消条码重新创建:</br>"+errMsg.toString());
  596. }else {
  597. baseDao.execute("update CatlDoc set CA_DOCSTATE=1 where ca_id = "+id);
  598. }
  599. logger.info("createStickerByCenter-End:master {} id {} retMap {}",master,id,retMap.toString());
  600. return retMap;
  601. }
  602. @Override
  603. public Map<String, Object> getToken(Map<String, String> map) {
  604. Map<String, Object> retMap = new HashMap<>();
  605. retMap.put("success",true);
  606. String url = map.get("url");
  607. String deipaaskeyauth = map.get("deipaaskeyauth");
  608. String appKey = map.get("appKey");
  609. String appSecret = map.get("appSecret");
  610. logger.info("getToken-begin: url {} ,deipaaskeyauth {},appKey {},appSecret {} ", url,deipaaskeyauth,appKey,appSecret);
  611. String action="/ipaas/ipaas_getJwtToken";
  612. Map<String,Object> paraMap=new HashMap<>();
  613. paraMap.put("appKey",appKey);
  614. paraMap.put("appSecret",appSecret);
  615. paraMap.put("time",60);
  616. try {
  617. HttpUtil.Response response =HttpUtil.doPost(url+action, JacksonUtil.toJson(paraMap), deipaaskeyauth,"");
  618. if (response.getStatusCode() == HttpStatus.OK.value()){
  619. String res = response.getResponseText();
  620. if(res!=null && !"".equals(res)){
  621. Map<String,Object> resMap = JacksonUtil.fromJson(res);
  622. logger.info("getToken-S: {} ", String.valueOf(resMap.get("accessToken")));
  623. retMap.put("token", String.valueOf(resMap.get("accessToken")));
  624. }else{
  625. logger.info("getToken-F:No ResponseText");
  626. retMap.put("success",false);
  627. retMap.put("message", "No ResponseText");
  628. }
  629. }else {
  630. logger.info("getToken-F:StatusCode {} ResponseText {}",response.getStatusCode(),response.getResponseText());
  631. retMap.put("success",false);
  632. retMap.put("message", response.getStatusCode()+":"+response.getResponseText());
  633. }
  634. }catch (Exception e){
  635. e.printStackTrace();
  636. retMap.put("success",false);
  637. retMap.put("message", "对接异常");
  638. }
  639. return retMap;
  640. }
  641. @Override
  642. public Map<String, Object> updateStickerByList(String master, Integer id,Map<String, String> map,List<Map<String,Object>> updateLists) {
  643. Map<String, Object> retMap = new HashMap<>();
  644. retMap.put("success",true);
  645. if(CollectionUtil.isEmpty(updateLists)){
  646. return retMap;
  647. }
  648. String url = map.get("url");
  649. String deipaaskeyauth = map.get("deipaaskeyauth");
  650. String appKey = map.get("appKey");
  651. String appSecret = map.get("appSecret");
  652. String deipaasjwt = map.get("deipaasjwt");
  653. String action="/SNC/outer_SNC_updateGyspc?sap-client=810&interfacename=ZIRFC_TP2SNC_UPDATEGYSPC";
  654. Map<String,Object> paraMap=new HashMap<>();
  655. paraMap.put("inputdata",updateLists);
  656. StringBuffer errMsg = new StringBuffer();
  657. try {
  658. HttpUtil.Response response =HttpUtil.doPost(url+action, JacksonUtil.toJson(paraMap), deipaaskeyauth,deipaasjwt);
  659. if (response.getStatusCode() == HttpStatus.OK.value()){
  660. String res = response.getResponseText();
  661. if(res!=null && !"".equals(res)){
  662. Map<String,Object> resMap = JacksonUtil.fromJson(res);
  663. if(StringUtil.hasText(resMap.get("OUTPUTDATA"))){
  664. if(StringUtil.hasText(String.valueOf(resMap.get("OUTPUTDATA")))){
  665. List<Map<String,Object>> outputdataList = (List) resMap.get("OUTPUTDATA");
  666. for (Map<String,Object> outputdataMap:outputdataList) {
  667. if(!"S".equals(outputdataMap.get("e_msgtype"))){
  668. errMsg.append("条码:").append(outputdataMap.get("zalt_id")).append(",原因:").append(outputdataMap.get("e_msg")).append("</br>");
  669. baseDao.execute("update CatlDocDetail set cd_errmsg='"+outputdataMap.get("e_msg")+"' where cd_caid = "+id+" and cd_panid = '"+outputdataMap.get("zalt_id")+"'");
  670. }
  671. }
  672. }else {
  673. logger.info("updateSticker-F:No ResponseText");
  674. retMap.put("success",false);
  675. retMap.put("message", "No outPutData");
  676. }
  677. }else {
  678. logger.info("updateSticker-F:No ResponseText");
  679. retMap.put("success",false);
  680. retMap.put("message", "No ResponseText");
  681. }
  682. }else{
  683. logger.info("updateSticker-F:No ResponseText");
  684. retMap.put("success",false);
  685. retMap.put("message", "No ResponseText");
  686. }
  687. }else {
  688. logger.info("updateSticker-F:StatusCode {} ResponseText {}",response.getStatusCode(),response.getResponseText());
  689. retMap.put("success",false);
  690. retMap.put("message", response.getStatusCode()+":"+response.getResponseText());
  691. }
  692. }catch (Exception e){
  693. e.printStackTrace();
  694. retMap.put("success",false);
  695. retMap.put("message", "对接异常");
  696. }
  697. if(errMsg.length()>0){
  698. retMap.put("success",false);
  699. retMap.put("message",errMsg.toString());
  700. }
  701. return retMap;
  702. }
  703. }