| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- 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 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<Prodiodetail> 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 ")
- .append("from ").append(master).append(".prodinout where pi_id = ").append(id)
- .toString();
- List<ProdInout> 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(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,nvl(sd_purcprice,0) standardPrice ")
- .append("from ").append(master).append(".prodiodetail ")
- .append(" left join ").append(master).append(".prodinout on pi_id = pd_piid ")
- .append(" left join ").append(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,nvl(sd_purcprice,0) standardPrice ")
- .append("from ").append(master).append(".prodiodetail ")
- .append(" left join ").append(master).append(".prodinout on pi_id = pd_piid ")
- .append(" left join ").append(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<Prodiodetail> 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,actualPrice)")
- .append(" select sysdate,pdPiid,pdWhcode,pdPdno,pdProdcode,pdQty" +
- ",PDCUSTPRODCODE,PDCUSTPRODDETAIL, PDCUSTPRODSPEC, PDPOCODE, PDORDERCODE, PDREMARK, PDSENDPRICE, STANDARDPRICE " +
- " from (").append(detSql).append(")")
- .toString();
- baseDao.execute(insertDetailSql);
- }
- }
- private List<? extends OrderLine> getOrderLines(ProdInout prodInOut,String masterName) {
- List<OrderLine> 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.getStandardPrice());
- ((OrderLineOut) orderLine).setActualPrice(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()));
- //调拨业务
- 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<OrderLineOut> orderLineOuts = (List<OrderLineOut>) 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<OrderLineIn> orderList = (List<OrderLineIn>) 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 method:{} 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 method:{} response: {}",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;
- }
- }
|