ERPServiceImpl.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. package com.uas.eis.service.Impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.kyexpress.openapi.bo.request.batchorder.OrderCustomerInfo;
  5. import com.kyexpress.openapi.bo.request.batchorder.OrderInfoItem;
  6. import com.kyexpress.openapi.bo.response.batchorder.InvalidResult;
  7. import com.kyexpress.openapi.bo.response.batchorder.SuccessOrderResult;
  8. import com.kyexpress.openapi.bo.response.batchorder.UnconfirmResult;
  9. import com.kyexpress.openapi.sdk.utils.JsonUtils;
  10. import com.uas.eis.config.KyeConfig;
  11. import com.uas.eis.core.config.SpObserver;
  12. import com.uas.eis.dao.*;
  13. import com.uas.eis.dto.OrderUpdateInfoDTO;
  14. import com.uas.eis.service.CommonService;
  15. import com.uas.eis.service.ERPService;
  16. import com.uas.eis.utils.BaseUtil;
  17. import com.uas.eis.utils.StringUtil;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import com.kyexpress.openapi.bo.request.batchorder.OrderInfo;
  24. import com.kyexpress.openapi.bo.response.batchorder.OrderResult;
  25. import com.kyexpress.openapi.sdk.KyeDefaultOpenApi;
  26. import com.kyexpress.openapi.sdk.exception.KyeOpenApiException;
  27. import java.io.IOException;
  28. import com.fasterxml.jackson.core.type.TypeReference;
  29. import java.util.*;
  30. /**
  31. * @author koul
  32. * @email koul@usoftchina.com
  33. * @date 2021-12-06 18:27
  34. */
  35. @Service
  36. public class ERPServiceImpl implements ERPService {
  37. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  38. @Autowired
  39. private BaseDao baseDao;
  40. @Autowired
  41. private KyeConfig kyeConfig;
  42. @Autowired
  43. private CommonService commonService;
  44. @Override
  45. public Map<String, Object> pushKyeOrder(String master, Integer id) throws IOException {
  46. SpObserver.putSp(master);
  47. SqlRowList rs = baseDao.queryForRowSet("select pi_inoutno,pi_title,PI_SERVICEMODE,PI_PAYMODE,PI_PAYMENTCUSTOMER,nvl(PI_IFRECEIPTFLAG,0) PI_IFRECEIPTFLAG," +
  48. "pi_recordman,em_mobile,pi_purposename,pi_expresscode,pi_catename_user,pi_address,nvl(pi_receiptcount,1) pi_receiptcount,PI_KYEREMAKR,SYSSENDKYE_,nvl(pi_insuranceValue,0) pi_insuranceValue"+
  49. " from prodinout left join employee on em_name=pi_recordman where pi_id=?",id);
  50. if(rs.next()) {
  51. Map<String,Object> map = new HashMap<>();
  52. /*if(!StringUtil.hasText(rs.getString("em_mobile"))){
  53. map.put("success", false);
  54. map.put("message", "录入人手机号必填!");
  55. return map;
  56. }*/
  57. //出货单联系人pi_purposename ,联系人手机号pi_catename_user 为空不允许发送
  58. if(!StringUtil.hasText(rs.getString("pi_purposename"))){
  59. map.put("success", false);
  60. map.put("message", "出货单联系人必填!");
  61. return map;
  62. }
  63. if(!StringUtil.hasText(rs.getString("pi_catename_user"))){
  64. map.put("success", false);
  65. map.put("message", "出货单联系人手机号必填!");
  66. return map;
  67. }
  68. //收货地址为空不允许发送:pi_address
  69. if(!StringUtil.hasText(rs.getString("pi_address"))){
  70. map.put("success", false);
  71. map.put("message", "收货地址必填!");
  72. return map;
  73. }
  74. //时效为空pi_servicemode
  75. if(!StringUtil.hasText(rs.getString("pi_servicemode"))){
  76. map.put("success", false);
  77. map.put("message", "时效必填!");
  78. return map;
  79. }
  80. //PI_PAYMODE 付款方式为空,付款方式代码 PI_PAYMENTCUSTOMER 为空 校验当付款方式=10-寄方付 或者 30-第三方付 时,付款账号必填
  81. if(!StringUtil.hasText(rs.getString("pi_paymode"))){
  82. map.put("success", false);
  83. map.put("message", "物流付款方式必填!");
  84. return map;
  85. }
  86. if((rs.getString("pi_paymode").equals("10")|| rs.getString("pi_paymode").equals("30")) &&
  87. !StringUtil.hasText(rs.getString("pi_paymentcustomer"))){
  88. map.put("success", false);
  89. map.put("message", "当物流付款方式寄方付或者第三方付时,物流付款账号必填!");
  90. return map;
  91. }
  92. logger.info("pushKyeOrder begin: master {} ,id {} ",master,id);
  93. Object en_kyename = baseDao.getFieldDataByCondition("enterprise","En_kyename","1=1");
  94. //组装请求参数,设置具体业务值
  95. OrderInfo orderInfo = new OrderInfo();
  96. orderInfo.setCustomerCode(kyeConfig.getCustomerCode());//固定值
  97. orderInfo.setPlatformFlag(kyeConfig.getPlatformFlag());//固定值
  98. //设置寄件方
  99. OrderCustomerInfo preWaybillDelivery = new OrderCustomerInfo();
  100. preWaybillDelivery.setCompanyName("深圳华商龙"); //固定值
  101. preWaybillDelivery.setPerson(rs.getGeneralString("pi_recordman")); //pi_recordman
  102. preWaybillDelivery.setMobile(rs.getGeneralString("13480992146")); //改成固定 电话 人员资料的 em_mobile
  103. preWaybillDelivery.setAddress("深圳市南山区西丽松白路1026号南岗第二工业园13栋2楼"); //固定值
  104. preWaybillDelivery.setContactName("甘维东"); //取货人
  105. preWaybillDelivery.setContactPhone("13480992146"); //取货人电话固定值
  106. OrderInfoItem orderInfoItem = new OrderInfoItem();
  107. orderInfoItem.setPreWaybillDelivery(preWaybillDelivery);
  108. //设置收件方
  109. OrderCustomerInfo preWaybillPickup = new OrderCustomerInfo();
  110. preWaybillPickup.setCompanyName(rs.getString("pi_title")); //出货单客户名称(pi_title)
  111. preWaybillPickup.setPerson(rs.getString("pi_purposename")); //出货单 联系人(pi_purposename)必填
  112. preWaybillPickup.setPhone(rs.getGeneralString("pi_expresscode"));//"出货单(座机)pi_expresscode"
  113. preWaybillPickup.setMobile(rs.getGeneralString("pi_catename_user")); // "出货单(手机)pi_catename_user 必填"
  114. preWaybillPickup.setAddress(rs.getGeneralString("pi_address")); //必填 出货单收货地址字段(pi_address)--目前看好像有些地址没到省市,后续需要规范
  115. orderInfoItem.setPreWaybillPickup(preWaybillPickup);
  116. orderInfoItem.setServiceMode(rs.getString("pi_servicemode")); //出货单目前没有字段,新增一个字段时效 填写(pi_servicemode)必填 10-当天达,20-次日达,30-隔日达,40-陆运件,50-同城次日,70-同城即日,160-省内次日,170-省内即日,210-表示空运,220-专运
  117. orderInfoItem.setPayMode(rs.getString("PI_PAYMODE")); //出货单增加字段自行填写 10-寄方付 ,20-收方付 ,30-第三方付 (传代码) 必填
  118. if(rs.getString("pi_paymode").equals("10")) {
  119. orderInfoItem.setPaymentCustomer(kyeConfig.getCustomerCode());
  120. }else if( rs.getString("pi_paymode").equals("30")){
  121. orderInfoItem.setPaymentCustomer(rs.getString("PI_PAYMENTCUSTOMER")); //正式值:75532690963 校验当付款方式=10-寄方付 或者 30-第三方付 时,付款账号必填
  122. }
  123. orderInfoItem.setGoodsType("电子");
  124. orderInfoItem.setOrderId(en_kyename+":"+rs.getString("pi_inoutno")); //取出货单的单据编号 对应账套代码拼接出货单号pi_inoutno
  125. if(rs.getInt("PI_IFRECEIPTFLAG") == 0) {
  126. orderInfoItem.setReceiptFlag("20"); //必填 出货单增加字段是否回单原件,是就是:10,否是:20 10:回单原件(含回单照片),20:无需回单,30:回单照片,40:电子回单(传代码)
  127. }else{
  128. orderInfoItem.setReceiptFlag("10");
  129. }
  130. //保价值
  131. orderInfoItem.setInsuranceValue(rs.getGeneralBigDecimal("pi_insuranceValue"));
  132. //回单张数
  133. orderInfoItem.setReceiptCount(rs.getGeneralInt("pi_receiptCount")); //默认值为1
  134. orderInfoItem.setWaybillRemark(rs.getString("pi_kyeremakr"));// 备注:PI_KYEREMAKR
  135. orderInfoItem.setDismantling("20"); //固定值 20-否 10-是,表示根据预约揽件的时间上门揽收,20-否,表示线下自主联系揽收(传代码,是否预约取货为“10”时,货好时间字段必填,同时根据货好时间安排司机上门揽收)
  136. //回单联
  137. List<String> pic = new ArrayList<>();
  138. pic.add("10");
  139. orderInfoItem.setPictureSubscription(pic);
  140. /*测试用
  141. orderInfoItem.setDismantling("10");
  142. orderInfoItem.setGoodsTime("2023-09-30 12:00:00");*/
  143. List<OrderInfoItem> infoItems = new ArrayList<>();
  144. infoItems.add(orderInfoItem);
  145. orderInfo.setRepeatCheck("10");
  146. orderInfo.setOrderInfos(infoItems);
  147. boolean suc = true;
  148. String response = callWebserviceKYE("open.api.openCommon.batchOrder", JSONArray.toJSONString(orderInfo));
  149. Map<Object, Object> res = BaseUtil.parseFormStoreToMap(response);
  150. if(Boolean.valueOf(res.get("success").toString())){
  151. OrderResult orderResult = JsonUtils.serializable(JSON.toJSONString(res.get("data")),new TypeReference<OrderResult>(){});
  152. if(orderResult.getTotal().getSuccessTotal()>0) {
  153. SuccessOrderResult result = orderResult.getSuccess().get(0);
  154. //更新单号,时间 、物料信息 SYSSENDKYE_ 、SYSSENDKYEDATE_ 、 pi_listcode
  155. baseDao.execute("update prodinout set SYSSENDKYE_=-1,SYSSENDKYEDATE_=sysdate, pi_listcode=? where pi_id=" + id, result.getWaybillNumber());
  156. commonService.logKyeSRecord(rs.getString("pi_inoutno"), id, result.getWaybillNumber(),"下单成功");
  157. suc = true;
  158. }else if(orderResult.getTotal().getUnconfirmTotal()>0){
  159. UnconfirmResult result = orderResult.getUnconfirm().get(0);
  160. commonService.logKyeSRecord(rs.getString("pi_inoutno"),id,result.getWaybillNumber(),result.getMessage()+",确认链接:"+orderResult.getConfirmUrl());
  161. map.put("confirmUrl",orderResult.getConfirmUrl());
  162. suc = true;
  163. }else{
  164. InvalidResult result = orderResult.getFailure().get(0);
  165. commonService.logKyeFRecord(rs.getString("pi_inoutno"),id,result.getMessage(),null);
  166. map.put("message", result.getMessage());
  167. suc = false;
  168. }
  169. }else{
  170. if(StringUtil.hasText(res.get("msg"))) {
  171. commonService.logKyeFRecord(rs.getString("pi_inoutno"), id, res.get("msg").toString(), null);
  172. map.put("message", res.get("msg").toString());
  173. }
  174. suc = false;
  175. }
  176. logger.info("pushKyeOrder end: master {} ,id {} ",master,id);
  177. map.put("success", suc);
  178. return map;
  179. }else{
  180. Map<String,Object> map = new HashMap<>();
  181. map.put("success", false);
  182. map.put("message", "单据不存在!");
  183. return map;
  184. }
  185. }
  186. @Override
  187. public Map<String, Object> updateKyeOrder(String master, int id) throws IOException {
  188. SpObserver.putSp(master);
  189. SqlRowList rs = baseDao.queryForRowSet("select pi_inoutno,pi_title,PI_SERVICEMODE,PI_PAYMODE,PI_PAYMENTCUSTOMER,nvl(PI_IFRECEIPTFLAG,0) PI_IFRECEIPTFLAG," +
  190. "pi_recordman,em_mobile,pi_purposename,pi_expresscode,pi_catename_user,pi_address,SYSSENDKYE_,pi_listcode,nvl(pi_insuranceValue,0) pi_insuranceValue "+
  191. " from prodinout left join employee on em_name=pi_recordman where pi_id=? and nvl(SYSSENDKYE_,0)<>0 and nvl(pi_listcode,' ')<>' ' ",id);
  192. if(rs.next()) {
  193. logger.info("updateKyeOrder begin: master {} ,id {} ",master,id);
  194. Map<String,Object> map = new HashMap<>();
  195. //组装请求参数,设置具体业务值
  196. OrderUpdateInfoDTO orderInfo = new OrderUpdateInfoDTO();
  197. orderInfo.setCustomerCode(kyeConfig.getCustomerCode());//固定值
  198. orderInfo.setPlatformFlag(kyeConfig.getPlatformFlag());//固定值
  199. orderInfo.setWaybillNumber(rs.getString("pi_listcode"));
  200. orderInfo.setType("20"); //为空默认为10,10-修改订单和运单数据 、20-只修改运单数据
  201. //保价值
  202. orderInfo.setInsuranceValue(rs.getGeneralBigDecimal("pi_insuranceValue"));
  203. //设置寄件方
  204. OrderCustomerInfo preWaybillDelivery = new OrderCustomerInfo();
  205. preWaybillDelivery.setCompanyName("深圳华商龙"); //固定值
  206. preWaybillDelivery.setPerson(rs.getGeneralString("pi_recordman")); //pi_recordman
  207. preWaybillDelivery.setMobile("13480992146"); //人员资料的 em_mobile
  208. preWaybillDelivery.setAddress("深圳市南山区西丽松白路1026号南岗第二工业园13栋2楼"); //固定值
  209. orderInfo.setPreWaybillDelivery(preWaybillDelivery);
  210. //设置收件方
  211. OrderCustomerInfo preWaybillPickup = new OrderCustomerInfo();
  212. preWaybillPickup.setCompanyName(rs.getString("pi_title")); //出货单客户名称(pi_title)
  213. preWaybillPickup.setPerson(rs.getString("pi_purposename")); //出货单 联系人(pi_purposename)必填
  214. preWaybillPickup.setPhone(rs.getGeneralString("pi_expresscode"));//"出货单(座机)pi_expresscode"
  215. preWaybillPickup.setMobile(rs.getGeneralString("pi_catename_user")); // "出货单(手机)pi_catename_user 必填"
  216. preWaybillPickup.setAddress(rs.getGeneralString("pi_address")); //必填 出货单收货地址字段(pi_address)--目前看好像有些地址没到省市,后续需要规范
  217. orderInfo.setPreWaybillPickup(preWaybillPickup);
  218. orderInfo.setServiceMode(rs.getString("pi_servicemode")); //出货单目前没有字段,新增一个字段时效 填写(pi_servicemode)必填 10-当天达,20-次日达,30-隔日达,40-陆运件,50-同城次日,70-同城即日,160-省内次日,170-省内即日,210-表示空运,220-专运
  219. if(rs.getInt("PI_IFRECEIPTFLAG") == 0) {
  220. orderInfo.setReceiptFlag("20"); //必填 出货单增加字段是否回单原件,是就是:10,否是:20 10:回单原件(含回单照片),20:无需回单,30:回单照片,40:电子回单(传代码)
  221. }else{
  222. orderInfo.setReceiptFlag("10");
  223. }
  224. boolean suc = true;
  225. String response = callWebserviceKYE("open.api.openCommon.updateYdByCondition", JSONArray.toJSONString(orderInfo));
  226. Map<Object, Object> res = BaseUtil.parseFormStoreToMap(response);
  227. if(Boolean.valueOf(res.get("success").toString())){
  228. //更新单号,时间 、物料信息 SYSSENDKYE_ 、SYSSENDKYEDATE_ 、 pi_listcode
  229. baseDao.execute("update prodinout set SYSSENDKYE_=-1,SYSSENDKYEDATE_=sysdate where pi_id=" + id);
  230. commonService.logKyeSRecord(rs.getString("pi_inoutno"), id, rs.getString("pi_listcode"),res.get("msg").toString());
  231. }else{
  232. commonService.logKyeFRecord(rs.getString("pi_inoutno"),id,res.get("msg").toString(),rs.getString("pi_listcode"));
  233. map.put("message", res.get("msg").toString());
  234. }
  235. logger.info("updateKyeOrder end: master {} ,id {} ",master,id);
  236. map.put("success", suc);
  237. return map;
  238. }else{
  239. Map<String,Object> map = new HashMap<>();
  240. map.put("success", false);
  241. map.put("message", "单据不存在!");
  242. return map;
  243. }
  244. }
  245. private String callWebserviceKYE(String apiCode, String toJSONString) throws IOException {
  246. String appkey = kyeConfig.getAppKey();
  247. String appsecret = kyeConfig.getAppSecret();
  248. //String body = JsonUtils.deserializer(orderInfo);*/
  249. String body = toJSONString;
  250. String response= "";
  251. try {
  252. response = KyeDefaultOpenApi.builder
  253. (appkey, appsecret) //应用Key,密钥
  254. .env("prod") //对应环境,包含(uat:测试环境,prod:生产环境),获取对应环境的请求路径
  255. .api(apiCode) //所调用Api Code
  256. .sandbox(kyeConfig.isSandbox())
  257. .body(body) //请求体参数,可接受字符串,List,Map三种类型的参数
  258. .connectTimeout(3000) //连接超时时间
  259. .readTimeout(15000) //读取超时时间
  260. .request()
  261. .response();
  262. // System.out.println(response);
  263. } catch (KyeOpenApiException e) {
  264. e.printStackTrace();
  265. }
  266. if(!StringUtils.isEmpty(response)){
  267. //返回值对象
  268. return response;
  269. }
  270. return null;
  271. }
  272. }