import { hdHttp, HdResponse,BasicConstant } from '@itcast/basic' import { promptAction, CommonModifier } from '@kit.ArkUI' import { BusinessError } from '@kit.BasicServicesKit'; import HashMap from '@ohos.util.HashMap'; import { router } from '@kit.ArkUI' import { emitter } from '@kit.BasicServicesKit' @Component export struct SelectedHospitalComp { scrollerForList: Scroller = new Scroller(); @State provincerSelectedName:string = '请选择'; @State provincerId:string = ''; @State citySelectedName:string = ''; @State cityId:string = ''; @State districtsSelectedName:string = ''; @State districtsId:string = ''; @State hospitalSelectedName:string = ''; @State inputSearch:string = ''; @State tabBarModifier: CommonModifier = new CommonModifier(); @State isHidenCity:boolean = false; @State isHiddenSearchView:boolean = false; // 当前选中的层级索引(0-省 1-市 2-区 3-医院) @State currentTabIndex: number = 0 // 存储各层级选择状态 @State selections: number[] = [0, 1,2 ,3] // 数据集合 @State provinces: ProvinceOrCiry[] = [] @State cities: ProvinceOrCiry[] = [] @State districts: ProvinceOrCiry[] = [] @State hospitals: Hospital[] = [] @State searchHospitals: Hospital[] = [] // 搜索关键词 @Prop searchKey: string = '' private controller: TabsController = new TabsController(); aboutToAppear() { this.loadProvinces(0,0) // this.controller.setTabBarTranslate({ x: 20, y: 0 }) } // 加载省份数据 private loadProvinces(type:number,provinceIdOrCity:number) { const areaListUrl:string = BasicConstant.urlExpertAPI+'areaList'; const hashMap: HashMap = new HashMap(); hashMap.clear(); if (type != 0) { hashMap.set('parent_id',provinceIdOrCity.toString()) } hdHttp.httpReq(areaListUrl,hashMap).then(async (res: HdResponse) => { console.info(`Response areaList succeeded: ${res}`); let json:RequestProvinceCallData = JSON.parse(res+'') as RequestProvinceCallData; if(json.code=='200') { if (type == 0) { this.provinces = json.data; this.onTabChange(0) } else if (type == 1) { this.cities = json.data; this.onTabChange(1); } else if (type == 2) { this.onTabChange(2); if (json.data.length>0) { this.isHidenCity = false; this.districts = json.data; } else { this.isHidenCity = true; this.searchHospitalList('',false); } } else { this.searchHospitalList('',false); } } else { promptAction.showToast({ message: json.msg, duration: 1000 }) } }).catch((err: BusinessError) => { console.info(`Response areaList fail: ${err}`); }) } searchHospitalList(input:string,isSearchStatus:boolean) { const areaListUrl:string = BasicConstant.urlExpertAPI+'hospitalList'; const hashMap: HashMap = new HashMap(); hashMap.clear(); hashMap.set('name',input); hashMap.set('prov_id',this.provincerId); hashMap.set('city_id',this.cityId); hashMap.set('county_id',this.districtsId); hdHttp.httpReq(areaListUrl,hashMap).then(async (res: HdResponse) => { console.info(`Response hospitalList succeeded: ${res}`); let json:HospitalCallData = JSON.parse(res+'') as HospitalCallData; if(json.code=='200') { if (isSearchStatus) { if (json.data.length > 0) { this.isHiddenSearchView = true; } else { this.isHiddenSearchView = false; } this.searchHospitals = json.data; } else { this.isHiddenSearchView = false; this.hospitalSelectedName = '请选择'; this.hospitals = json.data; if (this.isHidenCity) { this.onTabChange(2); } else { this.onTabChange(3); } } } else { promptAction.showToast({ message: json.msg, duration: 1000 }) } }).catch((err: BusinessError) => { console.info(`Response hospitalList fail: ${err}`); }) } // Tab切换事件 private onTabChange(index: number) { if (index < this.currentTabIndex) { // 允许回退 this.currentTabIndex = index return } // 验证数据完整性 if (index === 1 && !this.selections[0]) return if (index === 2 && !this.selections[1]) return if (index === 3 && !this.selections[2]) return if (index === 4 && !this.selections[3]) return this.currentTabIndex = index } private handleSearchInput(value:string) { if (value.length<0) { return; } this.searchHospitalList(value,true); } backtoEdit(item: Hospital) { let eventData: emitter.EventData = { data: item }; // 发送eventId为1的事件,事件内容为eventData。 emitter.emit({ eventId: BasicConstant.notification_back_refreshData }, eventData); router.back({ url: 'pages/LoginPage/LoginSetInfoPage'}) // router.back({ url: 'pages/LoginPage/LoginSetInfoPage',params: item}) } otherHospitaltoBack() { let item={ city_name: this.districtsSelectedName, county_id: this.districtsId, prov_id: this.provincerId, prov_name: this.provincerSelectedName, name:'其他医院', county_name:this.districtsSelectedName, uuid:'1', city_id:this.cityId } as Hospital this.backtoEdit(item) } build() { Column() { SearchInput((input:string)=>{ this.handleSearchInput(input); }) // 内容区域 Tabs({ index:this.currentTabIndex, controller: this.controller,barModifier:this.tabBarModifier.align(Alignment.Start) }) { // 省份列表 TabContent() { List() { ForEach(this.provinces, (item: ProvinceOrCiry) => { ListItem() { Text(item.name) .width('100%') .fontColor(item.name == this.provincerSelectedName ? $r('app.color.main_color') : '#666666') .fontSize(17) .height(40) .margin({ left: 20 }) .onClick(() => { this.selections[0] = 1; this.provincerSelectedName = item.name; this.citySelectedName = '请选择' this.districtsSelectedName = ''; this.hospitalSelectedName = ''; this.provincerId = item.id.toString(); this.loadProvinces(1, item.id); }) } }) } .width('100%') .height('100%') } .customTabbar(this.provincerSelectedName) // 城市列表 TabContent() { List() { ForEach(this.cities, (item : ProvinceOrCiry) => { ListItem() { Text(item.name) .width('100%') .fontColor(item.name == this.citySelectedName?$r('app.color.main_color'):'#666666') .fontSize(17) .height(40) .margin({left:20}) .onClick(() => { this.selections[1] = 2; this.citySelectedName = item.name; this.districtsSelectedName = '请选择' this.hospitalSelectedName = ''; this.cityId = item.id.toString(); this.loadProvinces(2,item.id) }) } }) } .width('100%') .height('100%') } .customTabbar(this.citySelectedName) // 区县列表 TabContent() { List() { if (this.isHidenCity) { ForEach(this.hospitals, (item: Hospital) => { ListItem() { Text(item.name) .width('100%') // .fontColor(item.name == this.districtsSelectedName?$r('app.color.main_color'):'#666666') .fontSize(17) .height(40) .margin({left:20}) .onClick(() => { // this.districtsSelectedName = item.name; this.selections[2] = 3; //医院点击 this.backtoEdit(item) }) } }) ListItem() { Text('其他医院') .width('100%') .fontSize(17) .height(40) .margin({left:20}) .onClick(()=>{ //医院点击 this.otherHospitaltoBack() }) } } else { ForEach(this.districts, (item: ProvinceOrCiry) => { ListItem() { Text(item.name) .width('100%') .fontColor(item.name == this.districtsSelectedName?$r('app.color.main_color'):'#666666') .fontSize(17) .height(40) .margin({left:20}) .onClick(() => { this.districtsSelectedName = item.name; this.selections[3] = 4; this.districtsId = item.id.toString(); this.searchHospitalList('',false); }) } }) } } .width('100%') .height('100%') } .customTabbar(this.districtsSelectedName) if (!this.isHidenCity) { // 医院列表 TabContent() { List() { ForEach(this.hospitals, (item:Hospital) => { ListItem() { Text(item.name) .width('100%') .fontSize(17) .height(40) .margin({left:20}) .onClick(()=>{ //医院点击 this.backtoEdit(item) }) } }) ListItem() { Text('其他医院') .width('100%') .fontSize(17) .height(40) .margin({left:20}) .onClick(()=>{ //医院点击 this.otherHospitaltoBack() }) } } .width('100%') .height('100%') } .customTabbar(this.hospitalSelectedName) } } .onChange(index => { this.onTabChange(index) }) .barMode(BarMode.Scrollable) .height('100%') .divider( { strokeWidth: 1, color: $r('app.color.common_gray_border'), }) .layoutWeight(1) .padding({ bottom:100 }) if (this.isHiddenSearchView) { Column() { List() { ForEach(this.searchHospitals, (item: Hospital) => { ListItem() { Text(item.name) .width('100%') .fontSize(17) .height(40) .margin({ left: 20 }) .onClick(() => { //医院点击 this.backtoEdit(item) }) } }) } .width('100%') .height('100%') } .position({ y: 60 }) .width('100%') .height('82%') .backgroundColor(Color.White) } } .height('100%') } } @Builder function SearchInput(onSearchInput:(input:string)=>void) { // inputText:String = ; Row() { // 返回按钮 Image($r('app.media.selected_hospital_ws')) .width(20) .height(20) .margin({left:10}) TextInput({ placeholder: '搜索医院标准名别名' }) .width('80%') .backgroundColor('#EEEEEE') .onChange((value:string)=>{ onSearchInput(value); }) // .onEditChange((isEditing: boolean) => { // if (!isEditing) { // onSearchInput(value); // } // }) // .onSubmit(() => { // onSearchInput(value); // }) } .borderRadius(20) .width('90%') .height(40) .margin({top:10}) .backgroundColor('#EEEEEE') .justifyContent(FlexAlign.Start) } @Extend(TabContent) function customTabbar(name:string) { .tabBar(SubTabBarStyle.of(name) .labelStyle({ unselectedColor: '#848284', selectedColor:'#8D2316' , font: { size: 17 }}) .indicator({ color: '#8D2316', //下划线颜色 height: 1, //下划线高度 marginTop:16 //下划线与文字间距 })) .height('100%') } interface RequestProvinceCallData { msg:string, code:string, data:ProvinceOrCiry[] } interface HospitalCallData { msg:string, code:string, data:Hospital[] } // DataModel.ts interface ProvinceOrCiry { treePath: string name: string, parent:number, id:number, fullName:string } interface Hospital { city_name: string county_id: string prov_id: string prov_name: string name:string county_name:string uuid:string city_id:string }