ERPServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. package com.uas.eis.service.Impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alibaba.fastjson.serializer.SerializerFeature;
  5. import com.fasterxml.jackson.core.JsonProcessingException;
  6. import com.fasterxml.jackson.databind.ObjectMapper;
  7. import com.transsion.exchange.base.dto.EntryForPOST;
  8. import com.transsion.exchange.utils.ecit.OpenApiUtil;
  9. import com.uas.eis.core.support.TokenProperties;
  10. import com.uas.eis.dao.BaseDao;
  11. import com.uas.eis.dao.SqlRowList;
  12. import com.uas.eis.entity.*;
  13. import com.uas.eis.entity.transsion.SaleMaterialStockVO;
  14. import com.uas.eis.entity.transsion.SupplierSecondMaterialStockVO;
  15. import com.uas.eis.sdk.entity.ApiResult;
  16. import com.uas.eis.sdk.resp.ApiResponse;
  17. import com.uas.eis.service.ERPService;
  18. import com.uas.eis.utils.BaseUtil;
  19. import com.uas.eis.utils.MD5Util;
  20. import com.uas.eis.utils.PSHttpUtils;
  21. import com.uas.eis.utils.StringUtil;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  26. import org.springframework.stereotype.Service;
  27. import java.util.ArrayList;
  28. import java.util.HashMap;
  29. import java.util.List;
  30. import java.util.Map;
  31. /**
  32. * @author koul
  33. * @email koul@usoftchina.com
  34. * @date 2021-12-06 18:27
  35. */
  36. @Service
  37. public class ERPServiceImpl implements ERPService {
  38. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  39. private static Map<String,String> tokenConfig = TokenProperties.getAllProperty();
  40. @Autowired
  41. private BaseDao baseDao;
  42. @Autowired
  43. private ObjectMapper objectMapper;
  44. @Override
  45. public ApiResult<String> syncProductStock(String data) {
  46. logger.info("sendProd-Begin:master {} ids {}");
  47. try {
  48. SqlRowList docMsg = baseDao.queryForRowSet(" select pr_id,to_char(sysdate,'yyyy-mm-dd') ba_date,ba_remain,tspr_eightcode,pr_code,tspr_ninecode,tspr_description,ba_code from product left join batch on pr_code=ba_prodcode left join transsionproduct on pr_code=tspr_uasprcode " +
  49. " where tspr_enable=-1 and pr_statuscode='AUDITED' and ba_whcode='BSD056' and ba_remain>0");
  50. if(!docMsg.hasNext()){
  51. return ApiResponse.failRsp("102","没有需要同步的商品库存");
  52. }
  53. List<Map<String, Object>> docMsgResultList = docMsg.getResultList();
  54. StringBuffer errMsg = new StringBuffer();
  55. List<Object> docCodes = new ArrayList<>();
  56. List<SaleMaterialStockVO> list = new ArrayList<>();
  57. Map<String,Object> reqMap = new HashMap<>();
  58. String prCodes = "";
  59. for (Map<String, Object> map : docMsgResultList) {
  60. docCodes.add(map.get("pr_code"));
  61. logger.info("sendProd-test: id {} code {}",map.get("pr_id"),map.get("pr_code"));
  62. // 创建SaleMaterialStockVO对象
  63. SaleMaterialStockVO saleMaterialStockVO = new SaleMaterialStockVO.Builder()
  64. .location("BSD056")
  65. .qdate(StringUtil.nvl(map.get("ba_date")," "))
  66. .quanity(StringUtil.nvl(map.get("ba_remain")," "))
  67. .materialNumber(StringUtil.nvl(map.get("tspr_eightcode")," "))
  68. .supplierMaterialNumber(StringUtil.nvl(map.get("pr_code")," "))
  69. .mpn(StringUtil.nvl(map.get("tspr_ninecode")," "))
  70. .status(1)
  71. .materialDescription(StringUtil.nvl(map.get("tspr_description")," "))
  72. .batchNo(StringUtil.nvl(map.get("ba_code")," "))
  73. .build();
  74. list.add(saleMaterialStockVO);
  75. }
  76. reqMap.put("list",list);
  77. logger.info("sendProd-End:master {} ids {}");
  78. if(errMsg.length()>0){
  79. return ApiResponse.failRsp("101",errMsg.toString());
  80. }
  81. String json = null;
  82. try{
  83. json = objectMapper.writeValueAsString(reqMap);
  84. logger.info("Request JSON: {}", json);
  85. }
  86. catch (JsonProcessingException e) {
  87. e.printStackTrace();
  88. logger.info("sendProd-Error:JSON转换失败 codes {} ",prCodes);
  89. return ApiResponse.failRsp("106","JSON转换失败");
  90. } catch (Exception e) {
  91. e.printStackTrace();
  92. //eMsg = StringUtil.nvl(e.getMessage(),"无");
  93. //baseDao.execute("update product set pr_sendwmsstatus='同步失败' ,pr_sendwmserr='操作:同步' where pr_code in ("+prCodes+")");
  94. throw new RuntimeException(e);
  95. }
  96. //接口入参,接口平台会直接将当前账号信息传入接口
  97. //String json ="{\"elsAccount\":\"864385\"}";
  98. //接口提供方企业应用账号
  99. String elsAccount = "864385";
  100. //接口标识
  101. String interfaceCode = "SRM009";
  102. //接口参数组装
  103. EntryForPOST post = EntryForPOST.builder().elsAccount(elsAccount)
  104. .businessType(interfaceCode)
  105. .reuestData(json)
  106. .specialSign(interfaceCode)
  107. .build();
  108. JSONObject jsonObject = new JSONObject();
  109. JSONObject result = null;
  110. try {
  111. //接口调用
  112. result = OpenApiUtil.doPost(post);
  113. } catch (Exception e) {
  114. jsonObject.put("message", e.getMessage());
  115. System.out.println("error1"+e.getMessage());
  116. }
  117. //接口返回结果
  118. jsonObject.put("message", result.toJSONString());
  119. System.out.println(jsonObject.get("message"));
  120. return ApiResponse.successRsp("0","同步库存成功");
  121. } catch (Exception e) {
  122. JSONObject jsonObject = new JSONObject();
  123. jsonObject.put("message", e.getMessage());
  124. System.out.println("error1"+e.getMessage());
  125. return ApiResponse.failRsp("101",jsonObject.getString("message"));
  126. }
  127. }
  128. @Override
  129. public ApiResult<String> syncOriFactoryDelivery(String data) {
  130. logger.info("sendOriFactoryDelivery-Begin:master {} ids {}");
  131. try {
  132. SqlRowList docMsg = baseDao.queryForRowSet(" select nvl(pd_qty-nvl(pd_acceptqty,0),0) wrkQty,tspr_uasprcode,tspr_eightcode,tspr_ninecode,to_char(pu_date,'yyyy-mm-dd') pu_date,pu_code,pd_detno, " +
  133. " to_char(pd_delivery,'yyyy-mm-dd') pd_delivery,pd_qty,pd_qty pd_qtyreply,to_char(pd_delivery,'yyyy-mm-dd') pd_deliveryreply,'' pd_remark " +
  134. " from purchasedetail left join purchase on pd_puid=pu_id left join transsionproduct on pd_prodcode=tspr_uasprcode " +
  135. " where pu_statuscode = 'AUDITED' and nvl(pd_mrpstatuscode,' ')<>'FINISH' and pd_qty-nvl(pd_acceptqty,0)>0 and upper(pd_custname) in ('传音','上海传音') and nvl(tspr_uasprcode,' ') <> 'STK35F62' " +
  136. " and nvl(TSPR_EIGHTCODE,' ')<>' ' and nvl(tspr_ENABLE,0) = -1 order by pd_prodcode,pd_puid,pd_detno");
  137. if(!docMsg.hasNext()){
  138. return ApiResponse.failRsp("102","没有需要同步的商品库存");
  139. }
  140. List<Map<String, Object>> docMsgResultList = docMsg.getResultList();
  141. StringBuffer errMsg = new StringBuffer();
  142. List<Object> docCodes = new ArrayList<>();
  143. List<SupplierSecondMaterialStockVO> list = new ArrayList<>();
  144. Map<String,Object> reqMap = new HashMap<>();
  145. String prCodes = "";
  146. for (Map<String, Object> map : docMsgResultList) {
  147. docCodes.add(map.get("pr_code"));
  148. logger.info("sendProd-test: id {} code {}",map.get("pr_id"),map.get("pr_code"));
  149. // 创建SaleMaterialStockVO对象
  150. SupplierSecondMaterialStockVO supplierSecondMaterialStockVO = new SupplierSecondMaterialStockVO.Builder()
  151. .materialOem(StringUtil.nvl(map.get("tspr_uasprcode")," "))
  152. .matOrderDate(StringUtil.nvl(map.get("pu_date")," "))
  153. .orderNumber(StringUtil.nvl(map.get("pu_code")," "))
  154. .orderItemNumber(StringUtil.nvl(map.get("pd_detno")," "))
  155. .orderReqDate(StringUtil.nvl(map.get("pd_delivery")," "))
  156. .orderQty(StringUtil.nvl(map.get("pd_qty")," "))
  157. .orderCondate(StringUtil.nvl(map.get("pd_deliveryreply")," "))
  158. .orderConQty(StringUtil.nvl(map.get("pd_qtyreply")," "))
  159. .supplierRemark(StringUtil.nvl(map.get("pd_remark")," "))
  160. .build();
  161. list.add(supplierSecondMaterialStockVO);
  162. }
  163. reqMap.put("list",list);
  164. logger.info("sendOriFactoryDelivery-End:master {} ids {}");
  165. if(errMsg.length()>0){
  166. return ApiResponse.failRsp("101",errMsg.toString());
  167. }
  168. String json = null;
  169. try{
  170. json = objectMapper.writeValueAsString(reqMap);
  171. logger.info("Request JSON: {}", json);
  172. }
  173. catch (JsonProcessingException e) {
  174. e.printStackTrace();
  175. logger.info("sendOriFactoryDelivery-Error:JSON转换失败 codes {} ",prCodes);
  176. return ApiResponse.failRsp("106","JSON转换失败");
  177. } catch (Exception e) {
  178. e.printStackTrace();
  179. //eMsg = StringUtil.nvl(e.getMessage(),"无");
  180. //baseDao.execute("update product set pr_sendwmsstatus='同步失败' ,pr_sendwmserr='操作:同步' where pr_code in ("+prCodes+")");
  181. throw new RuntimeException(e);
  182. }
  183. //接口入参,接口平台会直接将当前账号信息传入接口
  184. //String json ="{\"elsAccount\":\"864385\"}";
  185. //接口提供方企业应用账号
  186. String elsAccount = "864385";
  187. //接口标识
  188. String interfaceCode = "SRM013";
  189. //接口参数组装
  190. EntryForPOST post = EntryForPOST.builder().elsAccount(elsAccount)
  191. .businessType(interfaceCode)
  192. .reuestData(json)
  193. .specialSign(interfaceCode)
  194. .build();
  195. JSONObject jsonObject = new JSONObject();
  196. JSONObject result = null;
  197. try {
  198. //接口调用
  199. result = OpenApiUtil.doPost(post);
  200. } catch (Exception e) {
  201. jsonObject.put("message", e.getMessage());
  202. System.out.println("error1"+e.getMessage());
  203. }
  204. //接口返回结果
  205. jsonObject.put("message", result.toJSONString());
  206. System.out.println(jsonObject.get("message"));
  207. return ApiResponse.successRsp("0","同步库存成功");
  208. } catch (Exception e) {
  209. JSONObject jsonObject = new JSONObject();
  210. jsonObject.put("message", e.getMessage());
  211. System.out.println("error1"+e.getMessage());
  212. return ApiResponse.failRsp("101",jsonObject.getString("message"));
  213. }
  214. }
  215. @Override
  216. public ApiResult<String> syncProduct(String data) {
  217. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
  218. Product product = baseDao.getJdbcTemplate().queryForObject("select case when pr_kh_user='柏英特' or nvl(pr_kh_user,' ')=' ' then 'BYT' else nvl(cu_mescode,cu_code) end pr_kh_user,pr_code ,pr_detail ,replace(PR_SPEC,'''','''''') pr_spec,nvl(pr_unit,'PCS') pr_unit,nvl(pr_cop,'BYT') pr_cop,nvl(pr_version,'0') pr_version,case when nvl(pr_kind,'')='半成品' or nvl(pr_kind,' ')='成品' then 'product' else 'raw' end pr_serial,nvl(pr_validdays,'0') pr_validdays,pr_msdlevel ,pr_fhelpcode ,pr_f_115 ,pr_f_116 ,pr_f_102,pr_kind,flag,pr_statuscode,pr_status from mes_product left join customer on pr_kh_user=cu_shortname where pr_id=?",
  219. new BeanPropertyRowMapper<Product>(Product.class),store.get("pr_id"));
  220. product.setFlag(Integer.parseInt(StringUtil.nvl(store.get("flag"),"-1")));
  221. product.setMesUser(tokenConfig.get("mesUser"));
  222. product.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
  223. return syncMES(JSON.toJSONString(product, SerializerFeature.WriteMapNullValue).replace("null","\"\""),tokenConfig.get("syncProduct"));
  224. }
  225. @Override
  226. public ApiResult<String> syncMakeBase(String data) {
  227. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
  228. Make make = baseDao.getJdbcTemplate().queryForObject("select ma_code,ma_prodcode,ma_qty,nvl(cu_mescode,ma_custcode) ma_custcode,pr_unit,pr_detail,replace(PR_SPEC,'''','''''') pr_spec,ma_salecode,to_char(ma_planbegindate,'yyyy-MM-dd') ma_planbegindate,to_char(ma_planenddate,'yyyy-MM-dd') ma_planenddate,nvl(ma_cop,'BYT') ma_cop,'S' status,to_char(ma_date,'yyyy-MM-dd HH24:mi:ss') ma_date,ma_recorder,nvl(ma_version,0) ma_version,ma_id,wc_id,pr_id,to_char(ma_modifydate,'yyyy-MM-dd HH24:mi:ss') ma_modifydate,ma_modifier from make left join product on ma_prodcode=pr_code left join workcenter on ma_wccode=wc_code left join customer on ma_custcode=cu_code where ma_id=?",
  229. new BeanPropertyRowMapper<Make>(Make.class),store.get("ma_id"));
  230. make.setFlag(Integer.parseInt(StringUtil.nvl(store.get("flag"),"-1")));
  231. make.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
  232. make.setMesUser(tokenConfig.get("mesUser"));
  233. return syncMES(JSON.toJSONString(make, SerializerFeature.WriteMapNullValue).replace("null","\"\""),tokenConfig.get("syncMakeBase"));
  234. }
  235. @Override
  236. public ApiResult<String> syncMakeBaseDetail(String data) {
  237. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
  238. MakeMaterial makeMaterial = baseDao.getJdbcTemplate().queryForObject("select mm_code,erpid,mm_prodcode,pr_detail,replace(PR_SPEC,'''','''''') pr_spec,pr_unit,mm_oneuseqty qty,mm_qty,mm_oneuseqty,case when mm_ifrep=-1 then 'alternative' else 'main' end type,bo_recorder,to_char(bo_date,'yyyy-MM-dd HH24:mi:ss') bo_date,nvl(bo_version,0) bo_version,nvl(bo_cop,'BYT') bo_cop,mm_repprodcode,mm_balance,nvl(cu_mescode,ma_custcode) ma_custcode,to_char(mc_indate,'yyyy-MM-dd HH24:mi:ss') mc_indate,mc_recorder,flag from mes_makematerial left join make on ma_id=mm_maid left join Product on mm_prodcode=pr_code left join bom on bo_id=mm_bomid left join MakeMaterialChangeDet on md_makecode=ma_code and md_mmdetno=mm_detno left join MakeMaterialChange on mc_id=md_mcid left join customer on ma_custcode=cu_code where mm_id=? order by mm_detno",
  239. new BeanPropertyRowMapper<MakeMaterial>(MakeMaterial.class),store.get("mm_id"));
  240. makeMaterial.setFlag(Integer.parseInt(StringUtil.nvl(store.get("flag"),"-1")));
  241. makeMaterial.setMesUser(tokenConfig.get("mesUser"));
  242. makeMaterial.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
  243. return syncMES(JSON.toJSONString(makeMaterial, SerializerFeature.WriteMapNullValue).replace("null","\"\""),tokenConfig.get("syncMakeBaseDetail"));
  244. }
  245. @Override
  246. public ApiResult<String> syncUpdateReceiveByErp(String data) {
  247. try {
  248. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(data);
  249. VerifyApply verifyApply = baseDao.getJdbcTemplate().queryForObject("select va_id,va_mescode,va_code,to_char(va_date,'yyyy-MM-dd HH24:mi:ss') va_date,va_vendcode,va_vendname,va_currency,va_rate,va_paymentscode,va_payments,va_transport,va_sendcode,va_emcode,va_emname,va_departmentcode,va_department,va_recorder,case when nvl(va_cop,' ')=' ' then 'BYT' else va_cop end va_cop,va_remark,va_ancode,va_factory,0 version,va_type,va_pucode,case when nvl(va_pucode,' ')=' ' then 0 else (select pu_id from purchase where pu_code=va_pucode) end pu_id,va_status,1 posted,to_char(va_auditdate,'yyyy-MM-dd HH24:mi:ss') va_auditdate,va_auditman,va_custcode,va_custname from VerifyApply where va_id=?",
  250. new BeanPropertyRowMapper<VerifyApply>(VerifyApply.class), store.get("va_id"));
  251. SqlRowList rs = baseDao.queryForRowSet("select case when va_custcode='AR214' or nvl(va_custcode,' ')=' ' then 'BYT' else nvl(cu_mescode,cu_code) end cu_code,cu_name from verifyapply left join customer on va_custcode=cu_code where va_id="+store.get("va_id"));
  252. if (rs.next()){
  253. verifyApply.setVa_custcode(rs.getString("cu_code"));
  254. //verifyApply.setVa_custname(rs.getString("cu_name"));
  255. }
  256. verifyApply.setMesPwd(MD5Util.encodeByMD5(tokenConfig.get("mesPwd")));
  257. verifyApply.setMesUser(tokenConfig.get("mesUser"));
  258. verifyApply.setFlag(Integer.parseInt(StringUtil.nvl(store.get("flag"),"-1")));
  259. List<VerifyApplyDetail> verifyApplyDetails = baseDao.query("select vad_code,vad_prodcode,pr_detail,replace(PR_SPEC,'''','''''') pr_spec,pr_unit,va_recorder,va_date,pr_kh_user,cu_name,sum(nvl(vad_qty,0)) vad_qty,vad_salecode from ( select vad_code,vad_prodcode,pr_detail,pr_spec,pr_unit,vad_qty,va_recorder,to_char(va_date,'yyyy-MM-dd HH24:mi:ss') va_date,case when pr_kh_user='柏英特' or nvl(pr_kh_user,' ')=' ' then 'BYT' else nvl(cu_mescode,cu_code) end pr_kh_user,cu_name,vad_salecode from verifyapplydetail left join VerifyApply on va_id=vad_vaid left join product on vad_prodcode=pr_code left join customer on cu_shortname=pr_kh_user where nvl(vad_qty,0)>0 and vad_vaid="+store.get("va_id")+") group by vad_code,vad_prodcode,pr_detail,pr_spec,pr_unit,va_recorder,va_date,pr_kh_user,cu_name,vad_salecode", VerifyApplyDetail.class);
  260. verifyApply.setDetail(verifyApplyDetails);
  261. return syncMES(JSON.toJSONString(verifyApply, SerializerFeature.WriteMapNullValue).replace("null","\"\""),tokenConfig.get("syncUpdateReceiveByErp"));
  262. }catch (Exception e){
  263. logger.info("同步收料单异常信息:"+e.getMessage());
  264. e.printStackTrace();
  265. return ApiResponse.failRsp("104",e.getMessage());
  266. }
  267. }
  268. private ApiResult<String> syncMES(String params,String url){
  269. try {
  270. logger.info("params:"+params);
  271. String post = PSHttpUtils.sendPost(tokenConfig.get("mesHttp") + url, params);
  272. logger.info("post:"+post);
  273. JSONObject jsonObject = JSON.parseObject(post);
  274. int code = jsonObject.getIntValue("result");
  275. if (code==0){
  276. return ApiResponse.successRsp("0","同步MES成功");
  277. }else if(code==1){
  278. return ApiResponse.failRsp("101",jsonObject.getString("message"));
  279. }else {
  280. return ApiResponse.failRsp("102","接口调用异常,请联系MES处理!");
  281. }
  282. }catch (Exception e){
  283. logger.info("异常信息:"+e.getMessage());
  284. return ApiResponse.failRsp("103","接口调用异常,请联系MES处理!");
  285. }
  286. }
  287. }