123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503 |
- <?php
- namespace app\admin\controller\unishop\market;
- use addons\unishop\extend\Redis;
- use app\admin\model\unishop\FlashProduct;
- use app\admin\model\unishop\OrderExtend;
- use app\admin\model\unishop\OrderProduct;
- use app\common\controller\Backend;
- use think\Db;
- use think\Exception;
- use think\exception\PDOException;
- use think\exception\ValidateException;
- use think\Hook;
- /**
- * 秒杀管理
- *
- * @icon fa fa-circle-o
- */
- class FlashSale extends Backend
- {
- /**
- * Multi方法可批量修改的字段
- */
- protected $multiFields = 'switch';
- /**
- * 是否开启Validate验证
- */
- protected $modelValidate = true;
- /**
- * 是否开启模型场景验证
- */
- protected $modelSceneValidate = true;
- /**
- * FlashSale模型对象
- * @var \app\admin\model\unishop\FlashSale
- */
- protected $model = null;
- public function _initialize()
- {
- parent::_initialize();
- $this->model = new \app\admin\model\unishop\FlashSale;
- $this->view->assign("statusList", $this->model->getStatusList());
- }
- /**
- * 查看
- */
- public function index()
- {
- //设置过滤方法
- $this->request->filter(['strip_tags']);
- if ($this->request->isAjax()) {
- //如果发送的来源是Selectpage,则转发到Selectpage
- if ($this->request->request('keyField')) {
- return $this->selectpage();
- }
- list($where, $sort, $order, $offset, $limit) = $this->buildparams();
- $total = $this->model
- ->where($where)
- ->count();
- $list = $this->model
- ->with([
- 'product'
- ])
- ->where($where)
- ->order($sort, $order)
- ->limit($offset, $limit)
- ->select();
- $list = collection($list)->toArray();
- $result = array("total" => $total, "rows" => $list);
- return json($result);
- }
- return $this->view->fetch();
- }
- /**
- * 添加
- */
- public function add()
- {
- if ($this->request->isPost()) {
- $params = $this->request->post("row/a");
- if ($params) {
- $params = $this->preExcludeFields($params);
- if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
- $params[$this->dataLimitField] = $this->auth->id;
- }
- //Db::startTrans();
- $this->model->startTrans();
- try {
- //是否采用模型验证
- if ($this->modelValidate) {
- $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
- $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
- $this->model->validateFailException(true)->validate($validate);
- }
- $params['starttime'] = strtotime($params['starttime']);
- $params['endtime'] = strtotime($params['endtime']);
- $this->model->allowField(true)->save($params);
- $products = [];
- if (isset($params['product'])) {
- $time = time();
- $redis = new Redis();
- foreach ($params['product'] as $item) {
- array_push($products, [
- 'flash_id' => $this->model->id,
- 'product_id' => $item['id'],
- 'number' => $item['number'],
- 'introduction' => $item['introduction'],
- 'createtime' => $time,
- 'updatetime' => $time,
- ]);
- // 是否上架
- if ($params['switch'] == \app\admin\model\unishop\FlashSale::SWITCH_YES) {
- $redis->handler->hMSet('flash_sale_' . $this->model->id . '_' . $item['id'], [
- 'flash_id' => $this->model->id,
- 'product_id' => $item['id'],
- 'id' => 0, // 新增的时候没有flash_product_id. 这个值无关紧要
- 'number' => $item['number'],
- 'sold' => 0, // 出售0个
- 'switch' => 1, // 默认全部上架
- 'starttime' => $params['starttime'],
- 'endtime' => $params['endtime'],
- ]);
- }
- }
- }
- if (empty($products)) {
- throw new ValidateException(__('Add at least one product'));
- }
- $flashProduct = new FlashProduct();
- $flashProduct->insertAll($products);
- //Db::commit();
- $this->model->commit();
- $this->success();
- } catch (ValidateException $e) {
- //Db::rollback();
- $this->model->rollback();
- $this->error($e->getMessage());
- } catch (PDOException $e) {
- //Db::rollback();
- $this->model->rollback();
- $this->error($e->getMessage());
- } catch (Exception $e) {
- //Db::rollback();
- $this->model->rollback();
- $this->error($e->getMessage());
- }
- $this->error(__('No rows were inserted'));
- }
- $this->error(__('Parameter %s can not be empty', ''));
- }
- return $this->view->fetch();
- }
- /**
- * 编辑
- */
- public function edit($ids = null)
- {
- $row = $this->model->get($ids);
- if (!$row) {
- $this->error(__('No Results were found'));
- }
- $adminIds = $this->getDataLimitAdminIds();
- if (is_array($adminIds)) {
- if (!in_array($row[$this->dataLimitField], $adminIds)) {
- $this->error(__('You have no permission'));
- }
- }
- if ($this->request->isPost()) {
- $params = $this->request->post("row/a");
- if ($row['status'] == \app\admin\model\unishop\FlashSale::STATUS_YES) {
- $this->error(__('Activity filed,can not change'));
- }
- if ($params) {
- $params = $this->preExcludeFields($params);
- $result = false;
- //Db::startTrans();
- $this->model->startTrans();
- try {
- if (isset($params['switch']) && $params['switch'] == \app\admin\model\unishop\FlashSale::SWITCH_YES) {
- Redis::available();
- }
- $row->checkItCanEdit();
- //是否采用模型验证
- if ($this->modelValidate) {
- $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
- $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
- $row->validateFailException(true)->validate($validate);
- }
- $result = $row->allowField(true)->save($params);
- $products = [];
- if (isset($params['product'])) {
- $time = time();
- foreach ($params['product'] as $item) {
- array_push($products, [
- 'flash_id' => $row['id'],
- 'product_id' => $item['id'],
- 'number' => $item['number'],
- 'introduction' => $item['introduction'],
- 'createtime' => $time,
- 'updatetime' => $time,
- ]);
- }
- }
- if (empty($products)) {
- throw new ValidateException(__('Add at least one product'));
- }
- $flashProduct = new FlashProduct();
- $flashProduct->where(['flash_id' => $row['id']])->delete();
- $flashProduct->insertAll($products);
- //Db::commit();
- $this->model->commit();
- } catch (ValidateException $e) {
- //Db::rollback();
- $this->model->rollback();
- $this->error($e->getMessage());
- } catch (PDOException $e) {
- //Db::rollback();
- $this->model->rollback();
- $this->error($e->getMessage());
- } catch (Exception $e) {
- //Db::rollback();
- $this->model->rollback();
- $this->error($e->getMessage());
- }
- if ($result !== false) {
- $this->success();
- } else {
- $this->error(__('No rows were updated'));
- }
- }
- $this->error(__('Parameter %s can not be empty', ''));
- }
- $this->view->assign("row", $row);
- return $this->view->fetch();
- }
- /**
- * 真实删除
- */
- public function destroy($ids = "")
- {
- $pk = $this->model->getPk();
- $adminIds = $this->getDataLimitAdminIds();
- if (is_array($adminIds)) {
- $this->model->where($this->dataLimitField, 'in', $adminIds);
- }
- if ($ids) {
- $this->model->where($pk, 'in', $ids);
- }
- $count = 0;
- Db::startTrans();
- try {
- $list = $this->model->onlyTrashed()->select();
- foreach ($list as $k => $v) {
- FlashProduct::destroy(['flash_id' => $v->id]);
- $count += $v->delete(true);
- }
- Db::commit();
- } catch (PDOException $e) {
- Db::rollback();
- $this->error($e->getMessage());
- } catch (Exception $e) {
- Db::rollback();
- $this->error($e->getMessage());
- }
- if ($count) {
- $this->success();
- } else {
- $this->error(__('No rows were deleted'));
- }
- $this->error(__('Parameter %s can not be empty', 'ids'));
- }
- /**
- * 归档结束
- */
- public function done($ids = null)
- {
- Db::startTrans();
- try {
- $row = $this->model->get($ids, [
- 'product' => function ($query) { // flashProduct
- // 悲观锁
- $query->lock(true)->with(['product']); //product
- }
- ]);
- if (!$row) {
- throw new Exception(__('No Results were found'));
- }
- if ($row['status'] == \app\admin\model\unishop\FlashSale::STATUS_YES) {
- throw new Exception(__('Activity filed,can not change'));
- }
- $orderExtent = new OrderProduct();
- $orders = $orderExtent->where(['flash_id' => $ids])
- ->field('number,spec,product_id')->select();
- if (!$orders) {
- throw new Exception(__('No one buys'));
- }
- $productList = [];
- foreach ($orders as $key => $order) {
- if ($order['spec'] == '' || !$order['spec'] || empty($order['spec']) || is_null($order['spec'])) {
- // 没有规格的商品
- if (isset($productList[$order['product_id']])) {
- $productList[$order['product_id']] += $order['number'];
- } else {
- $productList[$order['product_id']] = $order['number'];
- }
- } else {
- // 有规格的商品
- if (!isset($productList[$order['product_id']])) {
- $productList[$order['product_id']] = [];
- }
- if (!isset($productList[$order['product_id']][$order['spec']])) {
- $productList[$order['product_id']][$order['spec']] = $order['number'];
- } else {
- $productList[$order['product_id']][$order['spec']] += $order['number'];
- }
- }
- }
- $products = $specNumber = [];
- foreach ($productList as $product_id => $value) {
- foreach ($row['product'] as $flashProduct) {
- if ($flashProduct['product_id'] == $product_id) {
- if (is_array($value)) {
- // 有规格 (这里循环的是同一个商品不同的规格)
- foreach ($value as $spec => $number) {
- $products[] = $flashProduct['product']->getData();
- $specNumber[$spec] = $number;
- }
- } else {
- // 无规格
- $products[] = $flashProduct['product']->getData();
- $specNumber[] = $value;
- }
- }
- }
- }
- // 让秒杀下架
- $row->status = \app\admin\model\unishop\FlashSale::STATUS_YES;
- $row->switch = \app\admin\model\unishop\FlashSale::SWITCH_NO;
- $row->save();
- $this->model->activityFiled($products, $specNumber);
- // 删除redis数据
- $redis = new Redis();
- foreach ($products as $product) {
- $redis->handler->del('flash_sale_' . $ids . '_' . $product['id']);
- }
- Db::commit();
- $this->success(__('Success'));
- } catch (Exception $e) {
- Db::rollback();
- $this->error($e->getMessage());
- }
- }
- /**
- * 秒杀的产品列表
- */
- public function product()
- {
- $flashId = $this->request->request('flash_id');
- $flashProductModel = new FlashProduct();
- $products = $flashProductModel
- ->with([
- 'product' => function ($query) {
- $query->with('category')->field(['id', 'title', 'category_id', 'image', 'stock']);
- }
- ])
- ->where(['flash_id' => $flashId])
- ->select();
- $list = [];
- foreach ($products as $key => $item) {
- $list[$key]['flash_product_id'] = $item['id'];
- $list[$key]['id'] = $item['product_id'];
- $list[$key]['product_id'] = $item['product_id'];
- $list[$key]['title'] = $item['product']['title'];
- $list[$key]['image'] = $item['product']['image'];
- $list[$key]['stock'] = $item['product']['stock'];
- $list[$key]['sold'] = $item['sold'];
- $list[$key]['switch'] = $item['switch'];
- $list[$key]['category'] = $item['product']['category'];
- $list[$key]['number'] = $item['number'];
- $list[$key]['introduction'] = $item['introduction'];
- }
- $result = array("total" => count($list), "rows" => $list);
- return json($result);
- }
- /**
- * 批量更新
- */
- public function multi($ids = "")
- {
- $ids = $ids ? $ids : $this->request->param("ids");
- if ($ids) {
- if ($this->request->has('params')) {
- parse_str($this->request->post("params"), $values);
- $values = array_intersect_key($values, array_flip(is_array($this->multiFields) ? $this->multiFields : explode(',', $this->multiFields)));
- if ($values || $this->auth->isSuperAdmin()) {
- $adminIds = $this->getDataLimitAdminIds();
- if (is_array($adminIds)) {
- $this->model->where($this->dataLimitField, 'in', $adminIds);
- }
- $count = 0;
- Db::startTrans();
- try {
- Redis::available();
- $list = $this->model->with(['product'])->where($this->model->getPk(), 'in', $ids)->select();
- $redis = new Redis();
- foreach ($list as $index => $item) {
- if ($item['status'] == \app\admin\model\unishop\FlashSale::STATUS_YES) {
- throw new Exception(__('Activity filed,can not change'));
- }
- foreach ($item['product'] as $product) {
- // 上架
- if ($values['switch'] == \app\admin\model\unishop\FlashSale::SWITCH_YES) {
- $redis->handler->hMSet('flash_sale_' . $product['flash_id'] . '_' . $product['product_id'], [
- 'flash_id' => $product['flash_id'],
- 'product_id' => $product['product_id'],
- 'id' => $product['id'],
- 'number' => $product['number'],
- 'sold' => $product['sold'],
- 'switch' => $product['switch'],
- 'starttime' => $item['starttime'],
- 'endtime' => $item['endtime'],
- ]);
- } else {
- // 下架
- $redis->handler->del('flash_sale_' . $product['flash_id'] . '_' . $product['product_id']);
- }
- }
- $count += $item->allowField(true)->isUpdate(true)->save($values);
- }
- Db::commit();
- } catch (PDOException $e) {
- Db::rollback();
- $this->error($e->getMessage());
- } catch (Exception $e) {
- Db::rollback();
- $this->error($e->getMessage());
- }
- if ($count) {
- $this->success();
- } else {
- $this->error(__('No rows were updated'));
- }
- } else {
- $this->error(__('You have no permission'));
- }
- }
- }
- $this->error(__('Parameter %s can not be empty', 'ids'));
- }
- }
|