| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503 | <?phpnamespace 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'));    }}
 |