494 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			494 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | 
 | |||
|  | namespace app\controller\manager\mall; | |||
|  | 
 | |||
|  | use app\controller\manager\Base; | |||
|  | use app\exception\RepositoryException; | |||
|  | use app\model\Config; | |||
|  | use app\model\Log; | |||
|  | use app\model\Sku; | |||
|  | use app\model\Spu as SpuModel; | |||
|  | use app\model\SpuActivity; | |||
|  | use app\repository\SpuRepository; | |||
|  | use app\service\Math; | |||
|  | use Exception; | |||
|  | use think\db\exception\DataNotFoundException; | |||
|  | use think\db\exception\DbException; | |||
|  | use think\db\exception\ModelNotFoundException; | |||
|  | use think\exception\ValidateException; | |||
|  | use think\facade\Db; | |||
|  | use think\response\Json; | |||
|  | use think\response\View; | |||
|  | 
 | |||
|  | class Activity extends Base | |||
|  | { | |||
|  |     protected $noNeedLogin = ['getOrder', 'getOrderGroupList']; | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 列表 | |||
|  |      * | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function index() | |||
|  |     { | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $params         = input(); | |||
|  |             $params['type'] = SpuModel::TYPE_GROUP_BUY; | |||
|  |             $params['type'] = SpuModel::TYPE_GROUP_BUY; | |||
|  | 
 | |||
|  |             $res = $this->spuList($params); | |||
|  | 
 | |||
|  |             return $this->json(0, 'success', $res); | |||
|  |         } | |||
|  | 
 | |||
|  |         $this->data['statusList']  = SpuModel::statusTextList(); | |||
|  |         $this->data['spuTypeList'] = SpuModel::spuTypeTextList(); | |||
|  |         $this->data['type']        = SpuModel::TYPE_GROUP_BUY; | |||
|  | 
 | |||
|  |         $this->data['mpPath']     = Config::MINI_PATH_SPU_INFO; | |||
|  | 
 | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 拼团 | |||
|  |      * | |||
|  |      * @return Json|View | |||
|  |      */ | |||
|  |     public function groupMake() | |||
|  |     { | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $params         = input(); | |||
|  |             $params['type'] = SpuModel::TYPE_GROUP_MAKE; | |||
|  | 
 | |||
|  |             $res = $this->spuList($params); | |||
|  | 
 | |||
|  |             return $this->json(0, 'success', $res); | |||
|  |         } | |||
|  | 
 | |||
|  |         $this->data['statusList']  = SpuModel::statusTextList(); | |||
|  |         $this->data['spuTypeList'] = SpuModel::spuTypeTextList(); | |||
|  |         $this->data['type']        = SpuModel::TYPE_GROUP_MAKE; | |||
|  |         $this->data['url']         = '/manager/mall/activity/group-make'; | |||
|  | 
 | |||
|  |         $this->data['mpPath']     = Config::MINI_PATH_SPU_INFO; | |||
|  | 
 | |||
|  |         return $this->view('/manager/mall/activity/index'); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 限时促销 | |||
|  |      * | |||
|  |      * @return Json|View | |||
|  |      */ | |||
|  |     public function limitTime() | |||
|  |     { | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $params         = input(); | |||
|  |             $params['type'] = SpuModel::TYPE_LIMIT_TIME; | |||
|  | 
 | |||
|  |             $res = $this->spuList($params); | |||
|  | 
 | |||
|  |             return $this->json(0, 'success', $res); | |||
|  |         } | |||
|  | 
 | |||
|  |         $this->data['statusList']  = SpuModel::statusTextList(); | |||
|  |         $this->data['spuTypeList'] = SpuModel::spuTypeTextList(); | |||
|  |         $this->data['type']        = SpuModel::TYPE_LIMIT_TIME; | |||
|  |         $this->data['url']         = '/manager/mall/activity/limit-time'; | |||
|  | 
 | |||
|  |         $this->data['mpPath']     = Config::MINI_PATH_SPU_INFO; | |||
|  | 
 | |||
|  |         return $this->view('/manager/mall/activity/index'); | |||
|  |     } | |||
|  | 
 | |||
