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.BaseDao; import com.uas.eis.dao.SqlRowList; 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.IOResp; 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.CollectionUtil; import com.uas.eis.utils.HttpUtil; import com.uas.eis.utils.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.stereotype.Service; import java.io.IOException; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * @author wuyx * @email wuyx@usoftchina.com * @date 2025-03-04 */ @Service public class DocCommonServiceImpl implements DocCommonService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private BaseDao baseDao; @Autowired private VwmsConfig vwmsConfig; @Autowired private ObjectMapper objectMapper; // 注入Jackson的ObjectMapper @Override public String getMasterEv(String master){ if(baseDao.checkIf("DATACENTER.master","ma_user = '"+master+"' and ma_function like '%测试%' ")){ return "test"; }else { return "prod"; } } @Override public ProdInout getIO(String master,String id,String pdIds){ // 查询主表信息 ProdInout prodInOut = queryMainTable(master, id); prodInOut.setOutBizCode(prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理 // 构建明细查询SQL String detSql = buildDetailSql(master, prodInOut,pdIds); // 查询明细数据 List details = queryDetails(master, detSql); prodInOut.setDetails(details); // 更新WMS相关表 if (!prodInOut.getPiWmsstatus().equals("已确认")) { updateWmsTables(master, prodInOut, detSql); } /*if("YUEJH_TEST".equals(master)){ prodInOut.setCurrentMaster("YUEJH"); } if("YJH_T".equals(master)){ prodInOut.setCurrentMaster("AIFL"); } if("YIT_T".equals(master)){ prodInOut.setCurrentMaster("YJH_HK"); }*/ /*if(StringUtil.hasText(prodInOut.getToMasterCode())){ if("YUEJH_TEST".equals(prodInOut.getToMasterCode())){ prodInOut.setToMasterCode("YUEJH"); } if("YJH_T".equals(prodInOut.getToMasterCode())){ prodInOut.setToMasterCode("AIFL"); } if("YIT_T".equals(prodInOut.getToMasterCode())){ prodInOut.setToMasterCode("YJH_HK"); } }*/ return prodInOut; } private ProdInout queryMainTable(String master, String id) { String sql = new StringBuilder() .append("select pi_Wmsordertype piOrderType,pi_id piId,pi_inoutno piInoutno,pi_class piClass,pi_type piType,") .append("to_char(pi_date,'yyyy-mm-dd hh24:mi:ss') piDate,pi_Cardcode piCardcode,pi_Title piTitle,") .append("pi_Recordman piRecordman,to_char(pi_recorddate,'yyyy-mm-dd hh24:mi:ss') piRecorddate,pi_Remark piRemark,") .append("abs(nvl(pi_sendwmsflag,0)) piSendwmsflag,nvl(pi_WmsInType,'in') piWmsInType,pi_wmsstatus piWmsstatus,") .append("pi_invostatuscode piInvoStatusCode,'"+master+"' currentMaster,pi_tomaster toMasterCode,pi_purposename piLxr,pi_expresscode piLxdh,pi_address piKhdz,pi_wbsk_user piWbsk ") .append("from ").append(master).append(".prodinout where pi_id = ").append(id) .toString(); List prodInOuts = baseDao.getJdbcTemplate().query(sql, new BeanPropertyRowMapper<>(ProdInout.class)); return prodInOuts.get(0); } private String buildDetailSql(String master, ProdInout prodInOut,String pdIds) { StringBuilder sqlBuilder = new StringBuilder(); if ("in".equals(prodInOut.getPiWmsInType())) { sqlBuilder.append("select pd_piid pdPiid,(pd_id) pdId,(pd_pdno) pdPdno,pd_prodcode pdProdcode,pr_detail pdProdname,pr_brand pdBrandName" + " ,(nvl(pd_inqty,0)+nvl(pd_outqty,0)) pdQty ,wh_code pdWhcode,wh_description pdWhname ") .append(" from ").append(master).append(".prodiodetail ").append(" left join ").append(master).append(".prodinout on pi_id = pd_piid ") .append(" left join ").append(vwmsConfig.getDC_MASTER()).append(".product on pr_code = pd_prodcode ") .append(" left join ").append(master).append(".warehouse on wh_Code = (case when pi_class='拨出单' and PI_TYPE='寄售退货' then pd_inwhcode else pd_whcode end) ") .append(" where pd_piid = "+prodInOut.getPiId()+" and nvl(pr_sendwmsflag,0) = -1 ") .append(" order by pd_pdno "); } else { if(prodInOut.getPiOrderType().equals("ZKCK")){//转库业务 sqlBuilder.append("select pd_piid pdPiid,(pd_id) pdId,(pd_pdno) pdPdno,pd_prodcode pdProdcode,") .append("pr_detail pdProdname,pr_brand pdBrandName,(nvl(pd_inqty,0)+nvl(pd_outqty,0)) pdQty,") .append("pd_whcode pdWhcode,wh_description pdWhname,tsd_inwhcode pdWhcodeTo,") .append("pd_custprodcode pdCustprodcode,pd_custproddetail pdCustProdDetail,pd_custprodspec pdCustProdSpec, pd_pocode pdPocode ,pd_ordercode pdOrderCode,pd_Remark pdRemark" + ",pd_sendprice pdSendPrice ") .append("from ").append(master).append(".prodiodetail ") .append(" left join ").append(master).append(".prodinout on pi_id = pd_piid ") .append(" left join ").append(vwmsConfig.getDC_MASTER()).append(".product on pr_code = pd_prodcode ") .append(" left join ").append(master).append(".warehouse on wh_Code = pd_whcode ") .append(" left join ").append(master).append(".saledetail on sd_Code = pd_ordercode and sd_Detno = pd_orderdetno ") .append(" left join ").append(master).append(".TRANSFERSTOCK ON PI_INOUTNO = TS_CODE ") .append(" left join ").append(master).append(".TRANSFERSTOCKDETAIL ON TS_ID=TSD_TSID AND PD_PDNO = TSD_DETNO ") .append("where pd_piid = ").append(prodInOut.getPiId()).append(" and nvl(pr_sendwmsflag,0) = -1"); if(StringUtil.hasText(pdIds)){ sqlBuilder.append(" and pd_id in (").append(pdIds).append(")"); } sqlBuilder.append(" order by pd_pdno "); }else { sqlBuilder.append("select pd_piid pdPiid,(pd_id) pdId,(pd_pdno) pdPdno,pd_prodcode pdProdcode,") .append("pr_detail pdProdname,pr_brand pdBrandName,(nvl(pd_inqty,0)+nvl(pd_outqty,0)) pdQty,") .append("pd_whcode pdWhcode,wh_description pdWhname,(case when pi_class='出货单' and pi_type='库存转移' then pd_whcode when pi_class='拨出单' then pd_inwhcode else null end) pdWhcodeTo,") .append("pd_custprodcode pdCustprodcode,pd_custproddetail pdCustProdDetail,pd_custprodspec pdCustProdSpec, pd_pocode pdPocode ,pd_ordercode pdOrderCode,pd_Remark pdRemark" + ",pd_sendprice pdSendPrice ") .append("from ").append(master).append(".prodiodetail ") .append(" left join ").append(master).append(".prodinout on pi_id = pd_piid ") .append(" left join ").append(vwmsConfig.getDC_MASTER()).append(".product on pr_code = pd_prodcode ") .append(" left join ").append(master).append(".warehouse on wh_Code = pd_whcode ") .append(" left join ").append(master).append(".saledetail on sd_Code = pd_ordercode and sd_Detno = pd_orderdetno ") .append("where pd_piid = ").append(prodInOut.getPiId()).append(" and nvl(pr_sendwmsflag,0) = -1"); if(StringUtil.hasText(pdIds)){ sqlBuilder.append(" and pd_id in (").append(pdIds).append(")"); } sqlBuilder.append(" order by pd_pdno "); } } return sqlBuilder.toString(); } private List queryDetails(String master, String sql) { return baseDao.getJdbcTemplate().query(sql, new BeanPropertyRowMapper<>(Prodiodetail.class)); } private void updateWmsTables(String master, ProdInout prodInOut, String detSql) { Long piId = prodInOut.getPiId(); // 删除旧数据 String deleteMainSql = "delete from " + master + ".prodiowms where PIID = " + piId; String deleteDetailSql = "delete from " + master + ".prodiowms_lines where pl_piid = " + piId; baseDao.execute(deleteMainSql); baseDao.execute(deleteDetailSql); // 插入主表数据 String sql = new StringBuilder() .append("INSERT INTO ").append(master).append(".prodiowms(ITIME,PIID, PIINOUTNO, ORDERCODE, OWNERCODE, WAREHOUSECODE, WMSORDERID, WMSORDERTYPE,OUTBIZCODE,TOOWNERCODE)") .append(" select sysdate,pi_id,pi_inoutno,pi_inoutno,'") .append(prodInOut.getCurrentMaster()).append("','") .append(vwmsConfig.getWarehouseCode()).append("',PI_WMSORDERCODE,PI_WMSORDERTYPE,'").append(prodInOut.getOutBizCode()).append("','"+StringUtil.nvl(prodInOut.getToMasterCode(),"")+"'") .append(" from ").append(master).append(".prodinout where pi_id = ").append(prodInOut.getPiId()) .toString(); baseDao.execute(sql); // 插入明细数据 PL_PIID, ITIME, UTIME, OUTBIZCODE, LOGICWAREHOUSECODE, INLOGICWAREHOUSECODE, LINENO, ITEMCODE, PLANQTY, ACTUALQTY if ("in".equals(prodInOut.getPiWmsInType())) { String insertDetailSql = new StringBuilder() .append("INSERT INTO ").append(master).append(".prodiowms_Lines(ITIME,PL_PIID,LOGICWAREHOUSECODE,LINENO, ITEMCODE, PLANQTY)") .append(" select sysdate,pdPiid,pdWhcode,pdPdno,pdProdcode,pdQty ") .append(" from (").append(detSql).append(")") .toString(); baseDao.execute(insertDetailSql); }else{ String insertDetailSql = new StringBuilder() .append("INSERT INTO ").append(master).append(".prodiowms_Lines(ITIME,PL_PIID,LOGICWAREHOUSECODE,LINENO, ITEMCODE, PLANQTY" + ",custItemCode,custItemName,custItemSkuProperty,custLotNumber,custPO,contractNo,retailPrice)") .append(" select sysdate,pdPiid,pdWhcode,pdPdno,pdProdcode,pdQty" + ",PDCUSTPRODCODE,PDCUSTPRODDETAIL, PDCUSTPRODSPEC, PDPOCODE, PDORDERCODE, PDREMARK, PDSENDPRICE " + " from (").append(detSql).append(")") .toString(); baseDao.execute(insertDetailSql); } } private List getOrderLines(ProdInout prodInOut,String masterName) { List orderLineList = new ArrayList<>(); String orderType = prodInOut.getPiOrderType(); for (Prodiodetail detail : prodInOut.getDetails()) { OrderLine orderLine; if (!"in".equals(prodInOut.getPiWmsInType())) { orderLine = new OrderLineOut(); // 创建普通订单行对象 ((OrderLineOut) orderLine).setRemark(detail.getPdRemark()); ((OrderLineOut) orderLine).setCustItemCode(detail.getPdCustProdCode()); ((OrderLineOut) orderLine).setCustItemName(detail.getPdCustProdDetail()); ((OrderLineOut) orderLine).setCustItemSkuProperty(detail.getPdCustProdSpec()); // ((OrderLineOut) orderLine).setCustLotNumber(); ((OrderLineOut) orderLine).setCustPO(detail.getPdPocode()); ((OrderLineOut) orderLine).setContractNo(detail.getPdOrderCode()); if("transfer".equals(prodInOut.getPiWmsInType())){ ((OrderLineOut) orderLine).setInLogicWarehouseCode(detail.getPdWhcodeTo()); } if("out".equals(prodInOut.getPiWmsInType())){ ((OrderLineOut) orderLine).setRetailPrice(detail.getPdSendPrice()); } }else { orderLine = new OrderLineIn(); } // 设置通用属性 orderLine.setOutBizCode(prodInOut.getOutBizCode()); orderLine.setLogicWarehouseCode(detail.getPdWhcode()); orderLine.setOrderLineNo(String.valueOf(detail.getPdPdno()));// 行号 orderLine.setOwnerCode(prodInOut.getCurrentMaster());// 货主编码 orderLine.setItemCode(detail.getPdProdcode());// 商品编码 orderLine.setItemName(detail.getPdProdname());// 商品名称 orderLine.setPlanQty(detail.getPdQty());// 数量 orderLineList.add(orderLine); } return orderLineList; } @Override public String sendOutToWms(ProdInout prodInOut, String masterName) { StockOutAndDetRequest stockOutAndDetRequest = new StockOutAndDetRequest(); DeliveryOrder deliveryOrder = new DeliveryOrder(); deliveryOrder.setDeliveryOrderCode(prodInOut.getPiInoutno());// 出库单号 deliveryOrder.setOrderType(prodInOut.getPiOrderType());// 订单类型 deliveryOrder.setWarehouseCode(vwmsConfig.getWarehouseCode());// 仓库编码 deliveryOrder.setOwnerCode(prodInOut.getCurrentMaster());// 货主编码 deliveryOrder.setCreateTime(StringUtil.nvl(prodInOut.getPiRecordDate(),prodInOut.getPiDate())); deliveryOrder.setExternalCollection(prodInOut.getPiWbsk()); //调拨业务 if(prodInOut.getPiWmsInType().equals("transfer")){ deliveryOrder.setInWarehouseCode(vwmsConfig.getWarehouseCode()); if(prodInOut.getPiOrderType().equals("ZKCK")){//转库业务 deliveryOrder.setInOwnerCode(prodInOut.getToMasterCode()); } } deliveryOrder.setScheduleDate(prodInOut.getPiDeliverytime()); deliveryOrder.setSupplierCode(prodInOut.getPiCardCode());// 客户编码 deliveryOrder.setSupplierName(prodInOut.getPiTitle());// 客户名称 deliveryOrder.setRemark(prodInOut.getPiRemark());// 备注 deliveryOrder.setDocumenter(prodInOut.getPiRecordman());// 制单人 //收货人信息 DeliveryOrder.ReceiverInfo receiverInfo = new DeliveryOrder.ReceiverInfo(); receiverInfo.setCode(prodInOut.getPiCardCode()); receiverInfo.setCompany(prodInOut.getPiTitle()); receiverInfo.setName(StringUtil.nvl(prodInOut.getPiLxr(),"无")); receiverInfo.setMobile(StringUtil.nvl(prodInOut.getPiLxdh(),prodInOut.getPiLxdh())); receiverInfo.setDetailAddress(StringUtil.nvl(prodInOut.getPiKhdz(),"无")); receiverInfo.setCustForshort(prodInOut.getCustShortName()); deliveryOrder.setReceiverInfo(receiverInfo); //写入明细表 List orderLineOuts = (List) getOrderLines(prodInOut, masterName); stockOutAndDetRequest.setDeliveryOrder(deliveryOrder); StockOutAndDetRequest.OutOrderLines orderLines = new StockOutAndDetRequest.OutOrderLines(); orderLines.setOrderLine(orderLineOuts); stockOutAndDetRequest.setOrderLines(orderLines); String xml = null; String method = "stockout.create"; try { XmlMapper xmlMapper = new XmlMapper(); xml = xmlMapper.writeValueAsString(stockOutAndDetRequest); } catch (JsonProcessingException e) { e.printStackTrace(); return "JSON转换失败"; } //TODO 写入表:WMS_IO_RECORD_SEQ return doPostToWms(xml,method); } @Override public String sendInToWms(ProdInout prodInOut,String masterName){ EntryOrder entryOrder = new EntryOrder(); entryOrder.setEntryOrderCode(prodInOut.getPiInoutno());// 入库单号 entryOrder.setOwnerCode(prodInOut.getCurrentMaster());// 货主编码 entryOrder.setWarehouseCode(vwmsConfig.getWarehouseCode());// 仓库编码 entryOrder.setOrderCreateTime(prodInOut.getPiRecordDate());// 订单创建时间 entryOrder.setOrderType(prodInOut.getPiOrderType());// 订单类型 entryOrder.setSupplierCode(prodInOut.getPiCardCode());// 供应商编码 entryOrder.setSupplierName(prodInOut.getPiTitle());// 供应商名称 entryOrder.setRemark(prodInOut.getPiRemark());// 备注 List orderList = (List) getOrderLines(prodInOut, masterName); EntryOrderAndDetRequest entryOrderAndDetRequest = new EntryOrderAndDetRequest(); EntryOrderAndDetRequest.InOrderLines orderLineIns = new EntryOrderAndDetRequest.InOrderLines(); orderLineIns.setOrderLine(orderList); entryOrderAndDetRequest.setEntryOrder(entryOrder); entryOrderAndDetRequest.setOrderLines(orderLineIns); //转换为JSON字符串 String xml = null; String method = "entryorder.create"; try { XmlMapper xmlMapper = new XmlMapper(); xml = xmlMapper.writeValueAsString(entryOrderAndDetRequest); } catch (JsonProcessingException e) { e.printStackTrace(); return "JSON转换失败"; } //TODO 写入表:WMS_IO_RECORD_SEQ return doPostToWms(xml,method); } @Override public String doPostToWms(String xml,String method){ String eMsg = null; try { logger.info("doPostToWms-{} XML: {}",method, xml); // HttpUtil.Response response = new HttpUtil.Response(); // response.setStatusCode(404); // response.setResponseText("单据已分配。"); HttpUtil.Response response = HttpUtil.postXmlToVWMS(method,xml, "UTF-8",vwmsConfig); if(!String.valueOf(response.getStatusCode()).startsWith("2")){ eMsg = "("+response.getStatusCode()+")"+StringUtil.nvl(response.getResponseText(),"未知").replaceAll("'","''"); }else { logger.info("doPostToWms-{} response: {}",method,response.getResponseText()); // 创建XmlMapper实例 XmlMapper xmlMapper = new XmlMapper(); IOResp ioResp = xmlMapper.readValue(response.getResponseText(), IOResp.class); if(ioResp!=null){ if("success".equals(ioResp.getFlag())){ String orderId = ""; if("entryorder.create".equals(method)){ orderId = ioResp.getEntryOrderId(); eMsg = "OrderId:"+orderId; } if("stockout.create".equals(method)){ orderId = ioResp.getDeliveryOrderId(); eMsg = "OrderId:"+orderId; } // if("openapi.adjustmentorder.create".equals(method)){ // orderId = baseVastRespResponse.getAdjustmentOrderId(); // eMsg = "OrderId:"+orderId; // } logger.info("doSendInOrderToWms-resp-s code: {} method {} OrderId {} message: {}", ioResp.getCode(),method,orderId,ioResp.getMessage()); }else { eMsg = "(" + ioResp.getCode() + ")"; String errorMessage = ioResp.getMessage(); eMsg += StringUtil.nvl(errorMessage, "未知").replaceAll("'", "''"); } }else { eMsg = "Resp XML转换失败:"+response.getStatusCode()+":"+response.getResponseText(); } } } catch (IOException e) { e.printStackTrace(); eMsg = "xmL转换失败"; } catch (Exception e) { e.printStackTrace(); eMsg = StringUtil.nvl(e.getMessage(),"无").replaceAll("'","''"); } return eMsg; } }