syntax = "proto3";

package com.ywt.gapi.checkup_booking;

option java_multiple_files = true;
option java_package = "com.ywt.gapi.checkup_booking";
option java_outer_classname = "CheckupBookingProto";

// 体检套餐等级（分类）
message PackageLevel {
    string levelId = 1; // 套餐等级 id
    string levelDesc = 2; // 套餐等级名称
}

message GetPackageLevelListRequest {
    int32 hospitalId = 1; // 医院 id
    int32 subHospitalId = 2; // 分院 id
    string locId = 3; // 科室代码
}

message GetPackageLevelListResponse {
    int32 code = 1;
    string info = 2;
    repeated PackageLevel packageLevel = 3;
}

// 体检套餐
message Package {
    string packageId = 1; // 网上套餐ID
    string packageDesc = 2; // 套餐描述
    int32 packageAmt = 3; // 套餐金额
    string ordSetsId = 4; // HIS套餐ID
    string levelDesc = 5; // 类型描述
    string levelId = 6; // 类型ID
    string giFlag = 7; // 团体标志：个人、团体
    string sexDesc = 8; // 性别描述
    string ordSetsType = 9; // 备注
    string locId = 10; // 科室ID
    string locDesc = 11; // 科室描述
    int32 originAmt = 12; // 套餐价格
    string sort = 13;
}

message GetPackageListRequest {
    int32 hospitalId = 1;// 医院 id
    int32 subHospitalId = 2;// 分院 id
    string locId = 3;// 科室代码
    string levelId = 4;// 套餐等级 id
    string sexDesc = 5;// 性别：男,女
}

message GetPackageListResponse {
    int32 code = 1;
    string info = 2;
    repeated Package package = 3;
}

// 套餐明细项
message PackageItem {
    string itemCategoryId = 1; // 医嘱项ID
    string itemCategoryDesc = 2; // 项目描述
    string hisItemId = 3; // 医嘱子分类
    string itemDesc = 4; // 医嘱子分类描述
    int32 price = 5; // 价格
}

message GetPackageItemListRequest {
    int32 hospitalId = 1;// 医院 id
    int32 subHospitalId = 2;// 分院 id
    string ordSetsId = 3; // HIS套餐ID
}

message GetPackageItemListResponse {
    int32 code = 1;
    string info = 2;
    repeated PackageItem packageItem = 3;
}

// 体检项目分类
message CheckupItemCategory {
    string itemCategoryId = 1; //  医嘱子分类
    string itemCategoryDesc = 2; // // 医嘱子分类描述
    repeated CheckupItem CheckupItem = 3;
}

// 体检项目（加项）
message CheckupItem {
    string itemCategoryId = 1; //  医嘱子分类
    string itemCategoryDesc = 2; // // 医嘱子分类描述
    string hisItemId = 3; // 医嘱项ID
    string itemDesc = 4; // 项目描述
    int32 price = 5; // 价格
    string stationId = 6;
    string stationDesc = 7;
}

// 获取所有体检项目，支持项目名称关键字搜索
message GetAllItemListRequest {
    int32 hospitalId = 1;// 医院 id
    int32 subHospitalId = 2;// 分院 id
    string locId = 3; // 科室ID
    string keyword = 4;// 项目名称关键字
}

message GetAllItemListResponse {
    int32 code = 1;
    string info = 2;
    repeated CheckupItemCategory checkupItemCategory = 3;// deprecated, use checkupItem instead
    repeated CheckupItem checkupItem = 4;
}

// 某段时间内可预约日期及限额信息
message RegInfo {
    string examDate = 1; // 预约日期
    string examLocDesc = 2; // 科室描述
    string examLocId = 3; // 科室ID
    int32 availRegCount = 4; // 剩余名额
    int32 regCount = 5; // 已约数量
    int32 totalCount = 6; // 总名额
    string strId = 7; // 日期排班ID
    string otherLocId = 8;
    string status = 9; // 状态	可预约、已过期、已约满
    string datePmType = 10; // 预约类型	I:个人  G:团体  O:过期主场
}

message GetRegInfoListRequest {
    int32 hospitalId = 1;// 医院 id
    int32 subHospitalId = 2;// 分院 id
    string sex = 3; // 性别 M：男 F：女
    string startExamDate = 4; // 开始日期 yyyy-mm-dd
    string endExamDate = 5; // 截止日期 yyyy-mm-dd
    string pmType = 6; // 预约类型 I:个人  G:团体  O:过期主场
    string locId = 7; // 健康管理科 66
    string levelDesc = 8; // VIP等级说明
}

message GetRegInfoListResponse {
    int32 code = 1;
    string info = 2;
    repeated RegInfo regInfo = 3;
}

// 某一天的时段限额信息
message DateRegInfo {
    int32 availRegCount = 1; // 剩余名额
    string startTime = 2; // 开始时间
    string endTime = 3; // 结束时间
    string detailId = 4; // 时段排班ID
    string sex = 5; // 性别	M：男 F：女
    string datePmType = 6; // 预约类型	I:个人  G:团体  O:过期主场
}

