java 状态机 eventbus,GitHub - happyjianguo/consult: 状态机

这个服务有个状态机的例子

问诊服务

咨询单和订单是一对一的关系

方便关联二者用同一个bizcode,同样作为获取云币中心支付token来源

开药门诊,用药申请同时只能有一个,必须到处方审核结束或申请被拒绝才可以关闭

需要增加接口:

判断当前用户咨询单状态,分5个类型

开药问诊订单创建完成后自动支付,顾问和客户的价格怎么设置

患者ID尽量用Long userId = ApiGateway.getUserId();

自测时可以mock

当前是否存在开药问诊

消费ih处方审核结果消息

修改rpc*.xml 注册bean 如kafkasender

支付payGo时需判断当前咨询单状态

支付和退款动作

PatientAdvisoryServiceImpl

payGo, payString

PatientAdvisoryLogic

云币中心扣款付款操作

判断是否会员,权益,获取免费计数,

计数余额(扣除计数)memberAdvisoryRpcService.addFreeAdvisory

云币余额

扣计数或者云币

根据结果更新状态(成功或者失败)

将结果返回给前端

发送IM消息

TODO 提示消息不同

chatMessageService.sendOrderMessage(info.getPatientId(), info.getDoctorId(), info.getId());

计时从支付时开始

修改状态机,添加新的状态

结束咨询单时发送

mqServer.sendFinishMsg(advisory, isDoctor);

特殊医生组具体逻辑

只是在查询涉及医生咨询单状态时,同组医生一同作为条件的逻辑

商城咨询单,同时只能有一个咨询单

//没有咨询中的,去Im看查有没医生发起的聊天

//48小时内有医生发消息的,最后次结束聊天后医生发起了聊天或者完全无聊天的 开启免费咨询

24小时结束咨询单

按是否回复,可以是完成也可以是终止

问题:

状态机和eventBus会把异常吞掉

病人和医生信息从哪取的?

发IM消息

// TODO ---- 可用 ------> todoByliming

chatMessageService.sendFinishAdvisoryMessage(advisory.getDoctorId(), advisory.getPatientId(),

advisory.getSource() != null && advisory.getSource().equals(AdvisoryResource.MEDIC_SALE.name())

? Constants.FINISH_TEXT_24 : Constants.FINISH_TEXT, MessageType.Finish.name());

医生价格维护和收入统计

UserCenterUserService 用户信息

UserExtraReadService 额外信息

payGo

Long patientId = ApiGateway.getUserId();

PatientAdvisoryLogic 云币中心付款退款

特殊医生组

谢春为

if (SpecialDoctorHandler.isSpecialDoctor(request.getDoctorId())) {

info = special(request.getDoctorId(), request.getPatientId(), time);

}

DOCTOR_ADVISORY_PRICE医生咨询价格有效区间{"min": 0, "max": 30000, "defaultPrice": 0, "range": "0-30000"}21536076800000

获取医生额外信息

List userIds = orders.stream().map(OrderInfoDO::getDoctorId).collect(Collectors.toList());

BaseUserInfo user;

UserExtraInfo userExtra;

Map users = userCenterUserService.findUserByIds(userIds);

Map userExtras = userCenterUserService.findUserExtraByUserIds(userIds, column);

if (users != null && !users.isEmpty() && userExtras != null && !userExtras.isEmpty()) {

for (OrderInfoDO o : orders) {

OrderInfoModel model = new OrderInfoModel();

user = users.get(o.getDoctorId());

userExtra = userExtras.get(o.getDoctorId());

model.setDoctorName(user.getName() != null ? user.getName() : user.getNickname());

model.setDescribes(o.getDescribes());

model.setStartTime(o.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

model.setAmount(o.getAmount());

model.setStatus(o.getStatus());

model.setAvatar(user.getAvatar());

model.setDoctorId(o.getDoctorId());

model.setId(o.getId());

if (userExtra.getPairs() != null && userExtra.getPairs().get("hospital") != null) {

model.setHospital(userExtra.getPairs().get("hospital").toString());

}

try {

model.setStatusMsg(AdvisoryStatus.getEnum(o.getStatus()).getDescribe());

}catch (Exception e){

log.warn("AdvisoryStatus:{}",o.getStatus(),e);

}

models.add(model);

}

return models;

}

return new ArrayList<>();

}

// 咨询VIP控糖顾问或vip客服时,判断用户是否为VIP

if ((request.getDoctorId().equals(appConfig.getVipConsultant()) ||

request.getDoctorId().equals(appConfig.getVipCustomerServiceId())) && isVipUser(owner)) {

return free(model, request.getDoctorId(), request.getPatientId());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值