OWbInveMngServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. package com.emato.biz.service.impl;
  2. import java.io.IOException;
  3. import java.util.*;
  4. import java.util.concurrent.ThreadPoolExecutor;
  5. import java.util.concurrent.atomic.AtomicInteger;
  6. import java.util.stream.Collectors;
  7. import cn.hutool.core.util.StrUtil;
  8. import cn.hutool.http.HttpRequest;
  9. import com.alibaba.fastjson.JSON;
  10. import com.alibaba.fastjson.JSONArray;
  11. import com.alibaba.fastjson.JSONObject;
  12. import com.emato.biz.config.OmsConfig;
  13. import com.emato.biz.domain.OutRequest;
  14. import com.emato.biz.domain.merchant.MerchUser;
  15. import com.emato.biz.domain.merchant.ThirdMerchantBiz;
  16. import com.emato.biz.domain.warehouse.Page;
  17. import com.emato.biz.domain.warehouse.PullInveQueryVO;
  18. import com.emato.biz.mapper.merchant.MerchUserMapper;
  19. import com.emato.biz.mapper.merchant.ThirdMerchantBizMapper;
  20. import com.emato.biz.mapper.warehouse.WbInveMngMapper;
  21. import com.emato.biz.util.JsonUtil;
  22. import com.emato.biz.util.OmsDataUtil;
  23. import com.emato.biz.util.RoleUtils;
  24. import com.emato.common.core.Result;
  25. import com.emato.common.core.domain.AjaxResult;
  26. import com.emato.common.core.domain.entity.SysUser;
  27. import com.emato.common.exception.ServiceException;
  28. import com.emato.common.utils.DateUtils;
  29. import com.emato.common.utils.SecurityUtils;
  30. import com.emato.common.utils.oms.JacksonUtils;
  31. import com.emato.common.utils.oms.request.OmsSign;
  32. import org.apache.http.HttpStatus;
  33. import org.apache.http.client.methods.CloseableHttpResponse;
  34. import org.apache.http.client.methods.HttpPost;
  35. import org.apache.http.entity.StringEntity;
  36. import org.apache.http.impl.client.CloseableHttpClient;
  37. import org.apache.http.impl.client.HttpClients;
  38. import org.apache.http.util.EntityUtils;
  39. import org.slf4j.Logger;
  40. import org.slf4j.LoggerFactory;
  41. import org.springframework.beans.factory.annotation.Autowired;
  42. import org.springframework.stereotype.Service;
  43. import com.emato.biz.mapper.warehouse.OWbInveMngMapper;
  44. import com.emato.biz.domain.warehouse.OWbInveMng;
  45. import com.emato.biz.service.warehouse.IOWbInveMngService;
  46. import org.springframework.transaction.annotation.Transactional;
  47. import javax.annotation.Resource;
  48. /**
  49. * 库存管理,wms入库回传时,增加库存数Service业务层处理
  50. *
  51. * @author yangbo
  52. * @date 2021-02-01
  53. */
  54. @Service
  55. public class OWbInveMngServiceImpl implements IOWbInveMngService
  56. {
  57. @Resource
  58. private OWbInveMngMapper oWbInveMngMapper;
  59. @Resource
  60. private WbInveMngMapper wbInveMngMapper;
  61. @Resource
  62. private MerchUserMapper merchUserMapper;
  63. @Resource
  64. private ThirdMerchantBizMapper thirdMerchantBizMapper;
  65. private static final Logger log = LoggerFactory.getLogger(OWbInveMngServiceImpl.class);
  66. @Autowired
  67. private ThreadPoolExecutor threadPoolExecutor;
  68. /**
  69. * 根据条件拉取 OMS 数据
  70. *
  71. * @param queryVO
  72. * @return
  73. */
  74. @Override
  75. public AjaxResult pullInveMng(PullInveQueryVO queryVO) {
  76. // 声明页数
  77. int page = 1;
  78. // 处理查询参数
  79. setQueryVO(queryVO, page, OmsConfig.getQuerySize());
  80. // 声明处理数量
  81. AtomicInteger rows = new AtomicInteger(0);
  82. // 查询 OMS 分页数据
  83. Optional<Page<OWbInveMng>> firstPageOpt =
  84. OmsDataUtil.fetchOmsPageData(queryVO, OmsConfig.getQueryMngInveUrl(), OWbInveMng.class);
  85. // 如果有数据
  86. firstPageOpt.ifPresent(firstPage -> {
  87. // 插入数据库
  88. firstPage.getList().stream().forEach(obj -> {
  89. // 插入数据库
  90. wbInveMngMapper.saveOrUpdate(obj);
  91. // 处理数据条数加 1
  92. rows.getAndIncrement();
  93. });
  94. for(int pageNum = page + 1; pageNum <= firstPage.getTotalPage(); pageNum++) {
  95. log.debug("当前拉取的页数 => {}", pageNum);
  96. queryVO.setPage(pageNum);
  97. // 分页拉取远程数据
  98. Optional<Page<OWbInveMng>> pageOpt = OmsDataUtil.fetchOmsPageData(queryVO, OmsConfig.getQueryMngInveUrl(), OWbInveMng.class);
  99. pageOpt.get().getList().forEach(obj -> {
  100. wbInveMngMapper.saveOrUpdate(obj);
  101. rows.getAndIncrement();
  102. });
  103. }
  104. });
  105. log.debug("拉取库存成功,拉取数据条数 => {}", rows.get());
  106. return AjaxResult.success("拉取库存成功!");
  107. }
  108. /**
  109. * 查询库存管理,wms入库回传时,增加库存数
  110. *
  111. * @param inveSn 库存管理,wms入库回传时,增加库存数ID
  112. * @return 库存管理,wms入库回传时,增加库存数
  113. */
  114. @Override
  115. public OWbInveMng selectOWbInveMngById(String inveSn)
  116. {
  117. return oWbInveMngMapper.selectOWbInveMngById(inveSn);
  118. }
  119. /**
  120. * 查询库存管理,wms入库回传时,增加库存数列表
  121. *
  122. * @param oWbInveMng 库存管理,wms入库回传时,增加库存数
  123. * @return 库存管理,wms入库回传时,增加库存数
  124. */
  125. @Override
  126. public List<OWbInveMng> selectOWbInveMngList(OWbInveMng oWbInveMng)
  127. {
  128. // 获取登录用户
  129. SysUser user = SecurityUtils.getLoginUser().getUser();
  130. boolean allRole = RoleUtils.isAllRole(user);
  131. if (!allRole) {
  132. // 如果没有全部数据权限
  133. // 查询该用户属于哪个商户
  134. MerchUser merchUser = merchUserMapper.selectMerchUserByUserId(user.getUserId()+"");
  135. if (Objects.isNull(merchUser)) {
  136. // 如果用户没有绑定商户就返回空数据
  137. return Collections.emptyList();
  138. }
  139. // 如果用户绑定了商户
  140. // 获取用户绑定的商户号,开始查询该商户的库存数据
  141. String merchSn = merchUser.getMerchSn();
  142. // 设置商户作为查询条件
  143. oWbInveMng.setMerchSn(merchSn);
  144. // 查询是否有三方商户
  145. ThirdMerchantBiz merchantBiz = thirdMerchantBizMapper.selectByClientMerchSn(merchSn);
  146. if (Objects.nonNull(merchantBiz)) {
  147. // 如果有第三方商户,设置三方商户号作为查询条件
  148. oWbInveMng.setThirdMerchSn(merchantBiz.getThirdMerchSn());
  149. }
  150. }
  151. return wbInveMngMapper.selectWbInveMngList(oWbInveMng);
  152. }
  153. /**
  154. * 新增库存管理,wms入库回传时,增加库存数
  155. *
  156. * @param oWbInveMng 库存管理,wms入库回传时,增加库存数
  157. * @return 结果
  158. */
  159. @Override
  160. public int insertOWbInveMng(OWbInveMng oWbInveMng)
  161. {
  162. oWbInveMng.setCreateTime(DateUtils.getNowDate());
  163. return oWbInveMngMapper.insertOWbInveMng(oWbInveMng);
  164. }
  165. /**
  166. * 修改库存管理,wms入库回传时,增加库存数
  167. *
  168. * @param oWbInveMng 库存管理,wms入库回传时,增加库存数
  169. * @return 结果
  170. */
  171. @Override
  172. public int updateOWbInveMng(OWbInveMng oWbInveMng)
  173. {
  174. return oWbInveMngMapper.updateOWbInveMng(oWbInveMng);
  175. }
  176. /**
  177. * 批量删除库存管理,wms入库回传时,增加库存数
  178. *
  179. * @param inveSns 需要删除的库存管理,wms入库回传时,增加库存数ID
  180. * @return 结果
  181. */
  182. @Override
  183. public int deleteOWbInveMngByIds(String[] inveSns)
  184. {
  185. return oWbInveMngMapper.deleteOWbInveMngByIds(inveSns);
  186. }
  187. /**
  188. * 删除库存管理,wms入库回传时,增加库存数信息
  189. *
  190. * @param inveSn 库存管理,wms入库回传时,增加库存数ID
  191. * @return 结果
  192. */
  193. @Override
  194. public int deleteOWbInveMngById(String inveSn)
  195. {
  196. return oWbInveMngMapper.deleteOWbInveMngById(inveSn);
  197. }
  198. /**
  199. * 根据商户编号去拉取数据
  200. *
  201. * @param merchSn
  202. * @return
  203. */
  204. @Override
  205. @Transactional
  206. public int pullInveMng(String merchSn) {
  207. int page = 1;
  208. Integer querySize = OmsConfig.getQuerySize();
  209. int resultCode = pullInveMngFromOms(merchSn,page, querySize);
  210. while(resultCode != 1){
  211. page = page + 1;
  212. resultCode = pullInveMngFromOms(merchSn, page, querySize);
  213. }
  214. return resultCode==0?1:resultCode;
  215. }
  216. private int pullInveMngFromOms(String merchSn, int page, Integer querySize) {
  217. Map<String,String> data = new HashMap();
  218. data.put("merchId",merchSn);
  219. data.put("page",page+"");
  220. data.put("limit",querySize.toString());
  221. Map sParaTemp = new TreeMap();
  222. sParaTemp.put("data", JSON.toJSONString(data));
  223. sParaTemp.put("merchId",OmsConfig.getMerchSn());
  224. String timestamp = String.valueOf(System.currentTimeMillis()/1000);
  225. sParaTemp.put("timestamp", timestamp);
  226. //生成要请求给oms秘钥
  227. log.info("md5混淆码参数:" + OmsConfig.getMd5Salt());
  228. String sign = OmsSign.sign(sParaTemp,OmsConfig.getMd5Salt());
  229. sParaTemp.put("sign", sign);
  230. //构建Request
  231. String url = OmsConfig.getQueryMngInveUrl();
  232. String jsonParam = JSONObject.toJSONString(sParaTemp);
  233. log.info("Eccs 请求 OMS url => {}, 请求 OMS 报文 => {}", url, jsonParam);
  234. // 同步访问,返回结果字符串
  235. String responseString = null;
  236. try {
  237. JSONObject jsonObject = httpPost(url,JSONObject.parseObject(jsonParam));
  238. log.info("oms的响应报文"+jsonObject.toString());
  239. //解析响应数据
  240. JSONArray result = (JSONArray) jsonObject.get("data");
  241. Object msg = jsonObject.get("msg");
  242. Object code = jsonObject.get("code");
  243. if(result == null || result.size() == 0){
  244. return 1;
  245. }
  246. for(int i = 0 ; i < result.size(); i ++){
  247. JSONObject o = (JSONObject) result.get(i);
  248. OWbInveMng oWbInveMng = o.toJavaObject(OWbInveMng.class);
  249. //oWbInveMngMapper.saveOrUpdate(oWbInveMng);
  250. wbInveMngMapper.saveOrUpdate(oWbInveMng);
  251. }
  252. if("202".equals(code)){
  253. return 1;
  254. }
  255. } catch (Exception e) {
  256. log.error(e.getMessage());
  257. return 1;
  258. }
  259. return 0;
  260. }
  261. public static JSONObject httpPost(String url, JSONObject jsonParam)
  262. {
  263. // post请求返回结果
  264. CloseableHttpClient httpClient = HttpClients.createDefault();
  265. JSONObject jsonResult = null;
  266. HttpPost httpPost = new HttpPost(url);
  267. // 设置请求和传输超时时间
  268. // httpPost.setConfig(requestConfig);
  269. try
  270. {
  271. if (null != jsonParam)
  272. {
  273. // 解决中文乱码问题
  274. StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");
  275. entity.setContentEncoding("UTF-8");
  276. entity.setContentType("application/json");
  277. httpPost.setEntity(entity);
  278. }
  279. CloseableHttpResponse result = httpClient.execute(httpPost);
  280. // 请求发送成功,并得到响应
  281. if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
  282. {
  283. String str = "";
  284. try
  285. {
  286. // 读取服务器返回过来的json字符串数据
  287. str = EntityUtils.toString(result.getEntity(), "utf-8");
  288. // 把json字符串转换成json对象
  289. jsonResult = JSONObject.parseObject(str);
  290. }
  291. catch (Exception e)
  292. {
  293. log.error("post请求提交失败:" + url, e);
  294. }
  295. }
  296. }
  297. catch (IOException e)
  298. {
  299. log.error("post请求提交失败:" + url, e);
  300. }
  301. finally
  302. {
  303. httpPost.releaseConnection();
  304. }
  305. return jsonResult;
  306. }
  307. /**
  308. * 拉取 OMS 库存数据
  309. *
  310. * @param queryVO 请求 OMS 数据
  311. * @param url 请求 OMS 地址
  312. * @param clazz 返回的分页数据类
  313. *
  314. * @return
  315. */
  316. private <T> Optional<Page<T>> fetchOmsPageData(PullInveQueryVO queryVO,
  317. String url,
  318. Class<T> clazz) {
  319. // 构建请求报文
  320. // 初始化请求 oms 参数 Map
  321. Map<String, String> reqOmsPram = new TreeMap<>();
  322. // 请求 oms 数据
  323. reqOmsPram.put("===== data ====> {}", JacksonUtils.toJsonStr(queryVO));
  324. // 请求 oms 商户号
  325. reqOmsPram.put("merchId", OmsConfig.getMerchSn());
  326. log.debug("===== 请求 oms 商户号 ====> {}", OmsConfig.getMerchSn());
  327. // 请求 oms 时间戳
  328. String timestamp = System.currentTimeMillis()/1000 + "";
  329. reqOmsPram.put("timestamp", timestamp);
  330. log.debug("===== 请求 oms 时间戳 ====> {}", timestamp);
  331. // 请求 oms 签名
  332. String sign = OmsSign.sign(reqOmsPram, OmsConfig.getMd5Salt());
  333. reqOmsPram.put("sign", sign);
  334. // oms 请求地址
  335. log.debug("===== 请求 oms 地址 ====> {}", url);
  336. // 请求 oms 报文
  337. String reqBody = JacksonUtils.toJsonStr(reqOmsPram);
  338. log.debug("===== 请求 oms 报文 ====> {}", reqBody);
  339. // oms 返回数据
  340. String body = null;
  341. try {
  342. body = HttpRequest.post(url)
  343. .body(JacksonUtils.toJsonStr(reqOmsPram))
  344. .execute()
  345. .body();
  346. } catch (Exception e) {
  347. throw new ServiceException("请求 OMS 异常!");
  348. }
  349. log.debug("OMS 响应信息 => {}", body);
  350. // 解析返回的数据
  351. JSONObject jsonObject = JSONObject.parseObject(body);
  352. String code = jsonObject.getString("code");
  353. if ("200".equals(code)){
  354. Page<T> page = JsonUtil.parsePage(jsonObject, clazz);
  355. if (!page.getList().isEmpty())
  356. // 如果 page 有值就返回
  357. return Optional.of(page);
  358. }
  359. return Optional.empty();
  360. }
  361. /**
  362. * 处理查询参数
  363. *
  364. * @param queryVO
  365. * @param page
  366. * @param limit
  367. */
  368. private void setQueryVO(PullInveQueryVO queryVO, int page, int limit) {
  369. queryVO.setPage(page);
  370. queryVO.setLimit(limit);
  371. // 查询是否是三方商户
  372. ThirdMerchantBiz thirdMerchantBiz = thirdMerchantBizMapper.selectByClientMerchSn(queryVO.getMerchId());
  373. if (Objects.nonNull(thirdMerchantBiz)) {
  374. // 如果是三方商户,查询条件加入三方商户
  375. queryVO.setThirdMerchId(thirdMerchantBiz.getThirdMerchSn());
  376. }
  377. // 将 sku 变成 skuSet 参数
  378. if (StrUtil.isNotBlank(queryVO.getSku())) {
  379. List<String> skus = StrUtil.split(queryVO.getSku(), ",");
  380. Set<String> skuSet = skus.stream().collect(Collectors.toSet());
  381. queryVO.setSkuSets(skuSet);
  382. }
  383. // 将门店编号转为门店列表
  384. if (StrUtil.isNotBlank(queryVO.getShopSn())) {
  385. List<String> shopList = StrUtil.split(queryVO.getShopSn(), ",");
  386. queryVO.setShopSnList(shopList);
  387. }
  388. }
  389. }