__('Status 3'), '6' => __('Status 6')]; } public function getStatusTextAttr($value, $data) { $value = $value ? $value : (isset($data['status']) ? $data['status'] : ''); $list = $this->getStatusList(); return isset($list[$value]) ? $list[$value] : ''; } public function getVerificationtimeTextAttr($value, $data) { $value = $value ? $value : (isset($data['verificationtime']) ? $data['verificationtime'] : ''); return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value; } protected function setVerificationtimeAttr($value) { return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value); } public function order() { return $this->belongsTo(Order::class, 'activity_order_id', 'id', [], 'LEFT')->setEagerlyType(0); } public function user() { return $this->belongsTo('app\common\model\User', 'verification_user_id', 'id', [], 'LEFT')->setEagerlyType(0); } /**更新订单核销状态 * @param $order * @return array|false|\PDOStatement|string|Model * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public static function updateVerification($code,$oper_id = 0,$oper_type='user',$check=true){ if(is_string($code))$code = self::getHaveVerificationOrderCode($code,$check); $code->status = "6";//refund_status $code->verification_user_id = $oper_id; $code->verification_type = $oper_type; $code->verificationtime = time(); $code->save(); return $code; } /**得到可核销订单 * @param $order_no * @return array|false|\PDOStatement|string|Model * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public static function getHaveVerificationOrderCode($code,$check=true){ // $where = [self::STATUS_NOPAY,self::STATUS_PAYED]; $ordercode = self::where('code',$code)->where("status","in",['3'])->find(); if(!$ordercode)throw new \Exception("当前码已存在或核销过!"); $order = $ordercode->order; if(!$order)throw new \Exception("订单异常!"); if(!$check) return $ordercode; if(!in_array($order["status"],['2','3']))throw new \Exception("当前订单不可核销!"); //过了可核销时间段 Activity::update_classes($order["activity_id"]); $activity = $order->activity; if(!$activity)throw new \Exception("活动异常!"); if($activity["status"] != "4")throw new \Exception("当前活动还不能核销!"); return $ordercode; } /** 强制核销订单 * @param $code * @param $oper_type * @param $oper_id * @return array|false|\PDOStatement|string|Model * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function forceVerification($code,$oper_type='user',$oper_id=0,$check=true) { $ordercode = self::updateVerification($code,$oper_id,$oper_type,$check); $order = $ordercode->order; if($check){ //插入订单取消日志 if($oper_type!='user' || $order["user_id"] !=$oper_id ){ OrderLog::log($order['id'],"[员工操作]活动订单成功核销一人",$oper_type ?: 'user', $oper_id ?: $order['user_id']); }else{ OrderLog::log($order['id'],"活动订单成功核销一人",$oper_type ?: 'user', $oper_id ?: $order['user_id']); } }else{ OrderLog::log($order['id'],"活动结束订单强制完成核销(超时结算或特殊情况)",$oper_type ?: 'user', $oper_id ?: $order['user_id']); } //调用订单取消事件 $data = ['order' => self::where("id",$order['id'])->find(),"user_id"=>$order["user_id"],"oper_type"=>$oper_type,"oper_id"=>$oper_id]; \think\Hook::listen('activity_order_verification_after', $data); //过了可核销时间段 Activity::update_classes($order["activity_id"]); return $ordercode; } /**订单核销 * @param $code * @param int $user_id * @param bool $check * @param bool $trans * @return bool * @throws \Exception */ public function verification($code,$user_id=0,$check=false,$oper_type='user',$oper_id=0,$trans=false){ //得到可取消订单 $ordercode = self::getHaveVerificationOrderCode($code); $order = $ordercode->order; if($check){ //用户操作权限检测 Order::checkOptionAuth($order['id'],$user_id ?: $oper_id,$oper_type); } //判断逻辑 if($trans){ self::beginTrans(); } $res = true; try{ //事务逻辑 //更新订单状态 $ordercode = $this->forceVerification($code,$oper_type,$oper_id); //检测订单完成状态 Order::statisticsAndUpdateOrderFinish($order['id']); if($trans){ self::commitTrans(); } }catch (\Exception $e){ if($trans){ self::rollbackTrans(); } throw new \Exception($e->getMessage()); } return $ordercode; } }