|
|
<?php
|
|
|
|
|
|
namespace app\admin\controller;
|
|
|
|
|
|
use app\admin\model\User;
|
|
|
use app\api\controller\v1\WxxcxPush;
|
|
|
use app\common\controller\Backend;
|
|
|
use think\Db;
|
|
|
use app\api\controller\Index;
|
|
|
use think\exception\DbException;
|
|
|
use think\exception\PDOException;
|
|
|
use think\exception\ValidateException;
|
|
|
|
|
|
/**
|
|
|
* 订单管理
|
|
|
*
|
|
|
* @icon fa fa-circle-o
|
|
|
*/
|
|
|
class Dispatch extends Backend
|
|
|
{
|
|
|
|
|
|
/**
|
|
|
* Order模型对象
|
|
|
* @var \app\admin\model\Order
|
|
|
*/
|
|
|
protected $model = null;
|
|
|
|
|
|
public function _initialize()
|
|
|
{
|
|
|
parent::_initialize();
|
|
|
$this->model = new \app\admin\model\Order;
|
|
|
$this->view->assign("isPayList", $this->model->getIsPayList());
|
|
|
$this->view->assign("typeList", $this->model->gettypeList());
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
|
|
|
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
|
|
|
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
|
|
|
*/
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 查看
|
|
|
*/
|
|
|
public function index()
|
|
|
{
|
|
|
//当前是否为关联查询
|
|
|
$this->relationSearch = true;
|
|
|
//设置过滤方法
|
|
|
$this->request->filter(['strip_tags', 'trim']);
|
|
|
if ($this->request->isAjax()) {
|
|
|
//如果发送的来源是Selectpage,则转发到Selectpage
|
|
|
if ($this->request->request('keyField')) {
|
|
|
return $this->selectpage();
|
|
|
}
|
|
|
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
|
|
|
|
|
$list = $this->model
|
|
|
->with(['driver', 'car', 'user'])
|
|
|
->where($where)
|
|
|
->where("order.driver_id",null)
|
|
|
->where("order.is_pay",1)
|
|
|
->order($sort, $order)
|
|
|
->paginate($limit);
|
|
|
$res=$this->model->where("id",">",0)->update(["is_check"=>1]);
|
|
|
foreach ($list as $row) {
|
|
|
$row->visible(['id', 'order_no','phone', 'type','intended_driver_id', 'pay_type', 'price', 'is_pay', 'user_name', 'driver_name', 'pay_time', 'refund_time','reservation_time', 'create_time']);
|
|
|
if(!$row['driver_name']){
|
|
|
$row['driver_name']="未选择司机";
|
|
|
}
|
|
|
$row->visible(['driver']);
|
|
|
$row->getRelation('driver')->visible(['name']);
|
|
|
$row->visible(['car']);
|
|
|
$row->getRelation('car')->visible(['license_plate']);
|
|
|
$row->visible(['user']);
|
|
|
$row->getRelation('user')->visible(['username']);
|
|
|
}
|
|
|
|
|
|
$result = array("total" => $list->total(), "rows" => $list->items());
|
|
|
|
|
|
return json($result);
|
|
|
}
|
|
|
return $this->view->fetch();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 查看
|
|
|
*/
|
|
|
public function dispatch()
|
|
|
{
|
|
|
//当前是否为关联查询
|
|
|
$this->relationSearch = true;
|
|
|
//设置过滤方法
|
|
|
$this->request->filter(['strip_tags', 'trim']);
|
|
|
if ($this->request->isAjax()) {
|
|
|
//如果发送的来源是Selectpage,则转发到Selectpage
|
|
|
if ($this->request->request('keyField')) {
|
|
|
return $this->selectpage();
|
|
|
}
|
|
|
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
|
|
|
|
|
$list = $this->model
|
|
|
->with(['driver', 'car', 'user'])
|
|
|
->where($where)
|
|
|
->order($sort, $order)
|
|
|
->paginate($limit);
|
|
|
$res=$this->model->where("id",">",0)->update(["is_check"=>1]);
|
|
|
foreach ($list as $row) {
|
|
|
$row->visible(['id', 'order_no','phone', 'type','intended_driver_id', 'pay_type', 'price', 'is_pay', 'user_name', 'driver_name', 'pay_time', 'refund_time','reservation_time', 'create_time']);
|
|
|
if(!$row['driver_name']){
|
|
|
$row['driver_name']="未选择司机";
|
|
|
}
|
|
|
$row->visible(['driver']);
|
|
|
$row->getRelation('driver')->visible(['name']);
|
|
|
$row->visible(['car']);
|
|
|
$row->getRelation('car')->visible(['license_plate']);
|
|
|
$row->visible(['user']);
|
|
|
$row->getRelation('user')->visible(['username']);
|
|
|
}
|
|
|
|
|
|
$result = array("total" => $list->total(), "rows" => $list->items());
|
|
|
|
|
|
return json($result);
|
|
|
}
|
|
|
return $this->view->fetch('order/dispatch');
|
|
|
}
|
|
|
|
|
|
public function refund($id)
|
|
|
{
|
|
|
|
|
|
//查询订单
|
|
|
$order = Db::name("order")->where("id", $id)->find();
|
|
|
if ($order['is_pay'] != 1) {
|
|
|
$this->error("该订单无法退款");
|
|
|
}
|
|
|
if($order['pay_type']=="offlinepay" || $order['pay_type']=="background"){
|
|
|
$relogs['update_time'] = time();
|
|
|
$relogs['is_pay'] = 3;
|
|
|
$relogs['refund_time'] = time();
|
|
|
$rs2 = Db::name('order')
|
|
|
->where(['id' => $order['id']])
|
|
|
->update($relogs);
|
|
|
if($order['pay_type']="offlinepay"){
|
|
|
$index=new Index();
|
|
|
$index->refundToDriverUser($order['id']);
|
|
|
$this->refundSendMessage($id);//发送订阅消息
|
|
|
}
|
|
|
$this->success("退款成功");
|
|
|
}
|
|
|
|
|
|
//拼接退款参数
|
|
|
$pay_fee = $order['price'];
|
|
|
$refund_fee = $pay_fee;
|
|
|
$order_sn = $order['order_no'];
|
|
|
$pay_type = 'wechat';
|
|
|
$reason = '订单退款';
|
|
|
$notifyurl = 'https://wyc.tenyes.cn/api/index/refundNotifyx';//退款回调地址
|
|
|
//直接调用退款方法传参即可
|
|
|
$response = \addons\epay\library\Service::submitRefund($pay_fee, $refund_fee, $order_sn, getRefundSn($order['user_id']), $pay_type, $reason, $notifyurl, '', 'miniapp');
|
|
|
$response = json_encode($response);
|
|
|
$response = json_decode($response, true);
|
|
|
file_put_contents("pcl_repay_v2.log", date("Y-m-d H:i:s") . "::" . json_encode($response, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
|
|
|
if (!empty($response['return_code'] == 'SUCCESS')) {
|
|
|
//退款成功,更新退款记录
|
|
|
$relogs['update_time'] = time();
|
|
|
$relogs['is_pay'] = 3;
|
|
|
$relogs['out_refund_no'] = $response['out_refund_no'];
|
|
|
$relogs['refund_time'] = time();
|
|
|
$rs2 = Db::name('order')
|
|
|
->where(['id' => $order['id']])
|
|
|
->update($relogs);
|
|
|
} else {
|
|
|
$this->error('退款失败');
|
|
|
}
|
|
|
$index=new Index();
|
|
|
$index->refundToDriverUser($id);
|
|
|
$this->refundSendMessage($id);//发送订阅消息
|
|
|
|
|
|
$this->success("退款成功");
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 编辑
|
|
|
*
|
|
|
* @param $ids
|
|
|
* @return string
|
|
|
* @throws DbException
|
|
|
* @throws \think\Exception
|
|
|
*/
|
|
|
public function edit($ids = null)
|
|
|
{
|
|
|
$row = $this->model->get($ids);
|
|
|
if (!$row) {
|
|
|
$this->error(__('No Results were found'));
|
|
|
}
|
|
|
$adminIds = $this->getDataLimitAdminIds();
|
|
|
if (is_array($adminIds) && !in_array($row[$this->dataLimitField], $adminIds)) {
|
|
|
$this->error(__('You have no permission'));
|
|
|
}
|
|
|
if (false === $this->request->isPost()) {
|
|
|
$car=Db::name("car")
|
|
|
->alias("a")
|
|
|
->join("driver b","a.driver_id=b.id")
|
|
|
->where("a.route_id",$row['route_id'])
|
|
|
->field("b.id,car_model,name,license_plate")
|
|
|
->select();
|
|
|
$this->view->assign('row', $car);
|
|
|
return $this->view->fetch();
|
|
|
}
|
|
|
$params = $this->request->post('row/a');
|
|
|
if (empty($params)) {
|
|
|
$this->error(__('Parameter %s can not be empty', ''));
|
|
|
}
|
|
|
$params = $this->preExcludeFields($params);
|
|
|
$result = false;
|
|
|
Db::startTrans();
|
|
|
try {
|
|
|
//是否采用模型验证
|
|
|
if ($this->modelValidate) {
|
|
|
$name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
|
|
|
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
|
|
|
$row->validateFailException()->validate($validate);
|
|
|
}
|
|
|
$driver = Db::name("driver")->where("id", $ids)->find();
|
|
|
$car = Db::name("car")->where("driver_id", $driver['id'])->find();
|
|
|
$carmodel = Db::name("carmodel")->where("id", $car['carmodel_id'])->find();
|
|
|
$route = Db::name("route")->where("id", $car['route_id'])->find();
|
|
|
//判断总表
|
|
|
$time = strtotime(date("Y-m-d", time()));
|
|
|
$order_review = Db::name("order_review")
|
|
|
->where("car_id", $car["id"])
|
|
|
->where("route_id", $route['id'])
|
|
|
->where("driver_id", $driver['id'])
|
|
|
->where("createtime", ">", $time)
|
|
|
->find();
|
|
|
|
|
|
if (!$order_review) {
|
|
|
$order_review_id = Db::name("order_review")
|
|
|
->insertGetId([
|
|
|
"car_id" => $car["id"],
|
|
|
"route_id" => $route['id'],
|
|
|
"driver_id" => $driver['id'],
|
|
|
"type" => 2,
|
|
|
"order_status" => 3,
|
|
|
"createtime" => time()
|
|
|
]);
|
|
|
} else {
|
|
|
$order_review_id = $order_review['id'];
|
|
|
}
|
|
|
$params["order_review_id"]=$order_review_id;
|
|
|
$result = $row->allowField(true)->save($params);
|
|
|
Db::commit();
|
|
|
} catch (ValidateException|PDOException|Exception $e) {
|
|
|
Db::rollback();
|
|
|
$this->error($e->getMessage());
|
|
|
}
|
|
|
if (false === $result) {
|
|
|
$this->error(__('No rows were updated'));
|
|
|
}
|
|
|
$this->success();
|
|
|
}
|
|
|
|
|
|
public function orderinfo($ids){
|
|
|
$row = Db::name("order")->field("id,passengers,driver_id,starting_point,end_point,order_no,pay_type,price,route_id,is_pay,phone,type")->find(['id' => $ids]);
|
|
|
$res=Db::name("passenger")->where("id","in",$row['passengers'])->select();
|
|
|
$row['passenger']="";
|
|
|
foreach ($res as $k=>$v) {
|
|
|
$row['passenger']=$row['passenger']."姓名:".$res[$k]['name']." 身份证:".$res[$k]['IDcard']." 手机号:".$res[$k]['phone'];
|
|
|
}
|
|
|
unset($row['passengers']);
|
|
|
if($row['is_pay']==1){
|
|
|
$row['is_pay']="已支付";
|
|
|
}elseif($row['is_pay']==2){
|
|
|
$row['is_pay']="未支付";
|
|
|
}elseif($row['is_pay']==3){
|
|
|
$row['is_pay']="已退款";
|
|
|
}elseif($row['is_pay']==4){
|
|
|
$row['is_pay']="已取消";
|
|
|
}
|
|
|
if($row['type']==1){
|
|
|
$row['type']="计票";
|
|
|
}elseif($row['type']==2){
|
|
|
$row['type']="城际";
|
|
|
}elseif($row['type']==3){
|
|
|
$row['type']="包车";
|
|
|
}
|
|
|
if($row['pay_type']=="wxpay"){
|
|
|
$row['pay_type']="微信";
|
|
|
}elseif($row['pay_type']=="offlinepay"){
|
|
|
$row['pay_type']="线下";
|
|
|
}elseif($row['pay_type']=="background"){
|
|
|
$row['pay_type']="后台下单";
|
|
|
}
|
|
|
$driver=Db::name("driver")->find($row['driver_id']);
|
|
|
$car=Db::name("car")->where("driver_id",$row['driver_id'])->find();
|
|
|
$row['license_plate']=$car['license_plate'];
|
|
|
$row['driver_name']=$driver['name'];
|
|
|
$route=Db::name("route")->find($row['route_id']);
|
|
|
$row['route_name']=$route['name'];
|
|
|
unset($row['driver_id']);
|
|
|
unset($row['route_id']);
|
|
|
if (!$row) {
|
|
|
$this->error(__('No Results were found'));
|
|
|
}
|
|
|
$this->view->assign("row", $row);
|
|
|
return $this->view->fetch();
|
|
|
}
|
|
|
public function chackorder(){
|
|
|
$newadditionorder= \app\admin\model\Order::where("is_check",0)->count();
|
|
|
return $newadditionorder;
|
|
|
}
|
|
|
public function notselectedorder(){
|
|
|
$newadditionorder= \app\admin\model\Order::where("driver_id",null)->count();
|
|
|
return $newadditionorder;
|
|
|
}
|
|
|
/**
|
|
|
* 发送模板消息
|
|
|
* @return void
|
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
|
* @throws \think\exception\DbException
|
|
|
*/
|
|
|
function refundSendMessage($order_id){
|
|
|
$order=\think\Db::name("order")->find($order_id);
|
|
|
$wxxcxpush=new WxxcxPush();
|
|
|
$user=new User();
|
|
|
$user=$user->find($order['user_id']);
|
|
|
$res=$wxxcxpush->refundMessage($user['wx_xcx_openid'],$order_id);
|
|
|
if ($res !== false) {
|
|
|
return $res;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 检查是否有新订单
|
|
|
* @return void
|
|
|
*/
|
|
|
public function chackordershow(){
|
|
|
$res=Db::name("order")->where("is_pay",1)->where("driver_id",null)->count();
|
|
|
return $res;
|
|
|
}
|
|
|
/**
|
|
|
* 添加
|
|
|
*
|
|
|
* @return string
|
|
|
* @throws \think\Exception
|
|
|
*/
|
|
|
public function add()
|
|
|
{
|
|
|
if (false === $this->request->isPost()) {
|
|
|
return $this->view->fetch();
|
|
|
}
|
|
|
$params = $this->request->post('row/a');
|
|
|
if (empty($params)) {
|
|
|
$this->error(__('Parameter %s can not be empty', ''));
|
|
|
}
|
|
|
$params = $this->preExcludeFields($params);
|
|
|
$params['pay_type']="background";
|
|
|
$params['is_pay']=1;
|
|
|
$driver=Db::name("driver")->where("id",$params['driver_id'])->find();
|
|
|
$params['driver_name']=$driver['name'];
|
|
|
$params['order_no']=$this->getOrderSn();
|
|
|
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
|
|
|
$params[$this->dataLimitField] = $this->auth->id;
|
|
|
}
|
|
|
$result = false;
|
|
|
Db::startTrans();
|
|
|
try {
|
|
|
//是否采用模型验证
|
|
|
if ($this->modelValidate) {
|
|
|
$name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
|
|
|
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
|
|
|
$this->model->validateFailException()->validate($validate);
|
|
|
}
|
|
|
|
|
|
$passenger=Db::name("passenger")->insertGetId(['name'=>$params['user_name'],'IDcard'=>$params['IDcard'],'phone'=>$params['phone']]);
|
|
|
$params['passengers']=$passenger;
|
|
|
//判断总表
|
|
|
$time = strtotime(date("Y-m-d", time()));
|
|
|
$order_review = Db::name("order_review")
|
|
|
->where("car_id", $params['car_id'])
|
|
|
->where("route_id", $params['route_id'])
|
|
|
->where("driver_id", $params['driver_id'])
|
|
|
->where("createtime", ">", $time)
|
|
|
->find();
|
|
|
|
|
|
if (!$order_review) {
|
|
|
$order_review_id = Db::name("order_review")
|
|
|
->insertGetId([
|
|
|
"car_id" => $params['car_id'],
|
|
|
"route_id" => $params['route_id'],
|
|
|
"driver_id" => $params['driver_id'],
|
|
|
"type" => 1,
|
|
|
"order_status" => 1,
|
|
|
"createtime" => time()
|
|
|
]);
|
|
|
} else {
|
|
|
$order_review_id = $order_review['id'];
|
|
|
}
|
|
|
$params['order_review_id']=$order_review_id;
|
|
|
$result = $this->model->allowField(true)->save($params);
|
|
|
Db::commit();
|
|
|
} catch (ValidateException|PDOException|Exception $e) {
|
|
|
Db::rollback();
|
|
|
$this->error($e->getMessage());
|
|
|
}
|
|
|
if ($result === false) {
|
|
|
$this->error(__('No rows were inserted'));
|
|
|
}
|
|
|
$this->success();
|
|
|
}
|
|
|
function getOrderSn()
|
|
|
{
|
|
|
$orderid = date("YmdHis") . mt_rand(1000, 999999);
|
|
|
$odcks = \think\Db::name('order')
|
|
|
->where(['order_no' => $orderid])
|
|
|
->find();
|
|
|
while (!empty($odcks)) {
|
|
|
$orderid = date("YmdHis") . mt_rand(1000, 999999);
|
|
|
}
|
|
|
return $orderid;
|
|
|
}
|
|
|
} |
|
|
\ No newline at end of file |
...
|
...
|
|