这个需求也是比较恶心和奇葩的…
这个表是其他四个表的缝合怪…(维修费表,油料费表,停车费表,ETC费表)
只有一个车牌号的字段是共有字段, type
这个字段是我自己加的,作用就是区分四张表的数据,其他字段就都原封不动的复制过来了.
框架用的FastAdmin, 不是很熟悉..改起来也没那么顺手
需求原话:
“异常的话一是维修费根据维修单号进行判定,重复的为异常,二是停车费,ETC等费用以车辆总表内的车牌号进行配比,无车牌的属于异常,便于查明情况”
要做一个异常数据报警的列表.
简单来说就是分为两种情况:
1. type
字段等于0(即维修费异常报警), 并且维修单号
字段有重复值的, 就是我们需要查出来的数据
2. type
字段等于2 或 3(即停车费或ETC异常报警), 并且车牌号
字段值为空的, 就是我们需要查出来的数据
这两种查询条件组合一下就是最终需要的数据.
需求结束.
由于FastAdmin自动生成的CRUD里带有前端数据表API, 所以需要在控制器里重写一下这个index方法.
贴下代码:
/** * 查看 */ public function index() { //设置过滤方法 $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(); # 需求: # 异常的话一是维修费根据维修单号进行判定,重复的为异常, # 二是停车费,ETC等费用以车辆总表内的车牌号进行配比,无车牌的属于异常,便于查明情况 // 查出维修费的所有单号 $order_list = Db::name('cost_control') ->where('type', 0) ->column('repair_order_number'); // 去重操作 $unique_arr = array_unique($order_list); // 得到完整数据和去重后数组的差值, 即重复单号 $repeat_arr = array_diff_assoc($order_list, $unique_arr); // 逗号分割成字符串 $repeat_str = implode(',', $repeat_arr); // 定义查询条件 // 1.类型type=0即维修费, 如有单号相同的即为异常报警 $myWhere = []; $myWhere['type'] = 0; $myWhere['repair_order_number'] = ['in', $repeat_str]; // 2.类型type=2或3的,即=停车费或ETC费, 车牌字段为空的即为异常报警 $myWhereor = []; $myWhereor['type'] = [['eq', 2], ['eq', 3], 'or']; $myWhereor['plate_no'] = [['eq', null], ['eq', ''], 'or']; $list = $this->model ->where($where) ->where(function ($query) use ($myWhere){ $query->where($myWhere); })->whereOr(function ($query) use ($myWhereor){ $query->where($myWhereor); })->order($sort, $order) ->paginate($limit); $result = array("total" => $list->total(), "rows" => $list->items()); return json($result); } return $this->view->fetch(); }
再贴一下原生sql语句:
SELECT * FROM `fa_cost_control` WHERE ( `type` = '0' AND `repair_order_number` IN ('20200925090653') ) OR ( ( `type` = '2' or `type` = '3' ) AND ( `plate_no` = null or `plate_no` = '' ) )