示例#1
0
 def set_vip_price(self):
     """设置会员价格"""
     data = parameter_required(('VIP',))
     csd = Setting.query.filter(Setting.isdelete == 0, Setting.STname == "VIP").first()
     csd_dict = {
         "STname": "VIP",
         "STvalue": data.get("VIP"),
         "STtype": 5
     }
     with db.auto_commit():
         if not csd:
             csd_dict["STid"] = str(uuid.uuid1())
             csd_instance = Setting.create(csd_dict)
             msg = "创建会员价格成功"
         else:
             csd_instance = Setting.query.filter_by_(STid=csd.STid).first_('未找到会员价格')
             csd_instance.update(csd_dict, null='not')
             msg = "更新会员价格成功"
         db.session.add(csd_instance)
     return Success(message=msg)
示例#2
0
 def update_pointtask(self):
     """更新任务积分以及次数"""
     # 后台更新次数以及积分数,负表示仅限次数,0表示无限次,正表示每日可完成次数
     if not (is_admin() or is_hign_level_admin()):
         return AuthorityError()
     data = parameter_required(('ptid', 'ptnumber', 'pttime', 'pticon'))
     if not data.get('ptnumber'):
         data['ptnumber'] = 0
     if not data.get('pttime'):
         data['pttime'] = 0
     pt_dict = {
         "PTnumber": data.get('ptnumber'),
         "PTtime": data.get('pttime'),
         "PTicon": data.get('pticon')
     }
     pt_instance = PointTask.query.filter(PointTask.PTid == data.get('ptid')).first_("未找到该任务")
     with db.auto_commit():
         pt_instance.update(pt_dict, null='not')
         db.session.add(pt_instance)
     return Success(message="更新任务成功")
示例#3
0
    def update_admin_password(self):
        """更新管理员密码"""
        data = parameter_required(('password_old', 'password_new', 'password_repeat'))

        # 校检两次密码是否相同
        pwd_new = data.get('password_new')
        pwd_old = data.get('password_old')
        pwd_repeat = data.get('password_repeat')
        if pwd_new != pwd_repeat:
            raise ParamsError('两次输入的密码不同')
        token = token_to_user_(request.args.get("token"))
        if int(request.args.get('adtype')) == 1:
            ad = Admin.query.filter(Admin.isdelete == 0, Admin.ADid == token.id).first()
            adpassword = ad.ADpassword
            ad_dict = {
                "ADpassword": generate_password_hash(pwd_new)
            }
        elif int(request.args.get('adtype')) == 2:
            ad = Doctor.query.filter(Doctor.isdelete == 0, Doctor.DOid == token.id).first()
            print(ad)
            adpassword = ad.DOpassword
            ad_dict = {
                "DOpassword": generate_password_hash(pwd_new)
            }
        else:
            ad = None
            adpassword = None
            ad_dict = {}
        if ad:
            with db.auto_commit():
                if check_password_hash(adpassword, pwd_old):
                    print(1)
                    self.__check_password(pwd_new)
                    ad.ADpassword = generate_password_hash(pwd_new)
                    ad.update(ad_dict, null='not')
                else:
                    raise ParamsError('旧密码有误')
            db.session.add(ad)
            return Success('更新密码成功')

        raise AuthorityError('账号已被回收')
示例#4
0
    def batch_operation(self):
        data = parameter_required('prstatus', )

        try:
            prstatus = ProductStatus(int(str(data.get('prstatus', 0)))).value
        except:
            raise ParamsError('状态参数异常')

        pridlist = data.get('pridlist', [])
        if not isinstance(pridlist, list):
            raise ParamsError('商品列表格式不对')
        with db.auto_commit():
            exec_sql = Products.query.filter(Products.PRid.in_(pridlist),
                                             Products.isdelete == 0)
            if prstatus == ProductStatus.delete.value:
                # 执行批量删除
                exec_sql.delete_(synchronize_session=False)
                return Success('删除成功')
            exec_sql.update({'PRstatus': prstatus}, synchronize_session=False)

        return Success('{}成功'.format(ProductStatus(prstatus).zh_value))
示例#5
0
def change_consultation_status(conid):
    current_app.logger.info(">>> 更改会诊状态 conid:{} <<<".format(conid))
    try:
        consultation = Consultation.query.filter(
            Consultation.isdelete == false(),
            Consultation.CONid == conid).first()
        if not consultation:
            current_app.logger.error('conid: {} 不存在'.format(conid))
            return
        if consultation.CONstatus != ConsultationStatus.ready.value:
            current_app.logger.error('状态不正确, CONstatus: {}'.format(
                consultation.CONstatus))
            return
        with db.auto_commit():
            consultation.update({'CONstatus': ConsultationStatus.finish.value})
            current_app.logger.info('CONstatus: 0 --> 2')
        conn.delete('change_consultation{}'.format(conid))
    except Exception as e:
        current_app.logger.error('Error: {}'.format(e))
    finally:
        current_app.logger.info(">>> 更改会诊状态任务结束 coid:{} <<<".format(conid))
示例#6
0
    def _over_ordermain(self, omid):
        om = OrderMain.query.filter(
            OrderMain.OMid == omid,
            OrderMain.OMstatus == OrderMainStatus.ready.value,
            OrderMain.isdelete == 0).first()
        if not om:
            current_app.logger.error('完成订单有误,订单ID不存在')
            return
        # 完成订单
        with db.auto_commit():

            omtype = om.OMtype
            if int(omtype) == OrderMainType.product.value and int(
                    om.PRtype) == ProductType.package.value:
                # 课时添加 - 积分商城
                omsmsum = int(om.SMnum) * int(om.OMnum)  # 订单总课时
                classes = json.loads(om.PRcontent)
                if not classes:
                    current_app.logger.error('课时信息录入异常 omid = {}'.format(omid))
                    return
                self._increase_uhnum(om.USid, classes.get('CLid'), omsmsum)

            if int(omtype) == OrderMainType.product.value and int(
                    om.PRtype) == ProductType.coupon.value:
                # 优惠券变为可用
                CouponUser.query.filter(
                    CouponUser.OMid == omid, CouponUser.isdelete == 0).update(
                        {'UCalreadyuse': CouponUserStatus.not_use.value},
                        synchronize_session=False)

            if int(omtype) == OrderMainType.setmeal.value:
                # 课时添加 - 课时套餐
                omsmsum = int(om.SMnum) * int(om.OMnum)
                self._increase_uhnum(om.USid, om.CLid, omsmsum)

        # 积分任务添加 todo 购物积分增加待确认
        current_app.logger.info('get omtype is {}'.format(omtype))
        if int(omtype) == OrderMainType.product.value:
            from .CConfig import CConfig
            CConfig()._judge_point(PointTaskType.buy_product.value, 1, om.USid)
示例#7
0
    def get_wxac(self):
        with db.auto_commit():
            if not self.user.USwxac:

                wxacpath = self.wxacode_unlimit(self.usid)
                self.user.USwxac = wxacpath
            else:
                wxacpath = self.user.USwxac
            wxac = os.path.join(current_app.config['BASEDIR'], wxacpath[1:])
            if os.path.isfile(wxac):
                return wxac
            headurl = ALIOSS_ENDPOINT + self.user.USwxac
            try:
                data = requests.get(headurl)
                with open(wxac, 'wb') as head:
                    head.write(data.content)
                return wxac
            except Exception as e:
                current_app.logger.error(
                    'get avatar error usid = {} exception = {}'.format(
                        self.usid, e))
                return ''
