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);
}
}