患者相关

This commit is contained in:
xiaoxiao 2025-07-25 13:44:36 +08:00
parent abbd0540ab
commit 67c2c35841

View File

@ -0,0 +1,379 @@
import { BasicConstant, ChangeUtil,
EmptyViewComp,
hdHttp, HdLoadingDialog, HdNav, HdResponse, logger,TripleOptionDialog,
ViewImageInfo } from "@itcast/basic";
import { HashMap,JSON } from "@kit.ArkTS";
import { BusinessError } from "@kit.BasicServicesKit";
import { promptAction, router } from "@kit.ArkUI";
import { PullToRefreshLayout, RefreshController } from "refreshlib";
import { HMPopInfo, HMRouterMgr } from "@hadss/hmrouter";
@Component
export struct MassSendingComp {
@State pageNumber: number = 1
@State totalPage: number = 1
scroller = new Scroller()
@State messageList: ApiItem[] = []
public controller: RefreshController = new RefreshController()
aboutToAppear(): void {
this.initGetGroupListAction()
}
initGetGroupListAction() {
this.pageNumber = 1
this.messageList = []
this.getGroupListAction()
}
dialogController: CustomDialogController = new CustomDialogController({
builder: TripleOptionDialog({ title: '温馨提示',subTitle:'',oneButtonTitle:'单独选择',twoButtonTitle:'分组选择',buttonSelected:(actionType:string)=>{
if (actionType == '单独选择') {
HMRouterMgr.push({pageUrl:'PatientsListComp',
param:{group_uuid:"",selectedPatients:[],pageName:"群发消息"}
},{
onResult:(popInfo:HMPopInfo)=>{
if (popInfo && popInfo.result && popInfo.result["isRefresh"] !== undefined) {
this.initGetGroupListAction()
}
}
})
} else {
HMRouterMgr.push({pageUrl:'SelectedPatientGroupComp'
},{
onResult:(popInfo:HMPopInfo)=>{
if (popInfo && popInfo.result && popInfo.result["isRefresh"] !== undefined) {
this.initGetGroupListAction()
}
}
})
}
}}),
alignment: DialogAlignment.Center,
offset: { dx: 0, dy: 0 },
autoCancel: true
});
dialog: CustomDialogController = new CustomDialogController({
builder: HdLoadingDialog({ message: '加载中...' }),
customStyle: true,
alignment: DialogAlignment.Center
})
getGroupListAction() {
const hashMap: HashMap<string, string> = new HashMap();
hashMap.set('page', String(this.pageNumber));
this.dialog.open()
hdHttp.httpReq<string>(BasicConstant.listGroupSendMsg, hashMap).then(async (res: HdResponse<string>) => {
this.dialog.close();
logger.info('Response listGroupSendMsg' + res);
let json: Record<string, string> = JSON.parse(res + '') as Record<string, string>;
if (json.code == '200') {
this.controller.refreshSuccess();
this.controller.loadSuccess();
this.totalPage = json.data["pages"]
if (Array.isArray(json.data["list"])) {
this.messageList = [...this.messageList, ...json.data["list"]];
}
} else {
console.error('群发消息列表失败:' + json.message)
promptAction.showToast({ message: String(json.message), duration: 1000 })
}
}).catch((err: BusinessError) => {
this.dialog.close();
this.controller.refreshError();
console.info(`Response fails: ${err}`);
})
}
deleteGroupMessage(uuid: string) {
const hashMap: HashMap<string, string> = new HashMap();
hashMap.set('uuid', uuid);
this.dialog.open()
hdHttp.httpReq<string>(BasicConstant.delGroupSendMsg, hashMap).then(async (res: HdResponse<string>) => {
this.dialog.close();
logger.info('Response listGroupSendMsg' + res);
let json: Record<string, string> = JSON.parse(res + '') as Record<string, string>;
if (json.code == '200') {
promptAction.showToast({ message: '删除成功', duration: 1000 })
this.messageList = this.messageList.filter(item => item.uuid !== uuid);
} else {
console.error('删除群发消息失败:' + json.message)
promptAction.showToast({ message: String(json.message), duration: 1000 })
}
}).catch((err: BusinessError) => {
this.dialog.close();
this.controller.refreshError();
console.info(`Response fails: ${err}`);
})
}
build() {
Column() {
HdNav({
showLeftIcon: true,
title: '群发消息',
showRightText: false,
showRightIcon: false,
isLeftAction: true,
leftItemAction: () => {
router.back()
}
})
PullToRefreshLayout({
scroller: this.scroller,
viewKey: "MessageGroupList",
controller: this.controller,
contentView: () => {
this.contentView()
},
onRefresh: () => {
this.pageNumber = 1
this.messageList = []
this.getGroupListAction()
},
onCanPullRefresh: () => {
if (!this.scroller.currentOffset()) {
return true
}
return this.scroller.currentOffset().yOffset <= 0
},
onCanPullLoad: () => {
if (this.pageNumber >= this.totalPage) {
return false;
} else {
return true;
}
},
onLoad: () => {
this.pageNumber++;
this.getGroupListAction()
}
}).width('100%').height('calc(100% - 176vp)').clip(true)
Text('群发消息')
.width('100%')
.height(50)
.fontSize(16)
.fontColor(Color.White)
.textAlign(TextAlign.Center)
.backgroundColor('rgba(63,199,193,1)')
.margin({ bottom: 20 })
.onClick(() => this.dialogController.open())
}
.width('100%')
}
@Builder
contentView() {
List({ scroller: this.scroller }) {
ForEach(this.messageList, (item: ApiItem) => {
ListItem() {
Column() {
Text(String(item.msg_send_date))
.height(45)
.fontSize(18)
.fontColor('#333333')
Column() {
Blank()
.width('100%')
.height(3)
.backgroundColor($r('app.color.main_color'))
Row() {
Column() {
Text(this.safeGetNameCount(item.realname).toString() + '位患者')
.fontSize(16)
.fontColor('rgba(51,51,51,1)')
.margin({ left: 10,top:10, right: 50 })
.height(30)
Text(String(item.realname))
.fontSize(14)
.fontColor('rgba(102,102,102,1)')
.width('100%')
.margin({ left: 10, right: 50 })
}.width('100%').alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.Start).layoutWeight(1)
Image($r('app.media.message_sendgroup_delete'))
.width(35)
.height(35)
.onClick(() => this.deleteGroupMessage(item.uuid))
}.width('100%').alignItems(VerticalAlign.Top).justifyContent(FlexAlign.Start)
this.lineView()
Column() {
if (item.msg_type == 1) {
Text(String(item.msg_content))
.fontSize(16)
.fontColor('#333333')
.width('100%')
.padding(10)
} else if (item.msg_type == 2) {
Image(BasicConstant.urlImage + String(item.msg_content))
.width(100)
.height(100)
.alt($r('app.media.home_scroll_default1'))
.objectFit(ImageFit.Cover)
.padding(10)
.onClick(()=>{
router.pushUrl({
url: 'pages/Netease/PreviewPhotoPage',
params: { previewIndex:0 ,imgList:[{url:String(item.msg_content)}] as ViewImageInfo[],downLoad:false}
})
})
} else {
this.customMessage(item)
}
}
.width('100%')
.margin({ left: 10, right: 10 })
}
.margin({ left: 10, right: 10 })
.backgroundColor(Color.White)
.borderRadius(5)
Row() {
Blank()
.layoutWeight(1)
Text('再发一条')
.fontSize(12)
.fontColor($r('app.color.main_color'))
.borderRadius(10)
.borderWidth(1)
.borderColor($r('app.color.main_color'))
.width(65)
.height(20)
.textAlign(TextAlign.Center)
.margin({ right: 20, top: 10, bottom: 10 })
.onClick(()=>{
HMRouterMgr.push({pageUrl:'SendGroupMessageComp',param:{'realname':item.realname,'patient_uuid':item.patient_uuid}},{
onResult:(popInfo:HMPopInfo)=>{
if (popInfo && popInfo.result && popInfo.result["isPop"] !== undefined) {
this.initGetGroupListAction()
}
}
})
})
}
.width('100%')
}
.width('100%')
}
})
}
.backgroundColor('#f4f4f4')
.width('100%')
.scrollBar(BarState.Off)
.layoutWeight(1)
EmptyViewComp({promptText:'暂无随访计划',isVisibility:true})
.width('100%')
.height('100%')
.visibility(this.messageList.length>0?Visibility.None:Visibility.Visible)
}
@Builder
lineView() {
Row() {
Blank()
.width(10)
.height(10)
.borderRadius(5)
.backgroundColor('rgba(228,228,228,1)')
.margin({ left: -1 })
Blank()
.width('95%')
.height(1)
.backgroundColor('rgba(228,228,228,1)')
Blank()
.width(10)
.height(10)
.borderRadius(5)
.backgroundColor('rgba(228,228,228,1)')
}
.width('100%')
.height(10)
.margin({ top: 10 })
}
@Builder
customMessage(item: ApiItem) {
Column() {
Text(String(item.msg_type) == '4' ? this.parseMsgContent(item.msg_content).name :
this.parseMsgContent(item.msg_content).topic)
.fontSize(14)
.maxLines(2)
.margin({ left: 10, top: 10, right: 10 })
Row() {
Text(String(item.msg_type) == '5' || String(item.msg_type) == '6' || String(item.msg_type) == '7' ||
String(item.msg_type) == '8' ? this.parseMsgContent(item.msg_content).path :
BasicConstant.urlImage + this.parseMsgContent(item.msg_content).path)
.fontSize(12)
.width('60%')
.maxLines(3)
.fontColor('rgba(127,127,127,1)')
.margin({ left: 10, top: 10, bottom: 10 })
.layoutWeight(1)
Image(String(item.msg_type) == '7' || String(item.msg_type) == '8' ?
this.parseMsgContent(item.msg_content).imgPath :
BasicConstant.urlImage + this.parseMsgContent(item.msg_content).imgPath)
.alt($r('app.media.userPhoto_default'))
.objectFit(ImageFit.Fill)
.width(50)
.height(50)
.margin({ right: 10, bottom: 10 })
}
}
.width('70%')
.borderWidth(0.5)
.borderRadius(5)
.borderColor('#999999')
.margin({ top: 15, bottom: 15 })
.alignItems(HorizontalAlign.Start)
.justifyContent(FlexAlign.Start)
.onClick(()=>{
router.pushUrl({
url: 'pages/WebView/WebPage',
params: {'title':String(item.msg_type) == '4' || String(item.msg_type) == '3'?'患教详情':String(item.msg_type) == '5'?'出/停诊公告':'消息详情','url':String(item.msg_type) == '5' || String(item.msg_type) == '6' || String(item.msg_type) == '7' ||
String(item.msg_type) == '8' ? this.parseMsgContent(item.msg_content).path :
BasicConstant.urlImage + this.parseMsgContent(item.msg_content).path}
})
})
}
safeGetNameCount(realname: string | string[]): number {
if (Array.isArray(realname)) {
return realname.length;
} else if (typeof realname === 'string') {
return realname.split(',').filter(name => name.trim() !== '').length;
}
return 0;
}
parseMsgContent(content: string): CardMsg {
// try {
return JSON.parse(content) as CardMsg
// } catch (e) {
// console.error("JSON 解析失败", e);
// return null;
// }
}
}
interface ApiItem {
uuid: string
realname: string | string[]
msg_content: string
msg_type: number
patient_uuid:string
msg_send_date:string
}
interface CardMsg {
path: string
imgPath: string
topic: string
uuid: string
name:string
}