syntax = "proto3";

package com.ywt.gapi.sf;

option java_multiple_files = true;
option java_package = "com.ywt.gapi.sf";
option java_outer_classname = "SfProto";

//注释约定：
//R:Required,必填
//O:Optional,可选的，非必填
//C:Conditional,条件的，在某条件下为必填，在描述中会对此说明

//顺丰下单接口request.
//暂不支持跨境寄件，暂未支持路由推送注册，暂未支持子母单;未支持筛单处理
//如后续需要扩展，根据顺丰规范文档增加相应字段即可
message CreateOrderRequest {
    string orderId = 1; //[R]订单编号
    int32 expressType = 2; //[O]快件产品类型。1-标准快递；2-顺丰特惠；3-电商特惠；6-即日件，12-医药专递等。详情查阅顺丰规范文档
    string senderAddress = 3; //[C]寄件方地址，必须包含省市区.如果需要生成电子运单，则为必填。
    string senderCompany = 4; //[R[寄件方公司
    string senderContact = 5; //[R[寄件方联系人
    string senderTel = 6; //[R]寄件方联系电话
    string receiverProvince = 7; //[O]收件方所在省.必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。为避免地址识别不成功的风险，建议传输此字段。
    string receiverCity = 8; //[O]收件方所在市.必须是标准的城市称谓 如：深圳市，如果是直辖市，请直接传北京（或北京市）、上海（或上海市）等。为避免地址识别不成功的风险，建议传输此字段。
    string receiverAddress = 9; //[R]到件方详细地址
    string custid = 10; //[C]顺丰月结卡号
    int32 tempRange = 11; //[C]温度范围类型，当express_type为12医药温控件时必填：1为冷藏;3为冷冻
    int32 payMethod = 12; //[O]付款方式：1:寄方付;2:收方付;3:第三方付
    string remark = 13; //[O]备注
    string name = 14; //[C]货物名称，如果需要生成电子运单，则为必填。
    string addedServiceName = 15; //[O]增值服务名，如COD等。
    string addedServiceValue = 16; //[C]增值服务扩展属性，参考增值服务传值说明。多个value以JSON格式保存
    string receiverCompany = 17; //[R]到件方公司名称
    string receiverContact = 18; //[R]到件方联系人
    string receiverTel = 19; //[R]到件方联系电话
}

//顺丰下单response
message CreateOrderResponse {
    int32 code = 1;
    string msg = 2;
    string orderId = 3; //订单号
    string mailNo = 4; //顺丰运单号
    string originCode = 5; //原寄地区域代码，可用于顺丰电子运单标签打印。
    string destCode = 6; //目的地区域代码，可用于顺丰电子运单标签打印。
    int32 filterResult = 7; //筛单结果。1：人工确认;2：可收派;3：不可以收派
    string remark = 8; //如果filter_result=3时为必填，不可以收派的原因代码：1：收方超范围;2：派方超范围;3：其它原因
    string sourceTransferCode = 9; //原寄地中转场
    string sourceCityCode = 10; //原寄地城市代码
    string sourceDeptCode = 11; //原寄地网点代码
    string sourceTeamCode = 12; //原寄地单元区域
    string destCityCode = 13; //目的地城市代码,eg:755
    string destDeptCode = 14; //目的地网点代码,eg:755AQ
    string destDeptCodeMapping = 15; //目的地网点代码映射码
    string destTeamCode = 16; //目的地单元区域,eg:001
    string destTeamCodeMapping = 17; //目的地单元区域映射码
    string destTransferCode = 18; //目的地中转场
    string destRouteLabel = 19; //打单时的路由标签信息。如果是大网的路由标签，这里的值是目的地网点代码，如果是同城配的路由标签，这里的值是根据同城配的设置映射出来的值，不同的配置结果会不一样，不能根据-符号切分（如：上海同城配，可能是：集散点-目的地网点-接驳点，也有可能是目的地网点代码-集散点-接驳点）
    string proName = 20; //产品名称 对应RLS:pro_name
    string cargoTypeCode = 21; //快件内容：如：C816、SP601
    string limitTypeCode = 22; //时效代码, 如：T4
    string expressTypeCode = 23; //产品类型,如：B1
    string codingMapping = 24; //入港映射码eg:S10
    string codingMappingOut = 25; //出港映射码
    string xbFlag = 26; //XB标志 0:不需要打印XB 1:需要打印XB
    string printFlag = 27; //打印标志。返回值总共有9位，每一位只有0和1两种，0表示按丰密运单默认的规则，1表示显示，顺序如下，如111110000表示打印寄方姓名、寄方电话、寄方公司名、寄方地址和重量，收方姓名、收方电话、收方公司名和收方地址按丰密运单默认规则1：寄方姓名2：寄方电话3：寄方公司名4：寄方地址5：重量6：收方姓名7：收方电话8：收方公司名9：收方地址
    string twoDimensionCode = 28; //二维码。根据规则生成字符串信息,格式为：MMM={'k1':'（目的地中转场代码）','k2':'（目的地原始网点代码）','k3':'（目的地单元区域）','k4':'（附件通过三维码（express_type_code、 limit_type_code、 cargo_type_code）映射时效类型）','k5':'（运单号）'，'k6':'（AB标识）'}
    string proCode = 29; //时效类型:值为二维码中的K4
    string printIcon = 30; //打印图标 根据托寄物判断需要打印的图标(重货,蟹类,生鲜,易碎，Z标)  返回值有8位，每一位只有0和1两种，0表示按运单默认的规则，1表示显示。后面两位默认0备用。 顺序如下：重货,蟹类,生鲜,易碎,医药类,Z标,0,0 如：00000000表示不需要打印重货，蟹类，生鲜，易碎 ,医药,Z标,备用,备用
    string abFlag = 31; //AB标
    string custId = 32;//月结卡号
}

