Пример #1
0
    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)
Пример #2
0
    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("更新成功!")
Пример #3
0
 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)
Пример #4
0
    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)
Пример #5
0
    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("创建成功!")
Пример #6
0
    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)
Пример #7
0
    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("药物更新成功!")
Пример #8
0
    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("更新药物类型成功!")
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
    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("更新成功!")
Пример #12
0
    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("更新预约成功!")
Пример #13
0
    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)