def get_review(self): """获取评论""" """案例404id/医生id/活动id403/视频id405/评价人名称==>rvtype+rvtypeid/usname/doid""" """当前使用场景用于pc后台和前台业务页面,不涉及用户个人""" args = parameter_required() if is_admin() or is_user(): filter_args = [Review.isdelete == 0] if args.get('rvtype') and args.get('rvtypeid') and args.get('rvtypeid') != 'undefined': filter_args.append(Review.RVtypeid == args.get('rvtypeid')) if args.get('doid'): filter_args.append(Review.DOid == args.get('doid')) if args.get('usname'): filter_args.append(Review.USname.like("%{0}%".format(args.get('usname')))) review_list = Review.query.filter(*filter_args).order_by(Review.createtime.desc()).all_with_page() for review in review_list: if review["DOid"]: doctor = Doctor.query.filter(Doctor.DOid == review["DOid"], Doctor.isdelete == 0).first_("未找到医生信息") review.fill("doname", doctor["DOname"]) rp = ReviewPicture.query.filter(ReviewPicture.RVid == review["RVid"], ReviewPicture.isdelete == 0).all() review.fill("createtime", review["createtime"]) review.fill("rp_list", rp) rvtype = review["RVtype"] review.fill("rvtype_zn", ReviewStatus(rvtype).zh_value) return Success(message="获取评论成功", data=review_list) else: return AuthorityError()
def info(self): """活动详情""" args = request.args.to_dict() uaid = args.get('uaid') if uaid: ua = self._ua_filter( (UserActivity.UAid == uaid, ), ).first_('活动不存在') acid = ua.ACid else: parameter_required('acid', datafrom=args) acid = args.get('acid') activity = Activity.query.filter( Activity.isdelete == false(), Activity.ACid == acid).first_('未找到活动信息') if not is_admin(): activity.hide('ACnumber') if is_user(): activity.fill('signed_up', bool( self._ua_filter([ UserActivity.ACid == acid, UserActivity.USid == getattr( request, 'user').id ]).first())) # 是否已报名 activity.fill('acstatus_zh', ActivityStatus(activity.ACstatus).zh_value) activity.fill('remain_people', self._query_activity_remain_people(activity)) return Success(data=activity)
def set_evaluationanswer(self): """设置题目选项""" data = parameter_required(( 'eiid', 'eaname', 'eaindex', 'eapoint') if not request.json.get('delete') else ('eaid', )) if not is_admin(): return AuthorityError() ea_dict = { "EIid": data.get('eiid'), "EAname": data.get('eaname'), "EAindex": data.get('eaindex'), "EApoint": Decimal(str(data.get('eapoint') or 0)) } eaid = data.get("eaid") with db.auto_commit(): if not eaid: # 新增 ea_dict["EAid"] = str(uuid.uuid1()) ea_instance = EvaluationAnswer.create(ea_dict) msg = "新增成功" else: ea_instance = EvaluationAnswer.query.filter( EvaluationAnswer.EAid == eaid).first_("未找到该选项") if data.get("delete"): ea_instance.update({"isdelete": 1}) msg = "删除成功" else: ea_instance.update(ea_dict) msg = "修改成功" db.session.add(ea_instance) return Success(message=msg)
def get_setmeal(self): """ 获取课时套餐 """ if is_admin() or is_hign_level_admin(): setmeal = Setmeal.query.filter( Setmeal.isdelete == 0).all_with_page() return Success(message="获取课时套餐成功", data=setmeal) elif is_user(): args = parameter_required(('clid', )) classes = Classes.query.filter( Classes.isdelete == 0, Classes.CLid == args.get('clid')).first_("未找到该课程信息") setmeal_list = [] setmeal_list.append({ "smid": "1", "clid": args.get('clid'), "clname": classes["CLname"], "smnum": 1, "smprice": classes["CLprice"] }) setmeal = Setmeal.query.filter( Setmeal.isdelete == 0, Setmeal.CLid == args.get("clid")).all() setmeal.sort(key=lambda x: x["SMnum"]) for setmeal_one in setmeal: setmeal_list.append(setmeal_one) return Success(message="获取课时套餐成功", data=setmeal_list)
def set_evaluationitem(self): """设置问卷题目""" data = parameter_required(( 'evid', 'einame', 'eiindex', ) if not request.json.get('delete') else ('eiid', )) if not (is_hign_level_admin() or is_admin()): return AuthorityError() ei_dict = { "EVid": data.get('evid'), "EIname": data.get('einame'), "EIindex": data.get('eiindex') } eiid = data.get("eiid") with db.auto_commit(): if not eiid: # 新增 ei_dict["EIid"] = str(uuid.uuid1()) ei_instance = EvaluationItem.create(ei_dict) msg = "新增成功" else: ei_instance = EvaluationItem.query.filter( EvaluationItem.EIid == eiid).first_("未找到该题目") if data.get("delete"): ei_instance.update({"isdelete": 1}) msg = "删除成功" else: ei_instance.update(ei_dict) msg = "修改成功" db.session.add(ei_instance) return Success(message=msg)
def set_evaluation(self): """设置问卷主体""" data = parameter_required(( 'evname', 'evpicture', ) if not request.json.get('delete') else ('evid', )) if not is_admin(): return AuthorityError() ev_dict = { "EVname": data.get('evname'), "EVpicture": data.get('evpicture') } evid = data.get("evid") with db.auto_commit(): if not evid: # 新增 ev_dict["EVid"] = str(uuid.uuid1()) ev_instance = Evaluation.create(ev_dict) msg = "新增成功" else: ev_instance = Evaluation.query.filter( Evaluation.EVid == evid).first_("未找到该问卷") if data.get("delete"): ev_instance.update({"isdelete": 1}) msg = "删除成功" else: ev_instance.update(ev_dict) msg = "修改成功" db.session.add(ev_instance) return Success(message=msg)
def get(self): """获取优惠券详情(后台)""" args = parameter_required(('token', 'coid', )) if not is_admin(): return AuthorityError('无权限') coupon = Coupon.query.filter(Coupon.isdelete == 0, Coupon.COid == args.get('coid')).first_("未找到该优惠券") coupon.fill("costatus_zh", CouponStatus(coupon.COstatus).zh_value) return Success(message="获取优惠券信息成功", data=coupon)
def list_relatives(self): """获取申请人亲属""" usid = request.args.to_dict().get('usid') if is_admin() and request.args.to_dict().get('usid') else getattr( request, 'user').id relatives = AssistanceRelatives.query.filter(AssistanceRelatives.isdelete == false(), AssistanceRelatives.USid == usid ).order_by(AssistanceRelatives.ARtype.asc(), AssistanceRelatives.createtime.desc()).all() for re in relatives: re.fill('artype_zh', FamilyType(re.ARtype).zh_value) return Success(data=relatives)
def delete(self): """删除评论""" if not is_admin(): return AuthorityError() data = request.json with db.auto_commit(): for rvid in data: rvid = rvid["rvid"] review_instance = Review.query.filter(Review.RVid == rvid).first_("未找到该评论") review_instance.update({"isdelete": 1}) db.session.add(review_instance) return Success('删除成功')
def refresh_token(self): """刷新token""" token = '' if is_admin(): admin = Admin.query.filter(Admin.isdelete == 0, Admin.ADid == getattr(request, 'user').id).first() if admin: token = usid_to_token(admin.ADid, 'Admin', admin.ADlevel, username=admin.ADname) else: doctor = Doctor.query.filter(Doctor.isdelete == 0, Doctor.DOid == getattr(request, 'user').id).first() if doctor: token = usid_to_token(doctor.DOid, 'Doctor', 3, username=doctor.DOname) return Success(data={'token': token})
def set_setmeal(self): """ 新增/修改/删除课时套餐 """ if not (is_admin() or is_hign_level_admin()): return AuthorityError('无权限') data = parameter_required(( 'clid', 'smnum', 'smprice') if not request.json.get('delete') else ('smid', )) smid = data.get('smid') if smid: setmeal = Setmeal.query.filter( Setmeal.SMid == smid).first_("未找到该套餐信息") classes = Classes.query.filter( Classes.isdelete == 0, Classes.CLid == setmeal.CLid).first_("未找到该课程信息") else: classes = Classes.query.filter( Classes.isdelete == 0, Classes.CLid == data.get('clid')).first_("未找到该课程信息") clname = classes["CLname"] sm_dict = { "CLid": data.get('clid'), "CLname": clname, "SMnum": data.get('smnum'), "SMprice": data.get('smprice') } with db.auto_commit(): if not smid: """新增""" sm_dict['SMid'] = str(uuid.uuid1()) sm_instance = Setmeal.create(sm_dict) msg = '添加成功' else: """修改/删除""" sm_instance = Setmeal.query.filter_by_( SMid=smid).first_('未找到该轮播图信息') if data.get('delete'): sm_instance.update({'isdelete': 1}) msg = '删除成功' else: sm_instance.update(sm_dict, null='not') msg = '编辑成功' db.session.add(sm_instance) return Success(message=msg, data={'smid': sm_instance.SMid})
def set_class(self): """ 创建/编辑/删除课程 """ if not (is_admin() or is_hign_level_admin()): return AuthorityError('无权限') data = parameter_required(( 'clname', "clpicture", "deid", "clintroduction", "clprice") if not request.json.get('delete') else ('clid', )) clid = data.get('clid') if clid: classes = Classes.query.filter( Classes.CLid == clid).first_("未找到课程信息") department = Departments.query.filter( Departments.DEid == classes.DEid).first_("未找到科室信息") else: department = Departments.query.filter( Departments.DEid == data.get("deid")).first_("未找到科室信息") cl_dict = { 'CLname': data.get('clname'), 'CLpicture': data.get('clpicture'), 'DEid': data.get('deid'), 'DEname': department['DEname'], 'CLintroduction': data.get('clintroduction'), 'CLprice': data.get('clprice') } with db.auto_commit(): if not clid: """新增""" cl_dict['CLid'] = str(uuid.uuid1()) cl_instance = Classes.create(cl_dict) msg = '添加成功' else: """修改/删除""" cl_instance = Classes.query.filter_by_( CLid=clid).first_('未找到该轮播图信息') if data.get('delete'): cl_instance.update({'isdelete': 1}) msg = '删除成功' else: cl_instance.update(cl_dict, null='not') msg = '编辑成功' db.session.add(cl_instance) return Success(message=msg, data={'clid': cl_instance.CLid})
def list(self): data = parameter_required() syid = data.get('syid') index = data.get('index', 'list') examples_sql = Example.query.join(Symptom, Symptom.SYid == Example.SYid).filter( Example.isdelete == 0, Symptom.isdelete == 0) if syid: examples_sql = examples_sql.filter(Example.SYid == syid) else: if not is_admin(): raise AuthorityError() examples = examples_sql.order_by( Example.EXsort.asc(), Example.createtime.desc()).all_with_page() for exm in examples: self._fill_example(exm, index) return Success('获取成功', data=examples)
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="更新任务成功")
def list(self): data = parameter_required() usid = getattr(request, 'user').id omstatus = data.get('omstatus') omname = data.get('omname') omtype = data.get('omtype', 0) filter_args = [ OrderMain.isdelete == 0, ] try: omtype = OrderMainType(int(omtype)).value except: raise ParamsError('订单类型有误 {}'.format(omtype)) if is_user(): filter_args.append( OrderMain.OMstatus >= OrderMainStatus.ready.value) filter_args.append(OrderMain.OMtype == omtype) filter_args.append(OrderMain.USid == usid) elif omstatus is not None: try: omstatus = OrderMainStatus(int(str(omstatus))).value except: raise ParamsError('订单状态筛选参数异常') filter_args.append(OrderMain.OMstatus == omstatus) if omname: filter_args.append( or_(OrderMain.CLname.ilike('%{}%'.format(omname)), OrderMain.PRtitle.ilike('%{}%'.format(omname)))) if is_admin(): filter_args.append(OrderMain.OMtype == 0) omlist = OrderMain.query.filter(*filter_args).order_by( OrderMain.createtime.desc()).all_with_page() if is_user(): uh_list = UserHour.query.filter(UserHour.USid == usid, UserHour.isdelete == 0).all() # 可用时长统计 smsum = sum([int(uh.UHnum) for uh in uh_list]) return Success('获取成功', data={'omlist': omlist, 'smsum': smsum}) return Success('获取成功', data={'omlist': omlist})
def get_integral(self): """获取个人积分变动情况""" # 后台可筛选,前台默认用户token args = parameter_required(('token', )) filter_args = [UserIntegral.isdelete == 0] user = token_to_user_(args.get('token')) if is_user(): filter_args.append(UserIntegral.USid == user.id) filter_args.append(UserIntegral.UItrue == 1) else: if not (is_admin() or is_hign_level_admin()): return AuthorityError() if args.get('usid'): filter_args.append(UserIntegral.USid == args.get('usid')) userIntegral = UserIntegral.query.filter(*filter_args).order_by(UserIntegral.createtime.desc()).all_with_page() for user_item in userIntegral: user = User.query.filter(User.USid == user_item.USid).first() user_item.fill('usname', user.USname) user_item.fill('utname', PointTaskType(user_item.UIaction).zh_value) user_item.fill('createtime', user_item.createtime) return Success(message="获取积分变动成功", data=userIntegral)
def get_assistance(self): if is_user(): usid = getattr(request, 'user').id assistance = Assistance.query.filter(Assistance.isdelete == false(), Assistance.USid == usid ).order_by(Assistance.createtime.desc()).first() res = {} if assistance: current_app.logger.info(f'get assistance id: {assistance.ATid}') res['atstatus'] = assistance.ATstatus res['atstatus_zh'] = ApplyStatus(assistance.ATstatus).zh_value res['can_submit'] = False if assistance.ATstatus == ApplyStatus.waiting.value else True return Success(data=res) else: if not is_admin(): raise AuthorityError args = parameter_required('atid') assistance = Assistance.query.filter(Assistance.isdelete == false(), Assistance.ATid == args.get('atid')).first_('未找到申请信息') self._fill_assistance(assistance) # 添加证明图片 dia_pics, pove_pics = [], [] as_pics = AssistancePicture.query.filter(AssistancePicture.isdelete == false(), AssistancePicture.ATid == assistance.ATid ).order_by(AssistancePicture.createtime.asc()).all() [dia_pics.append(pic) if pic.APtype == AssistancePictureType.diagnosis.value else pove_pics.append(pic) for pic in as_pics] assistance.fill('diagnosis', dia_pics) assistance.fill('poverty', pove_pics) # 添加亲属信息 relatives_list = [] for arid in json.loads(assistance.ARids): relative = self._exist_assistance_relative([AssistanceRelatives.ARid == arid, ]) if not relative: current_app.logger.error('arid not found: {}'.format(arid)) continue relative.fill('artype_zh', FamilyType(relative.ARtype).zh_value) relatives_list.append(relative) assistance.fill('relatives', relatives_list) return Success(data=assistance)
def get(self): """获取评测详情""" args = parameter_required(('evid', )) evid = args.get("evid") evaluation = Evaluation.query.filter( Evaluation.isdelete == 0, Evaluation.EVid == evid).first_("未找到该评测") evaluationitem = EvaluationItem.query.filter(EvaluationItem.isdelete == 0, EvaluationItem.EVid == evid) \ .order_by(EvaluationItem.EIindex.asc()).all() for item in evaluationitem: eiid = item["EIid"] evaluationanswer = EvaluationAnswer.query.filter(EvaluationAnswer.isdelete == 0, EvaluationAnswer.EIid == eiid) \ .order_by(EvaluationAnswer.EAindex.asc()).all() item.fill("ea_list", evaluationanswer) evaluation.fill("ei_list", evaluationitem) if is_admin(): ep_list = EvaluationPoint.query.filter(EvaluationPoint.isdelete == 0, EvaluationPoint.EVid == evid) \ .order_by(EvaluationPoint.EPstart.asc()).all() evaluation.fill("ep_list", ep_list) return Success(message="获取评测成功", data=evaluation)
def list_submitter(self): if not is_admin(): raise AuthorityError('权限不足') data = parameter_required({'evid': '问卷'}) evid = data.get('evid') an_list = Answer.query.filter( Evaluation.EVid == Answer.EVid, Answer.EVid == evid, Answer.isdelete == 0, Evaluation.isdelete == 0).order_by( Answer.createtime.desc()).all_with_page() usid_list = [an.USid for an in an_list] user_list = User.query.filter(User.USid.in_(usid_list), User.isdelete == 0).all() user_dict = {user.USid: user for user in user_list} for an in an_list: user = user_dict.get(an.USid) if not user: continue an.fill('USname', user.USname or '') an.fill('UStelphone', user.UStelphone or '') an.fill('USavatar', user['USavatar'] or '') return Success(data=an_list)
def list(self): data = parameter_required() filter_args = [ Products.isdelete == 0, ] dename = data.get('dename') if dename: filter_args.append(Departments.DEname.ilike('%{}%'.format(dename))) filter_args.append(Departments.DEid == Products.DEid) if not is_admin(): filter_args.append(Products.PRstatus == ProductStatus.usual.value) else: prtitle, prstatus, prtype = data.get('prtitle'), data.get( 'prstatus'), data.get('prtype') if prtitle: filter_args.append( Products.PRtitle.ilike('%{}%'.format(prtitle))) if prstatus: try: prstatus = ProductStatus(int(str(prstatus))).value except: raise ParamsError('商品状态异常') filter_args.append(Products.PRstatus == prstatus) if prtype: try: prtype = ProductType(int(str(prtype))).value except: raise ParamsError('商品类型筛选异常') filter_args.append(Products.PRtype == prtype) products = Products.query.filter(*filter_args).order_by( Products.PRsort.asc(), Products.createtime.desc()).all_with_page() for product in products: self._fill_coupon(product) return Success('获取成功', data=products)
def list_activity(self): """首页活动展示 / 我的活动""" args = parameter_required(('page_size', 'page_num')) option = args.get('option') time_now = datetime.now() if option == 'my': return self._query_my_activity() filter_args = [] if is_anonymous() or is_user(): filter_args.extend([ Activity.ACstatus == ActivityStatus.ready.value, Activity.ACstartTime > time_now ]) ac_list = Activity.query.filter( Activity.isdelete == false(), *filter_args).order_by( Activity.ACstatus.asc(), Activity.ACstartTime.desc()).all_with_page() for ac in ac_list: ac.fields = ['ACid', 'ACname', 'ACbanner'] ac.fill('acstatus_zh', ActivityStatus(ac.ACstatus).zh_value) if filter_args: remain = ac.ACstartTime - time_now remain_day = remain.days remain_str = f'{remain.seconds // 3600}小时' if ( remain.seconds // 3600) else f'{(remain.seconds % 3600) // 60}分钟' if ( (remain.seconds % 3600) // 60) else f'{remain.seconds}秒' ac.fill('remain_time', f'{remain_day}天' if remain_day else remain_str) if is_admin(): ac.fill( 'signed_number', f'{self._ua_filter([UserActivity.ACid == ac.ACid, ]).count()} / {ac.ACnumber}' ) return Success(data=ac_list)
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)
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)