new files

This commit is contained in:
panchengyong
2026-03-07 22:29:07 +08:00
parent cd7e80b502
commit 7acbf45ff7
12516 changed files with 1808447 additions and 194 deletions

View File

@@ -0,0 +1,637 @@
<?php
declare (strict_types=1);
namespace app\model\activity\holiday;
use app\model\user\User;
use crmeb\basic\BaseModel;
use think\Model;
/**
* 节日有礼模型
* Class HolidayGift
* @package app\model\activity
*/
class HolidayGift extends BaseModel
{
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'holiday_gift';
/**
* 自动写入时间戳
* @var bool
*/
protected $autoWriteTimestamp = false;
/**
* 任务类型
* @var array
*/
public const TASK_TYPE = [
1 => '用户生日',
2 => '活动日期'
];
/**
* 活动日期类型
* @var array
*/
public const ACTIVITY_DATE_TYPE = [
1 => '自定义日期',
2 => '每月',
3 => '每周'
];
/**
* 生日类型
* @var array
*/
public const BIRTHDAY_TYPE = [
1 => '生日当天',
2 => '生日当周',
3 => '生日当月',
0 => '无'
];
/**
* 推送时段类型
* @var array
*/
public const PUSH_TIME_TYPE = [
1 => '全时段',
2 => '指定时段'
];
/**
* 推送人群类型
* @var array
*/
public const PUSH_USER_TYPE = [
1 => '全部人群',
2 => '指定人群'
];
/**
* 条件满足类型
* @var array
*/
public const CONDITION_TYPE = [
1 => '满足任一条件',
2 => '满足全部条件'
];
/**
* 礼品类型
* @var array
*/
public const GIFT_TYPE = [
1 => '优惠券',
2 => '积分',
3 => '多倍积分',
4 => '余额',
5 => '全场包邮'
];
/**
* 推送渠道
* @var array
*/
public const PUSH_CHANNEL = [
1 => '短信',
2 => '公众号',
3 => '弹框广告'
];
/**
* 推送频次
* @var array
*/
public const PUSH_FREQUENCY = [
1 => '永久一次',
2 => '每次进入',
3 => '每天',
4 => '每月',
5 => '每周'
];
/**
* 显示页面
* @var array
*/
public const SHOW_PAGE = [
1 => '商城首页',
2 => '分类页',
3 => '购物车',
4 => '个人中心',
5 => '支付成功',
6 => '专题页面'
];
/**
* 状态
* @var array
*/
public const STATUS = [
0 => '关闭',
1 => '开启'
];
/**
* 是否提前推送
* @var array
*/
public const ADVANCE_PUSH = [
0 => '否',
1 => '是'
];
/**
* 是否永久
* @var array
*/
public const IS_PERMANENT = [
0 => '否',
1 => '是'
];
/**
* 推送类型
* @var array
*/
public const PUSH_TYPE = [
1 => '短信',
2 => '公众号',
3 => '弹框广告'
];
/**
* 推送状态
* @var array
*/
public const PUSH_STATUS = [
0 => '推送失败',
1 => '推送成功'
];
/**
* 记录状态
* @var array
*/
public const RECORD_STATUS = [
0 => '未使用',
1 => '已使用'
];
public function getAddTimeAttr($value)
{
return $value ? date('Y-m-d H:i:s', $value) : '';
}
/**
* 获取用户标签属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 用户标签数组
*/
public function getUserLabelAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置用户标签属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 用户标签数组或字符串
* @return string 逗号分隔的字符串
*/
public function setUserLabelAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取用户自定义标签属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 用户自定义标签数组
*/
public function getUserTagAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
public function getUserLevelAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
public function setUserLevelAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 设置用户自定义标签属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 用户自定义标签数组或字符串
* @return string 逗号分隔的字符串
*/
public function setUserTagAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取礼品类型属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 礼品类型数组
*/
public function getGiftTypeAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置礼品类型属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 礼品类型数组或字符串
* @return string 逗号分隔的字符串
*/
public function setGiftTypeAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取优惠券ID属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 优惠券ID数组
*/
public function getCouponIdsAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置优惠券ID属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 优惠券ID数组或字符串
* @return string 逗号分隔的字符串
*/
public function setCouponIdsAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取推送渠道属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 推送渠道数组
*/
public function getPushChannelAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置推送渠道属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 推送渠道数组或字符串
* @return string 逗号分隔的字符串
*/
public function setPushChannelAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取推送周期属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 推送周期数组
*/
public function getPushWeekDaysAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置推送周期属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 推送周期数组或字符串
* @return string 逗号分隔的字符串
*/
public function setPushWeekDaysAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取显示页面属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 显示页面数组
*/
public function getShowPageAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置展示页面属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 展示页面数组或字符串
* @return string 逗号分隔的字符串
*/
public function setShowPageAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取微信图片属性
* 将JSON字符串转换为数组并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 微信图片数组
*/
public function getWechatImageAttr($value)
{
if (!$value) return [];
$array = json_decode($value, true);
return $this->convertNumericStringsToInt($array);
}
/**
* 递归将数组中的数字字符串转换为整型
* @param array $array 需要处理的数组
* @return array|int
*/
private function convertNumericStringsToInt($array)
{
if (!is_array($array)) {
return is_numeric($array) ? (int)$array : $array;
}
foreach ($array as $key => $value) {
if (is_array($value)) {
$array[$key] = $this->convertNumericStringsToInt($value);
} else if (is_numeric($value)) {
$array[$key] = (int)$value;
}
}
return $array;
}
/**
* 设置微信图片属性
* 将数组转换为JSON字符串
* @param array|string $value 微信图片数组或字符串
* @return string JSON格式的字符串
*/
public function setWechatImageAttr($value)
{
return is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value;
}
/**
* 获取话题ID属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 话题ID数组
*/
public function getTopicIdsAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置专题ID属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 专题ID数组或字符串
* @return string 逗号分隔的字符串
*/
public function setTopicIdsAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取活动月份日期属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 活动月份日期数组
*/
public function getActivityMonthDaysAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置活动月份日期属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 活动月份日期数组或字符串
* @return string 逗号分隔的字符串
*/
public function setActivityMonthDaysAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 获取活动周日期属性
* 将逗号分隔的字符串转换为数组,并将字符串数字转为整型
* @param string|null $value 原始值
* @return array 活动周日期数组
*/
public function getActivityWeekDaysAttr($value)
{
if (!$value) return [];
$array = explode(',', $value);
return $this->convertNumericStringsToInt($array);
}
/**
* 设置活动周日期属性
* 将数组转换为逗号分隔的字符串
* @param array|string $value 活动周日期数组或字符串
* @return string 逗号分隔的字符串
*/
public function setActivityWeekDaysAttr($value)
{
return is_array($value) ? implode(',', $value) : $value;
}
/**
* 根据ID搜索
* @param Model $query 查询对象
* @param mixed $value 搜索值
* @return Model
*/
public function searchIdAttr($query, $value)
{
if ($value !== '') {
if (is_array($value)) {
$query->whereIn('id', $value);
} else {
$query->where('id', $value);
}
}
return $query;
}
/**
* 根据名称搜索
* @param Model $query 查询对象
* @param mixed $value 搜索值
* @return Model
*/
public function searchNameAttr($query, $value)
{
if ($value !== '') {
$query->whereLike('name', '%' . $value . '%');
}
return $query;
}
/**
* 根据删除状态搜索
* @param Model $query 查询对象
* @param mixed $value 搜索值
* @return Model
*/
public function searchIsDelAttr($query, $value)
{
if ($value !== '') {
$query->where('is_del', $value);
}
return $query;
}
/**
* 根据状态搜索
* @param Model $query 查询对象
* @param mixed $value 搜索值
* @return Model
*/
public function searchStatusAttr($query, $value)
{
if ($value !== '') {
$query->where('status', $value);
}
return $query;
}
/**
* 根据任务类型搜索
* @param Model $query 查询对象
* @param mixed $value 搜索值
* @return Model
*/
public function searchTaskTypeAttr($query, $value)
{
if ($value !== '') {
$query->where('task_type', $value);
}
return $query;
}
/**
* 根据生日类型搜索
* @param Model $query 查询对象
* @param mixed $value 搜索值
* @return Model
*/
public function searchBirthdayTypeAttr($query, $value)
{
if ($value !== '') {
$query->where('birthday_type', $value);
}
return $query;
}
/**
* 搜索有效期内的活动
* @param Model $query 查询对象
* @param mixed $value 是否在有效期内true表示在有效期内false表示不限制
* @return Model
*/
public function searchIsValidAttr($query, $value = true)
{
if ($value !== '') {
$query->where(function ($query) {
$query->where('is_permanent', 1)->whereOr(function ($query) {
$now = time();
$query->where('start_time', '<=', $now)
->where('end_time', '>=', $now);
});
});
}
return $query;
}
public function searchGiftTimeAttr($query, $value = true)
{
if ($value !== '') {
$time = explode('-', $value);
$start_time = strtotime($time[0]);
$end_time = strtotime($time[1]);
$query->where('start_time', '<=', $start_time)
->where('end_time', '>=', $end_time);
}
return $query;
}
/**
* 推送渠道多个用逗号分隔1-短信2-公众号3-弹框广告',
*
* @param $query
* @param $value
* @return mixed
* User: liusl
* DateTime: 2025/8/12 15:34
*/
public function searchPushChannelsAttr($query, $value = true)
{
if ($value !== '') {
$query->whereLike('push_channel', '%' . $value . '%');
}
return $query;
}
}