示例#8
0
 def _wallet_trade_setmeal(self, user, truemount, omid):
     """余额支付购买课时"""
     # 增加记录
     with db.auto_commit():
         wr = WalletRecord.create({
             'WRid': str(uuid.uuid1()),
             'USid': user.USid,
             'WRcash': truemount,
             'WRtype': WalletRecordType.trade.value,
             'ContentId': omid,
         })
         db.session.add(wr)
         # 扣除金额
         user.USbalance = user.USbalance - truemount
         db.session.add(user)
         om = OrderMain.query.filter(
             OrderMain.isdelete == 0, OrderMain.OMid == omid,
             OrderMain.OMstatus == OrderMainStatus.wait_pay.value).first()
         if not om:
             current_app.logger.error(f'订单状态错误, 未找到 omid: {omid}')
             return
         om.OMstatus = OrderMainStatus.ready.value
     self._over_ordermain(omid)
示例#9
0
    def get_point(self):
        """领取积分"""
        # 前台领取积分,基于ptid查找uitrue=0且uiaction=pttype的第一条数据,更新uitrue字段
        data = parameter_required(('ptid', ))
        args = request.args.to_dict()
        user = token_to_user_(args['token'])
        pointtask = PointTask.query.filter(PointTask.isdelete == 0,
                                           PointTask.PTid == data.get('ptid')).first_("未找到该任务")
        pttype = pointtask.PTtype
        userintegral = UserIntegral.query.filter(UserIntegral.isdelete == 0, UserIntegral.USid == user.id,
                                                 UserIntegral.UItype == 1, UserIntegral.UItrue == 0,
                                                 UserIntegral.UIaction == pttype)\
            .first_("无可领取积分")
        with db.auto_commit():
            ui_instance = UserIntegral.query.filter(UserIntegral.UIid == userintegral.UIid).first()
            ui_instance.update({"UItrue": 1})
            us_instance = User.query.filter(User.USid == user.id).first()
            usintegral = int(us_instance.USintegral or 0) + int(pointtask.PTnumber or 0)
            us_instance.update({"USintegral": usintegral})
            db.session.add(ui_instance)
            db.session.add(us_instance)

        return Success(message="领取成功")
示例#10
0
 def shorten_parameters(raw, usid, raw_name):
     """
     缩短分享参数
     :param raw: 要分享的参数
     :param usid: 用户id
     :param raw_name: 分享参数名
     :return: 缩短后的参数
     """
     spsid = db.session.query(SharingParameters.SPSid).filter(
         SharingParameters.SPScontent == raw,
         SharingParameters.USid == usid,
         SharingParameters.SPSname == raw_name).scalar()
     current_app.logger.info('exist spsid : {}'.format(spsid))
     if not spsid:
         with db.auto_commit():
             sps = SharingParameters.create({
                 'USid': usid,
                 'SPScontent': raw,
                 'SPSname': raw_name
             })
             db.session.add(sps)
         spsid = sps.SPSid
     return spsid
示例#11
0
    def add_admin(self):
        """超级管理员添加普通管理"""
        if not is_hign_level_admin():
            return AuthorityError()

        data = parameter_required(('adname',))
        adid = str(uuid.uuid1())

        adname = data.get('adname')
        adlevel = 2

        # 账户名校验
        self.__check_adname(adname)
        # 创建管理员
        with db.auto_commit():
            adinstance = Admin.create({
                'ADid': adid,
                'ADname': adname,
                "ADtelphone": "",
                'ADpassword': generate_password_hash("123456"),
                'ADheader': "",
                'ADlevel': adlevel,
                'ADstatus': 0,
            })
            db.session.add(adinstance)

            # 创建管理员变更记录
            an_instance = AdminActions.create({
                'AAid': str(uuid.uuid1()),
                'ADid': "1",
                "AAaction": 1,
                "AAmodel": "Admin",
                'AAdetail': str(data)
            })

            db.session.add(an_instance)
        return Success('创建管理员成功')
示例#12
0
    def sign_up(self):
        """用户报名"""
        if not is_user():
            raise TokenError
        data = parameter_required('acid')
        usid = getattr(request, 'user').id
        user = User.query.filter(User.isdelete == false(),
                                 User.USid == usid).first_('请重新登录')
        if not user.UStelphone:
            raise StatusError("请先在 '我的 - 我的家人' 中完善本人信息")
        activity = Activity.query.filter(
            Activity.isdelete == false(),
            Activity.ACstatus == ActivityStatus.ready.value,
            Activity.ACstartTime >= datetime.now(),
            Activity.ACid == data.get('acid')).first_('活动已结束或不存在')
        if self._ua_filter(
            [UserActivity.USid == usid,
             UserActivity.ACid == activity.ACid]).first():
            raise StatusError('您已报名过该活动')
        if self._query_activity_remain_people(activity) <= 0:
            raise StatusError('该活动报名人数已满,请期待下次活动')
        with db.auto_commit():
            ua = UserActivity.create({
                'UAid': str(uuid.uuid1()),
                'USid': usid,
                'ACid': activity.ACid,
                'UAstatus': UserActivityStatus.ready.value
            })
            db.session.add(ua)

        # 活动报名 积分任务
        from .CConfig import CConfig
        from ..config.enums import PointTaskType
        CConfig()._judge_point(PointTaskType.make_activity.value, 1, user.USid)

        return Success('报名成功', data={'uaid': ua.UAid})
示例#13
0
    def add_register(self):
        data = parameter_required({'deid': '科室', 'redate': '日期', 'reamorpm': '上午或下午', 'faid': '就诊人'})
        usid = getattr(request, 'user').id
        deid, redate, faid, reamorpm = data.get('deid'), data.get('redate'), data.get('faid'), data.get('reamorpm')
        reremarks = data.get('reremarks')
        # 日期校验
        redate = self._check_time(redate)

        # 上午下午校验
        try:
            reamorpm = RegisterAmOrPm(int(str(reamorpm))).value
        except:
            reamorpm = 0
        # 就诊人信息校验
        family = Family.query.filter(
            Family.USid == usid, Family.FAid == faid, Family.isdelete == 0).first_('就诊人信息已删除')
        # 科室信息校验
        dep = Departments.query.filter(Departments.isdelete == 0, Departments.DEid == deid).first_('科室不存在')

        with db.auto_commit():
            register = Register.create({
                'REid': str(uuid.uuid1()),
                'DEid': deid,
                'USid': usid,
                'FAid': faid,
                'REdate': redate,
                'REamOrPm': reamorpm,
                'REremarks': reremarks
            })
            current_app.logger.info('创建挂号 科室 {} 就诊人 {}'.format(dep.DEname, family.FAname))

            db.session.add(register)
        # 预约挂号 积分任务
        from .CConfig import CConfig
        CConfig()._judge_point(PointTaskType.register.value, 1, usid)
        return Success('预约成功{},排队中'.format(dep.DEname))
