request; $params = RepairOrderRepository::getOrderList($request, false); $orderStatusList = RepairOrderStatus::statusLabels(); //加载订单状态信息 $params['orderStatusList'] = $orderStatusList; $params['sysUserList'] = SysUserRepository::getCustomerList(); $params['delayOrderNum'] = $this->getDelayOrderNum(); $params['search_engineer_count'] = self::SEARCH_ENGINEER_COUNT; $params["citys"] = RegionFeeSettingModel::find()->all(); $params['thank_fee_list'] = ThankFee::htFilterLabels(); $params['repair_channels'] = RepairOrderChannel::channelLabels(); return $this->render('index', $params); } /** * 导出订单数据 * @return string */ public function actionExportDa() { $request = Yii::$app->request; $params = RepairOrderRepository::getOrderList($request, true); return $this->renderPartial("exportDa", $params); } /** * @return string */ public function actionInfo() { return $this->goOrderInfo("info"); } /** * @param $engineerId * @param $orderId */ private function getEngineerIllegalRecords($engineerId, $orderId) { $illegalRecordModel = EngineerIllegalRecordModel::find(); $illegalRecordModel->where(['engineer_id' => $engineerId, 'repair_order_id' => $orderId]); $illegalRecordModel->asArray(); $records = $illegalRecordModel->all(); $returnRecord = array('complainIllegal' => [], 'jumperIllegal' => []); foreach ($records as $k => $v) { if (EngineerIllegalRecordModel::COMPLAIN_TYPE == $v['type']) { $returnRecord['complainIllegal'] = $v; } elseif (EngineerIllegalRecordModel::ESCAPE_TYPE == $v['type']) { $returnRecord['jumperIllegal'] = $v; } } return $returnRecord; } // 关闭订单 public function actionCloseOrder() { $post = Yii::$app->request->post(); $id = $post['id']; $punishId = $post['punishId']; $e = new stdClass(); $e->success = false; $e->msg = 'fail'; if (empty($id)) { $e->msg = '数据Id是空的'; return $this->renderJson($e); } if (empty($punishId)) { $e->msg = '未选择结束订单惩罚'; return $this->renderJson($e); } $repairOrderModel = RepairOrderModel::findOne($id); if (!$repairOrderModel) { $e->msg = '数据为空'; return $this->renderJson($e); } if (1 == $repairOrderModel->is_admin_close) { $e->msg = '该订单已经手动关闭过'; return $this->renderJson($e); } $admin_id = Yii::$app->user->id; $closeResult = AdminCloseOrder::adminCloseOrder($punishId, $repairOrderModel, $admin_id); //PrivateNumberBindRecord::releaseBindPhone($repairOrderModel->id, PrivateNumberBindRecord::FROM_ADMIN, '后台手动关闭订单'); if (!$closeResult) { $e->msg = '关闭订单失败'; } else { // 对于双方无责、工程师有责: 需返还客户优惠券(设置repair_order_detail.select_coupon_id=0) if ($punishId == 5 || $punishId == 2) { $orderDetail = $repairOrderModel->detail; if ($orderDetail) { $orderDetail->select_user_coupon_id = 0; $orderDetail->save(); } } // 删除hashmap中的显示抵扣金标志 RepairOrder::delHashDeductionActivityShowFlag($id); $e->success = true; $e->msg = '成功关闭订单'; } return $this->renderJson($e); } // 系统级删除订单: 删除后用户和后台订单列表及数据统计分析均不纳入考虑 public function actionSystemDeleteOrder() { $post = Yii::$app->request->post(); $id = $post['id']; $e = new stdClass(); $e->success = false; $e->msg = false; if (empty($id)) { $e->msg = '订单ID为空'; return $this->renderJson($e); } $repairOrderModel = RepairOrderModel::findOne($id); if (!$repairOrderModel) { $e->msg = '无效订单记录'; return $this->renderJson($e); } // 系统删除 $sysUserId = Yii::$app->user->id; if (!AdminCloseOrder::handleSetInvalid($repairOrderModel, OrderInvalidType::TESTING_TYPE, $sysUserId)) { $e->msg = '系统删除订单出错'; return $this->renderJson($e); } $e->success = true; return $this->renderJson($e); } // 设置订单无效 public function actionSetOrderInvalid() { $post = Yii::$app->request->post(); $orderId = $post['orderId']; $remark = $post['remark']; $e = new stdClass(); $e->success = false; $e->message = 'ok'; if (empty($orderId)) { $e->message = '订单ID为空'; return $this->renderJson($e); } $repairOrderModel = RepairOrderModel::findOne($orderId); if (!$repairOrderModel) { $e->message = '无效订单记录'; return $this->renderJson($e); } // 系统删除 $sysUserId = Yii::$app->user->id; $result = AdminCloseOrder::adminSetOrderInvalid($repairOrderModel, $sysUserId, $remark); if ($result) { $e->success = true; $e->message = '成功设置'; } else { $e->message = '成功失败'; } return $this->renderJson($e); } // 系统级还原订单 public function actionSystemRestoreOrder() { $post = Yii::$app->request->post(); $id = $post['id']; $e = new stdClass(); $e->success = false; $e->msg = false; if (empty($id)) { $e->msg = '订单ID为空'; return $this->renderJson($e); } $repairOrderModel = RepairOrderModel::findOne($id); if (!$repairOrderModel) { $e->msg = '无效订单记录'; return $this->renderJson($e); } // 系统删除 $sysUserId = Yii::$app->user->id; if (!RepairOrderAdminOp::restore($repairOrderModel, $sysUserId)) { $e->msg = '系统还原订单出错'; return $this->renderJson($e); } $e->success = true; return $this->renderJson($e); } /** * 执行操作进行备注 * @return string */ public function actionDoUpdateRemark() { $post = Yii::$app->request->post(); $id = $post['id']; $remark = $post['remark']; $mRepairOrder = RepairOrderModel::findOne(["id" => intval($id)]); $mRepairOrder->remark = $remark; $mRepairOrder->updated_at = time(); $result = $mRepairOrder->save(); // 记录操作日志 $repairOrderLog = new RepairOrderLogModel(); $repairOrderLog->repair_order_id = $id; $repairOrderLog->operator_id = Yii::$app->user->id; $repairOrderLog->operator_type = RepairOrderLogModel::OPERATOR_TYPE_ADMIN; $repairOrderLog->content = $remark; $repairOrderLog->log_at = time(); $repairOrderLog->insert(); $msg = array(); if ($result) { $msg['status'] = 1; $msg['msg'] = "操作成功"; } else { $msg['status'] = 0; $msg['msg'] = "操作失败"; } return $this->renderJson($msg); } /** 手动派单 * @return string */ public function actionAllot() { $request = Yii::$app->request; $id = $request->get('id'); $order_status = empty($request->get('order_status')) ? "" : intval($request->get('order_status')); // 当前查看订单状态 $params = array(); $orderResult = RepairOrderRepository::getRepairInfoById(intval($id)); //加载订单信息 $orderStatusList = RepairOrderStatus::statusLabels(); //加载订单状态信息 $repairOrderUserSelectFaults = new RepairOrderUserSelectFaultsModel(); $userSelectFault = $repairOrderUserSelectFaults->getUserSelectFaultByOrderId(intval($id)); //读取用户选择的故障标签 $imgList = $repairOrderUserSelectFaults->getRepairFaultImgByOrderId(intval($id)); //读取用户拍的故障设备照片 $params['order'] = $orderResult; $params['orderStatusList'] = $orderStatusList; $params['userSelectFault'] = $userSelectFault; $params['imgList'] = $imgList; $params['order_status'] = $order_status; $params['search_engineer_count'] = self::SEARCH_ENGINEER_COUNT; return $this->render('allot', $params); } /** 派单前搜索工程师 * @return string */ public function actionSearchEngineer() { $e = new stdClass(); $e->success = false; $e->list = []; $req = Yii::$app->request; $keyword = $req->post('query'); $orderId = $req->post('orderId'); //$authEngineer = $req->post('authEngineer'); $keyword = str_replace(array(" ", " ", "\t", "\n", "\r"), '', $keyword); if (!empty($orderId)) { $orderRadius = Yii::$app->params['DISPATCH_ORDER_RADIUS']; $repairOrderModel = RepairOrderModel::find(); $repairOrderModel->select(["address.latitude", "address.longitude as longitude","repair_order.repair_device_cat_id","repair_order.repair_device_type","repair_order.user_id"]); $repairOrderModel->leftJoin("address", "address.id = repair_order.address_id"); $repairOrderModel->where(["repair_order.id" => $orderId]); $repairOrderModel->asArray(); $orderInfo = $repairOrderModel->one(); $where = ""; if (!empty($keyword)) { $where = ['or', ['like', 'engineer.phone', $keyword], ['like', 'engineer_profile.nickname', $keyword], ['like', 'concat(engineer_profile.firstname,engineer_profile.lastname)', $keyword]]; } $orderRadius = $orderRadius * 2; // 改为前端派单半径的 1.5倍,经常出现我们的工程师在30多公里外,无法手动派单给他们 $engineerList = Distance::getEngineerByOrderCoordinate($orderRadius, $orderInfo['latitude'], $orderInfo['longitude'], $where, self::SEARCH_ENGINEER_COUNT, $orderInfo['repair_device_cat_id'], $orderInfo['repair_device_type'], $orderInfo['user_id']); $e->success = true; } else { $engineerModel = EngineerModel::find(); $engineerModel->leftJoin('engineer_profile', "engineer.id = engineer_profile.engineer_id"); $engineerModel->select(['engineer.id as id', 'engineer.phone as phone', 'engineer_profile.nickname as nickname', 'concat(engineer_profile.firstname,engineer_profile.lastname) as name']); if (!empty($keyword)) { $engineerModel->where(['or', ['like', 'engineer.phone', $keyword], ['like', 'engineer_profile.nickname', $keyword], ['like', 'concat(engineer_profile.firstname,engineer_profile.lastname)', $keyword]]); } $engineerModel->andWhere(['engineer.status' => EngineerStatus::STATUS_SKILL_AUTH]); $engineerModel->asArray(); $engineerModel->limit(self::SEARCH_ENGINEER_COUNT); $engineerList = $engineerModel->all(); $e->success = true; //echo $engineerModel->createCommand()->rawSql; } $e->list = $engineerList; return $this->renderJson($e); } /** * 平台指派接单 * @return string * */ public function actionDoAllot() { $msg = array(); $post = Yii::$app->request->post(); $id = $post['id']; $remark = $post['remark']; $engineerId = $post['engineer']; $sysUserId = Yii::$app->user->id; $orderModel = RepairOrderModel::findOne($id); if ($orderModel == false) { $msg['status'] = 0; $msg['msg'] = "订单不存在"; return $this->renderJson($msg); } $engineerModel = EngineerRepository::selectOne($engineerId); if ($engineerModel == false) { $msg['status'] = 0; $msg['msg'] = "工程师不存在"; return $this->renderJson($msg); } $checkResult = PickOrder::wxCheckPickerOrder($orderModel, $engineerId, true); if (false == $checkResult->success) { $msg['status'] = 0; $msg['msg'] = $checkResult->error; return $this->renderJson($msg); } $transaction = Yii::$app->getDb()->beginTransaction(); try { $orderModel->status = RepairOrderStatus::STATUS_WAIT_DOOR; $orderModel->engineer_id = $engineerId; // 接单工程师ID if (!empty($remark)) { $orderModel->remark = $remark; // 订单备注 } // 准时到达时间调整为从数据库配置中读取 $scheduleDoorTime = SysSettingModel::getStandardDoorHours() ? SysSettingModel::getStandardDoorHours() * 60 : RepairOrderModel::DOOR_TURTLE_SPEED_MIN; if ($orderModel->save()) { $orderDetail = $orderModel->detail; $orderDetail->pick_at = time(); $orderDetail->schedule_door_min = $scheduleDoorTime; // 暂时默认2小时上门,后续支持工程师选择: 30分钟/60分钟/90分钟/120分钟 $orderDetail->save(); // 插入接单距离补贴到奖励表 RepairOrder::insertDistanceRewardReword($engineerId, $orderModel); // 设置接单繁忙状态标记(必须订单验收成功或者取消才能重置为空闲状态) Engineer::setEngineerBusy($engineerId, $orderModel); /** * 发送模板消息: 接单成功, 等待上门 */ if (!YII_ENV_DEV) { TemplateMessage::updateOrder($orderModel); // 工程师主动触发不需要提醒 } // 从Redis[待接单队列]清除此订单关联的记录 EngineerPickOrderModel::delRecord($orderModel->id); /** * 订单日志 */ OrderLogHelper::doAction(OrderLogHelper::ACTION_DISPATCH_ORDER, $orderModel, $sysUserId); PickOrder::recordEngineerPickOrderAddress($engineerModel->id, $orderModel); } $transaction->commit(); $msg['status'] = 1; $msg['msg'] = "派单成功"; } catch (Exception $exception) { $transaction->rollBack(); Yii::getLogger()->log($exception->getTraceAsString(), Logger::LEVEL_ERROR); $msg['status'] = 0; $msg['msg'] = "派单失败, 数据操作异常"; } return $this->renderJson($msg); } public function actionGetDistance() { $request = Yii::$app->request; $repair_order_id = $request->get('id'); //假定 订单为2 $orderModel = RepairOrderModel::findOne($repair_order_id); $engineerList = DispatchOrderRepository::queryAvailEngineers($orderModel); //var_dump($engineerList); //echo "