View File

@@ -0,0 +1,99 @@
<?php
declare (strict_types=1);
namespace app\model\activity\holiday;
use app\model\user\User;
use crmeb\basic\BaseModel;
use think\Model;
/**
* 节日有礼推送记录模型
* Class HolidayGiftPush
* @package app\model\activity
*/
class HolidayGiftPush extends BaseModel
{
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'holiday_gift_push';
/**
* 自动写入时间戳
* @var bool
*/
protected $autoWriteTimestamp = false;
/**
* 添加时间获取器
* @param $value
* @return string
*/
public function getAddTimeAttr($value)
{
return $value ? date('Y-m-d H:i:s', (int)$value) : '';
}
/**
* 推送时间获取器
* @param $value
* @return string
*/
public function getPushTimeAttr($value)
{
return $value ? date('Y-m-d H:i:s', (int)$value) : '';
}
/**
* 推送类型获取器
* @param $value
* @return string
*/
public function getPushTypeNameAttr($value, $data)
{
return HolidayGift::$pushChannelMap[$data['push_type']] ?? '';
}
/**
* 状态获取器
* @param $value
* @return string
*/
public function getStatusNameAttr($value, $data)
{
return $data['status'] ? '推送成功' : '推送失败';
}
/**
* 关联用户表
* @return \think\model\relation\HasOne
*/
public function user()
{
return $this->hasOne(User::class, 'uid', 'uid')->bind([
'nickname',
'avatar',
'phone'
]);
}
/**
* 关联节日有礼表
* @return \think\model\relation\HasOne
*/
public function holidayGift()
{
return $this->hasOne(HolidayGift::class, 'id', 'gift_id')->bind([
'gift_name' => 'name'
]);
}
}