示例#14
0
    def set_evaluationpoint(self):
        """设置分数区间"""
        data = parameter_required((
            'evid', 'epstart', 'epend',
            'epanswer') if not request.json.get('delete') else ('epid', ))
        epid = data.get("epid")
        if not is_admin():
            return AuthorityError()
        if data.get('epstart') and data.get('epend'):
            epstart = Decimal(str(data.get('epstart') or 0))
            epend = Decimal(str(data.get('epend') or 0))
            if epstart >= epend:
                return PointError("区间大小设置错误")
        else:
            epstart = 0
            epend = 0
        epsharelevel = data.get('epsharelevel')
        if not data.get('delete'):
            try:
                epsharelevel = EvaluationPointLevel(int(epsharelevel)).value
            except:
                raise ParamsError('分享等级目前只支持3级')
            doid = data.get('doid')
            title = data.get('eptitle') or ''
            if len(title) > 4:
                raise ParamsError('分享图标题 长度超标')
            analysis = data.get('epanalysis') or ''
            if len(analysis) > 12:
                raise ParamsError('初步分析 长度超标')

            evaluation = data.get('epevaluation') or ''
            if len(evaluation) > 162:
                raise ParamsError('评估建议 长度超标')
            award = data.get('epaward') or ''
            if len(award) > 15:
                raise ParamsError('奖励语 长度超标')
            shareWords = data.get('epshareWords') or ''
            if len(shareWords) > 63:
                raise ParamsError('分享文案 长度超标')
            ep_dict = {
                "EVid": data.get('evid'),
                "EPstart": epstart,
                "EPtitle": title,
                "EPanalysis": analysis,
                "EPevaluation": evaluation,
                "EPshareWords": shareWords,
                "EPshareLevel": epsharelevel,
                "EPend": epend,
                "EPanswer": data.get('epanswer')
            }
            if epsharelevel == EvaluationPointLevel.good.value:
                if not award:
                    raise ParamsError('请输入奖励词')
                ep_dict['EPaward'] = award
                ep_dict['DOid'] = ''
                ep_dict['DOname'] = ''
            elif epsharelevel == EvaluationPointLevel.vigilant.value:
                doctor = Doctor.query.filter(Doctor.DOid == doid,
                                             Doctor.isdelete == 0).first()
                if not doctor:
                    raise ParamsError('当前医生不存在')
                ep_dict['DOid'] = doid
                ep_dict['DOname'] = doctor.DOname
                ep_dict['EPaward'] = ''
            else:
                ep_dict['EPaward'] = ''
                ep_dict['DOid'] = ''
                ep_dict['DOname'] = ''

            epid = data.get("epid")
            if data.get('evid'):
                filter_args = [
                    EvaluationPoint.EVid == data.get('evid'),
                    EvaluationPoint.isdelete == 0
                ]
                if epid:
                    filter_args.append(EvaluationPoint.EPid != epid)
                ep_list = EvaluationPoint.query.filter(*filter_args).all()
                for ep in ep_list:
                    if not (epstart > Decimal(str(ep["EPend"] or 0))
                            or epend < Decimal(str(ep["EPstart"]) or 0)):
                        return PointError('存在重叠分数区间')
        with db.auto_commit():
            if not epid:
                # 新增
                ep_dict["EPid"] = str(uuid.uuid1())
                ep_instance = EvaluationPoint.create(ep_dict)
                msg = "新增成功"
            else:
                ep_instance = EvaluationPoint.query.filter(
                    EvaluationPoint.EPid == epid).first_("未找到该分数区间")
                if data.get("delete"):
                    ep_instance.update({"isdelete": 1})
                    msg = "删除成功"
                else:
                    ep_instance.update(ep_dict)
                    msg = "修改成功"
            db.session.add(ep_instance)
        return Success(message=msg)
示例#15
0
    def set_course(self):
        """
        课程排班
        """
        data = parameter_required(
            ('clid', 'costarttime', 'coendtime', 'conum'))
        coid = data.get('coid')
        classes = Classes.query.filter(
            Classes.CLid == data.get('clid')).first_("未找到课程信息,请联系管理员")
        doctor = Doctor.query.filter(Doctor.DOid == request.user.id,
                                     Doctor.isdelete == 0).first()
        # 时间控制
        start_time = datetime.datetime.strptime(data.get('costarttime'),
                                                "%Y-%m-%d %H:%M:%S")
        end_time = datetime.datetime.strptime(data.get('coendtime'),
                                              "%Y-%m-%d %H:%M:%S")
        if not (end_time > start_time > datetime.datetime.now()):
            raise ParamsError('课程结束时间要大于开始时间, 开始时间要大于当前时间')
        if start_time.date() != end_time.date():
            return {
                "status": 405,
                "status_code": 405301,
                "message": "课程开始结束时间需要同一天"
            }
        co_dict = {
            "CLid": data.get("clid"),
            "CLname": classes["CLname"],
            "DOid": request.user.id,
            "DOname": doctor["DOname"],
            "COstarttime": data.get("costarttime"),
            "COendtime": data.get("coendtime"),
            "COnum": data.get("conum"),
            "COstatus": 101
        }
        with db.auto_commit():
            if not coid:
                co_dict["COid"] = str(uuid.uuid1())
                co_instance = Course.create(co_dict)
                msg = "创建成功"

                # 添加开始异步任务
                add_async_task(func=change_course_status,
                               start_time=start_time,
                               func_args=(co_dict["COid"], ),
                               conn_id='start_course{}'.format(
                                   co_dict["COid"]))
                # 添加结束异步任务
                add_async_task(func=change_course_status,
                               start_time=end_time,
                               func_args=(co_dict["COid"], True),
                               conn_id='end_course{}'.format(co_dict["COid"]))
            else:
                # 判断课程排班状态和已报名人数,已开始/已结束或者存在报名人员不可修改
                course = Course.query.filter(Course.COid == coid).first()
                if course["COstatus"] != 101:
                    return AuthorityError("无权限")
                subscribe = Subscribe.query.filter(
                    Subscribe.COid == coid).all()
                if subscribe:
                    return AuthorityError("已有人报名,不可修改")
                co_instance = Course.query.filter(
                    Course.COid == coid).first_('未找到该课程排班信息')
                co_instance.update(co_dict, null='not')
                msg = '编辑成功'

                cancel_async_task(conn_id='start_course{}'.format(
                    co_instance.COid))  # 取消已有的开始时间异步任务
                cancel_async_task(conn_id='end_course{}'.format(
                    co_instance.COid))  # 取消已有的结束时间异步任务
                # 重新添加开始异步任务
                add_async_task(func=change_course_status,
                               start_time=start_time,
                               func_args=(co_instance.COid, ),
                               conn_id='start_course{}'.format(
                                   co_instance.COid))
                # 重新添加结束异步任务
                add_async_task(func=change_course_status,
                               start_time=end_time,
                               func_args=(co_instance.COid, True),
                               conn_id='end_course{}'.format(co_instance.COid))
            db.session.add(co_instance)
        return Success(message=msg, data={"coid": co_instance.COid})
示例#16
0
    def add_or_update_video(self):
        data = parameter_required()
        viid = data.get('viid')
        doid = getattr(request, 'user').id
        with db.auto_commit():
            if viid:
                video = Video.query.filter(
                    Video.VIid == viid, Video.isdelete == 0).first()
                current_app.logger.info('get video {} '.format(video))
                # 优先判断删除
                if data.get('delete'):
                    if not video:
                        raise ParamsError('视频已删除')
                    current_app.logger.info('删除视频 {}'.format(doid))
                    video.isdelete = 1
                    db.session.add(video)
                    return Success('删除成功', data=viid)

                # 执行update
                if video:
                    update_dict = video.get_update_dict(data)
                    if update_dict.get('VIid'):
                        update_dict.pop('VIid')
                    if update_dict.get('DOid'):
                        update_dict.pop('DOid')
                    if update_dict.get('VIsort', 0):
                        try:
                            int(update_dict.get('VIsort'))
                        except:
                            raise ParamsError('排序请输入整数')

                    video.update(update_dict)
                    current_app.logger.info('更新视频 {}'.format(viid))
                    db.session.add(video)
                    return Success('更新成功', data=viid)
            # 添加
            data = parameter_required({
                'viname': '剧集名',
                'vimedia': '视频路由',
                'vidur': '视频时长',
                'vithumbnail': '视频缩略图', })

            viid = str(uuid.uuid1())

            if data.get('visort', 0):
                try:
                    int(data.get('visort', 0))
                except:
                    raise ParamsError('排序请输入整数')
            doctor = Video.create({
                'DOid': doid,
                'VIid': viid,
                'VIname': data.get('viname'),
                'VImedia': data.get('vimedia'),
                'VIthumbnail': data.get('vithumbnail'),
                'SEid': data.get('seid'),
                'VIdur': data.get('vidur'),
                'VIbriefIntroduction': data.get('vibriefintroduction'),
                'VIsort': data.get('visort', 0),
            })
            current_app.logger.info('创建视频 {}'.format(data.get('viname')))
            db.session.add(doctor)
        return Success('创建视频成功', data=viid)
