<?php namespace app\admin\controller; use app\common\controller\Backend; use app\api\controller\Common; use Exception; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Reader\Xls; use PhpOffice\PhpSpreadsheet\Reader\Csv; use think\exception\PDOException; use app\admin\library\Auth; use think\Db; use PhpOffice\PhpSpreadsheet\Cell\DataType; /** * 会员注册管理 * * @icon fa fa-circle-o */ class Registers extends Backend { /** * Registers模型对象 * @var \app\admin\model\Registers */ protected $model = null; public function _initialize() { parent::_initialize(); $this->model = new \app\admin\model\Registers; } /** * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法 * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑 * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改 */ /** * 查看 */ public function index() { //当前是否为关联查询 $this->relationSearch = true; //设置过滤方法 $this->request->filter(['strip_tags', 'trim']); 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 ->with(['user']) ->where($where) ->order($sort, $order) ->count(); $list = $this->model ->with(['user']) ->where($where) ->order($sort, $order) ->limit($offset, $limit) ->select(); foreach ($list as $row) { $row->getRelation('user')->visible(['nickname']); $row->user->nickname = \app\admin\model\User::emoji_decode($row->user->nickname); } $list = collection($list)->toArray(); $result = array("total" => $total, "rows" => $list); return json($result); } return $this->view->fetch(); } //通过 public function adopt($ids){ if ($ids) { $pk = $this->model->getPk(); $res = $this->model->where($pk, '=', $ids)->update(['status'=>1]);//已处理 if($res){ $this->success('成功'); }else{ $this->error('失败'); } } $this->error(__('Parameter %s can not be empty', 'ids')); } //拒绝 public function reject($ids){ if ($ids) { $pk = $this->model->getPk(); $res = $this->model->where($pk, '=', $ids)->update(['status'=>2]); if($res){ $this->success('成功'); }else{ $this->error('失败'); } } $this->error(__('Parameter %s can not be empty', 'ids')); } //导入 public function import(){ $file = $this->request->request('file'); if (!$file) { $this->error(__('Parameter %s can not be empty', 'file')); } $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')); } if ($ext === 'csv') { $file = fopen($filePath, 'r'); $filePath = tempnam(sys_get_temp_dir(), 'import_csv'); $fp = fopen($filePath, "w"); $n = 0; while ($line = fgets($file)) { $line = rtrim($line, "\n\r\0"); $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']); if ($encoding != 'utf-8') { $line = mb_convert_encoding($line, 'utf-8', $encoding); } if ($n == 0 || preg_match('/^".*"$/', $line)) { fwrite($fp, $line . "\n"); } else { fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n"); } $n++; } fclose($file) || fclose($fp); $reader = new Csv(); } elseif ($ext === 'xls') { $reader = new Xls(); } else { $reader = new Xlsx(); } //加载文件 $insert = []; try { if (!$PHPExcel = $reader->load($filePath)) { $this->error(__('Unknown data format')); } $currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表 $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号 $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 $maxColumnNumber = Coordinate::columnIndexFromString($allColumn); $fields = []; for ($currentRow = 1; $currentRow <= 1; $currentRow++) { for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $fields[] = $val; } } if(in_array('订单编号',$fields)){ //套餐订单表 $this->model = new \app\admin\model\Order(); $order_flag = 0; }else{ //服务订单表 $this->model = new \app\admin\model\ServiceOrder(); $order_flag = 1; } $importHeadType = isset($this->importHeadType) ? $this->importHeadType : 'comment'; $table = $this->model->getQuery()->getTable(); $database = \think\Config::get('database.database'); $fieldArr = []; $list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]); foreach ($list as $k => $v) { if ($importHeadType == 'comment') { $fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME']; } else { $fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME']; } } for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) { $values = []; for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $cell = $currentSheet->getCellByColumnAndRow($currentColumn,$currentRow); if($cell->getDataType() == DataType::TYPE_NUMERIC){ $cellstyleformat = $cell->getStyle($cell->getCoordinate())->getNumberFormat(); $formatcode = $cellstyleformat->getFormatCode(); if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode)) { // $val = strtotime(gmdate("Y-m-d H:i:s", $currentSheet->ExcelToPHP($val))); $val = AdminCommon::getDateByFloatValue($val); } } $values[] = is_null($val) ? '' : $val; } $row = []; $temp = array_combine($fields, $values); // var_dump($fields); // var_dump($values); // var_dump($temp); // var_dump($fieldArr); foreach ($temp as $k => $v) { if (isset($fieldArr[$k]) && $k !== '') { $row[$fieldArr[$k]] = $v; } } if($order_flag == 0){ //套餐订单表 //判断是新增还是更新 $res1 = Db::name('order')->where(['order_sn'=>$row['order_sn']])->field('id')->find(); // dump($res1); if($res1){ //更新 $row['id'] = $res1['id']; } //根据手机号查询会员注册id $res = Db::name('registers')->where('mobile',$values[8])->field('id')->find(); if($res){ $row['r_id'] = $res['id']; }else{ $row['r_id'] = 0; } }else{ //服务订单表 //判断是新增还是更新 $res1 = Db::name('service_order')->where(['order_sn'=>$row['order_sn']])->field('id')->find(); if($res1){ //更新 $row['id'] = $res1['id']; } //根据手机号查询会员注册id $res = Db::name('registers')->where('mobile',$values[5])->field('id')->find(); if($res){ $row['r_id'] = $res['id']; }else{ $row['r_id'] = 0; } } if ($row) { //如果订单编号为空,则视为该条数据为空 if(isset($row['order_sn']) && !empty($row['order_sn'])){ $insert[] = $row; } } } } catch (Exception $exception) { $this->error($exception->getMessage()); } if (!$insert) { $this->error(__('No rows were updated!!!')); } try { //是否包含admin_id字段 $has_admin_id = false; foreach ($fieldArr as $name => $key) { if ($key == 'admin_id') { $has_admin_id = true; break; } } if ($has_admin_id) { $auth = Auth::instance(); foreach ($insert as &$val) { if (!isset($val['admin_id']) || empty($val['admin_id'])) { $val['admin_id'] = $auth->isLogin() ? $auth->id : 0; } } } $this->model->saveAll($insert); } catch (PDOException $exception) { $msg = $exception->getMessage(); if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) { $msg = "导入失败,包含【{$matches[1]}】的记录已存在"; }; $this->error($msg); } catch (Exception $e) { $this->error($e->getMessage()); } $this->success(); } //导出套餐订单列表excel public function export(){//导出Excel $ids = $this->request->param('ids'); if(!$ids){ return; } if($ids == 'all'){ $ids = []; $list = $this->model ->with(['user']) ->select(); foreach($list as $key => $l){ $ids[] = $l['id']; } }else{ $ids = explode(',',$ids); } AdminCommon::exportOrderList(['r_id'=>['in',$ids]]); } //导出服务列表excel public function export1(){//导出Excel $ids = $this->request->param('s_ids'); if(!$ids){ return; } if($ids == 'all'){ $ids = []; $list = $this->model ->with(['user']) ->select(); foreach($list as $key => $l){ $ids[] = $l['id']; } }else{ $ids = explode(',',$ids); } AdminCommon::exportServiceList(['r_id'=>['in',$ids]]); } //发送短信 public function send($ids = null){ 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; } $result = true; 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(true)->validate($validate); } if(empty($params['content'])){ $this->error('请输入发送内容'); } $where['status'] = ['eq','1']; if(!empty($ids)){ $where['id'] = ['eq',$ids]; } $data = $this->model->where($where)->select(); foreach($data as $key => $vo){ $mobile = $vo['mobile']; $search = '/^0?1[3|4|5|6|7|8|9][0-9]\d{8}$/'; if (!preg_match($search,$mobile)) { $this->error('手机号格式有误'); } $content = "【润保家】$params[content]"; //发送验证码 substr(Common::sendCode($mobile, $content),0,1); } Db::commit(); } catch (ValidateException $e) { Db::rollback(); $this->error($e->getMessage()); } catch (PDOException $e) { Db::rollback(); $this->error($e->getMessage()); } catch (Exception $e) { Db::rollback(); $this->error($e->getMessage()); } if ($result !== false) { $this->success(); } else { $this->error(__('No rows were inserted')); } } $this->error(__('Parameter %s can not be empty', '')); } return $this->view->fetch(); } }