productArea = new ProductArea; $this->model = new \app\common\model\ProductLists; } /** * 查看 * * @return string|Json * @throws \think\Exception * @throws DbException */ 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(); $list = $this->model->with('products') ->where($where) ->order($sort, $order) ->paginate($limit); foreach ($list as &$item) { $item['total_num']= $this->productArea::where('product_id', $item->id)->count(); $item['sell_num'] = $this->productArea::where('product_id', $item->id)->where('status', $this->productArea::STOP)->count(); } $result = ['total' => $list->total(), 'rows' => $list->items()]; return json($result); } /** * 添加 * * @return string * @throws \think\Exception */ public function add() { 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; } $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); } $areaArr = json_decode($params['product_area'], true); $areaArrTxt = json_decode($params['product_area_txt'], true); if(empty($areaArr) || empty($areaArrTxt)) throw new ValidateException('请添加商品关联地区'); unset($params['product_area'], $params['product_area_txt']); //商品 $add = $this->model->create($params); $result= self::setEqualArea($add->id, $areaArr, $areaArrTxt, 0); 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 string * @throws DbException * @throws \think\Exception */ 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) && !in_array($row[$this->dataLimitField], $adminIds)) { $this->error(__('You have no permission')); } if (false === $this->request->isPost()) { $area = $this->productArea::where('product_id', $ids)->select(); $areaData = array(); $areaCode = array(); $areaTxt = array(); foreach ($area as $key =>$item) { if($item->province > 0){ $areaData[$key] = $item->province; $areaCode[$key][0] = $item->province; } if($item->city > 0){ $areaData[$key] = $item->city; $areaCode[$key][1] = $item->city; } if($item->area > 0) { $areaData[$key] = $item->area; $areaCode[$key][2] = $item->area; } if($item->county > 0) { $areaData[$key] = $item->county; $areaCode[$key][3] = $item->county; } $areaTxt[] = [$item->address]; } $this->assignconfig('areaData', json_encode($areaData)); $this->view->assign('row', $row); $this->view->assign('areaTxt', json_encode($areaTxt, JSON_UNESCAPED_UNICODE)); $this->view->assign('areaCode', json_encode($areaCode)); 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); $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 . '.edit' : $name) : $this->modelValidate; $row->validateFailException()->validate($validate); } $areaArr = json_decode($params['product_area'], true); $areaArrTxt = json_decode($params['product_area_txt'], true); if(empty($areaArr) || empty($areaArrTxt)) throw new ValidateException('请添加商品关联地区'); unset($params['product_area'], $params['product_area_txt']); $row->allowField(true)->save($params); //$this->productArea::where('product_id', $ids)->where('status', 1)->delete(); $result= self::setEqualArea($ids, $areaArr, $areaArrTxt, 1); Db::commit(); } catch (ValidateException|PDOException|Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if (false === $result) { $this->error(__('No rows were updated')); } $this->success(); } /** * 导入产品地区 * @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; } $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; } $field = implode('-', $values); $row = $importregion::where('name', $field)->find(); if(!empty($row)){ if($this->productArea::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->productArea::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; } //判断是否存在相同元素 private function setEqualArea(int $product_id,array $areaArr, array $areaArrTxt, int $type): bool { foreach ($areaArr as $key=>$row) { $arr['product_id'] = $product_id; $arr['province'] = $row[0]??0; $arr['city'] = $row[1]??0 ; $arr['area'] = $row[2]??0; $arr['county'] = $row[3]??0; $arr['address'] = $areaArrTxt[$key][0]; if(!empty($type)){ if($this->productArea::where('product_id',$arr['product_id']) ->where('province',$arr['province']) ->where('city',$arr['city'])->where('area',$arr['area']) ->where('county',$arr['county']) ->count() > 0) continue; } $this->productArea::create($arr); } return true; } }