Files
huangjingfen/pro_v3.5.1_副本/app/model/activity/holiday/HolidayGift.php
apple 434aa8c69d feat(fsgx): 完成全部24项开发任务 Phase1-7
Phase1 后端核心:
- 新增 fsgx_v1.sql 迁移脚本(is_queue_goods/frozen_points/available_points/no_assess)
- SystemConfigServices 返佣设置扩展(周期人数/分档比例/范围/时机)
- StoreOrderCreateServices 周期循环佣金计算
- StoreOrderTakeServices 佣金发放后同步冻结积分
- StoreProductServices/StoreProduct 保存 is_queue_goods

Phase2 后端接口:
- GET /api/hjf/brokerage/progress 佣金周期进度
- GET /api/hjf/assets/overview 资产总览
- HjfPointsServices 每日 frozen_points 0.4‰ 释放定时任务
- PUT /adminapi/hjf/member/{uid}/no_assess 不考核接口
- GET /adminapi/hjf/points/release_log 积分日志接口

Phase3 前端清理:
- hjfCustom.js 路由精简(仅保留 points/log)
- hjfQueue.js/hjfMember.js API 清理/重定向至 CRMEB 原生接口
- pages.json 公排→推荐佣金/佣金记录/佣金规则

Phase4-5 前端改造:
- queue/status.vue 推荐佣金进度页整体重写
- 商品详情/订单确认/支付结果页文案与逻辑改造
- 个人中心/资产页/引导页/规则页文案改造
- HjfQueueProgress/HjfRefundNotice/HjfAssetCard 组件改造
- 推广中心嵌入佣金进度摘要
- hjfMockData.js 全量更新(公排字段→佣金字段)

Phase6 Admin 增强:
- 用户列表新增 frozen_points/available_points 列及不考核操作按钮
- hjfPoints.js USE_MOCK=false 对接真实积分日志接口

Phase7 配置文档:
- docs/fsgx-phase7-config-checklist.md 后台配置与全链路验收清单

Made-with: Cursor
2026-03-23 22:32:19 +08:00

638 lines
16 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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;
}
}