from django.db import models from utils.models import CoreModel,BaseModel # ================================================= # # ************** 平台使用的达人/抖客/团长账号授权信息 ************** # # ================================================= # class DYSystemAccount(CoreModel): """平台使用的达人/抖客/团长账号授权信息""" TYPE_CHOICES = ( (0, "-"), (1, "抖客"), (2, "团长"), (3, "达人"), ) avatar = models.CharField(max_length=255,verbose_name="头像", null=True, blank=True) nickname = models.CharField(max_length=100, help_text="用户昵称", verbose_name="用户昵称",default="", null=True, blank=True) open_id = models.CharField(max_length=100, db_index=True,null=True,blank=True,verbose_name='抖音open_id') fans_num = models.IntegerField(default=0,verbose_name="粉丝个数") buyin_id = models.CharField(max_length=50, db_index=True,null=True,blank=True,verbose_name='百应ID') pid = models.CharField(max_length=255, db_index=True, null=True, blank=True,verbose_name='抖客PID') # 抖客pid相当于抖客的推广位,可以有多个,达人也有自己的pid status = models.BooleanField(default=True, verbose_name="启用状态") access_token = models.CharField(max_length=255, null=True, blank=True, verbose_name='授权access_token') access_token_expire = models.DateTimeField(verbose_name='access_token过期时间', null=True, blank=True) refresh_token = models.CharField(max_length=255, null=True, blank=True,verbose_name='授权refresh_token') refresh_token_expire = models.DateTimeField(verbose_name='refresh_token过期时间', null=True, blank=True)#refresh_expires_in identity = models.IntegerField(choices=TYPE_CHOICES,verbose_name='用户类型',default=0)#用户类型 is_delete = models.BooleanField(default=False, verbose_name="是否逻辑删除") class Meta: db_table = 'dy_system_account' verbose_name = '平台使用的达人/抖客/团长账号授权信息' verbose_name_plural = verbose_name # ================================================= # # ************** 团长活动(招商)管理(一般为自己团长账号活动) model ************** # # ================================================= # class DyColonelActivityManage(CoreModel): """团长活动管理(用于团长活动商品的拉取)""" activity_id = models.CharField(max_length=50, verbose_name='活动ID',db_index=True,default="") activity_name = models.CharField(max_length=100, verbose_name='活动名称',null=True,blank=True) activity_start_time = models.CharField(max_length=100, verbose_name='任务开始时间',null=True,blank=True) activity_end_time = models.CharField(max_length=100, verbose_name='任务结束时间',null=True,blank=True) status = models.IntegerField(default=0, verbose_name="状态", help_text="状态")#1:未上线;2:报名未开始;3:报名中;4:推广未开始;5:推广中;7:报名结束 colonel_buyin_id = models.CharField(max_length=50, verbose_name='团长百应ID',default="") institution_id = models.CharField(max_length=50, verbose_name='机构ID',default="") class Meta: db_table = 'dy_colonel_activity' verbose_name = '团长活动管理' verbose_name_plural = verbose_name def __str__(self): return self.activity_name # ================================================= # # ************** 商品分类 model ************** # # ================================================= # class DyProductCategoryManage(CoreModel): """商品分类(行业类目)""" category_id = models.CharField(max_length=20, verbose_name='分类ID',default="") name = models.CharField(max_length=20, verbose_name='分类名称',default="") sort = models.PositiveSmallIntegerField(default=1, verbose_name="排序", help_text="显示顺序") status = models.BooleanField(default=True, verbose_name="状态", help_text="状态") class Meta: db_table = 'dy_product_category' verbose_name = '商品分类(行业类目)' verbose_name_plural = verbose_name # ================================================= # # ************** 商品管理 model ************** # # ================================================= # class DyShopManage(BaseModel): """店铺管理""" shop_id = models.CharField(max_length=40, verbose_name='店铺ID',db_index=True,unique=True,null=True,blank=True) shop_name = models.CharField(max_length=50, verbose_name='店铺名称',null=True,blank=True) shop_avatar_url = models.CharField(max_length=255, verbose_name='商家头像',null=True,blank=True) shop_total_score = models.CharField(max_length=255, verbose_name='商家评分(4种类型分数)',null=True,blank=True)#对象'shop_total_score': {'logistics_score': {'level': 1,'score': '99','text': '物流体验分'},'product_score': {....} shop_score = models.FloatField(verbose_name='商家体验分',default=0,null=True,blank=True) shop_score_level = models.PositiveSmallIntegerField(default=0, verbose_name="商家体验分等级") #商家体验分等级。1: 高;2: 中;3:低; 4: 差 sort = models.PositiveSmallIntegerField(default=1, verbose_name="排序") status = models.BooleanField(default=True, verbose_name="状态", help_text="状态") class Meta: db_table = 'dy_shop_manage' verbose_name = '店铺管理' verbose_name_plural = verbose_name def __str__(self): return self.shop_name class DyProductManage(BaseModel): """商品管理""" SOURCE_TYPE = ( (0, "精选联盟"), (1, "团长活动"), ) product_id = models.CharField(max_length=40, verbose_name='商品ID',db_index=True) title = models.CharField(max_length=100, verbose_name='商品标题',db_index=True,null=True,blank=True) price = models.IntegerField(verbose_name='商品价格',default=0)#单位分 sales = models.IntegerField(verbose_name='历史总销量',default=0) begin_time = models.DateField(verbose_name='活动开始日期',null=True,blank=True) end_time = models.DateField(verbose_name='活动结束日期',null=True,blank=True) coupon = models.IntegerField(verbose_name='优惠券个数',default=0) coupon_price = models.IntegerField(verbose_name='劵后价',default=0)#单位分 cover = models.CharField(max_length=255, verbose_name='商品封面',null=True,blank=True) category_id = models.CharField(max_length=20, verbose_name='行业分类ID',null=True,blank=True) category_name = models.CharField(max_length=30, verbose_name='行业分类名称',null=True,blank=True) cos_ratio = models.FloatField(verbose_name='普通佣金比例',default=0)#百分比小数,只存除%比的数字部分 cos_fee = models.IntegerField(verbose_name='普通佣金金额',default=0)#单位分 comment_score = models.FloatField(verbose_name='商品评分(5分制,保留一位小数)',default=0) special_cos_ratio = models.IntegerField(verbose_name='达人/团长/活动佣金比例',default=0)#百分比,只存除%比的数字部分 special_cos_fee = models.IntegerField(verbose_name='达人/团长/活动佣金金额',default=0)#单位分 activity_id = models.CharField(max_length=50, verbose_name='活动ID',db_index=True,null=True,blank=True)#团长活动ID、其他活动ID imgs = models.TextField(verbose_name='轮播图',null=True,blank=True) detail_url = models.CharField(max_length=1000,verbose_name='商品链接',null=True,blank=True) detail_brief = models.TextField(verbose_name='详情装修信息(商品详情图)',null=True,blank=True) sharable = models.BooleanField(default=True, verbose_name="是否可分销") is_assured = models.BooleanField(default=False, verbose_name="是否提供安心购服务") has_sxt = models.BooleanField(default=False, verbose_name="是否具有短视频随心推资质") has_subsidy_tag = models.BooleanField(default=False, verbose_name="是否是超值购商品(百亿补贴)") has_supermarket_tag = models.BooleanField(default=False, verbose_name="是否抖音超市(次日达)商品") has_douin_goods_tag = models.BooleanField(default=False, verbose_name="是否有【抖in好物】标签") has_shop_brand_tag = models.BooleanField(default=False, verbose_name="是否有品牌旗舰店标签([品牌]黑标)") in_stock = models.BooleanField(default=True, verbose_name="是否有库存") shop_id = models.CharField(max_length=40, verbose_name='店铺ID',db_index=True,null=True,blank=True) logistics_info = models.CharField(max_length=150, verbose_name='物流信息',null=True,blank=True) sort = models.PositiveSmallIntegerField(default=1, verbose_name="排序", help_text="显示顺序")#自定义 status = models.BooleanField(default=True, verbose_name="商品状态", help_text="商品状态")#自定义 is_calc_award = models.BooleanField(default=False, verbose_name="是否计算(拉新、新人扶持)奖励")#自定义 order_num = models.IntegerField(verbose_name='近30天商品总销售量', default=0) view_num = models.IntegerField(verbose_name='近30天商品总浏览量', default=0) kol_num = models.IntegerField(verbose_name='近30天推广总达人数', default=0) source = models.IntegerField(choices=SOURCE_TYPE,verbose_name='商品接口来源',default=0)#自定义 share_nums = models.IntegerField(verbose_name='前端总分享次数',default=0)#自定义 sample_stock = models.IntegerField(verbose_name='申请领样库存',default=0) limit_d30_sales = models.IntegerField(verbose_name='领样要求:近30天橱窗销量', default=0) limit_fans_nums = models.IntegerField(verbose_name='领样要求:粉丝数', default=0) dyshop = models.ForeignKey(DyShopManage,verbose_name='关联商家',db_constraint=False,on_delete=models.SET_NULL,null=True) shop_score = models.FloatField(verbose_name='店铺分', default=0, null=True, blank=True) is_delete = models.BooleanField(default=False, verbose_name="是否逻辑删除", help_text="是否逻辑删除") class Meta: db_table = 'dy_product_manage' verbose_name = '商品管理' verbose_name_plural = verbose_name unique_together = ('product_id','source') def __str__(self): return self.title class DyProductSaleData(BaseModel): """商品月售信息""" inner_product_id = models.ForeignKey(DyProductManage,related_name='dtproductsd', verbose_name='内部关联商品ID',db_constraint=False, on_delete=models.CASCADE, null=True) product_id = models.CharField(max_length=40, verbose_name='商品ID', db_index=True) date = models.DateField(verbose_name='统计日期',null=True,blank=True) order_num = models.IntegerField(verbose_name='当日商品销售量明细',default=0) view_num = models.IntegerField(verbose_name='当日商品浏览量明细', default=0) kol_num = models.IntegerField(verbose_name='当日推广达人数明细', default=0) class Meta: db_table = 'dy_product_saledata' verbose_name = '商品月售信息' verbose_name_plural = verbose_name # =====================================================================================# # ************** 赏金任务(抖音团长拥有赏金任务发布能力) model ************** # # =====================================================================================# class DyAwardTaskManage(BaseModel): """赏金任务""" TASK_STATUS_CHOICE = ( (1, "未发布"), (2, "审核中"), (3, "审核未通过"), (4, "未开始"), (5, "进行中"), (6, "已结束"), ) task_id = models.CharField(max_length=40, verbose_name='任务ID',db_index=True) task_name = models.CharField(max_length=100, verbose_name='任务名称',db_index=True,null=True,blank=True) conver = models.CharField(max_length=255, verbose_name='封面图',null=True,blank=True) award_description = models.CharField(max_length=255, verbose_name='奖励说明',null=True,blank=True) task_other_requirement = models.CharField(max_length=255, verbose_name='任务其他要求',null=True,blank=True) apply_cnt = models.IntegerField(verbose_name='已领取人数',default=0) promote_cnt = models.IntegerField(verbose_name='已推广人数',default=0) gmv = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='支付GMV',default=0)#单位元 order_cnt = models.IntegerField(verbose_name='总订单量',default=0) can_apply = models.BooleanField(default=False, verbose_name="是否可报名", help_text="是否可报名") task_start_time = models.CharField(max_length=100, verbose_name='任务开始时间',null=True,blank=True) task_end_time = models.CharField(max_length=100, verbose_name='任务结束时间',null=True,blank=True) task_status = models.IntegerField(choices=TASK_STATUS_CHOICE,verbose_name='任务状态',default=0)#1:未发布,2:审核中,3:审核未通过,4:未开始,5:进行中,6:已结束 product_id = models.CharField(max_length=40, verbose_name='商品ID',db_index=True,default=None)#默认一个任务只支持1个产品,如果需要支持多个,用逗号分割,并延长字段长度 sort = models.PositiveSmallIntegerField(default=1, verbose_name="排序") status = models.BooleanField(default=True, verbose_name="状态", help_text="状态") class Meta: db_table = 'dy_awardtask' verbose_name = '赏金任务' verbose_name_plural = verbose_name def __str__(self): return self.task_name # ================================================= # # ************** 用户提现记录 model************** # # ================================================= # class DYBalanceRecord(CoreModel): """用户余额记录(带审核功能)""" PAYTYPE_CHOICES = ( (10, "微信"), (20, "支付宝"), (30, "银行卡"), ) TYPE_CHOICES = ( (1, "提现"), (2, "充值"), ) order_no = models.CharField(max_length=64, unique=True, verbose_name="订单编号(内部)") balance = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='剩余余额') money = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='金额') trade_no = models.CharField(max_length=200, verbose_name="交易订单号(外部)", null=True, blank=True) type = models.IntegerField(choices=TYPE_CHOICES, verbose_name="类型",default=1, help_text="类型") paytype = models.IntegerField(choices=PAYTYPE_CHOICES, verbose_name="提现方式",default=10, help_text="提现方式") audit_status = models.IntegerField(choices=((10, u'待审核'), (20, u'已通过'), (30, u'未通过')), verbose_name="审核状态",default=10) status = models.IntegerField(choices=((10, u'打款中'), (20, u'已完成'), (30, u'失败')), verbose_name="打款状态",default=10) audit_time = models.DateTimeField(verbose_name='管理员审核时间', null=True, blank=True) audit_remarks = models.CharField(max_length=200, verbose_name="审核备注", null=True, blank=True) class Meta: db_table = 'dy_balance_recode' verbose_name = '用户余额记录' verbose_name_plural = verbose_name # ================================================= # # ************** 抖音订单管理 model ************** # # ================================================= # class DyOrderManage(BaseModel): """抖音订单管理""" FLOW_POINT_CHOICES = ( ('PAY_SUCC', "支付完成"), ('REFUND', "退款"), ('SETTLE', "结算"), ('CONFIRM', "确认收货"), ) MEDIA_TYPE_CHOICES = ( ('shop_list', "橱窗"), ('video', "视频"), ('live', "直播"), ('others', "其他"),#其他(如图文、微头条、问答、西瓜长视频等) ) ORDER_TYPE_CHOICES = ( (0, ""), (1, "橱窗订单"), (2, "分享赚订单"), (3, "0元购订单"), (4, "垫付领样"), ) order_id = models.CharField(max_length=100, verbose_name='订单号',null=True,blank=True,unique=True) flow_point = models.CharField(choices=FLOW_POINT_CHOICES, verbose_name="订单状态", help_text="订单状态",null=True,blank=True,max_length=20) product_id = models.CharField(max_length=40, verbose_name='商品ID',db_index=True) product_name = models.CharField(max_length=40, verbose_name='商品名称',null=True,blank=True) product_img = models.CharField(max_length=255, verbose_name='商品图片URL',null=True,blank=True) app = models.CharField(max_length=40, verbose_name='来源APP', null=True, blank=True) author_account = models.CharField(max_length=40, verbose_name="作者账号昵称", null=True, blank=True) author_openid = models.CharField(max_length=100, verbose_name="作者抖音open_id", null=True, blank=True) author_short_id = models.CharField(max_length=60, verbose_name="达人抖音号/火山号", null=True, blank=True) shop_id = models.CharField(max_length=60, verbose_name="商家ID", null=True, blank=True) shop_name = models.CharField(max_length=60, verbose_name="商家名称", null=True, blank=True) pick_source_client_key = models.CharField(max_length=80, verbose_name="选品App client_key", null=True, blank=True) pick_extra = models.CharField(max_length=60, verbose_name="选品来源自定义参数", null=True, blank=True) pid = models.CharField(max_length=160, verbose_name="分销PID", null=True, blank=True)#分销信息 external_info = models.CharField(max_length=100, verbose_name="分销外部参数", null=True, blank=True) # 分销信息 media_type_name = models.CharField(max_length=160, verbose_name="分销类型", null=True, blank=True) # 分销信息-分销类型:Live-直播间,ProductDetail-商品详情,Activity-活动(百亿补贴/秒杀)Mix-H5自建活动页 media_type = models.CharField(choices=MEDIA_TYPE_CHOICES, verbose_name="带货体裁", help_text="带货体裁",null=True,blank=True,max_length=20) item_num = models.IntegerField(verbose_name="商品数目",default=1, help_text="商品数目") total_pay_amount = models.IntegerField(verbose_name="订单支付金额",default=0, help_text="订单支付金额") #单位分(用户实付) commission_rate = models.IntegerField(verbose_name="达人佣金率",default=0, help_text="达人佣金率") #此处保存为真实数据x1万之后,如真实是0.35,这里是3500 update_time = models.DateTimeField(verbose_name="更新时间[联盟侧订单更新时间]",null=True,blank=True) pay_success_time = models.DateTimeField(verbose_name="付款时间", null=True, blank=True) settle_time = models.DateTimeField(verbose_name="结算时间,结算前为空", null=True, blank=True) refund_time = models.DateTimeField(verbose_name="退款订单退款时间", null=True, blank=True) pay_goods_amount = models.IntegerField(verbose_name="预估参与结算金额",default=0) #单位分 settled_goods_amount = models.IntegerField(verbose_name="实际参与结算金额", default=0) #单位分 estimated_commission = models.IntegerField(verbose_name="达人/渠道预估佣金收入", default=0) # 单位分 real_commission = models.IntegerField(verbose_name="达人实际佣金收入", default=0) # 单位分 order_type = models.IntegerField(choices=ORDER_TYPE_CHOICES, verbose_name="订单类型", help_text="订单类型",default=0) from_user_id = models.CharField(max_length=60, verbose_name="达人的openid", null=True, blank=True)#同一用户在不同的APPID中openId不相同 inner_user_id = models.CharField(max_length=60, verbose_name="所属内部用户ID", null=True, blank=True) class Meta: db_table = 'dy_order' verbose_name = '抖音订单管理' verbose_name_plural = verbose_name