//确认订单request
message ConfirmOrderRequest {
    string orderId = 1; //[R]订单号
    int32 dealType = 2; //[R]客户订单操作标识：1：确认2：取消
    string mailNo = 3; //[C]顺丰母运单号(如果dealtype=1，必填)
}

//通用结果返回response
message BaseResultResponse {
    int32 code = 1;
    string msg = 2;
}

//查询订单request
//目前仅支持正向单查询
message CheckOrderStatusRequest {
    string orderId = 1;
}

//获取顺丰运单路由request
//暂未支持逆向单
message GetRouteRequest {
    int32 type = 1; //[R]1：根据顺丰运单号查询，trackingNo将被当作顺丰运单号处理；2：根据客户订单号查询，trackingNo将被当作客户订单号处理
    string trackingNo = 2; //[R]顺丰运单号或订单号
}

//获取顺丰运单路由response
message GetRouteResponse {
    int32 code = 1;
    string msg = 2;
    string mailNo = 3;
    string orderId = 4;
    repeated Route route = 5;
}

//路由对象
message Route {
    string date = 1; //路由节点发生的时间
    string address = 2; //路由节点发生的地点
    string remark = 3; //路由节点具体描述
    string opCode = 4; //路由节点操作码
}

//保存路由信息
message SaveRouteInfoRequest {
    string sfId = 1; //顺丰返回路由信息id号
    string mailNo = 2; //运单号
    string orderId = 3; //订单号
    string acceptTime = 4; //路由节点产生的时间
    string acceptAddress = 5; //路由节点发生的城市
    string remark = 6; //路由节点具体描述
    string opCode = 7; //路由节点操作码
}

//获取路由信息列表
message GetRouteListRequest {
    string orderId = 1;
}

//查询时效和费用
//时效查询接口查询类型参数如下8种类型。
//1:对应查询网点-网点的时效标准,这时候会认为srcCode,destCode是网点
//2:对应查询行政区-行政区的时效标准,这时候会认为srcCode,destCode是行政区域id
//3:行政区-港澳台的时效标准，这时候会认为srcCode是行政区域id,destCode是港澳台城市代码
//4:对应港澳台-行政区时效标准, 这时候会认为srcCode是港澳台城市代码,destCode是行政区域id 
//5:对应行政区-城市(国外)主要为国际流向时效查询,这时候会认为srcCode是行政区域id，destCode是国外国家代码
//6:对应网点-行政区时效标准，这时候会认为srcCode是网点代码,destCode是行政区域id 
//7:对应城市-城市(郊区)时效标准，这时候会认为srcCode是大陆地区城市代码,destCode是大陆地区城市代码
//10:对应网点-城市(郊区)时效标准，这时候会认为srcCode是网点代码,destCode是大陆地区城市代码
message CalcTimePromiseAndFreightRequest {
    int32 queryType = 1; //[R]查询类型（1,2,3,4,5,6,7,10）含义参照文档类型描述
    string srcCode = 2; //[R]始发编码
    string destCode = 3; //[R]目的编码
    double weight = 4; //[R]重量
    string consignTime = 5; //[R]寄件时间 时间格式：yyyy-MM-dd HH:mm:ss  如：2016-04-20 19:03:12
    string productType = 6; //[O]时效产品类型（目前只支持T1,T4,T6,T8,SP4，只能输一种）
}

//查询时效和费用响应
message CalcTimePromiseAndFreightResponse {
    int32 code = 1;
    string msg = 2;
    string timeStandard = 3; //时效标准
    double freight = 4; //费用
}

//获取城市代码请求
message GetCityCodeRequest {
    string provinceName = 1; //省标准名称
    string cityName = 2; //城市标准名称
}

//获取城市代码响应
message GetCityCodeResponse {
    int32 code = 1;
    string msg = 2;
    string cityCode = 3; //城市代码
}

//更新处方状态请求
message UpdatePrescriptionStatusRequest {
    string presNo = 1; //处方编号
    int32 status = 2; //状态
}

//包装顺丰服务
service SFService {
    //下单
    rpc createOrder (CreateOrderRequest) returns (CreateOrderResponse);
    //确认或取消订单
    rpc confirmOrder (ConfirmOrderRequest) returns (BaseResultResponse);
    //订单结果查询
    rpc checkOrderStatus (CheckOrderStatusRequest) returns (CreateOrderResponse);
    //获取顺丰运单路由
    rpc getRoute (GetRouteRequest) returns (GetRouteResponse);
    //查询时效和费用
    rpc calcTimePromiseAndFreight (CalcTimePromiseAndFreightRequest) returns (CalcTimePromiseAndFreightResponse);
}

//跟顺丰业务相关的内部服务
service SFInternalService {
    //获取城市代码
    rpc getCityCode (GetCityCodeRequest) returns (GetCityCodeResponse);
    //保存路由信息
    rpc saveRouteInfo (SaveRouteInfoRequest) returns (BaseResultResponse);
    //根据orderId从ywt数据库获取路由信息
    rpc getRouteList (GetRouteListRequest) returns (GetRouteResponse);
    //更新处方状态
    rpc updatePrescriptionStatus (UpdatePrescriptionStatusRequest) returns (BaseResultResponse);
}