示例#17
0
    def _judge_point(self, pttype, uitype, usid, uiintegral=None):
        """判断积分是否可以写入, 如果可以,则写入,如果不可以,则pass"""
        # 前台多api调用,传入type,基于pttime和len(userintegral)判断是否写入
        with db.auto_commit():
            if uitype == 1:
                """收入"""
                pointtask = PointTask.query.filter(PointTask.PTtype == pttype).first_("该类型错误")
                pttime = int(pointtask.PTtime or 0)

                ui_dict = {
                    "UIid": str(uuid.uuid1()),
                    "USid": usid,
                    "UIintegral": pointtask.PTnumber,
                    "UIaction": pttype,
                    "UItype": uitype,
                    "UItrue": 0
                }
                if pttime > 0:
                    # 每日限制次数
                    time_start = datetime.datetime(datetime.datetime.now().year, datetime.datetime.now().month,
                                                   datetime.datetime.now().day, 0, 0, 0)
                    time_end = datetime.datetime(datetime.datetime.now().year, datetime.datetime.now().month,
                                                   datetime.datetime.now().day, 23, 59, 59)
                    # 当日已完成次数
                    userintegral = UserIntegral.query.filter(UserIntegral.createtime > time_start,
                                                             UserIntegral.createtime < time_end,
                                                             UserIntegral.USid == usid,
                                                             UserIntegral.isdelete == 0,
                                                             UserIntegral.UIaction == pttype).all()
                    current_app.logger.info('get userintegral = {} get pttime = {}'.format(len(userintegral), pttime))
                    if len(userintegral) >= pttime:
                        return 0
                    else:
                        ui_instance = UserIntegral.create(ui_dict)
                elif pttime < 0:
                    # 一次性
                    userintegral = UserIntegral.query.filter(UserIntegral.isdelete == 0,
                                                             UserIntegral.UIaction == pttype).all()
                    if userintegral:
                        return 0
                    else:
                        ui_instance = UserIntegral.create(ui_dict)
                else:
                    # 不限次
                    ui_instance = UserIntegral.create(ui_dict)
            elif uitype == 2:
                """支出"""
                ui_dict = {
                    "UIid": str(uuid.uuid1()),
                    "USid": usid,
                    "UIintegral": uiintegral,
                    "UIaction": pttype,
                    "UItype": uitype,
                    "UItrue": 0
                }
                ui_instance = UserIntegral.create(ui_dict)
            else:
                return SystemError("服务端异常")

            db.session.add(ui_instance)
            return 1
示例#18
0
    def add_or_update_example(self):
        data = parameter_required()
        exid = data.get('exid')
        with db.auto_commit():
            if exid:
                exm = Example.query.filter(Example.EXid == exid,
                                           Example.isdelete == 0).first()
                # 优先判断删除
                if data.get('delete'):
                    if not exm:
                        raise ParamsError('案例已删除')
                    current_app.logger.info('删除科室 {}'.format(exid))
                    exm.isdelete = 1
                    db.session.add(exm)
                    return Success('删除成功', data=exid)

                # 执行update
                if exm:
                    update_dict = exm.get_update_dict(data)
                    if update_dict.get('EXid'):
                        update_dict.pop('EXid')
                    if update_dict.get('EXtreated'):
                        extreated = update_dict.get('EXtreated')
                        if not isinstance(extreated, datetime):
                            self._trans_time(str(extreated))
                    if update_dict.get('EXsort'):
                        try:
                            int(update_dict.get('EXsort'))
                        except:
                            raise ParamsError('排序请输入整数')
                    if update_dict.get('EXgender'):
                        try:
                            update_dict['EXgender'] = Gender(
                                int(update_dict.get('EXgender'))).value
                        except:
                            raise ParamsError('性别数据有误')
                    exm.update(update_dict)
                    current_app.logger.info('更新科室 {}'.format(exid))
                    db.session.add(exm)
                    return Success('更新成功', data=exid)
            # 添加
            data = parameter_required({
                'exname': '患者姓名',
                'exgender': '性别',
                'syid': '症状',
                'exalpha': '主图'
            })
            exid = str(uuid.uuid1())

            if data.get('exsort', 0):
                try:
                    int(data.get('exsort', 0))
                except:
                    raise ParamsError('排序请输入整数')

            exm = Example.create({
                'EXid':
                exid,
                "SYid":
                data.get('syid'),
                'EXname':
                data.get('exname'),
                'EXgender':
                data.get('exgender'),
                'EXage':
                data.get('exage'),
                'EXheight':
                data.get('exheight'),
                'EXweight':
                data.get('exweight'),
                'EXaddr':
                data.get('exaddr'),
                'EXtreated':
                data.get('extreated'),
                'EXchiefComplaint':
                data.get('exchiefcomplaint'),
                'EXclinicVisitHistory':
                data.get('exclinicvisithistory'),
                'EXcaseAnalysis':
                data.get('excaseanalysis'),
                'EXinspectionResults':
                data.get('exinspectionresults'),
                'EXdiagnosis':
                data.get('exdiagnosis'),
                'EXtreatmentPrinciple':
                data.get('extreatmentprinciple'),
                'EXtreatmentOutcome':
                data.get('extreatmentoutcome'),
                'EXperoration':
                data.get('experoration'),
                'EXbriefIntroduction':
                data.get('exbriefintroduction'),
                'EXalpha':
                data.get('exalpha'),
                'EXsort':
                data.get('exsort'),
            })

            current_app.logger.info('创建案例 {}'.format(data.get('exname')))
            db.session.add(exm)
        return Success('创建科室成功', data=exid)
