package com.uas.eis.entity.vwms.req; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import com.uas.eis.utils.StringUtil; import lombok.Data; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.ArrayList; import java.util.List; @Data @JacksonXmlRootElement(localName = "request") @JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知字段 public class OUTConfirm { @JacksonXmlProperty(localName = "deliveryOrder") private DeliveryOrder deliveryOrder; @JacksonXmlProperty(localName = "orderLines") private OrderLines orderLines; @Data @JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知字段 public static class DeliveryOrder { /** 出库单号 长度:50 */ private String deliveryOrderCode; /** 仓储系统出库单号 长度:50 条件必填 */ private String deliveryOrderId; private String warehouseCode; // 出库仓库编码(物理仓) private String inWarehouseCode; // 调入仓库编码(物理仓) 条件必填,调拨出库业务类型该字段必填 /** 货主代码 长度:50 */ private String ownerCode; private String ownerName; private String inOwnerCode; // 目标货主编码 转库目标账套编码 /** 客户编码 长度:50 */ private String transceiverCode; private String transceiverName; /** 出库单类型 长度:50 例如: YPCK=样品出库、DHCK=大货出库、CGTH=退货出库、DBCK=调拨出库、QTCK=其他出库、LYCK=领用出库、JSCK=寄售出库 */ private String orderType; /** 出库单状态 长度:50 NEW-未开始处理, ACCEPT-仓库接单, PARTDELIVERED-部分发货完成, DELIVERED-发货完成, EXCEPTION-异常, CANCELED-取消, CLOSED-关闭, REJECT-拒单, CANCELEDFAIL-取消失败,只传英文编码*/ private String status; /** 支持出库单多次发货 多次发货确认时 0=发货单最终状态确认: 1=发货单中间状态确认 */ private Integer confirmType; /** 物流公司编码 长度:50 SF=顺丰、EMS=标准快递、EYB=经济快件、ZJS=宅急送、YTO=圆通 、ZTO=中通 (ZTO) 、HTKY=百世汇通、BSKY=百世快运、UC=优速、STO=申通、TTKDEX=天天快递 、QFKD=全峰、FAST=快捷、POSTB=邮政小包 、GTO=国通、YUNDA=韵达、JD=京东配送、DD=当当宅配、AMAZON=亚马逊物流、DBWL=德邦物流、DBKD=德邦快递、DBKY=德邦快运、RRS=日日顺、OTHER=其他 ,(只传英文编码) 如果没有购买OMS系统请不要传OTHER,可以传其他自定义的 */ private String logisticsCode; /*物流公司名称(包括干线物流公司等)*/ private String logisticsName; /** 运单号 长度:50 */ private String expressCode; /** 订单完成时间 长度:19 YYYY-MM-DD HH:MM:SS */ private String orderConfirmTime; private String operateTime;//当前状态操作时间, string (19) , YYYY-MM-DD HH:MM:SS /*当前状态操作员姓名, string (50)*/ private String operatorName; } @Data @JsonIgnoreProperties(ignoreUnknown = true) public static class OrderLines { @JacksonXmlElementWrapper(useWrapping = false) // 去掉外层的包装 @JacksonXmlProperty(localName = "orderLine") private List orderLine; @Data @JsonIgnoreProperties(ignoreUnknown = true) public static class OrderLine { /** 外部业务编码 长度:50 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理 */ private String outBizCode; /** 行号 */ private Integer orderLineNo; /** 货品代码 长度:50 */ private String itemCode; private String itemId; private String itemName; /** 预期货品数量 类型:float */ private Float planQty; /** 实发货品数量 类型:float */ private Float actualQty; private String ownerCode; private String logicWarehouseCode; private String inLogicWarehouseCode; } } public String getMasterCode() { if(StringUtil.hasText(deliveryOrder.getOwnerCode())){ return deliveryOrder.getOwnerCode(); } else { if(orderLines != null && orderLines.getOrderLine() != null && orderLines.getOrderLine().size() > 0){ return orderLines.getOrderLine().get(0).getOwnerCode(); } } return null; } public String getGenerateMainSql() { StringBuilder sql = new StringBuilder("MERGE INTO @MASTERCODE.prodiowms wmsl USING (") .append("SELECT ") .append("@PIID").append(" PIID, ") .append("'").append("@INOUTNO").append("' PIINOUTNO, ") .append("'").append(StringUtil.nvl(deliveryOrder.getDeliveryOrderCode(), "")).append("' ORDERCODE, ") .append("'").append(StringUtil.nvl(deliveryOrder.getOwnerCode(), "")).append("' OWNERCODE, ") .append("'").append(StringUtil.nvl(deliveryOrder.getInOwnerCode(), "")).append("' inOwnerCode, ") .append("'").append(StringUtil.nvl(deliveryOrder.getWarehouseCode(), "")).append("' WAREHOUSECODE, ") .append("'").append(StringUtil.nvl(deliveryOrder.getInWarehouseCode(), "")).append("' inWarehouseCode, ") .append("'").append(StringUtil.nvl(deliveryOrder.getDeliveryOrderId(), "")).append("' WMSORDERID, ") .append("'").append(StringUtil.nvl(deliveryOrder.getOrderType(), "")).append("' WMSORDERTYPE, ") .append(StringUtil.nvl(deliveryOrder.getConfirmType(), "0")).append(" CONFIRMTYPE, ") .append("'").append(StringUtil.nvl(deliveryOrder.getStatus(), "")).append("' STATUS, ") .append("'").append(StringUtil.nvl(deliveryOrder.getLogisticsCode(), "")).append("' logisticsCode, ") .append("'").append(StringUtil.nvl(deliveryOrder.getLogisticsName(), "")).append("' logisticsName, ") .append("'").append(StringUtil.nvl(deliveryOrder.getExpressCode(), "")).append("' expressCode, ") .append((StringUtil.hasText(deliveryOrder.getOrderConfirmTime()) ? "to_date('" + deliveryOrder.getOrderConfirmTime() + "','yyyy-mm-dd hh24:mi:ss')" : "null")).append(" orderConfirmTime, ") .append((StringUtil.hasText(deliveryOrder.getOperateTime()) ? "to_date('" + deliveryOrder.getOperateTime() + "','yyyy-mm-dd hh24:mi:ss')" : "null")).append(" operateTime, ") .append("'").append(StringUtil.nvl(deliveryOrder.getOperatorName(), "")).append("' operatorName ") .append("FROM dual) doc ON (wmsl.PIID = doc.PIID AND wmsl.PIINOUTNO = doc.PIINOUTNO) ") .append("WHEN MATCHED THEN UPDATE SET ") .append("wmsl.ORDERCODE = doc.ORDERCODE, ") // .append("wmsl.OWNERCODE = doc.OWNERCODE, ") // .append("wmsl.inOwnerCode = doc.inOwnerCode, ") // .append("wmsl.WAREHOUSECODE = doc.WAREHOUSECODE, ") // .append("wmsl.inWarehouseCode = doc.inWarehouseCode, ") // .append("wmsl.WMSORDERID = doc.WMSORDERID, ") // .append("wmsl.WMSORDERTYPE = doc.WMSORDERTYPE, ") .append("wmsl.OUTBIZCODE = doc.OUTBIZCODE, ") .append("wmsl.CONFIRMTYPE = doc.CONFIRMTYPE, ") .append("wmsl.STATUS = doc.STATUS, ") .append("wmsl.logisticsCode = doc.logisticsCode, ") .append("wmsl.logisticsName = doc.logisticsName, ") .append("wmsl.expressCode = doc.expressCode, ") .append("wmsl.ORDERFINISHEDTIME = doc.orderConfirmTime, ") .append("wmsl.operateTime = doc.operateTime, ") .append("wmsl.operatorName = doc.operatorName, ") .append("wmsl.UTIME = SYSDATE ") .append("WHEN NOT MATCHED THEN INSERT (ITIME,PIID, PIINOUTNO, ORDERCODE, OWNERCODE,TOOWNERCODE, WAREHOUSECODE,INWAREHOUSECODE, WMSORDERID, WMSORDERTYPE, OUTBIZCODE, CONFIRMTYPE, STATUS" + ", ORDERFINISHEDTIME, operatorName, OPERATETIME,logisticsCode,logisticsName,expressCode) ") .append("VALUES (SYSDATE,doc.PIID, doc.PIINOUTNO, doc.ORDERCODE, doc.OWNERCODE,doc.inOwnerCode,doc.WAREHOUSECODE,doc.inWarehouseCode,doc.WMSORDERID,doc.OUTBIZCODE,doc.CONFIRMTYPE,doc.STATUS" + " ,doc.orderConfirmTime,doc.operatorName,doc.operateTime,doc.logisticsCode,doc.logisticsName,doc.expressCode" + ")"); return sql.toString(); } public List getGenerateLinesSql() { List sqls = new ArrayList<>(); sqls.add("UPDATE @MASTERCODE.prodiowms_Lines SET ACTUALQTY=0 WHERE PL_PIID = @PIID"); for (OUTConfirm.OrderLines.OrderLine line : orderLines.getOrderLine()) { sqls.add(getGenerateLinesSql(line)); } return sqls; } public String getGenerateLinesSql(OUTConfirm.OrderLines.OrderLine line) { StringBuilder sql = new StringBuilder(); sql.append("MERGE INTO ").append("@MASTERCODE").append(".prodiowms_Lines wmsl USING (") .append("SELECT ") .append("@PIID").append(" PIID, ") .append("'").append(line.getOutBizCode()).append("' OUTBIZCODE, ") .append(line.getOrderLineNo()).append(" LINENO, ") .append("'").append(line.getItemCode()).append("' ITEMCODE, ") .append("'").append(StringUtil.nvl(line.getPlanQty(), "")).append("' PLANQTY, ") .append(StringUtil.nvl(line.getActualQty(), "0")).append(" ACTUALQTY, ") .append("FROM dual) doc ON (wmsl.PL_PIID = doc.PIID AND wmsl.LINENO = doc.LINENO) ") .append("WHEN MATCHED THEN UPDATE SET ") .append("wmsl.OUTBIZCODE = doc.OUTBIZCODE, ") .append("wmsl.ACTUALQTY = NVL(msl.ACTUALQTY,0)+doc.ACTUALQTY, ") .append("wmsl.UTIME = SYSDATE ") .append("WHEN NOT MATCHED THEN INSERT (PL_PIID,OUTBIZCODE,LINENO, ITEMCODE, PLANQTY,ACTUALQTY) ") .append("VALUES (doc.PIID,doc.OUTBIZCODE, doc.LINENO, doc.ITEMCODE, doc.PLANQTY, doc.ACTUALQTY)"); return sql.toString(); } }