| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841 |
- <?php
- namespace app\api\model\service;
- use think\App;
- use think\Model;
- use traits\model\SoftDelete;
- use think\Exception;
- use fast\Random;
- class Order extends Model
- {
- use SoftDelete;
- // 表名
- protected $name = 'service_order';
- // 自动写入时间戳字段
- protected $autoWriteTimestamp = 'int';
- // 定义时间戳字段名
- protected $createTime = 'createtime';
- protected $updateTime = 'updatetime';
- protected $deleteTime = 'deletetime';
- /**
- * 项目结算
- * @param $param
- * @return array
- * @throws Exception
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public static function settle($params)
- {
- $goods = Goods::where(['id' => $params['goods_id'], 'status' => 'normal'])->field('id,image,response_hour,start_hour,end_hour,shop_id,name,type,price,cost_seconds,to_shop,is_travel,choose_skill_type')->find();
- if (!$goods) {
- throw new Exception('项目信息异常,无法下单');
- }
- $data['goods'] = $goods;
- $data['sumprice'] = bcmul($goods['price'], $params['num'], 2);
- $data['shop'] = $goods['type'] == 1 ? Shop::getShop($goods['shop_id']) : '';
- if ($params['goods_sku_id']) {
- $goodsSku = GoodsSku::where(['id' => $params['goods_sku_id'], 'goods_id' => $goods['id'], 'status' => 'normal'])->field('id,name,price,cost_seconds')->find();
- if (!$goodsSku['id']) {
- throw new Exception('规格信息异常');
- }
- $data['goodsSku'] = $goodsSku;
- $goods['price'] = $goodsSku['price'];
- $data['sumprice'] = sprintf("%.2f", $data['goodsSku']['price'] * $params['num']);
- }
- return $data;
- }
- public static function createPackageOrder($params)
- {
- $userInfo = UserInfo::where(['user_id' => $params['user_id']])->field('discount,is_plus,leader_id,rec_leader_id')->find();
- $packageOrderDetail = PackageOrderDetail::where(['id'=>$params['package_order_detail_id'],'user_id'=>$params['user_id']])->find();
- $totalPrice = bcmul($params['num'],$packageOrderDetail['act_price'],2);
- $totalCostSeconds = bcmul($params['num'],$packageOrderDetail['cost_seconds']);
- $packageOrder = PackageOrder::where('id',$packageOrderDetail['package_order_id'])->field('id,status,endtime,package_card_id,discount,paytype,orderId,trade_no,total_nums,use_nums')->find();
- if(!$packageOrderDetail || !$packageOrder)
- {
- throw new Exception('套餐信息异常,请联系管理员');
- }
- if($packageOrderDetail['usenums']+$params['num'] > $packageOrderDetail['nums'])
- {
- throw new Exception('套餐当前项目已使用完毕');
- }
- if($packageOrder['status'] != 1)
- {
- throw new Exception('套餐卡已无法使用,请联系管理员');
- }
- $goods = Goods::where(['id'=>$packageOrderDetail['goods_id']])->find();
- $endtime = $totalCostSeconds*60+$params['starttime'];
- $data = ['user_id' => $params['user_id'],'goods_id'=>$packageOrderDetail['goods_id'],'is_pool'=>1,'package_order_id'=>$packageOrder['id'],'ordertype'=>1,'city'=>$params['city'], 'price'=>$totalPrice,'sumprice'=>$totalPrice,'goods_total_price'=>$totalPrice,'payprice'=>$totalPrice, 'choose_skill_type' => 0,'traveltype'=>0, 'paytype' => $packageOrder['paytype'],'orderId'=>$packageOrder['orderId'],'trade_no'=>$packageOrder['trade_no'],'total_cost_seconds'=>$totalCostSeconds, 'to_shop' => $goods['to_shop'],'starttime'=>$params['starttime'],'endtime'=>$endtime,'actendtime'=>$endtime+1799,'paytime'=>time(),'memo' => $params['memo'],'status'=>1];
- $order = new Order($data);
- $order->allowField(true)->save();
- OrderLog::create(['order_id' => $order->id, 'user_id' => $params['user_id'], 'content' => '用户创建订单成功']);
- $address = Address::where(['id' => $params['address_id']])->field('name,sex,mobile,province,city,district,address,lng,lat,area')->find()->toArray();
- $address['user_id'] = $params['user_id'];
- $address['order_id'] = $order->id;
- OrderAddress::create($address);
- $detailData = ['user_id' => $params['user_id'], 'order_id' => $order->id, 'goods_id' => $packageOrderDetail['goods_id'], 'goods_sku_id' => $packageOrderDetail['goods_sku_id'], 'name' => $packageOrderDetail['goodsname'], 'image' => $goods['image'], 'num' => $params['num'], 'sku_name' => $packageOrderDetail['name'], 'price' => $packageOrderDetail['act_price'], 'sumprice' => $totalPrice];
- $orderDetail = new OrderDetail($detailData);
- $orderDetail->allowField(true)->save();
- PackageOrderDetail::where('id',$params['package_order_detail_id'])->setInc('usenums',$params['num']);
- PackageOrder::where('id',$packageOrder['id'])->setInc('use_nums');
- if($packageOrder['use_nums']+1 >= $packageOrder['total_nums'])
- {
- PackageOrder::where('id',$packageOrder['id'])->update(['status'=>2]);
- }
- return true;
- }
- /**
- * 创建订单
- * @param $params
- * @return array
- * @throws Exception
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public static function createOrder($params)
- {
- $goods = self::settle($params);
- $userInfo = UserInfo::where(['user_id' => $params['user_id']])->field('discount,is_plus,leader_id,rec_leader_id')->find();
- $data = ['user_id' => $params['user_id'],'leader_id'=>$userInfo['leader_id'],'rec_leader_id'=>$userInfo['rec_leader_id'],'goods_id'=>$goods['goods']['id'],'discount'=>$userInfo['discount'],'city'=>$params['city'],'traveltype' => $params['traveltype'], 'travel_price' => $params['travel_price'],'distance'=>$params['distance'], 'choose_skill_type' => $params['choose_skill_type'], 'paytype' => $params['paytype'], 'to_shop' => $params['to_shop'], 'orderId' => 'GoodsOrd' . Random::alnum(4) . '-' . $params['user_id'] . '-' . time(), 'memo' => $params['memo']];
- if($params['shop_id'])
- {
- $data['shop_id'] = $params['shop_id'];
- }elseif($goods['goods']['shop_id']){
- $data['shop_id'] = $goods['goods']['shop_id'];
- }
- $data['total_cost_seconds'] = isset($goods['goodsSku']) ? intval($goods['goodsSku']['cost_seconds'] * $params['num']) : intval($goods['goods']['cost_seconds'] * $params['num']);
- $price = isset($goods['goodsSku']) ? $goods['goodsSku']['price'] : $goods['goods']['price'];
- $data['price'] = bcmul($price, $params['num'], 2);
- $data['sumprice'] = bcadd($data['price'], $params['travel_price'], 2);
- $data['goods_total_price'] = $userInfo['discount'] < 100 ?round(bcmul($data['price'], $userInfo['discount']/100, 3),2) : $data['price'];
- $data['payprice'] = $userInfo['discount'] < 100?bcadd($data['goods_total_price'],$params['travel_price'],3):$data['sumprice'];
- if (!strstr($goods['goods']['to_shop'], $params['to_shop'])) {
- throw new Exception('当前服务并无所选出行方式');
- }
- $needtime = $data['total_cost_seconds'] * 60;
- if($params['to_shop'] == 'shop' && $params['skill_id'])
- {
- $params['skill_id'] = '';
- }
- if ($params['skill_id']) {
- $skill = Skill::skillInfo($params['skill_id']);
- if($skill['is_rest'] == 1)
- {
- throw new Exception('服务者休息中,无法预约');
- }
- $data['skill_id'] = $skill['id'];
- $data['shop_id'] = $skill['shop_id'];
- $data['choose_skill_type'] = 1;
- $timeInfo = SkillTime::where(['skill_id' => $params['skill_id'], 'id' => $params['time_id'], 'state' => 0])->field('id,starttime')->find();
- if (!$timeInfo) {
- throw new Exception('当前时间已占用,无法预约');
- }
- $data['starttime'] = $timeInfo['starttime'];
- $data['endtime'] = $timeInfo['starttime'] + $needtime;
- $data['actendtime'] = $data['endtime'] + 1799;
- $timeExist = SkillTime::where(['state' => ['>', 0], 'skill_id' => $params['skill_id'], 'starttime' => ['between', [$data['starttime'], $data['actendtime']]]])->value('id');
- if ($timeExist) {
- throw new Exception('当前时间区间有被预约,请更换其他时间区间');
- }
- } elseif ($params['starttime']) {
- if ($params['starttime'] < time()) {
- throw new Exception('选择时间不可小于当前时间');
- }
- $data['starttime'] = $params['starttime'];
- $data['endtime'] = $params['starttime'] + $needtime;
- $data['actendtime'] = $data['endtime'] + 1799;
- }
- if ($params['coupon_id']) {
- $coupon = UserCoupon::checkCoupon($params['coupon_id'], $goods);
- if (!$coupon) {
- throw new Exception('优惠券无法使用');
- }
- $data['coupon_id'] = $params['coupon_id'];
- $data['coupon_price'] = sprintf("%.2f", $coupon['reduce']);
- $data['payprice'] = bcsub($data['payprice'], $data['coupon_price'],2);
- }
- if(empty($data['shop_id']) && empty($params['skill_id']))
- {
- $data['is_pool'] = 1;
- }
- $userMoney = User::getMoney($params['user_id']);
- if ($params['paytype'] == 4 && $userMoney < $data['payprice']) {
- throw new Exception('余额不足,请及时充值');
- }
- $order = new Order($data);
- $order->allowField(true)->save();
- OrderLog::create(['order_id' => $order->id, 'user_id' => $params['user_id'], 'content' => '用户创建订单成功']);
- if ($params['to_shop'] == 'door' && $params['address_id']) {
- $address = Address::where(['id' => $params['address_id']])->field('name,sex,mobile,province,city,district,address,lng,lat,area')->find()->toArray();
- if($params['skill_id'])
- {
- $skillCity = Skill::where('id',$params['skill_id'])->value('city');
- if($skillCity != $address['city'])
- {
- throw new Exception('上门地址请选择服务者所在城市');
- }
- }
- $address['user_id'] = $params['user_id'];
- $address['order_id'] = $order->id;
- OrderAddress::create($address);
- }
- $sku_name = isset($goods['goodsSku']) ? $goods['goodsSku']['name'] : '';
- $detailData = ['user_id' => $params['user_id'], 'order_id' => $order->id, 'goods_id' => $params['goods_id'], 'goods_sku_id' => $params['goods_sku_id'], 'skill_id' => $params['skill_id'], 'name' => $goods['goods']['name'], 'image' => $goods['goods']['image'], 'num' => $params['num'], 'sku_name' => $sku_name, 'price' => $price, 'sumprice' => $data['sumprice']];
- $orderDetail = new OrderDetail($detailData);
- $orderDetail->allowField(true)->save();
- $re = [];
- if (in_array($params['paytype'], [0, 1, 2, 3])) {
- $re['pay'] = \addons\service\library\Pay::payOrder(['amount' => $data['payprice'], 'orderid' => $data['orderId'], 'title' => '支付项目费用'], $params['paytype'], $params['user_id'], 0);
- } elseif ($params['paytype'] == 4) {
- User::money(-$data['payprice'], $data['user_id'], '支付' . $goods['goods']['name'] . '项目费用');
- $order->save(['status' => 1, 'paytime' => time()], ['id' => $order->id]);
- $re['pay'] = '';
- self::finishPay($order->id);
- }
- return $re;
- }
- public static function pay($params)
- {
- $order = self::where(['id'=>$params['id'],'status'=>0,'user_id'=>$params['user_id']])->field('id,skill_id,shop_id,goods_id,payprice,user_id,to_shop,starttime,actendtime,coupon_id')->find();
- if(!$order)
- {
- throw new Exception('订单已超时,无法支付');
- }
- $orderDetail = OrderDetail::where(['order_id'=>$order['id']])->field('goods_id,goods_sku_id,price,name')->find();
- $price = $orderDetail['goods_sku_id'] ?GoodsSku::where(['id'=>$orderDetail['goods_sku_id'],'status'=>'normal'])->value('price'):Goods::where(['id'=>$order['goods_id'],'status'=>'normal'])->value('price');
- if(!$price || $price!=$orderDetail['price'])
- {
- throw new Exception('订单项目信息发生变化,请重新下单');
- }
- if ($order['coupon_id']) {
- $couponState = UserCoupon::where(['id'=>$order['coupon_id'],'user_id'=>$order['user_id']])->value('state');
- if ($couponState!=0) {
- throw new Exception('优惠券无法使用,请重新下单');
- }
- }
- if($order['starttime']<time())
- {
- throw new Exception('预约时间已超出,请重新下单');
- }
- if($order['skill_id'])
- {
- $skill = Skill::where(['id'=>$order['skill_id'],'state'=>1])->value('id');
- if(!$skill)
- {
- throw new Exception('当前服务者暂时无法接单,请重新下单');
- }
- $timeExist = SkillTime::where(['state' => ['>', 0], 'skill_id' => $order['skill_id'], 'starttime' => ['between', [$order['starttime'], $order['actendtime']]]])->value('id');
- if ($timeExist) {
- throw new Exception('当前服务者时间区间有被预约,请重新下单');
- }
- }
- $userMoney = User::getMoney($order['user_id']);
- if ($params['paytype'] == 4 && $userMoney < $order['payprice']) {
- throw new Exception('余额不足,请及时充值');
- }
- $orderId = 'GoodsOrd' . Random::alnum(4) . '-' . $params['user_id'] . '-' . time();
- self::where(['id'=>$order['id']])->update(['orderId'=>$orderId,'paytype'=>$params['paytype']]);
- $re = [];
- if (in_array($params['paytype'], [0, 1, 2, 3])) {
- $re['pay'] = \addons\service\library\Pay::payOrder(['amount' => $order['payprice'], 'orderid' => $orderId, 'title' => '支付项目费用'], $params['paytype'], $params['user_id'], 0);
- } elseif ($params['paytype'] == 4) {
- User::money(-$order['payprice'], $params['user_id'], '支付' .$orderDetail['name']. '项目费用');
- $order->save(['status' => 1, 'paytime' => time()], ['id' => $order['id']]);
- $re['pay'] = '';
- self::finishPay($order['id']);
- }
- return $re;
- }
- public static function allocationOrder($params)
- {
- $order = self::where(['id'=>$params['id'],'shop_id'=>$params['shop_id'],'status'=>1,'is_service'=>['in',[0,-1]]])->field('id,user_id,to_shop,starttime,actendtime,is_service,status')->find();
- if($order['to_shop'] != 'door' || !$order)
- {
- throw new Exception('当前订单无法分配服务者');
- }
- $skillId = Skill::where(['id'=>$params['skill_id'],'state'=>1])->value('id');
- if(!$skillId)
- {
- throw new Exception('当前服务者无法接单');
- }
- $exist = SkillTime::where(['skill_id'=>$skillId,'state'=>['in',[1,2]],'starttime'=>['between',[$order['starttime'],$order['actendtime']]]])->value('id');
- if($exist)
- {
- throw new Exception('当前服务者时间有被预约');
- }
- \app\api\model\service\SkillTime::updateSkillTime(['skill_id'=>$params['skill_id'],'starttime'=>$order['starttime'],'actendtime'=>$order['actendtime']],1);
- OrderLog::create(['order_id'=>$order['id'],'type'=>14,'content'=>'订单已分配','user_id'=>$order['user_id']]);
- self::where(['id'=>$order['id']])->update(['skill_id'=>$skillId]);
- $skillOpenid = UserInfo::getOpenid($params['skill_id'],1);
- self::createOrderTemplateParams(['id'=>$order['id'],'user_id'=>$order['user_id'],'to_shop'=>$order['to_shop'],'type'=>1,'templateAttr'=>'skill_order_template','openid'=>$skillOpenid]);
- return true;
- }
- public static function finishPay($id)
- {
- $order = self::where(['id'=>$id,'status'=>1])->find();
- if(!$order)
- {
- return false;
- }
- if($order['skill_id'])
- {
- SkillTime::updateSkillTime($order,1);
- }
- if($order['coupon_id']){
- UserCoupon::where('id',$order['coupon_id'])->update(['state'=>1,'updatetime'=>time()]);
- }
- if($order['to_shop'] == 'shop')
- {
- $update['status'] = 2;
- $update['check_name'] = time().$order['id'];
- $update['qrcode_image'] = \addons\service\library\Common::createQrcode($update['check_name']);
- }
- $update['act_travel_price'] = sprintf("%.2f",$order['travel_price']);
- self::where(['id'=>$id])->update($update);
- OrderLog::create(['order_id'=>$id,'user_id'=>$order['user_id'],'type'=>1,'content'=>'用户订单已支付']);
- Goods::where('id',$order['goods_id'])->setInc('salenums');
- if($order['skill_id'])
- {
- $skillOpenid = UserInfo::getOpenid($order['skill_id'],1);
- self::createOrderTemplateParams(['id'=>$order['id'],'user_id'=>$order['user_id'],'to_shop'=>$order['to_shop'],'type'=>1,'templateAttr'=>'skill_order_template','openid'=>$skillOpenid]);
- }
- if($order['shop_id'])
- {
- $shopOpenid = UserInfo::getOpenid($order['shop_id'],2);
- self::createOrderTemplateParams(['id'=>$order['id'],'user_id'=>$order['user_id'],'to_shop'=>$order['to_shop'],'type'=>2,'templateAttr'=>'shop_order_template','openid'=>$shopOpenid]);
- }
- return true;
- }
- public static function getTotalAccept($params)
- {
- extract($params);
- $where['status'] = ['>',1];
- if(isset($skill_id) && $skill_id != '')
- {
- $where['skill_id'] = $skill_id;
- }
- if(isset($shop_id) && $shop_id != '')
- {
- $where['shop_id'] = $shop_id;
- }
- $starttime = strtotime(date("Y-m-d",$starttime));
- $where['starttime'] = ['>=',$starttime];
- return self::where($where)->count();
- }
- /**
- * 查询订单列表s
- * @param $params
- * @return bool|\PDOStatement|string|\think\Collection
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public static function getOrderList($params)
- {
-
- extract($params);
- $order = 'createtime desc';
- $where['is_service'] = ['<',1];
- if (isset($status) && $status != '') {
- $where['status'] = $status;
- }
- if (isset($city) && $city != '') {
- $where['city'] = $city;
- }
- if (isset($is_pool) && $is_pool != '') {
- $where['is_pool'] = $is_pool;
- $where['status'] = ['>',0];
- }
- if (isset($finish) && $finish == 1) {
- $where['status'] = ['in',[6,7]];
- }
- if (isset($not_in_finish) && $not_in_finish == 1) {
- $where['status'] = ['in',[1,2,3,4]];
- }
- if (isset($not_accept) && $not_accept == 1) {
- $where['status'] = 1;
- $where['skill_id'] = ['neq',''];
- }
- if (isset($not_allocation) && $not_allocation == 1) {
- $where['status'] = 1;
- $where['skill_id'] = ['null',''];
- }
- if (isset($not_finish) && $not_finish == 1) {
- $where['status'] = ['in',[2,3,4,5]];
- }
- if (isset($finish) && $finish == 1) {
- $where['status'] = ['in',[6,7]];
- }
- if (isset($in_service) && $in_service == 1) {
- $where['is_service'] = ['in',[1,2,-1]];
- }
- if (isset($user_id) && $user_id != '') {
- $where['user_id'] = $user_id;
- }
- if(isset($is_all) && $is_all != '')
- {
- $where['is_service'] = ['in',[1,2,0,-1]];
- }
- if(isset($goods_ids) && $goods_ids != '')
- {
- $where['goods_id'] = ['in',$goods_ids];
- }
- if(isset($shop_id) && $shop_id != '')
- {
- $where['shop_id'] = $shop_id;
- }
- if(isset($skill_id) && $skill_id != '')
- {
- $where['skill_id'] = $skill_id;
- }
- if(isset($is_service) && $is_service != '')
- {
- $where['is_service'] = $is_service;
- }
- $list = self::where($where)->field('id,user_id,skill_id,shop_id,payprice,status,refund_price,is_service,starttime,price,total_cost_seconds,to_shop,memo,is_settle')->order($order)->page($page)->limit(10)->select();
- foreach ($list as &$value)
- {
- $value['user'] = User::where(['id'=>$value['user_id']])->field('id,nickname,avatar')->find();
- $value['address'] = OrderAddress::where(['order_id'=>$value['id']])->find();
- $value['orderDetail'] = OrderDetail::where(['order_id'=>$value['id']])->field('goods_id,name,image,sku_name,num,price')->find();
- $value['shopName'] = $value['shop_id']?Shop::where('id',$value['shop_id'])->field('name,logo_image,trade_hour')->find():'';
- $value['skillInfo'] = $value['skill_id']?Skill::getOrderSkill($value['skill_id']):'';
- $value['refundInfo'] = $value['is_service'] != 0?RefundOrder::where(['order_id'=>$value['id']])->field('refund_reason,refund_price,content,note')->order('id desc')->find():'';
- }
- return $list;
- }
- public static function searchSettleOrder($params)
- {
- extract($params);
- $order = 'finishtime desc';
- $where['is_settle'] = ['>',0];
- $rebateWhere = ['user_id'=>$user_id,'type'=>$type,'rebatetype'=>['<>',2]];
- if(isset($shop_id))
- {
- $where['shop_id'] = $shop_id;
- }
- if(isset($skill_id) && $skill_id != '')
- {
- $where['skill_id'] = $skill_id;
- }
- if(isset($types))
- {
- $where['shop_id'] = $types == 0?['null','']:['not null',''];
- }
- if(isset($is_settle) && $is_settle != '')
- {
- $where['is_settle'] = $is_settle;
- }
- if(isset($starttime) && isset($endtime))
- {
- $where['finishtime'] = ['between',[$starttime,$endtime]];
- $rebateWhere['createtime'] = ['between',[$starttime,$endtime]];
- }
- $list = self::where($where)->field('id,user_id,skill_id,shop_id,payprice,status,is_settle,is_service,starttime,sumprice,coupon_price,premium_price,add_price,act_travel_price,refund_price,settle_price,total_cost_seconds,memo,orderId,createtime,finishtime')->order($order)->page($page)->limit(10)->select();
- foreach ($list as $key=>$value)
- {
- $list[$key]['orderDetail'] = OrderDetail::where(['order_id'=>$value['id']])->field('goods_id,name,image,sku_name,num,price')->find();
- $list[$key]['rebatePrice'] = Rebate::where(['order_id'=>$value['id'],'type'=>$type,'rebatetype'=>['<>',2]])->value('num');
- $list[$key]['skill'] = $value['skill_id']?Skill::where('id',$value->skill_id)->field('name,image')->find():'';
- }
- $orderIds = self::where($where)->column('id');
- $rebateWhere['order_id'] = ['in',$orderIds];
- $sumPrice = sprintf("%.2f",Rebate::where($rebateWhere)->sum('num'));
- return ['sumPrice'=>$sumPrice,'list'=>$list];
- }
- public static function getShopSkillOrder($params)
- {
- extract($params);
- $order = 'createtime desc';
- if(isset($shop_id) && $shop_id != '')
- {
- $where['shop_id'] = $shop_id;
- }
- if(isset($id) && $id != '')
- {
- $where['skill_id'] = $id;
- }
- if((isset($starttime) && $starttime != '') && (isset($endtime) && $endtime != ''))
- {
- $where['createtime'] = ['between',[$starttime,$endtime]];
- }
- $list = self::where($where)->field('id,user_id,skill_id,shop_id,payprice,status,is_settle,is_service,starttime,sumprice,coupon_price,premium_price,add_price,act_travel_price,refund_price,settle_price,total_cost_seconds,memo,orderId,createtime,finishtime')->order($order)->page($page)->limit(10)->select();
- foreach ($list as $key=>$value)
- {
- $list[$key]['address'] = OrderAddress::where(['order_id'=>$value['id']])->field('name,sex,mobile,province,city,district,address,area,lng,lat')->find();
- $list[$key]['orderDetail'] = OrderDetail::where(['order_id'=>$value['id']])->field('goods_id,name,image,sku_name,num,price')->find();
- }
- return $list;
- }
- public static function getOrderCount($params)
- {
- return self::where($params)->count();
- }
- public static function getOrderPrice($params,$attr)
- {
- return self::where($params)->sum($attr);
- }
- public static function getOrder($params)
- {
- return self::where($params)->field('id,payprice,starttime,status')->with('detail')->order('id desc')->select();
- }
- public static function getSkillOrderCount($params)
- {
- $start= strtotime(date("Y-m-d",time()));
- $endTime = $start+86399;
- for($a = 0;$a <= 2; $a++){
- $params['starttime'] = ['between',[86400*$a+$start,86400*$a+$endTime]];
- $week['date'] = date("Y-m-d",86400*$a+$start);
- $week['count'] = self::where($params)->count();
- $list[] = $week;
- }
- return $list;
- }
- public static function getTotalOrder()
- {
- $daytime = strtotime(date("Y-m-d",time()));
- $start= $daytime-86400*6;
- $end = $daytime;
- $day = [];
- $orderTotal = [];
- $total = ceil(($end-$start)/86400);;
- for($a = 0;$a <=$total; $a++){
- $where['finishtime'] = ['between',[86400*$a+$start,86400*$a+86399+$start]];
- $where['status'] = ['>',5];
- $day[] = date("m-d",86400*$a+$start);
- $orderTotal[] = self::where($where)->count();
- }
- return ['day'=>$day,'total'=>$orderTotal];
- }
- public static function getForm($params)
- {
- $daytime = strtotime(date("Y-m-d",time()));
- extract($params);
- $start= isset($starttime)?$starttime:$daytime-86400*6;
- $end = isset($endtime)?$endtime:$daytime;
- $total = ceil(($end-$start)/86400);
- if(isset($shop_id) && $shop_id != '')
- {
- $where['shop_id'] = $shop_id;
- }
- if(isset($skill_id) && $skill_id == 1)
- {
- $where['skill_id'] = $skill_id;
- }
- $where['status'] = ['>',5];
- $list = [];
- for($a = 0;$a <=$total; $a++){
- $where['finishtime'] = ['between',[86400*$a+$start,86400*$a+$start+86399]];
- $week['date'] = date("Y-m-d",86400*$a+$start);
- $week['price'] = sprintf("%.2f",self::where($where)->sum('price'));
- $week['count'] = self::where($where)->count();
- $list[] = $week;
- }
- return $list;
- }
- /**
- * 获取近3天订单数量
- * @param $params
- * @return array
- * @throws Exception
- */
- public static function getDayServiceList($params)
- {
- $daytime = strtotime(date("Y-m-d",time()));
- $list = [];
- for ($a = 0; $a < 3; $a++)
- {
- $starttime = $a>0 ?$a*86400+$daytime:$daytime;
- $endtime = $starttime+86399;
- $params['starttime'] = ['between',[$starttime,$endtime]];
- $day['time'] = $starttime;
- $day['orderCount'] = self::where($params)->count();
- $list[] = $day;
- }
- return $list;
- }
- public static function getCount($params)
- {
- $where['user_id'] = $params['user_id'];
- $where['is_service'] = ['in',[0,-1]];
- $where['status'] = 0;
- $data['unpayCount'] = self::where($where)->count();
- $where['status'] = ['in',[1,2,3,4]];
- $data['unServiceCount'] = self::where($where)->count();
- $where['status'] = 5;
- $data['serviceCount'] = self::where($where)->count();
- $where['status'] = 6;
- $data['notCommentCount'] = self::where($where)->count();
- unset($where['status']);
- $where['is_service'] = 1;
- $data['refundCount'] = self::where($where)->count();
- return $data;
- }
- public static function getOrderInfo($id)
- {
- $where = [
- 'id' => $id,
- ];
- $order = self::where($where)->field('id,user_id,skill_id,shop_id,traveltype,check_name,refund_price,choose_skill_type,paytype,to_shop,orderId,discount,is_settle,price,travel_price,distance,sumprice,coupon_price,premium_price,add_price,payprice,total_cost_seconds,starttime,endtime,memo,qrcode_image,is_service,status,createtime,paytime')
- ->order('id desc')->find();
- $order['adddetail'] = AddOrder::getOrderDetailList($id);
- $order['detail'] = OrderDetail::where(['order_id'=>$order['id']])->find();
- $order['orderAddress'] = $order['to_shop'] == 'door'?OrderAddress::where(['order_id'=>$id])->find():'';
- $order['orderLog'] = OrderLog::where(['order_id'=>$id])->field('id,type,createtime,content')->order('id desc')->select();
- $order['shopInfo'] = $order['shop_id']?Shop::getShop($order['shop_id']):'';
- $order['skillInfo'] = $order['skill_id']?Skill::getOrderSkill($order['skill_id']):'';
- return $order;
- }
- public static function getTemplateOrderInfo($id)
- {
- $order = db('service_order')->where('id',$id)->field('skill_id,to_shop,orderId,memo as note,status,starttime as time,payprice as price')->find();
- $order['cate'] = OrderDetail::where('order_id',$id)->value('name');
- $order['address'] = $order['to_shop'] == 'door'?implode('',db('service_order_address')->where(['order_id'=>$id])->field('district,address')->find()):'到店服务';
- $order['status'] = self::getStatus($order['status']);
- $order['name'] = $order['skill_id']?Skill::where('id',$order['skill_id'])->value('name'):'';
- return $order;
- }
- public static function getStatus($status)
- {
- $statusAttr = ['待支付','待接单','待出发','已出发','已到达','开始服务','已完成','已评价'];
- return $status == -1?'已取消':$statusAttr[$status];
- }
- public static function shopAccept($order)
- {
- if(!$order)
- {
- throw new Exception('当前订单无法选取接单,请联系管理员');
- }
- OrderLog::create(['order_id'=>$order['id'],'user_id'=>$order['user_id'],'type'=>15,'content'=>'订单已被商户接取']);
- $update['status'] = 1;
- $update['is_pool'] = 0;
- $update['shop_id'] = $order['shop_id'];
- self::where(['id'=>$order['id']])->update($update);
- Shop::where('id',$order['shop_id'])->setInc('salenums');
- return true;
- }
- public static function createComplaintTemplateParams($params)
- {
- $params['status'] = $params['state'] == 1?'已处理':'已拒绝';
- $templateParams = array_merge($params,['type'=>$params['type'],'templateAttr'=>$params['templateAttr'],'openid'=>$params['openid']]);
- (new \addons\service\library\MiniSms())->sendMessage($templateParams);
- return true;
- }
- public static function createRefundTemplateParams($params)
- {
- $templateOrder = self::refundOrderTemplate($params);
- $templateParams = array_merge($templateOrder,['id'=>$params['id'],'type'=>$params['type'],'templateAttr'=>$params['templateAttr'],'openid'=>$params['openid'],'note'=>$params['note']]);
- (new \addons\service\library\MiniSms())->sendMessage($templateParams);
- return true;
- }
- public static function refundOrderTemplate($params)
- {
- $refundOrder =RefundOrder::where('order_id',$params['id'])->field('id,state')->find();
- $params['cate'] = OrderDetail::where('order_id',$params['id'])->value('name');
- $params['status'] = $refundOrder?$refundOrder['state'] == 1?'审核通过':'审核拒绝':'审核通过';
- $params['time'] = time();
- return $params;
- }
- public static function accept($params)
- {
- $order = self::where(['status'=>1,'id'=>$params['id']])->field('id,user_id,skill_id,is_pool,starttime,actendtime,to_shop')->find();
- if(!$order)
- {
- throw new Exception('当前订单无法选取接单,请联系管理员');
- }
- OrderLog::create(['order_id'=>$order['id'],'user_id'=>$order['user_id'],'type'=>2,'content'=>'订单已被服务者接取']);
- $update['accepttime']= time();
- $update['status'] = 2;
- if($order['is_pool'] == 1)
- {
- $update['is_pool'] = 0;
- $update['skill_id'] = $params['skill_id'];
- $update['shop_id'] = $params['shop_id'];
- $exist = SkillTime::where(['skill_id'=>$params['skill_id'],'state'=>['in',[1,2]],'starttime'=>['between',[$order['starttime'],$order['actendtime']]]])->value('id');
- if($exist)
- {
- throw new Exception('当前项目时间区间有被预约');
- }
- SkillTime::updateSkillTime(['skill_id'=>$params['skill_id'],'starttime'=>$order['starttime'],'actendtime'=>$order['actendtime']],1);
- Skill::where('id',$params['skill_id'])->inc('salenums')->update();
- }
- self::where(['id'=>$order['id']])->update($update);
- $userOpenid = UserInfo::getOpenid($order['user_id'],0);
- self::createOrderTemplateParams(['id'=>$order['id'],'user_id'=>$order['user_id'],'to_shop'=>$order['to_shop'],'type'=>0,'note'=>'有问题请联系客服','templateAttr'=>'user_notice_template','openid'=>$userOpenid]);
- return true;
- }
- public static function createOrderTemplateParams($order)
- {
- $templateOrder = self::getTemplateOrderInfo($order['id']);
- $templateParams = array_merge($templateOrder,['id'=>$order['id'],'type'=>$order['type'],'templateAttr'=>$order['templateAttr'],'openid'=>$order['openid']]);
- (new \addons\service\library\MiniSms())->sendMessage($templateParams);
- return true;
- }
- public static function go($params)
- {
- $order = self::where(['status'=>2,'id'=>$params['id']])->field('id,user_id,to_shop,skill_id')->find();
- if(!$order)
- {
- throw new Exception('当前订单状态异常');
- }
- OrderLog::create(['order_id'=>$params['id'],'user_id'=>$order['user_id'],'type'=>3,'content'=>'服务人员已出发']);
- self::where(['id'=>$params['id']])->update(['reachtime'=>time(),'status'=>3]);
- return true;
- }
- public static function reach($params)
- {
- $order = self::where(['status'=>3,'id'=>$params['id']])->field('id,user_id,to_shop')->find();
- if(!$order)
- {
- throw new Exception('当前订单状态异常');
- }
- OrderLog::create(['order_id'=>$params['id'],'user_id'=>$order['user_id'],'type'=>4,'content'=>'服务人员已到达']);
- self::where(['id'=>$params['id']])->update(['reachtime'=>time(),'status'=>4,'reach_images'=> $params['reach_images'] ?? '']);
- return true;
- }
- public static function skillStart($params)
- {
- $order = self::where(['status'=>4,'id'=>$params['id']])->field('id,user_id,to_shop,skill_id')->find();
- if(!$order)
- {
- throw new Exception('当前订单状态异常');
- }
- OrderLog::create(['order_id'=>$params['id'],'user_id'=>$order['user_id'],'type'=>5,'content'=>'服务人员已开始服务']);
- self::where(['id'=>$params['id']])->update(['servicetime'=>time(),'status'=>5]);
- $userOpenid = UserInfo::getOpenid($order['user_id'],0);
- Order::createOrderTemplateParams(['id'=>$order['id'],'user_id'=>$order['user_id'],'to_shop'=>$order['to_shop'],'note'=>'有问题请联系客服','type'=>0,'templateAttr'=>'user_order_template','openid'=>$userOpenid]);
- return true;
- }
- public static function skillFinish($params)
- {
- $order = self::where(['status'=>['in',[2,5]],'id'=>$params['id']])->field('id,to_shop,leader_id,rec_leader_id,user_id,skill_id,status,shop_id,goods_total_price,shop_id,payprice,travel_price,price,sumprice,premium_price,coupon_price,add_price')->find();
- if(!$order)
- {
- throw new Exception('当前订单状态异常,无法确认完成');
- }
- //更新订单,进行订单待结算
- self::where(['id'=>$params['id']])->update(['status'=>6,'finish_images'=>isset($params['finish_images'])?$params['finish_images']:'','finishtime'=>time()]);
- self::orderFinish($order);
- $userOpenid = UserInfo::getOpenid($order['user_id'],0);
- self::createOrderTemplateParams(['id'=>$order['id'],'user_id'=>$order['user_id'],'to_shop'=>$order['to_shop'],'type'=>0,'note'=>'有问题请联系客服','templateAttr'=>'order_finish_template','openid'=>$userOpenid]);
- if($order['shop_id'])
- {
- $shopOpenid = UserInfo::getOpenid($order['shop_id'],2);
- self::createOrderTemplateParams(['id'=>$order['id'],'user_id'=>$order['user_id'],'to_shop'=>$order['to_shop'],'type'=>2,'templateAttr'=>'shop_finish_template','openid'=>$shopOpenid]);
- }
- return true;
- }
- public static function orderFinish($order)
- {
- OrderLog::create(['order_id'=>$order['id'],'user_id'=>$order['user_id'],'type'=>6,'content'=>'服务人员已完成服务']);
- $settleDay = $order['shop_id']?Shop::getSettleDay($order['shop_id']):ProjectConfig::getProjectConfig('settle_day');
- $settletime = $settleDay*86400+time();
- $totalPrice = bcadd(($order['goods_total_price']+$order['premium_price']),$order['add_price'],2);
- $settlePrice =$order['coupon_price'] > 0 ?bcsub($totalPrice,$order['coupon_price'],2): $totalPrice;
-
- $update = ['is_settle'=>1,'settletime'=>$settletime,'settle_price'=>$settlePrice];
- //走这先确定结算方式和结算金额,等到结算日期直接放入账户即可
- if($order['skill_id'])
- {
- $update['skill_percent'] = Skill::where('id',$order['skill_id'])->value('percent');
- }
- if($order['shop_id'])
- {
- $update['shop_percent'] = Shop::where('id',$order['shop_id'])->value('percent');
- }
-
- self::where(['id'=>$order['id']])->update($update);
- Rebate::orderRebate($order);
- UserInfo::where('user_id',$order['user_id'])->setInc('total_price',$order['payprice']);
- $userInfo = UserInfo::where('user_id',$order['user_id'])->field('total_price,user_id')->find();
- return true;
- }
- public static function checkOrder($order)
- {
- if(!$order)
- {
- throw new Exception('订单信息异常,无法核销');
- }
- self::where(['id'=>$order['id']])->update(['status'=>6,'finishtime'=>time()]);
- self::orderFinish($order);
- $shopOpenid = UserInfo::getOpenid($order['shop_id'],2);
- self::createOrderTemplateParams(['id'=>$order['id'],'user_id'=>$order['id'],'to_shop'=>$order['to_shop'],'type'=>2,'templateAttr'=>'shop_order_template','openid'=>$shopOpenid]);
- return true;
- }
- public function adddetail()
- {
- return $this->hasMany('AddOrderDetail','order_id');
- }
- public function detail()
- {
- return $this->hasMany('OrderDetail','order_id');
- }
- }
|