post(); $data['org_id'] = cur_org_id(); $map[] = $type == 0?['parent_id','=',0]:['parent_id','>',0]; $ids = Db::name('energy_electricity') ->where('org_id',$data['org_id']) ->where('del',0) ->where($map) ->column('number'); if (!in_array($data['sn'],$ids)){ $this->error =$type == 0?'表号不存在或非总表表号':'表号不存在或非分表表号'; return false; } $result = validate('EnergyElectricityRecord')->check($data,[],''); if(true !== $result){ $this->error = validate('EnergyElectricityRecord')->getError(); return false; } $id = $data['id']; unset($data['id']); $data['read_yyyy'] = date('Y',strtotime($data['read_time'])); $data['read_yyyymm'] = date('Ym',strtotime($data['read_time'])); $data['read_yyyymmdd'] = date('Ymd',strtotime($data['read_time'])); if($id > 0){ $data['update_time'] = date('Y-m-d H:i:s'); $ret = $this->allowField(true)->save($data,['id'=>$id]); }else{ $change = Db::name('energy_change_log') ->where('org_id',$data['org_id']) ->where('sn',$data['sn']) ->order('id desc') ->value('degree'); if ($change){ $data['degree'] = $change + $data['degree']; } // 查询上次录入 $re = $this->where('sn',$data['sn']) ->order('read_time','desc') ->where('del',0) ->limit(1) ->find(); if ($re){ if (intval($data['degree']) < intval($re['degree'])){ $this->error ='本次抄表度数小于上次录入数据,请检查后重新录入'; return false; } } $warning = $this->warning('energy_electricity_record',$data); $data['create_time'] = date('Y-m-d H:i:s'); $data['user_id'] = $userId; $ret = $this->allowField(true)->save($data); } if(!$ret){ $this->error = '操作失败'; return false; } return true; } public function warning ($table,$data){ $re = Db::name($table)->where('sn',$data['sn']) ->order('read_time','desc') ->limit(4) ->column('degree'); if (count($re) == 4){ $degree = array_reverse($re); $differences = []; foreach ($degree as $index => $value) { if ($index < count($degree) - 1) { $differences[] = floatval($degree[$index + 1]) - floatval($value); } } $sumOfDifferences = array_sum($differences); $averageDifference = sprintf('%.2f',$sumOfDifferences / count($differences)); $max = ($data['degree']-$re[0]) > $averageDifference * 1.3; $min = ($data['degree']-$re[0]) < $averageDifference * 0.7; $info= [ 'sn'=>$data['sn'], 'org_id'=>$data['org_id'], 'content'=>$max ? '本次录入数据差值高于前三次平均值130%' : '本次录入数据差值低于前三次平均值70%', 'read_time'=>$data['read_time'], 'type'=>$max ? 1 : 0, 'create_time'=>date('Y-m-d H:i:s'), ]; if ($max || $min){ Db::name('energy_record_warning')->insert($info); } } } }