393 lines
12 KiB
PHP
393 lines
12 KiB
PHP
<?php
|
||
|
||
namespace app\common\model\school\classes;
|
||
|
||
use app\common\model\BaseModel;
|
||
use app\common\model\dyqc\ManystoreShop;
|
||
use app\common\model\school\classes\lib\Spec;
|
||
use app\common\model\User;
|
||
use think\Model;
|
||
use traits\model\SoftDelete;
|
||
|
||
|
||
class ClassesLib extends BaseModel
|
||
{
|
||
|
||
use SoftDelete;
|
||
|
||
|
||
|
||
// 表名
|
||
protected $name = 'school_classes_lib';
|
||
|
||
// 自动写入时间戳字段
|
||
protected $autoWriteTimestamp = 'integer';
|
||
|
||
// 定义时间戳字段名
|
||
protected $createTime = 'createtime';
|
||
protected $updateTime = 'updatetime';
|
||
protected $deleteTime = 'deletetime';
|
||
|
||
protected $classes_lib_ids = [];
|
||
|
||
// 追加属性
|
||
protected $append = [
|
||
'add_type_text',
|
||
'type_text',
|
||
'address_type_text',
|
||
'status_text',
|
||
'auth_status_text',
|
||
'auth_time_text',
|
||
'recommend_text',
|
||
'hot_text',
|
||
'new_text',
|
||
'selfhot_text'
|
||
];
|
||
|
||
|
||
protected static function init()
|
||
{
|
||
self::afterInsert(function ($row) {
|
||
if (!$row['weigh']) {
|
||
$pk = $row->getPk();
|
||
$row->getQuery()->where($pk, $row[$pk])->update(['weigh' => $row[$pk]]);
|
||
}
|
||
});
|
||
}
|
||
|
||
|
||
public function getAddTypeList()
|
||
{
|
||
return ['1' => __('Add_type 1'), '2' => __('Add_type 2')];
|
||
}
|
||
|
||
public function getTypeList()
|
||
{
|
||
return ['out' => __('Type out'), 'in' => __('Type in')];
|
||
}
|
||
|
||
public function getAddressTypeList()
|
||
{
|
||
return ['1' => __('Address_type 1'), '2' => __('Address_type 2')];
|
||
}
|
||
|
||
public function getStatusList()
|
||
{
|
||
return ['1' => __('Status 1'), '2' => __('Status 2'), '3' => __('Status 3')];
|
||
}
|
||
|
||
public function getAuthStatusList()
|
||
{
|
||
return ['0' => __('Auth_status 0'), '1' => __('Auth_status 1'), '2' => __('Auth_status 2')];
|
||
}
|
||
|
||
public function getRecommendList()
|
||
{
|
||
return ['0' => __('Recommend 0'), '1' => __('Recommend 1')];
|
||
}
|
||
|
||
public function getHotList()
|
||
{
|
||
return ['0' => __('Hot 0'), '1' => __('Hot 1')];
|
||
}
|
||
|
||
public function getNewList()
|
||
{
|
||
return ['0' => __('New 0'), '1' => __('New 1')];
|
||
}
|
||
|
||
public function getSelfhotList()
|
||
{
|
||
return ['0' => __('Selfhot 0'), '1' => __('Selfhot 1')];
|
||
}
|
||
|
||
|
||
public function getAddTypeTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['add_type']) ? $data['add_type'] : '');
|
||
$list = $this->getAddTypeList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
|
||
public function getTypeTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['type']) ? $data['type'] : '');
|
||
$list = $this->getTypeList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
|
||
public function getAddressTypeTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['address_type']) ? $data['address_type'] : '');
|
||
$list = $this->getAddressTypeList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
|
||
public function getStatusTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['status']) ? $data['status'] : '');
|
||
$list = $this->getStatusList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
|
||
public function getAuthStatusTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['auth_status']) ? $data['auth_status'] : '');
|
||
$list = $this->getAuthStatusList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
|
||
public function getAuthTimeTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['auth_time']) ? $data['auth_time'] : '');
|
||
return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
|
||
}
|
||
|
||
|
||
public function getRecommendTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['recommend']) ? $data['recommend'] : '');
|
||
$list = $this->getRecommendList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
|
||
public function getHotTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['hot']) ? $data['hot'] : '');
|
||
$list = $this->getHotList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
|
||
public function getNewTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['new']) ? $data['new'] : '');
|
||
$list = $this->getNewList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
|
||
public function getSelfhotTextAttr($value, $data)
|
||
{
|
||
$value = $value ? $value : (isset($data['selfhot']) ? $data['selfhot'] : '');
|
||
$list = $this->getSelfhotList();
|
||
return isset($list[$value]) ? $list[$value] : '';
|
||
}
|
||
|
||
protected function setAuthTimeAttr($value)
|
||
{
|
||
return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
|
||
}
|
||
|
||
|
||
|
||
public function getHeadimageAttr($value, $data)
|
||
{
|
||
if (!empty($value)) return cdnurl($value, true);
|
||
}
|
||
|
||
|
||
public function getImagesAttr($value, $data)
|
||
{
|
||
$imagesArray = [];
|
||
if (!empty($value)) {
|
||
$imagesArray = explode(',', $value);
|
||
foreach ($imagesArray as &$v) {
|
||
$v = cdnurl($v, true);
|
||
}
|
||
return $imagesArray;
|
||
}
|
||
return $imagesArray;
|
||
}
|
||
|
||
|
||
|
||
public function manystore()
|
||
{
|
||
return $this->belongsTo('app\admin\model\Manystore', 'manystore_id', 'id', [], 'LEFT')->setEagerlyType(0);
|
||
}
|
||
|
||
|
||
public function shop()
|
||
{
|
||
return $this->belongsTo(ManystoreShop::class, 'shop_id', 'id', [], 'LEFT')->setEagerlyType(0);
|
||
}
|
||
|
||
|
||
public function user()
|
||
{
|
||
return $this->belongsTo('app\common\model\User', 'user_id', 'id', [], 'LEFT')->setEagerlyType(0);
|
||
}
|
||
|
||
|
||
public function admin()
|
||
{
|
||
return $this->belongsTo('app\admin\model\Admin', 'admin_id', 'id', [], 'LEFT')->setEagerlyType(0);
|
||
}
|
||
|
||
public function teacher()
|
||
{
|
||
return $this->belongsTo('app\common\model\school\classes\Teacher', 'teacher_id', 'id', [], 'LEFT')->setEagerlyType(0);
|
||
}
|
||
|
||
|
||
public function specs()
|
||
{
|
||
return $this->hasMany(ClassesSpec::class,'classes_lib_id');
|
||
}
|
||
|
||
|
||
|
||
|
||
/** 课程详情
|
||
* @param $id
|
||
* @return ClassesLib|null
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
public function detail($id){
|
||
$self = $this->get($id,['shop','teacher']);
|
||
//下架判断
|
||
// if($self['status'] != '1'){
|
||
// $this->error("该课程已下架");
|
||
// }
|
||
|
||
//参与人数 = 虚拟人数 + 平台人数
|
||
return $self;
|
||
}
|
||
|
||
|
||
/**课程参与人员信息
|
||
* @param $id
|
||
*
|
||
*/
|
||
public function virtualParticipants($id){
|
||
//虚拟用户生成数量
|
||
$v_num = 10;
|
||
$unpaid_user_data = $paid_user_data = [];
|
||
//参与者头像
|
||
//先从订单里取出最新的10个未支付和使用中的用户,不足的用虚拟用户填充
|
||
$user_ids = \app\common\model\school\classes\order\Order::where("classes_lib_id",$id)->where("status","in",["0",'3'])->order("createtime desc")->limit($v_num)->column("createtime","user_id");
|
||
if($user_ids){
|
||
$users = User::where("id","in",array_keys($user_ids))->select();
|
||
foreach ($users as $user){
|
||
$unpaid_user_data[] = [
|
||
"nickname"=>$user['nickname'],
|
||
"head_image"=>$user['avatar'],
|
||
"classes_lib_id"=>$id,
|
||
"time"=>$user_ids[$user['id']],
|
||
"jointype"=>'1',
|
||
"havetype"=>'0'
|
||
];
|
||
}
|
||
}
|
||
//计算需要生成的虚拟用户数量
|
||
$v_num = $v_num - count($user_ids);
|
||
if($v_num<0)$v_num =0;
|
||
if($v_num){
|
||
$unpaid_user = VirtualUser::where("classes_lib_id",$id)->where("jointype",'1')->order("time desc")->limit($v_num)->select();
|
||
$unpaid_user_data = array_merge($unpaid_user_data,$unpaid_user);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
//再从订单里取出最新的10个使用中,已完成 和 已退款 的用户,不足的用虚拟用户填充
|
||
$user_ids = \app\common\model\school\classes\order\Order::where("classes_lib_id",$id)->where("status","in",["3",'6','9'])->order("createtime desc")->limit($v_num)->column("createtime","user_id");
|
||
if($user_ids){
|
||
$users = User::where("id","in",array_keys($user_ids))->select();
|
||
foreach ($users as $user){
|
||
$paid_user_data[] = [
|
||
"nickname"=>$user['nickname'],
|
||
"head_image"=>$user['avatar'],
|
||
"classes_lib_id"=>$id,
|
||
"time"=>$user_ids[$user['id']],
|
||
"jointype"=>'0',
|
||
"havetype"=>'1'
|
||
];
|
||
}
|
||
}
|
||
//计算需要生成的虚拟用户数量
|
||
$v_num = 10;
|
||
$v_num = $v_num - count($user_ids);
|
||
if($v_num<0)$v_num =0;
|
||
if($v_num){
|
||
$unpaid_user = VirtualUser::where("classes_lib_id",$id)->where("havetype",'1')->order("time desc")->limit($v_num)->select();
|
||
$paid_user_data = array_merge($paid_user_data,$unpaid_user);
|
||
}
|
||
|
||
//进行昵称加*和按时间重新排序
|
||
array_multisort(array_column($unpaid_user_data, 'time'), SORT_ASC, $unpaid_user_data);
|
||
array_multisort(array_column($paid_user_data, 'time'), SORT_ASC, $paid_user_data);
|
||
foreach ($unpaid_user_data as &$userss){
|
||
//substr_replace($username, '****', 3, 4);
|
||
$userss["nickname"] = $this->nickname_filter($userss["nickname"]);
|
||
}
|
||
|
||
foreach ($paid_user_data as &$usersss){
|
||
//substr_replace($username, '****', 3, 4);
|
||
$usersss["nickname"] = $this->nickname_filter($usersss["nickname"]);
|
||
}
|
||
|
||
|
||
return compact("unpaid_user_data","paid_user_data");
|
||
}
|
||
|
||
public function nickname_filter($nickname){
|
||
$nickname_len = mb_strlen($nickname);
|
||
if($nickname_len<=2){
|
||
return $nickname;
|
||
}else{
|
||
return mb_substr($nickname,0,1).str_repeat("*",$nickname_len-2).mb_substr($nickname,-1);
|
||
}
|
||
}
|
||
|
||
|
||
/**课程规格
|
||
* @param $id
|
||
*
|
||
*/
|
||
public function spec($id){
|
||
//课程规格
|
||
$spec_data = ClassesSpec::where("classes_lib_id",$id)->where("status",'1')->order("weigh desc")->select();
|
||
|
||
return $spec_data;
|
||
}
|
||
|
||
|
||
/** 管理的课程ids
|
||
* @param $user_id
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
public function getClassesAuthIds($user_id){
|
||
$classes_lib_ids = Verification::where("user_id",$user_id)->where("status",'1')->column("classes_lib_ids");
|
||
if($classes_lib_ids){
|
||
//遍历课程ids
|
||
foreach ($classes_lib_ids as $classes_lib_id){
|
||
$classes_lib_id_arr = explode(",",$classes_lib_id)?:[];
|
||
foreach ($classes_lib_id_arr as $v){
|
||
$this->classes_lib_ids[] = $v;
|
||
}
|
||
}
|
||
}
|
||
//判断是否有老师身份
|
||
$teacher = Teacher::where("user_id",$user_id)->find();
|
||
if($teacher){
|
||
$lib_ids = ClassesLib::where("teacher_id",$teacher['id'])->column('id');
|
||
$this->classes_lib_ids = array_merge($this->classes_lib_ids,$lib_ids);
|
||
}
|
||
$this->classes_lib_ids = array_unique($this->classes_lib_ids);
|
||
|
||
return $this->classes_lib_ids;
|
||
}
|
||
|
||
}
|