model = new \app\common\model\ProductArea; $this->assignconfig('ids', $this->request->param('ids')); } /** * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法 * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑 * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改 */ public function index() { //设置过滤方法 $this->request->filter(['strip_tags', 'trim']); if (false === $this->request->isAjax()) { return $this->view->fetch(); } //如果发送的来源是 Selectpage,则转发到 Selectpage if ($this->request->request('keyField')) { return $this->selectpage(); } [$where, $sort, $order, $offset, $limit] = $this->buildparams(); $product_id = $this->request->param('ids'); $list = $this->model//->with('products') ->where($where)->where('product_id', $product_id) ->order($sort, $order) ->paginate($limit); $result = ['total' => $list->total(), 'rows' => $list->items()]; return json($result); } /** * 添加 * * @return string * @throws \think\Exception */ public function add() { if (false === $this->request->isPost()) { return $this->view->fetch(); } $params = $this->request->post('row/a'); if (empty($params) || empty($params['province'])) { $this->error(__('Parameter %s can not be empty', '')); } $params = $this->preExcludeFields($params); if ($this->dataLimit && $this->dataLimitFieldAutoFill) { $params[$this->dataLimitField] = $this->auth->id; } $result = false; Db::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()->validate($validate); } $params['product_id'] = $this->request->param('ids'); if($this->model::where('product_id', $params['product_id'])->where('address', $params['address'])->count() > 0) throw new ValidateException('商品关联区域已存在'); $result = $this->model->allowField(true)->save($params); Db::commit(); } catch (ValidateException|PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if ($result === false) { $this->error(__('No rows were inserted')); } $this->success(); } /** * 删除 * * @param $ids * @return void * @throws DbException * @throws DataNotFoundException * @throws ModelNotFoundException */ public function del($ids = null) { if (false === $this->request->isPost()) { $this->error(__("Invalid parameters")); } $ids = $ids ?: $this->request->post("ids"); if (empty($ids)) { $this->error(__('Parameter %s can not be empty', 'ids')); } $pk = $this->model->getPk(); $adminIds = $this->getDataLimitAdminIds(); if (is_array($adminIds)) { $this->model->where($this->dataLimitField, 'in', $adminIds); } $list = $this->model->where($pk, 'in', $ids)->select(); $count = 0; if(in_array(0, array_column( $list, 'status')) ==true) $this->error(__('已出售区域不能删除', 'ids')); Db::startTrans(); try { foreach ($list as $item) { $count += $item->delete(); } Db::commit(); } catch (PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if ($count) { $this->success(); } $this->error(__('No rows were deleted')); } /** * 导入产品地区 * @param $ids * @return string * @throws DbException * @throws \think\Exception */ public function exports(Importregion $importregion, Importlog $Importlog){ if (false === $this->request->isPost()) { $this->assignconfig('areaData', []); return $this->view->fetch(); } $params = $this->request->post('row/a'); if (empty($params)) { $this->error(__('Parameter %s can not be empty', '')); } $params = $this->preExcludeFields($params); if ($this->dataLimit && $this->dataLimitFieldAutoFill) { $params[$this->dataLimitField] = $this->auth->id; } $params['product_id'] = $this->request->param('ids'); $file = $params['export']; $filePath = ROOT_PATH . DS . 'public' . DS . $file; if (!is_file($filePath)) { $this->error(__('No results were found')); } //实例化reader $ext = pathinfo($filePath, PATHINFO_EXTENSION); if (!in_array($ext, ['csv', 'xls', 'xlsx'])) { $this->error(__('Unknown data format')); } $reader = ($ext === 'xls')? new Xls(): new Xlsx(); $result = false; Db::startTrans(); try { if (!$PHPExcel = $reader->load($filePath)) { $this->error(__('Unknown data format')); } $PHPExcel = $reader->load($filePath); $currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表 $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 //读取第二行字段名 $data = []; $fields = []; $k = 0; $i = 0; $time = time(); for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) { $values = []; //列字段 for ($currentColumn = 2; $currentColumn <= 5; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $values[] = is_null($val) ? '' : $val; } if(empty($values[0])) continue; $field = implode('-', $values); $row = $importregion::where('name', $field)->find(); if(!empty($row)){ if($this->model::where('product_id',$params['product_id'])->where('address',$row['name'])->count() > 0) continue; $data = self::importData($data, $k, $params['product_id'], $row->com_id, $time); $data[$k]['address'] = $row['name']; $k +=1; }else{ $fields = self::importData($fields, $i, $params['product_id'], $field, $time); $i += 1; } } if(!empty($data)) $result= $this->model::insertAll($data); //错误日志 if(!empty($fields)) $Importlog::insertAll($fields); Db::commit(); } catch (ValidateException|PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if ($result === false) { $this->error(__('No rows were inserted')); } $this->success(); } /** * 导入数据 * @return array */ private static function importData(array $data, int $k, int $product_id, string $ids, $time): array { //$data = array(); $arr = explode('-', $ids); //分割ID $data[$k]['product_id'] = $product_id; $data[$k]['province'] = $arr[0]??0; $data[$k]['city'] = $arr[1]??0 ; $data[$k]['area'] = $arr[2]??0; $data[$k]['county'] = $arr[3]??0; $data[$k]['create_time'] = $time; return $data; } }