|  |     protected function spuList(array $params): array | |||
|  |     { | |||
|  |         $res         = SpuRepository::getInstance()->activityList($params); | |||
|  |         $res['list'] = $res['list']->each(function ($item) { | |||
|  |             $status = ''; | |||
|  |             $now    = date('Y-m-d H:i:s'); | |||
|  |             if ($item['activity_begin_at'] > $now) { | |||
|  |                 $status = '未开始'; | |||
|  |             } | |||
|  | 
 | |||
|  |             if ($item['activity_begin_at'] < $now && $now < $item['activity_end_at']) { | |||
|  |                 $status = '进行中'; | |||
|  |             } | |||
|  | 
 | |||
|  |             if ($item['is_activity_history'] == SpuModel::COMMON_ON || $item['activity_end_at'] < $now) { | |||
|  |                 $status = '已结束'; | |||
|  |             } | |||
|  | 
 | |||
|  |             $item->status_text = $status; | |||
|  |         }); | |||
|  | 
 | |||
|  |         return $res; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @throws ModelNotFoundException | |||
|  |      * @throws DbException | |||
|  |      * @throws DataNotFoundException | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function add() | |||
|  |     { | |||
|  |         $repo = SpuRepository::getInstance(); | |||
|  |         $type = input('type/s', SpuModel::TYPE_GROUP_BUY); | |||
|  |         if (!in_array($type, SpuModel::activityList())) { | |||
|  |             if ($this->request->isPost()) { | |||
|  |                 return $this->json(4000, '活动类型错误'); | |||
|  |             } else { | |||
|  |                 return $this->error('活动类型错误'); | |||
|  |             } | |||
|  |         } | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $item  = $this->request->param('item/a', []); | |||
|  |             $sku   = $this->request->param('sku/a', []); | |||
|  |             $spuId = $this->request->param('spu_id/d', 0); | |||
|  | 
 | |||
|  |             $rules = [ | |||
|  |                 'cover|活动封面'             => 'require', | |||
|  |                 'activity_begin_at|开始时间' => 'require|date', | |||
|  |                 'activity_end_at|结束时间'   => 'require|date', | |||
|  |             ]; | |||
|  | 
 | |||
|  |             $validate = $this->validateByApi($item, $rules); | |||
|  |             if ($validate !== true) { | |||
|  |                 return $validate; | |||
|  |             } | |||
|  | 
 | |||
|  |             $item['is_score']      = SpuModel::COMMON_OFF; | |||
|  |             $item['is_activity']   = SpuModel::COMMON_ON; | |||
|  |             $item['activity_type'] = $type; | |||
|  | 
 | |||
|  |             try { | |||
|  |                 foreach ($sku as &$val) { | |||
|  |                     if (isset($val['id'])) { | |||
|  |                         unset($val['id']); | |||
|  |                     } | |||
|  |                 } | |||
|  | 
 | |||
|  |                 $this->checkSku($sku); | |||
|  |                 $repo->addActivity($type, $item, $spuId, $sku); | |||
|  |             } catch (RepositoryException $e) { | |||
|  |                 return $this->json(4002, $e->getMessage()); | |||
|  |             } catch (Exception $e) { | |||
|  |             } | |||
|  | 
 | |||
|  |             return $this->json(); | |||
|  |         } | |||
|  | 
 | |||
|  |         $this->data['type']        = $type; | |||
|  |         $this->data['limitList']   = SpuModel::limitList(); | |||
|  |         $this->data['limitFields'] = SpuRepository::getInstance()->activityFields($type); | |||
|  | 
 | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @throws DataNotFoundException | |||
|  |      * @throws ModelNotFoundException | |||
|  |      * @throws DbException | |||
|  |      */ | |||
|  |     public function edit() | |||
|  |     { | |||
|  |         $id      = $this->request->param('id/d', 0); | |||
|  |         $skuList = Sku::where('spu_activity_id', $id) | |||
|  |             ->where('enable', Sku::COMMON_ON) | |||
|  |             ->order('sort', 'asc') | |||
|  |             ->order('id', 'asc')->select()->toArray(); | |||
|  | 
 | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $item = $this->request->param('item/a', []); | |||
|  |             $sku  = $this->request->param('sku/a', []); | |||
|  |             try { | |||
|  |                 $this->checkSku($sku); | |||
|  | 
 | |||
|  |                 SpuRepository::getInstance()->editActivity($id, $item, $sku, $skuList); | |||
|  |             } catch (RepositoryException $e) { | |||
|  |                 return $this->json(4002, $e->getMessage()); | |||
|  |             } catch (Exception $e) { | |||
|  |             } | |||
|  | 
 | |||
|  |             return $this->json(); | |||
|  |         } | |||
|  | 
 | |||
|  |         $spuActivity = SpuActivity::findById($id); | |||
|  |         if (empty($spuActivity)) { | |||
|  |             return $this->json(4000, '没有相关的商品记录!'); | |||
|  |         } | |||
|  | 
 | |||
|  |         foreach ($skuList as &$val) { | |||
|  |             $val['price']          = Math::fen2Yuan($val['price']); | |||
|  |             $val['original_price'] = Math::fen2Yuan($val['original_price']); | |||
|  |         } | |||
|  | 
 | |||
|  |         $this->data['item']        = $spuActivity; | |||
|  |         $this->data['skuList']     = $skuList; | |||
|  |         $this->data['limitList']   = SpuModel::limitList(); | |||
|  |         $this->data['limitFields'] = SpuRepository::getInstance()->activityFields($spuActivity['activity_type']); | |||
|  |         $this->data['id']          = $id; | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @throws RepositoryException | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     protected function checkSku(array $sku) | |||
|  |     { | |||
|  |         // sku验证
 | |||
|  |         if (empty($sku)) { | |||
|  |             throw new RepositoryException('规格信息不能为空'); | |||
|  |         } | |||
|  | 
 | |||
|  |         foreach ($sku as $k) { | |||
|  |             $validate = $this->validateByApi($k, [ | |||
|  |                 'title'      => 'require', | |||
|  |                 'stock'      => 'require|number|gt:0', | |||
|  |                 'price'      => 'number', | |||
|  |                 'score'      => 'number', | |||
|  |                 'is_default' => 'require|in:0,1', | |||
|  |             ]); | |||
|  | 
 | |||
|  |             if ($validate !== true) { | |||
|  |                 return $validate; | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @throws ModelNotFoundException | |||
|  |      * @throws DbException | |||
|  |      * @throws DataNotFoundException | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function modify() | |||
|  |     { | |||
|  |         if (!$this->request->isPost()) { | |||
|  |             return $this->json(4000, '非法请求'); | |||
|  |         } | |||
|  | 
 | |||
|  |         $item     = input('post.'); | |||
|  |         $validate = $this->validateByApi($item, [ | |||
|  |             'field' => 'require', | |||
|  |             'value' => 'require', | |||
|  |         ]); | |||
|  | 
 | |||
|  |         if ($validate !== true) { | |||
|  |             return $validate; | |||
|  |         } | |||
|  | 
 | |||
|  |         if (!$info = SpuActivity::findById($item['id'])) { | |||
|  |             return $this->json(4001, '记录不存在'); | |||
|  |         } | |||
|  | 
 | |||
|  |         $update = [$item['field'] => $item['value']]; | |||
|  | 
 | |||
|  |         try { | |||
|  |             $info->save($update); | |||
|  |             if ($item['field'] == 'is_check' && $info['is_activity_history'] == SpuModel::COMMON_OFF) { | |||
|  |                 SpuModel::where('id', $info['spu_id'])->save(['is_check' => $item['value']]); | |||
|  |             } | |||
|  |             return $this->json(); | |||
|  |         } catch (ValidateException $e) { | |||
|  |             return $this->json(4001, $e->getError()); | |||
|  |         } catch (Exception $e) { | |||
|  |             return $this->json(5000, '修改失败'); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 立即结束-还原为普通商品 | |||
|  |      * | |||
|  |      * @return Json | |||
|  |      */ | |||
|  |     public function end(): Json | |||
|  |     { | |||
|  |         if (!$this->request->isPost()) { | |||
|  |             return $this->json(4000, '非法请求'); | |||
|  |         } | |||
|  | 
 | |||
|  |         $ids = $this->request->param('ids/a', []); | |||
|  |         if (empty($ids)) { | |||
|  |             $ids[] = $this->request->param('id/d', 0); | |||
|  |             $ids   = array_filter($ids); | |||
|  |         } | |||
|  | 
 | |||
|  |         try { | |||
|  |             if (count($ids)) { | |||
|  |                 SpuRepository::getInstance()->restore($ids); | |||
|  |                 Log::write(get_class(), 'end', '还原了活动商品,涉及到的ID为:'.implode(',', $ids)); | |||
|  |             } | |||
|  |         } catch (RepositoryException $e) { | |||
|  |             return $this->json(4001, $e->getMessage()); | |||
|  |         } | |||
|  | 
 | |||
|  |         return $this->json(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 删除-还原为普通商品且隐藏 | |||
|  |      * | |||
|  |      * @return Json | |||
|  |      */ | |||
|  |     public function del(): Json | |||
|  |     { | |||
|  |         if (!$this->request->isPost()) { | |||
|  |             return $this->json(4000, '非法请求'); | |||
|  |         } | |||
|  | 
 | |||
|  |         $ids = $this->request->param('ids/a', []); | |||
|  |         if (empty($ids)) { | |||
|  |             $ids[] = $this->request->param('id/d', 0); | |||
|  |             $ids   = array_filter($ids); | |||
|  |         } | |||
|  | 
 | |||
|  |         try { | |||
|  |             if (count($ids)) { | |||
|  |                 SpuRepository::getInstance()->restore($ids, false, true); | |||
|  | //                (new SpuActivity())->whereIn('id', $ids)->save(['deleted_at' => date('Y-m-d H:i:s')]);
 | |||
|  |                 Log::write(get_class(), 'del', '还原了活动商品,涉及到的ID为:'.implode(',', $ids)); | |||
|  |             } | |||
|  |         } catch (RepositoryException $e) { | |||
|  |             return $this->json(4001, $e->getMessage()); | |||
|  |         } | |||
|  | 
 | |||
|  |         return $this->json(); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 活动商品详情 | |||
|  |      * | |||
|  |      * @return View | |||
|  |      * @throws DataNotFoundException | |||
|  |      * @throws DbException | |||
|  |      * @throws ModelNotFoundException | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function info(): View | |||
|  |     { | |||
|  |         $id   = input('id/d', 0); | |||
|  |         $item = SpuActivity::findById($id); | |||
|  | 
 | |||
|  |         $status = ''; | |||
|  |         $now    = date('Y-m-d H:i:s'); | |||
|  |         if ($item['activity_begin_at'] > $now) { | |||
|  |             $status = '未开始'; | |||
|  |         } | |||
|  | 
 | |||
|  |         if ($item['activity_begin_at'] < $now && $now < $item['activity_end_at']) { | |||
|  |             $status = '进行中'; | |||
|  |         } | |||
|  | 
 | |||
|  |         if ($item['is_activity_history'] == SpuModel::COMMON_ON || $item['activity_end_at'] < $now) { | |||
|  |             $status = '已结束'; | |||
|  |         } | |||
|  | 
 | |||
|  |         $item->status_text = $status; | |||
|  | 
 | |||
|  |         if ($item->activity_type == SpuModel::TYPE_GROUP_MAKE) { | |||
|  |             //拼团
 | |||
|  |             $orderList = SpuRepository::getInstance()->getActivityGroupList($id); | |||
|  |         } else { | |||
|  |             // 团购 促销
 | |||
|  |             $orderList = SpuRepository::getInstance()->getActivityOrderList($id); | |||
|  |         } | |||
|  | 
 | |||
|  |         $totalPriceList      = $orderList['list']->where('is_paid', SpuActivity::COMMON_ON)->column('total_price'); | |||
|  |         $codingList          = $orderList['list']->column('coding'); | |||
|  |         $accountList         = $orderList['list']->column('account_id'); | |||
|  |         $codingCount         = count(array_unique($codingList)); | |||
|  |         $accountCount        = count(array_unique($accountList)); | |||
|  |         $totalPrice          = array_sum($totalPriceList); | |||
|  |         $item->total_money   = Math::fen2Yuan($totalPrice) ?? 0; | |||
|  |         $item->order_count   = $codingCount; | |||
|  |         $item->account_count = $accountCount; | |||
|  | 
 | |||
|  |         $this->data['item']         = $item; | |||
|  |         $this->data['statusList']   = \app\model\Order::statusTextList(); | |||
|  |         $this->data['activityList'] = SpuModel::activityTextList(); | |||
|  |         $this->data['limitList']    = SpuModel::limitList();//限购天数展示
 | |||
|  | 
 | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取活动商品的订单列表 | |||
|  |      * | |||
|  |      * @return Json | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function getOrder(): Json | |||
|  |     { | |||
|  |         $id   = input('id/d', 0); | |||
|  |         $page = input('page/d', 1); | |||
|  |         $size = input('size/d', 20); | |||
|  | 
 | |||
|  |         $res = SpuRepository::getInstance()->getActivityOrderList($id, $page, $size); | |||
|  | 
 | |||
|  |         return $this->json(0, '操作成功', $res); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取拼团列表 | |||
|  |      * | |||
|  |      * @return Json | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function getOrderGroupList(): Json | |||
|  |     { | |||
|  |         $id   = input('id/d', 0); | |||
|  |         $page = input('page/d', 1); | |||
|  |         $size = input('size/d', 20); | |||
|  | 
 | |||
|  |         $res = SpuRepository::getInstance()->getActivityGroupList($id, $page, $size); | |||
|  | 
 | |||
|  |         return $this->json(0, '操作成功', $res); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 批量审核 | |||
|  |      * | |||
|  |      * @return View|Json | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function check() | |||
|  |     { | |||
|  |         $id = input('id/s', ''); | |||
|  |         if ($this->request->isPost()) { | |||
|  |             $ids  = input('ids/s'); | |||
|  |             $check = input('is_check/d'); | |||
|  | 
 | |||
|  |             if (!in_array($check, [SpuActivity::COMMON_ON, SpuActivity::COMMON_OFF])) { | |||
|  |                 return $this->json(4001, '请选择是否展示'); | |||
|  |             } | |||
|  | 
 | |||
|  |             $ids = explode(',', $ids); | |||
|  | 
 | |||
|  |             Db::startTrans(); | |||
|  |             try { | |||
|  |                 (new SpuActivity())->whereIn('id', $ids)->save(['is_check' => $check]); | |||
|  |                 // 活动商品对应的普通商品审核状态同步
 | |||
|  |                 $spuIds = SpuActivity::whereid('id', $ids) | |||
|  |                     ->where('is_activity_history', SpuActivity::COMMON_OFF) | |||
|  |                     ->column('spu_id'); | |||
|  |                 SpuModel::whereIn('id', $spuIds)->save(['is_check' => $check]); | |||
|  |                 Db::commit(); | |||
|  |                 return $this->json(0, '操作成功'); | |||
|  |             } catch (Exception $e) { | |||
|  |                 Db::rollback(); | |||
|  |                 Log::error('活动商品批量审核操作失败'.$e->getMessage()); | |||
|  |                 return $this->json(5001, '商品批量审核操作失败'); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         $this->data['id'] = $id; | |||
|  | 
 | |||
|  |         return $this->view(); | |||
|  |     } | |||
|  | 
 | |||
|  | } |