示例#19
0
    def create(self):
        data = parameter_required()
        usid = getattr(request, 'user').id
        ucid = data.get('ucid')
        prid = data.get('prid')
        omnum = data.get('omnum', 1)
        uaid = data.get('uaid')
        smid = data.get('smid')
        clid = data.get('clid')
        omtype = data.get('omtype')
        wallet_payment = True if str(
            data.get('wallet_payment')) == '1' else False

        omid = str(uuid.uuid1())

        with db.auto_commit():

            now = datetime.now()

            user = User.query.filter(User.USid == usid,
                                     User.isdelete == 0).first_('token过期, 请刷新')
            if omtype == OrderMainType.product.value:
                ua = UserAddress.query.filter(
                    UserAddress.UAid == uaid, UserAddress.USid == usid,
                    UserAddress.isdelete == 0).first_('地址已删除')
                apname, acname, aaname = db.session.query(
                    AddressProvince.APname, AddressCity.ACname,
                    AddressArea.AAname).filter(
                        AddressArea.AAid == ua.AAid,
                        AddressCity.ACid == AddressArea.ACid,
                        AddressProvince.APid == AddressCity.APid,
                    ).first()
                omrecvaddress = '{}{}{}{}'.format(apname, acname, aaname,
                                                  ua.UAtext)
            else:
                ua = None
                omrecvaddress = None

            uc = None
            if ucid:
                # 优惠券是否可用
                uc = CouponUser.query.filter(
                    CouponUser.UCid == ucid, CouponUser.isdelete == 0,
                    CouponUser.COstarttime <= now, CouponUser.COendtime >= now,
                    CouponUser.UCalreadyuse ==
                    CouponUserStatus.not_use.value).first_('优惠券已使用')
            # usecoupon = False
            try:
                omnum = int(omnum)
                if omnum <= 0:
                    raise ParamsError('{} 需要是正整数'.format('商品数量'))
            except:
                raise ParamsError('{}需要是整数'.format('商品数量'))

            opayno = wx_pay.nonce_str
            try:
                omtype = OrderMainType(int(str(omtype))).value
            except:
                raise ParamsError('订单创建异常')

            if omtype == OrderMainType.product.value:
                body, truemount, omintegralpayed = self._create_product_order(
                    prid, omid, omnum, user, opayno, ua, omrecvaddress, uc)
            elif omtype == OrderMainType.setmeal.value:
                omintegralpayed = 0
                if smid == "1":
                    omnum = 1
                elif smid == "2":
                    pass
                else:
                    setmeal = Setmeal.query.filter(
                        Setmeal.SMid == smid, Setmeal.isdelete == 0).first()
                    omnum = setmeal.SMnum
                body, truemount = self._create_setmeal_order(
                    smid, clid, omid, user, uc, omnum, opayno, wallet_payment)
            else:
                raise ParamsError('订单创建异常')

        from ..extensions.tasks import auto_cancle_order
        # auto_cancle_order.apply_async(args=(omid,), countdown=30 * 60, expires=40 * 60, )
        # todo 修改自动取消为30 minute
        add_async_task(func=auto_cancle_order,
                       start_time=now + timedelta(minutes=30),
                       func_args=(omid, ))
        # # 生成支付信息
        # body = product.PRtitle
        openid = user.USopenid

        # todo 修改支付参数获取
        if not truemount:
            pay_type = OrderPayType.integral.value
            pay_args = 'integralpay'
            self._over_ordermain(omid)
        elif not omintegralpayed:
            if wallet_payment and omtype == OrderMainType.setmeal.value:
                if truemount > user.USbalance:
                    raise StatusError('用户余额不足: {}'.format(user.USbalance))
                self._wallet_trade_setmeal(user, truemount, omid)
                pay_args = 'wallet_payment'
                pay_type = OrderPayType.wallet.value
            else:
                pay_args = self._pay_detail(opayno,
                                            float(truemount),
                                            body,
                                            openid=openid)
                # pay_args = 'wxpay'
                pay_type = OrderPayType.wx.value
        else:
            pay_args = self._pay_detail(opayno,
                                        float(truemount),
                                        body,
                                        openid=openid)
            # pay_args = 'wxpay'
            pay_type = OrderPayType.mix.value

        response = {'paytype': pay_type, 'args': pay_args}
        return Success('下单成功', data=response)
示例#20
0
    def add_or_update_dep(self):
        data = parameter_required()
        deid = data.get('deid', '')
        with db.auto_commit():
            if deid:
                dep = Departments.query.filter(
                    Departments.DEid == deid,
                    Departments.isdelete == 0).first()
                # 优先判断删除
                if data.get('delete'):
                    if not dep:
                        raise ParamsError('科室已删除')
                    current_app.logger.info('删除科室 {}'.format(deid))
                    dep.isdelete = 1
                    db.session.add(dep)
                    return Success('删除成功', data=deid)

                # 执行update
                if dep:

                    update_dict = dep.get_update_dict(data)
                    if update_dict.get('DEid'):
                        update_dict.pop('DEid')
                    if update_dict.get('DEsort'):
                        try:
                            int(update_dict.get('DEsort'))
                        except:
                            raise ParamsError('排序请输入整数')
                    # 更新症状
                    if data.get('symptoms'):
                        self._add_or_update_symptom(dep, data.get('symptoms'))
                    update_dict['DEalpha'] = data.get('dalpha')
                    dep.update(update_dict)
                    current_app.logger.info('更新科室 {}'.format(deid))
                    db.session.add(dep)
                    return Success('更新成功', data=deid)
            # 添加
            data = parameter_required({
                'dename': '科室名',
                'dalpha': '科室主图',
                'deintroduction': '科室介绍',
                'deicon': '科室小icon',
                'deicon2': '科室大icon'
            })
            deid = str(uuid.uuid1())

            if data.get('desort', 0):
                try:
                    int(data.get('desort', 0))
                except:
                    raise ParamsError('排序请输入整数')

            dep = Departments.create({
                'DEid':
                deid,
                'DEname':
                data.get('dename'),
                'DEalpha':
                data.get('dalpha'),
                'DEintroduction':
                data.get('deintroduction'),
                'DEicon':
                data.get('deicon'),
                'DEsort':
                data.get('desort', 0),
                'DEicon2':
                data.get('deicon2')
            })
            if data.get('symptoms'):
                self._add_or_update_symptom(dep, data.get('symptoms'))
            current_app.logger.info('创建科室 {}'.format(data.get('dename')))
            db.session.add(dep)
        return Success('创建科室成功', data=deid)
示例#21
0
    def set_coupon(self):
        """
        创建/编辑/删除优惠券
        """
        if not is_admin():
            return AuthorityError('无权限')
        data = parameter_required(('costarttime', "coendtime", "cosubtration", "colimitnum")
                                  if not request.json.get('delete') else('coid',))
        if data.get('codownline'):
            codownline = data.get('codownline')
        else:
            codownline = 0
        costarttime = data.get('costarttime')
        coendtime = data.get('coendtime')
        if costarttime:
            start_time = datetime.datetime.strptime(costarttime, "%Y-%m-%d %H:%M:%S")
        else:
            start_time = datetime.datetime.now()
        if coendtime:
            end_time = datetime.datetime.strptime(coendtime, "%Y-%m-%d %H:%M:%S")
        else:
            end_time = datetime.datetime.now()
        co_dict = {
            'COstarttime': costarttime,
            'COendtime': coendtime,
            'COdownline': codownline,
            'COlimitnum': data.get('colimitnum'),
            'COsubtration': Decimal(str(data.get('cosubtration') or 0)),
            'COgetnum': 0
        }
        coid = data.get('coid')
        with db.auto_commit():
            if not coid:
                """新增"""
                if end_time < start_time or datetime.datetime.now() > start_time:
                    return TimeError()
                co_dict['COid'] = str(uuid.uuid1())
                co_dict["COstatus"] = 501
                co_instance = Coupon.create(co_dict)
                msg = '添加成功'

                # 添加优惠券到期时的定时任务
                add_async_task(func=change_coupon_status, start_time=end_time,
                               func_args=(co_dict['COid'],), conn_id='end_coupon{}'.format(co_dict['COid']))
            else:
                """修改/删除"""
                co_instance = Coupon.query.filter(Coupon.COid == coid).first_('未找到该优惠券信息')
                cancel_async_task(conn_id='end_coupon{}'.format(co_instance.COid))  # 取消已有定时任务
                if data.get('delete'):
                    co_instance.update({'isdelete': 1})
                    msg = '删除成功'
                else:
                    if not (end_time > start_time >= datetime.datetime.now()):
                        raise TimeError('结束时间需大于开始时间,开始时间需大于当前时间')
                    co_instance.update(co_dict, null='not')
                    msg = '编辑成功'

                    # 重新添加优惠券到期时的定时任务
                    add_async_task(func=change_coupon_status, start_time=end_time,
                                   func_args=(co_instance.COid,), conn_id='end_coupon{}'.format(co_instance.COid))
            db.session.add(co_instance)
        return Success(message=msg)
