|
|
@@ -5,9 +5,15 @@ namespace app\admin\controller\product;
|
|
|
use app\common\controller\Backend;
|
|
|
use Exception;
|
|
|
use think\Db;
|
|
|
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
|
|
+use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
|
|
|
+use PhpOffice\PhpSpreadsheet\Reader\Xls;
|
|
|
+use PhpOffice\PhpSpreadsheet\Reader\Csv;
|
|
|
use app\common\model\ProductArea;
|
|
|
use think\exception\DbException;
|
|
|
use think\exception\PDOException;
|
|
|
+use app\admin\model\Importregion;
|
|
|
+use app\admin\model\Importlog;
|
|
|
use think\exception\ValidateException;
|
|
|
|
|
|
/**
|
|
|
@@ -102,7 +108,7 @@ class Lists extends Backend
|
|
|
unset($params['product_area'], $params['product_area_txt']);
|
|
|
//商品
|
|
|
$add = $this->model->create($params);
|
|
|
- $result= $this->setEqualArea($add->id, $areaArr, $areaArrTxt, 0);
|
|
|
+ $result= self::setEqualArea($add->id, $areaArr, $areaArrTxt, 0);
|
|
|
Db::commit();
|
|
|
} catch (ValidateException|PDOException|Exception $e) {
|
|
|
Db::rollback();
|
|
|
@@ -182,7 +188,7 @@ class Lists extends Backend
|
|
|
unset($params['product_area'], $params['product_area_txt']);
|
|
|
$row->allowField(true)->save($params);
|
|
|
//$this->productArea::where('product_id', $ids)->where('status', 1)->delete();
|
|
|
- $result= $this->setEqualArea($ids, $areaArr, $areaArrTxt, 1);
|
|
|
+ $result= self::setEqualArea($ids, $areaArr, $areaArrTxt, 1);
|
|
|
Db::commit();
|
|
|
} catch (ValidateException|PDOException|Exception $e) {
|
|
|
Db::rollback();
|
|
|
@@ -194,6 +200,104 @@ class Lists extends Backend
|
|
|
$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
|