| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- package com.uas.eis.service.Impl;
- import com.fasterxml.jackson.core.JsonProcessingException;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.fasterxml.jackson.dataformat.xml.XmlMapper;
- import com.uas.eis.config.VwmsConfig;
- import com.uas.eis.dao.*;
- import com.uas.eis.entity.vwms.entity.*;
- import com.uas.eis.entity.vwms.req.*;
- import com.uas.eis.entity.vwms.resp.BaseVastResp;
- import com.uas.eis.entity.vwms.resp.ProdResp;
- import com.uas.eis.service.DocCommonService;
- import com.uas.eis.service.ERPService;
- import com.uas.eis.utils.*;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import java.util.*;
- /**
- * @author wuyx
- * @email wuyx@usoftchina.com
- * @date 2025-03-04
- */
- @Service
- public class ERPServiceImpl implements ERPService {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
- @Autowired
- private BaseDao baseDao;
- @Autowired
- private VwmsConfig vwmsConfig;
- @Autowired
- private DocCommonService docCommonService;
- @Override
- public Map<String, Object> sendProd(String master, String id, String emCode, String caller) {
- Map<String, Object> retMap = new HashMap<>();
- retMap.put("success", true);
- logger.info("sendProd-Begin:master {} id {}", master, id);
- vwmsConfig.setEv(docCommonService.getMasterEv(master));
- // 执行查询
- SqlRowList docMsg = baseDao.queryForRowSet(" select nvl(pr_sendwmsflag,0) pr_sendwmsflag,pr_id,pr_code,pr_detail,pr_spec,pr_brand,pr_xsl_user,pr_hsl_user,pr_psl_user " +
- " from " + vwmsConfig.getDC_MASTER() + ".product where pr_id = " + id);
- if (!docMsg.next()) {
- // baseDao.execute("update " + master + ".product set pr_sendwmsstatus='同步失败',pr_sendwmserr='没有需要同步的商品。' where pr_id = " + id);
- retMap.put("success", false);
- retMap.put("message", "没有需要同步的商品。");
- return retMap;
- }
- StringBuffer errMsg = new StringBuffer();
- // 处理分组后的数据
- String sendflag = docMsg.getGeneralString("pr_sendwmsflag");
- logger.info("Flag: {}", sendflag);
- // 其他处理逻辑
- String actionType = "update";
- String actionTypeName = "更新";
- if ("0".equals(String.valueOf(sendflag))) {
- actionType = "add";
- actionTypeName = "创建";
- }
- //需要调用三次对接方法
- String[] masterList = new String[]{"YUEJH_TEST", "YJH_T", "YIT_T"};//YUEJH、AIFL、YJH_HK
- for (String m : masterList) {
- Map<String, Object> res = sendProdSigle(m, actionType, docMsg.getCurrentMap());
- if (!res.get("success").equals(true)) {
- if(StringUtil.hasText(res.get("message"))){
- if(errMsg.length()>0){
- errMsg.append("</br>");
- }
- errMsg.append(res.get("message"));
- }
- }
- }
- if (errMsg.length() > 0) {
- logger.info("sendProd-End-F:master {} id {} message {}", master, id,errMsg.toString());
- retMap.put("success", false);
- retMap.put("message", errMsg.toString());
- // baseDao.execute("update " + master + ".product set pr_sendwmsstatus='同步失败',pr_sendwmserr=('操作:" + actionTypeName + "</br>" + errMsg.toString().replaceAll("'", "''") + "') " +
- // " where pr_id = " + id);
- }else {
- logger.info("sendProd-End-S:master {} id {}", master, id);
- retMap.put("message", "同步成功。");
- // baseDao.execute("update " + master + ".product set pr_sendwmsflag=-1,pr_sendwmsstatus='同步成功' ,pr_sendwmserr=null where pr_id = " + id);
- }
- return retMap;
- }
- private Map<String, Object> sendProdSigle(String master, String actionType, Map<String, Object> map) {
- List<Object> docCodes = new ArrayList<>();
- StringBuffer errMsg = new StringBuffer();
- String eMsg = "";
- Map<String, Object> retMap = new HashMap<>();
- retMap.put("success", true);
- String ownerCode = master;
- String ownerName = "越加红";
- if ("YUEJH_TEST".equals(master)) {
- ownerCode = "YUEJH";
- }
- if ("YJH_T".equals(master)) {
- ownerCode = "AIFL";
- ownerName = "艾富利";
- }
- if ("YIT_T".equals(master)) {
- ownerCode = "YJH_HK";
- ownerName = "越加红香港";
- }
- if (map == null || !StringUtil.hasText(map.get("pr_code"))) {
- retMap.put("success", false);
- retMap.put("message", "账套:"+ownerName+"没有需要同步的商品。");
- return retMap;
- }
- String prCode = map.get("pr_code").toString();
- // 创建ProductReq对象
- docCodes.add(map.get("pr_code"));
- logger.info("sendProd-test: id {} code {} ownerCode {}", map.get("pr_id"), prCode,ownerCode);
- // 创建ProductReq对象
- ProductReq productReq = new ProductReq();
- productReq.setItemCode(prCode.toString());
- productReq.setItemName(StringUtil.nvl(map.get("pr_detail"), " "));
- productReq.setBrandName(StringUtil.nvl(map.get("pr_brand"), " "));
- productReq.setBoxQuantity(Long.valueOf(StringUtil.nvl(map.get("pr_xsl_user"), "0")));
- productReq.setSecondQuantity(Long.valueOf(StringUtil.nvl(map.get("pr_hsl_user"), "0")));
- productReq.setThirdQuantity(Long.valueOf(StringUtil.nvl(map.get("pr_psl_user"), "0")));
- productReq.setSkuProperty(StringUtil.nvl(map.get("pr_spec"), " "));
- // 创建BaseReq对象
- BaseItemReq<ProductReq> prodBaseItemReq = new BaseItemReq();
- prodBaseItemReq.setActionType(actionType);
- prodBaseItemReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
- prodBaseItemReq.setOwnerCode(ownerCode);
- prodBaseItemReq.setItem(productReq);
- try {
- // 创建XmlMapper实例
- XmlMapper xmlMapper = new XmlMapper();
- String xml = xmlMapper.writeValueAsString(prodBaseItemReq);
- logger.info("Request XML: {}", xml);
- HttpUtil.Response response = HttpUtil.postXmlToVWMS("singleitem.synchronize", xml, "UTF-8", vwmsConfig);
- // System.out.println("responseText:"+responseText);
- // 解析XML响应
- if (!String.valueOf(response.getStatusCode()).startsWith("2")) {
- eMsg = "请求失败:" + response.getStatusCode() + ":" +StringUtil.nvl(response.getResponseText(), "未知");
- } else {
- ProdResp prodResp = xmlMapper.readValue(response.getResponseText(), ProdResp.class);
- if (prodResp != null) {
- if ("success".equals(prodResp.getFlag())) {
- logger.info("response-success ownerCode {} prcode: {}", ownerCode,prodResp.getItemId());
- } else {
- logger.info("response-failure ownerCode {} code: {} message: {}", ownerCode,prodResp.getCode(), prodResp.getMessage());
- eMsg = StringUtil.nvl(prodResp.getMessage(), "无");
- }
- } else {
- eMsg="转换失败:" + response.getStatusCode() + ":" + response.getResponseText();
- }
- }
- //TODO 考虑记录日志
- } catch (Exception e) {
- e.printStackTrace();
- eMsg = StringUtil.nvl(e.getMessage(), "无");
- }
- if (StringUtil.hasText(eMsg)) {
- errMsg.append("账套:").append(ownerName).append(eMsg);
- }
- if (errMsg.length() > 0) {
- retMap.put("success", false);
- retMap.put("message", errMsg.toString());
- return retMap;
- }
- return retMap;
- }
- @Override
- public Map<String, Object> sendIO(String master, String id, String emCode, String caller) {
- Map<String, Object> retMap = new HashMap<>();
- retMap.put("success", true);
- logger.info("sendIO-Begin:master {} id {}", master, id);
- vwmsConfig.setEv(docCommonService.getMasterEv(master));
- // 执行查询
- if (!baseDao.checkIf(master + ".prodiodetail left join "+vwmsConfig.getDC_MASTER()+".product on pr_code = pd_prodcode "
- , "pd_piid = " + id + " and nvl(pr_sendwmsflag,0) = -1")) {
- logger.info("sendIO-End:master {} id {} res {}", master, id, "没有需要对接的明细。");
- retMap.put("success", false);
- retMap.put("message", "没有需要对接的明细。");
- return retMap;
- }
- ProdInout prodInOut = docCommonService.getIO(master, id,null);
- if (CollectionUtil.isEmpty(prodInOut.getDetails())) {
- retMap.put("success", false);
- retMap.put("message", "没有需要同步的明细。");
- return retMap;
- }
- if (prodInOut.getPiWmsstatus().equals("已确认")) {
- retMap.put("success", false);
- retMap.put("message", "单据已确认采集,不允许重复同步。");
- return retMap;
- }
- if (!StringUtil.hasText(prodInOut.getPiWmsInType())
- || (StringUtil.hasText(prodInOut.getPiWmsInType())
- && !prodInOut.getPiWmsInType().equals("in")
- && !prodInOut.getPiWmsInType().equals("out")
- && !prodInOut.getPiWmsInType().equals("transfer")
- )) {
- retMap.put("success", false);
- retMap.put("message", "WMS单据类型为空或异常,不允许同步。");
- return retMap;
- }
- //构建请求主体
- String masterName = prodInOut.getCurrentMaster();
- Long piId = prodInOut.getPiId();
- String errMsg = null;
- if ("in".equals(prodInOut.getPiWmsInType())) {
- errMsg = docCommonService.sendInToWms(prodInOut, masterName);
- }
- if ("out".equals(prodInOut.getPiWmsInType())||"transfer".equals(prodInOut.getPiWmsInType())) {
- errMsg = docCommonService.sendOutToWms(prodInOut, masterName);
- }
- if (errMsg != null) {
- if (errMsg.startsWith("OrderId:")) {
- retMap.put("OrderId", errMsg.replaceAll("OrderId:", ""));
- logger.info("sendIO-End-Sucess master {} piid {} OrderId {}", master, piId, errMsg.replaceAll("OrderId:", ""));
- //更新 WMSORDERID
- baseDao.execute("update " + master + ".prodiowms set WMSORDERID = '" + errMsg.replaceAll("OrderId:", "") + "' where PIID = " + piId);
- } else {
- errMsg = errMsg.replaceAll("'", "''");
- logger.info("sendIO-End-failure master {} piid {} errorTip {}", master, piId, errMsg);
- retMap.put("success", false);
- retMap.put("message", errMsg);
- }
- } else {
- logger.info("sendIO-End-success master {} piid {} ", master, piId);
- }
- return retMap;
- }
- @Override
- public Map<String, Object> cancelIO(ErpCancelIORequest erpCancelIORequest) {
- String master = erpCancelIORequest.getMaster();
- String emCode = erpCancelIORequest.getEmCode();
- String caller = erpCancelIORequest.getCaller();
- String formStore = erpCancelIORequest.getFormStore();
- String gridStore = erpCancelIORequest.getGridStore();
- Map<Object, Object> store = BaseUtil.parseFormStoreToMap(formStore);
- List<Map<Object, Object>> gstore = BaseUtil.parseGridStoreToMaps(gridStore);
- Object piId = store.get("pi_id");
- Map<String, Object> retMap = new HashMap<>();
- retMap.put("success", true);
- logger.info("cancelIO-Begin:master {} id {}", master, piId);
- vwmsConfig.setEv(docCommonService.getMasterEv(master));
- if(CollectionUtil.isEmpty(gstore)) {
- logger.info("cancelIO-End:master {} id {} res {}", master, piId, "没有需要对接的明细。");
- retMap.put("success", false);
- retMap.put("message", "没有需要对接的明细。");
- return retMap;
- }
- StringBuffer pdIds = new StringBuffer();
- for (Map<Object, Object> map : gstore) {
- if(pdIds.length()>0){
- pdIds.append(",");
- }
- if(StringUtil.hasText(map.get("pd_id"))){
- pdIds.append(map.get("pd_id"));
- }
- if(StringUtil.hasText(map.get("PD_ID"))){
- pdIds.append(map.get("PD_ID"));
- }
- }
- // 执行查询
- if (!baseDao.checkIf(master + ".prodiodetail left join " + vwmsConfig.getDC_MASTER() + ".product on pr_code = pd_prodcode "
- , "pd_id in (" + pdIds + ") and nvl(pr_sendwmsflag,0) = -1")) {
- logger.info("cancelIO-End:master {} id {} res {}", master, piId, "明细不需要对接WMS。");
- retMap.put("success", false);
- retMap.put("message", "明细不需要对接WMS。");
- return retMap;
- }
- ProdInout prodInOut = docCommonService.getIO(master, piId.toString(),pdIds.toString());
- if (prodInOut.getPiWmsstatus().equals("已确认")) {
- retMap.put("success", false);
- retMap.put("message", "单据已确认采集,不允许重复同步。");
- return retMap;
- }
- String ownerCode = master;
- if("YUEJH_TEST".equals(master)){
- ownerCode = "YUEJH";
- }
- if("YJH_T".equals(master)){
- ownerCode = "AIFL";
- }
- if("YIT_T".equals(master)){
- ownerCode = "YJH_HK";
- }
- String deliveryOrderCode = prodInOut.getPiInoutno();
- String warehouseCode = vwmsConfig.getWarehouseCode();
- List<Prodiodetail> prodiodetails = prodInOut.getDetails();
- CancelIORequest cancelIORequest = new CancelIORequest();
- CancelIORequest.CancelItems cancelItems = new CancelIORequest.CancelItems();
- List<CancelIORequest.CancelItem> cancelItemList = new ArrayList<>();
- for (Map<Object, Object> map : gstore) {
- Long pdId = 0L;
- Double qtyAfter = 0.0;
- if(StringUtil.hasText(map.get("pd_id"))){
- pdId = Long.valueOf(map.get("pd_id").toString());
- }
- if(StringUtil.hasText(map.get("PD_ID"))){
- pdId = Long.valueOf(map.get("PD_ID").toString());
- }
- if(StringUtil.hasText(map.get("pd_outqty"))){
- qtyAfter = Double.valueOf(map.get("pd_outqty").toString());
- }
- if(StringUtil.hasText(map.get("PD_OUTQTY"))){
- qtyAfter = Double.valueOf(map.get("PD_OUTQTY").toString());
- }
- if(pdId > 0){
- Long finalPdId = pdId;
- Prodiodetail detail = prodiodetails.stream()
- .filter(p -> finalPdId.equals(p.getPdId()))
- .findFirst()
- .orElse(null);
- if(detail != null) {
- Double qtyBefor = detail.getPdQty();
- Double cancelQty = NumberUtil.sub(qtyBefor,qtyAfter);
- if(cancelQty>0){
- CancelIORequest.CancelItem cancelItem = new CancelIORequest.CancelItem(warehouseCode,ownerCode,deliveryOrderCode);
- cancelItem.setOrderLineNo(String.valueOf(detail.getPdPdno()));
- cancelItem.setLogicWarehouseCode(detail.getPdWhcode());
- cancelItem.setItemCode(detail.getPdProdcode());
- cancelItem.setItemName(detail.getPdProdname());
- cancelItem.setCancelQty(cancelQty);
- cancelItemList.add(cancelItem);
- }
- }
- }
- }
- if(CollectionUtil.isEmpty(cancelItemList)){
- retMap.put("success", false);
- retMap.put("message", "无需要取消的明细。");
- return retMap;
- }
- cancelItems.setCancelItem(cancelItemList);
- cancelIORequest.setCancelItems(cancelItems);
- String xml = null;
- String method = "stockout.detailCancel";
- try {
- XmlMapper xmlMapper = new XmlMapper();
- xml = xmlMapper.writeValueAsString(cancelIORequest);
- // System.out.println("xml:"+xml);
- String errMsg = docCommonService.doPostToWms(xml,method);
- if (errMsg != null) {
- errMsg = errMsg.replaceAll("'", "''");
- logger.info("cancelIO-End-failure master {} pdIds {} errorTip {}", master, pdIds.toString(), errMsg);
- retMap.put("success", false);
- retMap.put("message", errMsg);
- return retMap;
- } else {
- logger.info("cancelIO-End-success master {} pdIds {} ", master, pdIds.toString());
- }
- } catch (JsonProcessingException e) {
- e.printStackTrace();
- retMap.put("success", false);
- retMap.put("message", "JSON转换失败。");
- return retMap;
- }
- retMap.put("message", "取消成功。");
- return retMap;
- }
- }
|