示例#22
0
    def add_or_update_product(self):
        data = parameter_required()
        # return
        # todo 修复
        adid = getattr(request, 'user').id
        admin = Admin.query.filter(
            Admin.ADid == adid, Admin.isdelete == 0,
            Admin.ADstatus == AdminStatus.normal.value).first_('当前管理员账号已冻结')

        prid, prprice, prvipprice, prtype, prstatus, printegral, prvipintegral, prstock, prsort, prdetails, smnum = (
            data.get('prid'), data.get('prprice'), data.get('prvipprice'),
            data.get('prtype'), data.get('prstatus'), data.get('printegral'),
            data.get('prvipintegral'), data.get('prstock'), data.get('prsort'),
            data.get('prdetails'), data.get('smnum'))
        deid = data.get('deid')
        if prprice:
            prprice = self._trans_decimal(prprice)
        if prvipprice:
            prvipprice = self._trans_decimal(prvipprice)
        if prtype:
            try:
                prtype = ProductType(int(prtype)).value
            except:
                raise ParamsError('商品类型参数异常')
            if prtype == ProductType.coupon.value and not data.get('coid'):
                raise ParamsError('缺少优惠券参数')
            if prtype == ProductType.package.value and not data.get('clid'):
                raise ParamsError('缺少课程参数')

        if prstatus:
            try:
                prstatus = ProductStatus(int(str(prstatus))).value
            except:
                raise ParamsError('商品状态参数异常')
        if data.get('coid') and prtype == ProductType.coupon.value:
            # 优惠券是否可用
            Coupon.query.filter(Coupon.COid == data.get('coid'),
                                Coupon.COstatus == CouponStatus.use.value,
                                Coupon.isdelete == 0).first_('优惠券不可用')
        if data.get('clid') and prtype == ProductType.package.value:
            # 课程是否可用
            Classes.query.filter(Classes.CLid == data.get('clid'),
                                 Classes.isdelete == 0).first_('课程不存在')

        if printegral:
            printegral = self._check_int(printegral, '商品积分')
        if prvipintegral:
            prvipintegral = self._check_int(prvipintegral, '商品积分')
        if prstock:
            prstock = self._check_int(prstock, '商品库存')
        if prsort:
            prsort = self._check_int(prsort, '商品排序')
        if smnum:
            smnum = self._check_int(smnum, '课时数')
        if prdetails:
            if not isinstance(prdetails, list):
                raise ParamsError('prdetails 格式不对')
        if deid:
            Departments.query.filter(Departments.DEid == deid,
                                     Departments.isdelete == 0).first_('科室已删除')
        else:
            deid = ''

        with db.auto_commit():
            if prid:
                product = Products.query.filter(
                    Products.PRid == prid, Products.isdelete == 0).first()
                current_app.logger.info('get product {} '.format(product))
                # 优先判断删除
                if data.get('delete'):
                    if not product:
                        raise ParamsError('商品已删除')
                    current_app.logger.info('删除商品 {}'.format(prid))
                    product.isdelete = 1
                    db.session.add(product)
                    return Success('删除成功', data=prid)
                if product.PRstatus == ProductStatus.usual.value and prstatus == ProductStatus.usual.value:
                    raise StatusError('商品需要先下架才能修改')

                # 执行update
                if product:

                    update_dict = product.get_update_dict(data)
                    if prprice:
                        update_dict['PRprice'] = prprice
                    if prvipprice:
                        update_dict['PRvipPrice'] = prvipprice
                    if prtype:
                        update_dict['PRtype'] = prtype
                    if prstatus:
                        update_dict['PRstatus'] = prstatus
                    if printegral:
                        update_dict['PRintegral'] = printegral
                    if prvipintegral:
                        update_dict['PRvipIntegral'] = prvipintegral
                    if prstock:
                        update_dict['PRstock'] = prstock
                    if prsort:
                        update_dict['PRsort'] = prsort
                    if smnum:
                        update_dict['SMnum'] = smnum

                    update_dict['DEid'] = deid
                    product.update(update_dict)
                    current_app.logger.info('更新商品信息 {}'.format(prid))
                    db.session.add(product)
                    return Success('更新成功', data=prid)
            # 添加
            data = parameter_required({
                'prtitle': '商品名',
                'prtype': '商品类型',
                'prstock': '库存'
            })

            prid = str(uuid.uuid1())
            product = Products.create({
                'PRid': prid,
                'PRtitle': data.get('prtitle'),
                'PRtype': prtype,
                'PRmedia': data.get('prmedia'),
                'PRstatus': ProductStatus.auditing.value,
                'PRprice': prprice,
                'PRvipPrice': prvipprice,
                'PRintegral': printegral,
                'PRvipIntegral': prvipintegral,
                'PRstock': prstock,
                'COid': data.get('coid'),
                'CLid': data.get('clid'),
                'PRdetails': data.get('prdetails'),
                'PRdesc': data.get('prdesc'),
                'PRsort': prsort,
                'DEid': deid,
                'SMnum': smnum,
            })

            current_app.logger.info('{} 创建商品 {}'.format(
                admin.ADid, data.get('prtitle')))
            db.session.add(product)
        return Success('创建商品成功', data=prid)
示例#23
0
 def set_activity(self):
     """管理员 添加/编辑活动"""
     data = request.json
     acstarttime, acnumber = data.get('acstarttime'), data.get('acnumber')
     acid = data.get('acid')
     time_now = datetime.now()
     if acstarttime and not validate_datetime(acstarttime):
         raise ParamsError('活动时间格式错误')
     acstarttime = datetime.strptime(
         acstarttime, format_for_web_second) if acstarttime else None
     if acstarttime and acstarttime <= time_now:
         raise ParamsError('活动时间应大于当前时间')
     if acnumber and (not str(acnumber).isdigit() or int(acnumber) == 0):
         raise ParamsError('活动人数应为大于0的整数')
     required_dict = {
         'acname': '活动名称',
         'acbanner': '活动图片',
         'acorganizer': '举办人',
         'acstarttime': '活动时间',
         'aclocation': '活动地点',
         'acdetail': '活动介绍',
         'acnumber': '活动人数'
     }
     ac_dict = {
         'ACname': data.get('acname'),
         'ACbanner': data.get('acbanner'),
         'ACorganizer': data.get('acorganizer'),
         'ACstartTime': acstarttime,
         'AClocation': data.get('aclocation'),
         'ACdetail': data.get('acdetail'),
         'ACnumber': acnumber
     }
     with db.auto_commit():
         if not acid:
             if Activity.query.filter(
                     Activity.isdelete == false(),
                     Activity.ACname == data.get('acname'),
                     Activity.ACstartTime == acstarttime).first():
                 raise ParamsError('您已添加过 {} 活动'.format(data.get('acname')))
             parameter_required(required_dict, datafrom=data)
             ac_dict['ACid'] = str(uuid.uuid1())
             ac_dict['ADid'] = getattr(request, 'user').id
             ac_dict['ACstatus'] = ActivityStatus.ready.value
             activity = Activity.create(ac_dict)
             msg = '添加成功'
             # 添加异步任务
             add_async_task(func=change_activity_status,
                            start_time=acstarttime,
                            func_args=(ac_dict['ACid'], ),
                            conn_id='start_activity{}'.format(
                                ac_dict['ACid']))
         else:
             activity = Activity.query.filter(
                 Activity.isdelete == false(),
                 Activity.ACid == acid).first_('活动不存在')
             self._can_activity_edit(activity)
             # 取消已有的异步任务
             cancel_async_task(
                 conn_id='start_activity{}'.format(activity.ACid))
             if data.get('delete'):
                 activity.update({'isdelete': True})
                 msg = '删除成功'
             elif data.get('close'):
                 activity.update({'ACstatus': ActivityStatus.close.value})
                 msg = '活动关闭成功'
             else:
                 parameter_required(required_dict, datafrom=data)
                 # 重新添加异步任务
                 add_async_task(func=change_activity_status,
                                start_time=acstarttime,
                                func_args=(activity.ACid, ),
                                conn_id='start_activity{}'.format(
                                    activity.ACid))
                 ac_dict['ACstatus'] = ActivityStatus.ready.value
                 activity.update(ac_dict)
                 msg = '更新成功'
         db.session.add(activity)
         return Success(message=msg, data={'acid': activity.ACid})
