概述
使用 retrofit2
rxjava3
进行封装
常量
/** 金蝶接口配置 */
public static class Kingdee {
/** 金蝶仓位档案字段对应 */
public static class Common {
/** 区域 */
public static final String AREA_FIELD = "QUYU";
/** 货架 */
public static final String SHELVES_FIELD = "HUOJIA";
/** 位置号 */
public static final String LOCATION_FIELD = "WEIZHI";
}
/**
* K3Cloud 接口动作
*/
public static class Action {
public static final String SAVE = "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc";
public static final String VALIDATE_USER = "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc";
public static final String VIEW = "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.View.common.kdsvc";
public static final String SUBMIT = "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit.common.kdsvc";
public static final String AUDIT = "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc";
public static final String UN_AUDIT = "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.UnAudit.common.kdsvc";
public static final String STATUS_CONVERT = "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.StatusConvert.common.kdsvc";
public static final String EXECUTE_BILL_QUERY = "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc";
/** 即时库存查询 */
public static final String INVENTORY_QUERY = "/k3cloud/Kingdee.K3.SCM.WebApi.ServicesStub.InventoryQueryService.GetInventoryData.common.kdsvc";
}
/**
* 单据
*/
public static class Bill {
/** 发货通知单 */
public static final String SALE_DELIVERY_NOTICE = "SAL_DELIVERYNOTICE";
/** 销售出库单 */
public static final String SALE_OUT_STOCK = "SAL_OUTSTOCK";
/** 销售退库单 */
public static final String SAL_RETURNSTOCK = "SAL_RETURNSTOCK";
/** 组织机构档案 */
public static final String ORG_ORGANIZATIONS = "ORG_Organizations";
/** 采购订单 */
public static final String PUR_PURCHASEORDER = "PUR_PurchaseOrder";
/** 采购退料单 */
public static final String PUR_MRB = "PUR_MRB";
/** 其他入库单 */
public static final String STK_MISCELLANEOUS = "STK_MISCELLANEOUS";
/** 直接调拨单 */
public static final String STK_TRANSFER_DIRECT = "STK_TransferDirect";
/** 即时库存查询 */
public static final String STK_INVENTORY = "STK_Inventory";
/** 出库申请单 */
public static final String STK_OUT_STOCK_APPLY = "STK_OutStockApply";
/** 其他出库单 */
public static final String STK_OTHER_DELIVERY = "STK_MisDelivery";
/** 物料档案 */
public static final String BD_MATERIAL = "BD_MATERIAL";
}
/**
* 金蝶系统语言常量
*/
public static class Lang {
/**
* 简体中文
*/
public static final int ZH_CN = 2052;
/**
* 繁体
*/
public static final int ZH_TW = 3076;
/**
* 英文
*/
public static final int EN = 1033;
}
/**
* <p>金蝶第三方登录请求头常量</p>
* {@see <a href="https://vip.kingdee.com/knowledge/specialDetail/229961573895771136?category=229964512944566016&id=423060878259269120&productLineId=1">如何通过第三方登录授权方式访问星空接口</a>}
*/
public static class Header {
/**
* X-KDApi-AppID字符串中下划线“_”的前面部分,如'234803'
*/
public static final String X_API_CLIENT_ID = "X-Api-ClientID";
/**
* 固定2.0
*/
public static final String X_API_AUTH_VERSION = "X-Api-Auth-Version";
/**
* 当前时间戳字符串
* <p>如 1680574970</p>
*/
public static final String X_API_TIME_STAMP = "X-Api-TimeStamp";
/**
* 当前时间戳字符串,如'1680574970'
*/
public static final String X_API_NONCE = "X-Api-Nonce";
/**
* 固定字符串:'x-api-timestamp,x-api-nonce'
*/
public static final String X_API_SIGN_HEADERS = "X-Api-Signheaders";
/**
* 加密串
*/
public static final String X_API_SIGNATURE = "X-Api-Signature";
/**
* 配置文件中的X-KDApi-AppID
*/
public static final String X_KD_APPKEY = "X-Kd-Appkey";
/**
* 经过base64编码(基于utf-8)得到字符串
*/
public static final String X_KD_APPDATA = "X-Kd-Appdata";
/**
* 使用HmacSHA256加密算法,HmacSHA256(原文,密钥),得到X-Kd-Signature结果
*/
public static final String X_KD_SIGNATURE = "X-Kd-Signature";
}
/**
* 金蝶环境配置
*/
public static class Identify {
// ========== Prod 环境 ==========
/** X-KDApi-AppID */
public static final String APP_KEY = "268321_12eP1+EJzOr40//F6/7s2d1r3sxWTooo";
/** X-KDApi-AppSec */
public static final String APP_SECRET = "5898cb8118084d8ea0a5dae6940b1eee";
/** X-KDApi-AcctID */
public static final String ACCOUNT_ID = "64f53e764bbeee";
/** X-KDApi-UserName */
public static final String ACCOUNT_NAME = "demo";
}
}
金蝶接口
/** 金蝶接口 */
public interface KingdeeApi {
/**
* 查询金蝶业务单据
*/
@POST(Constant.Kingdee.Action.EXECUTE_BILL_QUERY)
Single<String> query(@Body KingdeeBaseParam<List<KingdeeQueryParam>> param, @HeaderMap Map<String, String> headers);
/** 保存金蝶业务单据 */
@POST(Constant.Kingdee.Action.SAVE)
Single<String> save(@Body KingdeeBaseParam<List<Serializable>> request, @HeaderMap Map<String, String> headers);
/** 提交金蝶业务单据 */
@POST(Constant.Kingdee.Action.SUBMIT)
Single<String> submit(@Body KingdeeBaseParam<List<Serializable>> request, @HeaderMap Map<String, String> headers);
/** 审核金蝶业务单据 */
@POST(Constant.Kingdee.Action.AUDIT)
Single<String> audit(@Body KingdeeBaseParam<List<Serializable>> request, @HeaderMap Map<String, String> headers);
/** 取消审核金蝶业务单据 */
@POST(Constant.Kingdee.Action.UN_AUDIT)
Single<String> unAudit(@Body KingdeeBaseParam<List<Serializable>> request, @HeaderMap Map<String, String> headers);
/**
* 即时库存查询
* <a href="https://vip.kingdee.com/article/86193102758814720?specialId=369853579080646400&productLineId=1&isKnowledge=2">自定义接口封装</a>
*
* @param request 请求参数
* @param headers 请求头
*/
@POST(Constant.Kingdee.Action.INVENTORY_QUERY)
Single<KingdeeResponse<List<InventoryCustom>>> getInventory(@Body KingdeeBaseParam<List<InventoryQueryParam>> request, @HeaderMap Map<String, String> headers);
}
Retrofit封装
@Module
@InstallIn(SingletonComponent.class)
public abstract class KingdeeModule {
@Provides
@Singleton
static KingdeeApi provideKingdeeApi(@Kingdee Retrofit retrofit) {
return retrofit.create(KingdeeApi.class);
}
/**
* <i>com.squareup.retrofit2:converter-scalars</i> 是 Retrofit 库的一个模块,用于将服务器响应的原始数据(例如字符串、数字等)转换为 Scalars 类型(即标量类型,比如 String、Boolean、Integer 等)。
* 在使用 Retrofit 进行网络请求时,服务器通常会返回各种类型的数据,包括 JSON、XML、纯文本等。Retrofit 默认支持将 JSON 或 XML 格式的响应转换为 Java 对象,但如果服务器返回的是原始的字符串或数字等标量数据,Retrofit 就无法直接将其转换为 Java 对象。
* 这时,你可以使用 <i>com.squareup.retrofit2:converter-scalars</i> 模块,它提供了将这些标量数据转换为 Java 对象的能力。使用 ScalarsConverter,你可以指定 Retrofit 将响应的原始数据转换为指定的标量类型,比如 String、Boolean、Integer 等。
* @param okHttpClient OkHttpClient 客户端
* @param repository 系统配置
* @return Retrofit
*/
@Provides
@Singleton
@Kingdee
static Retrofit provideKingdeeRetrofit(@Kingdee OkHttpClient okHttpClient, PreferenceRepository repository) {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String address = repository.getString(Constant.Configure.Preference.SERVICE_ADDRESS, Constant.Configure.Default.DEFAULT_SERVICE_ADDRESS);
Logger.d("初始化金蝶Retrofit,接口地址:%s", address);
URI uri = HttpUtil.toUri(address);
HttpUrl httpUrl = new HttpUrl.Builder()
.scheme(HttpUtil.getScheme(uri))
.host(HttpUtil.getHost(uri))
.port(HttpUtil.getPort(uri))
.build();
return new Retrofit.Builder()
.client(okHttpClient)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(JacksonConverterFactory.create(mapper))
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.baseUrl(httpUrl)
.build();
}
@Provides
@Singleton
@Kingdee
static OkHttpClient provideOkhttpClient() {
int timeOut = 60;
// 日志拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.cookieJar(new JavaNetCookieJar(cookieManager))
.connectTimeout(timeOut, TimeUnit.SECONDS)
.readTimeout(timeOut, TimeUnit.SECONDS)
.writeTimeout(timeOut, TimeUnit.SECONDS)
.retryOnConnectionFailure(true); // 错误重连
return builder.build();
}
@Provides
@Singleton
static KingdeeRepository provideBackendRepository(KingdeeApi api, LocalRepository repository) {
return new KingdeeRepository(api, repository);
}
Repository
/** 金蝶通用接口封装 */
public class KingdeeRepository {
private final KingdeeApi api;
private final LocalRepository repository;
@Inject
public KingdeeRepository(KingdeeApi api, LocalRepository localRepository) {
this.api = api;
this.repository = localRepository;
}
public KingdeeApi api() {
return api;
}
public LocalRepository localRepository() {
return repository;
}
/**
* 查询采购订单
*
* @param filters 查询条件
*/
public Single<String> queryPurchaseOrder(List<Filter> filters) {
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.PUR_PURCHASEORDER)
.field("FBillNo") // 单据编号
.field("FDate") // 采购日期
.field("Fid") // 单据头Id
.field("FBillTypeID.FNumber", "FBillTypeID.Fname") // 单据类型
.field("FBusinessType.FValue", "FBusinessType.FCaption") // 业务类型 index => 5
.field("FSupplierId.FNumber", "FSupplierId.Fname") // 供应商
.field("FPurchaserId.FNumber", "FPurchaserId.Fname") // 采购员
.field("FPurchaseOrgId.FNumber", "FPurchaseOrgId.Fname") // 采购组织 index => 11
.field("FPurchaseDeptId.FNumber", "FPurchaseDeptId.Fname") // 采购部门
.field("FPurchaserGroupId.FNumber", "FPurchaserGroupId.Fname") // 采购组
.field("FCreatorId.FUserAccount", "FCreatorId.Fname") // 创建人
.field("FChangeReason") // 变更原因
.field("FACCTYPE.FCaption") // 验收方式
// 供应商信息
.field("FSettleId.FNumber", "FSettleId.Fname") // 结算方 index => 21
.field("FChargeId.FNumber", "FChargeId.Fname") // 收款方
// 单据明细
.field("FPOOrderEntry_FEntryID", "FPOOrderEntry_fseq") // 单据行Id,单据行序号 index => 25
.field("FMaterialId.FNumber", "FMaterialId.Fname", "FMaterialId.FBARCODE") // 物料编码、物料名称、条码
.field("FModel") // 规格型号
.field("FQty", "FUnitId.FNumber", "FUnitId.Fname") // 采购数量、采购单位 index => 31
.field("FDeliveryDate") // 交货日期
.field("FRequireOrgId.FNumber", "FRequireOrgId.Fname") // 需求组织
.field("FRequireDeptId.FNumber", "FRequireDeptId.Fname") // 需求部门
.field("FReceiveOrgId.FNumber", "FReceiveOrgId.Fname") // 收料组织
.field("FReceiveDeptId.FNumber", "FReceiveDeptId.Fname") // 收料部门 index => 41
.field("FEntrySettleOrgId.FNumber", "FEntrySettleOrgId.Fname") // 结算组织
.field("FLot") // 批号
.field("FSupplierLot") // 供应商批号
.field("FGiveAway") // 是否赠品
.field("FRemainStockINQty") // 剩余入库数量
.field("FPriceUnitId.FNumber", "FPriceUnitId.Fname", "FPriceUnitQty") // 计价单位
.field("FPrice", "FTaxPrice") // 单价、含税单价
.field("FEntryDiscountRate", "FEntryDiscount") // 折扣率% 、 折扣额
.field("FTaxRate", "FTaxAmount") // 税率% 、 税额
.field("FBillAllAmount", "FEntryAmount") // 价税合计 、 金额
.field("FMaterialId.FCategoryID") // 存货类别
.field("FMaterialId.FMaterialGroup") // 物料分组
.field("FMaterialId.FIsKFPeriod") // 启用保质期管理
.filter(filters)
.build();
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询采购退料单
*
* @param filters 查询条件
*/
public Single<String> queryPurchaseReturnOrder(List<Filter> filters) {
WarehouseConfig area = repository.getWarehouseConfig(Constant.Kingdee.Common.AREA_FIELD);
WarehouseConfig shelves = repository.getWarehouseConfig(Constant.Kingdee.Common.SHELVES_FIELD);
WarehouseConfig location = repository.getWarehouseConfig(Constant.Kingdee.Common.LOCATION_FIELD);
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.PUR_MRB)
.field("FID") //实体主键
.field("FBillNo") //单据编号
.field("FBillTypeID.FNumber")//单据类型
.field("FMRDeptId.FNumber")//退料部门
.field("FMRDeptId.Fname")//退料部门名称
.field("FPURCHASEDEPTID.FNumber")//采购部门
.field("FPURCHASEDEPTID.Fname")//采购部门名称
.field("FDocumentStatus.FCaption") // 单据状态
.field("FStockOrgId.FNumber")//退料组织
.field("FStockOrgId.Fname")//退料组织名称
.field("FPurchaseOrgId.FNumber")//采购组织
.field("FPurchaseOrgId.Fname")//采购组织名称
.field("FDate")//退料日期
.field("FREPLENISHMODE")//补料方式
.field("FSupplierID.FNumber")//供应商
.field("FSupplierID.Fname")//供应商名称
.field("FRequireOrgId.FNumber")//需求组织
.field("FRequireOrgId.Fname")//需求组织名称
.field("FSTOCKERID.FNumber")//仓管员
.field("FSTOCKERID.Fname")//仓管员名称
.field("FPURCHASERID.FNumber")//采购员
.field("FPURCHASERID.Fname")//采购员名称
.field("FMRMODE")//退料方式
.field("FBusinessType")//业务类型
.field("FSTOCKERGROUPID.FNumber")//库存组
.field("FSTOCKERGROUPID.Fname")//库存组名称
.field("FPURCHASERGROUPID.FNumber")//采购组
.field("FPURCHASERGROUPID.Fname")//采购组名称
.field("FMRTYPE")//退料类型
.field("FACCTYPE")//验收方式
.field("FACCEPTORID.FNumber")//接收方
.field("FACCEPTORID.Fname")//接收方名称
.field("FSettleId.FNumber")//结算方
.field("FSettleId.Fname")//结算方名称
.field("FAcceptorContactID")//接收方联系人
.field("FCHARGEID.FNumber")//收款方
.field("FCHARGEID.Fname")//收款方名称
.field("FAcceptAddress")//接收方地址
.field("FAcceptEMail")//邮箱
//子表
.field("FPURMRBENTRY_FEntryID")//子表主键
.field("FMATERIALID.FNumber")//物料编码
.field("FMATERIALID.Fname")//物料名称
.field("FMateriaModel")//规格型号
.field("FTAXPRICE")//含税单价
.field("FENTRYTAXAMOUNT")//税额
.field("FALLAMOUNT")//价税合计
.field("FPRICECOEFFICIENT ")//价格系数
.field("FUPPRICE")//价格上限
.field("FInvoicedStatus")//开票结束状态
.field("FDISCOUNTRATE")//折扣率(%)
.field("FPriceDiscount")//单价折扣
.field("FTAXAMOUNT_LC")//税额(本位币)
.field("FPRICEUNITID")//计价单位
.field("FDOWNPRICE")//价格下限
.field("FENTRYTAXRATE")//税率
.field("FTAXNETPRICE")//净价
.field("FPriceListEntry")//分录价目表
.field("FAmount_LC")//金额(本位币)
.field("FPRICEUNITQTY")//计价数量
.field("FChargeProjectID")//费用项目
.field("FPrice")//单价
.field("FDiscount")//折扣额
.field("FCostAmount")//金额
.field("FALLAMOUNT_LC")//价税合计(本位币)
.field("FSYSPRICE")//系统定价
.field("FINVOICEDQTY")//已开票数量
.field("FUnitID.FNumber")//库存单位
.field("FUnitID.Fname")//库存单位名称
.field("FRMREALQTY")//实退数量
.field("FREPLENISHQTY")//补料数量
.field("FKEAPAMTQTY")//扣款数量
.field("FCarryUnitId")//采购单位
.field("FCarryQty")//采购数量
.field("FSTOCKID.FNumber")//仓库
.field(String.format("FStockLocId.%s.FNumber", area.getValue())) //区域
.field(String.format("FStockLocId.%s.FNumber", shelves.getValue())) //货架
.field(String.format("FStockLocId.%s.FNumber", location.getValue()))//位置号
.field("FProjectNo")//序号
.field("FStockStatusId.FNumber")//库存状态
.field("FStockBaseAPJoinQty")//关联应付数量(计价基本)
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询物料信息
*
* @param materialCode 物料编码
* @param useOrgCode 使用组织编码
*/
public Single<String> queryMaterial(String materialCode, String useOrgCode) {
List<Filter> filters = new ArrayList<>();
Filter materialFilter = Filter.builder()
.fieldName("FNumber")
.compare(67)
.value(materialCode)
.build();
filters.add(materialFilter);
Filter useOrgFilter = Filter.builder()
.fieldName("FUseOrgId.FNumber")
.compare(67)
.value(useOrgCode)
.build();
filters.add(useOrgFilter);
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.BD_MATERIAL)
.field("FNumber,FName,FDescription")
.field("FMnemonicCode") // 助记码
.field("FSpecification") // 规格型号
.field("FOldNumber") // 旧物料编码
.field("F_QQCI_Product") // 商品唯一码
// .field("F_QQCI_Display_Text") // 显示名称
.field("FMaterialGroup.FNumber,FMaterialGroup.Fname") // 物料分组
.field("FCategoryID.FNumber,FCategoryID.Fname") // 存货类别
.field("FBARCODE") // 条码
.field("FIsBatchManage") // 启用批号管理
.field("FIsKFPeriod") // 启用保质期管理
.field("FExpUnit.FCaption,FExpPeriod") // 保质期单位、保质期
.filter(filters)
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询其他入库单
*
* @param filters 查询条件
*/
public Single<String> queryOtherReceipts(List<Filter> filters) {
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.STK_MISCELLANEOUS)//其他入库单
.field("FID") //实体主键
.field("FBillNo") //单据编号
.field("FBillTypeID.FNumber", "FBillTypeID.FName") //单据类型
.field("FStockOrgId.FNumber", "FStockOrgId.FName") //库存组织
.field("FStockDirect.FValue", "FStockDirect.FCaption") //库存方向 index = 6
.field("FDate") //日期
.field("FSUPPLIERID.FNumber", "FSUPPLIERID.Fname") //供应商
.field("FDEPTID.FNumber", "FDEPTID.Fname")//部门
.field("FACCEPTANCE.FNumber", "FACCEPTANCE.FName") //验收员
.field("FSTOCKERID.FNumber", "FSTOCKERID.FName") //仓管员
.field("FSTOCKERGROUPID.FNumber", "FSTOCKERGROUPID.FName")//库存组
.field("FNOTE") //备注
.field("FCreatorId.FUserAccount", "FCreatorId.Fname") // 创建人 index =20
.field("FOwnerTypeIdHead.FValue", "FOwnerTypeIdHead.FCaption")// 货主类型
.field("FOwnerIdHead.FNumber", "FOwnerIdHead.Fname") // 货主
// 明细信息
.field("FEntity_FEntryID") // 子表主键
.field("FMATERIALID.FNumber", "FMATERIALID.Fname", "FMATERIALID.FBARCODE") // 物料
.field("FModel") //规格型号
.field("FSTOCKID.FNumber", "FSTOCKID.Fname") //收货仓库 index = 31
.field("FUnitID.FNumber", "FUnitID.Fname") // 单位
.field("FBASEUNITID.FNumber", "FBASEUNITID.Fname") // 基本单位
.field("FQty") //实收数量
.field("FPrice") // 成本价
.field("FPRODUCEDATE") // 生产日期
.field("FEXPIRYDATE") // 有效期至
.field("FSTOCKSTATUSID.FNumber", "FSTOCKSTATUSID.Fname") //库存状态
.field("FLOT") // 批号
.field("FEntryNote") // 备注
.field("FInstockDate") // 入库日期
.field(repository.getAreaField("FStockLocId.%s.FNumber"), repository.getAreaField("FStockLocId.%s.Fname")) // 区域 46
.field(repository.getShelvesField("FStockLocId.%s.FNumber"), repository.getShelvesField("FStockLocId.%s.Fname")) // 货架
.field(repository.getLocationField("FStockLocId.%s.FNumber"), repository.getLocationField("FStockLocId.%s.Fname")) // 位置
.field("FKEEPERID.FNumber", "FKEEPERID.FName") //保管者
.field("FSRCBILLTYPEID") // 源单类型
.field("FSRCBILLNO") // 源单编号
.field("F_QQCI_Material_Group_Code") // 物料分组编码
.field("F_QQCI_Material_Group_Name") // 物料分组
.filter(filters)
.build();
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询直接调拨单
*
* @param filters 查询条件
*/
public Single<String> queryDirectTransferOrder(List<Filter> filters) {
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.STK_TRANSFER_DIRECT)
.field("FID")
.field("FBillNo", "FDate")
.field("FBillTypeID.FNumber", "FBillTypeID.FName") //单据类型
.field("FStockOutOrgId.FNumber", "FStockOutOrgId.FName") // 调出库存组织
.field("FCustId.FNumber", "FCustId.Fname") // 客户
.field("FNote")
.field("FBillEntry_FEntryID") // 行标识(序号)、内码 index 10
.field("FMaterialId.FNumber", "FMaterialId.Fname")
.field("FMaterialId.FBARCODE", "FMaterialId.FOldNumber") // 商品码、旧物料编码
.field("FMaterialId.F_QQCI_Product", "FMaterialId.F_QQCI_CheckBox_review") // 商品唯一码、允许批量复核
.field("FMaterialId.FSpecification") // 规格型号
.field("FLot") // 调出批号
.field("FISFREE")
.field("FMaterialId.FMaterialGroup") // 物料分组 20
.field("FSrcBillNo") // 源单编号
.field("FMaterialId.FCategoryID") // 存货类别
.field("FBaseUnitID.FNumber", "FBaseUnitID.Fname") // 单位
.field("FSrcStockId.FNumber", "FSrcStockId.Fname") // 仓库
.field(repository.getAreaField("FSrcStockLocId.%s.FNumber"), repository.getAreaField("FSrcStockLocId.%s.Fname")) // 区域
.field(repository.getShelvesField("FSrcStockLocId.%s.FNumber"), repository.getShelvesField("FSrcStockLocId.%s.Fname")) // 货架
.field(repository.getLocationField("FSrcStockLocId.%s.FNumber"), repository.getLocationField("FSrcStockLocId.%s.Fname")) // 位置
.field("FMaterialId.FIsKFPeriod") // 启用保质期管理 33
.field("FProduceDate", "FExpPeriod", "FExpUnit", "FExpiryDate") // 生产日期、有效期至、保质期、保质期单位
.field("FOwnerTypeIdHead.FCaption", "FOwnerTypeIdHead.FValue") // 货主类型
.field("FOwnerIdHead.FNumber", "FOwnerIdHead.Fname") // 货主
.field("FNoteEntry")
.field("FQty") // 数量 43
.field("FKeeperId.FNumber", "FKeeperId.FName") // 保管者
.field("FMaterialId.F_QQCI_CheckBox_re5") // 是否溯源码追溯
.filter(filters)
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询发货通知单
*
* @param filters 查询条件
*/
public Single<String> queryShipmentNotice(List<Filter> filters) {
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.SALE_DELIVERY_NOTICE)
.field("FBillNo") // 单据编号
.field("FBillTypeID.FNumber", "FBillTypeID.Fname") // 单据类型
.field("FBussinessType.FCaption") // 业务类型
.field("FDocumentStatus.FCaption") // 单据状态
.field("FDate") // 日期
.field("FSaleOrgId.FNumber", "FSaleOrgId.Fname") // 销售组织
.field("FCorrespondOrgId.FNumber", "FCorrespondOrgId.Fname") // 对应组织
.field("FSaleDeptId.FNumber", "FSaleDeptId.Fname") // 销售部门
.field("FSaleGroupId.FNumber", "FSaleGroupId.Fname") // 销售组
.field("FSalesManID.FNumber", "FSalesManID.Fname") // 销售员 index=14,15
.field("FCustomerID.FNumber", "FCustomerID.Fname") // 客户
.field("FDeliveryOrgID.FNumber", "FDeliveryOrgID.Fname") // 发货组织
.field("FDeliveryDeptID.FNumber", "FDeliveryDeptID.Fname") // 发货部门
.field("FStockerGroupID.FNumber", "FStockerGroupID.Fname") // 库存组
.field("FStockerID.FNumber", "FStockerID.Fname") // 仓管员 index=24,25
.field("FCarrierID.FNumber", "FCarrierID.Fname") // 承运商
.field("FCarriageNO") // 运输单号
.field("FReceiverID.FNumber", "FReceiverID.Fname") // 收货方
.field("FLinkMan") // 收货人姓名
.field("FLinkPhone") // 联系电话
.field("FReceiveAddress") // 收货方地址
.field("FSettleID.FNumber", "FSettleID.Fname") // 结算方
.field("FPayerID.FNumber", "FPayerID.Fname") // 付款方
.field("FCreatorId.FUserAccount", "FCreatorId.Fname") // 创建人
.field("FCreateDate") // 创建日期
.field("FOwnerTypeIdHead.FValue") // 货主类型
.field("FOwnerIdHead.FNumber", "FOwnerIdHead.Fname") // 货主
.field("FNote") // 备注
.field("FID") // 内码
// 订单明细
.field("FEntity_fseq", "FEntity_FEntryID") // 行标识(序号)、内码 index=46,47
.field("FMaterialID.FNumber", "FMaterialID.Fname")
.field("FMateriaModel") // 规格型号
.field("FBaseUnitId.FNumber", "FBaseUnitId.Fname") // 基本单位 index=51,52
.field("FUnitId.FNumber", "FUnitId.Fname", "FQty") // 销售单位、数量 index=53,54,55
.field("FBaseUnitQty") // 销售基本数量
.field("FStockID.FNumber", "FStockID.Fname") // 出货仓库
.field("FDeliveryLoc") // 交货地点
.field("FDeliveryLAddress") // 交货地址
.field("FOutContROL") // 控制出库数量
.field("FOutMaxQty", "FOutMinQty") // 出库上限、出库下限 index=62,63
.field("FSumOutQty") // 累计出库数量
.field("FOrderNo", "FOrderSeq") // 订单单号、订单行号
.field("FPRODUCEDATE") // 生产日期
.field("FEXPPERIOD") // 保质期
.field("FEXPIRYDATE") // 有效期至
.field("FLot") // 批号
.field("FIsFree") // 是否赠品 index=71
.field("FRemainOutQty") // 未出库数量
.field("FStockStatusId.FNumber", "FStockStatusId.Fname") // 库存状态
.field("FPriceUnitId.FNumber", "FPriceUnitId.Fname", "FPriceUnitQty") // 计价单位、数量
.field("FPrice", "FTaxNetPrice", "FTaxPrice") // 单价、净价、含税单价
.field("FDeliveryDate") // 要货日期 index => 81
.field("FStockQty", "FStockBaseQty") // 库存数量、库存基本数量
.field("FStockUnitID.FNumber", "FStockUnitID.Fname") // 库存单位
.field("FOwnerTypeID.FCaption") // 货主类型
.field("FOwnerID.FNumber", "FOwnerID.Fname") // 货主
.field("FSOEntryId") // 销售订单EntryId
.field("FNoteEntry") // 行备注 index => 90
.field("FCustomerID.FGroup")
.field(repository.getAreaField("FStockLocID.%s.FNumber"), repository.getAreaField("FStockLocID.%s.Fname")) // 区域
.field(repository.getShelvesField("FStockLocID.%s.FNumber"), repository.getShelvesField("FStockLocID.%s.Fname")) // 货架
.field(repository.getLocationField("FStockLocID.%s.FNumber"), repository.getLocationField("FStockLocID.%s.Fname")) // 位置
.field("F_QQCI_ASSISTANT_DJLY.FNumber", "F_QQCI_ASSISTANT_DJLY.FDataValue") // 单据来源
.field("F_QQCI_BASEDJXM.FNumber", "F_QQCI_BASEDJXM.Fname") // 单据项目
.field("FEntryTaxRate") // 税率
.field("FDiscountRate") // 折扣率
.field("FMaterialId.FBARCODE") // 商品码 index => 104
.field("F_QQCI_Assistant_dp.FNumber", "F_QQCI_Assistant_dp.FDataValue") // 店铺
.field("F_QQCI_YDH") // 唯一单号
.field("F_QQCI_Text_Province", "F_QQCI_Text_City", "F_QQCI_Text_County") // 省、市、区
.field("FMaterialId.FIsKFPeriod") // 启用保质期管理
.field("FJoinOutQty") // 关联出库数量 index => 112
.field("F_QQCI_Base_wlfz.FNumber", "F_QQCI_Base_wlfz.FName") // 物料分组
.filter(filters)
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询销售出库单
*
* @param filters 查询条件
*/
public Single<String> querySalesOutbound(List<Filter> filters) {
WarehouseConfig area = repository.getWarehouseConfig(Constant.Kingdee.Common.AREA_FIELD);
WarehouseConfig shelves = repository.getWarehouseConfig(Constant.Kingdee.Common.SHELVES_FIELD);
WarehouseConfig location = repository.getWarehouseConfig(Constant.Kingdee.Common.LOCATION_FIELD);
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.SALE_OUT_STOCK)
.filter(filters)
.field("FBillNo") // 单据编号
.field("FDate") // 日期
.field("FDocumentStatus") // 单据状态
.field("FBillTypeID.FNumber", "FBillTypeID.Fname") // 单据类型
.field("FBussinessType.FCaption") // 业务类型
.field("FSaleOrgId.FNumber", "FSaleOrgId.Fname") // 销售组织
.field("FCorrespondOrgId.FNumber", "FCorrespondOrgId.Fname") // 对应组织
.field("FStockOrgId.FNumber", "FStockOrgId.Fname") // 发货组织 index => 10,11
.field("FDeliveryDeptID.FNumber", "FDeliveryDeptID.Fname") // 发货部门
.field("FCustomerID.FNumber", "FCustomerID.Fname") // 客户
.field("FSaleDeptID.FNumber", "FSaleDeptID.Fname") // 销售部门
.field("FSalesGroupID.FNumber", "FSalesGroupID.Fname") // 销售组
.field("FStockerGroupID.FNumber", "FStockerGroupID.Fname") // 库存组 index => 20,21
.field("FStockerID.FNumber", "FStockerID.Fname") //仓管员
.field("FSalesManID.FNumber", "FSalesManID.Fname") // 销售员
.field("FCarrierID.FNumber", "FCarrierID.Fname") // 承运商
.field("FCarriageNO") // 运输单号
.field("FLogisticsNos") // 物流单号
.field("FReceiverID.FNumber", "FReceiverID.Fname") // 收货方 index => 30,31
.field("FReceiverContactID") // 收货方联系人
.field("FLinkMan") // 收货人姓名
.field("FLinkPhone") // 联系电话
.field("FReceiveAddress") // 收货方地址
.field("FHeadLocationId") // 交货地点
.field("FSettleID.FNumber", "FSettleID.Fname") // 结算方
.field("FPayerID.FNumber", "FPayerID.Fname") // 付款方
.field("FCreateDate") // 创建日期 index => 41
.field("FCreatorId.FUserAccount", "FCreatorId.Fname") // 创建人
.field("FOwnerTypeIdHead.FCaption") // 货主类型
.field("FOwnerIdHead.FNumber", "FOwnerIdHead.Fname") // 货主
.field("FID") // 内码
.field("FNote") //备注
// 明细信息
.field("FCustMatID") // 客户物料编码 index => 49
.field("FMaterialId.FNumber", "FMaterialId.Fname") // 物料
.field("FMaterialID_Sal.FNumber", "FMaterialID_Sal.Fname") // 物料(销售组织)
.field("FUnitID.FNumber", "FUnitID.Fname") // 库存单位
.field("FBaseUnitID.FNumber", "FBaseUnitID.Fname") // 基本单位
.field("FPriceUnitId.FNumber", "FPriceUnitId.Fname") // 计价单位
.field("FSalUnitID.FNumber", "FSalUnitID.Fname") // 销售单位 index => 60,61
.field("FSALUNITQTY") // 销售数量
.field("FMustQty") // 应发数量
.field("FPriceUnitQty") // 计价数量
.field("FBaseMustQty") // 基本单位应发数量
.field("FRealQty") // 实发数量
.field("FPrice") // 单价
.field("FTaxNetPrice") // 净价
.field("FAmount") // 金额
.field("FPriceCoefficient") // 价格系数 index => 70
.field("FTaxPrice") // 含税单价
.field("FTaxCombination") // 税组合
.field("FEntryTaxRate") // 税率%
.field("FEntryTaxAmount") // 税额
.field("FAllAmount") // 价税合计
.field("FStockID.FNumber", "FStockID.Fname") // 仓库
.field("FStockStatusID.FNumber", "FStockStatusID.Fname") // 库存状态
.field("FOwnerTypeID.FCaption") // 货主类型 index => 80
.field("FOwnerID.FNumber", "FOwnerID.Fname") // 货主
.field("FKeeperTypeID.FCaption") // 保管者类型
.field("FKeeperId") //保管者
.field("FEntrynote") // 行备注
.field("FBaseUnitQty") // 库存基本数量
.field("FAuxUnitID.FNumber", "FAuxUnitID.Fname") // 库存辅单位
.field("FAuxUnitQty") // 库存辅单位数量
.field("FCostPrice") // 成本价(本位币) index => 90
.field("FEntryCostAmount") // 总成本
.field("FReturnQty") // 关联退货数量
.field("FSumRetNoticeQty") // 累计退货通知数量
.field("FSumRetStockQty") // 累计退货数量
.field("FSoorDerno") // 订单单号
.field("FSrcType") // 源单类型
.field("FStockID") // 仓位
.field("FStockLocID") // 仓位
.field("FProduceDate") // 生产日期
.field("FExpiryDate") // 有效期至 index => 100
.field("FLot") // 批号
.field("FIsFree") // 是否赠品
.field("FSOEntryId") // 销售订单EntryId
.field("FEntity_fseq", "FEntity_FEntryID") // 行标识(序号)、内码
.field("FMaterialId.FSpecification") // 规格型号
.field("FMateriaType") // 存货类别
.field("FExpiryPeriod", "FExpiryPeriodUnit") // 保质期单位
.field(String.format("FStockLocID.%s.FNumber", area.getValue()), String.format("FStockLocID.%s.Fname", area.getValue())) // 区域 index = 110
.field(String.format("FStockLocID.%s.FNumber", shelves.getValue()), String.format("FStockLocID.%s.Fname", shelves.getValue())) // 货架
.field(String.format("FStockLocID.%s.FNumber", location.getValue()), String.format("FStockLocID.%s.Fname", location.getValue())) // 位置
.field("F_QQCI_Base_wlfz.FNumber") // 物料分组编码 index = 116
.field("FMaterialId.FBARCODE") // 条码
.field("FCustomerID.FGroup") // 客户类别
.field("F_QQCI_Text_tzk") // 唯一号
.field("FMaterialId.F_QQCI_CheckBox_re5") // 是否溯源码追溯
.field("FMaterialId.FOldNumber") // 旧物料编码
.field("F_QQCI_Text_Province", "F_QQCI_Text_City", "F_QQCI_Text_County") // 省、市、区
.field("F_QQCI_Base_wlfz.FName") // 物料分组名称
.field("FMaterialId.F_QQCI_CheckBox_review") // 允许编辑复核数量
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询销售退库单
*
* @param filters 查询条件
*/
public Single<String> querySalesReturnOrder(List<Filter> filters) {
WarehouseConfig area = repository.getWarehouseConfig(Constant.Kingdee.Common.AREA_FIELD);
WarehouseConfig shelves = repository.getWarehouseConfig(Constant.Kingdee.Common.SHELVES_FIELD);
WarehouseConfig location = repository.getWarehouseConfig(Constant.Kingdee.Common.LOCATION_FIELD);
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.SAL_RETURNSTOCK)//销售退库单
.field("FID") //实体主键
.field("FBillNo") //单据编号
.field("FBillTypeID.FNumber")//单据类型
.field("FBillTypeID.Fname")//单据类型名称
.field("FDate")//日期
.field("FDocumentStatus")//单据状态
.field("FSaleOrgId.FNumber")//销售组织
.field("FSaleOrgId.Fname")//销售组织名称
.field("FSaledeptid.FNumber")//销售部门
.field("FSaledeptid.Fname")//销售部门名称
.field("FRetcustId.FNumber")//退货客户
.field("FRetcustId.Fname")//退货客户名称
.field("FRetcustId.FGroup")//退货客户分组
.field("FSettleCurrId.FNumber")//结算币别
.field("FSettleCurrId.Fname")//结算币别名称
.field("FReturnReason")//退货原因
.field("FHeadLocId.FNumber")//交货地点
.field("FHeadLocId.Fname")//交货地点名称
.field("FSaleGroupId.FNumber")//销售组
.field("FSaleGroupId.Fname")//销售组名称
.field("FSalesManId.FNumber")//销售员
.field("FSalesManId.Fname")//销售员名称
.field("FStockOrgId.FNumber")//库存组织
.field("FStockOrgId.Fname")//库存组织名称
.field("FStockDeptId.FNumber")//库存部门
.field("FStockDeptId.Fname")//库存部门名称
.field("FStockerGroupId.FNumber")//库存组
.field("FStockerGroupId.Fname")//库存组名称
.field("FStockerId.FNumber")//仓管员
.field("FStockerId.Fname")//仓管员名称
.field("FEntity_FEntryID ")//子表主键
.field("FMaterialId.FNumber")//物料编码
.field("FMaterialId.FName")//物料名称
.field("FMaterialModel")//规格型号
.field("FAuxPropId")//辅助属性
.field("FUnitID.FNumber")//单位
.field("FUnitID.Fname")//单位名称
.field("FRealQty")//实退数量
.field("FExtAuxUnitId")//辅单位
.field("FExtAuxUnitQty")//实退数量(辅单位)
.field("FStockId.FNumber")//仓库
.field("FStockId.Fname")//仓库名称
.field("FStockLocId")//仓位
.field("FLot")//批号
.field("FProduceDate")//生产日期
.field("FExpiryDate")//有效期至
.field("FStockStatusId.FNumber")//库存状态
.field("FStockStatusId.Fname")//库存状态名称
.field("FBomId")//BOM版本
.field("FMtoNo")//计划跟踪号
.field("FOwnerId.FNumber")//货主
.field("FOwnerId.Fname")//货主名称
.field("FKeeperTypeId")//保管者类型
.field("FKeeperId")//保管者
.field("FSrcBillTypeId")//源单类型
.field("FSrcBillNo")//源单编号
.field("FProjectNo")//序号
.field(String.format("FStockLocID.%s.FNumber", area.getValue()), String.format("FStockLocID.%s.Fname", area.getValue())) // 区域 index = 57
.field(String.format("FStockLocID.%s.FNumber", shelves.getValue()), String.format("FStockLocID.%s.Fname", shelves.getValue())) // 货架
.field(String.format("FStockLocID.%s.FNumber", location.getValue()), String.format("FStockLocID.%s.Fname", location.getValue())) // 位置
.field("FIsFree")//是否赠品
.field("FMustqty")//应退数量
.field("F_QQCI_Material_Group_Code", "F_QQCI_Material_Group_Name") // 物料分组 65 66
.field("FMaterialType") // 物料类别
.filter(filters)
.build();
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询出库申请单
*
* @param filters 查询条件
*/
public Single<String> queryOutStockApply(List<Filter> filters) {
WarehouseConfig area = repository.getWarehouseConfig(Constant.Kingdee.Common.AREA_FIELD);
WarehouseConfig shelves = repository.getWarehouseConfig(Constant.Kingdee.Common.SHELVES_FIELD);
WarehouseConfig location = repository.getWarehouseConfig(Constant.Kingdee.Common.LOCATION_FIELD);
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.STK_OUT_STOCK_APPLY)
.filter(filters)
.field("FID", "FBillNo", "FDate")
.field("FDocumentStatus.FCaption", "FDocumentStatus.FValue") // 单据状态
.field("FBillTypeID.FNumber", "FBillTypeID.Fname") // 单据类型
.field("FBizType.FCaption", "FBizType.FValue") // 业务类型
.field("FApplyType.FNumber", "FApplyType.FDataValue") // 申请类型
.field("FStockOrgId.FNumber", "FStockOrgId.Fname") // 申请组织
.field("FDeptId.FNumber", "FDeptId.Fname") // 领用部门
.field("FCustId.FNumber", "FCustId.Fname") // 客户
.field("FNote") // 备注
.field("FCreatorId.FUserAccount", "FCreatorId.Fname") // 创建人
.field("FCreateDate") // 创建日期
.field("FOwnerTypeIdHead.FCaption", "FOwnerTypeIdHead.FValue") // 货主类型
.field("F_QQCI_Text_shr") // 收货人姓名
.field("F_QQCI_Text_dh") // 联系电话
.field("F_QQCI_Note_UKY") // 收货地址
.field("F_QQCI_Text_wldh") // 物流单号
// 明细信息
.field("FEntity_fseq", "FEntity_FEntryID") // 行标识(序号)、内码
.field("FMaterialId.FNumber", "FMaterialId.FBARCODE", "FMaterialName") // 物料
.field("FMaterialId.FOldNumber") // 旧物料编码
.field("FMaterialId.F_QQCI_CheckBox_re5") // 是否溯源码追溯
.field("FModel") // 规格型号
.field("F_QQCI_Base_wlfz.FNumber") // 物料分组
.field("FUnitID.FNumber", "FUnitID.Fname") // 单位
.field("FStockId.FNumber", "FStockId.Fname") // 仓库
.field("FQty", "FBaseQty", "FSecQty") // 申请数量、申请数量(基本单位)、申请数量(库存辅单位)
.field("FProduceDate", "FKFPeriod", "FKFPeriodUnit", "FExpiryDate") // 生产日期、保质期、保质期单位、有效期至
.field("FMtoNo") // 计划跟踪号
.field("FStockStatusID.FNumber", "FStockStatusID.Fname") // 库存状态
.field("FOwnerTypeId.FCaption", "FOwnerTypeId.FValue") // 货主类型
.field("FOwnerId.FNumber", "FOwnerId.Fname") // 货主
.field("FBomId")
.field("FBaseUnitId.FNumber", "FBaseUnitId.Fname") // 基本单位
.field("FSecUnitId.FNumber", "FSecUnitId.Fname") // 库存辅单位
.field("FExtAuxUnitId.FNumber", "FExtAuxUnitId.Fname") // 辅单位
.field("FNormalJoinBaseQty") // 普通出库关联数量(基本单位)
.field(String.format("FStockLocId.%s.FNumber", area.getValue()), String.format("FStockLocId.%s.Fname", area.getValue())) // 区域
.field(String.format("FStockLocId.%s.FNumber", shelves.getValue()), String.format("FStockLocId.%s.Fname", shelves.getValue())) // 货架
.field(String.format("FStockLocId.%s.FNumber", location.getValue()), String.format("FStockLocId.%s.Fname", location.getValue())) // 位置
.field("FLot")
.field("FEntryNote") // index 69
.field("FExtAuxUnitQty") // 申请数量(辅单位)
.field("FTotalBaseQty") // 累计出库数量(基本单位)
.field("FReturnBaseQty") // 退货出库数量(基本单位)
.field("FReturnJoinBaseQty") // 退货出库关联数量(基本单位)
.field("FNormalBaseQty") // 普通出库数量(基本单位) index 74
.field("FNormalJoinQty") // 普通出库关联数量(库存辅单位)
.field("FNormalQty") // 普通出库数量(库存辅单位)
.field("FReturnJoinSecQty") // 退货出库关联数量(库存辅单位)
.field("FReturnSecQty") // 退货出库数量(库存辅单位)
.field("FTotalSecQty") // 累计出库数量(库存辅单位)
.field("FStockOrgIdEntry.FNumber", "FStockOrgIdEntry.FName")
.field("FMaterialId.FIsKFPeriod") // 启用保质期管理
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询其他出库单
*
* @param filters 查询条件
*/
public Single<String> queryOtherDelivery(List<Filter> filters) {
WarehouseConfig area = repository.getWarehouseConfig(Constant.Kingdee.Common.AREA_FIELD);
WarehouseConfig shelves = repository.getWarehouseConfig(Constant.Kingdee.Common.SHELVES_FIELD);
WarehouseConfig location = repository.getWarehouseConfig(Constant.Kingdee.Common.LOCATION_FIELD);
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.STK_OTHER_DELIVERY)//其他出库单
.field("FID") //实体主键
.field("FBillNo") //单据编号
.field("FDocumentStatus.FCaption", "FDocumentStatus") // 单据状态
.field("FStockOrgId.FNumber", "FStockOrgId.Fname") // 库存组织
.field("FDate") //日期
.field("FBillTypeID.FNumber", "FBillTypeID.Fname") //单据类型
.field("FOwnerTypeIdHead.FCaption", "FOwnerTypeIdHead.FValue") // 货主类型
.field("FOwnerIdHead.FNumber", "FOwnerIdHead.Fname") //货主
.field("FStockDirect.FValue", "FStockDirect.FCaption") //库存方向 // index 13
.field("FDeptId.FNumber", "FDeptId.Fname") //领料部门
.field("FPickerId.FNumber", "FPickerId.Fname") //领料人
.field("FNote") // 备注 index 19
.field("FCustId.FNumber", "FCustId.Fname") // 客户
.field("FStockerId.FNumber", "FStockerId.Fname") //仓管员
.field("FStockerGroupId.FNumber", "FStockerGroupId.Fname") //库存组
.field("FCreatorId.FUserAccount", "FCreatorId.Fname") // 创建人
.field("FCreateDate") // 创建日期 index 28
.field("FBizType.FCaption", "FBizType.FValue") // 业务类型
.field("FPickOrgId.FNumber", "FPickOrgId.Fname") // 领用组织
.field("FTransferBizType.FNumber", "FTransferBizType.Fname") // 跨组织业务类型
.field("FIsInterLegalPerson") // 组织间结算跨法人标识
.field("F_QQCI_ApplyType_qtr.FNumber", "F_QQCI_ApplyType_qtr.FDataValue") // 领用类型
.field("F_QQCI_Text_dh") // 联系电话
.field("F_QQCI_Text_shr") // 收货人姓名
.field("F_QQCI_Text_wldh") // 物流单号
.field("F_QQCI_Note_uky") // 收货地址
// 明细信息
.field("FEntity_FEntryID") //子表主键
.field("FMaterialId.FNumber", "FMaterialId.FBARCODE", "FMaterialName") // 物料
.field("FMaterialId.FOldNumber") // 旧物料编码
.field("FMaterialId.F_QQCI_CheckBox_re5") // 是否溯源码追溯
.field("FMaterialId.FIsKFPeriod") // 启用保质期管理
.field("FCustMatId") // 客户物料编码 index 49
.field("F_QQCI_Base_wlfz.FNumber") // 物料分组
.field("FStockId.FNumber", "FStockId.Fname") // 发货仓库
.field(String.format("FStockLocId.%s.FNumber", area.getValue()))//区域
.field(String.format("FStockLocId.%s.FNumber", shelves.getValue()))//货架
.field(String.format("FStockLocId.%s.FNumber", location.getValue()))//位置号
.field("FQty", "FBaseQty", "FSecQty") // 实发数量、实发数量(基本单位)、实发数量(库存辅单位) index 56
.field("FPrice") // 成本价
.field("FAmount") // 总成本
.field("FUnitID.FNumber", "FUnitID.Fname") // 单位
.field("FBaseUnitId.FNumber", "FBaseUnitId.Fname") // 基本单位
.field("FSecUnitId.FNumber", "FSecUnitId.Fname") // 库存辅单位 index 65
.field("FExtAuxUnitId.FNumber", "FExtAuxUnitId.Fname") // 辅单位
.field("FProjectNo") // 项目编号 index 69
.field("FProduceDate", "FExpiryDate") // 生产日期、有效期至
.field("FMtoNo") // 计划跟踪号
.field("FStockStatusId.FNumber", "FStockStatusId.Fname") // 库存状态
.field("FOwnerTypeId.FCaption", "FOwnerTypeId.FValue") // 货主类型
.field("FOwnerId.FNumber", "FOwnerID.Fname")
.field("FKeeperTypeId.FValue", "FKeeperTypeId.FCaption") // 保管者类型
.field("FKeeperId.FNumber", "FKeeperId.FName") // 保管者 index 81
.field("FBomId") // BOM版本
.field("FStockFlag") // 库存更新标识
.field("FJoinQty") // 关联数量
.field("FBaseJoinQty") // 关联数量(基本单位)
.field("FSrcBillTypeId") // 源单类型 index 87
.field("FSrcBillNo") // 源单编号
.field("FLot") // 批号
.field("FEntryNote") // 备注
.field("FSNUnitID") // 序列号单位 index 91
.field("FSNQty") // 序列号单位数量
.field("FSECJOINQTY") // 关联数量(辅单位)index 93
.field("FExtAuxUnitQty") // 实发数量(辅单位)
.field("FPRODUCTGROUPID") // 产品组 index 95
.field("FREFQTY") // 参考实发数量
.field("FREFBASEQTY") // 参考实发数量(基本单位) index 97
.field("FREFEXTAUXUNITQTY") // 参考实发数量(辅单位)
.field("FREFSECQTY") // 参考实发数量(库存辅单位)
.field("FREFAMOUNT") // 参考总成本
.field("FMaterialId.FSpecification") // 规格型号
.field("F_QQCI_Base_wlfz.FName") // 物料分组名称
.field("FMaterialId.F_QQCI_CheckBox_review") // 允许编辑复核数量
.filter(filters)
.build();
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询库存(标准查询接口)
* <ul>
* <li>物料编码,多个使用逗号分割</li>
* <li>组织编码,多个使用逗号分割</li>
* <li>仓库编码,多个使用逗号分割</li>
* <li>批次号,多个使用逗号分割</li>
* </ul>
*/
public Single<String> getInventory(List<Filter> filters) {
WarehouseConfig area = repository.getWarehouseConfig(Constant.Kingdee.Common.AREA_FIELD);
WarehouseConfig shelves = repository.getWarehouseConfig(Constant.Kingdee.Common.SHELVES_FIELD);
WarehouseConfig location = repository.getWarehouseConfig(Constant.Kingdee.Common.LOCATION_FIELD);
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.STK_INVENTORY)
.filter(filters)
.field("FStockID.FNumber", "FStockID.Fname") // 仓库
.field("FKeeperId.FNumber", "FKeeperId.FName") // 保管者
.field("FKeeperTypeId.FValue", "FKeeperTypeId.FCaption") // 保管者类型
.field("FOwnerId.FNumber", "FOwnerId.Fname") // 货主
.field("FOwnerTypeId.FValue", "FOwnerTypeId.FCaption") // 货主类型
.field("FMaterialId.FNumber", "FMaterialId.Fname", "FMaterialId.FBARCODE") // 物料编码、物料名称、条码 12
.field("FModel") // 规格型号 index 13
.field("FLot") // 批号
.field("FProjectNo") // 项目编号
.field("FStockOrgId.FNumber", "FStockOrgId.FName") // 库存组织 index 17
.field("FBaseUnitId.FNumber", "FBaseUnitId.Fname") // 基本单位
.field("FSecUnitId.FNumber", "FSecUnitId.Fname") // 库存辅单位 index
.field("FStockUnitId.FNumber", "FStockUnitId.Fname") // 库存主单位
.field("FLockQty") // 预留量(主单位)
.field("FSecLockQty") // 预留量(辅单位)
.field("FBaseQty") // 库存量(基本单位)
.field("FQty") // 库存量(主单位) index 27
.field("FMtoNo") // 计划跟踪号
.field("FBaseLockQty") // 预留量(基本单位)
.field("FProduceDate") // 生产日期
.field("FExpiryDate") // 有效期至
.field("FStockStatusId.FNumber", "FStockStatusId.Fname") //库存状态
.field("FAVBQty") // 可用量(主单位) 34
.field("FBaseAVBQty") // 可用量(基本单位) index 35
.field("FSecAVBQty") // 可用量(库存辅单位)
.field("FUpdateTime") // 最后更新日期
.field("FMaterialId.FMaterialGroup") // 物料分组 38
.field(String.format("FStockLocID.%s.FNumber", area.getValue()), String.format("FStockLocID.%s.Fname", area.getValue())) // 区域 index 39 40
.field(String.format("FStockLocID.%s.FNumber", shelves.getValue()), String.format("FStockLocID.%s.Fname", shelves.getValue())) // 货架 41 42
.field(String.format("FStockLocID.%s.FNumber", location.getValue()), String.format("FStockLocID.%s.Fname", location.getValue())) // 位置 43 44
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询库存(自定义接口)
* <pre>基于目前使用Api接口情况的反馈,在使用系统自带的【即时库存】WebApi接口时,只有基本单位数量以及辅单位数量是能直接使用,其他单位数量以及可用量情况都需要调用其他接口经过换算、计算才能得到,为便于大家使用,也是对现有即时库存Api接口的一个补充,我们封装了新的【即时库存查询】Api接口。</pre>
* <a href="https://vip.kingdee.com/article/86193102758814720?specialId=369853579080646400&productLineId=1&isKnowledge=2">原文链接</a>
*
* @param observer
*/
public Disposable getInventoryWithCustom(InventoryQueryParam queryParam, DisposableSingleObserver<KingdeeResponse<List<InventoryCustom>>> observer) {
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.INVENTORY_QUERY);
KingdeeBaseParam<List<InventoryQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(queryParam));
return api.getInventory(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.subscribeWith(observer);
}
/**
* 获取库存组织
*
* @return Disposable
*/
public Single<String> getOrganization() {
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId(Constant.Kingdee.Bill.ORG_ORGANIZATIONS)
.filter(Filter.builder()
.fieldName("FDocumentStatus")
.compare(105)
.value("C")
.build())
.field("FNumber", "FName") // 编码、名称
.field("FDescription") // 描述
.field("FOrgFormID.FValue", "FOrgFormID.FCaption") // 形态
.field("FAcctOrgType.FValue", "FAcctOrgType.FCaption") // 核算组织类型
.field("FIsBusinessOrg") // 业务组织
.field("FIsAccountOrg") // 核算组织
.field("FOrgFunctions.FValue", "FOrgFunctions.FCaption") // 组织职能
.order("FNumber")
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 获取组织下仓库档案
*
* @param organizationCode 组织编码
* @return Disposable
*/
public Single<String> getWarehouse(String organizationCode) {
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId("BD_STOCK")
.filter(Filter.builder()
.fieldName("FUseOrgId.FNumber")
.compare(67)
.value(organizationCode)
.build())
.filter(Filter.builder()
.fieldName("FDocumentStatus")
.compare(105)
.value("C")
.build())
.field("FNumber")
.field("Fname")
.field("FDescription")
.field("FCreateOrgId.FNumber", "FCreateOrgId.Fname")
.field("FPrincipal") // 仓库负责人
.field("FIsOpenLocation") // 启用仓位管理
.field("FAllowMinusQty") // 允许即时库存负库存
.field("FAddress")
.field("FStockProperty.FCaption") // 仓库属性
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 查询仓位值集
*/
public Single<String> getWarehouseConfig() {
KingdeeQueryParam params = KingdeeQueryParam.builder()
.formId("BD_FLEXVALUES")
.field("FFLEXNUMBER")
.field("FNUMBER")
.field("FNAME")
.build();
Map<String, String> headerMap = KingdeeUtil.buildHeader(Constant.Kingdee.Action.EXECUTE_BILL_QUERY);
KingdeeBaseParam<List<KingdeeQueryParam>> query = new KingdeeBaseParam<>();
query.setParameters(Collections.singletonList(params));
return api.query(query, headerMap)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation());
}
/**
* 保存金蝶业务单据
*
* @param param 单据数据
*/
public Single<String> save(KingdeeBaseParam<List<Serializable>> param) {
Map<String, String> header = KingdeeUtil.buildHeader(Constant.Kingdee.Action.SAVE);
return api.save(param, header);
}
/**
* 提交金蝶业务单据
*
* @param param 单据数据
*/
public Single<String> submit(KingdeeBaseParam<List<Serializable>> param) {
Map<String, String> header = KingdeeUtil.buildHeader(Constant.Kingdee.Action.SUBMIT);
return api.submit(param, header);
}
/**
* 审核金蝶业务单据
*
* @param param 单据数据
*/
public Single<String> audit(KingdeeBaseParam<List<Serializable>> param) {
Map<String, String> header = KingdeeUtil.buildHeader(Constant.Kingdee.Action.AUDIT);
return api.audit(param, header);
}
/**
* 反审核金蝶业务单据
*
* @param param 单据数据
*/
public Single<String> unAudit(KingdeeBaseParam<List<Serializable>> param) {
Map<String, String> header = KingdeeUtil.buildHeader(Constant.Kingdee.Action.UN_AUDIT);
return api.unAudit(param, header);
}
}
文章评论