|
|
@@ -8,6 +8,7 @@ use app\common\controller\Backend; |
|
|
|
use think\Db; |
|
|
|
use think\exception\PDOException; |
|
|
|
use think\exception\ValidateException; |
|
|
|
use think\Loader; |
|
|
|
|
|
|
|
/** |
|
|
|
* 订单主管理 |
|
|
@@ -26,7 +27,7 @@ class OrderMain extends Backend |
|
|
|
{ |
|
|
|
parent::_initialize(); |
|
|
|
$this->model = new \app\admin\model\OrderMain; |
|
|
|
|
|
|
|
$this->relationSearch = true; |
|
|
|
} |
|
|
|
|
|
|
|
public function import() |
|
|
@@ -56,10 +57,10 @@ class OrderMain extends Backend |
|
|
|
list($where, $sort, $order, $offset, $limit) = $this->buildparams(); |
|
|
|
$group_id=$this->auth->getGroupId(); |
|
|
|
$list = $this->model |
|
|
|
->alias("a") |
|
|
|
->join('hbp_cf_channel_info b','a.channel_id = b.id','left') |
|
|
|
->join('hbp_admin c','a.create_id = c.id','left') |
|
|
|
->field("a.*,b.channel_name,c.nickname") |
|
|
|
->alias("order_main") |
|
|
|
->join('hbp_cf_channel_info b','order_main.channel_id = b.id','left') |
|
|
|
->join('hbp_admin c','order_main.create_id = c.id','left') |
|
|
|
->field("order_main.*,b.channel_name,c.nickname") |
|
|
|
->where($where); |
|
|
|
if ($group_id){ |
|
|
|
$list = $list |
|
|
@@ -100,6 +101,187 @@ class OrderMain extends Backend |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 生成查询所需要的条件,排序方式 |
|
|
|
* @param mixed $searchfields 快速查询的字段 |
|
|
|
* @param boolean $relationSearch 是否关联查询 |
|
|
|
* @return array |
|
|
|
*/ |
|
|
|
protected function buildparams($searchfields = null, $relationSearch = null) |
|
|
|
{ |
|
|
|
$searchfields = is_null($searchfields) ? $this->searchFields : $searchfields; |
|
|
|
$relationSearch = is_null($relationSearch) ? $this->relationSearch : $relationSearch; |
|
|
|
$search = $this->request->get("search", ''); |
|
|
|
$filter = $this->request->get("filter", ''); |
|
|
|
$op = $this->request->get("op", '', 'trim'); |
|
|
|
$sort = $this->request->get("sort", !empty($this->model) && $this->model->getPk() ? $this->model->getPk() : 'id'); |
|
|
|
$order = $this->request->get("order", "DESC"); |
|
|
|
$offset = $this->request->get("offset/d", 0); |
|
|
|
$limit = $this->request->get("limit/d", 999999); |
|
|
|
//新增自动计算页码 |
|
|
|
$page = $limit ? intval($offset / $limit) + 1 : 1; |
|
|
|
if ($this->request->has("page")) { |
|
|
|
$page = $this->request->get("page/d", 1); |
|
|
|
} |
|
|
|
$this->request->get([config('paginate.var_page') => $page]); |
|
|
|
$filter = (array)json_decode($filter, true); |
|
|
|
$op = (array)json_decode($op, true); |
|
|
|
$filter = $filter ? $filter : []; |
|
|
|
$where = []; |
|
|
|
$alias = []; |
|
|
|
$bind = []; |
|
|
|
$name = ''; |
|
|
|
$aliasName = ''; |
|
|
|
if (!empty($this->model) && $this->relationSearch) { |
|
|
|
$name = $this->model->getTable(); |
|
|
|
$alias[$name] = Loader::parseName(basename(str_replace('\\', '/', get_class($this->model)))); |
|
|
|
$aliasName = $alias[$name] . '.'; |
|
|
|
} |
|
|
|
$sortArr = explode(',', $sort); |
|
|
|
foreach ($sortArr as $index => & $item) { |
|
|
|
$item = stripos($item, ".") === false ? $aliasName . trim($item) : $item; |
|
|
|
} |
|
|
|
unset($item); |
|
|
|
$sort = implode(',', $sortArr); |
|
|
|
$adminIds = $this->getDataLimitAdminIds(); |
|
|
|
if (is_array($adminIds)) { |
|
|
|
$where[] = [$aliasName . $this->dataLimitField, 'in', $adminIds]; |
|
|
|
} |
|
|
|
if ($search) { |
|
|
|
$searcharr = is_array($searchfields) ? $searchfields : explode(',', $searchfields); |
|
|
|
foreach ($searcharr as $k => &$v) { |
|
|
|
$v = stripos($v, ".") === false ? $aliasName . $v : $v; |
|
|
|
} |
|
|
|
unset($v); |
|
|
|
$where[] = [implode("|", $searcharr), "LIKE", "%{$search}%"]; |
|
|
|
} |
|
|
|
$index = 0; |
|
|
|
foreach ($filter as $k => $v) { |
|
|
|
if (!preg_match('/^[a-zA-Z0-9_\-\.]+$/', $k)) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
$sym = isset($op[$k]) ? $op[$k] : '='; |
|
|
|
if (stripos($k, ".") === false) { |
|
|
|
$k = $aliasName . $k; |
|
|
|
} |
|
|
|
$v = !is_array($v) ? trim($v) : $v; |
|
|
|
$sym = strtoupper(isset($op[$k]) ? $op[$k] : $sym); |
|
|
|
//null和空字符串特殊处理 |
|
|
|
if (!is_array($v)) { |
|
|
|
if (in_array(strtoupper($v), ['NULL', 'NOT NULL'])) { |
|
|
|
$sym = strtoupper($v); |
|
|
|
} |
|
|
|
if (in_array($v, ['""', "''"])) { |
|
|
|
$v = ''; |
|
|
|
$sym = '='; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
switch ($sym) { |
|
|
|
case '=': |
|
|
|
case '<>': |
|
|
|
$where[] = [$k, $sym, (string)$v]; |
|
|
|
break; |
|
|
|
case 'LIKE': |
|
|
|
case 'NOT LIKE': |
|
|
|
case 'LIKE %...%': |
|
|
|
case 'NOT LIKE %...%': |
|
|
|
$where[] = [$k, trim(str_replace('%...%', '', $sym)), "%{$v}%"]; |
|
|
|
break; |
|
|
|
case '>': |
|
|
|
case '>=': |
|
|
|
case '<': |
|
|
|
case '<=': |
|
|
|
$where[] = [$k, $sym, intval($v)]; |
|
|
|
break; |
|
|
|
case 'FINDIN': |
|
|
|
case 'FINDINSET': |
|
|
|
case 'FIND_IN_SET': |
|
|
|
$v = is_array($v) ? $v : explode(',', str_replace(' ', ',', $v)); |
|
|
|
$findArr = array_values($v); |
|
|
|
foreach ($findArr as $idx => $item) { |
|
|
|
$bindName = "item_" . $index . "_" . $idx; |
|
|
|
$bind[$bindName] = $item; |
|
|
|
$where[] = "FIND_IN_SET(:{$bindName}, `" . str_replace('.', '`.`', $k) . "`)"; |
|
|
|
} |
|
|
|
break; |
|
|
|
case 'IN': |
|
|
|
case 'IN(...)': |
|
|
|
case 'NOT IN': |
|
|
|
case 'NOT IN(...)': |
|
|
|
$where[] = [$k, str_replace('(...)', '', $sym), is_array($v) ? $v : explode(',', $v)]; |
|
|
|
break; |
|
|
|
case 'BETWEEN': |
|
|
|
case 'NOT BETWEEN': |
|
|
|
$arr = array_slice(explode(',', $v), 0, 2); |
|
|
|
if (stripos($v, ',') === false || !array_filter($arr)) { |
|
|
|
continue 2; |
|
|
|
} |
|
|
|
//当出现一边为空时改变操作符 |
|
|
|
if ($arr[0] === '') { |
|
|
|
$sym = $sym == 'BETWEEN' ? '<=' : '>'; |
|
|
|
$arr = $arr[1]; |
|
|
|
} elseif ($arr[1] === '') { |
|
|
|
$sym = $sym == 'BETWEEN' ? '>=' : '<'; |
|
|
|
$arr = $arr[0]; |
|
|
|
} |
|
|
|
$where[] = [$k, $sym, $arr]; |
|
|
|
break; |
|
|
|
case 'RANGE': |
|
|
|
case 'NOT RANGE': |
|
|
|
$v = str_replace(' - ', ',', $v); |
|
|
|
$arr = array_slice(explode(',', $v), 0, 2); |
|
|
|
if (stripos($v, ',') === false || !array_filter($arr)) { |
|
|
|
continue 2; |
|
|
|
} |
|
|
|
//当出现一边为空时改变操作符 |
|
|
|
if ($arr[0] === '') { |
|
|
|
$sym = $sym == 'RANGE' ? '<=' : '>'; |
|
|
|
$arr = $arr[1]; |
|
|
|
} elseif ($arr[1] === '') { |
|
|
|
$sym = $sym == 'RANGE' ? '>=' : '<'; |
|
|
|
$arr = $arr[0]; |
|
|
|
} |
|
|
|
$tableArr = explode('.', $k); |
|
|
|
if (count($tableArr) > 1 && $tableArr[0] != $name && !in_array($tableArr[0], $alias) && !empty($this->model)) { |
|
|
|
//修复关联模型下时间无法搜索的BUG |
|
|
|
$relation = Loader::parseName($tableArr[0], 1, false); |
|
|
|
$alias[$this->model->$relation()->getTable()] = $tableArr[0]; |
|
|
|
} |
|
|
|
$where[] = [$k, str_replace('RANGE', 'BETWEEN', $sym) . ' TIME', $arr]; |
|
|
|
break; |
|
|
|
case 'NULL': |
|
|
|
case 'IS NULL': |
|
|
|
case 'NOT NULL': |
|
|
|
case 'IS NOT NULL': |
|
|
|
$where[] = [$k, strtolower(str_replace('IS ', '', $sym))]; |
|
|
|
break; |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
$index++; |
|
|
|
} |
|
|
|
if (!empty($this->model)) { |
|
|
|
$this->model->alias($alias); |
|
|
|
} |
|
|
|
$model = $this->model; |
|
|
|
$where = function ($query) use ($where, $alias, $bind, &$model) { |
|
|
|
if (!empty($model)) { |
|
|
|
$model->alias($alias); |
|
|
|
$model->bind($bind); |
|
|
|
} |
|
|
|
foreach ($where as $k => $v) { |
|
|
|
if (is_array($v)) { |
|
|
|
call_user_func_array([$query, 'where'], $v); |
|
|
|
} else { |
|
|
|
$query->where($v); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
return [$where, $sort, $order, $offset, $limit, $page, $alias, $bind]; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 添加 |
|
|
|
*/ |
|
|
|
public function add() |
|
|
|