示例#24
0
    def set_review(self):
        """
        创建评论
        """
        if not is_user():
            return AuthorityError()
        data = parameter_required(("rvcontent", "rvtype", "rvtypeid", "rvnum"))
        usid = request.user.id
        rvtype = int(data.get('rvtype'))
        rvtypeid = data.get('rvtypeid')
        if rvtype == 401:
            """课程"""
            subscribe = Subscribe.query.filter(Subscribe.SUid == rvtypeid).first_("未找到预约信息")
            classes = Course.query.filter(Course.COid == subscribe.COid).first_("未找到该课程排班")
            doid = classes["DOid"]
        elif rvtype == 402:
            """挂诊"""
            register = Register.query.filter(Register.REid == rvtypeid).first_("未找到该挂诊信息")
            doid = register["DOid"]
        elif rvtype == 403:
            """活动"""
            doid = None
        elif rvtype == 404:
            """案例"""
            doid = None
        elif rvtype == 405:
            """视频"""
            video = Video.query.filter(Video.VIid == rvtypeid).first_("未找到该视频信息")
            doid = video["DOid"]
        else:
            return StatusError("评论种类异常")
        rvid = str(uuid.uuid1())
        user_dict = User.query.filter(User.USid == usid).first_("未找到该用户")
        if (rvtype == 401 or rvtype == 402) and Review.query.filter(
                Review.isdelete == 0, Review.USid == usid, Review.RVtype == rvtype,
                Review.RVtypeid == data.get('rvtypeid')).first():
            raise StatusError('您已进行过评价')
        rv_dict = {
            "USid": usid,
            "USname": user_dict["USname"],
            "USavatar": user_dict["USavatar"],
            "RVcontent": data.get('rvcontent'),
            "DOid": doid,
            "RVtype": rvtype,
            "RVtypeid": data.get('rvtypeid'),
            "RVnum": Decimal(str(data.get('rvnum') or 0))
        }
        if data.get('rppicture_list'):
            rppicture_list = data.get('rppicture_list')
        else:
            rppicture_list = []
        with db.auto_commit():
            if rvtype == 401:
                subscribe_instance = Subscribe.query.filter(Subscribe.SUid == rvtypeid).first_("未找到预约信息")
                subscribe_instance.update({
                    "SUstatus": 203
                })
                db.session.add(subscribe_instance)
            elif rvtype == 402:
                register_instance = Register.query.filter(Register.REid == rvtypeid).first_("未找到该挂诊信息")
                register_instance.update({
                    "REstatus": 4
                })
                db.session.add(register_instance)
            elif rvtype == 403:
                #  更改用户活动状态为已评价
                rv_dict["RVtypeid"] = self._change_user_activity_comment_status(rvtypeid, usid)
            else:
                pass
            for repicture in rppicture_list:
                rp_dict = {
                    "RPid": str(uuid.uuid1()),
                    "RVid": rvid,
                    "RPpicture": repicture["rppicture"]
                }
                rv_instance = ReviewPicture.create(rp_dict)
                db.session.add(rv_instance)
            rv_dict["RVid"] = rvid
            rv_instance = Review.create(rv_dict)
            db.session.add(rv_instance)
        from .CConfig import CConfig
        from ..config.enums import PointTaskType
        CConfig()._judge_point(PointTaskType.review.value, 1, usid)

        return Success("评论成功")
示例#25
0
 def make_evaluation(self):
     """提交评测"""
     data = parameter_required(('evid', 'ei_list'))
     # user = getattr(request, 'user')
     if not is_user():
         raise AuthorityError('权限不足')
     usid = getattr(request, 'user').id
     evid = data.get('evid')
     anid = str(uuid.uuid1())
     with db.auto_commit():
         point = Decimal(0.0)
         evaluationitem_all = EvaluationItem.query.filter(
             EvaluationItem.isdelete == 0,
             EvaluationItem.EVid == evid).all()
         if len(evaluationitem_all) != len(data.get('ei_list')):
             return EvaluationNumError()
         for ei in data.get('ei_list'):
             eiid = ei["eiid"]
             eaid = ei["eaid"]
             evaluationitem = EvaluationItem.query.filter(EvaluationItem.EIid == eiid,
                                                          EvaluationItem.isdelete == 0) \
                 .first_("未找到该题目")
             evaluationanswer = EvaluationAnswer.query.filter(EvaluationAnswer.EAid == eaid,
                                                              EvaluationAnswer.isdelete == 0) \
                 .first_("未找到该选项")
             ai_dict = {
                 "AIid": str(uuid.uuid1()),
                 "EIname": evaluationitem["EIname"],
                 "EAindex": evaluationanswer["EAindex"],
                 "EApoint": evaluationanswer["EApoint"],
                 "EAname": evaluationanswer["EAname"],
                 "USid": usid,
                 "ANid": anid
             }
             point = Decimal(str(evaluationanswer["EApoint"]
                                 or 0)) + Decimal(str(point or 0))
             ai_instance = AnswerItem.create(ai_dict)
             db.session.add(ai_instance)
         evaluation = Evaluation.query.filter(
             Evaluation.isdelete == 0,
             Evaluation.EVid == evid).first_("未找到该评测")
         # 总积分逻辑改为平均分
         # point = Decimal(str(point / len(evaluationitem_all)))
         current_app.logger.info(point)
         evaluationpoint = EvaluationPoint.query.filter(EvaluationPoint.EPstart <= point,
                                                        EvaluationPoint.EVid == evid,
                                                        EvaluationPoint.EPend >= point,
                                                        EvaluationPoint.isdelete == 0) \
             .first_("未找到评测结论")
         answer = evaluationpoint["EPanswer"]
         an_dict = {
             "ANid": anid,
             "USid": usid,
             "EVid": evid,
             "EVname": evaluation["EVname"],
             "EVpoint": point,
             "EPanswer": answer
         }
         an_instance = Answer.create(an_dict)
         share_url = Share(usid, point, an_instance).drawshare()
         an_instance.EVshare = share_url
         db.session.add(an_instance)
         # todo 创建分享图
     from .CConfig import CConfig
     from ..config.enums import PointTaskType
     CConfig()._judge_point(PointTaskType.make_evaluation.value, 1, usid)
     return Success(message="提交评测成功",
                    data={
                        "answer": answer,
                        'share': HTTP_HOST + share_url
                    })
