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' => '更新失败']); } } }