message GetDateRegInfoRequest {
    int32 hospitalId = 1;// 医院 id
    int32 subHospitalId = 2;// 分院 id
    string sex = 3; // 性别 M：男 F：女
    string strId = 4; // 日期排班ID	HS10207或HS10231的出参
    string pmType = 5; // 预约类型 I:个人  G:团体  O:过期主场
    string levelDesc = 6; // VIP等级	默认普通；非必填
    string locId = 7; // 健康管理科 66
    string datePmType = 8; // 预约类型	必填;  I:个人  G:团体  O:过期主场 H：团体主场
}

message GetDateRegInfoResponse {
    int32 code = 1;
    string info = 2;
    repeated DateRegInfo dateRegInfo = 3;
}

// 自选项目医嘱 id
message SelfItem {
    string itemId = 1;// 医嘱  id
}

message SaveRegRecordRequest {
    string certificateNo = 1;// 身份证号码
    string patientName = 2;
    string telephoneNo = 3;
    string patientDob = 4; // 出生日期，格式：YYYY-MM-DD
    string sex = 5;
    string locId = 6;
    string pmType = 7; // 预约类型	I：个人 G：团体 H：主场 O：过期主场
    string levelDesc = 8; // Vip等级描述 传普通
    string ordSetsId = 9; // HIS套餐ID
    string examDate = 10; // 预约日期	YYYY-MM-DD
    string detailId = 11; // 排班ID
    repeated SelfItem selfItem = 12;// 自选项目医嘱 id
    int32 hospitalId = 13;
    int32 subHospitalId = 14;
}

// 预约成功返回的体检项目详情
message RegCheckupItem {
    string itemId = 1; // 项目ID
    string itemDesc = 2; // 项目描述
    string preIOrdDr = 3; // 体检项目记录ID
    string netPreItemDr = 4; // 网上预约项目记录ID
    string ordSetsDr = 5; // 所属套餐ID
    string ordSetsDesc = 6; // 所属套餐描述
    string itemCategoryDesc = 7; // 项目分类描述
    int32 price = 8; // 项目单价
    bool inPackage = 9; // 是否套餐内项目
}

// 预约成功
message RegRecord {
    string patientRegNo = 1; // 体检登记号也是病人ID
    string patientName = 2; // 姓名
    string sex = 3; // 性别描述
    string patientAge = 4; // 年龄
    string patientIdNo = 5; // 身份证号
    string regId = 6; // 网上预约记录ID
    string phoneNo = 7; //
    string levelDesc = 8; // 普通
    int32 totalAmount = 9; // 订单金额
    string status = 10; // 预约状态 0：已预约 1：医院已处理  2：取消预约 4：已缴费 5：已体检 6：取消体检
    string payFlag = 11; // 缴费标志 0：未缴费 1：已缴费
    string admId = 12; // 就诊ID
    string preIADM = 13; // 体检系统预约ID
    string locId = 14; // 体检科室ID
    string locDesc = 15; // 体检科室描述
    string regExamDate = 16; // 预约日期
    string regExamTime = 17; // 预约时间段
    string pmType = 18; // 预约类型 I:个人  G:团体  O:过期主场
    string peId = 19; // 体检编号
    string canModifyFlag = 20; //
    string preWay = 21; // 预约途径 PC/APP/WeChat/Self-help
    repeated RegCheckupItem regCheckupItem = 22; //  体检项目详情列表
    string ordSetsId = 23; // HIS 套餐 id
    string ordSetsDesc = 24; // 套餐名称
}

message SaveRegRecordResponse {
    int32 code = 1;
    string info = 2;
    RegRecord regRecord = 3;
}

message CancelRegRequest {
    string regId = 1; // 网上预约记录ID
    string idCard = 2; // 身份证号
    int32 hospitalId = 3;
    int32 subHospitalId = 4;
}

message CancelRegResponse {
    int32 code = 1;
    string info = 2;
}

message GetRegRecordListRequest {
    int32 hospitalId = 1;// 医院 id
    int32 subHospitalId = 2;// 分院 id
    string peId = 3; // 体检号 可根据条件查询
    string patientIdNo = 4; // 身份证号 必传
    string payFlag = 5; // 缴费标志	1：缴费 0：未缴费 必传
}

message GetRegRecordListResponse {
    int32 code = 1;
    string info = 2;
    repeated RegRecord regRecord = 3;
}

message GetUncheckedRecordRequest {
    int32 hospitalId = 1;// 医院 id
    int32 subHospitalId = 2;// 分院 id
    string idCardNo = 3;
    string locId = 4;
}

message UncheckedItemInfo {
    string groupCode = 1; // 团体编码
    string groupName = 2; // 团体名称
    string limitAmt = 3; // 加项限制金额
    string teamId = 4; // 分组ID
    string teamDesc = 5; // 分组描述
    string startDate = 6; // 开始时间
    string endDate = 7; // 结束时间
    string linkUser = 8; // 联络人姓名
    string linkTelphone = 9; // 联络人电话
}