View File

@@ -0,0 +1,222 @@
<?php
declare (strict_types=1);
namespace app\model\activity\holiday;
use app\model\user\User;
use crmeb\basic\BaseModel;
use think\Model;
/**
* 节日有礼领取记录模型
* Class HolidayGiftRecord
* @package app\model\activity
*/
class HolidayGiftRecord extends BaseModel
{
/**
* 数据表主键
* @var string
*/
protected $pk = 'id';
/**
* 模型名称
* @var string
*/
protected $name = 'holiday_gift_record';
/**
* 自动写入时间戳
* @var bool
*/
protected $autoWriteTimestamp = false;
/**
* 添加时间获取器
* @param $value
* @return string
*/
public function getAddTimeAttr($value)
{
return $value ? date('Y-m-d H:i:s', (int)$value) : '';
}
/**
* 领取时间获取器
* @param $value
* @return string
*/
public function getReceiveTimeAttr($value)
{
return $value ? date('Y-m-d H:i:s', (int)$value) : '';
}
/**
* 使用时间获取器
* @param $value
* @return string
*/
public function getUseTimeAttr($value)
{
return $value ? date('Y-m-d H:i:s', (int)$value) : '';
}
/**
* 状态获取器
* @param $value
* @return string
*/
public function getStatusNameAttr($value, $data)
{
return $data['status'] ? '已使用' : '未使用';
}
/**
* 关联用户表
* @return \think\model\relation\HasOne
*/
public function user()
{
return $this->hasOne(User::class, 'uid', 'uid')->bind([
'nickname',
'avatar',
'phone'
]);
}
/**
* 关联节日有礼表
* @return \think\model\relation\HasOne
*/
public function holidayGift()
{
return $this->hasOne(HolidayGift::class, 'id', 'gift_id')->bind([
'gift_name' => 'name'
]);
}
/**
* 赠送内容类型获取器
* @param $value
* @return array
*/
public function getGiftTypeNameAttr($value, $data)
{
$giftTypes = explode(',', $data['gift_type']);
$names = [];
foreach ($giftTypes as $type) {
if (isset(HolidayGift::$giftTypeMap[$type])) {
$names[] = HolidayGift::$giftTypeMap[$type];
}
}
return $names;
}
/**
* 节日有礼活动ID搜索器
* @param $query
* @param $value
* @return void
*/
public function searchGiftIdAttr($query, $value)
{
if ($value !== '' && $value !== null) {
$query->where('gift_id', $value);
}
}
/**
* 用户ID搜索器
* @param $query
* @param $value
* @return void
*/
public function searchUidAttr($query, $value)
{
if ($value !== '' && $value !== null) {
$query->where('uid', $value);
}
}
/**
* 领取时间搜索器
* @param $query
* @param $value
* @return void
*/
public function searchReceiveTimeAttr($query, $value)
{
if (is_array($value) && count($value) == 2) {
$query->whereBetween('receive_time', $value);
} elseif ($value !== '' && $value !== null) {
$query->where('receive_time', $value);
}
}
/**
* 添加时间搜索器
* @param $query
* @param $value
* @return void
*/
public function searchAddTimeAttr($query, $value)
{
if (is_array($value) && count($value) == 2) {
$query->whereBetween('add_time', $value);
} elseif ($value !== '' && $value !== null) {
$query->where('add_time', $value);
}
}
/**
* 礼物类型搜索器
* @param $query
* @param $value
* @return void
*/
public function searchGiftTypeAttr($query, $value)
{
if ($value !== '' && $value !== null) {
if (is_array($value)) {
$query->where(function ($q) use ($value) {
foreach ($value as $type) {
$q->whereOr('gift_type', 'like', '%' . $type . '%');
}
});
} else {
$query->where('gift_type', 'like', '%' . $value . '%');
}
}
}
/**
* 时间范围搜索器(通用)
* @param $query
* @param $value
* @param $field
* @return void
*/
public function searchTimeRangeAttr($query, $value, $field = 'add_time')
{
if (is_array($value) && count($value) == 2) {
$startTime = is_numeric($value[0]) ? $value[0] : strtotime($value[0]);
$endTime = is_numeric($value[1]) ? $value[1] : strtotime($value[1]);
$query->whereBetween($field, [$startTime, $endTime]);
}
}
/**
* 关键词搜索器(搜索礼品内容)
* @param $query
* @param $value
* @return void
*/
public function searchKeywordAttr($query, $value)
{
if ($value !== '' && $value !== null) {
$query->where('gift_content', 'like', '%' . $value . '%');
}
}
}