def retrieve(self, request, *args, **kwargs): res = Reservation.objects.all().filter(id=self.kwargs.get("pk", 0)) if not res: return return_not_find("预约不存在!") res = res[0] # 如果请求的用户不是该预约的病人、医生或者不是管理员时无权限 if ( not res.patient == request.user and not res.doctor == request.user and not request.user.is_staff ): return return_forbiden() if not res.pay_id: return return_not_find("缴费记录不存在!") data = ReservationSerializer(res).data data["pay"] = get_data_nested( res.pay, PayRecordSerializer, PayItemSerializer, "items", "items", True, ) return Response(data=data, status=status.HTTP_200_OK)
def update(self, request, *args, **kwargs): data = request.data # 转换时间 start = data.get("start", None) end = data.get("end", None) if start: start = datetime.datetime.strptime(start, "%H:%M").time() data["start"] = start if end: end = datetime.datetime.strptime(end, "%H:%M").time() data["end"] = end # 预约时间实例 restime = ReservationTime.objects.filter(id=self.kwargs.get("pk")) if not restime: return return_not_find("预约时间段不存在!") restime = restime[0] ser = ReservationTimeSerializer( instance=restime, data=data, partial=True ) if not ser.is_valid(): return return_param_error() ser.save() return return_success("更新成功!")
def destroy(self, request, *args, **kwargs): visit = Visit.objects.filter(id=self.kwargs.get("pk", 0)) if not visit: return return_not_find("坐诊时间不存在!") visit = visit[0] if visit.doctor != request.user and not request.user.is_staff: return return_forbiden() return super().destroy(request, *args, **kwargs)
def retrieve(self, request, *args, **kwargs): time = ReservationTime.objects.all().filter(id=self.kwargs.get("pk", 0)) if not time: return return_not_find("预约时间段不存在!") time = time[0] data = ReservationTimeSerializer(time).data reserved_num = Reservation.objects.all().filter(time_id=time.id).count() data["reserved_num"] = reserved_num return Response(data=data, status=status.HTTP_200_OK)
def create(self, request, *args, **kwargs): """ 分为两种情况 1. 管理员创建,此时需要传入doctor来指定医生 2. 专家医生创建,此时可不传入doctor(传入也不使用) """ data = request.data doctor_id = request.data.pop("doctor", None) date = data.get("date", None) start = data.get("start", None) end = data.get("end", None) if not all((date, start, end)): return return_param_error() # 管理员请求但没有传入doctor if not doctor_id and request.user.is_staff: return return_param_error() expert = Group.objects.get(name="专家医生") # 请求者不是专家医生、不是管理员时无权限 if ( expert not in request.user.groups.all() and not request.user.is_staff ): return return_forbiden() doctor = request.user # 请求者是管理员,doctor需要另外指定 if request.user.is_staff: doctor = User.objects.filter(id=doctor_id) if not doctor: return return_not_find("专家医生未找到!") doctor = doctor[0] # 指定的doctor不是专家医生 if expert not in doctor.groups.all(): return return_param_error() # 转换时间 date = datetime.datetime.strptime(date, "%Y-%m-%d").date() start = datetime.datetime.strptime(start, "%H:%M").time() end = datetime.datetime.strptime(end, "%H:%M").time() data["date"] = date data["start"] = start data["end"] = end data["doctor"] = doctor.id ser = VisitSerializer(data=data) if not ser.is_valid(): return return_param_error() ser.save() return return_success("创建成功!")
def get_medicine(self, request, pk=None): if not pk: return return_param_error() t = MedicineType.objects.all().filter(id=pk) if not t: return return_not_find("药物类型不存在!") t = t[0] if not hasattr(t, "medicine"): return Response(data=[], status=status.HTTP_200_OK) ser = MedicineSerializer(t.medicine, many=True) return Response(data=ser.data, status=status.HTTP_200_OK)
def update(self, request, *args, **kwargs): m = Medicine.objects.all().filter(id=self.kwargs.get("pk", 0)) if not m: return return_not_find("药物不存在!") m = m[0] data = request.data data["modifier"] = request.user.id ser = MedicineSerializer(instance=m, data=data, partial=True) if not ser.is_valid(): print(ser.errors) return return_param_error() ser.save() return return_success("药物更新成功!")
def update(self, request, *args, **kwargs): mt = MedicineType.objects.all().filter(id=self.kwargs.get("pk", 0)) if not mt: return return_not_find("药物类型不存在!") mt = mt[0] data = request.data data["modifier"] = request.user.id ser = MedicineTypeSerializer(instance=mt, data=data, partial=True) if not ser.is_valid(): return return_param_error() ser.save() return return_success("更新药物类型成功!")
def retrieve(self, request, *args, **kwargs): mhr = MedicineHandoutRecord.objects.all().filter( id=self.kwargs.get("pk", 0) ) if not mhr: return return_not_find("药物发放记录不存在!") mhr = mhr[0] data = MedicineHandoutRecordSerializer(mhr).data data["prescription"] = get_data_nested( mhr.prescription, PrescriptionSerializer, PrescriptionItemSerializer, many=True, ) return Response(data=data, status=status.HTTP_200_OK)
def update(self, request, *args, **kwargs): mhr = MedicineHandoutRecord.objects.all().filter( id=self.kwargs.get("pk", 0) ) if not mhr: return return_not_find("药物发放记录不存在!") mhr = mhr[0] # if mhr.handout_status: # return return_param_error("药物已发放,不可更改!") data = {"handout_status": request.data.get("handout_status", None)} if not data["handout_status"]: return return_param_error() data["modifier"] = request.user.id ser = MedicineHandoutRecordSerializer( instance=mhr, data=data, partial=True ) if not ser.is_valid(): print(ser.errors) return return_param_error() mhr = ser.save() # 更改药物库存 if mhr.handout_status == 4: for item in mhr.prescription.items.all(): item.medicine.count -= item.count item.medicine.modifier = request.user item.medicine.save() data = MedicineHandoutRecordSerializer(mhr).data data["prescription"] = get_data_nested( mhr.prescription, PrescriptionSerializer, PrescriptionItemSerializer, many=True, ) return Response(data=data, status=status.HTTP_200_OK)
def update(self, request, *args, **kwargs): visit = Visit.objects.all().filter(id=self.kwargs.get("pk", 0)) if not visit: return return_not_find("坐诊时间不存在!") visit = visit[0] # 不是坐诊时间相关医生、不是管理员时没有操作权限 if request.user != visit.doctor and not request.user.is_staff: return return_forbiden() # 如果是专家医生,不允许指定医生 if not request.user.is_staff: request.data.pop("doctor") data = request.data # 时期、时间转换 date = data.get("date", None) if date: date = datetime.datetime.strptime(date, "%Y-%m-%d").date() data["date"] = date start = data.get("start", None) if start: start = datetime.datetime.strptime(start, "%H:%M").time() data["start"] = start end = data.get("end", None) if end: end = datetime.datetime.strptime(end, "%H:%M").time() data["end"] = end ser = VisitSerializer(instance=visit, data=data, partial=True) if not ser.is_valid(): return return_param_error() ser.save() return return_success("更新成功!")
def update(self, request, *args, **kwargs): res = Reservation.objects.all().filter(id=self.kwargs.get("pk", 0)) if not res: return return_not_find("预约不存在!") res = res[0] # 如果请求的用户不是该预约的病人、医生或者不是管理员时无权限 if ( not res.patient == request.user and not res.doctor == request.user and not request.user.is_staff ): return return_forbiden() data = request.data is_cancel = data.get("is_cancel", None) # 取消预约 if is_cancel: res.is_cancel = 1 res.save() return return_success("取消预约成功!") # TODO: 其他字段检测 return return_success("更新预约成功!")
def create(self, request, *args, **kwargs): data = request.data # 不是管理员时无权指定病人 if not request.user.is_staff: data["patient"] = request.user.id # 是管理员时必须指定病人 elif request.user.is_staff and not data.get("patient", None): return return_param_error() # 转换日期 date = data.get("date", None) if not date: return return_param_error("日期必须填写!") date = datetime.datetime.strptime(date, "%Y-%m-%d").date() data["date"] = date # 验证预约时间段是否还可以预约 time_id = data.get("time", None) if not time_id: return return_param_error() time = ReservationTime.objects.all().filter(id=time_id) if not time: return return_not_find("预约时间段不存在!") time = time[0] # 已经预约了的人数 num = Reservation.objects.all().filter(time=time_id).count() if num >= time.patient_num: return return_param_error("超过最大预约人数,不可预约!") doctor_id = data.get("doctor", None) # 没有指定医生时,代表是普通预约 if not doctor_id: data["is_expert"] = 0 else: data["is_expert"] = 1 # 得到指定的医生 doctor = User.objects.all().filter(id=doctor_id) if not doctor: return return_not_find("医生不存在!") doctor = doctor[0] # 验证指定的医生是否为专家医生 expert = Group.objects.get(name="专家医生") if expert not in doctor.groups.all(): return return_param_error("只能指定专家医生!") # 验证专家是否出诊 visit = Visit.objects.all().filter( Q(doctor_id=doctor_id) & Q(date=date) & Q(start__lte=time.start) & Q(end__gte=time.end) ) if not visit: return return_param_error("专家在此时间不出诊!") visit = visit[0] # 验证专家是否还可预约 num = ( Reservation.objects.all() .filter(Q(is_expert=1) & Q(doctor_id=doctor_id)) .count() ) if num >= visit.patient_num: return return_param_error("超过最大预约人数,不可预约!") data["doctor"] = doctor.id # 验证是不是已经有过预约 if ( Reservation.objects.all() .filter( Q(patient_id=data.get("patient", 0)) & Q(time_id=time_id) & Q(date=date) ) .exists() ): return return_param_error("此时间段已经预约,不可重复预约!") # 验证科室是否可以预约 department = Group.objects.all().filter( id=request.data.get("department", 0) ) if not department: return return_param_error("必须指定科室!") department = department[0] ds = get_all_groups(department) able = Group.objects.get(name="可预约科室") if able not in ds: return return_param_error("科室不可预约!") data["is_cancel"] = 0 data["is_paid"] = 0 data["is_finish"] = 0 ser = ReservationSerializer(data=data) if not ser.is_valid(): return return_param_error() res = ser.save() # 创建缴费记录 pte = PayType.objects.get(name="专家号费用") ptn = PayType.objects.get(name="普通号费用") data = { "creator": request.user.id, "patient": request.user.id, "pay_type": pte.id if doctor_id else ptn.id, } ser = PayRecordSerializer(data=data) if not ser.is_valid(): print(ser.errors) record = ser.save() res.pay = record res.save() data = { "name": pte.name if doctor_id else ptn.name, "count": 1, "price": pte.price if doctor_id else ptn.price, "record": record.id, } ser = PayItemSerializer(data=data) if not ser.is_valid(): print(ser.errors) item = ser.save() # 返回数据组装 data = ReservationSerializer(res).data pay = PayRecordSerializer(res.pay).data pay["items"] = PayItemSerializer(res.pay.items, many=True).data data["pay"] = pay return Response(data=data, status=status.HTTP_201_CREATED)