Prechádzať zdrojové kódy

【集团EDI-新思&歌尔】【新思-860(采购变更单)】

DINGYL 3 mesiacov pred
rodič
commit
2bab4e9afc

+ 2 - 0
src/main/java/com/uas/eis/config/SynaConfig.java

@@ -13,4 +13,6 @@ public class SynaConfig {
     private String url_850;
     private String url_860;
     private String url_867;
+    private String bill_to_address;
+    private String BTEDILocationCode;
 }

+ 160 - 42
src/main/java/com/uas/eis/core/X12Converter.java

@@ -1,7 +1,10 @@
 package com.uas.eis.core;
 
+import com.uas.eis.config.SynaConfig;
 import com.uas.eis.dao.BaseDao;
 import com.uas.eis.entity.Purchase;
+import com.uas.eis.entity.PurchaseChange;
+import com.uas.eis.entity.PurchaseChangeDetail;
 import com.uas.eis.entity.PurchaseDetail;
 import io.xlate.edi.schema.EDISchemaException;
 import io.xlate.edi.schema.Schema;
@@ -10,6 +13,7 @@ import io.xlate.edi.stream.EDIOutputFactory;
 import io.xlate.edi.stream.EDIStreamConstants;
 import io.xlate.edi.stream.EDIStreamException;
 import io.xlate.edi.stream.EDIStreamWriter;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
