manghe/app/admin/controller/Goods.php
2025-04-13 21:57:55 +08:00

2285 lines
91 KiB
PHP
Executable File
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
namespace app\admin\controller;
use app\admin\controller\Base;
use app\common\model\Category;
use app\common\model\Yushou;
use \think\Request;
use think\facade\View;
use app\common\model\Goods as GoodsModel;
use app\common\model\GoodsList;
use app\common\model\AdminGoodsLog;
use think\facade\Db;
use app\common\model\Shang;
use app\common\model\Reward;
use app\common\model\GoodsExtend;
class Goods extends Base
{
/**
* 盒子列表
*/
public function goods(Request $request)
{
return View::fetch("Goods/goods");
}
/**
* 获取盒子列表数据(前后端分离接口)
*/
public function getGoodsList(Request $request)
{
$page = $request->param('page/d', 1);
$limit = $request->param('limit/d', 20);
$title = $request->param('title/s', '');
$status = $request->param('status/s', '');
$type = $request->param('type/s', '');
// 构建查询条件
$where = [];
if (!empty($title)) {
$where[] = ['title', 'like', "%{$title}%"];
}
if ($status !== '') {
$where[] = ['status', '=', $status];
}
if ($type !== '') {
$where[] = ['type', '=', $type];
} else {
$where[] = ['type', '!=', 15];
}
$query = GoodsModel::where($where)->order('id desc');
$count = $query->count();
$list = $query->page($page, $limit)->select()->toArray();
// 获取盒子ID集合
$goodsIds = array_column($list, 'id');
// 获取盒子扩展信息
$goodsExtendList = [];
if (!empty($goodsIds)) {
$goodsExtends = \app\common\model\GoodsExtend::whereIn('goods_id', $goodsIds)->select()->toArray();
foreach ($goodsExtends as $extend) {
$goodsExtendList[$extend['goods_id']] = $extend;
}
}
// 处理图片路径
foreach ($list as &$item) {
$item['imgurl'] = imageUrl($item['imgurl']);
if (!empty($item['imgurl_detail'])) {
$item['imgurl_detail'] = imageUrl($item['imgurl_detail']);
}
// 添加格式化时间
$item['addtime_text'] = date('Y-m-d H:i', $item['addtime']);
// 添加扩展信息
$item['goods_extend'] = isset($goodsExtendList[$item['id']]) ? $goodsExtendList[$item['id']] : null;
// 修改时间处理
if (isset($item['update_time']) && $item['update_time']) {
$item['update_time_text'] = date('Y-m-d H:i', $item['update_time']);
}
}
return $this->renderTable('获取成功', $count, $list);
}
/**
* 获取盒子类型列表(前后端分离接口)
*/
public function getGoodsTypeList()
{
// 查询可用的盒子类型
$goodsTypeList = Db::name('goods_type')
->field('value,sort_order,remark,is_fenlei,fl_name,pay_wechat,pay_balance,pay_currency,pay_currency2,pay_coupon,is_deduction')
->where('is_fenlei', 1)
->order('sort_order')
->select()
->toArray();
return $this->renderTable('获取成功', count($goodsTypeList), $goodsTypeList);
}
/**
* 添加盒子
*/
public function goods_add(Request $request)
{
if (!$request->isPost()) {
$item_card = \app\common\model\ItemCard::where('id', '<', 3)->select()->toArray();
$shang = Shang::where('id', 'between', [34, 38])->select()->toArray();
// 查询可用的盒子类型
$goodsTypeList = Db::name('goods_type')
->field('value,sort_order,remark,is_fenlei,fl_name')
->where('is_fenlei', 1)
->order('sort_order')
->select()
->toArray();
View::assign('goodsTypeList', $goodsTypeList);
View::assign('shang', $shang);
View::assign('item_card', $item_card);
return View::fetch("Goods/goods_add");
} else {
$data = input('post.');
if (empty($data['title'])) {
return $this->renderError("请输入盒子名称");
}
if (RegMoney($data['price'])) {
return $this->renderError("盒子价格输入不规范,最多保留两位小数");
}
if (RegZero($data['sort'])) {
return $this->renderError("排序输入不规范,请输入整数");
}
// 检查daily_xiangou
if (!isset($data['daily_xiangou']) || $data['daily_xiangou'] === '') {
$data['daily_xiangou'] = 0;
} else if (!is_numeric($data['daily_xiangou']) || intval($data['daily_xiangou']) < 0) {
return $this->renderError("每日限购次数必须是非负整数");
} else {
$data['daily_xiangou'] = intval($data['daily_xiangou']);
}
if ($data['type'] == 1 || $data['type'] == 11) {
if (RegInt($data['stock'])) {
return $this->renderError("库存输入不规范,请设置大于0的整数");
}
if ($data['lock_is'] == 1) {
if (RegInt($data['lock_time'])) {
return $this->renderError("请设置锁箱时间");
}
} elseif ($data['lock_is'] == 0) {
$data['lock_time'] = 0;
} else {
return $this->renderError("锁箱类型选择错误");
}
if ($data['integral_is'] != 0 && $data['integral_is'] != 1) {
return $this->renderError("发积分开关选择错误");
}
if ($data['show_is'] != 0 && $data['show_is'] != 1) {
return $this->renderError("首页显示开关选择错误");
}
$data['prize_num'] = 0;
$data['category_id'] = 0;
} elseif ($data['type'] == 2 || $data['type'] == 16 || $data['type'] == 17) {
$data['stock'] = 0;
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['show_is'] = 0;
$data['prize_num'] = 0;
if ($data['integral_is'] != 0 && $data['integral_is'] != 1) {
return $this->renderError("发积分开关选择错误");
}
$data['category_id'] = 0;
} elseif ($data['type'] == 3) {
$data['stock'] = 1;
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['show_is'] = 0;
$data['category_id'] = 0;
$data['prize_num'] = 0;
// if (RegInt($data['prize_num'])) {
// return $this->renderError("擂台赏抽全局赏数量设置错误,请设置大于0的整数");
// }
if ($data['integral_is'] != 0 && $data['integral_is'] != 1) {
return $this->renderError("发积分开关选择错误");
}
} elseif ($data['type'] == 5) {
if (RegInt($data['stock'])) {
return $this->renderError("库存输入不规范,请设置大于0的整数");
}
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['prize_num'] = 0;
$data['show_is'] = 0;
$data['coupon_is'] = 0;
$data['coupon_pro'] = 0;
$data['integral_is'] = 0;
$data['category_id'] = 0;
} elseif ($data['type'] == 6) {
if (RegInt($data['stock'])) {
return $this->renderError("库存输入不规范,请设置大于0的整数");
}
if ($data['lock_is'] == 1) {
if (RegInt($data['lock_time'])) {
return $this->renderError("请设置锁箱时间");
}
} elseif ($data['lock_is'] == 0) {
$data['lock_time'] = 0;
} else {
return $this->renderError("锁箱类型选择错误");
}
if ($data['integral_is'] != 0 && $data['integral_is'] != 1) {
return $this->renderError("发积分开关选择错误");
}
if ($data['show_is'] != 0 && $data['show_is'] != 1) {
return $this->renderError("首页显示开关选择错误");
}
$data['prize_num'] = 0;
$data['category_id'] = 0;
} elseif ($data['type'] == 8) {
$data['stock'] = 0;
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['show_is'] = 0;
$data['prize_num'] = 0;
if ($data['integral_is'] != 0 && $data['integral_is'] != 1) {
return $this->renderError("发积分开关选择错误");
}
$data['category_id'] = 0;
} elseif ($data['type'] == 9) {
$data['stock'] = 0;
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['show_is'] = 0;
$data['prize_num'] = 0;
if ($data['integral_is'] != 0 && $data['integral_is'] != 1) {
return $this->renderError("发积分开关选择错误");
}
$data['category_id'] = 0;
} elseif ($data['type'] == 10) {
if (RegInt($data['stock'])) {
return $this->renderError("库存输入不规范,请设置大于0的整数");
}
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['prize_num'] = 0;
$data['show_is'] = 0;
$data['coupon_is'] = 0;
$data['coupon_pro'] = 0;
$data['integral_is'] = 0;
$data['category_id'] = 0;
$data['stock'] = 1;
} elseif ($data['type'] == 15) {
// 福利屋类型处理
$data['stock'] = 0; // 隐藏套数
$data['lock_is'] = 0; // 隐藏锁箱类型
$data['lock_time'] = 0; // 隐藏锁箱时间
$data['coupon_is'] = 0; // 隐藏发券开关
$data['coupon_pro'] = 0; // 隐藏发券概率
$data['integral_is'] = 0; // 隐藏发积分开关
$data['prize_num'] = 0;
$data['category_id'] = 0;
$data['is_flw'] = 1; // 标记为福利屋
// 处理时间字段
if (!empty($data['flw_start_time'])) {
$data['flw_start_time'] = strtotime($data['flw_start_time']);
} else {
return $this->renderError("请选择开始时间");
}
if (!empty($data['flw_end_time'])) {
$data['flw_end_time'] = strtotime($data['flw_end_time']);
} else {
return $this->renderError("请选择结束时间");
}
if (!empty($data['open_time'])) {
$data['open_time'] = strtotime($data['open_time']);
} else {
return $this->renderError("请选择开奖时间");
}
// 验证时间逻辑
if ($data['flw_start_time'] >= $data['flw_end_time']) {
return $this->renderError("开始时间必须早于结束时间");
}
if ($data['flw_end_time'] >= $data['open_time']) {
return $this->renderError("结束时间必须早于开奖时间");
}
// 验证抽奖门槛
if (!isset($data['choujiang_xianzhi']) || $data['choujiang_xianzhi'] === '') {
$data['choujiang_xianzhi'] = 0;
} else if (!is_numeric($data['choujiang_xianzhi']) || intval($data['choujiang_xianzhi']) < 0) {
return $this->renderError("抽奖门槛必须是非负整数");
}
// 默认未开奖
$data['is_open'] = 0;
} else {
return $this->renderError("盒子类型选择错误");
}
$data['sale_time'] = 0;
// if (isset($data['sale_time'])) {
// $data['sale_time'] = strtotime($data['sale_time']);
// } else {
// $data['sale_time'] = 0;
// }
if (empty($data['imgurl'])) {
return $this->renderError("请上传盒子封面图");
}
if (empty($data['imgurl_detail'])) {
return $this->renderError("请上传盒子详情图");
}
$data['status'] = 2;
$data['addtime'] = time();
$dd = GoodsModel::insert($data);
if ($dd) {
return $this->renderSuccess("添加成功");
} else {
return $this->renderError("网络繁忙,请稍后");
}
}
}
/**
* 编辑盒子
*/
public function goods_edit(Request $request)
{
if (!$request->isPost()) {
$id = $request->param('id/d', 0);
$info = GoodsModel::where(['id' => $id])->find();
if (!$info) {
return $this->renderError("请求参数错误");
}
$info['sale_time'] = '';
// if ($info['sale_time']) {
// $info['sale_time'] = date('Y-m-d', $info['sale_time']);
// } else {
// $info['sale_time'] = '';
// }
$type = $info['type'];
$item_card = \app\common\model\ItemCard::where('id', '<', 3)->select()->toArray();
$shang = Shang::where('id', 'between', [34, 38])->select()->toArray();
// 查询可用的盒子类型
$goodsTypeList = Db::name('goods_type')
->field('value,sort_order,remark,is_fenlei,fl_name')
->where('is_fenlei', 1)
->order('sort_order')
->select()
->toArray();
View::assign('goodsTypeList', $goodsTypeList);
View::assign('shang', $shang);
View::assign('item_card', $item_card);
View::assign('type', $type);
View::assign('info', $info);
// 确保daily_xiangou字段存在
if (!isset($info['daily_xiangou'])) {
$info['daily_xiangou'] = 0;
}
return View::fetch("Goods/goods_edit");
} else {
$data = input('post.');
if (empty($data['id'])) {
return $this->renderError("请求参数错误");
}
$info = GoodsModel::where(['id' => $data['id']])->find();
if (!$info) {
return $this->renderError("请求参数错误1");
}
if (empty($data['title'])) {
return $this->renderError("请输入盒子名称");
}
if (RegMoney($data['price'])) {
return $this->renderError("盒子价格输入不规范,最多保留两位小数");
}
if (RegZero($data['sort'])) {
return $this->renderError("排序输入不规范,请输入整数");
}
// 检查daily_xiangou
if (!isset($data['daily_xiangou']) || $data['daily_xiangou'] === '') {
$data['daily_xiangou'] = 0;
} else if (!is_numeric($data['daily_xiangou']) || intval($data['daily_xiangou']) < 0) {
return $this->renderError("每日限购次数必须是非负整数");
} else {
$data['daily_xiangou'] = intval($data['daily_xiangou']);
}
$type = $info['type'];
if ($type == 1 || $type == 11) {
if (RegInt($data['stock'])) {
return $this->renderError("库存输入不规范,请设置大于0的整数");
}
if ($data['lock_is'] == 1) {
if (RegInt($data['lock_time'])) {
return $this->renderError("请设置锁箱时间");
}
} elseif ($data['lock_is'] == 0) {
$data['lock_time'] = 0;
} else {
return $this->renderError("锁箱类型选择错误");
}
$data['prize_num'] = 0;
$data['category_id'] = 0;
} elseif ($type == 2 || $type == 16 || $type == 17) {
$data['stock'] = 0;
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['prize_num'] = 0;
$data['category_id'] = 0;
} elseif ($type == 3) {
if ($info['stock'] != $data['stock']) {
return $this->renderError("不可修改库存");
}
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['category_id'] = 0;
$data['prize_num'] = 0;
} elseif ($type == 5) {
if (RegInt($data['stock'])) {
return $this->renderError("库存输入不规范,请设置大于0的整数");
}
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['prize_num'] = 0;
$data['coupon_is'] = 0;
$data['coupon_pro'] = 0;
$data['integral_is'] = 0;
$data['category_id'] = 0;
} elseif ($type == 6) {
if (RegInt($data['stock'])) {
return $this->renderError("库存输入不规范,请设置大于0的整数");
}
if ($data['lock_is'] == 1) {
if (RegInt($data['lock_time'])) {
return $this->renderError("请设置锁箱时间");
}
} elseif ($data['lock_is'] == 0) {
$data['lock_time'] = 0;
} else {
return $this->renderError("锁箱类型选择错误");
}
if ($data['show_is'] != 0 && $data['show_is'] != 1) {
return $this->renderError("首页显示开关选择错误");
}
$data['prize_num'] = 0;
$data['category_id'] = 0;
} elseif ($type == 8) {
$data['stock'] = 0;
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['prize_num'] = 0;
$data['category_id'] = 0;
} elseif ($type == 9) {
$data['stock'] = 0;
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['prize_num'] = 0;
$data['category_id'] = 0;
} elseif ($type == 10) {
if (RegInt($data['stock'])) {
return $this->renderError("库存输入不规范,请设置大于0的整数");
}
$data['lock_is'] = 0;
$data['lock_time'] = 0;
$data['prize_num'] = 0;
$data['show_is'] = 0;
$data['coupon_is'] = 0;
$data['coupon_pro'] = 0;
$data['integral_is'] = 0;
$data['category_id'] = 0;
$data['stock'] = 1;
} elseif ($type == 15) {
// 福利屋类型处理
$data['stock'] = 0; // 隐藏套数
$data['lock_is'] = 0; // 隐藏锁箱类型
$data['lock_time'] = 0; // 隐藏锁箱时间
$data['coupon_is'] = 0; // 隐藏发券开关
$data['coupon_pro'] = 0; // 隐藏发券概率
$data['integral_is'] = 0; // 隐藏发积分开关
$data['prize_num'] = 0;
$data['category_id'] = 0;
$data['is_flw'] = 1; // 标记为福利屋
// 处理时间字段
if (!empty($data['flw_start_time'])) {
$data['flw_start_time'] = strtotime($data['flw_start_time']);
} else {
return $this->renderError("请选择开始时间");
}
if (!empty($data['flw_end_time'])) {
$data['flw_end_time'] = strtotime($data['flw_end_time']);
} else {
return $this->renderError("请选择结束时间");
}
if (!empty($data['open_time'])) {
$data['open_time'] = strtotime($data['open_time']);
} else {
return $this->renderError("请选择开奖时间");
}
// 验证时间逻辑
if ($data['flw_start_time'] >= $data['flw_end_time']) {
return $this->renderError("开始时间必须早于结束时间");
}
if ($data['flw_end_time'] >= $data['open_time']) {
return $this->renderError("结束时间必须早于开奖时间");
}
// 验证抽奖门槛
if (!isset($data['choujiang_xianzhi']) || $data['choujiang_xianzhi'] === '') {
$data['choujiang_xianzhi'] = 0;
} else if (!is_numeric($data['choujiang_xianzhi']) || intval($data['choujiang_xianzhi']) < 0) {
return $this->renderError("抽奖门槛必须是非负整数");
}
// 默认未开奖
$data['is_open'] = 0;
} else {
return $this->renderError("盒子类型选择错误");
}
$data['sale_time'] = 0;
// if (isset($data['sale_time'])) {
// $data['sale_time'] = strtotime($data['sale_time']);
// } else {
// $data['sale_time'] = 0;
// }
if (empty($data['imgurl'])) {
return $this->renderError("请上传盒子封面图");
}
if (empty($data['imgurl_detail'])) {
return $this->renderError("请上传盒子封面图");
}
$data['update_time'] = time();
if ($data['stock'] < $info['stock']) {
return $this->renderError("不能减少库存");
}
Db::startTrans();
$res = [];
#添加套
if ($type == 1 || $type == 11 || $type == 5 || $type == 10 || $type == 6) {
if (($data['stock'] > $info['stock'])) {
#赏品
$goods_list = GoodsList::where(['goods_id' => $info['id']])
->where(['num' => 1])
->where('goods_list_id', '=', 0) // 只查询父奖品
->select()->toArray();
if ($goods_list) {
#循环数据
$save_sports_data = [];
$start_num = $info['stock'] + 1;
// 获取宝箱类型的父奖品记录及其prize_code
$box_prize_codes = [];
foreach ($goods_list as $item) {
if ($item['goods_type'] == 4) {
$box_prize_codes[$item['prize_code']] = true;
}
}
// 先处理父奖品(包括宝箱类型的父奖品)
for ($i = $start_num; $i <= $data['stock']; $i++) {
foreach ($goods_list as $k => $v) {
unset($v['id']);
unset($v['num']);
$v['num'] = $i;
$v['surplus_stock'] = $v['stock'];
// 保持prize_code不变这样可以关联到同一套奖品
// 添加到待插入数组
$save_sports_data[] = $v;
}
}
// 先插入父奖品
if (!empty($save_sports_data)) {
$res[] = GoodsList::insertAll($save_sports_data);
}
// 如果有宝箱类型的奖品,需要处理子奖品
if (!empty($box_prize_codes)) {
// 处理所有新套数的子奖品
for ($i = $start_num; $i <= $data['stock']; $i++) {
// 先获取当前套数下所有新插入的宝箱类型父奖品
$new_box_parents = GoodsList::where([
'goods_id' => $info['id'],
'num' => $i,
'goods_type' => 4,
'goods_list_id' => 0
])
->select()
->toArray();
if (empty($new_box_parents)) {
continue; // 如果没有宝箱父奖品,跳过
}
// 遍历每个宝箱父奖品
foreach ($new_box_parents as $new_box_parent) {
// 找到第一套中相同prize_code的宝箱父奖品
$original_parent = GoodsList::where([
'goods_id' => $info['id'],
'num' => 1,
'goods_type' => 4,
'prize_code' => $new_box_parent['prize_code'],
'goods_list_id' => 0
])
->find();
if (!$original_parent) {
continue; // 找不到原始父奖品,跳过
}
// 获取原始父奖品的所有子奖品
$child_items = GoodsList::where([
'goods_id' => $info['id'],
'goods_list_id' => $original_parent['id']
])
->select()
->toArray();
if (empty($child_items)) {
continue; // 没有子奖品,跳过
}
// 复制所有子奖品到新的套数每个子奖品创建新的prize_code
$child_save_data = [];
foreach ($child_items as $child_item) {
// 查找所有套数中是否已经有相同奖品的同一个子奖品
$existing_children = [];
for ($j = 1; $j < $i; $j++) {
// 找到对应套数的父奖品
$existing_parent = GoodsList::where([
'goods_id' => $info['id'],
'num' => $j,
'prize_code' => $new_box_parent['prize_code'],
'goods_list_id' => 0
])
->find();
if ($existing_parent) {
// 找到这个父奖品下与当前子奖品对应的子奖品
$similar_child = GoodsList::where([
'goods_id' => $info['id'],
'num' => $j,
'goods_list_id' => $existing_parent['id'],
'title' => $child_item['title'], // 使用标题匹配相似子奖品
'shang_id' => $child_item['shang_id'] // 确保奖品类型相同
])
->find();
if ($similar_child) {
$existing_children[] = $similar_child;
}
}
}
$child_data = $child_item;
unset($child_data['id']);
$child_data['num'] = $i; // 设置新的套数
$child_data['goods_list_id'] = $new_box_parent['id']; // 关联到新的父奖品
$child_data['surplus_stock'] = $child_data['stock']; // 重置库存
// 如果存在其他套数的相同子奖品使用相同的prize_code
if (!empty($existing_children)) {
$child_data['prize_code'] = $existing_children[0]['prize_code'];
} else {
// 否则生成新的prize_code
$child_data['prize_code'] = getPrizeCode() . '_' . time() . '_' . mt_rand(1000, 9999);
}
$child_save_data[] = $child_data;
}
// 批量插入子奖品
if (!empty($child_save_data)) {
$res[] = GoodsList::insertAll($child_save_data);
}
}
}
}
}
}
}
$res[] = $info->allowField([])->update($data);
#添加日志
$info['update_time'] = date('Y-m-d H:i:i:s', $info['update_time']);
$data['update_time'] = date('Y-m-d H:i:i:s', $data['update_time']);
$res[] = AdminGoodsLog::add_goods_log(session('admin_id'), $info['id'], 0, json_encode($info), json_encode($data));
if (resCheck($res)) {
Db::commit();
return $this->renderSuccess("编辑成功");
} else {
Db::rollback();
return $this->renderError("网络繁忙,请稍后");
}
}
}
/**
* 上、下架,删除盒子
*/
public function goods_del(Request $request)
{
$id = $request->post('id/d');
$status = $request->post('type/d');
$data = GoodsModel::where(['id' => $id])->field('id')->find();
if (!$data) {
return $this->renderError("数据不存在");
}
if ($status == 1 || $status == 2) {
$result = GoodsModel::where(['id' => $id])->update(['status' => $status]);
} elseif ($status == 3) {
$result = GoodsModel::where(['id' => $id])->update(['delete_time' => time(), 'status' => 2]);
} else {
return $this->renderError("请求参数错误");
}
if ($result) {
return $this->renderSuccess("操作成功");
} else {
return $this->renderError("网络繁忙,请稍后");
}
}
/**
* 盒子奖品
*/
public function goodslist(Request $request)
{
$goods_id = $request->param('goods_id/d', 0);
$info = GoodsModel::where(['id' => $goods_id])->find();
if (!$info) {
return $this->renderError('请求参数错误');
}
$type = $info['type'];
View::assign('goods_id', $goods_id);
View::assign('type', $type);
return View::fetch("Goods/goodslist");
}
/**
* 获取奖品列表数据(前后端分离接口)
*/
public function getGoodsListData(Request $request)
{
$goods_id = $request->param('goods_id/d', 0);
$page = $request->param('page/d', 1);
$limit = $request->param('limit/d', 50);
$title = $request->param('title/s', '');
$lian_ji_type = $request->param('lian_ji_type/s', '');
$info = GoodsModel::where(['id' => $goods_id])->find();
if (!$info) {
return $this->renderError('请求参数错误');
}
$type = $info['type'];
$where = [];
$where[] = ['goods_id', '=', $goods_id];
if ($type == 1 || $type == 3 || $type == 5 || $type == 6 || $type == 10 || $type == 11) {
$where[] = ['num', '=', 1];
} elseif ($type == 2 || $type == 8 || $type == 9 || $type == 15 || $type == 16 || $type == 17) {
$where[] = ['num', '=', 0];
} else {
return $this->renderError('请求参数错误1');
}
if (!empty($title)) {
$where[] = ['title', 'like', "%{$title}%"];
}
if (!empty($lian_ji_type)) {
$where[] = ['lian_ji_type', '=', $lian_ji_type];
}
$where[] = ['goods_list_id', '=', 0];
$query = GoodsList::where($where)->order('sort desc, shang_id asc, id asc');
$count = $query->count();
$real_pro = GoodsList::where($where)->sum('real_pro');
$list = $query->page($page, $limit)->select()->toArray();
// $real_pro = 0;
// 处理数据
foreach ($list as &$item) {
$item['shang'] = Shang::where(['id' => $item['shang_id']])->value('title');
$item['imgurl'] = imageUrl($item['imgurl']);
if (!empty($item['imgurl_detail'])) {
$item['imgurl_detail'] = imageUrl($item['imgurl_detail']);
}
// $real_pro += $item['real_pro'];
if ($item['goods_type'] == 4) {
$goods_list = GoodsList::where('goods_id', $item['goods_id'])
->where('goods_list_id', '=', $item['id'])
->select()
->toArray();
if ($goods_list) {
$item['isParent'] = 'true';
$real_pro1 = 0;
foreach ($goods_list as &$goods_list_item) {
$goods_list_item['shang'] = Shang::where(['id' => $goods_list_item['shang_id']])->value('title');
$goods_list_item['imgurl'] = imageUrl($goods_list_item['imgurl']);
if (!empty($goods_list_item['imgurl_detail'])) {
$goods_list_item['imgurl_detail'] = imageUrl($goods_list_item['imgurl_detail']);
}
$real_pro1 += $goods_list_item['real_pro'];
}
if ($type == 2 || $type == 8 || $type == 9 || $type == 15 || $type == 16 || $type == 17) {
$goods_list[] = ['title' => '宝箱概率合计', 'real_pro' => $real_pro1, 'id' => -1];
}
$item['children'] = $goods_list;
}
}
}
return $this->renderTable('获取成功', $count, $list, ['code' => 0, 'real_pro' => $real_pro]);
}
/**
* 添加奖品
*/
public function goodslist_add(Request $request)
{
if (!$request->isPost()) {
$goods_id = $request->param('goods_id/d', 0);
$info = GoodsModel::where(['id' => $goods_id])->find();
$goods_list_id = $request->param('goods_list_id/d', 0);
if (!$info) {
return $this->renderError('请求参数错误');
}
if ($info['type'] == 1 || $info['type'] == 5 || $info['type'] == 10 || $info['type'] == 11 || $info['type'] == 6) {
$shang = Shang::where('id', '<=', 33)->where('id', '<>', 5)->select()->toArray();
if ($goods_list_id) {
$shang = Shang::where('id', '<=', 33)->where('id', '>', 5)->select()->toArray();
}
} elseif ($info['type'] == 2 || $info['type'] == 8 || $info['type'] == 9 || $info['type'] == 16 || $info['type'] == 17) {
$shang = Shang::where('id', 'between', [34, 38])->select()->toArray();
} elseif ($info['type'] == 3) {
$shang = Shang::where('id', 'between', [4, 33])->select()->toArray();
} elseif ($info['type'] == 15) {
$shang = Shang::where('id', '>=', 114)->select()->toArray();
} else {
return $this->renderError('请求参数错误1');
}
View::assign('shang', $shang);
View::assign('goods_id', $goods_id);
View::assign('goods_list_id', $goods_list_id);
View::assign('type', $info['type']);
return View::fetch('Goods/goodslist_add');
} else {
$data = input('post.');
if (empty($data['goods_id'])) {
return $this->renderError('请求参数错误1');
}
$info = GoodsModel::where(['id' => $data['goods_id']])->find();
if (!$info) {
return $this->renderError('请求参数错误2');
}
$type = $info['type'];
if (empty($data['title'])) {
return $this->renderError('请输入奖品名称');
}
if (empty($data['shang_id'])) {
return $this->renderError('请选择奖品类型');
}
if (RegMoney($data['price'])) {
return $this->renderError('奖品售价设置错误,最多保留两位小数');
}
if (RegMoney($data['money'])) {
return $this->renderError('兑换价格设置错误,最多保留两位小数');
}
if (RegMoney($data['sc_money'])) {
return $this->renderError('参考价格设置错误,最多保留两位小数');
}
if ($data['goods_type'] == 1) {
$data['sale_time'] = 0;
} else if (in_array($data['goods_type'], [2, 8, 9, 16])) {
if (empty($data['sale_time'])) {
return $this->renderError('请选择预售时间');
}
$today_time = strtotime(date('Y-m-d', time()));
$data['sale_time'] = strtotime($data['sale_time']);
if ($today_time >= $data['sale_time']) {
return $this->renderError('预售时间请在今天之后');
}
} elseif ($type == 15) {
$data['sale_time'] = 0;
} elseif ($data['goods_type'] == 3 || $data['goods_type'] == 4) {
$data['sale_time'] = 0;
} else {
return $this->err('奖品类型选择错误');
}
$data['reward_num'] = 0;
if (RegZero($data['sort'])) {
return $this->renderError('排序请输入整数');
}
$data['card_no'] = NULL;
if (empty($data['imgurl'])) {
return $this->renderError('请上传图片');
}
$data['addtime'] = time();
if ($type == 1 || $type == 5 || $type == 10 || $type == 6 || $type == 11) {
if ($data['shang_id'] == 1 || $data['shang_id'] == 2 || $data['shang_id'] == 3 || $data['shang_id'] == 5) {
if ($data['stock'] != 1) {
return $this->renderError('特殊奖品库存请设置为1');
}
}
if (RegInt($data['stock'])) {
return $this->renderError('奖品数量设置错误,请设置大于0的整数');
}
$data['surplus_stock'] = $data['stock'];
#盒子套数
$stock = $info['stock'];
#循环数据
$save_sports_data = [];
$prize_code = getPrizeCode() . '_' . time(); // 生成唯一的prize_code
// 处理子奖品添加的情况
$goods_list_id = $request->param('goods_list_id/d', 0); // 获取父奖品ID如果是子奖品
$is_box_type = ($data['goods_type'] == 4); // 是否为宝箱类型
if ($goods_list_id > 0) {
// 获取父奖品信息,确保父奖品存在
$parent_prize = GoodsList::where('id', $goods_list_id)->find();
if (!$parent_prize) {
return $this->renderError('宝箱父奖品不存在');
}
// 子奖品应该生成自己的prize_code
$data['prize_code'] = getPrizeCode() . '_' . time() . '_' . mt_rand(1000, 9999);
$data['goods_list_id'] = $goods_list_id;
$data['num'] = $parent_prize['num'];
// 如果父奖品存在于多个套数中,需要为每个套数创建对应的子奖品
$same_prize_parents = GoodsList::where([
'goods_id' => $data['goods_id'],
'prize_code' => $parent_prize['prize_code'],
'goods_list_id' => 0 // 确保只查询父奖品
])
->select()
->toArray();
if (count($same_prize_parents) > 1) {
// 有多个套数的相同父奖品
$multi_data = [];
foreach ($same_prize_parents as $same_parent) {
if ($same_parent['id'] == $goods_list_id) {
// 跳过当前指定的父奖品,因为下面要单独处理
continue;
}
$child_data = $data;
$child_data['goods_list_id'] = $same_parent['id'];
$child_data['num'] = $same_parent['num'];
$multi_data[] = $child_data;
}
// 先插入指定父奖品的子奖品
$res = GoodsList::insert($data);
// 再插入其他套数的子奖品
if (!empty($multi_data)) {
GoodsList::insertAll($multi_data);
}
} else {
// 只有一个套数,直接保存
$res = GoodsList::insert($data);
}
} else {
// 添加正常奖品或宝箱父奖品,为所有套数都添加
$data['prize_code'] = $prize_code; // 使用新生成的prize_code
for ($i = 1; $i <= $stock; $i++) {
$data['num'] = $i;
$save_sports_data[] = $data;
}
// 批量插入奖品
$res = GoodsList::insertAll($save_sports_data);
// 如果是宝箱类型则需要记录下插入后的ID以供后续可能添加的子奖品使用
if ($is_box_type && $res) {
// 获取已插入的宝箱奖品ID
$inserted_boxes = GoodsList::where('prize_code', $prize_code)
->where('goods_id', $data['goods_id'])
->where('goods_type', 4)
->select()->toArray();
// 通知前端已成功添加宝箱类型,提示可继续添加子奖品
if (!empty($inserted_boxes)) {
return $this->renderSuccess('添加成功,您可以继续为此宝箱添加子奖品', [
'box_ids' => array_column($inserted_boxes, 'id')
]);
}
}
}
return $this->renderSuccess('添加成功');
} elseif (in_array($type, [2, 8, 9, 16])) {
if (RegMoney($data['real_pro'] * 10000)) {
return $this->renderError('真实概率设置错误,最多保留四位小数');
}
$prize_code = getPrizeCode() . '_' . time();
$data['prize_code'] = $prize_code;
} elseif ($type == 3) {
if ($data['shang_id'] == 1 || $data['shang_id'] == 2 || $data['shang_id'] == 3 || $data['shang_id'] == 5) {
if ($data['stock'] != 1) {
return $this->renderError('特殊奖品库存请设置为1');
}
}
if (RegInt($data['stock'])) {
return $this->renderError('奖品数量设置错误,请设置大于0的整数');
}
$data['surplus_stock'] = $data['stock'];
#盒子套数
$stock = $info['stock'];
#循环数据
$save_sports_data = [];
$prize_code = getPrizeCode() . '_' . time(); // 生成唯一的prize_code
// 处理子奖品添加的情况
$goods_list_id = $request->param('goods_list_id/d', 0); // 获取父奖品ID如果是子奖品
$is_box_type = ($data['goods_type'] == 4); // 是否为宝箱类型
if ($goods_list_id > 0) {
// 获取父奖品信息,确保父奖品存在
$parent_prize = GoodsList::where('id', $goods_list_id)->find();
if (!$parent_prize) {
return $this->renderError('宝箱父奖品不存在');
}
// 子奖品应该生成自己的prize_code
$data['prize_code'] = getPrizeCode() . '_' . time() . '_' . mt_rand(1000, 9999);
$data['goods_list_id'] = $goods_list_id;
$data['num'] = $parent_prize['num'];
// 如果父奖品存在于多个套数中,需要为每个套数创建对应的子奖品
$same_prize_parents = GoodsList::where([
'goods_id' => $data['goods_id'],
'prize_code' => $parent_prize['prize_code'],
'goods_list_id' => 0 // 确保只查询父奖品
])
->select()
->toArray();
if (count($same_prize_parents) > 1) {
// 有多个套数的相同父奖品
$multi_data = [];
foreach ($same_prize_parents as $same_parent) {
if ($same_parent['id'] == $goods_list_id) {
// 跳过当前指定的父奖品,因为下面要单独处理
continue;
}
$child_data = $data;
$child_data['goods_list_id'] = $same_parent['id'];
$child_data['num'] = $same_parent['num'];
$multi_data[] = $child_data;
}
// 先插入指定父奖品的子奖品
$res = GoodsList::insert($data);
// 再插入其他套数的子奖品
if (!empty($multi_data)) {
GoodsList::insertAll($multi_data);
}
} else {
// 只有一个套数,直接保存
$res = GoodsList::insert($data);
}
} else {
// 添加正常奖品或宝箱父奖品,为所有套数都添加
$data['prize_code'] = $prize_code; // 使用新生成的prize_code
for ($i = 1; $i <= $stock; $i++) {
$data['num'] = $i;
$save_sports_data[] = $data;
}
// 批量插入奖品
$res = GoodsList::insertAll($save_sports_data);
// 如果是宝箱类型则需要记录下插入后的ID以供后续可能添加的子奖品使用
if ($is_box_type && $res) {
// 获取已插入的宝箱奖品ID
$inserted_boxes = GoodsList::where('prize_code', $prize_code)
->where('goods_id', $data['goods_id'])
->where('goods_type', 4)
->select()->toArray();
// 通知前端已成功添加宝箱类型,提示可继续添加子奖品
if (!empty($inserted_boxes)) {
return $this->renderSuccess('添加成功,您可以继续为此宝箱添加子奖品', [
'box_ids' => array_column($inserted_boxes, 'id')
]);
}
}
}
if (RegInt($data['prize_num']) && $data['shang_id'] == 5) {
return $this->renderError("擂台赏抽全局赏数量设置错误,请设置大于0的整数");
}
} elseif ($type == 15) {
$prize_code = getPrizeCode() . '_' . time();
$data['prize_code'] = $prize_code;
$data['surplus_stock'] = $data['stock'];
if (RegInt($data['stock'])) {
return $this->renderError('奖品数量设置错误,请设置大于0的整数');
}
} elseif ($type == 17) {
$prize_code = getPrizeCode() . '_' . time();
$data['prize_code'] = $prize_code;
$data['surplus_stock'] = $data['stock'];
} else {
return $this->err('请求参数错误');
}
if (isset($save_sports_data)) {
$res = GoodsList::insertAll($save_sports_data);
} else {
$res = GoodsList::insert($data);
}
if ($res) {
return $this->renderSuccess('添加成功');
} else {
return $this->renderError('添加失败');
}
}
}
/**
* 编辑奖品
*/
public function goodslist_edit(Request $request)
{
if (!$request->isPost()) {
$id = $request->param('id/d', 0);
$goods = GoodsList::where(['id' => $id])->find();
$goods_list_id = $request->param('goods_list_id/d', 0);
if (!$goods) {
return $this->renderError('请求参数错误');
}
if ($goods['goods_type'] == 2) {
$goods['sale_time'] = date('Y-m-d', $goods['sale_time']);
} else {
$goods['sale_time'] = '';
}
$goods_id = $goods['goods_id'];
$info = GoodsModel::where(['id' => $goods_id])->find();
if (!$info) {
return $this->renderError('请求参数错误1');
}
if ($info['type'] == 1 || $info['type'] == 5 || $info['type'] == 6 || $info['type'] == 10 | $info['type'] == 11) {
$shang = Shang::where('id', '<=', 33)->where('id', '<>', 5)->select()->toArray();
if ($goods_list_id) {
$shang = Shang::where('id', '<=', 33)->where('id', '>', 5)->select()->toArray();
}
} elseif ($info['type'] == 2 || $info['type'] == 8 || $info['type'] == 9 || $info['type'] == 16 || $info['type'] == 17) {
$shang = Shang::where('id', 'between', [34, 38])->select()->toArray();
} elseif ($info['type'] == 15) {
$shang = Shang::where('id', '>=', 114)->select()->toArray();
} elseif ($info['type'] == 3) {
$shang = Shang::where('id', 'between', [4, 33])->select()->toArray();
} else {
return $this->renderError('请求参数错误1');
}
View::assign('goods', $goods);
View::assign('shang', $shang);
View::assign('type', $info['type']);
View::assign('goods_list_id', $goods_list_id);
return View::fetch('Goods/goodslist_edit');
} else {
$data = input('post.');
if (empty($data['id'])) {
return $this->renderError('请求参数错误1');
}
$goods = GoodsList::where(['id' => $data['id']])->find();
if (!$goods) {
return $this->renderError('请求参数错误2');
}
$info = GoodsModel::where(['id' => $goods['goods_id']])->find();
if (!$info) {
return $this->renderError('请求参数错误3');
}
$type = $info['type'];
if (empty($data['title'])) {
return $this->renderError('请输入奖品名称');
}
if (empty($data['shang_id'])) {
return $this->renderError('请选择奖品类型');
}
if (RegMoney($data['price'])) {
return $this->renderError('奖品售价设置错误,最多保留两位小数');
}
if (RegMoney($data['money'])) {
return $this->renderError('兑换价格设置错误,最多保留两位小数');
}
if (RegMoney($data['sc_money'])) {
return $this->renderError('参考价格设置错误,最多保留两位小数');
}
if ($data['goods_type'] == 1) {
$data['sale_time'] = 0;
} else if ($data['goods_type'] == 2) {
if (empty($data['sale_time'])) {
return $this->renderError('请选择预售时间');
}
$today_time = strtotime(date('Y - m - d', time()));
$data['sale_time'] = strtotime($data['sale_time']);
if ($today_time >= $data['sale_time']) {
return $this->renderError('预售时间请在今天之后');
}
} elseif ($data['goods_type'] == 3 || $data['goods_type'] == 4) {
$data['sale_time'] = 0;
} else {
return $this->err('奖品类型选择错误');
}
//2023-11-17无作用
$data['reward_num'] = 0;
//
if ($type == 1 || $type == 5 || $type == 10 || $type == 6 || $type == 11 || $type == 15) {
} elseif ($type == 2 || $type == 8 || $type == 9 || $type == 16 || $type == 17) {
if (RegMoney($data['real_pro'] * 10000)) {
return $this->renderError('真实概率设置错误,最多保留四位小数');
}
} else if ($type == 3) {
if (RegInt($data['prize_num']) && $data['shang_id'] == 5) {
return $this->renderError("擂台赏抽全局赏数量设置错误,请设置大于0的整数");
}
} elseif ($type == 15) {
$data['surplus_stock'] = $data['stock'];
} else {
return $this->err('请求参数错误');
}
if (RegZero($data['sort'])) {
return $this->renderError('排序请输入整数');
}
$data['card_no'] = NULL;
if (empty($data['imgurl'])) {
return $this->renderError('请上传图片');
}
$data['update_time'] = time();
unset($data['id']);
$res1 = GoodsList::where(['prize_code' => $goods['prize_code']])->update($data);
if ($res1) {
#添加日志
$goods['update_time'] = date('Y-m-d H:i:i:s', $goods['update_time']);
$data['update_time'] = date('Y-m-d H:i:i:s', $data['update_time']);
$res2 = AdminGoodsLog::add_goods_log(session('admin_id'), $info['id'], $goods['id'], json_encode($goods), json_encode($data));
return $this->renderSuccess('编辑成功');
} else {
return $this->renderError('编辑失败');
}
}
}
/**
* 奖品删除
*/
public function goodslist_del(Request $request)
{
$id = \request()->param('id/d', 0);
$prize_code = GoodsList::field('prize_code')
->where(['id' => $id])
->value('prize_code');
// if (!$prize_code) {
// return $this->renderError("请勿重复操作");
// }
#删除奖品
$res = GoodsList::field('id')
->where(['prize_code' => $prize_code])
->delete();
if ($res) {
return $this->renderSuccess("操作成功");
} else {
return $this->renderError("操作失败");
}
}
/**
* 消费赠送
*/
public function give()
{
$title = trim(input('get.title'));
$whe = array();
$whe[] = ['goods_id', '=', 0];
if (!empty($title)) {
$whe[] = ['title', 'like', '%' . $title . '%'];
}
$field = "*";
$order = "give_money asc,id asc";
$data = GoodsList::getList($whe, $field, $order, $this->page);
foreach ($data['list'] as &$value) {
$value['shang'] = Shang::where(['id' => $value['shang_id']])->value('title');
}
$range_time = getConfig('give_time')['range_time'];
View::assign('range_time', $range_time);
View::assign('list', $data['list']);
View::assign('count', $data['count']);
View::assign('page', $data['page']);
return View::fetch("Goods/give");
}
/**
* 消费赠送添加
*/
public function give_add(Request $request)
{
if (!$request->isPost()) {
$shang = Shang::where('id', 'between', [10, 33])->select()->toArray();
View::assign('shang', $shang);
return View::fetch('Goods/give_add');
} else {
$data = input('post.');
if (empty($data['title'])) {
return $this->renderError('请输入奖品名称');
}
if (empty($data['shang_id'])) {
return $this->renderError('请选择奖品类型');
}
if (RegMoney($data['price'])) {
return $this->renderError('奖品售价设置错误,最多保留两位小数');
}
if (RegMoney($data['money'])) {
return $this->renderError('兑换价格设置错误,最多保留两位小数');
}
if (RegInt($data['give_money'])) {
return $this->renderError('消费阀值设置错误,请设置大于0的整数');
}
if (empty($data['imgurl'])) {
return $this->renderError('请上传图片');
}
$prize_code = getPrizeCode() . '_' . time();
$data['prize_code'] = $prize_code;
$data['goods_id'] = 0;
$data['addtime'] = time();
$dd = (new GoodsList())->insert($data);
if ($dd) {
return $this->renderSuccess('添加成功');
} else {
return $this->renderError('添加失败');
}
}
}
/**
* 消费赠送编辑
*/
public function give_edit(Request $request)
{
if (!$request->isPost()) {
$id = request()->param('id/d', 0);
$info = GoodsList::where(['id' => $id])->find();
if (!$info) {
return $this->renderError('请求参数错误');
}
$shang = Shang::where('id', 'between', [10, 33])->select()->toArray();
View::assign('shang', $shang);
View::assign('info', $info);
return View::fetch('Goods/give_edit');
} else {
$data = input('post.');
if (empty($data['id'])) {
return $this->renderError('请求参数错误');
}
$info = GoodsList::where(['id' => $data['id']])->find();
if (!$info) {
return $this->renderError('请求参数错误1');
}
if (empty($data['title'])) {
return $this->renderError('请输入奖品名称');
}
if (empty($data['shang_id'])) {
return $this->renderError('请选择奖品类型');
}
if (RegMoney($data['price'])) {
return $this->renderError('奖品售价设置错误,最多保留两位小数');
}
if (RegMoney($data['money'])) {
return $this->renderError('兑换价格设置错误,最多保留两位小数');
}
if (RegInt($data['give_money'])) {
return $this->renderError('消费阀值设置错误,请设置大于0的整数');
}
if (empty($data['imgurl'])) {
return $this->renderError('请上传图片');
}
$data['update_time'] = time();
unset($data['id']);
$dd = $info->allowField([])->save($data);
if ($dd) {
return $this->renderSuccess('编辑成功');
} else {
return $this->renderError('编辑失败');
}
}
}
/**
* 消费赠送删除
*/
public function give_del(Request $request)
{
$id = \request()->param('id/d', 0);
$info = GoodsList::field('prize_code')
->where(['id' => $id])
->find();
if (!$info) {
return $this->renderError("请勿重复操作");
}
#删除奖品
$res = GoodsList::field('id')
->where(['id' => $id])
->delete();
if ($res) {
return $this->renderSuccess("操作成功");
} else {
return $this->renderError("操作失败");
}
}
#无限令规则
public function give_time()
{
$data = request()->param();
$data['time'] = time();
$result = setConfig('give_time', $data);
if ($result) {
return $this->renderSuccess('修改成功');
} else {
return $this->renderError('修改失败');
}
}
/**
* 预售日历
*/
public function yushou_rili()
{
$title = trim(input('get.title'));
$whe = array();
if ($title) {
$whe[] = ['title', 'like', '%' . $title . '%'];
}
$field = "*";
$order = "sort desc,id desc";
$data = Yushou::getList($whe, $field, $order, $this->page);
foreach ($data['list'] as &$value) {
$value['goods_title'] = GoodsModel::where(['id' => $value['goods_id']])->value('title');
$value['sale_time'] = date('Y-m-d', $value['sale_time']);
}
View::assign('list', $data['list']);
View::assign('count', $data['count']);
View::assign('page', $data['page']);
return View::fetch("Goods/yushou_rili");
}
/**
* 预售日历添加
*/
public function yushou_rili_add(Request $request)
{
if (!$request->isPost()) {
$goods = GoodsModel::where('type', '=', 1)->select()->toArray();
View::assign('goods', $goods);
return View::fetch('Goods/yushou_rili_add');
} else {
$data = input('post.');
if (empty($data['title'])) {
return $this->renderError('请输入标题');
}
if ($data['goods_id']) {
$goods = GoodsModel::where('type', '=', 1)->where('id', '=', $data['goods_id']);
if (!$goods) {
return $this->renderError('盒子选择错误');
}
} else {
$data['goods_id'] = 0;
}
if (empty($data['sale_time'])) {
return $this->renderError('请选择预售时间');
}
$data['sale_time'] = strtotime($data['sale_time']);
$today_time = strtotime(date('Y-m-d', time()));
if ($data['sale_time'] < $today_time) {
return $this->renderError('预售时间选择错误');
}
if (RegZero($data['sort'])) {
return $this->renderError('排序设置错误,请输入整数');
}
if (empty($data['imgurl'])) {
return $this->renderError('请上传图片');
}
$data['addtime'] = time();
$dd = (new Yushou())->insert($data);
if ($dd) {
return $this->renderSuccess('添加成功');
} else {
return $this->renderError('添加失败');
}
}
}
/**
* 预售日历编辑
*/
public function yushou_rili_edit(Request $request)
{
if (!$request->isPost()) {
$id = request()->param('id/d', 0);
$info = Yushou::where(['id' => $id])->find();
if (!$info) {
return $this->renderError('请求参数错误');
}
$info['sale_time'] = date('Y-m-d', $info['sale_time']);
$goods = GoodsModel::where('type', '=', 1)->select()->toArray();
View::assign('goods', $goods);
View::assign('info', $info);
return View::fetch('Goods/yushou_rili_edit');
} else {
$data = input('post.');
if (empty($data['id'])) {
return $this->renderError('请求参数错误');
}
$info = Yushou::where(['id' => $data['id']])->find();
if (!$info) {
return $this->renderError('请求参数错误1');
}
if (empty($data['title'])) {
return $this->renderError('请输入标题');
}
if ($data['goods_id']) {
$goods = GoodsModel::where('type', '=', 1)->where('id', '=', $data['goods_id']);
if (!$goods) {
return $this->renderError('盒子选择错误');
}
} else {
$data['goods_id'] = 0;
}
if (empty($data['sale_time'])) {
return $this->renderError('请选择预售时间');
}
$data['sale_time'] = strtotime($data['sale_time']);
$today_time = strtotime(date('Y-m-d', time()));
if ($data['sale_time'] < $today_time) {
return $this->renderError('预售时间选择错误');
}
if (RegZero($data['sort'])) {
return $this->renderError('排序设置错误,请输入整数');
}
if (empty($data['imgurl'])) {
return $this->renderError('请上传图片');
}
$data['update_time'] = time();
unset($data['id']);
$dd = $info->allowField([])->save($data);
if ($dd) {
return $this->renderSuccess('编辑成功');
} else {
return $this->renderError('编辑失败');
}
}
}
/**
* 预售日历删除
*/
public function yushou_rili_del(Request $request)
{
$id = \request()->param('id/d', 0);
$info = Yushou::field('id')->where(['id' => $id])->find();
if (!$info) {
return $this->renderError("请勿重复操作");
}
#删除奖品
$res = Yushou::field('id')->where(['id' => $id])->delete();
if ($res) {
return $this->renderSuccess("操作成功");
} else {
return $this->renderError("操作失败");
}
}
/**
* 获取同步地址列表
*/
public function get_sync_addresses()
{
$config = getConfig('systemconfig');
$syncAddresses = isset($config['sync_address']) && is_array($config['sync_address'])
? $config['sync_address']
: [];
return $this->renderSuccess('获取成功', $syncAddresses);
}
/**
* 盒子自动下架日志
*/
public function offshelf_log(Request $request)
{
$goods_id = trim(input('get.goods_id'));
$start_time = trim(input('get.start_time'));
$end_time = trim(input('get.end_time'));
$whe = [];
if ($goods_id) {
$whe[] = ['goods_id', '=', $goods_id];
}
if ($start_time && $end_time) {
$start = strtotime($start_time);
$end = strtotime($end_time . ' 23:59:59');
$whe[] = ['create_time', 'between', [$start, $end]];
} elseif ($start_time) {
$start = strtotime($start_time);
$whe[] = ['create_time', '>=', $start];
} elseif ($end_time) {
$end = strtotime($end_time . ' 23:59:59');
$whe[] = ['create_time', '<=', $end];
}
// 获取日志数据
$list = Db::name('goods_offshelf_log')
->where($whe)
->order('id desc')
->paginate([
'list_rows' => $this->page,
'query' => request()->param(),
]);
// 获取所有相关的盒子信息
$goodsIds = array_column($list->items(), 'goods_id');
$goodsInfo = [];
if (!empty($goodsIds)) {
$goods = Db::name('goods')
->field('id, title, status')
->whereIn('id', $goodsIds)
->select()
->toArray();
foreach ($goods as $item) {
$goodsInfo[$item['id']] = [
'title' => $item['title'],
'status' => $item['status']
];
}
}
// 转换时间戳并处理数据
$listItems = $list->items();
foreach ($listItems as &$item) {
$item['create_time_text'] = date('Y-m-d H:i:s', $item['create_time']);
$item['goods_title'] = isset($goodsInfo[$item['goods_id']]) ? $goodsInfo[$item['goods_id']]['title'] : '未知盒子';
$item['goods_status'] = isset($goodsInfo[$item['goods_id']]) ? $goodsInfo[$item['goods_id']]['status'] : 2; // 默认下架状态
}
View::assign('list', $listItems);
View::assign('page', $list->render());
View::assign('count', $list->total());
return View::fetch('Goods/offshelf/log');
}
/**
* 同步盒子数据
*/
public function sync_goods(Request $request)
{
if (!$request->isPost()) {
return $this->renderError('请求方式错误');
}
$id = $request->post('id/d');
$url = $request->post('url/s');
// 验证URL格式
if (!filter_var($url, FILTER_VALIDATE_URL)) {
return $this->renderError('URL格式不正确');
}
// 确保URL以/结尾
if (substr($url, -1) !== '/') {
$url .= '/';
}
$url .= 'api/goods/receive_sync';
// 获取盒子数据
$goods = GoodsModel::where(['id' => $id])->find();
if (!$goods) {
return $this->renderError('盒子不存在');
}
// 生成或获取同步代码
$async_code = $goods['async_code'];
if (empty($async_code)) {
$async_code = 'MHHZ' . date('YmdHis') . mt_rand(1000, 9999);
$goods->save(['async_code' => $async_code]);
}
// 获取盒子奖品数据
$goodsLists = GoodsList::where(['goods_id' => $id])->select()->toArray();
// 获取盒子扩展配置
$goodsExtend = GoodsExtend::where(['goods_id' => $id])->find();
// 收集所有奖励ID
$rewardIds = [];
foreach ($goodsLists as $item) {
if (!empty($item['reward_id'])) {
$rewardIds[] = $item['reward_id'];
}
}
// 获取奖励数据
$rewards = [];
if (!empty($rewardIds)) {
$rewards = Db::name('reward')->whereIn('reward_id', $rewardIds)->select()->toArray();
}
// 准备发送的数据
$postData = [
'goods' => $goods->toArray(),
'goodsList' => $goodsLists,
'async_code' => $async_code,
'rewards' => $rewards
];
if ($goodsExtend) {
$postData['goodsExtend'] = $goodsExtend->toArray();
}
// 发送同步请求
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen(json_encode($postData))
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
return $this->renderError('同步失败,服务器返回状态码: ' . $status);
}
$responseData = json_decode($response, true);
if (!$responseData || $responseData['code'] !== 1) {
$errorMsg = isset($responseData['msg']) ? $responseData['msg'] : '服务器未返回预期响应';
return $this->renderError('同步失败: ' . $errorMsg);
}
// 更新同步状态
$goods->save([
'sync_status' => 1,
'sync_url' => $url,
'sync_time' => date('Y-m-d H:i:s')
]);
return $this->renderSuccess('同步成功');
} catch (\Exception $e) {
return $this->renderError('同步失败: ' . $e->getMessage());
}
}
/**
* 清空盒子抽奖数据
*/
public function clear_goods_data(Request $request)
{
if (!$request->isPost()) {
return $this->renderError('请求方式错误');
}
$id = $request->post('id/d');
$goods = GoodsModel::where(['id' => $id])->find();
if (!$goods) {
return $this->renderError('盒子不存在');
}
// 开启事务
Db::startTrans();
try {
// 删除相关订单数据
Db::name('order')->where('goods_id', $id)->delete();
Db::name('order_list')->where('goods_id', $id)->delete();
// 重置奖品剩余数量
Db::name('goods_list')->where('goods_id', $id)->update(['surplus_stock' => Db::raw('stock')]);
Db::commit();
return $this->renderSuccess('盒子抽奖数据已清空');
} catch (\Exception $e) {
Db::rollback();
return $this->renderError('操作失败:' . $e->getMessage());
}
}
/**
* 复制盒子
*/
public function copy_goods(Request $request)
{
if (!$request->isPost()) {
return $this->renderError('请求方式错误');
}
$id = $request->post('id/d');
$goods = GoodsModel::where(['id' => $id])->find();
if (!$goods) {
return $this->renderError('盒子不存在');
}
// 开启事务
Db::startTrans();
try {
// 复制盒子基本信息
$goodsData = $goods->toArray();
unset($goodsData['id']);
unset($goodsData['delete_time']);
// 修改标题,添加"复制"标识
$goodsData['title'] = $goodsData['title'] . '(复制)';
$goodsData['status'] = 2; // 默认下架状态
$goodsData['addtime'] = time();
$goodsData['async_code'] = ''; // 清空同步代码,避免混淆
$goodsData['is_open'] = 0;
$goodsData['king_user_id'] = 0;
// 插入新盒子
$newGoods = new GoodsModel();
$newGoods->save($goodsData);
$newGoodsId = $newGoods->id;
// 复制盒子扩展配置
$goodsExtend = GoodsExtend::where('goods_id', $id)->find();
if ($goodsExtend) {
$extendData = $goodsExtend->toArray();
unset($extendData['id']);
$extendData['goods_id'] = $newGoodsId;
$newExtend = new GoodsExtend();
$newExtend->save($extendData);
}
// 创建父奖品prize_code映射表
$parentPrizeCodeMapping = [];
// 创建子奖品prize_code映射表
$childPrizeCodeMapping = [];
// 首先获取所有的父奖品并按prize_code分组
$parentPrizes = GoodsList::where(['goods_id' => $id, 'goods_list_id' => 0])
->select()
->toArray();
$prizeCodeGroups = [];
foreach ($parentPrizes as $prize) {
if (!isset($prizeCodeGroups[$prize['prize_code']])) {
$prizeCodeGroups[$prize['prize_code']] = [];
}
$prizeCodeGroups[$prize['prize_code']][] = $prize;
}
// 为每个父prize_code组创建新的prize_code
foreach ($prizeCodeGroups as $oldPrizeCode => $prizes) {
$newPrizeCode = 'MHHZ' . date('YmdHis') . mt_rand(1000, 9999);
$parentPrizeCodeMapping[$oldPrizeCode] = $newPrizeCode;
// 复制每个prize_code组的奖品
foreach ($prizes as $prize) {
$newPrizeData = $prize;
unset($newPrizeData['id']);
$newPrizeData['goods_id'] = $newGoodsId;
$newPrizeData['prize_code'] = $newPrizeCode;
$newPrizeData['addtime'] = time();
$newPrizeData['surplus_stock'] = $newPrizeData['stock'];
// 处理奖励ID
if ($newPrizeData['reward_id'] && $newPrizeData['reward_id'] != '') {
$reward = Reward::where(['reward_id' => $newPrizeData['reward_id']])->select();
$newPrizeData['reward_id'] = 'MHHZ' . date('YmdHis') . mt_rand(1000, 9999);
if ($reward) {
$rewards = $reward->toArray();
foreach ($rewards as $item2) {
unset($item2['id']);
$item2['reward_id'] = $newPrizeData['reward_id'];
$item2['create_time'] = time();
$item2['update_time'] = time();
Reward::insert($item2);
}
}
}
// 插入新奖品
$newGoodsList = new GoodsList();
$newGoodsList->save($newPrizeData);
}
}
// 获取所有子奖品
$childPrizes = GoodsList::where(['goods_id' => $id])
->where('goods_list_id', '>', 0)
->select()
->toArray();
// 对子奖品按prize_code分组
$childGroups = [];
foreach ($childPrizes as $child) {
$childPrizeCode = $child['prize_code'];
if (!isset($childGroups[$childPrizeCode])) {
$childGroups[$childPrizeCode] = [];
}
$childGroups[$childPrizeCode][] = $child;
}
// 为每组子奖品创建新的prize_code映射
foreach ($childGroups as $oldChildCode => $group) {
$newChildCode = 'MHHZ' . date('YmdHis') . mt_rand(1000, 9999);
$childPrizeCodeMapping[$oldChildCode] = $newChildCode;
}
// 处理每个子奖品
foreach ($childPrizes as $childPrize) {
// 查找子奖品对应的父奖品
$parentPrize = GoodsList::where('id', $childPrize['goods_list_id'])->find();
if (!$parentPrize) {
continue; // 如果找不到父奖品,跳过
}
// 获取父奖品的prize_code
$parentPrizeCode = $parentPrize['prize_code'];
// 如果父奖品的prize_code有映射则复制子奖品
if (isset($parentPrizeCodeMapping[$parentPrizeCode])) {
// 找到新盒子中对应的父奖品
$newParent = GoodsList::where([
'goods_id' => $newGoodsId,
'prize_code' => $parentPrizeCodeMapping[$parentPrizeCode],
'num' => $parentPrize['num'] // 确保套数也匹配
])->find();
if ($newParent) {
// 复制子奖品数据
$newChildData = $childPrize;
unset($newChildData['id']);
$newChildData['goods_id'] = $newGoodsId;
$newChildData['goods_list_id'] = $newParent['id']; // 关联到新的父奖品
// 使用子奖品的prize_code映射确保相同的子奖品有相同的prize_code
if (isset($childPrizeCodeMapping[$childPrize['prize_code']])) {
$newChildData['prize_code'] = $childPrizeCodeMapping[$childPrize['prize_code']];
} else {
// 如果没有映射,创建一个新的
$newChildCode = 'MHHZ' . date('YmdHis') . mt_rand(1000, 9999);
$childPrizeCodeMapping[$childPrize['prize_code']] = $newChildCode;
$newChildData['prize_code'] = $newChildCode;
}
$newChildData['addtime'] = time();
$newChildData['surplus_stock'] = $newChildData['stock'];
// 处理奖励ID
if ($newChildData['reward_id'] && $newChildData['reward_id'] != '') {
$reward = Reward::where(['reward_id' => $newChildData['reward_id']])->select();
$newChildData['reward_id'] = 'MHHZ' . date('YmdHis') . mt_rand(1000, 9999);
if ($reward) {
$rewards = $reward->toArray();
foreach ($rewards as $item2) {
unset($item2['id']);
$item2['reward_id'] = $newChildData['reward_id'];
$item2['create_time'] = time();
$item2['update_time'] = time();
Reward::insert($item2);
}
}
}
// 插入新的子奖品
$newChildList = new GoodsList();
$newChildList->save($newChildData);
}
}
}
Db::commit();
return $this->renderSuccess('盒子复制成功');
} catch (\Exception $e) {
Db::rollback();
return $this->renderError('复制失败:' . $e->getMessage());
}
}
/**
* 生成UUID
*/
private function generateUUID()
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff)
);
}
/**
* 发送同步数据到目标
*/
private function sendSyncData($target, $data)
{
try {
# 准备请求数据
$jsonData = json_encode($data);
# 初始化CURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target . "/api/goods/receive_sync");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
]);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); # 30秒超时
# 执行请求
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
return ['success' => false, 'message' => "CURL错误: $error"];
}
if ($httpCode != 200) {
return ['success' => false, 'message' => "HTTP错误码: $httpCode"];
}
$result = json_decode($response, true);
if (!$result || !isset($result['status'])) {
return ['success' => false, 'message' => "无效的响应: $response"];
}
if ($result['status'] != 1) {
return ['success' => false, 'message' => $result['msg'] ?? '同步失败'];
}
return ['success' => true];
} catch (\Exception $e) {
return ['success' => false, 'message' => "异常: " . $e->getMessage()];
}
}
/**
* 盒子扩展设置
*/
public function goods_extend(Request $request)
{
$goods_id = $request->param('goods_id/d');
if (!$goods_id) {
return $this->renderError("参数错误");
}
// 获取盒子信息
$goods = GoodsModel::where('id', $goods_id)->find();
if (!$goods) {
return $this->renderError("盒子不存在");
}
if ($request->isPost()) {
$data = $request->post();
// 验证参数
$data['goods_id'] = $goods_id;
$data['pay_wechat'] = isset($data['pay_wechat']) ? 1 : 0;
$data['pay_balance'] = isset($data['pay_balance']) ? 1 : 0;
$data['pay_currency'] = isset($data['pay_currency']) ? 1 : 0;
$data['pay_currency2'] = isset($data['pay_currency2']) ? 1 : 0;
$data['pay_coupon'] = isset($data['pay_coupon']) ? 1 : 0;
$data['is_deduction'] = isset($data['is_deduction']) ? 1 : 0;
// 查询是否已存在
$exist = \app\common\model\GoodsExtend::getByGoodsId($goods_id);
Db::startTrans();
try {
if ($exist) {
// 更新
\app\common\model\GoodsExtend::where('goods_id', $goods_id)->update($data);
} else {
// 新增
\app\common\model\GoodsExtend::create($data);
}
Db::commit();
return json(['status' => 1, 'msg' => '保存成功']);
} catch (\Exception $e) {
Db::rollback();
return json(['status' => 0, 'msg' => '保存失败: ' . $e->getMessage()]);
}
}
// 获取扩展设置
$extend = \app\common\model\GoodsExtend::getByGoodsId($goods_id);
if (!$extend) {
// 从goods_type表获取默认值
$goodsType = Db::name('goods_type')
->field('pay_wechat, pay_balance, pay_currency, pay_currency2, pay_coupon, is_deduction')
->where('value', $goods['type'])
->find();
if ($goodsType) {
// 如果找到了盒子类型的默认配置
$extend = [
'goods_id' => $goods_id,
'pay_wechat' => $goodsType['pay_wechat'],
'pay_balance' => $goodsType['pay_balance'],
'pay_currency' => $goodsType['pay_currency'],
'pay_currency2' => $goodsType['pay_currency2'],
'pay_coupon' => $goodsType['pay_coupon'],
'is_deduction' => $goodsType['is_deduction']
];
} else {
// 如果没找到,使用默认值
$extend = [
'goods_id' => $goods_id,
'pay_wechat' => 1,
'pay_balance' => 1,
'pay_currency' => 1,
'pay_currency2' => 1,
'pay_coupon' => 1,
'is_deduction' => 1
];
}
}
View::assign('goods', $goods);
View::assign('extend', $extend);
return View::fetch("Goods/goods_extend");
}
/**
* 删除盒子扩展设置
*/
public function goods_extend_del(Request $request)
{
$goods_id = $request->param('goods_id/d');
if (!$goods_id) {
return json(['status' => 0, 'msg' => '参数错误']);
}
// 获取盒子信息
$goods = GoodsModel::where('id', $goods_id)->find();
if (!$goods) {
return json(['status' => 0, 'msg' => '盒子不存在']);
}
// 删除扩展设置
$result = \app\common\model\GoodsExtend::deleteByGoodsId($goods_id);
if ($result) {
return json(['status' => 1, 'msg' => '删除成功']);
} else {
return json(['status' => 0, 'msg' => '删除失败或扩展设置不存在']);
}
}
/**
* 更新盒子排序
*/
public function update_goods_sort(Request $request)
{
$id = $request->post('id/d');
$sort = $request->post('sort/d');
if (empty($id)) {
return json(['status' => 0, 'msg' => '参数错误']);
}
// 验证排序值
if (!is_numeric($sort) || $sort < 0) {
return json(['status' => 0, 'msg' => '排序值必须是非负整数']);
}
// 获取盒子信息
$goods = GoodsModel::where('id', $id)->find();
if (!$goods) {
return json(['status' => 0, 'msg' => '盒子不存在']);
}
// 更新排序值
$result = GoodsModel::where('id', $id)->update(['sort' => $sort]);
if ($result) {
return json(['status' => 1, 'msg' => '更新成功']);
} else {
return json(['status' => 0, 'msg' => '更新失败']);
}
}
/**
* 更新奖品排序
*/
public function goodslist_edit_sort(Request $request)
{
$id = $request->post('id/d');
$sort = $request->post('sort/d');
if (empty($id)) {
return json(['status' => 0, 'msg' => '参数错误']);
}
// 验证排序值
if (!is_numeric($sort) || $sort < 0) {
return json(['status' => 0, 'msg' => '排序值必须是非负整数']);
}
// 获取奖品信息
$goodsList = GoodsList::where('id', $id)->find();
if (!$goodsList) {
return json(['status' => 0, 'msg' => '奖品不存在']);
}
// 更新排序值
$result = GoodsList::where('id', $id)->update(['sort' => $sort]);
if ($result) {
return json(['status' => 1, 'msg' => '更新成功']);
} else {
return json(['status' => 0, 'msg' => '更新失败']);
}
}
}