123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440 |
- <?php
- namespace app\common\model;
- use app\common\util\AppMsg;
- use app\hander\HelpHander;
- use think\Db;
- use think\Exception;
- use think\Log;
- use tools\Hwsms;
- class PhOrders extends Base
- {
- protected $table = 'ph_orders';
- public $status = [ //0=待分配 1=进行中 2=已完成 3=已作废 4=已结算
- 0=>'待分配',
- 1=>'进行中',
- 2=>'已完成',
- 3=>'已作废',
- 4=>'已结算',
- ];
- // 前端预约单
- public function bookOrder(){
- $data = [
- 'user_id' => input('userId/d',0),
- 'org_id' => input('orgId/d',0),
- 'contact' => input('contact','','trim'),
- 'phone' => input('phone','','trim'),
- 'name' => input('name','','trim'),
- 'gender' => input('gender/d',1),
- 'age' => input('age/d',0),
- 'bed' => input('bed','','trim'),
- 'ill' => input('ill','','trim'),
- 'start' => input('start',null,'trim'),
- 'remark' => input('remark','','trim'),
- 'dep_id' => input('depId/d',0),
- 'sn' => get_unique_id(),
- 'form' => 1,
- 'cate_id' => input('cateId/d','','trim'),
- 'is_service' => 0,
- ];
- $serviceMoney = model("Config")->getConfig("web_service_money",$data['org_id']);
- $serviceMoney = floatval($serviceMoney) > 0? floatval($serviceMoney) : 0;
- if($serviceMoney <= 0){
- $data['is_service'] = 1;
- }
- $data['service_money'] = $serviceMoney;
- $sign = input('sign','','trim');
- if(!$sign){
- $this->error = "未上传签名图";
- return false;
- }
- // 上传签名
- $file = $this->base64File($sign);
- if ($file) {
- $data['sign'] = $file;
- } else {
- $this->error = "签名图上传失败";
- return false;
- }
- $validate = new \app\common\validate\PhOrders();
- $result = $validate->scene('book')->check($data,[]);
- if(true !== $result){
- $this->error = $validate->getError();
- return false;
- }
- $cate = Db::name('cate')->where('id',$data['cate_id'])->find();
- $data['price'] = $cate?$cate['price']:0;
- Db::startTrans();
- try{
- $data['status'] = 0;
- $data['create_time'] = date('Y-m-d H:i:s');
- $orderId = Db::name('ph_orders')->insertGetId($data);
- if(!$orderId){
- \exception('创建订单失败');
- }
- $payId = -1;
- if($serviceMoney > 0){ // 服务费
- $payId = model("PhOrderPay")->addSave($data['user_id'],$data['org_id'],$orderId,$serviceMoney,1);
- }
- Db::commit();
- }catch (Exception $e){
- Db::rollback();
- \think\facade\Log::write($e->getMessage(), 'info');
- $this->error = $e->getMessage();
- return false;
- }
- if($data['is_service'] == 1){
- $this->sendSmsDispatch($data['name'],$data['phone'],$data['org_id'],$orderId);
- }
- return $payId;
- }
- // Base64字符串转文件
- public function base64File($base64_image_content)
- {
- if (preg_match('/^data:image\/(\w+);base64,/', $base64_image_content, $result)) {
- $type = $result[1]; // 图片类型
- $filename = md5(time()."|".$base64_image_content.'|'.mt_rand(1000,9999));
- $new_file = "uploads/phsign/".$filename."." . $type;
- if (file_put_contents($new_file, base64_decode(str_replace($result[0], '', $base64_image_content)))) {
- // return new \think\File($new_file, md5_file($new_file) . '.' . $type);
- return config("app.app_host").'/'.$new_file;
- }
- }
- return false;
- }
- // 给调度短信发消息
- private function sendSmsDispatch($contact,$phone,$orgId,$fromId=0){
- $users = (new User())->get_ph_dispatch_user($orgId);
- foreach ($users as $k=>$v){
- if($v['mobile']){
- // 添加短信队列
- $content = AppMsg::getSmsMsg(AppMsg::SMS_PH_DISPATCH,[
- 'name' => $v['real_name'],
- 'contact' => $contact,
- 'phone' => $phone
- ]);
- $json = [
- 'orgId' => $orgId,
- 'mobiles' => [$v['mobile']],
- 'msg' => $content,
- 'fromId' => $fromId,
- 'type' => 2
- ];
- queue_push(json_encode($json),1);
- }
- // 添加推送队列 例:{"users":[1,2,3],"type":1,"msg":"有新订单需要你的处理","extra"=>[]}
- $json = [
- 'users' => [$v['id']],
- 'msg' => $content,
- 'extra' => [],
- 'type' => AppMsg::PUSH_PH_DISPATCH
- ];
- queue_push(json_encode($json),0);
- }
- }
- // 添加订单
- public function addSave($userId,$orgId,$type=0){ // type 1=调度端发单 0=后台发单
- $data = request()->post();
- $cate = isset($data['cateId'])?$data['cateId']:0;
- unset($data['cateId']);
- $data['dep_id'] =isset($data['depId'])?$data['depId']:0;
- $data['cate_id'] = $cate;
- $data['pre_money'] =isset($data['preMoney'])?$data['preMoney']:0;
- $data['org_id'] = $orgId;
- $data['user_id'] = $userId;
- $data['sn'] = get_unique_id();
- if(isset($data['userId'])){
- unset($data['userId'],$data['token'],$data['orgId']);
- }
- unset($data['depId'],$data['preMoney']);
- $validate = new \app\common\validate\PhOrders();
- $scene = 'add';
- if($type == 1){
- $scene = 'qadd';
- }
- $result = $validate->scene($scene)->check($data,[]);
- if(true !== $result){
- $this->error = $validate->getError();
- return false;
- }
- $data['start'] = $data['start']?$data['start']:null;
- $uids = $data['uids']?explode(',',$data['uids']):[];
- unset($data['uids']);
- if($uids && !$data['start']){
- $this->error = '未选择开始时间';
- return false;
- }
- Db::startTrans();
- try{
- $data['status'] = 0;
- $data['create_time'] = date('Y-m-d H:i:s');
- if($uids){
- $data['status'] = 1;
- }
- $ret = $this->insertGetId($data);
- if(!$ret){
- \exception('创建订单失败');
- }
- $orderId = $ret;
- if($uids){ // 创建工单
- $ph_todos = [];
- foreach ($uids as $k=>$v){
- $ph_todos[] = [
- 'org_id' => $data['org_id'],
- 'order_id' => $orderId,
- 'user_id' => $userId,
- 'worker_id' => $v,
- 'start' => $data['start'],
- 'create_time' => date('Y-m-d H:i:s'),
- 'status' => 1
- ];
- }
- $ret = Db::name('ph_todo')->insertAll($ph_todos);
- if($ret != count($ph_todos)){
- \exception('创建订单失败');
- }
- }
- Db::commit();
- return true;
- }catch (Exception $e){
- Db::rollback();
- \think\facade\Log::write($e->getMessage(), 'info');
- $this->error = $e->getMessage();
- return false;
- }
- }
- public function editSave($userId,$orgId){
- $data = request()->post();
- $validate = new \app\common\validate\PhOrders();
- $result = $validate->scene('edit')->check($data,[]);
- if(true !== $result){
- $this->error = $validate->getError();
- return false;
- }
- $data['start'] = $data['start']?$data['start']:null;
- $data['end'] = $data['end']?$data['end']:null;
- $old = Db::name('ph_orders')
- ->where('id',$data['id'])->find();
- if(!$old){
- $this->error = '订单不存在';
- return false;
- }
- if($old['status'] == 4){
- $this->error = '已结算的订单不能修改';
- return false;
- }
- Db::startTrans();
- try{
- $data['update_time'] = date('Y-m-d H:i:s');
- $orderId = Db::name('ph_orders')
- ->where('id',$data['id'])->update($data);
- if(!$orderId){
- \exception('创建订单失败');
- }
- Db::commit();
- $this->saveLog($userId,$orgId,$data['id'],1,$old);// 订单修改日志
- return true;
- }catch (Exception $e){
- Db::rollback();
- \think\facade\Log::write($e->getMessage(), 'info');
- $this->error = $e->getMessage();
- return false;
- }
- }
- // 派单
- public function sendSave($userId,$orgId){
- $data = [
- 'id' => input('id/d',0),
- // 'cate_id' => input('cate_id/d',0),
- // 'price' => input('price/f',0),
- 'uids' => input('uids','','trim'),
- 'start' => input('start',null,'trim'),
- 'remark' => input('remark','','trim'),
- ];
- // $cateId = input('cateId');
- //
- // $data['cate_id'] = $cateId?$cateId:$data['cate_id'];
- $uids = $data['uids']?explode(',',$data['uids']):[];
- if(!$uids){
- $this->error ='请选择执行护工';
- return false;
- }
- unset($data['uids']);
- if(!$data['start']){
- $this->error = '未选择开始时间';
- return false;
- }
- if($uids){
- $ph_todo = Db::name('ph_todo')
- ->where('order_id',$data['id'])
- ->where('status',1)
- ->where('user_id','in',$uids)
- ->find();
- if($ph_todo){
- $this->error = '此订单正在服务中';
- return false;
- }
- }
- $info = Db::name('ph_orders')
- ->where('id',$data['id'])->find();
- if(!$info){
- $this->error = '订单不存在';
- return false;
- }
- if(!in_array($info['status'],[0,1])){
- $this->error = '订单该状态无法派单';
- return false;
- }
- if($data['start'] && $info['start'] && $data['start'] < $info['start']){
- $this->error = '开始时间不能小于订单的开始时间';
- return false;
- }
- Db::startTrans();
- try{
- if($uids){
- foreach ($uids as $k=>$v){
- $todoList = Db::name('ph_todo')->where('order_id',$data['id'])->where('worker_id',$v)->whereIn('status',[1,2])->select();
- if(count($todoList) >= 1){
- $arr = $this->compareDate($todoList,$data['start']);
- if(!$arr){
- $this->error = '该护工在此时间段工单未完成,不能派单';
- return false;
- }
- }
- }
- }
- $sdata['update_time'] = date('Y-m-d H:i:s');
- $sdata['status'] = 1;
- // $sdata['cate_id'] = $data['cate_id'];
- // $sdata['price'] = $data['price'];
- if($info['status'] == 0){
- $orderId = Db::name('ph_orders')
- ->where('id',$data['id'])->update($sdata);
- if(!$orderId){
- \exception('订单修改失败');
- }
- }
- if($uids){ // 创建工单
- $todos = [];
- foreach ($uids as $k=>$v){
- $todos[] = [
- 'org_id' => $orgId,
- 'order_id' => $data['id'],
- 'user_id' => $userId,
- 'worker_id' => $v,
- 'start' => $data['start'],
- 'remark' => $data['remark'],
- 'create_time' => date('Y-m-d H:i:s'),
- 'status' => 1
- ];
- }
- $ret = Db::name('ph_todo')->insertAll($todos);
- if($ret != count($todos)){
- \exception('创建订单失败');
- }
- }
- Db::commit();
- return true;
- }catch (Exception $e){
- Db::rollback();
- \think\facade\Log::write($e->getMessage(), 'info');
- $this->error = $e->getMessage();
- return false;
- }
- }
- // 完成订单
- public function finishSave($userId,$orgId){
- $data = [
- 'id' => input('id/d',0),
- 'end' => input('end',null,'trim'),
- 'amount' => input('amount/f',0)
- ];
- if($data['amount'] <= 0){
- $this->error = '收费金额不能小于0';
- return false;
- }
- if(!$data['end']){
- $this->error = '未选择服务结束日期';
- return false;
- }
- $info = Db::name('ph_orders')->where('id',$data['id'])->find();
- if(!$info){
- $this->error = '订单不存在';
- return false;
- }
- if($info['status'] != 1){
- $this->error = '订单该状态无法完成';
- return false;
- }
- if($data['end'] && $info['start'] && $data['end'] < $info['start']){
- $this->error = '结束时间不能小于订单的开始时间';
- return false;
- }
- if($data['amount'] != $info['pre_money']){
- $this->error = '收费金额与预收金不一致,不能完成';
- return false;
- }
- Db::startTrans();
- try{
- $sdata['update_time'] = date('Y-m-d H:i:s');
- $sdata['status'] = 2;
- $sdata['amount'] = $data['amount'];
- $sdata['end'] = $data['end'];
- $orderId = Db::name('ph_orders')->where('id',$data['id'])->update($sdata);
- if(!$orderId){
- \exception('订单修改失败');
- }
- $ph_todos = Db::name('ph_todo')
- ->where('order_id',$data['id'])
- ->where('status',1)->select();
- foreach ($ph_todos as $k=>$v){
- Db::name('ph_todo')->where('id',$v['id'])->update([
- 'update_time' => date('Y-m-d H:i:s'),
- 'status' => 2,
- 'end' => $data['end'],
- 'day' => $this->getWorkerDay($v['start'],$data['end'])
- ]);
- }
- Db::commit();
- return true;
- }catch (Exception $e){
- Db::rollback();
- \think\facade\Log::write($e->getMessage(), 'info');
- $this->error = $e->getMessage();
- return false;
- }
- }
- // 修改工单
- public function edit_todo($userId,$orgId){
- $data = [
- 'id' => input('id/d',0),
- 'start' => input('start',null,'trim'),
- 'end' => input('end',null,'trim'),
- 'remark' => input('remark','','trim'),
- 'status' => input('status/d',0),
- 'day' => input('day/f',0)
- ];
- $ph_todo = Db::name('ph_todo')->where('id',$data['id'])->find();
- if(!$ph_todo){
- $this->error = '工单不存在';
- return false;
- }
- $info = Db::name('ph_orders')->where('id',$ph_todo['order_id'])->find();
- if(!$info){
- $this->error = '订单不存在';
- return false;
- }
- if($info['status'] == 3||$info['status'] == 4){
- $this->error = '订单该状态无法修改工单';
- return false;
- }
- if(!$data['start'] || !$data['end']){
- $this->error = '未选择开始时间或结束时间';
- return false;
- }
- if($data['end'] && $info['start'] && $data['end'] < $info['start']){
- $this->error = '结束时间不能小于订单的开始时间';
- return false;
- }
- $todoList = Db::name('ph_todo')
- ->where('order_id',$info['id'])
- ->group('user_id')
- ->select();
- foreach ($todoList as $k=>$v){
- $todos = Db::name('ph_todo')
- ->where('order_id',$v['order_id'])
- ->where('user_id',$v['user_id'])
- ->where('id','<>',$data['id'])
- ->select();
- if(count($todos) >=1){
- foreach ($todos as $kk=>$vv){
- $ret = $this->is_time_cross($data['start'],$data['end'],$vv['start'],$vv['end']);
- if($ret){
- $this->error = '该时间段有未完成的工单,不能修改';
- return false;
- }
- }
- }
- }
- Db::startTrans();
- try{
- $data['update_time'] = date('Y-m-d H:i:s');
- if($data['day'] <= 0){
- $data['day'] = $this->getWorkerDay($data['start'],$data['end']);
- }
- $ret = Db::name('ph_todo')->where('id',$data['id'])->update($data);
- if(!$ret){
- \exception('工单修改失败');
- }
- Db::commit();
- $this->saveLog($userId,$orgId,$data['id'],2,$ph_todo);// 工单修改日志
- return true;
- }catch (Exception $e){
- Db::rollback();
- \think\facade\Log::write($e->getMessage(), 'info');
- $this->error = $e->getMessage();
- return false;
- }
- }
- // 计算工期
- public function getWorkerDay($start,$end){
- if($end <= $start||!$start||!$end){
- return 0;
- }
- $day1 = date('Y-m-d',strtotime($start));
- $day2 = date('Y-m-d',strtotime($end));
- $day = 0;
- if($day1 == $day2){ // 当天
- if($start < $day1.' 12:00:00' && $end < $day1.' 12:00:00'){
- $day = 0.5;
- }else if($start < $day1.' 12:00:00' && $end < $day1.' 12:00:00'){
- $day = 0.5;
- }else {
- $day = 1;
- }
- }else{ // 跨天
- if($start < $day1.' 12:00:00'){
- $day = 1;
- }else{
- $day = 0.5;
- }
- $i = 1;
- while (true){
- $dd = date('Y-m-d',strtotime($start) + $i*24*60*60);
- if($dd == $day2){
- if($end != $day2.' 00:00:00'){
- if($end > $day2.' 00:00:00'&&$end <= $day2.' 12:00:00'){
- $day += 0.5;
- }else{
- $day += 1;
- }
- }
- break;
- }else{
- $day += 1;
- $i++;
- }
- }
- }
- return $day;
- }
- public function saveLog($userId,$orgId,$id,$type,$old){
- if($type == 1){ // 修改订单
- $new = Db::name('ph_orders')
- ->where('id',$id)->find();
- }else{
- $new = Db::name('ph_todo')->where('id',$id)->find();
- }
- $data = [
- 'org_id' => $orgId,
- 'user_id' => $userId,
- 'type' => $type,
- 'bus_id' => $id,
- 'old_data' => json_encode($old,JSON_UNESCAPED_UNICODE),
- 'new_data' => json_encode($new,JSON_UNESCAPED_UNICODE),
- 'create_time' => date('Y-m-d H:i:s')
- ];
- Db::name('ph_orders_log')->insert($data);
- }
- public function getInfo($id,$orgId=0){
- $info = $this->where('id',$id)->find()->toArray();
- $off = model('Config')->getConfig('ph_order_cancel_time',cur_org_id());
- $info['is_zf'] = 0;
- if($off){
- $start = strtotime($info['create_time']) + $off*60*60;
- $end = strtotime(date('Y-m-d H:i:s'));
- if($start < $end){
- $info['is_zf'] = 1;
- }
- }
- $info['end'] = $info['end']? $info['end']:'';
- $info['cancel_time'] = $info['cancel_time']? $info['cancel_time']:'';
- $info['update_time'] = $info['update_time']? $info['update_time']:'';
- $info['settlementUseId'] = $info['settlement_use_id']? $info['settlement_use_id']:0;
- $info['settlement_time'] = $info['settlement_time']? $info['settlement_time']:"";
- if($info){
- $info['cate_name'] = '';
- if($info['cate_id'] > 0){
- $info['cate_name'] = Db::name('cate')
- ->where('id',$info['cate_id'])
- ->value('title');
- }
- $info['dep_name'] = '';
- if($info['dep_id'] > 0){
- $info['dep_name'] = Db::name('dep')
- ->where('id',$info['dep_id'])
- ->value('title');
- }
- $info['user_name'] = '';
- if($info['user_id'] > 0){
- $info['user_name'] = Db::name('user')
- ->where('id',$info['user_id'])
- ->value('real_name');
- if(empty($info['user_name'])){
- $info['user_name'] = Db::name('wxuser')
- ->where('id',$info['user_id'])
- ->value('nickname');
- }
- }
- $info['cancel_user_name'] = '';
- if($info['cancel_user_id'] > 0){
- $info['cancel_user_name'] = Db::name('user')
- ->where('id',$info['cancel_user_id'])
- ->value('real_name');
- }
- $info['settlement_use_name'] = '';
- if($info['settlement_use_id'] > 0){
- $info['settlement_use_name'] = Db::name('user')
- ->where('id',$info['settlement_use_id'])
- ->value('real_name');
- }
- $todos = Db::name('ph_todo')
- ->where('order_id',$id)->select();
- foreach ($todos as $k=>$v){
- $todos[$k]['user_name'] = Db::name('user')
- ->where('id',$v['user_id'])
- ->value('real_name');
- $user_id = Db::name('worker')
- ->where('id',$v['worker_id'])
- ->value('user_id');
- $todos[$k]['worker_name'] = Db::name('user')
- ->where('id',$user_id)
- ->value('real_name');
- $todos[$k]['end'] = $v['end']? $info['end']:"";
- }
- $info['todo'] = $todos;
- // 获取缴费记录-预收款
- $pays = Db::name('ph_order_pay')->where('status',1)->where('bus_type',0)->where('order_id',$id)->select();
- $pays = $pays?$pays:[];
- $info['pays'] = $pays;
- // 获取缴费记录-服务费
- $pays = Db::name('ph_order_pay')->where('status',1)->where('bus_type',1)->where('order_id',$id)->select();
- $pays = $pays?$pays:[];
- $info['pays2'] = $pays;
- $info['serviceFee'] = empty($pays)?0:1;
- // 获取预收金退款记录
- $refunds = Db::name('ph_order_refund')
- ->alias('a')
- ->join('ph_order_pay b','a.pay_id = b.id')
- ->where('b.status',1)
- ->where('b.bus_type',0)
- ->where('b.order_id',$id)
- ->field('a.*')
- ->select();
- $refunds = $refunds?$refunds:[];
- $info['refunds'] = $refunds;
- // 获取服务费退款记录
- $refunds2 = Db::name('ph_order_refund')
- ->alias('a')
- ->join('ph_order_pay b','a.pay_id = b.id')
- ->where('b.status',1)
- ->where('b.bus_type',1)
- ->where('b.order_id',$id)
- ->field('a.*')
- ->select();
- $refunds2 = $refunds2?$refunds2:[];
- $info['refunds2'] = $refunds2;
- //固定服务费金额
- if ($orgId>0){
- $serviceMoney = model("Config")->getConfig("web_service_money",$orgId);
- $serviceMoney = floatval($serviceMoney) > 0? floatval($serviceMoney) : 0;
- $info['serviceCharge'] = $serviceMoney;
- }
- }
- return $info;
- }
- public function orderTotal($start,$end,$price){
- $day = diffBetweenTwoDays($start,$end);
- $day = $day > 0?$day:1;
- return $day*$price;
- }
- //验证用户是否有待支付追加金额的订单
- public function checkAddAmount($userId){
- $ret = $this
- ->where('user_id',$userId)
- ->where('status',2)
- ->where('completion',0)
- ->where('end','<',date('Y-m-d'))
- ->where('add_amount','>',0)
- ->find();
- return $ret?false:true;
- }
- //订单详情
- public function orderDetail($id,$type=0){
- $map = [];
- if($type==0){
- $map[] = ['user_del','=',0];
- }elseif ($type==1){
- $map[] = ['worker_del','=',0];
- }
- $info = $this->where('id',$id)->where($map)
- ->find()->toArray();
- if(empty($info)) HelpHander::error('订单信息不存在');
- $info['start'] = date('Y/m/d',strtotime($info['start']));
- $info['end'] = date('Y/m/d',strtotime($info['end']));
- $info['orgName'] = Db::name('org')
- ->where('id',$info['org_id'])->value('title');
- $info['addrTitle'] = (new Worker())->getAddressName($info['addr_id']);
- $info['userInfo'] = (new User())->getUserInfo($info['user_id']);
- $info['workerInfo'] = (new Worker())->workerDetail($info['worker_id'],$info['org_id'],$info['user_id']);
- $info['cateInfo'] = (new Cate())->info($info['cate_id']);
- $info['selfcareInfo'] = Db::name('options')->where('id',$info['selfcare'])
- ->where('type',1)->value('title');
- $info['refundInfo'] = [];
- if($info['refund_status']==1){//退款明细
- $info['refundInfo'] = (new OrderRefund())->info($info['id']);
- $info['statusName'] =(new OrderRefund())->status[$info['refundInfo']['status']];
- }else{
- $info['statusName'] = $this->status[$info['status']];
- }
- $cancelName = '';
- $cancelType = '';
- if($info['status']==5){
- if($info['cancel_type']==3){
- $cancelName =$cancelType= '系统取消';
- }
- if($info['cancel_type']==2){
- $cancelName = Db::name('user')->
- where('id',$info['cancel_user_id'])
- ->value('nickname');
- $cancelType = '用户取消';
- }
- if($info['cancel_type']==1){
- $cancelName = Db::name('worker')->
- where('id',$info['cancel_user_id'])
- ->value('name');
- $cancelType = '护工取消';
- }
- }
- $info['cancelName'] = $cancelName;
- $info['cancelType'] = $cancelType;
- $info['cancelTypeId'] = $info['cancel_type'];
- // 添加订单评价信息
- $info['comment'] = null;
- if($info['status'] == 5){
- $comment = Db::name('comment')->where('order_id',$id)->find();
- $info['comment'] = $comment;
- }
- $info['addOrderInfo'] = [];
- if($info['add_amount']>0){//追加金额明细
- $addOrder = Db::name('order_add')
- ->alias('a')
- ->join('options b','a.options_id=b.id')
- ->where('a.order_id',$info['id'])
- ->field('a.*,b.title')
- ->select()
- ->toArray();
- $info['addOrderInfo'] = $addOrder;
- }
- return $info;
- }
- //订单列表
- public function orderList($orgId,$status,$page,$size,$userId=0){
- $start = ($page - 1) * $size;
- if($status >= 0){
- if($userId >0){
- if($status==2){
- $map[] = ['status','in',[2,4]];
- }else{
- $map[] = ['status','=',$status];
- }
- }
- }
- if($userId > 0){
- $map[] = ['user_id','=',$userId];
- $map[] = ['form','=',1];
- }
- $map[] = ['org_id', '=', $orgId];
- $map[] = ['is_service', '=', 1];
- $list = $this->where($map)
- ->limit($start,$size)
- ->order('id','desc')
- ->select();
- $list = $list?$list->toArray():[];
- foreach ($list as $k=>$v){
- }
- return $list;
- }
- //调度订单列表
- public function orderList1($orgId,$userId,$status,$page,$size){
- $start = ($page - 1) * $size;
- if($status >= 0){
- if($status==2){
- $map[] = ['status','in',[2,4]];
- }else{
- $map[] = ['status','=',$status];
- }
- }
- // $depId = Db::name('ph_user')
- // ->where('enable',1)
- // ->where('del',0)
- // ->where('org_id',$orgId)
- // ->where('user',$userId)
- // ->value('dep');
- // $depId = explode(',',$depId);
- // if (!empty($depId)) {
- // $map[] = ['dep_id','in',$depId];
- // }else{
- // $map[] = ['dep_id','=',0];
- // }
- $map[] = ['org_id', '=', $orgId];
- $map[] = ['is_service', '=', 1];
- $list = $this->where($map)
- ->limit($start,$size)
- ->field('id,sn,contact,phone,start,create_time,name,bed,price,dep_id')
- ->order('id','desc')
- ->select();
- $list = $list?$list->toArray():[];
- foreach ($list as $k=>$v){
- $list[$k]['dep'] = Db::name('dep')->where('id',$v['dep_id'])->value('title');
- $workerId = Db::name('ph_todo')->where('order_id',$v['id'])->column('worker_id');
- foreach ($workerId as $k1=>$v1){
- $workerId[$k1] = Db::name('worker')
- ->alias('a')
- ->join('user b','a.user_id=b.id')
- ->where('a.id',$v1)
- ->value('b.real_name');
- }
- $list[$k]['worker'] = implode(',',$workerId);
- }
- return $list;
- }
- //订单列表
- public function workerOrderList($orgId,$status,$page,$size,$userId=0){
- $start = ($page - 1) * $size;
- if($status >= 0){
- $map[] = ['status','=',$status];
- }else{
- $map[] = ['status','>',0];
- }
- $worker = Db::name('worker')
- ->where('user_id',$userId)
- ->find();
- if(empty($worker)){
- return [];
- }
- $map[] = ['org_id', '=', $orgId];
- $map[] = ['worker_id', '=', $worker['id']];
- $todo = Db::name('ph_todo')
- ->where($map)
- ->field('id,start,day,status,create_time')
- ->limit($start,$size)
- ->order(['id'=>'desc'])
- ->select();
- return $todo;
- }
- //取消订单
- public function cancelOrder($id,$note,$userId){
- if(!$note){
- $this->error = '未填写作废原因';
- return false;
- }
- $info = Db::name('ph_orders')
- ->where('id',$id)->find();
- if(!$info){
- $this->error = '订单不存在';
- return false;
- }
- if($info['status'] == 3||$info['status'] == 4){
- $this->error = '订单已作废或已结算';
- return false;
- }
- $off = model('Config')->getConfig('ph_order_cancel_time',cur_org_id());
- if($off){
- $info = Db::name('ph_orders')->where('id',$id)->find();
- $start = strtotime($info['create_time']) + $off*60*60;
- $end = strtotime(date('Y-m-d H:i:s'));
- if($start < $end){
- $this->error = '该订单已超过作废时间';
- return false;
- }
- }
- Db::startTrans();
- try{
- $res =Db::name('ph_orders')
- ->where('id',$id)
- ->update([
- 'status'=>3,
- 'cancel_reason'=>$note,
- 'cancel_time'=>getTime(),
- 'cancel_user_id'=>$userId
- ]);
- if(!$res){
- \exception('操作失败');
- }
- Db::name('ph_todo')->where('order_id',$id)->update(['status' => 0]);
- Db::commit();
- }catch (Exception $e){
- Db::rollback();
- \think\facade\Log::write($e->getMessage(), 'info');
- $this->error = '操作失败';
- return false;
- }
- return true;
- }
- //用户护工删除订单
- public function delOrder($id,$userId,$type=0){
- $info = $this->getOrderDetail($id,$userId,$type);
- if(!in_array($info['status'],[3,4,5])) HelpHander::error('当前订单状态不能删除');
- if($type==0){
- $params = ['user_del'=>1,'user_del_time'=>getTime()];
- }else{
- $params = ['worker_del'=>1,'worker_del_time'=>getTime()];
- }
- $res = $this->where('id',$id)
- ->update($params);
- return $res;
- }
- //用户发起退款
- public function orderRefund($id,$amount,$reason,$desc,$userId){
- $info = $this->getOrderDetail($id,$userId);
- if($info['amount'] < $amount) HelpHander::error('退款金额不能大于订单金额');
- if($info['refund_status']==1) HelpHander::error('当前订单已申请过退款');
- if(!in_array($info['status'],[1,2])) HelpHander::error('当前订单状态不能退款');
- $refundModel = new OrderRefund();
- Db::startTrans();
- try{
- $params = [
- 'sn'=>get_unique_id(),
- 'order_id'=>$id,
- 'user_id'=>$userId,
- 'amount'=>$amount,
- 'reason'=>$reason,
- 'desc'=>$desc,
- 'is_cx'=>0,
- 'create_time'=>getTime(),
- ];
- if($refundModel->info($id)){
- if(!$refundModel->where('order_id',$id)->save($params)) exception('保存退款单失败');
- }else{
- if(!$refundModel->save($params)) exception('保存退款单失败');
- }
- if(!$this->where('id',$id)->update(['refund_status'=>1])){
- exception('更新订单失败');
- }
- $om = new \app\model\OrderMessage();
- $om->saveMassage($userId,'发起退款申请');
- Db::commit();
- return true;
- }catch (Exception $e){
- HelpHander::error($e->getMessage());
- Db::rollback();
- }
- }
- public function getOrderDetail($id,$userId,$type=0){
- if($type==0){
- $map[] = ['user_id','=',$userId];
- $map[] = ['user_del','=',0];
- }else{
- $map[] = ['worker_id','=',$userId];
- $map[] = ['worker_del','=',0];
- }
- $info = $this
- ->where('id',$id)
- ->where($map)
- ->find();
- if(empty($info)) HelpHander::error('订单信息不存在');
- return $info;
- }
- //护工领取订单
- public function orderReceive($workerId,$id){
- $info = $this->getOrderDetail($id,$workerId,1);
- if($info['status']!=1) HelpHander::error('当前订单已领取');
- $ret = $this->where('id',$id)
- ->save(['status'=>2,'receive_time'=>getTime()]);
- return $ret;
- }
- //撤销退款
- public function cxOrder($id){
- $info = (new OrderRefund())->info($id);
- if($info['status']!=0) HelpHander::error('当前订单不能撤销');
- Db::startTrans();
- try{
- $ret = $this->where('id',$id)
- ->save(['refund_status'=>0,'refund_amount'=>0]);
- if(!$ret) exception('更新订单失败');
- $ret = (new OrderRefund())->where('order_id',$id)
- ->save(['is_cx'=>1,'cx_time'=>getTime()]);
- if(!$ret) exception('退款单更新失败');
- Db::commit();
- return true;
- }catch (Exception $e){
- HelpHander::error($e->getMessage());
- Db::rollback();
- }
- return $ret;
- }
- // 用户正在进行的最新的陪护单
- public function latestOrder($userId){
- $map[] = ['user_id','=',$userId];
- $map[] = ['user_del','=','0'];
- $map[] = ['refund_status','=','0'];
- $map[] = ['status','=','2'];
- $info = Db::name('ph_orders')->where($map)->order('id desc')->find();
- if($info){
- $worker = Db::name('worker')->where('id',$info['worker_id'])->value('name');
- $info['worker_name'] = $worker?$worker:'';
- }
- return $info?$info:null;
- }
- //获取护工已预订日期
- public function bookDateList($workerId){
- $curday = date('Y-m-d');
- $lists = Db::name('ph_orders')
- ->where('end','>=',$curday)
- ->where('worker_id',$workerId)
- ->where('status','in',[1,2])
- ->where('refund_status',0)
- ->order('id asc')
- ->field('id,start,end,cate_id')
- ->select();
- foreach ($lists as $k=>$v){
- $lists[$k]['cate_name'] = Db::name('cate')->where('id',$v['cate_id'])->value('title');
- }
- return $lists?$lists:[];
- }
- //支付
- public function pay($orderId){
- $params = $this->where('id',$orderId)
- ->find();
- $workerModel = new Worker();
- $cateInfo = (new Cate())->info($params['cate_id']);
- if(!$workerModel->checkServiceNum($params['worker_id'],$cateInfo['nums'],$params['start'],$params['end'],$params['addr_id'],$msg)){
- HelpHander::error($msg);
- }
- $openid = Db::name('user_oauth')->where('user_id',$params['user_id'])->value('openid');
- $config = config('app.wx_config');
- $app = \EasyWeChat\Factory::payment($config);
- $result = $app->order->unify([
- 'body' => '订单-'.$params['sn'],
- 'out_trade_no' => $params['sn'],
- 'total_fee' => $params['amount']*100,
- 'spbill_create_ip' => request()->ip(), // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
- 'notify_url' => (string)url('api/Notify/wxorder',[],false,true), // 支付结果通知网址,如果不设置则会使用配置里的默认地址
- 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
- 'openid' => $openid,
- ]);
- tplog($result);
- if($result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS'){
- HelpHander::error('下单失败1');
- }
- $jssdk = $app->jssdk;
- $json = $jssdk->bridgeConfig($result['prepay_id'],false);
- $json['order_id'] = $orderId;
- return $json;
- }
- //结算订单
- public function js($orderId=[],$web_bl,$web_deduct,$org){
- $succ = [];
- $error = [];
- foreach ($orderId as $k=>$v){
- Db::startTrans();
- try{
- $info = $this->where('id',$v)->find()->toArray();
- $total = $info['amount'];
- $money1 = ($total-$web_deduct)*$web_bl;
- if($money1 > 0){
- $ph_todo = Db::name('ph_todo')
- ->where('order_id',$v)
- ->where('status','<>',0)
- ->select();
- $days = Db::name('ph_todo')
- ->where('order_id',$v)
- ->where('status','<>',0)
- ->sum('day');
- if($days >0){
- $avgPrice = round($money1/$days,2);
- if(!empty($ph_todo)){
- foreach ($ph_todo as $k1=>$v1){
- $workerMoney = Db::name('worker')
- ->where('id',$v1['worker_id'])->value('balance');
- $money = $avgPrice*$v1['day'];
- if($money >0){
- $newMoney = $workerMoney+$money;
- $res = Db::name('worker')
- ->where('id',$v1['worker_id'])
- ->update(['balance'=>$newMoney]);
- if(!$res) \exception('订单id:'.$v.'余额更新失败');
- $res = Db::name('worker')
- ->where('id',$v1['worker_id'])
- ->inc('cumulative_money',$money);
- if(!$res) \exception('订单id:'.$v.'累计收入更新失败');
- $res = Db::name('worker_balance')->insert([
- 'worker_id'=>$v1['worker_id'],
- 'org_id'=>$org,
- 'user_id'=>is_login(),
- 'money'=>$money,
- 'from_id'=>$v,
- 'type'=>1,
- 'remark'=>'id:'.$v.'订单结算('.$info['sn'].')',
- 'create_time'=>date('Y-m-d H:i:s')
- ]);
- if(!$res) \exception('订单id:'.$v.' 结算记录添加失败');
- $cc = [
- 'settlement_money'=>$money
- ];
- $res= Db::name('ph_todo')
- ->where('id',$v1['id'])
- ->update($cc);
- if(!$res) \exception('订单id:'.$v.' 更新ph_todo 失败');
- }
- }
- }
- }
- }
- $res = $this->where('id',$v)
- ->update([
- 'status'=>4,
- 'settlement_money'=>$money1 >0?$money1:0,
- 'settlement_use_id'=>is_login(),
- 'settlement_time'=>date('Y-m-d H:i:s'),
- ]);
- if(!$res) \exception('订单id:'.$v.'更新失败');
- Db::commit();
- $succ[] = $v;
- }catch (Exception $e){
- $error[] = $e->getMessage();;
- Db::rollback();
- }
- }
- $msg = '';
- if(count($error) > 0){
- $msg = '结算成功:'.count($succ).',失败:'.count($error).',失败订单:'.implode(',',$error);
- $a = ['code'=>0,'msg'=>$msg];
- }else{
- $msg = '结算成功:'.count($succ).',失败:'.count($error);
- $a = ['code'=>1,'msg'=>$msg];
- }
- return $a;
- }
- //用户完成
- public function finish($orderId){
- $params = $this->where('id',$orderId)->find();
- if(!$params){
- HelpHander::error('订单不存在');
- }
- if($params['refund_status'] == 1){
- HelpHander::error('退款中不能完成');
- }
- if($params['status'] != 2){
- HelpHander::error('该状态不能完成');
- }
- if($params['add_amount'] > 0){ // 追加大于0,支付
- $openid = Db::name('user_oauth')->where('user_id',$params['user_id'])->value('openid');
- $config = config('app.wx_config');
- $app = \EasyWeChat\Factory::payment($config);
- $result = $app->order->unify([
- 'body' => '订单-'.$params['sn'],
- 'out_trade_no' => $params['sn'].mt_rand(100,999),
- 'total_fee' => $params['add_amount']*100,
- 'spbill_create_ip' => request()->ip(), // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
- 'notify_url' => (string)url('api/Notify/wxaddorder',[],false,true), // 支付结果通知网址,如果不设置则会使用配置里的默认地址
- 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
- 'openid' => $openid,
- 'attach' => $orderId
- ]);
- tplog($result);
- if($result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS'){
- HelpHander::error('操作失败');
- }
- $jssdk = $app->jssdk;
- $json = $jssdk->bridgeConfig($result['prepay_id'],false);
- $json['type'] = 1;
- return $json;
- }else{ //直接完成
- $sdata = [
- 'status' => 3,
- 'finish_time' => date('Y-m-d H:i:s'),
- ];
- if($params['completion'] == 0){
- $sdata['completion'] = 1;
- $sdata['completion_time'] = date('Y-m-d H:i:s');
- }
- $ret = Db::name('ph_orders')->where('id',$orderId)->update($sdata);
- if(!$ret){
- HelpHander::error('操作失败');
- }
- return ['type' => 0];
- }
- }
- //护工追加金额
- public function orderAdd($data,$orderId){
- $total = 0;
- $arr = [];
- foreach ($data as $k=>$v){
- $total+=floatval($v);
- if(!empty($v) && $v > 0){
- $arr[] = [
- 'order_id'=>$orderId,
- 'amount'=>$v,
- 'options_id'=>$k,
- ];
- }
- }
- if($total==0){
- $this->error = '追加项目必选选择一个';
- return false;
- }
- Db::startTrans();
- try {
- Db::name('order_add')
- ->where('order_id',$orderId)
- ->delete();
- $ret = Db::name('order_add')
- ->insertAll($arr);
- if(!$ret) \exception('追加项目添加失败');
- $ret = $this->where('id',$orderId)
- ->save(['add_amount'=>$total,'update_time'=>getTime()]);
- if(!$ret) \exception('订单更新失败');
- Db::commit();
- return true;
- }catch (Exception $e){
- $this->error = $e->getMessage();
- Db::rollback();
- return false;
- }
- }
- //护工操作完工
- public function completion($orderId){
- $info = $this->where('id',$orderId)
- ->find();
- if($info['completion'] !=0){
- $this->error = '当前订单已完工';
- return false;
- }
- $ret = $this->where('id',$orderId)
- ->save([
- "completion"=>1,
- "completion_time"=>getTime(),
- ]);
- if(!$ret){
- $this->error = '订单更新失败';
- return false;
- }
- return $ret;
- }
- public function makeAccount($ids,$title,$remark){
- $this->startTrans();
- try{
- $amount = $this->where('id','in',$ids)
- ->sum('amount');
- $addAmount = $this->where('id','in',$ids)
- ->sum('add_amount');
- $refund_amount = $this->where('id','in',$ids)
- ->sum('refund_amount');
- $settlement_money = $this->where('id','in',$ids)
- ->sum('settlement_money');
- $data = [
- 'title'=>$title,
- 'remark'=>$remark,
- 'amount'=>$amount+$addAmount-$refund_amount,
- 'settlement_money'=>$settlement_money,
- 'income_money'=>$amount+$addAmount-$refund_amount-$settlement_money,
- 'create_time'=>getTime()
- ];
- $ret = Db::name('make_account')
- ->insertGetId($data);
- if(!$ret) {
- \exception('保存做账记录失败');
- }
- $ret = $this->where('id','in',$ids)
- ->update([
- 'is_make_account'=>1,
- 'make_account_id'=>$ret,
- ]);
- if(!$ret) {
- \exception('更新订单失败');
- }
- $this->commit();
- return true;
- }catch (Exception $e){
- $this->error = $e->getMessage();
- $this->rollback();
- return false;
- }
- }
- //护工工单详情
- public function todoDetail($id){
- $todo = Db::name('ph_todo')
- ->where('id',$id)
- ->find();
- $todo['end'] = $todo['end']?$todo['end']:'';
- $todo['user_name'] = Db::name('user')
- ->where('id',$todo['user_id'])
- ->value('real_name');
- $user_id = Db::name('worker')
- ->where('id',$todo['worker_id'])
- ->value('user_id');
- $todo['worker_name'] = Db::name('user')
- ->where('id',$user_id)
- ->value('real_name');
- $todo['sign'] = $todo['sign']?$todo['sign']:'';
- $orderInfo = $this->getInfo($todo['order_id']);
- unset($orderInfo['todo']);
- $orderInfo['todo'][] = $todo;
- return $orderInfo;
- }
- function compareDate($arr,$start){
- array_multisort(array_column($arr, 'start'), SORT_ASC, $arr);
- foreach ($arr as $k => $v){
- if($v['end'] && $start > $v['start'] && $start < $v['end']){
- return false;
- }
- }
- return true;
- }
- /**
- * PHP计算两个时间段是否有交集(边界重叠不算)
- *
- * @param string $beginTime1 开始时间1
- * @param string $endTime1 结束时间1
- * @param string $beginTime2 开始时间2
- * @param string $endTime2 结束时间2
- * @return bool
- */
- function is_time_cross($beginTime1 = '', $endTime1 = '', $beginTime2 = '', $endTime2 = '') {
- $status = strtotime($beginTime2) - strtotime($beginTime1);
- if($beginTime1 == $beginTime2 && $endTime1 == $endTime2){
- return false;
- }
- if(!$endTime2){
- return false;
- }
- if ($status > 0) {
- $status2 = strtotime($beginTime2) - strtotime($endTime1);
- if ($status2 >= 0) {
- return false;
- } else {
- return true;
- }
- } else {
- $status2 = strtotime($endTime2) - strtotime($beginTime1);
- if ($status2 > 0) {
- return true;
- } else {
- return false;
- }
- }
- }
- }
|