WorkOrderController.php 9.52 KB
<?php

namespace app\ht\modules\trade\controllers;

use Yii;
use app\ht\controllers\BaseController;
use common\models\EngineerProfile               as EngineerProfileModel;
use common\models\SysUserProfile                as SysUserProfileModel;
use common\models\RegionFeeSetting              as RegionFeeSettingModel;
use domain\user\UserRepository;
use domain\trade\workorder\WorkOrder;
use domain\trade\workorder\WorkOrderLog;
use domain\trade\workorder\models\WorkOrderLog  as WorkOrderLogModel;
use domain\trade\workorder\models\WorkOrderEngineers as WorkOrderEngineersModel;
use domain\trade\workorder\WorkOrderStatus;
use domain\trade\workorder\models\WorkOrder     as WorkOrderModel;
use yii\data\Pagination;
use function strtotime;

class WorkOrderController extends BaseController
{
    public function actionIndex()
    {
        $result = $this->getDataList();
        $dataList = $result["dataList"];
        $pages = $result["pages"];
        $get = $result["get"];

        return $this->render('index', array(
            'orderList'       => $dataList,
            'pages'         => $pages,
            'gets'          => $get,
            'citys'         => RegionFeeSettingModel::find()->all(),
            'statusLabels'  => WorkOrderStatus::labels(),
        ));
    }

    public function actionExportDa()
    {
        $result = $this->getDataList();
        $dataList = $result["dataList"];
        $pages = $result["pages"];
        $get = $result["get"];

        return $this->renderPartial('exportDa', array(
            'orderList'     => $dataList,
            'pages'         => $pages,
            'gets'          => $get
        ));
    }

    public function actionInfo()
    {
        $result = Yii::$app->request;
        $id = $result->get("id");
        $info = WorkOrderModel::find()
            ->select([
                'wo.*',
                'e.phone',
                'ep.nickname',
                'concat(ep.firstname, ep.lastname) as realname',
                '(select count(woe.id) from work_order_engineers woe where woe.work_order_id = wo.id) as pickcont'
            ])
            ->alias("wo")
            ->orderBy('wo.id DESC')
            ->leftJoin('engineer e', "e.id = wo.engineer_id")
            ->leftJoin('engineer_profile ep', "e.id = ep.engineer_id")
            ->where('wo.id = ' . $id)->asArray()->one();
        $logList = WorkOrderLogModel::find()->where(["work_order_id" => $id])->asArray()->all();
        // 日志操作人类型:0用户、1工程师、2管理员
        $logs = array();
        foreach ($logList as $log) {
            $tmp = array();
            $tmp['log_at'] = $log['log_at'];
            $tmp['content'] = $log['content'];

            if ($log['operator_type'] == WorkOrderLogModel::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'] == WorkOrderLogModel::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'] == WorkOrderLogModel::OPERATOR_TYPE_SYSTEM) {
                $tmp['operator_user'] = "系统";
            }

            $tmp['operator_user'] = empty($tmp['operator_user']) ? "" : $tmp['operator_user'];
            $logs[] = $tmp;
        }

        $engineerInfo = WorkOrderEngineersModel::find()->alias("wo")
            ->select([
                'wo.*',
                'e.phone',
                'ep.nickname',
                'concat(ep.firstname, ep.lastname) as realname'
            ])
            ->alias("wo")
            ->orderBy('wo.id DESC')
            ->leftJoin('engineer e', "e.id = wo.engineer_id")
            ->leftJoin('engineer_profile ep', "e.id = ep.engineer_id")
            ->where('wo.work_order_id = ' . $id)->asArray()->all();