示例#26
0
    def add_or_update_doctor(self):
        data = parameter_required()
        doid = data.get('doid')
        # password = data.get('dopassword')
        dotel = data.get('dotel')
        if dotel:
            validate_telephone(dotel)
        with db.auto_commit():
            if doid:
                doctor = Doctor.query.filter(Doctor.DOid == doid,
                                             Doctor.isdelete == 0).first()
                current_app.logger.info('get doctor {} '.format(doctor))
                # 优先判断删除
                if data.get('delete'):
                    if not doctor:
                        raise ParamsError('医生已删除')
                    current_app.logger.info('删除科室 {}'.format(doid))
                    doctor.isdelete = 1
                    db.session.add(doctor)
                    return Success('删除成功', data=doid)

                # 执行update
                if doctor:
                    if Doctor.query.filter(Doctor.DOid != doid,
                                           Doctor.DOtel == dotel,
                                           Doctor.isdelete == 0).first():
                        raise ParamsError(f'已存在使用手机号"{dotel}"的其他医生账户, 请检查后重试')
                    update_dict = doctor.get_update_dict(data)
                    if update_dict.get('DOid'):
                        update_dict.pop('DOid')
                    if update_dict.get('DOsort', 0):
                        try:
                            int(update_dict.get('DOsort'))
                        except:
                            raise ParamsError('排序请输入整数')
                    if update_dict.get('DOpassword'):
                        update_dict.pop('DOpassword')

                    # 更新医生列表图片
                    if data.get('doctorlistpic'):
                        self._add_or_update_list_pic(doctor,
                                                     data.get('doctorlistpic'))
                    # 更新医生主图
                    if data.get('doctormainpic'):
                        self._add_or_update_media_pic(
                            doctor, data.get('doctormainpic'),
                            DoctorMetiaType.mainpic.value)
                    # 更新医生二维码
                    if data.get('doctorqrpic'):
                        self._add_or_update_media_pic(
                            doctor, data.get('doctorqrpic'),
                            DoctorMetiaType.qrpic.value)

                    doctor.update(update_dict)
                    current_app.logger.info('更新医生 {}'.format(doid))
                    db.session.add(doctor)
                    return Success('更新成功', data=doid)
            # 添加
            data = parameter_required({
                'doname': '医生名',
                'dotel': '医生电话',
                'dotitle': '医生职称',
                'deid': '科室',
                'doctormainpic': '医生主图',
                'dodetails': '医生简介',
                'dowxid': '医生微信ID',
                'doskilledin': '擅长方向'
            })

            if Doctor.query.filter(Doctor.DOtel == dotel,
                                   Doctor.isdelete == 0).first():
                raise ParamsError(f'已存在使用手机号"{dotel}"的医生账户, 请检查后重试')
            doid = str(uuid.uuid1())

            if data.get('dosort', 0):
                try:
                    int(data.get('dosort', 0))
                except:
                    raise ParamsError('排序请输入整数')

            doctor = Doctor.create({
                'DOid':
                doid,
                'DOname':
                data.get('doname'),
                'DOtel':
                dotel,
                'DOtitle':
                data.get('dotitle'),
                'DOdetails':
                data.get('dodetails'),
                'DOwxid':
                data.get('dowxid'),
                'DOskilledIn':
                data.get('doskilledin'),
                'DOsort':
                data.get('dosort', 0),
                'DOpassword':
                generate_password_hash(str(data.get('dotel'))[-6:]),
                'DEid':
                data.get('deid')
            })
            if data.get('doctorlistpic'):
                self._add_or_update_list_pic(doctor, data.get('doctorlistpic'))
            # 更新医生主图
            if data.get('doctormainpic'):
                self._add_or_update_media_pic(doctor,
                                              data.get('doctormainpic'),
                                              DoctorMetiaType.mainpic.value)
            # 更新医生二维码
            if data.get('doctorqrpic'):
                self._add_or_update_media_pic(doctor, data.get('doctorqrpic'),
                                              DoctorMetiaType.qrpic.value)
            current_app.logger.info('创建医生 {}'.format(data.get('doname')))
            db.session.add(doctor)
        return Success('创建医生成功', data=doid)
示例#27
0
    def add_or_update_consultation(self):
        data = parameter_required()
        doid = getattr(request, 'user').id
        conid = data.get('conid')
        constarttime, conendtime, conlimit, constatus = data.get('constarttime'), data.get('conendtime'), \
                                                        data.get('conlimit'), data.get('constatus')

        constarttime = self._check_time(constarttime)
        conendtime = self._check_time(conendtime)
        now = datetime.now()
        if constarttime and constarttime < now:
            raise ParamsError('开始时间不能小于当前时间')
        if constarttime and conendtime and constarttime > conendtime:
            raise ParamsError('结束时间不能小于开始时间')

        if conlimit:
            try:
                conlimit = int(str(conlimit))
                if conlimit < 0:
                    raise ParamsError('限制人数只能为正整数')
            except:
                raise ParamsError('限制人数只能为正整数')

        if constatus:
            try:
                constatus = ConsultationStatus(int(str(constatus))).value
            except:
                raise ParamsError('状态修改参数异常')

        with db.auto_commit():
            if conid:
                con = Consultation.query.filter(
                    Consultation.CONid == conid,
                    Consultation.isdelete == 0).first()
                current_app.logger.info('get doctor {} '.format(con))
                # 优先判断删除
                if data.get('delete'):
                    if not con:
                        raise ParamsError('医生已删除')
                    current_app.logger.info('删除会诊 {}'.format(conid))
                    con.isdelete = 1
                    db.session.add(con)
                    cancel_async_task(conn_id='change_consultation{}'.format(
                        conid))  # 取消已有定时任务
                    return Success('删除成功', data=conid)

                # 执行update
                if con:
                    cancel_async_task(conn_id='change_consultation{}'.format(
                        conid))  # 取消已有定时任务
                    #  只能修改这个4个字段
                    update_dict = {}
                    if constarttime:
                        update_dict['CONstartTime'] = constarttime
                    if conendtime:
                        update_dict['CONendTime'] = conendtime
                    if constatus:
                        update_dict['CONstatus'] = constatus
                    if conlimit:
                        update_dict['CONlimit'] = conlimit
                    con.update(update_dict)
                    current_app.logger.info('更新会诊信息 {}'.format(conid))
                    db.session.add(con)
                    # 到开始时间更改状态, 除手动关闭外
                    if constatus != ConsultationStatus.finish.value:
                        add_async_task(
                            func=change_consultation_status,
                            start_time=constarttime,
                            func_args=(conid, ),
                            conn_id='change_consultation{}'.format(conid))
                    return Success('更新成功', data=conid)
            # 添加
            data = parameter_required({
                'constarttime': '开始时间',
                'conlimit': '限制人数'
            })

            conid = str(uuid.uuid1())
            doctor = Doctor.query.filter(Doctor.DOid == doid,
                                         Doctor.isdelete == 0).first_('医生已删除')
            dep = Departments.query.filter(
                Departments.DEid == doctor.DEid,
                Departments.isdelete == 0).first_('科室已删除')
            con = Consultation.create({
                'CONid': conid,
                'DOid': doid,
                'CONstartTime': constarttime,
                'CONendTime': conendtime,
                'CONlimit': conlimit,
                'CONnote': data.get('connote'),
                'DOname': doctor.DOname,
                'DOtel': doctor.DOtel,
                'DOtitle': doctor.DOtitle,
                'DOdetails': doctor.DOdetails,
                'DOwxid': doctor.DOwxid,
                'DOskilledIn': doctor.DOskilledIn,
                'DEname': dep.DEname,
                'DEid': dep.DEid,
            })

            current_app.logger.info('创建会诊 {}'.format(doid))
            db.session.add(con)
            # 到开始时间更改状态
            add_async_task(func=change_consultation_status,
                           start_time=constarttime,
                           func_args=(conid, ),
                           conn_id='change_consultation{}'.format(conid))
        return Success('创建会诊成功', data=conid)