在我们的项目中有时需要跟携程做对接,携程接口有以下几大类:
单点登录
单点登录又包括PC单点登录,H5单点登录,SAML单点登录等接口
人事数据对接
人事数据接口包括组织架构,人事批量对接,人员角色配置,判断员工是否开卡等接口
审批对接
审批接口包括提前审批,订单授权,基础数据等接口
数据对接
数据对接包括订单取数,补单查询,订单取数订单号查询,结算明细,航班动态查询,行程详情查询,出差申请查询,费用报销查询等接口
数据推送接口
数据推送包括时间推送,订单状态推送,票号状态推送,航变推送,结算交易流水推送、
接下来就以人事批量接口为例,讲一下携程接口如何调用
人事批量对接
概述:
人事批量对接接口用于实现单个公司批量的人事对接功能,该接口采用webservice的方式来实现,由携程提供标准的web service 接口
注意事项:
1.该接口采用域名方式调用,切勿采用IP方式调用
2.接口调用顺序,先调用获取ticket接口,再调用人事信息批量更新接口
3.人事信息批量接口为异步更新,模式,并非实时更新
4.批量人事接口接收的人事信息条数不能大于500条,单次人事信息条数不能大于100条
接口方法说明
1.获取Ticket
生产环境服务地址: | https://ct.ctrip.com/SwitchAPI/Order/Ticket |
测试环境服务地址: | https://cta.fat.ctripqa.com/SwitchAPI/Order/Ticket |
调用方式: | https + post |
方法名: | Ticket |
描述: | 进行商旅身份认证获取Ticket(有效时间为2个小时。如2个小时内有使用该ticket, 那么有效时间将往后延迟2小时。如2小时之内未使用该ticket,则需要重新获取ticket.) |
参数: | appKey ,appSecurity |
参数类型: | String |
请求契约
无 | |||||
字段 | 类型 | 描述 | 默认值 | 可为空 | 备注 |
appKey | String | 接入账号 | 无 | N | 由携程分配给客户公司 |
appSecurity | String | 接入密码 | 无 | N | 由携程分配给客户公司 |
返回契约
TicketResponse | |||||
字段 | 类型 | 描述 | 默认值 | 可为空 | 备注 |
Ticket | String | 生成的Ticket | 无 | N | 用于后续接口访问 |
Status | ResponseStatus | 返回状态 | 无 | N | 见下表描述 |
ResponseStatus | |||||
字段 | 类型 | 描述 | 默认值 | 可为空 | 备注 |
Success | Boolean | 是否调用成功 | 无 | N | true:调用成功false:调用失败 |
Message | String | 推送错误消息 | 无 | Y | |
ErrorCode | Int | 错误编号 | 无 | N | 正确为0,其他编号为错误 |
2.人事信息批量更新
生产环境服务地址: | SOAP地址:https://ct.ctrip.com/corpservice/CorpCustService.asmx Restful地址:https://ct.ctrip.com/corpservice/CorpCustService/SaveCorpCustInfoList |
测试环境服务地址: | SOAP地址:https://cta.fat.ctripqa.com/corpservice/CorpCustService.asmx Restful地址:https://cta.fat.ctripqa.com/corpservice/CorpCustService/SaveCorpCustInfoList |
调用方式: | SOAP或者https + post |
方法名: | SaveCorpCustInfoList |
描述: | 将批量处理的人事信息赋值到实体AuthenticationListRequstà返回AuthenticationInfoListResponse对象 |
参数: | 实体AuthenticationListRequst实例化对象 |
参数类型: | 对象类型 |
请求契约
AuthenticationListRequest | ||||
字段 | 默认值 | 类型 | 可为空 | 描述 |
Language | zh-CN(简体中文) | 枚举值 | Y | 错误信息语言版本zh-CN 简体中文en-US 英文 |
Appkey | 无 | Varchar(20) | N | 公司登陆ID(obk账户名),由携程方提供 |
Ticket | 无 | Varchar(20) | N | 身份验证Token口令 |
CorporationID | 无 | varchar(20) | N | 公司ID,由携程方提供 |
AuthenticationInfoList | 无 | List<AuthencationInfo> | N | 验证实体,见下方表格 |
AuthenticationInfo | ||||
字段 | 默认值 | 类型 | 可为空 | 描述 |
Sequence | 0 | int | Y | 人事对接数据序号,用于与response返回结果中的Sequence编号匹配,不传则response返回0.(建议用户输入不重复的值,方便返回出错时定位问题。) |
Authentication | 无 | AuthencationEntity | N | 人事更新实体 |
AuthencationEntity | |||||
字段分类 | 字段 | 默认值 | 类型 | 可为空 | 描述 |
个人属性 | Uid | 无 | char(20) | Y | 员工的携程卡号 携程卡号和员工编号必须要有一个,并保持唯一 |
EmployeeID | 无 | varchar(100) | Y | 员工编号 携程卡号和员工编号必须要有一个 针对自动开卡逻辑说明如下:该公司如果是定制卡号段且按员工顺序开卡: 1、传递的EmployeeID长度请提前咨询对应的项目经理; 2、传递的EmployeeID必须为数字;(长度不够的在前面补0); |
|
Name | 无 | varchar(80) | Y | 中国大陆籍用户姓名 例:张三 (外籍和港澳台无需传递),可参照Q&A机票购买姓名须知 | |
NameENFirstName | 无 | varchar(30) | Y | 护照英文名_F(外籍和港澳台同胞需要传递,NameENFirstName不传递,单独传递NameENMiddleName时,会返回错误代码1050),英文名需由字母组成。可参照Q&A机票购买姓名须知 | |
NameENLastName | 无 | varchar(30) | Y | 护照英文名_L(外籍和港澳台同胞需要传递),英文名需由字母组成。可参照Q&A机票购买姓名须知 | |
Nationality | 无 | char(2) | Y | 国籍 | |
Gender | 无 | char(1) | Y | 性别(M:男,F:女) | |
Birthday | 无 | varchar(20) | Y | 用户生日,格式:yyyy-MM-dd | |
NickName | 无 | varchar(20) | Y | 昵称 | |
MobilePhone | 无 | varchar(20) | Y | 手机号码。当CountryCode为86或空时,视为中国境内手机号码,支持11位数字。 注:手机号码异常,仅手机号该字段不落地保存,其余字段如正常则该条人事数据正常落地 |
|
CountryCode | 无 | int | Y | 国家码。(已开通短信国家见附录三,对应国家区号) | |
无 | varchar(60) | Y | 联系邮箱(不支持大小写敏感的邮箱,发送开通信时默认使用小写字母邮箱进行发送) | ||
Address | 无 | varchar(200) | Y | 地址 | |
PostCode | 无 | varchar(20) | Y | 邮编 | |
ContactTel | 无 | varchar(50) | Y | 联系电话 | |
ContactFax | 无 | varchar(50) | Y | 联系传真 | |
IdCardNo | 无 | varchar(20) | Y | 身份证号 Personal ID No. |
|
PassPortNo | 无 | varchar(20) | Y | 护照号 Passport No. |
|
TwoWayPermitNo | 无 | varchar(20) | Y | 港澳通行证 | |
MTPNo | 无 | varchar(20) | Y | 台胞证 | |
HomeReturnNo | 无 | varchar(20) | Y | 回乡证 | |
TaiwanPassNo | 无 | varchar(20) | Y | 台湾通行证 | |
StudentNo | 无 | varchar(20) | Y | 学生证 | |
MilitaryNo | 无 | varchar(20) | Y | 军人证 | |
SeamanNo | 无 | varchar(20) | Y | 国际海员证 | |
ForeignersResidenceNo | 无 | varchar(20) | Y | 外国人永久居留证 | |
TravelNo | 无 | varchar(20) | Y | 旅行证 | |
CertificateNo | 无 | varchar(200) | Y | 其它证件号 | |
UserCardInfos | 无 | List<UserCardInfoEntity> | Y | 卡号证件信息可选数据(如果可选数据有值,后台采用全量覆盖的方式更新) | |
UserFFPInfos | 无 | List<UserFFPInfoEntity> | Y | 常旅客卡信息可选数据(如果可选数据有值,后台采用全量覆盖的方式更新) | |
工作属性 | Valid | 无 | char(1) | Y | 在职情况 (A-在职,I-离职) |
Rank | 无 | varchar(50) | Y | 职级 | |
RankName | 无 | varchar(200) | Y | 职级名称(中文)注:职级的中文名跟英文名,只能传递其中一个。(如果需要使用该字段,需提前联系实施经理在携程后台进行配置) | |
RankNameEn | 无 | varchar(200) | Y | 职级名称(英文)注:职级的中文名跟英文名,只能传递其中一个。(该字段暂时没有开放) | |
WorkCity | 无 | varchar(20) | Y | 工作所在城市 | |
Dept1 | 无 | varchar(100) | Y | 部门1,如需清空该字段,传字符串"null" | |
Dept2 | 无 | varchar(100) | Y | 部门2,如需清空该字段,传字符串"null" | |
Dept3 | 无 | varchar(100) | Y | 部门3,如需清空该字段,传字符串"null" | |
Dept4 | 无 | varchar(100) | Y | 部门4,如需清空该字段,传字符串"null" | |
Dept5 | 无 | varchar(100) | Y | 部门5,如需清空该字段,传字符串"null" | |
Dept6 | 无 | varchar(100) | Y | 部门6,如需清空该字段,传字符串"null" | |
Dept7 | 无 | varchar(100) | Y | 部门7,如需清空该字段,传字符串"null" | |
Dept8 | 无 | varchar(100) | Y | 部门8,如需清空该字段,传字符串"null" | |
Dept9 | 无 | varchar(100) | Y | 部门9,如需清空该字段,传字符串"null" | |
Dept10 | 无 | varchar(100) | Y | 部门10,如需清空该字段,传字符串"null" | |
CostCenter | 无 | varchar(100) | Y | 成本中心编号 | |
CostCenter2 | 无 | varchar(100) | Y | 成本中心编号2 | |
CostCenter3 | 无 | varchar(100) | Y | 成本中心编号3 | |
CostCenter1EN | 无 | varchar(100) | Y | 对应成本中心编号1英文 | |
CostCenter2EN | 无 | varchar(100) | Y | 对应成本中心编号2英文 | |
CostCenter3EN | 无 | varchar(100) | Y | 对应成本中心编号3英文 | |
IsCostCenter1Optional | 无 | bool | Y | 成本中心1是否下拉,true=是,false=否;true则读取成本中心可选数据;false则读取成本中心编号1的中英文内容。 | |
IsCostCenter2Optional | 无 | bool | Y | 成本中心2是否下拉,true=是,false=否;true则读取成本中心可选数据;False则读取成本中心编号2的中英文内容。 | |
IsCostCenter3Optional | 无 | bool | Y | 成本中心3是否下拉,true=是,false=否;true则读取成本中心可选数据;false则读取成本中心编号3的中英文内容。 | |
CostCenterList | 无 | List<CostCenterEntity> | Y | 成本中心可选数据(如果可选数据有值,只会覆盖同一成本中心类型数据,即同一成本中心类型先删除后新增的方式进行更新) | |
配置属性 | SubAccountName | 无 | varchar(100) | Y | 子账户的名称,由携程提供的对应的账户信息。新用户必须提供 |
CorpCardType | 无 | char(1) | Y | 代订类型:C(个人卡),B(代订卡):代订范围默认整个公司,D(虚卡):不发送开通信,为虚卡时邮箱可为空; 备注: 1、个人卡和代订卡的对应的卡种类型为实卡 2、默认待定类型为个人卡,卡种类型为实卡 |
|
ResRange | 无 | char(1) | Y | 代订范围:当前用户可代订范围 C:公司、F:主账户及其他、S:子账户及其他、O:其他(根据代订关系配置);(当代订类型为B(代订卡)时,代订范围不能为空) | |
IsAuthorizedOptional | 无 | bool | Y | 授权人是否可选,true=是,false=否;true 则读取授权人可选设置数据;false则读取默认授权人信息 | |
ConfirmPersonList | 无 | List<ConfirmPersonEntity> | Y | 授权人可选数据(如果可选数据有值,根据(产品类型+授权次别)组合的方式进行覆盖,即根据(产品类型+授权次别)先删除后新增的方式进行更新) | |
AuthPWD | 无 | varchar(20) | Y | 授权密码(密码授权客户) | |
FltSend_Mod | 无 | char(1) | Y | 机票配送方式, A- 定期配送, B-携程保管, C-其它方式,无 D-使用公司配送设置, E-使用主帐户设置 |
|
IsBookClass | 无 | char(1) | Y | 国内机票两舱是否可预订:T:是,F:否 | |
IntlBookClassBlock | 无 | varchar(200) | Y | 国际屏蔽舱位控制: C(公务), F(头等), Y(经济), SY(超经)。 可传多个值,每个用英文";"隔开(如:C;F;SY) 如需清空该字段,传字符串"null" |
|
IsSendEMail | false | bool | Y | 是否发送开通邮件,true=是,false=否;空,默认为false。如有开通自动开卡功能的客户,这个字段传"true",否则将无法收到开卡成功邮件,导致用户无法得知卡号和密码信息。为虚卡时不发送邮件,该值设置无效。 | |
AuthEmailLanguage | CN | Varchar(2) | Y | 授权邮件短信语言版本CN:中文,EN:英文 | |
ConcurAccount | 无 | varchar(50) | Y | Concur账户 | |
CorpEmailSendRules | 无 | List<CorpEmailSendRuleEntity> | Y | 机票酒店Email发送配置 | |
CorpTicketReservations | 无 | List<CorpTicketReservationEntity> | Y | 代订关系配置 | |
UseTRFlag | 0 | int | Y | 设置不可帮非员工预订产品类型,多个则将其对应数字相加1(国内机票),2(国际机票),4(酒店),8(用车),16(火车票)例如:17,不可帮非员工预订国内机票和火车票 如需清空该字段,传值-1 |
|
FltClassStandard | 无 | char(1) | Y | 国内机票RC记录舱位标准 C(商务),F(头等),Y(经济) | |
FltRateStandard | 无 | decimal(8,4) | Y | 国内机票RC记录折扣标准 取值(0~1,只允许最大4位小数) | |
SuperiorEID | 无 | String | Y | 上级领导EID | |
CustID | 无 | String | Y | 客户提供的组织部门ID | |
IsServedCard | 无 | char(1) | Y | 是否是招待卡:T:是,F:否 | |
CanBookTrainSeat | 无 | Varchar(100) | Y | Online火车票可选席别,见附录二。传值按英文分号分割,如:1;3;4;13;15;16
|
|
IsTrainOtherSeatCanBook | char(1) | 火车票可选席别外是否可订 T:是,F:否 | |||
ReservationFlightHD | 无 | int | Y | 国内机票可预订最高折扣 | |
FlightHighRateAirline | 无 | varchar(100) | Y | 国内机票最高折扣指定航司 |
CostCenterEntity | ||||
字段 | 默认值 | 类型 | 可为空 | 描述 |
CostCenterType | 无 | varchar(20) | N | 成本中心类型,只可传输C1(成本中心1)、C2(成本中心2)、C3(成本中心3)三个类型字段 |
CostCenterContent | 无 | nvarchar(50) | N | 成本中心中文内容,对应每个成本中心1、2、3的中文内容(最大长度50) |
CostCenterContentEN | 无 | varchar(100) | Y | 成本中心英文内容,对应每个成本中心1、2、3的英文内容 |
IsDefault | 无 | bool | Y | 是否默认成本中心,每个成本中心类型可以传输多个成本中心内容,可设置其中一条成本中心内容为默认值。字段赋值:true或false或不传(默认false) |
ConfirmPersonEntity | ||||
字段 | 默认值 | 类型 | 可为空 | 描述 |
ProductType | 无 | varchar(20) | N | 产品类型,仅可传输N(国内机票)、I(国际机票)、H(酒店)、T(火车票)、C(用车) |
AuthorizedTime | 无 | Int | N | 授权次别,1(代表一次授权)、2(代表二次授权) |
ConfirmPerson | 无 | varchar(100) | N | 授权人(必须在携程账户内有邮箱)员工编号或邮箱,仅可传输员工编号或Email,二者选其一。 |
ConfirmPersoncc | 无 | varchar(100) | Y | 抄送授权人(必须在携程账户内有邮箱)员工编号或邮箱,仅可传输员工编号或Email,二者选其一。 |
IsDefault | 无 | bool | Y | 是否默认,同类型产品同次别授权,可设置其中一条授权人UID为默认授权人。字段赋值:true或false或不传(默认false)
|
UserCardInfoEntity | ||||
字段 | 默认值 | 类型 | 可为空 | 描述 |
CardNo | 无 | varchar(50) | N | 证件号码 |
CardType | 无 | Int(4) | N | 证件类型(不允许重复) 1:身份证 2:护照 3:学生证 4:军人证 7:回乡证 8:台胞证 10:港澳通行证 20:外国人永久居留证 21:旅行证 22:台湾通行证 99:其他 |
IDCardTimelimit | 无 | varchar(30) | Y | 证件有效期 |
PassportType | 无 | char(1) | Y | 护照类型(当CardType=2时必填) P:因私 I:因公 D:外交 |
UserFFPInfoEntity | ||||
字段 | 默认值 | 类型 | 可为空 | 描述 |
Airline | 无 | Char(2) | N | 航线 |
FFPNo | 无 | varchar(40) | N | 常旅客卡卡号 |
CorpEmailSendRuleEntity | ||||
字段 | 默认值 | 类型 | 可为空 | 描述 |
EmailSendNode | 无 | Char(1) | N | 邮件发送节点:机票发送节点:暂缓确认:D;成交确认:S;退票确认:R;改签确认:G(仅国内机票);Itinerary和Invoice确认单:I酒店发送节点:确认客户:C;授权确认:A;已成交:S;Itinerary和Invoice确认单:I; 注意: (1)机票发送节点:D,S,R,G,这四个节点,国内跟国际必须同时有值(BusinessType=1和2捆绑传输)。 (2)当同一业务类型(BusinessType),同一发送节点发送多条信息时,将以最后一条信息为准。 |
ReceiverEMail | 无 | varchar (255) | Y | 接收人邮件地址(可接受多个邮箱地址,用英文分号隔开) (不支持大小写敏感的邮箱,携程发送邮件默认使用小写字母邮箱进行发送) |
EmailSendRuleLanguage | CN | Char(2) | N | 语言(CN/EN) |
IsSendCardHolder | F | Char(1) | N | 是否发送持卡人(T/F) |
IsSendContactor | F | Char(1) | N | 是否发送订单联系人(T/F) |
BusinessType | 无 | Int | N | 业务类型,1-国内机票、2-国际机票、4-酒店 |
EmailSendRuleValid | T | Char(1) | N | 邮件规则是否有效(T/F); 注意:(1)机票发送节点:D,S,R,G,这四个节点,国内跟国际IsSendCardHolder,IsSendContactor,EmailSendRuleValid 这三个配置项的值,必须一致。 |
CorpTicketReservationEntity | ||||
字段 | 默认值 | 类型 | 可为空 | 描述 |
ResUid | 无 | varchar (20) | Y | 被代订人Uid (被代订人Uid,Eid 不能同时为空) |
ResEid | 无 | varchar (20) | Y | 被代订人Eid(被代订人Uid,Eid 不能同时为空) |
ResValid | T | Char(1) | N | 代订关系是否有效(T/F) |
注意事项:不可空元素请务必提供,其他选项根据实际需要进行提供;请不要填入并传递未使用元素;如果同时传入UiD和EmployeeID,系统以UiD作为准;EmployeeID不能更新,如需要更新,请重新开卡。
3.2.2返回契约
AuthenticationResponseList | |||
字段 | 默认值 | 类型 | 描述 |
Result | 无 | String | 接口调用结果Success: 更新成功;Failed:更新失败;Contains errors:部分数据未更新成功; |
ErrorMessageList | 无 | List< ErrorMessage> | 每条数据更新结果 |
ErrorMessage | |||
字段 | 默认值 | 类型 | 描述 |
Sequence | 无 | int | 编号人事对接数据编号,用于与request中的Sequence序号匹配,Sequence默认值为0 |
ErrorCode | 无 | string | 错误代码(参考文档说明) |
Message | 无 | string | 错误信息(参考文档说明) |
代码示例
1.获取Ticket
public static Tuple<Boolean, String> GetTicket(String appKey, String appSecurity)
{
if (String.IsNullOrEmpty(appKey) || String.IsNullOrEmpty(appSecurity))
{
return new Tuple<bool, string>(false, "AppKey和AppSecurity不可为空");
}
String ticket = String.Empty;
string url = "https://www.corporatetravel.ctrip.com/switchapi/platform.svc/rest/ticket";
string postString = "{\"appKey\":\"" + appKey + "\",\"appSecurity\":\"" + appSecurity + "\"}";
string result = PostData(url, postString);
if (String.IsNullOrEmpty(result))
{
return new Tuple<bool, string>(false, "获取携程Ticket失败,请稍后重试!");
}
var responseEntity = Newtonsoft.Json.JsonConvert.DeserializeObject<Response4ApprovalTicket>(result);
if (responseEntity.TicketResult.Status.Success)
{
ticket = responseEntity.TicketResult.Ticket;
return new Tuple<bool, string>(true, ticket);
}
else
{
return new Tuple<bool, string>(false, responseEntity.TicketResult.Status.Message);
}
}
2.接口调用
public static Tuple<Boolean, String> SaveCorpCustList(String legalUnitID, List<CommonEmployeeModel> employeeList)
{
var companyCtripModel = GetCompanyCtrip(legalUnitID);
if (companyCtripModel == null)
return new Tuple<bool, string>(false, "未找到该机构在携程开通账号信息");
var ticket = GetTicket(companyCtripModel.AppKey, companyCtripModel.AppSecurity);
if (!ticket.Item1)
return new Tuple<bool, string>(false, ticket.Item2);
AuthenticationListRequst request = new AuthenticationListRequst();
request.Appkey = companyCtripModel.AppKey;//公司登陆ID(obk 账 户名),由携程方提供
request.Ticket = ticket.Item2.ToString();//身份验证Token口令
request.CorporationID = companyCtripModel.CtripCorpID;//公司ID,由携程方提供
request = CreateAuthInfoArray(employeeList, companyCtripModel.CtripCorpID, request);
try
{
CorpCustServiceSoapClient client = new CorpCustServiceSoapClient();
AuthenticationInfoListResponse response = client.SaveCorpCustInfoList(request);
String msg = String.Empty;
if (response.Result == CtripUtil.成功)
{
String employeeIDStr = String.Join("\r\n", employeeList.Select(item => String.Format("【{0}】工号【{1}】", item.EmployeeName, item.EmployeeID)));
msg = "更新成功,此次更新了" + employeeIDStr;
EClaim.Common.Log.LogMsg("【人事批量对接携程】", msg);
return new Tuple<bool, string>(true, msg);
}
else
{
StringBuilder errorStr = new StringBuilder();
foreach (var item in response.ErrorMessageList)
{
CommonEmployeeModel employee = employeeList[item.Sequence];
errorStr.Append("员工:【" + employee.EmployeeName + "】|");
errorStr.Append("工号:【" + employee.EmployeeID + "】|");
errorStr.Append("ErrorCode:【" + item.ErrorCode + "】|");
errorStr.Append("Message:【" + item.Message + "】");
errorStr.Append("\r\n");
}
if (response.Result == CtripUtil.失败)
{
msg = "更新失败,失败原因" + errorStr.ToString();
EClaim.Common.Log.LogMsg("【人事批量对接携程】", msg);
return new Tuple<bool, string>(false, msg);
}
else if (response.Result == CtripUtil.部分错误)
{
String employeeIDStr = String.Join("\r\n", employeeList.Select(item => String.Format("【{0}】工号【{1}】", item.EmployeeName, item.EmployeeID)));
msg = "部分数据更新失败,此次更新了" + employeeIDStr + "其中\r\n" + errorStr.ToString();
EClaim.Common.Log.LogMsg("【人事批量对接携程】", msg);
return new Tuple<bool, string>(false, msg);
}
}
}
catch (Exception ex)
{
}
return new Tuple<bool, string>(false, "调用人事批量对接服务失败");
}
private static AuthenticationListRequst CreateAuthInfoArray(List<CommonEmployeeModel> employeeList, String corporationID, AuthenticationListRequst request)
{
List<CndModel> pars = new List<CndModel>();
pars.Add(new CndModel("Company_GUID", employeeList.First().CompanyGUID));
pars.Add(new CndModel(" R_RECORD_STATUS=1"));
pars.Add(new CndModel("TYPE_CD", "CtripCardType"));
COMMONSTATICService commonStaticService = new COMMONSTATICService();
var csBtoList = commonStaticService.GetList(pars);
List<COMMONSTATICModel> ctripCardTypeList = new List<COMMONSTATICModel>();
if (csBtoList != null && csBtoList.Any())
ctripCardTypeList = Convertor.ConvertList<BaseDto, COMMONSTATICModel>(csBtoList);
COMMONEMPLOYEELINKService employeeLinkService = new COMMONEMPLOYEELINKService();
var employeeLinkList = employeeLinkService.GetEmployeeLinkList(employeeList.First().CompanyGUID, employeeList, (int)LinkTypeEnum.携程);
//获取所有部门列表
CommonOrgService orgService = new CommonOrgService();
pars.Clear();
pars.Add(new CndModel("CompanyGUID", employeeList.First().CompanyGUID));
pars.Add(new CndModel("R_RECORD_STATUS", 1));
var orgBtoList = orgService.GetList(pars);
List<CommonOrgModel> orgList = new List<CommonOrgModel>();
if (orgBtoList != null && orgBtoList.Any())
orgList = Convertor.ConvertList<BaseDto, CommonOrgModel>(orgBtoList);
int employeeCount = employeeList.Count, i = 0;
request.AuthenticationInfoList = new AuthenticationInfo[employeeCount];
for (; i < employeeCount; i++)
{
var employee = employeeList[i];
var linkModel = employeeLinkList.SingleOrDefault(item => item.EmployeeID == employee.EmployeeID);
AuthenticationInfo info = new AuthenticationInfo();
info.Authentication = new AuthencationEntity();
info.Sequence = i;
//成本中心
var orgModel = orgList.FirstOrDefault(item => item.OrgGUID == employee.OrgID);
if (orgModel != null && !String.IsNullOrEmpty(orgModel.SubCompany))
info.Authentication.CostCenter = orgModel.SubCompany ?? String.Empty;
else if (orgModel != null && !String.IsNullOrEmpty(orgModel.OrgName))
info.Authentication.CostCenter = orgModel.OrgName ?? String.Empty;
else
info.Authentication.CostCenter = employee.OrgName ?? String.Empty;
info.Authentication.IdCardNo = employee.IDCard ?? String.Empty;
info.Authentication.PassPortNo = employee.PassportCard ?? String.Empty;
info.Authentication.Email = employee.Email ?? String.Empty;
info.Authentication.MobilePhone = employee.CellPhone ?? String.Empty;
info.Authentication.ContactTel = employee.OfficePhone ?? String.Empty;
info.Authentication.ContactFax = employee.Fax ?? String.Empty;
info.Authentication.RankName = employee.PostLevel ?? String.Empty;
info.Authentication.Valid = employee.R_RECORD_STATUS == 1 ? "A" : "I";
info.Authentication.IsBookClass = (employee.IsBookClass == 1 ? "T" : "F");//国内机票两舱是否可预订:T:是,F:否
if (ctripCardTypeList != null && ctripCardTypeList.Any())
{
COMMONSTATICModel ctripCardType = new COMMONSTATICModel();
if (linkModel != null)
ctripCardType = ctripCardTypeList.FirstOrDefault(item => item.STATIC_CD == linkModel.LinkAccountType.ToString());
else
ctripCardType = ctripCardTypeList.FirstOrDefault(item => item.STATIC_CD == employee.CtripCardType.ToString());
if (ctripCardType == null || String.IsNullOrEmpty(ctripCardType.STATIC_ID))
{
ctripCardType = ctripCardTypeList.First();
}
info.Authentication.SubAccountName = ctripCardType.STATIC_VALUE;
}
request.AuthenticationInfoList[i] = info;
}
return request;
}