        return $this->render('info', array(
            'order'       => $info,
            'logs'       => $logs,
            'engineers'  => $engineerInfo
        ));
    }

    /**
     * 获取工单数据
     * @param bool $isExport
     * @return array
     */
    public function getDataList($isExport = false)
    {
        $request = Yii::$app->request;

        $orderNo = $request->get('order_no'); // 工单号
        $employType = $request->get('employ_type'); // 用工类型
        $address = $request->get('address'); // 用工地址
        $engineerName = $request->get('engineer_name'); // 工程师手机号或名称
        $status = $request->get('status'); // 工单状态
        $timeStart = $request->get('time_start');
        $endStart = $request->get('time_end');
        $selcity = $request->get('selcity');

        /**
         * 查询过滤处理
         */
        $get = [];
        $get['order_no'] = empty($orderNo) ? "" : $orderNo;
        $get['employ_type'] = empty($employType) ? "" : $employType;
        $get['address'] = empty($address) ? "" : $address;
        $get['engineer_name'] = empty($engineerName) ? "" : $engineerName;
        $get['status'] = empty($status) ? "" : $status;
        $get['time_start'] = empty($timeStart) ? "" : $timeStart;
        $get['time_end'] = empty($endStart) ? "" : $endStart;
        $get['selcity'] = empty($selcity) ? "" : $selcity;

        $query = WorkOrderModel::find()
            ->select([
                'wo.*',
                'e.phone',
                'ep.nickname',
                'concat(ep.firstname, ep.lastname) as realname',
                '(select count(woe.id) from work_order_engineers woe where woe.work_order_id = wo.id) as pickcont'
            ])
            ->alias("wo")
            ->orderBy('wo.id DESC')
            ->leftJoin('engineer e', "e.id = wo.engineer_id")
            ->leftJoin('engineer_profile ep', "e.id = ep.engineer_id");

        if ($orderNo) {
            $query->andWhere(['like', 'wo.order_no', $orderNo]);
        }
        if (!empty($timeStart)) {
            $query->andWhere(['>=', 'wo.created_at', strtotime($timeStart)]);
        }
        if (!empty($endStart)) {
            $query->andWhere(['<=', 'wo.created_at', strtotime($endStart) + 86400]); // 多一天
        }
        if (!empty($employType)) {
            $query->andWhere(['=', 'wo.employ_type', $employType]);
        }
        if (!empty($selcity)) {
            $query->andWhere(['=', 'wo.city', $selcity]);
        }
        if (!empty($address)) {
            $query->andFilterWhere(['or', ['like', 'wo.address_title', $address], ['like', 'wo.address', $address]]);
        }
        if (!empty($status)) {
            $query->andWhere(['=', 'wo.status', $status]);
        }
        if (!empty($engineerName)) {
            $query->andFilterWhere(['or', ['like', 'e.phone', $engineerName], ['like', 'ep.nickname', $engineerName], ['like', 'concat(ep.firstname, ep.lastname)', $engineerName]]);
        }

        if ($isExport) {
            $pages = null;
            $model = $query->asArray()->all();
        } else {
            /**
             * 分页处理
             */
            $pageSize = $request->get("pageSize") ? (int)$request->get("pageSize") : 20;
            $pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => $pageSize]);
            $query->offset($pages->offset)->limit($pages->limit);
            $model = $query->asArray()->all();
        }
        return [
            "pages" => $pages,
            "dataList" => $model,
            "get" => $get
        ];

    }

    /**
     * 执行操作进行备注
     * @return string
     */
    public function actionDoUpdateRemark()
    {
        $post = Yii::$app->request->post();
        $id = $post['id'];
        $remark = $post['remark'];

        $mRepairOrder = WorkOrderModel::findOne(["id" => intval($id)]);
        $mRepairOrder->remark = $remark;
        $mRepairOrder->updated_at = time();
        $result = $mRepairOrder->save();

        // 记录操作日志
        $repairOrderLog = new WorkOrderLogModel();
        $repairOrderLog->work_order_id = $id;
        $repairOrderLog->operator_id = Yii::$app->user->id;
        $repairOrderLog->operator_type = WorkOrderLogModel::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);
    }

    /**
     * 后台关闭工单
     */
    public function actionCloseWorkOrder()
    {
        $post = Yii::$app->request->post();
        $id = $post['id'];
        $msg = array();
        if (empty($id)) {
            $msg['status'] = 0;
            $msg['msg'] = "工单编号不能为空";
        }
        $mOrder = WorkOrderModel::findOne(["id" => intval($id)]);
        if (empty($mOrder)) {
            $msg['status'] = 0;
            $msg['msg'] = "工单不存在";
        }
        $opResult = WorkOrder::adminClose($mOrder, Yii::$app->user->id);
        if ($opResult) {
            $msg['status'] = 1;
            $msg['msg'] = "工单关闭成功";
        } else {
            $msg['status'] = 0;
            $msg['msg'] = "工单关闭失败";
        }
        return $this->renderJson($msg);
    }

}