文件
mashangyoujiu/Application/Delivery/Controller/PostController.class.php

440 行
18 KiB
PHP
可执行文件

<?php
namespace Delivery\Controller;
use addons\paotui\library\SnowFlake;
use app\admin\model\paotui\PostSocket;
use app\admin\model\paotui\Third;
use app\common\controller\Api;
use think\Db;
use think\Exception;
use think\Validate;
use Yansongda\Pay\Pay;
/**
* 快递接口
*/
class Post extends BaseController
{
// 无需登录的接口,*表示全部
protected $noNeedLogin = ['market_info'];
// 无需鉴权的接口,*表示全部
protected $noNeedRight = "*";
public function _initialize()
{
parent::_initialize();
}
/**
* 快递列表
* @throws Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function index()
{
$status = $this->request->post("type", '');
$page = $this->request->post('page', 0);
$limit = $this->request->post('limit', 0);
$userModel = new \app\admin\model\User();
$userInfo = $userModel->where(['id' => $this->auth->id])->find();
$user_id = $this->auth->id;
$mobile = $userInfo['mobile'];
$where = function ($query) use ($user_id, $mobile) {
$query->where(function ($query) use ($mobile) {
$query->where(['to_mobile' => [['eq', $mobile], ['neq', '']], 'pay_status' => 1]);
})
->whereOr(['user_id' => $user_id]);
};
$postService = new \addons\paotui\service\Post();
$data = $postService->getPostList($status, $where, $page, $limit, "*", "id desc");
foreach ($data['data'] as &$v) {
$v['from_or_to'] = ($v['user_id'] == $this->auth->id) ? 'from' : 'to';
}
$this->success('请求成功', $data);
}
/**
* 快递详情
* @throws Exception
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function info()
{
$order_no = $this->request->post("order_no", '');
$postService = new \addons\paotui\service\Post();
$data = $postService->getInfoByUser($order_no, $this->auth->id);
$this->success('请求成功', $data);
}
/**
* 公开的快递详情
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function market_info()
{
$order_no = $this->request->post("order_no", '');
$postService = new \addons\paotui\service\Post();
$postInfo = $postService->getInfoByMarket($order_no);
if (empty($postInfo)) {
$this->error('当前快递不存在');
}
if ($postInfo['user_id'] == $this->auth->id) {
$postInfo['is_owner'] = 1;
} else {
$postInfo['is_owner'] = 0;
}
$this->success('操作成功', $postInfo);
}
/**
* 获取支付金额
*/
public function payPrice()
{
$from_address_id = $this->request->post("from_address_id");
$to_address_id = $this->request->post("to_address_id");
$type = $this->request->post('type', 1);
$weight = $this->request->post('weight', 5);
$postService = new \addons\paotui\service\Post();
$return = $postService->getPostDetailPrice($from_address_id, $to_address_id, $this->auth->id, $type, $weight);
if ($return) {
$this->success("请求成功", $return);
} else {
$this->error($postService->error);
}
}
/**
* 发快递
*/
public function add()
{
$from_address_id = $this->request->post("from_address_id");
$to_address_id = $this->request->post("to_address_id");
$type = $this->request->post('type', 1);
$goods_type = $this->request->post('goods_type', 1);
$weight = $this->request->post('weight', 5);
$b_true_price = $this->request->post('b_price', 0);
$tips_price = $this->request->post('tips_price', 0); //小费
$is_appoints = $this->request->post('is_appoints', 0);
$appoints_day = $this->request->post('appoints_day', "");
$appoints_time = $this->request->post('appoints_time', "");
$note = $this->request->post("note", "");
#判断收发件地址是否正确 start#
$userAddress = new \addons\paotui\service\UserAddress();
$fromAddress = $userAddress->getAddressInfo($from_address_id, $this->auth->id);
if (empty($fromAddress)) {
$this->error('请选择正确的发件地址');
}
$toAddress = $userAddress->getAddressInfo($to_address_id, $this->auth->id);
if (empty($toAddress)) {
$this->error('请选择正确的收件地址');
}
#判断收发件地址是否正确 end#
#获取保价金额 start#
if ($b_true_price) {
$b_price = $b_true_price;
} else {
$b_price = 0;
}
#获取保价金额 end#
$order_code = SnowFlake::generateId(); //获取订单编号
$data['order_no'] = $order_code; //订单号
$data['user_id'] = $this->auth->id;
$data['type'] = $type;
$data['from_address_id'] = $fromAddress['id'];
$data['from_province'] = $fromAddress['province'];
$data['from_city'] = $fromAddress['city'];
$data['from_district'] = $fromAddress['district'];
$data['from_name'] = $fromAddress['name'];
$data['from_mobile'] = $fromAddress['mobile'];
$data['from_address'] = str_replace(["\t", "\r\n", "\r", "\n", " "], '', $fromAddress['address']);
$data['from_poi'] = $fromAddress['poi'];
$data['from_lng'] = $fromAddress['lng'];
$data['from_lat'] = $fromAddress['lat'];
$data['from_first_code'] = empty($fromCode['first_code']) ? '' : $fromCode['first_code'];
$data['from_second_code'] = empty($fromCode['second_code']) ? '' : $fromCode['second_code'];
$data['to_address_id'] = $toAddress['id'];
$data['to_province'] = $toAddress['province'];
$data['to_city'] = $toAddress['city'];
$data['to_district'] = $toAddress['district'];
$data['to_name'] = $toAddress['name'];
$data['to_mobile'] = $toAddress['mobile'];
$data['to_address'] = str_replace(["\t", "\r\n", "\r", "\n", " "], '', $toAddress['address']);
$data['to_poi'] = $toAddress['poi'];
$data['to_lng'] = $toAddress['lng'];
$data['to_lat'] = $toAddress['lat'];
$data['to_first_code'] = empty($toCode['first_code']) ? '' : $toCode['first_code'];
$data['to_second_code'] = empty($toCode['second_code']) ? '' : $toCode['second_code'];
$data['goods_type'] = $goods_type;
$data['weight'] = $weight;
$data['b_price'] = $b_price; //保价支付金额
$data['b_true_price'] = $b_true_price; //物品价格
$data['tips_price'] = $tips_price;
$data['note'] = $note;
$data['nextsendtime'] = time();
#地址验证 start#
if (!\addons\paotui\service\UserAddress::checkCity($data['from_city'])) {
$this->error("当前选择位置不在运营范围内!");
}
if (!\addons\paotui\service\UserAddress::checkCity($data['to_city'])) {
$this->error("当前选择位置不在运营范围内!");
}
#地址验证 end#
#预约 start#
$data['is_appoints'] = $is_appoints;
$data['appoints_day'] = $appoints_day;
$data['appoints_time'] = $appoints_time;
if ($is_appoints) {
if (empty($data['appoints_day']) || empty($data['appoints_time'])) {
$this->error("请选择预约时间");
}
} else {
unset($data['appoints_day']);
unset($data['appoints_time']);
}
#预约 end#
#获取收发件经纬度之间的距离 米 start#
$postService = new \addons\paotui\service\Post();
$commonPrice = $postService->getPostDetailPrice($from_address_id, $to_address_id, $this->auth->id, $type, $weight);
if (!$commonPrice) {
$this->error($postService->error);
}
$data['distance'] = $commonPrice['distance'];
$data['general_price'] = $commonPrice['general_price'];
$data['over_distance'] = $commonPrice['over_distance'];
$data['over_distance_price'] = $commonPrice['over_distance_price'];
$data['over_weight_price'] = $commonPrice['over_weight_price'];
$data['over_weight'] = $commonPrice['over_weight'];
$data['extra_price'] = $commonPrice['extra_price'];
$data['extra_node'] = $commonPrice['extra_node'];
$total_price = bcadd($data['general_price'], $data['b_price'], 2); //基础费用+保价费用
$total_price = bcadd($total_price, $data['tips_price'], 2); //小费
$total_price = bcadd($total_price, $data['over_distance_price'], 2); //超出里程费用
$total_price = bcadd($total_price, $data['over_weight_price'], 2); //超出重量费用
$total_price = bcadd($total_price, $data['extra_price'], 2); //溢价
$data['total_price'] = $total_price; //原始价格
if (isset($commonPrice['discount_price'])) {
//如果有折扣价,计算折扣价,折扣价格中包含超重和超距离费用
$pay_price = bcadd($commonPrice['discount_price'], $data['b_price'], 2); //折扣价格+保价费用
$pay_price = bcadd($pay_price, $data['tips_price'], 2); //小费
$pay_price = bcadd($pay_price, $data['extra_price'], 2); //溢价
} else {
$pay_price = bcadd($data['general_price'], $data['b_price'], 2); //基础费用+保价费用
$pay_price = bcadd($pay_price, $data['tips_price'], 2); //小费
$pay_price = bcadd($pay_price, $data['over_distance_price'], 2); //超出里程费用
$pay_price = bcadd($pay_price, $data['over_weight_price'], 2); //超出重量费用
$pay_price = bcadd($pay_price, $data['extra_price'], 2); //溢价
}
$data['pay_price'] = $pay_price; //实际支付价格
#获取佣金 start#
if (isset($commonPrice['discount_price'])) {
$allow_brokerage_price = bcadd($commonPrice['discount_price'], $data['tips_price'], 2); //小费
$allow_brokerage_price = bcadd($allow_brokerage_price, $data['extra_price'], 2); //溢价
} else {
$allow_brokerage_price = bcadd($data['general_price'], $data['tips_price'], 2); //小费
$allow_brokerage_price = bcadd($allow_brokerage_price, $data['over_distance_price'], 2); //超出里程费用
$allow_brokerage_price = bcadd($allow_brokerage_price, $data['over_weight_price'], 2); //超出重量费用
$allow_brokerage_price = bcadd($allow_brokerage_price, $data['extra_price'], 2); //溢价
}
$data['brokerage'] = $allow_brokerage_price;
#获取佣金 end#
#获取收发件经纬度之间的距离 米 end#
$msg = [
'from_address_id.require' => '请选择发件地址',
'to_address_id.require' => '请选择收件地址',
'goods_type.require' => '请选择物品类型',
'weight.require' => '请填写物品重量'
];
$rule = [
'from_address_id' => 'require',
'to_address_id' => 'require',
'goods_type' => 'require',
'weight' => 'require',
];
$validate = new Validate($rule, $msg);
$result = $validate->check($data);
if (!$result) {
$this->error(__($validate->getError()), null, []);
}
$postService = new \addons\paotui\service\Post();
if ($result = $postService->addPost($data)) {
$this->success('提交成功', ['order_no' => (string)$result->order_no]);
} else {
$this->error('提交失败');
}
}
/**
* 支付订单
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function pay()
{
$info = get_addon_info('epay');
if (empty($info) || $info['state'] == 0) {
$this->error('请到后台插件管理安装《微信支付宝整合》插件');
}
$order_no = $this->request->post('order_no');
$postModel = new \app\admin\model\paotui\Post();
$postInfo = $postModel->where(['order_no' => $order_no, 'user_id' => $this->auth->id, 'pay_status' => 0])->find();
if (empty($postInfo)) {
$this->error('当前订单不存在或已支付');
}
$wechatUser = Third::get(['user_id' => $this->auth->id]);
$params = [
'amount' => $postInfo['pay_price'],
'orderid' => $order_no . "_" . rand(1000, 9999),
'type' => "wechat",
'title' => "跑腿订单",
'notifyurl' => $this->request->domain() . "/api/paotui/block/notifyx",
'method' => "miniapp",
'openid' => $wechatUser['openid']
];
$return = \addons\epay\library\Service::submitOrder($params);
if ($return) {
$this->success('请求成功', json_decode($return));
} else {
$this->error("请求失败");
}
}
/**
* 取消订单
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function cancel()
{
$order_no = $this->request->post('order_no');
Db::startTrans();
$postModel = new \app\admin\model\paotui\Post();
$postInfo = $postModel->lock(true)->where(['order_no' => $order_no, 'user_id' => $this->auth->id, 'status' => ['in', [1, 2, 3]]])->find();
if (empty($postInfo)) {
$this->error('当前订单不存在或不可以取消');
}
if ($postInfo->save(['status' => -1, 'canceltime' => time()])) {
if ($postInfo['pay_price'] > 0) {
if ($postInfo['status'] == 2 || $postInfo['status'] == 3) {
//退款,原路退回
try {
$config = \addons\epay\library\Service::getConfig('wechat');
$config['app_id'] = $config['miniapp_id'];
$pay = Pay::wechat($config);
$param = [
'transaction_id' => $postInfo['transaction_id'],
'out_refund_no' => time() . "_" . rand(1000, 9999),
'total_fee' => $postInfo['pay_price'] * 100,
'refund_fee' => $postInfo['pay_price'] * 100,
'refund_desc' => "退款"
];
$result = $pay->refund($param);
if ($result->result_code == "SUCCESS") {
if ($postInfo['status'] == 3) {
//生成socket记录
$postSocketModel = new PostSocket();
$postSocketInfo = $postSocketModel->where(['post_id' => $postInfo['id']])->find();
if ($postSocketInfo) {
$postSocketInfo->save(['type' => 4, 'poster_id' => $postInfo['poster_id'], 'distance' => 0, 'send_num' => 0, 'next_send_time' => time(), 'send_status' => 0]);
} else {
$postSocketModel = new PostSocket();
$postSocketModel->save(['type' => 4, 'post_id' => $postInfo['id'], 'poster_id' => $postInfo['poster_id'], 'distance' => 0, 'send_num' => 0, 'next_send_time' => time(), 'send_status' => 0]);
}
}
Db::commit();
$this->success();
}
} catch (\Yansongda\Pay\Exceptions\Exception $e) {
Db::rollback();
$this->error("退款申请失败,请联系客服");
}
}
}
} else {
Db::rollback();
$this->error("请求失败");
}
}
/**
* 删除订单
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function del()
{
$order_no = $this->request->post('order_no');
$postModel = new \app\admin\model\paotui\Post();
$postInfo = $postModel->where(['order_no' => $order_no, 'user_id' => $this->auth->id, 'status' => -1])->find();
if (empty($postInfo)) {
$this->error('当前订单不存在或不可以删除');
}
if ($postInfo->save(['is_delete' => 1, 'deletetime' => time()])) {
$this->success("请求成功");
} else {
$this->error("请求失败");
}
}
}