@@ -18,28 +22,57 @@ import java.util.Date;
 
 public class X12Converter {
     private BaseDao baseDao;
-    public String convertToX12(Purchase po,String ediId) throws EDISchemaException, EDIStreamException {
+
+    private SynaConfig synaConfig;
+
+    static final String X12_VERSION = "00401";
+
+    private EDIStreamWriter newEDIWriter(OutputStream stream) throws EDISchemaException {
         EDIOutputFactory factory = EDIOutputFactory.newFactory();
-        OutputStream stream=new ByteArrayOutputStream();
         SchemaFactory schemaFactory = SchemaFactory.newFactory();
-        Schema controlSchema = schemaFactory.getControlSchema(EDIStreamConstants.Standards.X12, new String[] { "00401" });
+        Schema controlSchema = schemaFactory.getControlSchema(EDIStreamConstants.Standards.X12, new String[] { X12_VERSION });
         EDIStreamWriter writer = factory.createEDIStreamWriter(stream);
-
         writer.setControlSchema(controlSchema);
+        return  writer;
+    }
+    private void startSegment(EDIStreamWriter writer,String ediId) throws EDIStreamException {
+        writer.writeStartSegment("ISA")
+                .writeElement("00")
+                .writeElement("          ")
+                .writeElement("00")
+                .writeElement("          ")
+                .writeElement("ZZ")
+                .writeElement("WORLDSHINE     ")
+                .writeElement("ZZ")
+                .writeElement("SYNAPTICST     ")
+                .writeElement(new SimpleDateFormat("yyMMdd").format(new Date())) // GS04 (日期)
+                .writeElement(new SimpleDateFormat("HHmm").format(new Date()))     // GS05 (时间)
+                .writeElement("U")
+                .writeElement(X12_VERSION)
+                .writeElement(ediId)
+                .writeElement("0")
+                .writeElement("T")//T,表示测试数据;P,表示生产数据,这里是T
+                .writeElement("^")
+                .writeEndSegment();
+    }
+
+    public String convertToX12(Purchase po,String ediId) throws EDISchemaException, EDIStreamException {
+        OutputStream stream=new ByteArrayOutputStream();
+        EDIStreamWriter writer = newEDIWriter(stream);
+        //开始
         writer.startInterchange();
+
         startSegment(writer,ediId);
-        writer.writeStartSegment("GS");
-        System.out.println("日期:"+new SimpleDateFormat("yyyyMMdd").format(new Date()));
-        System.out.println("时间:"+new SimpleDateFormat("HHmm").format(new Date()));
-        writer.writeElement("PO")
+        //PO
+        writer.writeStartSegment("GS").writeElement("PO")
                 .writeElement("WORLDSHINE") // GS02
                 .writeElement("SYNAPTICSD") // GS03
                 .writeElement(new SimpleDateFormat("yyyyMMdd").format(new Date())) // GS04 (日期)
                 .writeElement(new SimpleDateFormat("HHmm").format(new Date()))     // GS05 (时间)
                 .writeElement(String.valueOf(po.getPu_id()))        // GS06
-                .writeElement("T")        // GS07
-                .writeElement("004010")
-                .writeEndSegment();;  // GS08
+                .writeElement("T")        // T-运输数据协调委员会(TDCC),X-公认标准委员会
+                .writeElement("004010")//X12版本
+                .writeEndSegment();  // GS08
         int txCount = 1;
         writer.writeStartSegment("ST").writeElement("850").writeElement("4221").writeEndSegment(); // 事务集控制编号
         txCount++;        // 开始采购订单 (BEG)
@@ -49,12 +82,12 @@ public class X12Converter {
                 .writeElement("DS") // 采购订单类型
                 .writeElement(po.getPu_code()) // 采购订单编号
                 .writeElement("") // 释放编号
-                .writeElement(new SimpleDateFormat("yyyyMMdd").format(po.getPu_date())).writeEndSegment();; // 日期
+                .writeElement(new SimpleDateFormat("yyyyMMdd").format(po.getPu_date())).writeEndSegment(); // 日期
         txCount++;
 
         writer.writeStartSegment("CUR")
                 .writeElement("SE")
-                .writeElement(po.getPu_currency()).writeEndSegment();; // 日期
+                .writeElement(po.getPu_currency()).writeEndSegment();
         txCount++;
 
         writer.writeStartSegment("N1")
@@ -66,21 +99,18 @@ public class X12Converter {
 
         writer.writeStartSegment("N1")
                 .writeElement("BT")
-                .writeElement("香港新界沙田小沥源安平街8号伟达中心902室")
+                .writeElement(synaConfig.getBill_to_address())//收票地址
                 .writeElement("92")
-                .writeElement("WTECH-67908").writeEndSegment();
+                .writeElement(synaConfig.getBTEDILocationCode()).writeEndSegment();
         txCount++;
 
         writer.writeStartSegment("REF")
                 .writeElement("SA")
                 .writeElement(po.getPu_isr()) .writeEndSegment();
         txCount++;
-        // 采购订单行项
-        int groupCount=0;
         for(PurchaseDetail pd:po.getItems()){
-            groupCount++;
             writer.writeStartSegment("PO1")
-                    .writeElement(String.valueOf(groupCount)) // 分配编号
+                    .writeElement(String.valueOf(pd.getPd_detno())) // 分配编号
                     .writeElement(String.valueOf(pd.getPd_qty())) // 数量
                     .writeElement("EA") // 单位
                     .writeElement(String.valueOf(pd.getPd_price())) // 单价
@@ -88,11 +118,16 @@ public class X12Converter {
                     .writeElement("VP") // 产品ID限定符
                     .writeElement(pd.getPr_orispeccode()) // 供应商零件编号
                     .writeElement("BP")
-                    .writeElement(pd.getPd_prodcode()).writeEndSegment();; // 产品描述
+                    .writeElement(pd.getPd_prodcode()).writeEndSegment();
             txCount++;
             writer.writeStartSegment("REF")
                     .writeElement("PR")
-                    .writeElement(pd.getPd_quote()) .writeEndSegment();; // 产品描述
+                    .writeElement(pd.getPd_quote()).writeEndSegment();
+            txCount++;
+            writer.writeStartSegment("FOB")
+                    .writeElement("DF")
+                    .writeElement("ZZ")
+                    .writeElement(po.getPu_article()).writeEndSegment();// Shipping Instruction
             txCount++;
             writer.writeStartSegment("SCH")
                     .writeElement(String.valueOf(pd.getPd_qty()))
@@ -105,7 +140,7 @@ public class X12Converter {
         }
         // 订单小计 (CTT)
         writer.writeStartSegment("CTT")
-                .writeElement(String.valueOf(groupCount)).writeEndSegment();// 明细行数
+                .writeElement(String.valueOf(po.getItems().size())).writeEndSegment();// 明细行数
         txCount++;
         // 结束事务集 (SE) - 需要手动计算段数量
         writer.writeStartSegment("SE")
@@ -123,27 +158,110 @@ public class X12Converter {
         writer.close();
         return stream.toString();
     }
-    private void startSegment(EDIStreamWriter writer,String ediId) throws EDIStreamException {
-        writer.writeStartSegment("ISA")
-                .writeElement("00")
-                .writeElement("          ")
-                .writeElement("00")
-                .writeElement("          ")
-                .writeElement("ZZ")
-                .writeElement("WORLDSHINE     ")
-                .writeElement("ZZ")
-                .writeElement("SYNAPTICST     ")
-                .writeElement(new SimpleDateFormat("yyMMdd").format(new Date())) // GS04 (日期)
+
+    public String convertToX12(PurchaseChange pc, String ediId) throws EDISchemaException, EDIStreamException {
+        OutputStream stream=new ByteArrayOutputStream();
+        EDIStreamWriter writer = newEDIWriter(stream);
+
+        writer.startInterchange();
+        startSegment(writer,ediId);
+
+        writer.writeStartSegment("GS").writeElement("PC")
+                .writeElement("WORLDSHINE") // GS02
+                .writeElement("SYNAPTICSD") // GS03
+                .writeElement(new SimpleDateFormat("yyyyMMdd").format(new Date())) // GS04 (日期)
                 .writeElement(new SimpleDateFormat("HHmm").format(new Date()))     // GS05 (时间)
-                .writeElement("U")
-                .writeElement("00501")
-                .writeElement(ediId)
-                .writeElement("0")
-                .writeElement("T")//T,表示测试数据;P,表示生产数据,这里是T
-                .writeElement("^")
-                .writeEndSegment();
-    }
-    public void convertToX12() throws EDISchemaException, EDIStreamException {
+                .writeElement(String.valueOf(pc.getPc_id()))        // String.valueOf(po.getPu_id())
+                .writeElement("X")        // T-运输数据协调委员会(TDCC),X-公认标准委员会
+                .writeElement("004010")//X12版本
+                .writeEndSegment();  // GS08
+        int txCount = 1;
+        writer.writeStartSegment("ST").writeElement("860").writeElement("0001").writeEndSegment(); // 事务集控制编号
+        txCount++;
+        writer.writeStartSegment("BCH")
+                .writeElement("04") // 变更
+                .writeElement("CP") // Change to Purchase Order
+                .writeElement(pc.getPu_code()) // 采购订单编号
+                .writeElement("") // 释放编号
+                .writeElement("") // 释放编号
+                .writeElement(new SimpleDateFormat("yyyyMMdd").format(pc.getPu_date())).writeEndSegment();
+        txCount++;
+
+        writer.writeStartSegment("N1")
+                .writeElement("ST")
+                .writeElement(pc.getPu_shipaddresscode())
+                .writeElement("92")
+                .writeElement(pc.getPc_deliveryparty()).writeEndSegment();
+        txCount++;
+
+        writer.writeStartSegment("N1")
+                .writeElement("BT")
+                .writeElement(synaConfig.getBill_to_address())
+                .writeElement("92")
+                .writeElement(synaConfig.getBTEDILocationCode()).writeEndSegment();
+        txCount++;
+
+        writer.writeStartSegment("REF")
+                .writeElement("SA")
+                .writeElement(pc.getPc_isr()) .writeEndSegment();
+        txCount++;
+        for(PurchaseChangeDetail pcd:pc.getItems()){
+            writer.writeStartSegment("POC")
+                    .writeElement(pcd.getPcd_so())//新思单号 香港华商龙做变更单时填写
+                    /*Code specifying the type of change to the line item 变更类型
+                    RS  交期变更
+                    PC  Price Change
+                    QD  Quantity Decrease 数量调增
+                    QI  Quantity Increase 数量调减
+
+                    PQ  Unit Price/Quantity Change  价格+数量
+                    PR  Unit Price/Reschedule Change 价格+交期
+                    RQ  Reschedule/Quantity Change   交期+数量
 
+                    MU  (Multiple) For Unit Price Quantity Reschedule Change 价格+数量+交期
+                    * */
+                    .writeElement(pcd.getChangetype())
+                    .writeElement(String.valueOf(pcd.getPcd_newqty()))//数量
+                    .writeElement(String.valueOf(pcd.getPd_leftqty()))//Quantity Left to Receive 剩余数量
+                    .writeElement("EA")
+                    .writeElement(String.valueOf(pcd.getPcd_newprice())) // 单价
+                    .writeElement("VP")
+                    .writeElement(pcd.getPr_orispeccode())
+                    .writeElement("BP")
+                    .writeElement(pcd.getPcd_newprodcode()).writeEndSegment();
+            txCount++;
+            writer.writeStartSegment("REF")
+                    .writeElement("PR")
+                    .writeElement(pcd.getQuote()).writeEndSegment();
+            txCount++;
+            writer.writeStartSegment("SCH")
+                    .writeElement(String.valueOf(pcd.getPcd_newqty()))//数量
+                    .writeElement("EA")
+                    .writeElement("")//SCH03
+                    .writeElement("")//SCH04
+                    /*SCH05 Date/Time Qualifier
+                    * */
+                    .writeElement("002")//Delivery Requested
+                    .writeElement(new SimpleDateFormat("yyyyMMdd").format(pcd.getPcd_newdelivery())).writeEndSegment();//交期
+            txCount++;
+        }
+        // 订单小计 (CTT)
+        writer.writeStartSegment("CTT")
+                .writeElement(String.valueOf(pc.getItems().size())).writeEndSegment();// 明细行数
+        txCount++;
+        // 结束事务集 (SE) - 需要手动计算段数量
+        writer.writeStartSegment("SE")
+                .writeElement(String.valueOf(txCount)) // 段数量 (ST到SE之间的段数,包括ST和SE)
+                .writeElement("301").writeEndSegment(); // 事务集控制编号 (与ST中的一致)
+
+        writer.writeStartSegment("GE")
+                .writeElement("1")
+                .writeElement(String.valueOf(pc.getPc_id())) .writeEndSegment();
+        writer.writeStartSegment("IEA")
+                .writeElement("1")
+                .writeElement(ediId) .writeEndSegment();
+        writer.endInterchange();
+        writer.close();
+        return stream.toString();
     }
 }

+ 0 - 19
src/main/java/com/uas/eis/dao/FindOrderStateData.java

@@ -1,19 +0,0 @@
-package com.uas.eis.dao;
-
-public class FindOrderStateData{
-    private String invoiceStatus;//订单状态(0:待处理 1:处理中 2:已处理 4:提交失败 6:部分待处理 7:无需开票)
-    private String errorMsg;//提交失败原因
-    public void setInvoiceStatus(String invoiceStatus) {
-        this.invoiceStatus = invoiceStatus;
-    }
-    public String getInvoiceStatus() {
-        return invoiceStatus;
-    }
-
-    public void setErrorMsg(String errorMsg) {
-        this.errorMsg = errorMsg;
-    }
-    public String getErrorMsg() {
-        return errorMsg;
-    }
-}

+ 0 - 13
src/main/java/com/uas/eis/dao/FindOrderStateResp.java

@@ -1,13 +0,0 @@
-package com.uas.eis.dao;
-
-public class FindOrderStateResp extends BaseResp {
-    private FindOrderStateData data;
-
-    public FindOrderStateData getData() {
-        return data;
-    }
-
-    public void setData(FindOrderStateData data) {
-        this.data = data;
-    }
-}

+ 0 - 12
src/main/java/com/uas/eis/dao/InvoiceGoodsTransportsDTO.java

@@ -1,12 +0,0 @@
-package com.uas.eis.dao;
-
-import lombok.Data;
-
-@Data
-public class InvoiceGoodsTransportsDTO {
-    String transportTool;//	运输工具种类:1 铁路运输、2 公路运输、3 水路运输、4 航空运输、5 管道运输、6 其他运输工具
-    String transportToolNum;//运输工具牌号
-    String origin;//起运地
-    String destination;//到达地
-    String goodsName;//运输货物名称
-}

+ 0 - 16
src/main/java/com/uas/eis/dao/InvoiceOrderDTO.java

@@ -1,16 +0,0 @@
-package com.uas.eis.dao;
-
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class InvoiceOrderDTO {
-    String orderType;//订单类型:1销售单,2退货单 不能为空
-    String autoInvoiceFlag;//是否自动开票(false:订单只入库; true:订单入库后自动完成开票全流程 ;只能传false或true,不传默认false)
-    String repeatCall;//订单号重复时的处理方式(0:报错 1:覆盖原订单,仅订单状态为待处理时可以覆盖;不传默认0)
-    OrderDTO orderInfo;//订单基础信息
-    List<OrderDetDTO> orderOriginalDetails;//商品列表
-    List<InvoiceGoodsTransportsDTO> invoiceGoodsTransports;//货物运输信息列表,specificFactor为4且为销售单时,以下字段必传
-
-}

+ 0 - 48
src/main/java/com/uas/eis/dao/OrderDTO.java

@@ -1,48 +0,0 @@
-package com.uas.eis.dao;
-
-import lombok.Data;
-
-@Data
-public class OrderDTO {
-    String originalOrderNo;//订单编号:支持字母、数字、英文符号 不能为空
-    String addDate;//下单时间(年月日时分秒 格式yyyy-MM-dd HH:mm:ss)若无下单时间自动添加当前时间
-    String invoiceLine;//发票种类(只能传 p:普通发票(电票) c:普通发票(纸票) s:专用发票(纸票) b:专用发票(电子) e:收购发票(电票) f:收购发票(纸质) r:普通发票(卷式) bs:数电专票(电子) pc:数电普票(电子) es:数电专票(纸质) ec:数电普票(纸质)中的 一种)
-    String specificFactor;//0普通发票(默认)、1 成品油、4 货物运输、35 矿产品
-    String saleTaxNum;//销方税号(字母+数字 6-20字符),与companyCode不能同时为空
-    String saleAddress;//销方地址,不传时去开票默认取系统内开票信息中配置的
-    String salePhone;//销方电话,不传时去开票默认取系统内开票信息中配置的
-    String saleAccount;//销方开户行及账号,不传时去开票默认取系统内开票信息中配置的
-    String buyerName;//客户名称
-    String naturalPersonFlag;//购买方(客户)自然人标记,1是、0否,为空默认0,仅票种为pc时支持传入
-    String taxNum;//购方税号或个人证件号码
-    String account;//开户行及账号
-    String address;//客户地址
-    String telephone;//客户电话
-    String phone;//交付手机,退货单开专票和数电发票时,固定取原蓝票的,可不传
-    String email;//交付邮箱,退货单开专票和数电发票时,固定取原蓝票的,可不传
-    String ccPhone;//抄送手机,多个时用英文逗号隔开,最多支持5个,必须在phone字段有值时,才支持传入
-    String ccEmail;//抄送邮箱,多个时用英文逗号隔开,最多支持5个,必须在email字段有值时,才支持传入
-    String orderRemark;//订单备注
-    String remark;//发票备注,票种为数电票时为200字符
-    String relateSaleOrderNo;//原销售订单编号(退货单选填,销售单不生效)
-    String salesperson;//销售员
-    String issuanceDate;//发货日期(年月日 yyyy-MM-dd)
-    String clerk;//开票员
-    String payee;//收款人
-    String checker;//复核人
-    String callbackUrl;//回调通知地址
-    String yfpdm;//原发票代码,退货单自动开票时,原发票代码不能为空
-    String yfphm;//原发票号码,退货单自动开票时,原发票号码不能为空
-    String deptId;//订单所属部门id,传诺诺网的部门id
-    String clerkId;//订单所属票员id,传诺诺网开票员id
-    String bField1;//自定义字段1,需开通自定义字段功能
-    String bField2;//自定义字段2
-    String bField3;//自定义字段3
-    String extensionNumber;//分机号(当autoInvoiceFlag为true时根据分机号,机器编号,终端号查找开票设备)
-    String machineCode;//机器编号(当autoInvoiceFlag为true时根据分机号,机器编号,终端号查找开票设备
-    String terminalNumber;//终端号(当autoInvoiceFlag为true时根据分机号,机器编号,终端号查找开票设备
-    String companyCode;//组织编码,saleTaxNum不传时,根据该字段匹配在诺税通工作台基础模块维护的组织编码,获得对应的销方税号;二者都传时,取saleTaxNum;有值时,topSaleTaxNum必传
-    String deptCode;//部门编码,根据该字段匹配在诺税通工作台基础模块维护的部门编码,获取订单对应的所属部门;优先取deptId
-    String userCode;//用户编码,根据该字段匹配在诺税通工作台基础模块维护的用户编码,获取订单对应的所属用户;优先取userId
-    String topSaleTaxNum;//顶级公司税号,saleTaxNum不传,且companyCode有值时,必传
-}

+ 0 - 27
src/main/java/com/uas/eis/dao/OrderDetDTO.java

@@ -1,27 +0,0 @@
-package com.uas.eis.dao;
-
-import lombok.Data;
-
-@Data
-public class OrderDetDTO {
-    String rowNo;//行编号(非序号,可与自身业务系统内唯一编号对应,订单内唯一)
-    String goodsName;//	商品名称 不能为空
-    String spec;//规格型号
-    String unit;//单位(当成品油标志为1时,需为升或吨)
-    String num;//数量,销售单传入正数,退货单传入负数 2、包含小数点最长不超过16位,超出自动截取。数量、单价必须都不填,或者都必填。当数量、单价都不填时,金额必填
-    String price;//单价,包含小数点最长不超过16位,超出自动截取。数量、单价必须都不填,或者都必填。当数量、单价都不填时,金额必填
-    String taxRate;//税率
-    String tax;//税额,若自行传入时,折扣zke有值,请传未扣除折扣前的税额,折扣减掉的税额系统自动根据税率计算
-    String taxAmount;//金额 1、不能为0 2、销售订单传入正数,退货单传入负数 3、当数量、单价都不填时,金额必填
-    String hsbz;//含税标志:(0:否,1:是) 不能为空
-    String spbm;//税收分类编码(没传,会根据商品名称和规格型号,去商品库匹配,若商品库未匹配成功,则会去税收分类编码表匹配)
-    String yhzcbs;//是否享受优惠政策:(0:否,1:是)
-    String zzstsgl;//优惠政策类型,当是否享受优惠政策为是时,优惠政策类型必填
-    String zke;//折扣金额(当该商品开折扣发票时传入;退货单时传入负数,且会用金额-折扣,跟税率重算税额后入库,建议退货单时不传,自行减掉折扣后传入)
-    String lslbs;//零税率标识1-免税 ,2-不征税, 3-其他优惠政策(普通0税率); 1、当税率为:0%,且增值税特殊管理:为“免税”, 零税率标识:需传“1” 2、当税率为:0%,且增值税特殊管理:为"不征税" 零税率标识:需传“2” 3、当税率为:0%,且增值税特殊管理:为空 零税率标识:需传“3”
-    String dField1;//商品明细自定义字段1
-    String dField2;//商品明细自定义字段2
-    String dField3;//商品明细自定义字段3
-    String dField4;//商品明细自定义字段4
-    String dField5;//商品明细自定义字段5
-}

+ 0 - 5
src/main/java/com/uas/eis/dto/FindOrderRelationInvoiceReq.java

@@ -1,12 +1,7 @@
 package com.uas.eis.dto;
 
-import com.uas.eis.dao.InvoiceGoodsTransportsDTO;
-import com.uas.eis.dao.OrderDTO;
-import com.uas.eis.dao.OrderDetDTO;
 import lombok.Data;
 
-import java.util.List;
-
 @Data
 public class FindOrderRelationInvoiceReq {
     String originalOrderNo;//订单编号

+ 1 - 0
src/main/java/com/uas/eis/entity/Purchase.java

@@ -14,5 +14,6 @@ public class Purchase {
     private String pu_isr;
     private String pu_shipaddresscode;
     private String pu_deliveryparty;
+    private String pu_article;
     private List<PurchaseDetail> items;
 }

+ 21 - 0
src/main/java/com/uas/eis/entity/PurchaseChange.java

@@ -0,0 +1,21 @@
+package com.uas.eis.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PurchaseChange {
+    private int pc_id;
+    private String pc_code;
+    private String pc_purccode;
+    private String pc_newcurrency;
+    private String pc_deliveryparty;
+    private String pc_isr;
+
+    private List<PurchaseChangeDetail> items;
+
+    private String pu_code;
+    private String pu_date;
+    private String Pu_shipaddresscode;
+}

+ 22 - 0
src/main/java/com/uas/eis/entity/PurchaseChangeDetail.java

@@ -0,0 +1,22 @@
+package com.uas.eis.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class PurchaseChangeDetail {
+    private int pcd_id;
+    private String pcd_newprodcode;
+    private int pcd_newqty;
+    private double pcd_newprice;
+    private int pcd_pddetno;
+    private Date pcd_newdelivery;
+    private String quote;
+    private String pcd_so;
+    private String changetype;
+
+    private int pd_leftqty;//剩余数量pd_qty-pd_yqty
+
+    private String pr_orispeccode;
+}

+ 1 - 0
src/main/java/com/uas/eis/entity/PurchaseDetail.java

@@ -6,6 +6,7 @@ import java.util.Date;
 
 @Data
 public class PurchaseDetail {
+    private  int pd_detno;
     private  int pd_qty;
     private  double pd_price;
     private Date pd_delivery;

+ 59 - 7
src/main/java/com/uas/eis/service/Impl/SynaServiceImpl.java

@@ -6,6 +6,8 @@ import com.uas.eis.core.config.SpObserver;
 import com.uas.eis.core.support.TokenProperties;
 import com.uas.eis.dao.BaseDao;
 import com.uas.eis.entity.Purchase;
+import com.uas.eis.entity.PurchaseChange;
+import com.uas.eis.entity.PurchaseChangeDetail;
 import com.uas.eis.entity.PurchaseDetail;
 import com.uas.eis.service.CommonService;
 import com.uas.eis.service.SynaService;
@@ -35,7 +37,7 @@ public class SynaServiceImpl implements SynaService {
     private BaseDao baseDao;
 
     @Autowired
-    private SynaConfig spnaConfig;
+    private SynaConfig synaConfig;
     @Autowired
     private CommonService commonService;
 
@@ -47,12 +49,11 @@ public class SynaServiceImpl implements SynaService {
         logger.info("sendPurchaseToSyna-beg:{}:{}",master,id);
         Purchase po=getPO(id);
         if(po!=null){
-            String ediId = baseDao.getJdbcTemplate()
-                    .queryForObject("select lpad(N_HUASL_T.EDI_SYNAPTICS_SEQ.nextval,9,'0') from dual", String.class);
+            String ediId = getEDIId();
             System.out.println(ediId);
             X12Converter converter=new X12Converter();
             String data=converter.convertToX12(po,ediId);
-            String url= spnaConfig.getUrl_850();
+            String url= synaConfig.getUrl_850();
             System.out.println("X12:");
             System.out.println( data);
             logger.info("sendPurchaseToSyna:po:{} X12-data:{}",po.getPu_code(),data);
@@ -63,6 +64,53 @@ public class SynaServiceImpl implements SynaService {
         }
         return Collections.emptyMap();
     }
+    @Override
+    public Map<String, Object> sendPurchaseChangeToSyna(String master, Integer id) throws EDISchemaException, EDIStreamException, IOException {
+        SpObserver.putSp(master);
+        Map<String, Object> modelMap = new HashMap<String, Object>();
+        logger.info("sendPurchaseChangeToSyna-beg:{}:{}",master,id);
+        PurchaseChange pc=getPC(id);
+        if(pc!=null){
+            String ediId = getEDIId();
+            System.out.println(ediId);
+            X12Converter converter=new X12Converter();
+            String data=converter.convertToX12(pc,ediId);
+            String url= synaConfig.getUrl_850();
+            System.out.println("X12:");
+            System.out.println( data);
+            logger.info("sendPurchaseChangeToSyna:po:{} X12-data:{}",pc.getPc_code(),data);
+            modelMap=toSynaptics(url,data);
+            return modelMap;
+        }else{
+            logger.info("sendPurchaseChangeToSyna:采购变更单不存在:id={}",id);
+        }
+        return Collections.emptyMap();
+    }
+    private PurchaseChange getPC( Integer id){
+        PurchaseChange pc=baseDao.getJdbcTemplate().queryForObject("select pc_id,pc_code,pc_purccode,pc_newcurrency,pc_deliveryparty,pc_isr," +
+                " pu_code ,pu_date,Pu_shipaddresscode " +
+                " from PurchaseChange left join purchase on pc_purccode=pu_code where pu_id=?", new BeanPropertyRowMapper<PurchaseChange>(PurchaseChange.class), id);
+        List<PurchaseChangeDetail> detail = baseDao.getJdbcTemplate().query(
+                "select  pcd_id, pcd_newprodcode, pcd_newqty, pcd_newprice,pcd_pddetno,pcd_newdelivery,pcd_so," +
+                        "nvl(pcd_quote,pd_quote) quote," +
+                        "(case when nvl(pcd_oldprice,0)<>nvl(pcd_newprice,0) and nvl(pcd_oldqty,0)<>nvl(pcd_newqty,0) and trunc(pcd_newdelivery) <>trunc(pcd_olddelivery) then 'MU' " +
+                        "      when nvl(pcd_oldprice,0)<>nvl(pcd_newprice,0) and nvl(pcd_oldqty,0)<>nvl(pcd_newqty,0)  then 'PQ' " +
+                        "      when nvl(pcd_oldprice,0)<>nvl(pcd_newprice,0) and trunc(pcd_newdelivery) <>trunc(pcd_olddelivery)  then 'PR' " +
+                        "      when trunc(pcd_newdelivery) <>trunc(pcd_olddelivery)  and nvl(pcd_oldqty,0)<>nvl(pcd_newqty,0) then 'RQ' " +
+                        "      when trunc(pcd_newdelivery) <>trunc(pcd_olddelivery) then 'RS' " +
+                        "      when nvl(pcd_oldprice,0)<>nvl(pcd_newprice,0) then 'PC' " +
+                        "      when nvl(pcd_oldqty,0)>nvl(pcd_newqty,0) then 'QD' " +
+                        "      when nvl(pcd_oldqty,0)<nvl(pcd_newqty,0) then 'QI' " +
+                        " end ) changetype," +
+                        "pd_qty-nvl(pd_yqty,0) pd_leftqty," +
+                        "pr_orispeccode " +
+                        "from PurchaseChange left join PurchaseChangedetail on pcd_pcid=pc_id left join Purchasedetail on pc_purccode=pd_code and pcd_pddetno=pd_detno" +
+                        "left join product on pcd_newprodcode =pr_code" +
+                        " where pd_puid=? order by pd_detno", new BeanPropertyRowMapper<PurchaseChangeDetail>(PurchaseChangeDetail.class),
+                id);
+        pc.setItems(detail);
+        return pc;
+    }
     private Purchase getPO( Integer id){
         Purchase po=baseDao.getJdbcTemplate().queryForObject("select * from Purchase where pu_id=?", new BeanPropertyRowMapper<Purchase>(Purchase.class), id);
         List<PurchaseDetail> detail = baseDao.getJdbcTemplate().query(
@@ -72,12 +120,16 @@ public class SynaServiceImpl implements SynaService {
         po.setItems(detail);
         return po;
     }
-
+    private String getEDIId(){
+        String ediId = baseDao.getJdbcTemplate()
+                .queryForObject("select lpad(N_HUASL_T.EDI_SYNAPTICS_SEQ.nextval,9,'0') from dual", String.class);
+        return ediId;
+    }
     private Map<String, Object> toSynaptics(String url,String data) throws IOException {
         logger.info("请求开始:url:{}",url);
         Map<String, Object> map = new HashMap<String, Object>();
-        String username=spnaConfig.getUsername();
-        String password=spnaConfig.getPassword();
+        String username=synaConfig.getUsername();
+        String password=synaConfig.getPassword();
         String auth=username + ":" + password;
         String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes());
         String authHeader = "Basic " + encodedAuth;

+ 2 - 0
src/main/java/com/uas/eis/service/SynaService.java

@@ -9,4 +9,6 @@ import java.util.Map;
 
 public interface SynaService {
     Map<String, Object> sendPurchaseToSyna(String master, Integer id) throws EDISchemaException, EDIStreamException, IOException;
+    Map<String, Object> sendPurchaseChangeToSyna(String master, Integer id) throws EDISchemaException, EDIStreamException, IOException;
+
 }

+ 2 - 0
src/main/resources/application-dev.yml

@@ -34,3 +34,5 @@ synaptics:
     url_850 : https://syn-oic-poc-axpwqir9ej7o-px.integration.us-phoenix-1.ocp.oraclecloud.com/ic/api/integration/v1/flows/rest/WORLDSHINE850E8HUE_REST_RECEIVE/1.0
     url_860 : https://syn-oic-poc-axpwqir9ej7o-px.integration.us-phoenix-1.ocp.oraclecloud.com/ic/api/integration/v1/flows/rest/WORLDSHINE860EJ364H_REST_RECEIVE/1.0
     url_867 : https://syn-oic-poc-axpwqir9ej7o-px.integration.us-phoenix-1.ocp.oraclecloud.com/ic/api/integration/v1/flows/rest/WORLDSHINE867JOA3HJ_REST_RECEIVE/1.0
+    bill_to_address : ROOM 2708, 27/F, APEC PLAZA, 49 HOI YUEN ROAD KWUN TONG, KOWLOON
+    BTEDILocationCode : WTECH-3925

+ 2 - 0
src/main/resources/application-prod.yml

@@ -35,3 +35,5 @@ synaptics:
     url_850 : https://syn-oic-poc-axpwqir9ej7o-px.integration.us-phoenix-1.ocp.oraclecloud.com/ic/api/integration/v1/flows/rest/WORLDSHINE850E8HUE_REST_RECEIVE/1.0
     url_860 : https://syn-oic-poc-axpwqir9ej7o-px.integration.us-phoenix-1.ocp.oraclecloud.com/ic/api/integration/v1/flows/rest/WORLDSHINE860EJ364H_REST_RECEIVE/1.0
     url_867 : https://syn-oic-poc-axpwqir9ej7o-px.integration.us-phoenix-1.ocp.oraclecloud.com/ic/api/integration/v1/flows/rest/WORLDSHINE867JOA3HJ_REST_RECEIVE/1.0
+    bill_to_address : ROOM 2708, 27/F, APEC PLAZA, 49 HOI YUEN ROAD KWUN TONG, KOWLOON
+    BTEDILocationCode : WTECH-3925

+ 14 - 5
src/test/java/com/uas/eis/SynaTests.java

@@ -1,9 +1,7 @@
 package com.uas.eis;
 
-
-import com.uas.eis.config.DonlimConfig;
+import com.uas.eis.config.SynaConfig;
 import com.uas.eis.dao.BaseDao;
-import com.uas.eis.service.ERPService;
 import com.uas.eis.service.SynaService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -11,8 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.Base64;
-
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {UasEisApplication.class})
 public class SynaTests {
@@ -20,9 +16,22 @@ public class SynaTests {
 	private BaseDao baseDao;
 	@Autowired
 	private SynaService synaService;
+	@Autowired
+	private SynaConfig synaConfig;
 
 	@Test
 	public void TestPo() throws Exception {
 		synaService.sendPurchaseToSyna("N_HUASL_T",50847950);
 	}
+
+	@Test
+	public void TestPc() throws Exception {
+		synaService.sendPurchaseToSyna("N_HUASL_T",50847950);
+	}
+
+	@Test
+	public void Test() throws Exception {
+		System.out.println(synaConfig.getUsername());
+	}
+
 }