"; //根据这些工程师的经纬度信息,读取 return $this->renderJson(true); } // public function actionDelTestOrder() { $wh = array('user_id' => array(1, 3, 6)); $repairOrderModel = RepairOrderModel::find(); $repairOrderModel->select(["repair_order.*"]); $repairOrderModel->where($wh); $repairOrderModel->asArray(); $orderList = $repairOrderModel->all(); //print_r($orderList); $orderFilePath = $this->exportCsv('repair_order', $orderList); $transaction = Yii::$app->db->beginTransaction(); try { $orderResult = RepairOrderModel::deleteAll($wh); $orderIds = array(); foreach ($orderList as $kk => $vv) { $orderIds[] = $vv['id']; } if (empty($orderIds)) { echo "empty orderId"; exit; } $orderDetailWhere = ['repair_order_id' => $orderIds]; $orderDetail = RepairOrderDetailModel::find(); $orderDetail->select(['repair_order_detail.*']); $orderDetail->where($orderDetailWhere); $orderDetail->asArray(); $orderDetailList = $orderDetailList = $orderDetail->all(); $orderDetailFilePath = $this->exportCsv('repair_order_detail', $orderDetailList); $orderDetailResult = RepairOrderDetailModel::deleteAll($orderDetailWhere); if ($orderResult && $orderDetailResult) { $transaction->commit(); echo "export end\r\n"; echo "请记下数据备份地址\r\n " . '
' . " RepairOrder:{$orderFilePath} \r\n " . '
' . " RepairOrderDetail:{$orderDetailFilePath}"; //print_r($wh); } else { $transaction->rollBack(); echo "delete Error"; } } catch (Exception $exception) { AppLog::ERROR($exception->getTraceAsString()); $transaction->rollBack(); echo "delete error"; } } // 导入删除数据 public function actionImportData() { $doc_root = $_SERVER['DOCUMENT_ROOT']; $doc_root = str_replace("\\", '/', $doc_root); $doc_root = $doc_root . '/download/'; $handle = fopen($doc_root . 'repair_order_detail-20171013161806.csv', 'r'); $out = array(); $n = 0; while ($data = fgetcsv($handle, 10000)) { $num = count($data); for ($i = 0; $i < $num; $i++) { $out[$n][$i] = $data[$i]; } $n++; } //print_r($out); $header = $out[0]; $connection = Yii::$app->getDb(); for ($i = 1; $i < count($out); $i++) { $options = array(); foreach ($header as $k => $v) { $options[$v] = $out[$i][$k]; } if (!empty($options)) { /* $res = $connection->createCommand() ->insert('repair_order_detail', $options) ->execute(); echo "\r\n__".$res."\r\n"; */ //print_r($options); } } echo "end"; //print_r($res); //return $out; } // 表头 protected function makeTableHead($firstRow) { $str = ''; $index = 0; foreach ($firstRow as $kk => $vv) { if ($index == 0) { $str = $str . $kk; } else { $str = $str . ',' . $kk; } $index++; } $str = $str . "\r\n"; return $str; } // 表头 protected function makeTableContent($rows) { $orderIds = []; $str = ''; foreach ($rows as $k => $v) { $orderIds = $v['id']; $subIndex = 0; foreach ($v as $kkk => $vvv) { if (0 == $subIndex) { $str .= $vvv; } else { $str .= "," . $vvv; } $subIndex++; } $str .= "\r\n"; } return array('content' => $str, 'ids' => $orderIds); } // 封装导出 protected function exportCsv($strFileName, $orderList) { if (empty($orderList)) { return false; } $str = $this->makeTableHead($orderList[0]); $contents = $this->makeTableContent($orderList); $str = $str . $contents['content']; //$this->export_csv($strFileName.date('Ymd-His'),$str); $doc_root = $_SERVER['DOCUMENT_ROOT']; $doc_root = str_replace("\\", '/', $doc_root); $doc_root = $doc_root . '/download/'; $strFileName = $strFileName . '-' . date('YmdHis'); $myFile = fopen($doc_root . $strFileName . '.csv', "w") or die("Unable to open file!"); fwrite($myFile, $str); fclose($myFile); return '/download/' . $strFileName; } /** * 执行操作进行备注 * @return json {status:1,msg:""} */ public function actionGetQrcodeImg() { $msg = array("status" => 0, "msg" => ""); $request = Yii::$app->request; $id = $request->post('id'); $orderResult = RepairOrderRepository::getRepairInfoById(intval($id)); //加载订单信息 if ($orderResult) { // 判断游客设备 if ($orderResult["repair_device_type"] == 0) { $msg["status"] = -1; $msg["msg"] = "该订单为游客设备,不能获取二维码"; return $this->renderJson($msg); } } else { $msg["status"] = -1; $msg["msg"] = "生成二维码对应的订单号不存在"; return $this->renderJson($msg); } $map = []; $map = array("ro.id" => intval($id)); $repairOrderModel = RepairOrderModel::find(); $repairOrderModel->alias('ro'); $repairOrderModel->select(["q.number"]); $repairOrderModel->leftJoin("user_device as ud", "ro.repair_device_id=ud.id"); $repairOrderModel->leftJoin("qrcode as q", "ud.device_qrcode_id=q.id"); $repairOrderModel->where($map); $repairOrderModel->asArray(); $result = $repairOrderModel->all(); //判断查询结果是否为空 if (empty($result)) { $msg["status"] = -1; $msg["msg"] = "该订单号对应的二维码不存在"; return $this->renderJson($msg); } $number = $result[0]["number"]; if (empty($number)) { $msg["status"] = -1; $msg["msg"] = "该设备没有对应的二维码编号"; return $this->renderJson($msg); } $image_url = QrcodeUtil::previewQrcodeImage($number . ".png", $number); $msg["status"] = 1; $msg["msg"] = $image_url; return $this->renderJson($msg); } /** * 预订单列表 */ public function actionAppointmentOrderIndex() { $params = array(); $params = $this->dataAppointmentOrderList(); return $this->render('appointmentOrderList', $params); } protected function dataAppointmentOrderList() { $request = Yii::$app->request; $order_no = $request->get('order_no'); //订单编号 $order_begin = $request->get('order_begin'); //下单时间(起) $order_end = $request->get('order_end'); //下单时间(止) $customer_name = $request->get('customer_name'); //客户姓名 $customer_phone = $request->get('customer_phone'); //客户电话 $devicetype = $request->get('seldevicetype');//报修设备类型 空 为全部 1 用户设备 2游客设备 $order_status = ($request->get('order_status') === "") ? "" : intval($request->get('order_status')); // 运行查看所有 $repair_device_name = $request->get('repair_device_name'); //维修设备名称 $uid = $request->get('uid'); /** * 查询过滤处理 */ $get = []; $get['order_no'] = empty($order_no) ? "" : $order_no; $get['order_begin'] = empty($order_begin) ? "" : $order_begin; $get['order_end'] = empty($order_end) ? "" : $order_end; $get['customer_name'] = empty($customer_name) ? "" : $customer_name; $get['customer_phone'] = empty($customer_phone) ? "" : $customer_phone; $get['engineer_id'] = empty($engineer_id) ? "" : $engineer_id; $get['devicetype'] = $devicetype; //报修设备类型 $get['order_status'] = $order_status; $get['repair_device_name'] = $repair_device_name; $get['uid'] = $uid; /** * 组织SQL */ $orderQuery = new Query(); $expression = new Expression("(case o.repair_device_type when 1 then ow.name else '游客设备' end) as ownername"); $orderQuery->select(['o.id', 'o.status', 'o.pre_order_no as order_no', 'o.created_at', 'o.pre_date_time', 'o.repair_device_name', 'o.repair_device_id', 'o.repair_device_type', 'u.name as nickname', 'u.phone', 'addr.address', 'o.repair_channel', 'concat(ep.firstname,ep.lastname) as engineer_name', $expression]); $orderQuery->from('order_appointment o'); $orderQuery->leftJoin('user u', '`u`.`id` = `o`.`user_id`'); $orderQuery->leftJoin('engineer_profile ep', 'ep.engineer_id = o.engineer_id'); $orderQuery->leftJoin('address addr', 'addr.id = o.address_id'); $orderQuery->leftJoin('user_device ud', 'ud.id = o.repair_device_id'); $orderQuery->leftJoin('owner ow', 'ud.owner_id=ow.id'); if (!empty($order_no)) { $orderQuery->andWhere(['like', 'o.pre_order_no', $order_no]); } if (!empty($order_begin)) { $orderQuery->andWhere(['>=', 'o.created_at', strtotime($order_begin)]); } if (!empty($order_end)) { $orderQuery->andWhere(['<=', 'o.created_at', strtotime($order_end) + 86400]); // 多一天 } if (!empty($customer_name)) { $orderQuery->andWhere(['like', 'u.name', $customer_name]); } if (!empty($customer_phone)) { $orderQuery->andWhere(['like', 'u.phone', $customer_phone]); } if (!empty($devicetype)) { $wheredevicetype = $devicetype == 2 ? 0 : 1; $orderQuery->andWhere(['o.repair_device_type' => $wheredevicetype]); } if (!empty($order_status)) { $order_status = ($order_status == -1) ? OrderAppointmentModel::STATUS_WAIT : $order_status; $orderQuery->andWhere(['o.status' => $order_status]); } if (!empty($repair_device_name)) { $orderQuery->andWhere(['like', 'o.repair_device_name', $repair_device_name]); } if (!empty($uid)) { $orderQuery->andWhere(['u.id' => $uid]); } $orderQuery->orderBy('o.created_at DESC'); /** * 分页处理 */ $pageSize = $request->get("pageSize") ? (int)$request->get("pageSize") : 20; $pages = new Pagination(['totalCount' => $orderQuery->count(), 'pageSize' => $pageSize]); $orderList = $orderQuery->offset($pages->offset)->limit($pages->limit)->all(); return [ 'orderList' => $orderList, 'pages' => $pages, 'gets' => $get, 'channels' => RepairOrderChannel::channelLabels(), ]; } /** * 手动操作工程师到达维修地点 * @return string */ public function actionAjaxArrive() { $e = new stdClass(); $e->success = false; $e->order = new stdClass(); if (false == $this->request->isPost) { return $this->renderJson($e); } // 当前操作的订单 $orderId = $this->request->post('id'); $userId = Yii::$app->getUser()->getId(); //获取操作员ID $orderModel = RepairOrderRepository::findOne(['id' => $orderId]); if (!$orderModel) { $e->error = '订单不存在'; return $this->renderJson($e); } $engineerId = $orderModel->engineer_id; if (RepairOrderStatus::STATUS_WAIT_DOOR == $orderModel->status) { $engineerModel = EngineerRepository::selectOne($engineerId); if ($engineerModel->pick_order_count > 1) { $handleOrder = RepairOrderRepository::findOne(['id' => $engineerModel->busy_order_id,'client_id' => ClientModel::getClientId(), 'is_system_delete' => 0,'is_admin_close' =>0, 'is_user_close' => 0, 'is_engineer_close' => 0]); if ($handleOrder && $handleOrder->id != $orderId) { $e->error = '当前手头上还有未处理完成的订单,该订单无法点击到达'; return $this->renderJson($e); } } $success = RepairOrderEngineerOp::arrive($orderModel, $userId); if (!$success) { $e->error = '确认到达现场失败, 系统异常'; return $this->renderJson($e); } // 删除hashmap中的显示抵扣金标志 RepairOrder::delHashDeductionActivityShowFlag($orderModel->id); } elseif (RepairOrderStatus::STATUS_WAIT_ACCEPT == $orderModel->status && SuspendOrder::SUSPEND_STATUS_SUCCESS == $orderModel->is_suspend) { $result = SuspendOrder::engineerResume($orderModel, true); if ($result->errCode >= 0) { $e->error = '成功确认二次上门'; } else { if ($result->error) { $e->error = $result->error; } else { $e->error = '确认二次上门失败, 系统异常'; } return $this->renderJson($e); } } else { $e->error = '订单状态是等待上门的状态才能确认到达现场'; return $this->renderJson($e); } $e->success = true; return $this->renderJson($e); } /** * 添加评论 * @return string */ public function actionAjaxComment() { $e = new stdClass(); $e->success = false; $e->order = new stdClass(); if (false == $this->request->isPost) { return $this->renderJson($e); } // 当前操作的订单 $orderId = (int)$this->request->post('id'); // 提交的评论内容 $content = $this->request->post('content'); // 获取操作员ID $userId = Yii::$app->getUser()->getId(); $interviewId = 0; // 获取单个评论ID $commentId = (int)$this->request->post('comment_id'); $e->orderId = $orderId; $e->content = $content; $findInterview = RepairOrderInterviewModel::findOne(["repair_order_id" => $orderId]); if (empty($findInterview)) { // 如果客户还没提交回访,则不能评论 $e->error = '客户回访还没提交'; return $this->renderJson($e); } else { $interviewId = $findInterview->id; } if ($commentId) { $findInterviewComment = RepairOrderInterviewCommentModel::findOne(["id" => $commentId]); $findInterviewComment->content = $content; $findInterviewComment->updated_at = time(); $findInterviewComment->is_modified = 1; if ($findInterviewComment->save()) { $e->msg = "修改评论成功"; $e->success = true; return $this->renderJson($e); } else { $e->msg = "修改评论失败"; return $this->renderJson($e); } } else { $interviewComment = new RepairOrderInterviewCommentModel(); $interviewComment->user_id = $userId; $interviewComment->repair_order_id = $orderId; $interviewComment->repair_order_interview_id = $interviewId; $interviewComment->content = $content; $interviewComment->is_deleted = 0; $interviewComment->is_modified = 0; if ($interviewComment->insert()) { $e->msg = "提交评论成功"; $e->id = $interviewComment->id; //获取评论详情 $query = RepairOrderInterviewCommentModel::find() ->select('a.*, su.username, sup.realname') ->from(RepairOrderInterviewCommentModel::tableName() . 'a') ->leftJoin(SysUserModel::tableName() . 'su', "a.user_id = su.id") ->leftJoin(SysUserProfileModel::tableName() . 'sup', "sup.sys_user_id = su.id") ->andWhere(['=', 'a.id', $interviewComment->id]) ->andWhere(['=', 'a.is_deleted', 0]); $findInterviewComment = $query->asArray()->one(); if ($findInterviewComment) { //$findInterviewComment['updated_at'] = Yii::$app->formatter->asTime($findInterviewComment['updated_at'],"yyyy-MM-dd HH:mm:ss"); $format = new FormatTime(); if (time() - $findInterviewComment['updated_at'] < 86400) { $findInterviewComment['updated_at'] = $format->formatTime($findInterviewComment['updated_at']); } else { $findInterviewComment['updated_at'] = Yii::$app->formatter->asTime($findInterviewComment['updated_at'], "yyyy-MM-dd HH:mm:ss"); } $e->interview_comment = $findInterviewComment; } $e->success = true; return $this->renderJson($e); } else { $e->msg = "提交评论失败"; return $this->renderJson($e); } } } /** * 删除评论 * @return string */ public function actionAjaxCommentDelete() { $e = new stdClass(); $e->success = false; $e->order = new stdClass(); if (false == $this->request->isPost) { return $this->renderJson($e); } // 当前操作的ID $interviewId = (int)$this->request->post('id'); $findInterviewComment = RepairOrderInterviewCommentModel::findOne(["id" => $interviewId]); // $result = $findInterviewComment->delete(); $findInterviewComment->is_deleted = 1; $result = $findInterviewComment->save(); if ($result) { $e->success = true; } return $this->renderJson($e); } /** * 提交问卷调查 */ public function actionSubmitInterview() { $e = new stdClass(); $e->success = false; if (false == $this->request->isPost) { $e->msg = "必须为POST请求"; return $this->renderJson($e); } // 当前操作的订单 $orderId = (int)$this->request->post('orderId'); $order = RepairOrderModel::findOne(["id" => $orderId]); if (empty($order)) { $e->msg = "该订单不存在,请返回重试"; return $this->renderJson($e); } //问卷答案 $answers = $this->request->post('answers'); if (empty($answers)) { $e->msg = "回访答案不能为空"; return $this->renderJson($e); } $answersArr = json_decode($answers, true); if (is_null($answersArr)) { $e->msg = "回访答案格式有误"; return $this->renderJson($e); } $userId = Yii::$app->getUser()->getId(); //获取操作员ID $isFinished = $this->request->post('isFinished') ? 1 : 0; $score = $this->interviewScore($answersArr); $findInterview = RepairOrderInterviewModel::findOne(["repair_order_id" => $orderId]); if (empty($findInterview)) { $interview = new RepairOrderInterviewModel(); $interview->repair_order_id = $orderId; $interview->interview_result = $answers; $interview->system_user_id = $userId; $interview->interview_score = $score; $interview->is_finished = $isFinished; if ($interview->insert()) { $e->msg = "提交客户回访成功"; $e->success = true; return $this->renderJson($e); } else { $e->msg = "提交客户回访失败"; return $this->renderJson($e); } } else { $findInterview->repair_order_id = $orderId; $findInterview->interview_result = $answers; $findInterview->system_user_id = $userId; $findInterview->is_finished = $isFinished; $findInterview->interview_score = $score; $findInterview->updated_at = time(); if ($findInterview->save()) { $e->msg = "提交客户回访成功"; $e->success = true; return $this->renderJson($e); } else { $e->msg = "提交客户回访失败"; return $this->renderJson($e); } } } /** * 获取回访分数 * @param $answerArr * @return int */ private function interviewScore($answerArr) { $score = 0; if (!isset($answerArr['answers']) || empty($answerArr['answers'])) { return 0; } $answerArr = $answerArr['answers']; foreach($answerArr as $k => $v) { if(isset($v['服务评分'])){ $score = intval($v['服务评分']); break; } } return $score; } /** * 异常订单: 下单超过24小时的[待完成]订单 * @return string */ public function actionDelay() { $params = self::delayOrderList(); $params['orderStatusList'] = RepairOrderStatus::statusLabels(); // 加载订单状态信息 return $this->render('delay', $params); } /** * 非平台订单异常订单: 下单超过24小时的[待完成]订单 * @return string */ public function actionOwnerDelay() { $params = self::delayOrderList("", true); $params['orderStatusList'] = RepairOrderStatus::statusLabels(); // 加载订单状态信息 return $this->render('owner_delay', $params); } /** * 读取异常订单数量 * @return int|string */ protected function getDelayOrderNum($isOwner = false) { $orderQuery = new Query(); $orderQuery->select(['o.id', 'o.status', 'o.is_system_delete', 'o.created_at', 'o.is_suspend', 'rod.two_door_at']); $orderQuery->from('repair_order o'); $orderQuery->leftJoin('repair_order_detail rod', '`rod`.`repair_order_id` = `o`.`id`'); $orderQuery->Where(['or', // 超过24小时未完成 [ 'and', ['o.status' => [0, 1, 2, 3, 4, 5]], ['o.is_suspend' => [SuspendOrder::SUSPEND_STATUS_OFF, SuspendOrder::SUSPEND_STATUS_APPLYING]], ['<', 'o.created_at', time() - SysSettingModel::ONE_DAY_SECONDS], ['o.is_system_delete' => 0] ], // 已过了二次上门时间 [ 'and', ['o.status' => [0, 1, 2, 3, 4, 5]], ['o.is_suspend' => SuspendOrder::SUSPEND_STATUS_SUCCESS], ['<', 'rod.two_door_at', time()] ] ]); $orderQuery->andWhere('o.is_admin_close = 0'); // 过滤自有订单和转单 if ($isOwner) { $orderQuery->andWhere(['o.type' => [RepairOrderType::TYPE_PRIVATE, RepairOrderType::TYPE_FORWARD_TO_FRIEND, RepairOrderType::TYPE_FORWARD_TO_PLATFORM]]); } else { $orderQuery->andWhere(['o.type' => [RepairOrderType::TYPE_PLATFORM]]); } return $orderQuery->count(); } /** * 读取异常订单列表数据 * app-ht\modules\engineer\controllers\EngineerController.php actionDetails中有调用到此处方法 * @engineer_id string 工程师ID * @return array */ public static function delayOrderList($engineer_id = "", $isOwner = false) { $request = Yii::$app->request; /** * 组织SQL */ $orderQuery = new Query(); $expression = new Expression("(case o.repair_device_type when 1 then ow.name else '游客设备' end) as ownername"); $orderQuery->select(['o.id', 'o.status', 'o.order_no', 'o.pay_type', 'o.is_admin_close', 'o.is_user_close', 'o.is_engineer_close', 'o.is_system_delete', 'o.pay_price', 'o.pay_no', 'o.created_at', 'o.repair_device_name', 'o.repair_device_id', 'o.repair_device_type', 'o.is_suspend', 'u.name as nickname', 'u.phone', 'addr.address', 'o.repair_channel', 'concat(ep.firstname,ep.lastname) as engineer_name', $expression, 'roi.is_finished as interview_finished', 'rod.two_door_at', 'rota.device_status']); $orderQuery->from('repair_order o'); $orderQuery->leftJoin('repair_order_detail rod', '`rod`.`repair_order_id` = `o`.`id`'); $orderQuery->leftJoin('user u', '`u`.`id` = `o`.`user_id`'); $orderQuery->leftJoin('engineer_profile ep', 'ep.engineer_id = o.engineer_id'); $orderQuery->leftJoin('address addr', 'addr.id = o.address_id'); $orderQuery->leftJoin('user_device ud', 'ud.id = o.repair_device_id'); $orderQuery->leftJoin('owner ow', 'ud.owner_id=ow.id'); $orderQuery->leftJoin('repair_order_interview roi', 'roi.repair_order_id=o.id'); $orderQuery->leftJoin('repair_order_take_away rota', 'rota.repair_order_id = o.id'); $orderQuery->orderBy('order_no DESC'); $delayStatusArr = [ RepairOrderStatus::STATUS_WAIT_PICK, RepairOrderStatus::STATUS_WAIT_DOOR, RepairOrderStatus::STATUS_WAIT_PRICE, RepairOrderStatus::STATUS_CONFIRM_PRICE, RepairOrderStatus::STATUS_WAIT_ACCEPT, RepairOrderStatus::STATUS_WAIT_PAY ]; $where = ['or', // 超过24小时未完成 [ 'and', ['o.status' => $delayStatusArr], ['o.is_suspend' => [SuspendOrder::SUSPEND_STATUS_OFF, SuspendOrder::SUSPEND_STATUS_APPLYING]], ['<', 'o.created_at', time() - SysSettingModel::ONE_DAY_SECONDS], ['o.is_system_delete' => 0] ], // 已过了二次上门时间 [ 'and', ['o.status' => $delayStatusArr], ['o.is_suspend' => SuspendOrder::SUSPEND_STATUS_SUCCESS], ['<', 'rod.two_door_at', time()] ] ]; $orderQuery->Where($where); // 过滤自有订单和转单 if ($isOwner) { $orderQuery->andWhere(['o.type' => [RepairOrderType::TYPE_PRIVATE, RepairOrderType::TYPE_FORWARD_TO_FRIEND, RepairOrderType::TYPE_FORWARD_TO_PLATFORM]]); } else { $orderQuery->andWhere(['o.type' => [RepairOrderType::TYPE_PLATFORM]]); } /** 判断工程师不为空 将系统关闭的情况添加进异常订单 * 订单列表中的异常订单不加系统关闭异常订单的显示,只显示时间过长未处理的订单。 */ if (!empty($engineer_id) && $engineer_id > 0) { $orderQuery->orWhere(["o.status" => [RepairOrderStatus::STATUS_SYSTEM_CLOSE, RepairOrderStatus::STATUS_USER_CLOSE], 'o.is_system_delete' => 0]); } //判断工程师不为空的时候则查询某个工程师的异常订单 if (!empty($engineer_id) && $engineer_id > 0) { $orderQuery->andWhere('o.engineer_id=' . $engineer_id); } $orderQuery->andWhere('o.is_admin_close = 0'); /** * 分页处理 */ $pageSize = $request->get("pageSize") ? (int)$request->get("pageSize") : 20; $pages = new Pagination(['totalCount' => $orderQuery->count(), 'pageSize' => $pageSize]); $orderList = $orderQuery->offset($pages->offset)->limit($pages->limit)->all(); // 动态添加[报修设备详情链接地址] foreach ($orderList as &$itemRef) { if ($itemRef['repair_device_type'] == RepairOrderModel::REPAIR_DEVICE_USER_TYPE) { $itemRef['device_info_url'] = Url::toRoute(['/device/userdevice/info', 'id' => $itemRef['repair_device_id']]); } else { $itemRef['device_info_url'] = Url::toRoute(['/device/guestdevice/info', 'id' => $itemRef['repair_device_id']]); } $itemRef['is_take_away_label'] = RepairOrderTakeAwayModel::statusLabels($itemRef['device_status']); $itemRef['is_take_away'] = $itemRef['device_status']; } unset($itemRef); // 取消掉引用 return [ 'orderList' => $orderList, 'pages' => $pages, 'channels' => RepairOrderChannel::channelLabels(), ]; } /** 投诉用户和取消投诉 * @return string */ public function actionComplainEngineer() { $e = new stdClass(); $e->success = false; $req = Yii::$app->request; $engineerId = $req->post('engineerId'); $orderId = $req->post('orderId'); if (empty($engineerId)) { $e->msg = '工程师ID为空'; return $this->renderJson($e); } if (empty($orderId)) { $e->msg = '订单号为空'; return $this->renderJson($e); } $illegalRecord = EngineerIllegalRecordModel::findOne(['engineer_id' => $engineerId, 'repair_order_id' => $orderId, 'type' => EngineerIllegalRecordModel::COMPLAIN_TYPE]); if (!$illegalRecord) { $result = PunishEngineer::complainOrderPunish($engineerId, $orderId, PunishEngineer::ADMIN_OPERATOR); } else { if (0 == $illegalRecord->status) { $result = PunishEngineer::updateComplainOrderPunish($engineerId, $orderId, PunishEngineer::ADMIN_OPERATOR); } else { $result = PunishEngineer::cancelComplain($engineerId, $orderId, PunishEngineer::ADMIN_OPERATOR); } } if ($result) { $e->success = true; return $this->renderJson($e); } else { $e->msg = '提交失败'; return $this->renderJson($e); } } /** 跳单 * @return string */ public function actionJumper() { $e = new stdClass(); $e->success = false; $req = Yii::$app->request; $engineerId = $req->post('engineerId'); $orderId = $req->post('orderId'); if (empty($engineerId)) { $e->msg = '工程师ID为空'; return $this->renderJson($e); } if (empty($orderId)) { $e->msg = '订单号为空'; return $this->renderJson($e); } $illegalRecord = EngineerIllegalRecordModel::findOne(['engineer_id' => $engineerId, 'repair_order_id' => $orderId, 'type' => EngineerIllegalRecordModel::ESCAPE_TYPE]); if (!$illegalRecord) { $result = PunishEngineer::addJumper($illegalRecord, $engineerId, $orderId); } else { if (0 == $illegalRecord->status) { $result = PunishEngineer::addJumper($illegalRecord, $engineerId, $orderId); } else { $result = PunishEngineer::cancelJumper($illegalRecord); } } if ($result) { $e->success = true; return $this->renderJson($e); } else { $e->msg = '提交失败'; return $this->renderJson($e); } } /** 更改订单电话 * @return string * @throws \yii\db\Exception */ public function actionChangeContactPhone() { $e = new stdClass(); $e->success = false; $req = Yii::$app->request; $orderUUId = $req->post('orderId'); $newPhone = $req->post('phone'); if (empty($orderUUId)) { $e->msg = '订单ID为空'; return $this->renderJson($e); } if (!Utils::isPhone($newPhone)) { $e->msg = '手机号码不合格'; return $this->renderJson($e); } $orderModel = RepairOrderModel::findOne(['uuid' => $orderUUId]); if (empty($orderModel)) { $e->msg = '订单为空'; return $this->renderJson($e); } $orderDetail = $orderModel->detail; if ($newPhone == $orderDetail->contact_phone) { $e->msg = '修改的号码和原来的一样!'; return $this->renderJson($e); } $transaction = Yii::$app->db->beginTransaction(); try { $orderDetail->contact_phone = $newPhone; $orderDetail->save(); $PMRecordModel = PrivateNumberBindRecordModel::find(); $PMRecordModel->where(['order_id' => $orderModel->id, 'is_main' => 1]); $records = $PMRecordModel->all(); foreach ($records as $record) { $result = PrivateNumberBindRecord::releaseBindPhone($orderModel->id, PrivateNumberBindRecord::FROM_ADMIN, '换联系手机', $record->call_type); } // 记录操作日志 $repairOrderLog = new RepairOrderLogModel(); $repairOrderLog->repair_order_id = $orderModel->id; $repairOrderLog->operator_id = Yii::$app->user->id; $repairOrderLog->operator_type = RepairOrderLogModel::OPERATOR_TYPE_ADMIN; $repairOrderLog->content = "后台管理员修改订单联系号码(手机号码:{$newPhone})"; $repairOrderLog->log_at = time(); $repairOrderLog->insert(); $transaction->commit(); $e->success = true; $e->msg = '修改成功'; return $this->renderJson($e); } catch (Exception $exception) { Yii::getLogger()->log($exception->getMessage(), Logger::LEVEL_ERROR); $transaction->rollBack(); $e->msg = '修改失败'; return $this->renderJson($e); } } /** 重新绑定隐私号码,客户可以在质保期外联系工程师 * @return stdClass|string */ public function actionBindUserConsult() { $e = new stdClass(); $e->success = false; $req = Yii::$app->request; $orderId = $req->post('orderId'); // 只需修改一下过期时间即可 $orderModel = RepairOrderModel::findOne(['id' => $orderId]); if (empty($orderModel)) { $e->error = '未找到对应订单'; return $this->renderJson($e); } $orderDetail = $orderModel->detail; if (!$orderDetail) { $e->error = '订单详情未生成'; return $this->renderJson($e); } $orderDetail->appeal_expired_time = time() + PrivateNumberBindRecord::USER_CONSULT_HOLD; $saveResult = $orderDetail->save(); if (!$saveResult) { $e->error = '绑定失败,联系系统管理员'; return $this->renderJson($e); } $e->success = true; $e->error ='成功绑定'; return $this->renderJson($e); } /** * @return string */ public function actionBindEngineerConsult() { $e = new stdClass(); $e->success = false; $req = Yii::$app->request; $orderId = $req->post('orderId'); // 只需修改一下过期时间即可 $orderModel = RepairOrderModel::findOne(['id' => $orderId]); if (empty($orderModel)) { $e->error = '未找到对应订单'; return $this->renderJson($e); } $orderDetail = $orderModel->detail; if (!$orderDetail) { $e->error = '订单详情未生成'; return $this->renderJson($e); } $orderDetail->engineer_consult_expired = time() + PrivateNumberBindRecord::ENGINEER_CONSULT_HOLD; $saveResult = $orderDetail->save(); if (!$saveResult) { $e->error = '绑定失败,联系系统管理员'; return $this->renderJson($e); } $e->success = true; $e->error ='成功绑定'; return $this->renderJson($e); } /** 开票页面 * @return string */ public function actionOpenInvoice() { $req = Yii::$app->request; $orderUUId = $req->get('orderId'); $params = [ 'id' => $orderUUId ]; return $this->render('openInvoice', $params); } /** 开票接口 * @return string * @throws \yii\base\ErrorException */ public function actionDoOpenInvoice() { $e = new stdClass(); $e->success = false; $req = Yii::$app->request; $orderUUId = $req->post('orderId'); $type = $req->post('type'); $head = $req->post('head'); $systemUserId = Yii::$app->user->getId(); $taxpayer_id_number = $req->post('taxpayer_id_number'); $email = $req->post('email'); $remark = $req->post('remark'); $register_address = $req->post('register_address'); $register_tel = $req->post('register_tel'); $bank = $req->post('bank'); $bank_account = $req->post('bank_account'); $postAmount = $req->post('amount'); $orderNos = $req->post('order_nos'); $orderModel = RepairOrderModel::findOne(['uuid' => $orderUUId]); if (empty($head)) { $e->error = '抬头必填'; return $this->renderJson($e); } if (empty($taxpayer_id_number) && InvoiceApi::INVOICE_TYPE_COMPANY == $type) { $e->error = '公司类型的必填纳税人识别码'; return $this->renderJson($e); } if (!Utils::isEmail($email)) { $e->error = '邮箱不合格'; return $this->renderJson($e); } if (empty($orderModel)) { $e->error = '暂无该订单'; return $this->renderJson($e); } $orderDetail = $orderModel->detail; if (empty($orderDetail)) { $e->error = '暂无该订单'; return $this->renderJson($e); } if ($orderModel->status == RepairOrderStatus::STATUS_WAIT_PICK) { $e->error = '订单未发生维修无法开票'; return $this->renderJson($e); } if (empty($orderDetail['pay_at'])) { if (empty($postAmount)) { $e->error = '该订单未支付,并且未录入开票金额'; return $this->renderJson($e); } } else { if (empty($orderModel['pay_price'])) { $e->error = '该订单支付金额未0,无法开票'; return $this->renderJson($e); } } if ( 1 == $orderModel->is_invoice_open) { $e->error = '该订单已开过单子发票'; return $this->renderJson($e); } $amount = $orderModel->pay_price; if ($postAmount > 0) { $amount = $postAmount; } $invoiceOrderIDs = $this->getOrderUUIDs($orderNos, $orderModel->uuid, $orderModel->user_id); $info = [ 'user_id' => $orderModel->user_id, 'type' => $type, 'head' => $head, 'taxpayer_id_number' => $taxpayer_id_number, 'email' => $email, 'remark' => $remark, 'register_address' => $register_address, 'register_tel' => $register_tel, 'bank' => $bank, 'bank_account' => $bank_account, 'amount' => $amount, 'selectOrders' => $invoiceOrderIDs ]; $result = Invoice::createInvoice($info, $systemUserId, InvoiceLog::OPERATOR_ADMIN); $e = $result; return $this->renderJson($e); } /** * 获取开票的UUID * @param $orderNos * @param $currOrderUUID * @return array */ private function getOrderUUIDs($orderNos, $currOrderUUID, $userId) { if (empty(trim($orderNos)) && empty($currOrderUUID)) { return []; } if (empty(trim($orderNos)) && !empty($currOrderUUID)) { return [$currOrderUUID]; } $orderNos = str_replace(',', ',', $orderNos); $orderNos = explode(',',$orderNos); $orderNoArr = []; foreach($orderNos as $k => $v){ $orderNoArr[] = $v; } $repairOrderModelFind = RepairOrderModel::find(); $repairOrderModelFind->where(['order_no' => $orderNoArr, 'is_invoice_open' => 0, 'user_id' => $userId]); $repairOrderModelFind->andWhere(['>', 'pay_price', 0]); $repairOrderModelFind->asArray(); $orders = $repairOrderModelFind->all(); $orderUUidArr = []; foreach ($orders as $k => $v) { $orderUUidArr[] = $v['uuid']; } $orderUUidArr[] = $currOrderUUID; $orderUUidArr = array_unique($orderUUidArr); return $orderUUidArr; } /** * 检测是否免上门费 */ public function actionCheckDoorFee() { $e = new stdClass(); $e->success = false; $e->msg = "该订单不免上门费"; $orderId = Yii::$app->request->get("order_id"); if (empty($orderId)) { $e->msg = "缺少必要参数"; return $this->renderJson($e); } $repairOrder = RepairOrderModel::findOne($orderId); if (empty($repairOrder)) { $e->msg = "该订单编号对应的订单不存在"; return $this->renderJson($e); } if ($repairOrder->is_system_delete == 1) { $e->msg = "该订单已经被删除"; return $this->renderJson($e); } $userId = $repairOrder->user_id; // 判断订单是否免上门费 if ($repairOrder->is_on_site == 1 && $repairOrder->door_fee == 0) { $e->success = true; $e->msg = "该订单免上门费"; return $this->renderJson($e); } else { // 1. 判断客户上一单的支付时间和本单的下单时间是否在六小时以内 $repairOrderPrev = RepairOrderModel::find()->where(['user_id' => $userId])->andWhere("created_at <= " . $repairOrder->created_at)->andWhere("id <> " . $repairOrder->id)->orderBy("created_at desc")->one(); if ($repairOrderPrev) { if (isset($repairOrderPrev->detail->pay_at) && empty($repairOrderPrev->detail->pay_at)) { $e->msg = "客户上一单未完成支付"; return $this->renderJson($e); } elseif (isset($repairOrderPrev->detail->pay_at) && $repairOrderPrev->detail->pay_at >= $repairOrder->created_at) { $e->msg = "客户上一单完成支付时间在本单下单之后"; return $this->renderJson($e); } elseif (isset($repairOrderPrev->detail->pay_at) && (($repairOrder->created_at - $repairOrderPrev->detail->pay_at)/3600) >= 6) { $e->msg = "客户本单下单时间和上次订单支付时间的间隔大于6小时"; return $this->renderJson($e); } if ($repairOrderPrev->engineer_id != $repairOrder->engineer_id) { $e->msg = "客户上次下单接单工程师和本次下单接单工程师不是同一个人"; return $this->renderJson($e); } } else { $e->msg = "该订单客户只下过本订单"; return $this->renderJson($e); } // 2. 判断客户工程师接单距离是否是否在设置的公里以内 if (isset($repairOrder->detail->pick_order_distance) && $repairOrder->detail->pick_order_distance >= OnsiteOrder::LIMIT_DISTANCE) { $e->msg = "工程师接单距离大于免上门费设置的距离(" . OnsiteOrder::LIMIT_DISTANCE . "米)"; return $this->renderJson($e); } // 3. 判断工程师接单时间是否在5分钟以内 if (isset($repairOrder->detail->pick_at) && ($repairOrder->detail->pick_at - $repairOrder->created_at) > 360) { $e->msg = "工程师接单时间超过5分钟"; return $this->renderJson($e); } } return $this->renderJson($e); } /** * 自有/转单订单首页 * @return string */ public function actionOwnerIndex() { $request = Yii::$app->request; $params = RepairOrderRepository::getOrderList($request, false, true); $orderStatusList = RepairOrderStatus::statusLabels(); //加载订单状态信息 $params['orderStatusList'] = $orderStatusList; $params['sysUserList'] = SysUserRepository::getCustomerList(); $params['delayOrderNum'] = $this->getDelayOrderNum(true); $params['search_engineer_count'] = self::SEARCH_ENGINEER_COUNT; $params["citys"] = RegionFeeSettingModel::find()->all(); $params['thank_fee_list'] = ThankFee::htFilterLabels(); $params['repair_channels'] = RepairOrderChannel::channelLabels(); return $this->render('owner_index', $params); } /** * 自有/转单订单详情页 * @return string */ public function actionOwnerInfo() { return $this->goOrderInfo("owner_info"); } /** * 导出订单数据 * @return string */ public function actionExportOwnerDa() { $request = Yii::$app->request; $params = RepairOrderRepository::getOrderList($request, true, true); return $this->renderPartial("exportDa", $params); } /** * 跳转到订单详情 * @param string $view * @return string */ private function goOrderInfo($view = "info") { $request = Yii::$app->request; $id = intval($request->get('id')); $user_id = Yii::$app->user->getId(); $order_status = empty($request->get('order_status')) ? "" : intval($request->get('order_status')); // 当前查看订单状态 $params = array(); $orderResult = RepairOrderRepository::getRepairInfoById($id); //加载订单信息 $orderStatusList = RepairOrderStatus::statusLabels(); //加载订单状态信息 $repairOrderUserSelectFaults = new RepairOrderUserSelectFaultsModel(); $userSelectFault = $repairOrderUserSelectFaults->getUserSelectFaultByOrderId($id); //读取用户选择的故障标签 $imgList = $repairOrderUserSelectFaults->getRepairFaultImgByOrderId($id); //读取用户拍的故障设备照片 $repairOrderRepairPlans = new RepairOrderRepairPlansModel(); if ($view == "owner_info") { $repairOrderPlansList = $repairOrderRepairPlans->getOwnerRepairOrderPlans($id);//读取工程师故障定位报价 } else { $repairOrderPlansList = $repairOrderRepairPlans->getRepairOrderPlans($id);//读取工程师故障定位报价 } $logList = RepairOrderLogModel::find()->where(["repair_order_id" => $id])->asArray()->all(); // 日志操作人类型:0用户、1工程师、2管理员 $data = array(); foreach ($logList as $log) { $tmp = array(); $tmp['log_at'] = $log['log_at']; $tmp['content'] = $log['content']; if ($log['operator_type'] == RepairOrderLogModel::OPERATOR_TYPE_USER) { $user = UserRepository::getUserById(intval($log['operator_id'])); if (!empty($user)) { $tmp['operator_user'] = "客户-" . $user['name']; } } else if ($log['operator_type'] == RepairOrderLogModel::OPERATOR_TYPE_ENGINEER) { $user = EngineerProfileModel::findOne(["engineer_id" => intval($log['operator_id'])]); if (!empty($user)) { $tmp['operator_user'] = "工程师-" . $user['firstname'] . $user['lastname']; } } else if ($log['operator_type'] == RepairOrderLogModel::OPERATOR_TYPE_ADMIN) { $user = SysUserProfileModel::findOne(["sys_user_id" => intval($log['operator_id'])]); if (!empty($user)) { $tmp['operator_user'] = "管理员-" . $user['realname']; } } else if ($log['operator_type'] == RepairOrderLogModel::OPERATOR_TYPE_SYSTEM) { $tmp['operator_user'] = "系统"; } $tmp['operator_user'] = empty($tmp['operator_user']) ? "" : $tmp['operator_user']; $data[] = $tmp; } $illegalRecords = $this->getEngineerIllegalRecords($orderResult['engineer_id'], $orderResult['id']); $orderResult['owner'] = '暂无'; if ($orderResult && isset($orderResult['repair_device_id'])) { $owner = RepairOrderRepository::getDeviceOwner($orderResult['repair_device_id'], $orderResult['repair_device_type']); if ($owner) $orderResult['owner'] = $owner['uname']; } // 报修设备详情链接地址 if ($orderResult['repair_device_type'] == RepairOrderModel::REPAIR_DEVICE_USER_TYPE) { $orderResult['device_info_url'] = Url::toRoute(['/device/userdevice/info', 'id' => $orderResult['repair_device_id']]); } else { $orderResult['device_info_url'] = Url::toRoute(['/device/guestdevice/info', 'id' => $orderResult['repair_device_id']]); } $orderResult['is_take_away'] = false; // 获取设备申请带走记录 $repairOrderTakeAwayRecord = RepairOrderTakeAwayModel::findOne(['repair_order_id' => $id]); if ($repairOrderTakeAwayRecord && isset($repairOrderTakeAwayRecord->device_status) && $repairOrderTakeAwayRecord->device_status == RepairOrderTakeAwayModel::STATUS_ACEPT_TAKE_AWAY) { $orderResult['is_take_away'] = true; } $orderResult['is_take_away_label'] = RepairOrderTakeAwayModel::statusLabels(isset($repairOrderTakeAwayRecord->device_status) ? $repairOrderTakeAwayRecord->device_status : 0); // 调查问卷问题 $findModel = RepairOrderInterviewQuestionsModel::find()->where("is_deleted=0"); $questionList = $findModel->offset(0)->limit(20)->where("is_deleted=0")->orderBy("sort_order asc")->asArray()->all(); foreach ($questionList as $key => $item) { $options = RepairOrderInterviewOptionsModel::find()->where("question_id =" . $item['id'])->orderBy("sort_order asc")->all(); $questionList[$key]["options"] = $options; } // 问卷调查结果 $interview = RepairOrderInterviewModel::findOne(["repair_order_id" => $id]); if ($interview) { $interview_result = json_decode($interview->interview_result, true); $params['interview_result'] = $interview_result["answers"]; $params['is_finished'] = $interview->is_finished; } $distanceSubsidyIncomeModel = EngineerSubsidyIncomeModel::findOne(['type' => EngineerSubsidySettingsModel::DISTANCE_SUBSIDY, 'repair_order_id' => $id]); if ($distanceSubsidyIncomeModel) { $distanceSubsidyIncome = $distanceSubsidyIncomeModel->amount; } else { $distanceSubsidyIncome = 0; } // 评论列表 $query = RepairOrderInterviewCommentModel::find() ->select('a.*, su.username, sup.realname') ->from(RepairOrderInterviewCommentModel::tableName() . 'a') ->leftJoin(SysUserModel::tableName() . 'su', "a.user_id = su.id") ->leftJoin(SysUserProfileModel::tableName() . 'sup', "sup.sys_user_id = su.id") ->andWhere(['=', 'a.repair_order_id', $id]) ->andWhere(['=', 'a.is_deleted', 0]); $findInterviewComment = $query->asArray()->all(); if ($findInterviewComment) { $params['interview_comment'] = $findInterviewComment; } if ($view == "owner_info") { // 自有订单详情 $orderResult['employ_fee'] = "无"; $commission = []; $orderResult['forward_income'] = 0; $orderResult['engineer_income'] = $orderResult['pay_price']; $commissionSetting = RepairOrderCommissionSettingRepository::findOne(['repair_order_id' => $orderResult['id']]); if ($commissionSetting) { $commissionDesc = RepairOrderCommissionSettingRepository::getForwardOrderInfo($commissionSetting->type, $commissionSetting->amount); $commission['type_desc'] = $commissionDesc; $commission['remark'] = $commissionSetting->remark; $commission['engineer_name'] = ''; $engineerProfile = EngineerProfileModel::findOne(['engineer_id' => $orderResult['owner_engineer_id']]); if ($engineerProfile) { $commission['engineer_name'] = $engineerProfile->firstname. $engineerProfile->lastname; } $orderResult['forward_income'] = RepairOrderCommissionSetting::calForwardIncome( $orderResult['id'], (float)$orderResult['cost_price'], (float)$orderResult['pay_price']); $orderResult['engineer_income'] = $orderResult['pay_price'] - $orderResult['forward_income']; } $params['commission'] = $commission; } else { // 平台订单详情,重新计算保修天数 foreach ($repairOrderPlansList as $k => $item) { $repairOrderPlansList[$k]["warranty"] = WarrantyLevelRule::getHistoryWarrantyLevelDesc($item['warranty_days'], $item['warranty_pages']); } $orderResult['reBindPhone'] = false; $orderResult['reBindEngineerPhone'] = false; $longWarrantDays = $orderResult['warranty_days']; // 过了最长质保周期的判断 $warrantyResult = RepairOrderAppealModel::checkInWarrantyCycle($orderResult['accept_at'], $longWarrantDays); if ($orderResult['accept_at'] > 0 && !$warrantyResult) { $orderResult['reBindPhone'] = true; } // 工程师端可以显示绑定号码判断 if ($orderResult['accept_at'] > 0 && $warrantyResult) { $orderResult['reBindEngineerPhone'] = true; } } // 客户来源(后台或工程师下单) $repairOrderCliam = RepairOrderClaimModel::findOne(['repair_order_id' => $id]); $params['agent_id'] = -1; $params['call_phone'] = ""; if ($repairOrderCliam) { $params['agent_id'] = $repairOrderCliam->agent_id; $params['call_phone'] = $repairOrderCliam->call_phone; } $params['order'] = $orderResult; $params['orderStatusList'] = $orderStatusList; $params['userSelectFault'] = $userSelectFault; $params['imgList'] = $imgList; $params['repairOrderPlansList'] = $repairOrderPlansList; $params['logList'] = $data; $params['questionList'] = $questionList; $params['order_status'] = $order_status; $params['order_rate'] = RepairOrderRateModel::findOne(['repair_order_id' => $id]); $params['channels'] = RepairOrderChannel::channelLabels(); $params['rate_tags'] = RepairOrderRateTagModel::getRateTagsByRepairOrderId($id); $params['complainIllegal'] = $illegalRecords['complainIllegal']; $params['jumperIllegal'] = $illegalRecords['jumperIllegal']; $params['distanceSubsidyIncome'] = $distanceSubsidyIncome; $params['user_id'] = $user_id; $params['has_pay'] = RepairOrderStatus::hasPay($orderResult['status']); // 订单是否已支付 $params['isSupperRole'] = SysUserRepository::isSupperRole($user_id); return $this->render($view, $params); } /** * @return string */ public function actionJustCloseOrder() { $request = Yii::$app->request; $orderId = intval($request->post('orderId')); $e = new stdClass(); $e->success = false; $sysUserId = Yii::$app->user->getId(); $repairOrderModel = RepairOrderRepository::findOne($orderId); if (!$repairOrderModel) { $e->message = '未找到该订单'; return $this->renderJson($e); } $note = '管理员再次关闭订单'; $closeResult = AdminCloseOrder::closeOrderStatus($repairOrderModel, $sysUserId, $note); if ($closeResult) { $e->success = true; } else { $e->message = '订单关闭失败'; } return $this->renderJson($e); } }