message UncheckRecord {
    string patientRegNo = 1; // 登记号
    string patientName = 2; // 姓名
    string sex = 3; // 性别描述
    string patientAge = 4; // 年龄
    string patientIdNo = 5; // 身份证号
    string regId = 6; // 网上预约记录ID
    string phoneNo = 7;
    string levelDesc = 8; // 普通
    int32 totalAmount = 9; // 订单金额
    string admId = 10; // 就诊ID
    string preIADM = 11; // 体检系统预约ID
    string locId = 12; // 体检科室ID
    string regExamDate = 13; // 预约日期
    string pmType = 14; // 预约类型 I:个人  G:团体  O:过期主场
    string peId = 15; // 体检编号
    string peStatus = 16; // 状态	PREREGED：预约 REGISTERED：登记 ARRIVED：到达 CANCELPE：取消体检
    string companyDesc = 17;
    string idCard = 18;
    repeated UncheckedItemInfo uncheckedItemInfo = 19;
}

message GetUncheckedRecordResponse {
    int32 code = 1;
    string info = 2;
    repeated UncheckRecord uncheckRecord = 3;
}

// 体检预约中控 rpc 服务，实现方法在中控，和 HIS 交互
service CheckupBookingService {
    // 获取体检套餐等级列表
    rpc getPackageLevelList(GetPackageLevelListRequest) returns (GetPackageLevelListResponse);
    // 获取体检套餐列表
    rpc getPackageList(GetPackageListRequest) returns (GetPackageListResponse);
    // 获取体检套餐明细列表
    rpc getPackageItemList(GetPackageItemListRequest) returns (GetPackageItemListResponse);
    // 获取所有体检项目，支持项目名称关键字搜索
    rpc getAllItemList(GetAllItemListRequest) returns (GetAllItemListResponse);
    // 查询某段时间内可预约日期及限额信息
    rpc getRegInfoList(GetRegInfoListRequest) returns (GetRegInfoListResponse);
    // 查询某一天的时段限额信息
    rpc getDateRegInfo(GetDateRegInfoRequest) returns (GetDateRegInfoResponse);
    // 提交预约
    rpc saveRegRecord(SaveRegRecordRequest) returns (SaveRegRecordResponse);
    // 取消预约
    rpc cancelReg(CancelRegRequest) returns (CancelRegResponse);
    // 获取预约记录
    rpc getRegRecordList(GetRegRecordListRequest) returns (GetRegRecordListResponse);
    // 根据身份证号查询未检记录
    rpc getUncheckedRecord(GetUncheckedRecordRequest) returns (GetUncheckedRecordResponse);
}


message GetAnnouncementRequest {
    int32 hospitalId = 1;// 医院 id
    int32 subHospitalId = 2;// 分院 id
}

message GetAnnouncementResponse {
    int32 code = 1;
    string info = 2;
    string title = 3;
    string content = 4;
}

message CreateOrderRequest {
    int32 userId = 1;
    RegRecord regRecord = 2; // 预约信息
    int32 hospitalId = 3;
    int32 subHospitalId = 4;
    string medCardNo = 5; // 诊疗卡号
}

message CreateOrderResponse {
    int32 code = 1;
    string info = 2;
    string orderNo = 3; // 平台订单编号
    string createTime = 4; //下单时间
}

message CancelOrderRequest {
    string regId = 1; // 网上预约记录ID
    int32 hospitalId = 2;
    int32 subHospitalId = 3;
}

message CancelOrderResponse {
    int32 code = 1;
    string info = 2;
}

message GetOrderListRequest{
    string idCard = 1;
    int32 hospitalId = 2;
}

message GetOrderListResponse{
    int32 code = 1;
    string info = 2;
    repeated OrderItem orderItem = 3;
}

message OrderItem{
    string orderNo = 1; //订单号
    string createTime = 2; //创建时间
    string regCheckupItems = 3; //体检项目详情列表
    string regId = 4; //预约号
    int32 totalPrice = 5;
}

message GetNoticeRequest {
    int32 hospitalId = 1; // 医院 id
    string ordSetsId = 2; // his 套餐id
}

message GetNoticeResponse {
    int32 code = 1;
    string info = 2;
    string notice = 3;
    int32 show = 4; //0 为不展示， 1为展示
}


// 体检预约 rpc 服务，实现方法在 rpc，提供内部服务调用
service CheckupBookingRpcService {
    // 获取体检预约公告
    rpc getAnnouncement(GetAnnouncementRequest) returns (GetAnnouncementResponse);
    // 创建订单（仅记录信息，暂无支付功能）
    rpc createOrder(CreateOrderRequest) returns (CreateOrderResponse);
    //删除数据库体检订单
    rpc cancelOrder(CancelRegRequest) returns (CancelOrderResponse);
    //获取订单列表
    rpc getOrderList(GetOrderListRequest) returns (GetOrderListResponse);
    //获取套餐须知
    rpc getPackageNotice(GetNoticeRequest) returns (GetNoticeResponse);
}