From a9ebd9f77b62e0c4d16864be47b357a836d8fc1c Mon Sep 17 00:00:00 2001 From: yxt_djz Date: Wed, 31 Aug 2022 21:31:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=91=E8=9D=B6=E6=8E=A5=E5=8F=A3=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E8=B0=83=E6=8B=A8=E5=8D=95=E7=9A=84=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fin/api/kingdee/FinKingDeeFeign.java | 6 + .../api/kingdee/FinKingDeeFeignFallBack.java | 6 + .../anrui/fin/api/kingdee/KingDeeBillId.java | 1 + .../stktransferdirect/StkTransferDirect.java | 198 ++++++++++++++++++ .../fin/api/kingdee/submitkd/SubmitKD.java | 2 +- .../fin/biz/kingdee/FinKingDeeFeignRest.java | 16 +- ...TransferDirectCastToKingDeeBillFields.java | 66 ++++++ .../StkTransferDirectService.java | 36 ++++ .../biz/kingdee/stktransferdirect/data.json | 4 + .../stktransferdirect/data_FBillEntry.json | 58 +++++ .../kingdee/stktransferdirect/data_data.json | 13 ++ .../kingdee/stktransferdirect/data_model.json | 42 ++++ .../biz/kingdee/stktransferdirect/remarks.txt | 175 ++++++++++++++++ .../webapi测试的数据.txt | 5 + .../直接调拨单的参数必填备注.xlsx | Bin 0 -> 10629 bytes 15 files changed, 626 insertions(+), 2 deletions(-) create mode 100644 anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/stktransferdirect/StkTransferDirect.java create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/StkTransferDirectCastToKingDeeBillFields.java create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/StkTransferDirectService.java create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data.json create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_FBillEntry.json create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_data.json create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_model.json create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/remarks.txt create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/webapi测试的数据.txt create mode 100644 anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/直接调拨单的参数必填备注.xlsx diff --git a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/FinKingDeeFeign.java b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/FinKingDeeFeign.java index c91775e264..a5f711cd68 100644 --- a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/FinKingDeeFeign.java +++ b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/FinKingDeeFeign.java @@ -7,6 +7,7 @@ import com.yxt.anrui.fin.api.kingdee.bdmaterial.BdMaterial; import com.yxt.anrui.fin.api.kingdee.purmrb.PurMrb; import com.yxt.anrui.fin.api.kingdee.saloutstock.SalOutStock; import com.yxt.anrui.fin.api.kingdee.stkinstock.StkInStock; +import com.yxt.anrui.fin.api.kingdee.stktransferdirect.StkTransferDirect; import com.yxt.common.core.result.ResultBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -72,4 +73,9 @@ public interface FinKingDeeFeign { @ResponseBody public ResultBean> draftBdMaterialList(@RequestBody List bdMaterial) ; + @ApiOperation("保存直接调拨单的接口") + @PostMapping("/draftStkTransferDirect") + @ResponseBody + public ResultBean> draftStkTransferDirect(@RequestBody StkTransferDirect stkTransferDirect) ; + } diff --git a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/FinKingDeeFeignFallBack.java b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/FinKingDeeFeignFallBack.java index 3460ad9e97..067de1dab0 100644 --- a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/FinKingDeeFeignFallBack.java +++ b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/FinKingDeeFeignFallBack.java @@ -7,6 +7,7 @@ import com.yxt.anrui.fin.api.kingdee.bdmaterial.BdMaterial; import com.yxt.anrui.fin.api.kingdee.purmrb.PurMrb; import com.yxt.anrui.fin.api.kingdee.saloutstock.SalOutStock; import com.yxt.anrui.fin.api.kingdee.stkinstock.StkInStock; +import com.yxt.anrui.fin.api.kingdee.stktransferdirect.StkTransferDirect; import com.yxt.common.core.result.ResultBean; import java.util.List; @@ -53,4 +54,9 @@ implements FinKingDeeFeign{ return null; } + @Override + public ResultBean> draftStkTransferDirect(StkTransferDirect stkTransferDirect) { + return null; + } + } diff --git a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/KingDeeBillId.java b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/KingDeeBillId.java index 5277823ae8..7bff09014f 100644 --- a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/KingDeeBillId.java +++ b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/KingDeeBillId.java @@ -8,6 +8,7 @@ public enum KingDeeBillId { STK_INSTOCK("STK_InStock","采购入库单"), PUR_MRB("PUR_MRB","采购退料单"), SAL_OUTSTOCK("SAL_OUTSTOCK","销售出库单"), + STK_TRANSFERDIRECT("STK_TransferDirect","直接调拨单"), BD_MATERIAL("BD_MATERIAL","物料"); private String ID; private String NAME; diff --git a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/stktransferdirect/StkTransferDirect.java b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/stktransferdirect/StkTransferDirect.java new file mode 100644 index 0000000000..2301e13402 --- /dev/null +++ b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/stktransferdirect/StkTransferDirect.java @@ -0,0 +1,198 @@ +package com.yxt.anrui.fin.api.kingdee.stktransferdirect; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yxt.anrui.fin.api.kingdee.stkinstock.StkInStock; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 直接调拨单 + */ +@Data +public class StkTransferDirect { + @Data + public static class FBillEntry{ + /* 调入库存状态:FDestStockStatusId (必填项)*/ + @JsonProperty("FDestStockStatusId") + @NotBlank + public String FDestStockStatusId; + /*调出库存状态:FSrcStockStatusId (必填项)*/ + @JsonProperty("FSrcStockStatusId") + @NotBlank + public String FSrcStockStatusId; + /*基本单位:FBaseUnitId (必填项)*/ + @JsonProperty("FBaseUnitId") + @NotBlank + public String FBaseUnitId; + /*调入货主类型:FOwnerTypeId (必填项)*/ + @JsonProperty("FOwnerTypeId") + @NotBlank + public String FOwnerTypeId; + /* 调出保管者:FKeeperOutId (必填项)*/ + @JsonProperty("FKeeperOutId") + @NotBlank + public String FKeeperOutId; + /* 调出货主:FOwnerOutId (必填项)*/ + @JsonProperty("FOwnerOutId") + @NotBlank + public String FOwnerOutId; + /*调出批号:FLot*/ + @JsonProperty("FLot") + @NotBlank + public String FLot; + /* 调出货主类型:FOwnerTypeOutId (必填项)*/ + @JsonProperty("FOwnerTypeOutId") + @NotBlank + public String FOwnerTypeOutId; + /*调入批号:FDestLot*/ + @JsonProperty("FDestLot") + @NotBlank + public String FDestLot; + /* 调入货主:FOwnerId (必填项)*/ + @JsonProperty("FOwnerId") + @NotBlank + public String FOwnerId; + /* 调入货主:FOwnerIdHead (必填项)*/ + @JsonProperty("FOwnerIdHead") + @NotBlank + public String FOwnerIdHead; + /* 调出保管者类型:FKeeperTypeOutId (必填项)*/ + @JsonProperty("FKeeperTypeOutId") + @NotBlank + public String FKeeperTypeOutId; + /* 调入保管者:FKeeperId (必填项)*/ + @JsonProperty("FKeeperId") + @NotBlank + public String FKeeperId; + /* 调入保管者类型:FKeeperTypeId (必填项)*/ + @JsonProperty("FKeeperTypeId") + @NotBlank + public String FKeeperTypeId; + /* 调入仓库:FDestStockId (必填项)*/ + @JsonProperty("FDestStockId") + @NotBlank + public String FDestStockId; + /* 单位:FUnitID (必填项)*/ + @JsonProperty("FUnitID") + @NotBlank + public String FUnitID; + /* 物料编码:FMaterialId (必填项)*/ + @JsonProperty("FMaterialId") + @NotBlank + public String FMaterialId; + /* 调出仓库:FSrcStockId (必填项)*/ + @JsonProperty("FSrcStockId") + @NotBlank + public String FSrcStockId; + } + /* 调出库存组织:FStockOutOrgId (必填项)*/ + @JsonProperty("FStockOutOrgId") + @NotBlank + public String FStockOutOrgId; + /* 调拨类型:FTransferBizType (必填项)*/ + @JsonProperty("FTransferBizType") + @NotBlank + public String FTransferBizType; + /* 调拨方向:FTransferDirect (必填项)*/ + @JsonProperty("FTransferDirect") + @NotBlank + public String FTransferDirect; + /* 调出货主类型:FOwnerTypeOutIdHead (必填项)*/ + @JsonProperty("FOwnerTypeOutIdHead") + @NotBlank + public String FOwnerTypeOutIdHead; + /* 调入库存组织:FStockOrgId (必填项)*/ + @JsonProperty("FStockOrgId") + @NotBlank + public String FStockOrgId; + /* 调入货主类型:FOwnerTypeIdHead (必填项)*/ + @JsonProperty("FOwnerTypeIdHead") + @NotBlank + public String FOwnerTypeIdHead; + /* 单据类型:FBillTypeID (必填项)*/ + @JsonProperty("FBillTypeID") + @NotBlank + public String FBillTypeID; + /* 日期:FDate (必填项)*/ + @JsonProperty("FDate") + @NotBlank + public String FDate; + /** + * FBillEntry + */ + @JsonProperty("FBillEntry") + @NotBlank + public List FBillEntry=new ArrayList<>(); + + public final static StkTransferDirect stkTransferDirect = new StkTransferDirect(); + + static { + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + /* 单据类型:FBillTypeID (必填项)*/ + stkTransferDirect.setFBillTypeID("ZJDB01_SYS"); + /* 日期:FDate (必填项)*/ + stkTransferDirect.setFDate(sdf.format(date)); + /* 调出库存组织:FStockOutOrgId (必填项)*/ + stkTransferDirect.setFStockOutOrgId("101"); + /* 调出货主类型:FOwnerTypeOutIdHead (必填项)*/ + stkTransferDirect.setFOwnerTypeOutIdHead("BD_OwnerOrg"); + /* 调拨类型:FTransferBizType (必填项)*/ + stkTransferDirect.setFTransferBizType("InnerOrgTransfer"); + /* 调拨方向:FTransferDirect (必填项)*/ + stkTransferDirect.setFTransferDirect("GENERAL"); + /* 调入库存组织:FStockOrgId (必填项)*/ + stkTransferDirect.setFStockOrgId("101"); + /* 调入货主类型:FOwnerTypeIdHead (必填项)*/ + stkTransferDirect.setFOwnerTypeIdHead("BD_OwnerOrg"); + List fBillEntry=new ArrayList<>(); + StkTransferDirect.FBillEntry fbe=new StkTransferDirect.FBillEntry(); + /*调入批号:FDestLot*/ + fbe.setFDestLot("1234567890"); + /*调出批号:FLot*/ + fbe.setFLot("1234567890"); + /*基本单位:FBaseUnitId (必填项)*/ + fbe.setFBaseUnitId("liang"); + /* 调入仓库:FDestStockId (必填项)*/ + fbe.setFDestStockId("CK002"); + /* 单位:FUnitID (必填项)*/ + fbe.setFUnitID("liang"); + /* 物料编码:FMaterialId (必填项)*/ + fbe.setFMaterialId(" JX091054"); + + /* 调入库存状态:FDestStockStatusId (必填项)*/ + fbe.setFDestStockStatusId("KCZT01_SYS"); + /* 调入货主类型:FOwnerTypeId (必填项)*/ + fbe.setFOwnerTypeId("BD_OwnerOrg"); + /* 调入货主:FOwnerId (必填项)*/ + fbe.setFOwnerId("101"); + /* 调入货主:FOwnerId (必填项)*/ + fbe.setFOwnerIdHead("101"); + /* 调出保管者:FKeeperOutId (必填项)*/ + fbe.setFKeeperOutId("101"); + /* 调出货主:FOwnerOutId (必填项)*/ + fbe.setFOwnerOutId("101"); + /* 调出货主类型:FOwnerTypeOutId (必填项)*/ + fbe.setFOwnerTypeOutId("BD_OwnerOrg"); + /* 调出保管者类型:FKeeperTypeOutId (必填项)*/ + fbe.setFKeeperTypeOutId("BD_KeeperOrg"); + /* 调入保管者:FKeeperId (必填项)*/ + fbe.setFKeeperId("101"); + /* 调入保管者类型:FKeeperTypeId (必填项)*/ + fbe.setFKeeperTypeId("BD_KeeperOrg"); + /*调出库存状态:FSrcStockStatusId (必填项)*/ + fbe.setFSrcStockStatusId("KCZT01_SYS"); + /* 调出仓库:FSrcStockId (必填项)*/ + fbe.setFSrcStockId("CK001"); + fBillEntry.add(fbe); + stkTransferDirect.setFBillEntry(fBillEntry); + } + public static StkTransferDirect createStkTransferDirect() { + return stkTransferDirect; + } +} diff --git a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/submitkd/SubmitKD.java b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/submitkd/SubmitKD.java index 33661dd8f3..c19576ec6e 100644 --- a/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/submitkd/SubmitKD.java +++ b/anrui-fin/anrui-fin-api/src/main/java/com/yxt/anrui/fin/api/kingdee/submitkd/SubmitKD.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; /** - * 提交金蝶接口的数据格式 + * 提交功能 金蝶接口的数据格式 */ @Data public class SubmitKD { diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/FinKingDeeFeignRest.java b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/FinKingDeeFeignRest.java index cd47b2afd0..1ac9c8dba8 100644 --- a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/FinKingDeeFeignRest.java +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/FinKingDeeFeignRest.java @@ -9,6 +9,7 @@ import com.yxt.anrui.fin.api.kingdee.bdmaterial.BdMaterial; import com.yxt.anrui.fin.api.kingdee.purmrb.PurMrb; import com.yxt.anrui.fin.api.kingdee.saloutstock.SalOutStock; import com.yxt.anrui.fin.api.kingdee.stkinstock.StkInStock; +import com.yxt.anrui.fin.api.kingdee.stktransferdirect.StkTransferDirect; import com.yxt.anrui.fin.biz.kingdee.appaybill.ApPayBillService; import com.yxt.anrui.fin.biz.kingdee.appayable.APPayableService; import com.yxt.anrui.fin.biz.kingdee.bdmaterial.BdMaterialService; @@ -16,6 +17,7 @@ import com.yxt.anrui.fin.biz.kingdee.purmrb.PurMrbService; import com.yxt.anrui.fin.biz.kingdee.receivablebill.ReceivableBillService; import com.yxt.anrui.fin.biz.kingdee.saloutstock.SalOutStockService; import com.yxt.anrui.fin.biz.kingdee.stkinstock.STKInStockService; +import com.yxt.anrui.fin.biz.kingdee.stktransferdirect.StkTransferDirectService; import com.yxt.common.core.result.ResultBean; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -64,6 +66,11 @@ public class FinKingDeeFeignRest implements FinKingDeeFeign { */ @Autowired private BdMaterialService bdMaterialService; + /** + * 保存直接调拨单 + */ + @Autowired + private StkTransferDirectService stkTransferDirectService; @ApiOperation("入账保存应付单的接口") @PostMapping("/draftEntryBill") @ResponseBody @@ -111,7 +118,7 @@ public class FinKingDeeFeignRest implements FinKingDeeFeign { @PostMapping("/draftBdMaterial") @ResponseBody @Override - public ResultBean> draftBdMaterial(BdMaterial bdMaterial) { + public ResultBean> draftBdMaterial(@RequestBody BdMaterial bdMaterial) { return bdMaterialService.draftBdMaterial(bdMaterial); } @@ -122,4 +129,11 @@ public class FinKingDeeFeignRest implements FinKingDeeFeign { public ResultBean> draftBdMaterialList(@RequestBody List bdMaterial) { return bdMaterialService.draftBdMaterialList(bdMaterial); } + @ApiOperation("保存直接调拨单的接口") + @PostMapping("/draftStkTransferDirect") + @ResponseBody + @Override + public ResultBean> draftStkTransferDirect(@RequestBody StkTransferDirect stkTransferDirect) { + return stkTransferDirectService.draftStkTransferDirect(stkTransferDirect); + } } diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/StkTransferDirectCastToKingDeeBillFields.java b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/StkTransferDirectCastToKingDeeBillFields.java new file mode 100644 index 0000000000..efa180c9aa --- /dev/null +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/StkTransferDirectCastToKingDeeBillFields.java @@ -0,0 +1,66 @@ +package com.yxt.anrui.fin.biz.kingdee.stktransferdirect; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; +import com.yxt.anrui.fin.biz.kingdee.KingDeeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 封装转换的类 + */ +public class StkTransferDirectCastToKingDeeBillFields { + private static Logger log=LoggerFactory.getLogger(StkTransferDirectCastToKingDeeBillFields.class); + /** + * 构造金蝶需要的数据结构 并对字段赋值 + * + * @param map_fEntityModel_ + * @param vehicleList + * @return + */ + public static String getKingDeeData(Map map_fEntityModel_,List> vehicleList){ + /** + * 取模板 + */ + String readJsonFile = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data.json"); + String fEntityData_ = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_data.json"); + String fEntityModel_ = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_model.json"); + String fBillEntry_ = KingDeeUtils.readJsonFile("com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_FBillEntry.json"); + log.info("readJsonFile:{}",readJsonFile); + log.info("fEntityData_:{}",fEntityData_); + log.info("fEntityModel_:{}",fEntityModel_); + log.info("FBillEntry_:{}",fBillEntry_); + + //模板字符创转json + JSONObject jsonObj= JSONObject.parseObject(readJsonFile, Feature.OrderedField); + JSONObject jsonFEntityData_= JSONObject.parseObject(fEntityData_,Feature.OrderedField); + fEntityModel_ =KingDeeUtils.replaceTemplateParams(fEntityModel_, map_fEntityModel_); + JSONObject jsonFEntityModel_= JSONObject.parseObject(fEntityModel_,Feature.OrderedField); + + List list_fEntityDetail_=new ArrayList<>(); + + //对模板字段赋值 根据传递进来的map数据的集合进行赋值 + for(int i=0;i params=vehicleList.get(i); + Map map_fEntityDetail_=new HashMap<>(); + for (Map.Entry entry : params.entrySet()) { + map_fEntityDetail_.put(entry.getKey(),entry.getValue()); + } + fBillEntry_ =KingDeeUtils.replaceTemplateParams(fBillEntry_, map_fEntityDetail_); + list_fEntityDetail_.add(JSONObject.parseObject(fBillEntry_,Feature.OrderedField)); + } + + jsonFEntityModel_.put("FBillEntry", JSONArray.parseArray(JSON.toJSONString(list_fEntityDetail_))); + jsonFEntityData_.put("Model",JSONObject.parseObject(JSON.toJSONString(jsonFEntityModel_),Feature.OrderedField)); + jsonObj.put("data",jsonFEntityData_.toJSONString()); + + return jsonObj.toJSONString(); + } +} \ No newline at end of file diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/StkTransferDirectService.java b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/StkTransferDirectService.java new file mode 100644 index 0000000000..ef227ebde6 --- /dev/null +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/StkTransferDirectService.java @@ -0,0 +1,36 @@ +package com.yxt.anrui.fin.biz.kingdee.stktransferdirect; + +import com.yxt.anrui.fin.api.kingdee.KingDeeBillId; +import com.yxt.anrui.fin.api.kingdee.stktransferdirect.StkTransferDirect; +import com.yxt.anrui.fin.biz.kingdee.FinKingDeeService; +import com.yxt.common.core.result.ResultBean; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class StkTransferDirectService extends FinKingDeeService { + + /** + * 保存采购入库单 + * @param stkTransferDirect + * @return + */ + public ResultBean draftStkTransferDirect(StkTransferDirect stkTransferDirect) { + stkTransferDirect=StkTransferDirect.createStkTransferDirect(); + ResultBean rb=ResultBean.fireFail(); + try { + //业务表的主表数据集合 + Map map_fEntityModel_= object2Map(stkTransferDirect); + List fBillEntry = stkTransferDirect.getFBillEntry(); + //准备 物料列表的数据 ForEntryBill + List> vehicleListMap = createVehicleLists(fBillEntry); + String kingDeeData = StkTransferDirectCastToKingDeeBillFields.getKingDeeData(map_fEntityModel_,vehicleListMap); + return saveBill(KingDeeBillId.STK_TRANSFERDIRECT.getID(),kingDeeData); + } catch (Exception e) { + e.printStackTrace(); + } + return rb; + } +} diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data.json b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data.json new file mode 100644 index 0000000000..f300562a9a --- /dev/null +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data.json @@ -0,0 +1,4 @@ +{ + "formId": "STK_TransferDirect", + "data": "@KD_data" +} \ No newline at end of file diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_FBillEntry.json b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_FBillEntry.json new file mode 100644 index 0000000000..3817d41da0 --- /dev/null +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_FBillEntry.json @@ -0,0 +1,58 @@ +{ + "FMaterialId": { + "FNumber": "@KD_FMaterialId" + }, + "FUnitID": { + "FNumber": "@KD_FUnitID" + }, + "FDestLot":{ + "FNumber": "@KD_FDestLot" + }, + "FLot": { + "FNumber": "@KD_Flot" + }, + "FQty": 1.0, + "FSrcStockId": { + "FNumber": "@KD_FSrcStockId" + }, + "FDestStockId": { + "FNumber": "@KD_FDestStockId" + }, + "FSrcStockStatusId": { + "FNumber": "@KD_FSrcStockStatusId" + }, + "FDestStockStatusId": { + "FNumber": "@KD_FDestStockStatusId" + }, + "FBusinessDate": "2022-08-31 00:00:00", + "FOwnerTypeOutId": "@KD_FOwnerTypeOutId", + "FOwnerOutId": { + "FNumber": "@KD_FOwnerOutId" + }, + "FOwnerTypeId": "@KD_FOwnerTypeId", + "FOwnerId": { + "FNumber": "@KD_FOwnerId" + }, + "FBaseUnitId": { + "FNumber": "@KD_FBaseUnitId" + }, + "FBaseQty": 1.0, + "FISFREE": false, + "FKeeperTypeId": "@KD_FKeeperTypeId", + "FKeeperId": { + "FNumber": "@KD_FKeeperId" + }, + "FKeeperTypeOutId": "@KD_FKeeperTypeOutId", + "FKeeperOutId": { + "FNumber": "@KD_FKeeperOutId" + }, + "FDestMaterialId": { + "FNUMBER": " JX091054" + }, + "FPriceUnitID": { + "FNumber": "liang" + }, + "FPriceQty": 1.0, + "FPriceBaseQty": 1.0, + "FTransReserveLink": false +} \ No newline at end of file diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_data.json b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_data.json new file mode 100644 index 0000000000..8a1e182ff3 --- /dev/null +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_data.json @@ -0,0 +1,13 @@ +{ + "Creator": "", + "NeedUpDateFields": [], + "NeedReturnFields": [], + "IsDeleteEntry": "True", + "SubSystemId": "", + "IsVerifyBaseDataField": "false", + "IsEntryBatchFill": "True", + "ValidateFlag": "True", + "NumberSearch": "True", + "InterationFlags": "", + "Model":{} +} \ No newline at end of file diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_model.json b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_model.json new file mode 100644 index 0000000000..40ee322140 --- /dev/null +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/data_model.json @@ -0,0 +1,42 @@ +{ + "FID": 0, + "FBillTypeID": { + "FNUMBER": "@KD_FBillTypeID" + }, + "FBizType": "NORMAL", + "FTransferDirect": "@KD_FTransferDirect", + "FTransferBizType": "@KD_FTransferBizType", + "FSettleOrgId": { + "FNumber": "101" + }, + "FSaleOrgId": { + "FNumber": "101" + }, + "FStockOutOrgId": { + "FNumber": "@KD_FStockOutOrgId" + }, + "FOwnerTypeOutIdHead": "@KD_FOwnerTypeOutIdHead", + "FOwnerOutIdHead": { + "FNumber": "101" + }, + "FStockOrgId": { + "FNumber": "@KD_FStockOrgId" + }, + "FIsIncludedTax": true, + "FIsPriceExcludeTax": true, + "FOwnerTypeIdHead": "@KD_FOwnerTypeIdHead", + "FSETTLECURRID": { + "FNUMBER": "PRE001" + }, + "FOwnerIdHead": { + "FNumber": "101" + }, + "FDate": "2022-08-31 00:00:00", + "FBaseCurrId": { + "FNumber": "PRE001" + }, + "FCustID": { + "FNUMBER": "GYRHHR002529" + }, + "FBillEntry": [] +} \ No newline at end of file diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/remarks.txt b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/remarks.txt new file mode 100644 index 0000000000..fdfdbf3515 --- /dev/null +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/remarks.txt @@ -0,0 +1,175 @@ +一、请求参数说明: +1.formid:业务对象表单Id,字符串类型(必录) +2.data:Json格式数据(详情参考Json格式数据)(必录) + 2.1.Creator:创建者内码(非必录) + 2.2.NeedUpDateFields:需要更新的字段,数组类型,格式:[key1,key2,...](非必录),注(更新单据体字段得加上单据体key) + 2.3.NeedReturnFields:需返回结果的字段集合,数组类型,格式:[key,entitykey.key,...](非必录),注(返回单据体字段格式:entitykey.key) + 2.4.IsDeleteEntry:是否删除已存在的分录,布尔类型,默认true(非必录) + 2.5.SubSystemId:表单所在的子系统内码,字符串类型(非必录) + 2.6.IsVerifyBaseDataField:是否验证所有的基础资料有效性,布尔类,默认false(非必录) + 2.7.IsEntryBatchFill:是否批量填充分录,默认true(非必录) + 2.8.ValidateFlag:是否验证标志,布尔类型,默认true(非必录) + 2.9.NumberSearch:是否用编码搜索基础资料,布尔类型,默认true(非必录) + 2.10.InterationFlags:交互标志集合,字符串类型,分号分隔,格式:"flag1;flag2;..."(非必录),例如(允许负库存标识:STK_InvCheckResult) + 2.11.Model:表单数据包,Json类型(必录) + +五、字段说明: +序列号单位:FSNUnitID +订单类别:FORDERTYPE +关联出库数量(基本单位):FBASEOUTJOINQTY +到货确认:FArrivalStatus +入库日期:FBusinessDate +序列号单位数量:FSNQty +备注:FNoteEntry +调入库存更新标识:FStockInFlag +调出库存更新标识:FStockOutFlag +关联出库数量:FOutJoinQty +业务流程:FBFLowId +源单编号:FSrcBillNo +到货确认人:FArrivalConfirmor +金额:FConsignAmount +税率%:FTaxRate +含税单价:FTaxPrice +折扣额:FDiscount +价税合计:FAllAmount +税额:FTaxAmount +补货数量:FRepairQty +拒收数量:FRefuseQty +到货日期:FArrivalDate +单价:FConsignPrice +实收数量:FActQty +是否补货:FIsRepair +库存辅单位:FSecUnitId +调入库存状态:FDestStockStatusId (必填项) +调出库存状态:FSrcStockStatusId (必填项) +调拨数量(基本单位):FBaseQty +基本单位:FBaseUnitId (必填项) +调拨数量(库存辅单位):FSecQty +生产日期:FProduceDate +辅助属性:FAuxPropId +BOM版本:FBomId +项目编号:FProjectNo +计划跟踪号:FMtoNo +有效期至:FExpiryDate +调入货主类型:FOwnerTypeId (必填项) +源单行号:FSrcSeq +源单类型:FSrcBillTypeId +调出保管者:FKeeperOutId (必填项) +关联退回数量(基本单位):FBaseJoinQty +关联退回数量:FReceiveQty +订单编号:FOrderNo +调出货主:FOwnerOutId (必填项) +调出货主类型:FOwnerTypeOutId (必填项) +调入货主:FOwnerId (必填项) +调出保管者类型:FKeeperTypeOutId (必填项) +调入保管者:FKeeperId (必填项) +调入保管者类型:FKeeperTypeId (必填项) +净价:FTaxNetPrice +服务上下文:FServiceContext +结算关联数量(销售基本单位):FJoinSaleBaseSettQty +出库关联数量(销售基本单位):FSalBaseOutJoinQty +计价基本数量:FPriceBaseQty +计价数量:FPriceQty +计价单位:FPriceUnitID +携带源单主业务单位:FSrcBizUnitId +销售基本单位退货关联数量:FSalBaseJoinQty +普通调拨源单类型:FGenSrcBillFormId +源单辅单位基本数量:FSrcAuxBaseQty +源单主单位基本数量:FSrcBizBaseQty +携带源单辅单位:FSrcAuxUnitId +销售基本单位数量旧值:FSalBaseQtyUp +转移预留关系:FTransReserveLink +赠品:FISFREE +第三方源单分录编码:FThirdSrcEntryId +备注:FSerialNote +序列号:FSerialId +序列号:FSerialNo +质量类型:FDeliChkQualifyType +通知单编号:FNoticeNo +基本单位数量旧值:FBaseQtyUp +销售订单EntryId:FSOEntryId +库存状态转换EntryId:FConvertEntryId +库存请检单EntryId:FQmEntryId +拒收标志:FRefuseFlag +退货备注:FRETURNNOTE +折扣率%:FDiscountRate +结算关联数量(辅单位):FJOINSECSETTQTY +保质期:FExpPeriod +保质期单位:FExpUnit +结算关联数量:FJoinSettleQty +客户物料名称:FCustMatName +客户物料编码:FCustMatId +未结算关联数量(基本单位):FJoinBaseUnSettQty +未结算关联数量:FJoinUnSettleQty +结算关联数量(基本单位):FJoinBaseSettQty +出库关联数量(辅单位):FSECOUTJOINQTY +捡货结果标记:FLotPickFlag +调拨数量(辅单位):FExtAuxUnitQty +辅单位:FExtAuxUnitId +销售数量:FSaleQty +销售基本数量:FSalBaseQty +销售单位:FSaleUnitId +结算可退数量(基本单位):FBaseSettCanRetQty +调入批号:FDestLot +退货关联数量(辅单位):FSECJOINQTY +消耗汇总:FIsConsumeSum +调入BOM:FDestBomId +调入物料:FDestMaterialId +总成本:FAmount +调出库存组织:FStockOutOrgId (必填项) +调拨类型:FTransferBizType (必填项) +调入货主:FOwnerIdHead +调拨方向:FTransferDirect (必填项) +调出货主:FOwnerOutIdHead +调出货主类型:FOwnerTypeOutIdHead (必填项) +调入库存组织:FStockOrgId (必填项) +单据状态:FDocumentStatus +单据编号:FBillNo +调入货主类型:FOwnerTypeIdHead (必填项) +单据类型:FBillTypeID (必填项) +日期:FDate (必填项) +创建人:FCreatorId +仓管员:FStockerId +作废状态:FCancelStatus +作废人:FCancellerId +备注:FNote +本位币:FBaseCurrId +库存组:FStockerGroupId +最后修改日期:FModifyDate +最后修改人:FModifierId +创建日期:FCreateDate +作废日期:FCancelDate +审核日期:FApproveDate +审核人:FApproverId +业务类型:FBizType +第三方源单编码:FThirdSrcBillNo +第三方源单内码:FThirdSrcId +价外税:FIsPriceExcludeTax +序列号上传:FScanBox +对应供应商:FSUPPLIERID +对应客户:FCustID +组织间结算跨法人标识:FIsInterLegalPerson +第三方系统:FThirdSystem +调入仓位:FDestStockLocId +调入仓库:FDestStockId (必填项) +调出仓位:FSrcStockLocId +成本价:FPrice +调拨数量:FQty +单位:FUnitID (必填项) +物料名称:FMaterialName +物料编码:FMaterialId (必填项) +调出仓库:FSrcStockId (必填项) +调出批号:FLot +规格型号:FModel +结算组织:FSettleOrgId +销售组织:FSaleOrgId +结算币别:FSETTLECURRID +汇率:FExchangeRate +跨组织业务类型:FTransferBizTypeId +是否含税:FIsIncludedTax +收款条件:FRecConditionId +结算方式:FSettleModeId +汇率类型:FExchangeTypeId +销售员:FSalerId +销售组:FSaleGroupId +销售部门:FSaleDeptId \ No newline at end of file diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/webapi测试的数据.txt b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/webapi测试的数据.txt new file mode 100644 index 0000000000..1f8e97b181 --- /dev/null +++ b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/webapi测试的数据.txt @@ -0,0 +1,5 @@ +{\"Creator\":\"\",\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"True\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"True\",\"ValidateFlag\":\"True\",\"NumberSearch\":\"True\",\"InterationFlags\":\"\",\"Model\":{\"FID\":0,\"FBillTypeID\":{\"FNUMBER\":\"ZJDB01_SYS\"},\"FBizType\":\"NORMAL\",\"FTransferDirect\":\"GENERAL\",\"FTransferBizType\":\"InnerOrgTransfer\",\"FSettleOrgId\":{\"FNumber\":\"101\"},\"FSaleOrgId\":{\"FNumber\":\"101\"},\"FStockOutOrgId\":{\"FNumber\":\"101\"},\"FOwnerTypeOutIdHead\":\"BD_OwnerOrg\",\"FOwnerOutIdHead\":{\"FNumber\":\"101\"},\"FStockOrgId\":{\"FNumber\":\"101\"},\"FIsIncludedTax\":true,\"FIsPriceExcludeTax\":true,\"FOwnerTypeIdHead\":\"BD_OwnerOrg\",\"FSETTLECURRID\":{\"FNUMBER\":\"PRE001\"},\"FOwnerIdHead\":{\"FNumber\":\"101\"},\"FDate\":\"2022-08-31 00:00:00\",\"FBaseCurrId\":{\"FNumber\":\"PRE001\"},\"FCustID\":{\"FNUMBER\":\"GYRHHR002529\"},\"FBillEntry\":[{\"FMaterialId\":{\"FNumber\":\" JX091054\"},\"FUnitID\":{\"FNumber\":\"liang\"},\"FQty\":1.0,\"FSrcStockId\":{\"FNumber\":\"CK001\"},\"FDestStockId\":{\"FNumber\":\"CK002\"},\"FSrcStockStatusId\":{\"FNumber\":\"KCZT01_SYS\"},\"FDestStockStatusId\":{\"FNumber\":\"KCZT01_SYS\"},\"FBusinessDate\":\"2022-08-31 00:00:00\",\"FOwnerTypeOutId\":\"BD_OwnerOrg\",\"FOwnerOutId\":{\"FNumber\":\"101\"},\"FOwnerTypeId\":\"BD_OwnerOrg\",\"FOwnerId\":{\"FNumber\":\"101\"},\"FBaseUnitId\":{\"FNumber\":\"liang\"},\"FBaseQty\":1.0,\"FISFREE\":false,\"FKeeperTypeId\":\"BD_KeeperOrg\",\"FKeeperId\":{\"FNumber\":\"101\"},\"FKeeperTypeOutId\":\"BD_KeeperOrg\",\"FKeeperOutId\":{\"FNumber\":\"101\"},\"FDestMaterialId\":{\"FNUMBER\":\" JX091054\"},\"FPriceUnitID\":{\"FNumber\":\"liang\"},\"FPriceQty\":1.0,\"FPriceBaseQty\":1.0,\"FTransReserveLink\":false}]}} + + + +{"formId":"STK_TransferDirect","data":"{\"Creator\":\"\",\"NeedUpDateFields\":[],\"NeedReturnFields\":[],\"IsDeleteEntry\":\"True\",\"SubSystemId\":\"\",\"IsVerifyBaseDataField\":\"false\",\"IsEntryBatchFill\":\"True\",\"ValidateFlag\":\"True\",\"NumberSearch\":\"True\",\"InterationFlags\":\"\",\"Model\":{\"FID\":0,\"FBillTypeID\":{\"FNUMBER\":\"ZJDB01_SYS\"},\"FBizType\":\"NORMAL\",\"FTransferDirect\":\"GENERAL\",\"FTransferBizType\":\"InnerOrgTransfer\",\"FSettleOrgId\":{\"FNumber\":\"101\"},\"FSaleOrgId\":{\"FNumber\":\"101\"},\"FStockOutOrgId\":{\"FNumber\":\"101\"},\"FOwnerTypeOutIdHead\":\"BD_OwnerOrg\",\"FOwnerOutIdHead\":{\"FNumber\":\"101\"},\"FStockOrgId\":{\"FNumber\":\"101\"},\"FIsIncludedTax\":true,\"FIsPriceExcludeTax\":true,\"FOwnerTypeIdHead\":\"BD_OwnerOrg\",\"FSETTLECURRID\":{\"FNUMBER\":\"PRE001\"},\"FOwnerIdHead\":{\"FNumber\":\"101\"},\"FDate\":\"2022-08-31 00:00:00\",\"FBaseCurrId\":{\"FNumber\":\"PRE001\"},\"FCustID\":{\"FNUMBER\":\"GYRHHR002529\"},\"FBillEntry\":[{\"FOwnerTypeOutId\":\"BD_OwnerOrg\",\"FDestStockStatusId\":{\"FNumber\":\"KCZT01_SYS\"},\"FPriceBaseQty\":1.0,\"FBaseQty\":1.0,\"FBusinessDate\":\"2022-08-31 00:00:00\",\"FLot\":{\"FNumber\":\"@KD_Flot\"},\"FOwnerOutId\":{\"FNumber\":\"101\"},\"FSrcStockStatusId\":{\"FNumber\":\"KCZT01_SYS\"},\"FDestStockId\":{\"FNumber\":\"CK002\"},\"FMaterialId\":{\"FNumber\":\" JX091054\"},\"FOwnerTypeId\":\"BD_OwnerOrg\",\"FDestMaterialId\":{\"FNUMBER\":\" JX091054\"},\"FOwnerId\":{\"FNumber\":\"101\"},\"FISFREE\":false,\"FKeeperId\":{\"FNumber\":\"101\"},\"FPriceUnitID\":{\"FNumber\":\"liang\"},\"FKeeperOutId\":{\"FNumber\":\"101\"},\"FQty\":1.0,\"FDestLot\":{\"FNumber\":\"1234567890\"},\"FBaseUnitId\":{\"FNumber\":\"liang\"},\"FKeeperTypeId\":\"BD_KeeperOrg\",\"FTransReserveLink\":false,\"FUnitID\":{\"FNumber\":\"liang\"},\"FPriceQty\":1.0,\"FSrcStockId\":{\"FNumber\":\"CK001\"},\"FKeeperTypeOutId\":\"BD_KeeperOrg\"}]}}"} \ No newline at end of file diff --git a/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/直接调拨单的参数必填备注.xlsx b/anrui-fin/anrui-fin-biz/src/main/java/com/yxt/anrui/fin/biz/kingdee/stktransferdirect/直接调拨单的参数必填备注.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0585c2881e2be659b05dee0cf0e86bae375a13cc GIT binary patch literal 10629 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