Orders.php 151 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864
  1. <?php
  2. namespace app\common\model;
  3. use app\common\util\AppMsg;
  4. use app\hander\HelpHander;
  5. use think\Db;
  6. use think\Exception;
  7. class Orders extends Base {
  8. public $priority = [
  9. 1 => '可延缓的',
  10. 2 => '常规',
  11. 3 => '紧急',
  12. 4 => '预约',
  13. ];
  14. public $source_type = [
  15. 1 => '一键呼叫',
  16. 2 => '隐患',
  17. 3 => '投诉',
  18. ];
  19. public $table = 'orders';
  20. protected $validateName = 'Orders';
  21. public function addSave($data, $type = 0) {//type 是否是调度发单1是
  22. $scene = 'dispatchAdd';
  23. if ($type == 0) {
  24. $scene = 'addShow';
  25. }
  26. $data['userType'] = isset($data['userType']) ? $data['userType'] : 0;
  27. $data['isSpontaneous'] = isset($data['isSpontaneous']) ? $data['isSpontaneous'] : 0;
  28. $data['quality_type'] = isset($data['quality_type']) ? $data['quality_type'] : 0;
  29. if(isset($data['source_type']) && $data['source_type']==4 && $data['isSpontaneous']==0){//一键呼叫派发
  30. if(!isset($data['work_type_mode']) || $data['work_type_mode'] <0){
  31. $this->error = '请选择转单类型';
  32. return false;
  33. }
  34. $config = Db::name('config')
  35. ->where('name','web_order_transfer_type')
  36. ->value('value');
  37. if(empty($config)){
  38. $workType = [];
  39. }else{
  40. $workType = explode('|',$config);
  41. }
  42. if(!in_array($data['work_type_mode'],$workType)){
  43. $this->error = '当前类型不能进行转单';
  44. return false;
  45. }
  46. if($type==1){
  47. if($data['userType']==0){
  48. $data['to_user_id'] = !isset($data['to_user_id'])?$data['to_user_id'.$data['work_type_mode']]:$data['to_user_id'];
  49. }else{
  50. $data['to_roles_id'] =!isset($data['to_roles_id'])? $data['to_roles_id'.$data['work_type_mode']]:$data['to_roles_id'];
  51. }
  52. }
  53. }
  54. $result = validate($this->validateName)->check($data, [], $scene);
  55. if (true !== $result) {
  56. $this->error = validate($this->validateName)->getError();
  57. return false;
  58. }
  59. if($data['work_type_mode']!=3){
  60. if(empty($data['content'])){
  61. $images = isset($data['images']) ? $data['images'] : '';
  62. $videos = isset($data['videos']) ? $data['videos'] : '';
  63. $voices = isset($data['voices']) ? $data['voices'] : '';
  64. if(empty($images) && empty($videos) && empty($voices)){
  65. $this->error = '内容不能为空';
  66. return false;
  67. }
  68. }
  69. }
  70. if ($data['work_type_mode'] == 3) {
  71. $result = validate('OrdersConvey')->check($data, []);
  72. if (true !== $result) {
  73. $this->error = validate('OrdersConvey')->getError();
  74. return false;
  75. }
  76. }
  77. if($type == 1 && $data['work_type_mode'] == 15) { // 品质整改
  78. if(!isset($data['informer_user']) || empty($data['informer_user'])){
  79. $this->error = '知会人不能为空';
  80. return false;
  81. }
  82. }
  83. $sData = array(
  84. 'dep_id' => isset($data['dep_id']) && !empty($data['dep_id']) ? $data['dep_id'] : 0,
  85. 'org_id' => $data['org_id'],
  86. 'user_id' => $data['user_id'],
  87. 'order_mode' => $type == 0 ? 1 : 4,
  88. 'create_time' => getTime(),
  89. 'create_yyyy' => date('Y'),
  90. 'create_yyyymm' => date('Ym'),
  91. 'create_yyyymmdd' => date('Ymd'),
  92. 'sn' => get_unique_sn(get_config('sn_prefix')),
  93. 'content' => $data['content'],
  94. 'images' => isset($data['images']) ? $data['images'] : '',
  95. 'videos' => isset($data['videos']) ? $data['videos'] : '',
  96. 'voices' => isset($data['voices']) ? $data['voices'] : '',
  97. 'work_type_mode' => $data['work_type_mode'],
  98. 'quality_type' => isset($data['quality_type'])?$data['quality_type']:0,
  99. 'quality_cate' => isset($data['quality_cate'])?$data['quality_cate']:0,
  100. 'informer_user' => isset($data['informer_user'])?$data['informer_user']:0,
  101. 'source_type' => $type == 0 ? 1 : 2,
  102. 'name' => isset($data['name']) ? $data['name'] : '',
  103. 'phone' => isset($data['phone']) ? $data['phone'] : '',
  104. );
  105. if(isset($data['source_type']) && !empty($data['source_type'])){
  106. $sData['source_type'] = $data['source_type'];
  107. }
  108. //普通订单自发
  109. if (isset($data['source_type']) && $data['source_type'] == 3) {
  110. $sData['source_type'] = 3;
  111. $sData['order_mode'] = 4;
  112. $sData['send_time'] = getTime();
  113. if ($data['work_type_mode'] == 1) {
  114. if (!isset($data['type_id']) || empty($data['type_id'])) {
  115. $this->error = '请选择报修事项';
  116. return false;
  117. }
  118. }
  119. }
  120. //一键呼叫订单自发
  121. if (isset($data['source_type']) && $data['source_type'] == 4 && $data['isSpontaneous']==1) {
  122. $sData['source_type'] = 3;
  123. $sData['order_mode'] = 4;
  124. $sData['send_time'] = getTime();
  125. }
  126. if ($type == 1) {
  127. if ($data['userType'] == 0) {
  128. if (!isset($data['to_user_id']) || empty($data['to_user_id'])) {
  129. // $this->error = '请选择执行人';
  130. // return false;
  131. $sData['order_mode'] = 1;
  132. $data['to_user_id'] = "";
  133. }else{
  134. $sData['send_time'] = getTime();
  135. $sData['order_mode'] = 4;
  136. }
  137. if ($data['work_type_mode'] == 1) {
  138. if (!isset($data['type_id']) || empty($data['type_id'])) {
  139. $this->error = '请选择报修事项';
  140. return false;
  141. }
  142. }
  143. }
  144. else {
  145. if(two_dispatch_off($data['org_id'])!=1){
  146. $this->error = '二级调度开关未开启';
  147. return false;
  148. }
  149. $sData['order_mode'] = 1;
  150. $sData['is_deal'] = 1;
  151. if (!isset($data['to_roles_id']) || empty($data['to_roles_id'])) {
  152. // $this->error = '请选择二级调度';
  153. // return false;
  154. $sData['is_deal'] = 0;
  155. }
  156. }
  157. }
  158. if(isset($data['sxType'] ) && !empty($data['sxType']) && $data['sxType'] == 1){
  159. $sData['name']=isset($data['name'])?$data['name']:'';
  160. $sData['phone']=isset($data['phone'])?$data['phone']:'';
  161. }
  162. // if($type == 0){
  163. // $sData['from'] = 1;
  164. // }
  165. $this->startTrans();
  166. try {
  167. $pusharr = []; // 需要推送给工人
  168. $pushdis = []; // 需要推送给二级调度
  169. $orderId = $this->insertGetId($sData);
  170. if (!$orderId) {
  171. \exception('保存订单失败');
  172. }
  173. if(isset($data['id']) && $data['id'] > 0){ // 电话保单
  174. Db::name('phone_monitor_record')->where('id',$data['id'])->update([
  175. 'order_id' => $orderId,
  176. 'update_time' => date('Y-m-d H:i:s')
  177. ]);
  178. }
  179. if ($data['work_type_mode'] == 1) {//报修订单
  180. $rData = [];
  181. if (isset($data['type_id']) && !empty($data['type_id'])) {
  182. $rData['type_id'] = $data['type_id'];
  183. }
  184. if (isset($data['address_id']) && !empty($data['address_id'])) {
  185. $rData['address_id'] = $data['address_id'];
  186. }
  187. if (isset($data['repair_priority']) && !empty($data['repair_priority'])) {
  188. $rData['repair_priority'] = $data['repair_priority'];
  189. }
  190. if (!empty($rData)) {
  191. $rData['order_id'] = $orderId;
  192. $res = Db::name('order_repair')
  193. ->insert($rData);
  194. if (!$res) {
  195. \exception('保存维修扩展失败');
  196. }
  197. }
  198. }
  199. if ($data['work_type_mode'] == 3) {
  200. if (!$data['start'] || !$data['end']) {
  201. $this->error = '取件与送达地点不能为空';
  202. return false;
  203. }
  204. if ($data['start'] == $data['end']) {
  205. $this->error = '取件与送达地点不能是同一地点';
  206. return false;
  207. }
  208. if (!$data['type']) {
  209. $this->error = '运送类型不能为空';
  210. return false;
  211. }
  212. $conveyCate = Db::name('convey_cate')
  213. ->where('id', $data['type'])
  214. ->find();
  215. if($conveyCate){ // 需求时间和应完成时间,都由前端传
  216. if(!$data['xq_time'] || !$data['ywc_time']){
  217. $data['xq_time'] = date('Y-m-d H:i:s');
  218. $time = Db::name('time')
  219. ->where('id',$conveyCate['time_id'])
  220. ->find();
  221. $data['ywc_time'] = date('Y-m-d H:i',strtotime($data['xq_time']) + 60*$time['bz_time']);
  222. }else{
  223. if ($data['xq_time'] >= $data['ywc_time']) {
  224. $this->error = '应完成时间应大于需求时间';
  225. return false;
  226. }
  227. if (strtotime($data['xq_time']) < time() - 10 * 60) {
  228. $this->error = '需求时间已过时';
  229. return false;
  230. }
  231. }
  232. }
  233. /*if($conveyCate['cate']==4){
  234. if (!$data['xq_time'] || !$data['ywc_time']) {
  235. $this->error = '应完成时间应和需求时间不能为空';
  236. return false;
  237. }
  238. if ($data['xq_time'] >= $data['ywc_time']) {
  239. $this->error = '应完成时间应大于需求时间';
  240. return false;
  241. }
  242. if (strtotime($data['xq_time']) < time() - 10 * 60) {
  243. $this->error = '需求时间已过时';
  244. return false;
  245. }
  246. }else{
  247. $data['xq_time'] = date('Y-m-d H:i:s');
  248. $time = Db::name('time')
  249. ->where('id',$conveyCate['time_id'])
  250. ->find();
  251. $data['ywc_time'] = date('Y-m-d H:i',strtotime($data['xq_time']) + 60*$time['bz_time']);
  252. }*/
  253. $ysData = array(
  254. 'order_id' => $orderId,
  255. 'type' => $data['type'],
  256. 'start' => $data['start'],
  257. 'end' => $data['end'],
  258. 'xq_time' => isset($data['xq_time'])?$data['xq_time']:"",
  259. 'ywc_time' => isset($data['ywc_time'])?$data['ywc_time']:"",
  260. 'name' => isset($data['name'])?$data['name']:"",
  261. 'phone' => isset($data['phone'])?$data['phone']:"",
  262. 'device_id' => isset($data['device_id']) ? (int)$data['device_id'] : 0,
  263. 'priority' => empty($data['priority']) ? 0 : $data['priority'],
  264. 'score'=>$conveyCate['score']
  265. );
  266. if(empty($ysData['xq_time'])){
  267. unset($ysData['xq_time']);
  268. }
  269. if(empty($ysData['ywc_time'])){
  270. unset($ysData['ywc_time']);
  271. }
  272. $oCid = Db::name('order_convey')
  273. ->insertGetId($ysData);
  274. if (!$oCid) {
  275. exception('运送信息保存失败');
  276. }
  277. if(isset($data['way_addr']) && !empty($data['way_addr'])){
  278. $wayAddr = explode(',',$data['way_addr']);
  279. foreach ($wayAddr as $k=>$v){
  280. if($v){
  281. $cdata = [
  282. 'order_id'=>$orderId,
  283. 'addr'=>$v,
  284. 'create_time'=>date('Y-m-d H:i:s'),
  285. 'order_convey_id'=>$oCid,
  286. ];
  287. $oce = Db::name('order_convey_end')->insert($cdata);
  288. if(!$oce){
  289. exception('途径地点信息保存失败');
  290. }
  291. }
  292. }
  293. }
  294. model('UserConveyCate')->updateCate($data['user_id'],$data['type']);
  295. if ($conveyCate['cate'] == 1) {
  296. $patient = [
  297. 'order_id' => $orderId,
  298. 'bed_number' => isset($data['bed_number']) ? $data['bed_number'] : '',
  299. 'name' => isset($data['p_name']) ? $data['p_name'] : '',
  300. 'ba_number' => isset($data['ba_number']) ? $data['ba_number'] : '',
  301. 'gender' => isset($data['gender']) && !empty($data['gender']) ? $data['gender'] : 0,
  302. 'back' => isset($data['back']) && !empty($data['back']) ? $data['back'] : 0,
  303. ];
  304. $ocPid = Db::name('order_convey_patient')
  305. ->insertGetId($patient);
  306. if (!$ocPid) {
  307. exception('保存运送病人扩展失败');
  308. }
  309. }
  310. }
  311. if ($type == 1 || $sData['source_type']==3 || ($sData['source_type']==4 && $data['isSpontaneous']==1)) {
  312. if ($data['userType'] == 0) {
  313. if($sData['source_type']==3 || ($sData['source_type']==4 && $data['isSpontaneous']==1)){
  314. $data['to_user_id'] = $data['user_id'];
  315. }
  316. $send_user_num = $this->sendUserNum($data['work_type_mode'],$data['org_id']);
  317. $users = empty($data['to_user_id'])?[]:explode(',', $data['to_user_id']);
  318. if($send_user_num==1 && count($users) >1){
  319. exception('执行人只能选择单人');
  320. }
  321. $to_user_id = array_unique($users);
  322. $todoData = [
  323. 'order_id' => $orderId,
  324. 'todo_content' => isset($data['todo_content'])?$data['todo_content']:"",
  325. 'create_user_id' => $data['user_id'],
  326. 'org_id' => $data['org_id'],
  327. 'create_time' => getTime(),
  328. 'todo_mode' => $sData['source_type']==3?2:1,
  329. 'work_type_mode' => $data['work_type_mode'],
  330. 'create_yyyy' => date('Y'),
  331. 'create_yyyymm' => date('Ym'),
  332. 'create_yyyymmdd' => date('Ymd'),
  333. 'quality_type' => $data['quality_type'],
  334. ];
  335. if($sData['source_type']==3){
  336. $todoData['confirm_time'] = getTime();
  337. }
  338. $taskData = [
  339. 'org_id' => $data['org_id'],
  340. 'type' => 1,
  341. 'start_time' => getTime(),
  342. 'create_time' => getTime(),
  343. ];
  344. if($data['work_type_mode']==1){
  345. if (isset($data['repair_priority']) && $data['repair_priority']==3) {
  346. $taskData['priority'] = 1;
  347. }
  348. }elseif ($data['work_type_mode']==3){
  349. if (isset($data['priority']) && $data['priority']==3) {
  350. $taskData['priority'] = 2;
  351. }
  352. }
  353. $sns = [];
  354. foreach ($to_user_id as $k => $v) {
  355. if(empty($v)){
  356. continue;
  357. }
  358. $todoData['to_user_id'] = $v;
  359. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  360. while (true){
  361. if(in_array($todoData['sn'],$sns)){
  362. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  363. }else{
  364. $sns[] = $todoData['sn'];
  365. break;
  366. }
  367. }
  368. if($type == 1 && $data['work_type_mode'] == 15){ // 品质整改
  369. $todoData['todo_mode'] = 2;
  370. $todoData['confirm_time'] = getTime();
  371. }
  372. $res = Db::name('todo')
  373. ->insertGetId($todoData);
  374. if (!$res) {
  375. \exception('执行人:' . $v . '派单失败');
  376. }
  377. if($sData['source_type']!=3){
  378. $pusharr[] = [
  379. 'user_id' => $v,
  380. 'todo_id' => $res
  381. ];
  382. }
  383. $taskData['user_id'] = $v;
  384. $taskData['bus_id'] = $res;
  385. $res = Db::name('task')
  386. ->insert($taskData);
  387. if (!$res) {
  388. \exception('执行人:' . $v . '任务保存失败');
  389. }
  390. }
  391. if(check_two_dispatch($data['user_id'])==1){
  392. $dLog = [
  393. 'user_id'=>$data['user_id'],
  394. 'to_user_id'=>$data['user_id'],
  395. 'create_time' => getTime(),
  396. 'content' => isset($data['todo_content']) ? $data['todo_content'] : '',
  397. 'order_id' => $orderId,
  398. 'roles_id' => 0
  399. ];
  400. $r = Db::name('orders')
  401. ->where('id',$orderId)
  402. ->update(['is_deal'=>1]);
  403. if(!$r){
  404. \exception('订单更新失败');
  405. }
  406. $res = Db::name('dispatch_log')
  407. ->insert($dLog);
  408. if (!$res) {
  409. \exception('二级调度记录保存失败');
  410. }
  411. }
  412. }
  413. else {
  414. $pRolesId = explode(',',$data['to_roles_id']);
  415. $pp = [];
  416. foreach ($pRolesId as $k=>$v){
  417. $logData = [
  418. 'user_id' => $data['user_id'],
  419. 'to_user_id' =>0,
  420. 'create_time' => getTime(),
  421. 'content' => isset($data['todo_content']) ? $data['todo_content'] : '',
  422. 'order_id' => $orderId,
  423. 'roles_id' => $v
  424. ];
  425. $pp[] = $logData;
  426. }
  427. $pushdis = Db::name('user_roles')
  428. ->where('roles_id','in',$pRolesId)
  429. ->column('user_id');
  430. $res = Db::name('dispatch_log')
  431. ->insertAll($pp);
  432. if (!$res) {
  433. \exception('派发失败');
  434. }
  435. }
  436. }
  437. if($type == 1 && $data['work_type_mode'] == 15){ // 品质整改
  438. if($data['quality_type']==0){
  439. Db::name('daily_record')->where('id',$data['daily_record_id'])->update(['order_id' => $orderId]);
  440. }elseif ($data['quality_type']==1){
  441. Db::name('device_record')->where('id',$data['daily_record_id'])->update(['order_id' => $orderId]);
  442. }
  443. elseif (in_array($data['quality_type'],[2,3,4,5])){
  444. Db::name('patrol_record')->where('id',$data['daily_record_id'])->update(['order_id' => $orderId]);
  445. }
  446. }
  447. $this->commit();
  448. if($pusharr){
  449. foreach ($pusharr as $k=>$v){
  450. // 极光推送
  451. send_jpush([$v['user_id']],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$v['todo_id']]);
  452. }
  453. }
  454. if(empty($sData['informer_user']) && $type == 1 && $data['work_type_mode'] == 15){
  455. send_jpush([$sData['informer_user']],AppMsg::PUSH_INFORMER_USER,'您有一个品控订单,请知晓',['id'=>$orderId]);
  456. }
  457. if($pushdis){
  458. foreach ($pushdis as $k=>$v){
  459. // 极光推送
  460. send_jpush([$v],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$orderId]);
  461. }
  462. }
  463. if($type == 0 && $sData['source_type'] != 3){ // 客户发单,需要检查是否有抢单
  464. $off = model('Config')->getConfig('org_grab_order'.$sData['work_type_mode'],$sData['org_id']);
  465. if($off){
  466. $workers = model('WorkTypeMode')->getRolesUserApp($sData['work_type_mode'],$sData['org_id']);
  467. $uids = [];
  468. foreach ($workers as $v){
  469. $uids[] = $v['id'];
  470. }
  471. if($uids){
  472. send_jpush($uids,AppMsg::PUSH_ORDER_ROB,'',['id'=>$orderId]);
  473. }
  474. }
  475. }
  476. $dispatchOff = model('Config')->getConfig('org_dispatch_off',$sData['org_id']);
  477. if($dispatchOff==1){
  478. //提醒调度
  479. $dUser = model('Roles')->getDispatchOrder($sData['work_type_mode'],$sData['org_id']);
  480. if(!empty($dUser)){
  481. send_jpush($dUser,AppMsg::PUSH_WORKER_ORDER_SEND,'您有一个新的订单需要及时处理',['id'=>$orderId]);
  482. }
  483. }
  484. return true;
  485. } catch (Exception $e) {
  486. $this->error = $e->getMessage();
  487. $this->rollback();
  488. return false;
  489. }
  490. }
  491. public function editSave($data){
  492. $order = Db::name('orders')->where('id',$data['id'])->find();
  493. if(!$order || $order['del'] == 1){
  494. $this->error = '订单不存在';
  495. return false;
  496. }
  497. if($order['order_mode'] != 2 && $order['order_mode'] != 3){
  498. $this->error = '只能修改已取消的订单';
  499. return false;
  500. }
  501. if(empty($data['to_user_id'])){
  502. $this->error = '请选择执行人';
  503. return false;
  504. }
  505. if($order['work_type_mode'] ==1){
  506. if(empty($data['type_id'])){
  507. $this->error = '请选择报修事项';
  508. return false;
  509. }
  510. if(empty($data['repair_priority'])){
  511. $this->error = '请选择报修紧急程度';
  512. return false;
  513. }
  514. }else if($order['work_type_mode'] == 3){
  515. if(empty($data['type'])){
  516. $this->error = '请选择运送类型';
  517. return false;
  518. }
  519. if(empty($data['priority'])){
  520. $this->error = '请选择优先级';
  521. return false;
  522. }
  523. if(empty($data['start'])){
  524. $this->error = '请选择开始地点';
  525. return false;
  526. }
  527. if(empty($data['end'])){
  528. $this->error = '请选择结束地点';
  529. return false;
  530. }
  531. if(empty($data['xq_time'])){
  532. $this->error = '请选择需求时间';
  533. return false;
  534. }
  535. if(empty($data['ywc_time'])){
  536. $this->error = '请选择应完成时间';
  537. return false;
  538. }
  539. }
  540. Db::startTrans();
  541. try{
  542. $ret = Db::name('orders')->where('id',$data['id'])->update([
  543. 'content' => $data['content'],
  544. 'order_mode' => 4,
  545. 'images' => $data['images'],
  546. 'dep_id' => $data['dep_id'],
  547. 'send_time' => getTime()
  548. ]);
  549. if(!$ret){
  550. \exception("操作失败");
  551. }
  552. $taskData = [
  553. 'org_id' => $order['org_id'],
  554. 'type' => 1,
  555. 'start_time' => getTime(),
  556. 'create_time' => getTime(),
  557. ];
  558. if($order['work_type_mode'] == 1){
  559. if (isset($data['repair_priority']) && $data['repair_priority']==3) {
  560. $taskData['priority'] = 1;
  561. }
  562. $repair = Db::name('order_repair')->where('order_id',$order['id'])->find();
  563. if($repair){
  564. Db::name("order_repair")->where('id',$repair['id'])->update([
  565. 'type_id' => $data['type_id'],
  566. 'address_id' => empty($data['address_id'])?0:$data['address_id'],
  567. 'repair_priority' => $data['repair_priority'],
  568. 'update_time' => getTime()
  569. ]);
  570. }else{
  571. Db::name("order_repair")->insertGetId([
  572. 'order_id' => $order['id'],
  573. 'type_id' => $data['type_id'],
  574. 'address_id' => empty($data['address_id'])?0:$data['address_id'],
  575. 'repair_priority' => $data['repair_priority'],
  576. 'update_time' => getTime()
  577. ]);
  578. }
  579. }else if($order['work_type_mode'] == 3){
  580. if (isset($data['priority']) && $data['priority']==3) {
  581. $taskData['priority'] = 2;
  582. }
  583. $conveyCate = Db::name('convey_cate')->where('id',$data['type'])->find();
  584. if($conveyCate['cate'] == 1){
  585. $ocp = Db::name('order_convey_patient')->where('order_id',$data['id'])->find();
  586. if($ocp){
  587. Db::name('order_convey_patient')->where('id',$ocp['id'])->update([
  588. 'order_id' => $data['id'],
  589. 'bed_number' => $data['bed_number'],
  590. 'name' => $data['p_name'],
  591. ]);
  592. }else{
  593. Db::name('order_convey_patient')->insertGetId([
  594. 'order_id' => $data['id'],
  595. 'bed_number' => $data['bed_number'],
  596. 'name' => $data['p_name'],
  597. ]);
  598. }
  599. }
  600. $oc = Db::name('order_convey')->where('order_id',$data['id'])->find();
  601. if($oc){
  602. Db::name('order_convey')->where('id',$oc['id'])->update([
  603. 'order_id' => $data['id'],
  604. 'type' => $data['type'],
  605. 'start' => $data['start'],
  606. 'end' => $data['end'],
  607. 'xq_time' => $data['xq_time'],
  608. 'ywc_time' => $data['ywc_time'],
  609. 'device_id' => $data['device_id'],
  610. 'priority' => $data['priority'],
  611. ]);
  612. }else{
  613. Db::name('order_convey')->insertGetId([
  614. 'order_id' => $data['id'],
  615. 'type' => $data['type'],
  616. 'start' => $data['start'],
  617. 'end' => $data['end'],
  618. 'xq_time' => $data['xq_time'],
  619. 'ywc_time' => $data['ywc_time'],
  620. 'device_id' => $data['device_id'],
  621. 'priority' => $data['priority'],
  622. ]);
  623. }
  624. Db::name('order_convey_end')->where('order_id',$data['id'])->delete();
  625. $addrs = empty($data['way_addr'])?[]:explode(',',$data['way_addr']);
  626. foreach ($addrs as $k=>$v){
  627. Db::name('order_convey_end')->insertGetId([
  628. 'order_id' => $data['id'],
  629. 'addr' => $v,
  630. 'create_time' => getTime()
  631. ]);
  632. }
  633. }
  634. $uids = explode(',',$data['to_user_id']);
  635. $uids = array_unique($uids);
  636. $pusharr = [];
  637. $sns = [];
  638. foreach ($uids as $k=>$v){
  639. $todoData = [
  640. 'order_id' => $order['id'],
  641. 'org_id' => $order['org_id'],
  642. 'work_type_mode' => $order['work_type_mode'],
  643. 'to_user_id' => $v,
  644. 'todo_content' => $data['todo_content'],
  645. 'create_user_id' => $data['user_id'],
  646. 'create_time' => getTime(),
  647. 'todo_mode' => 1,
  648. 'create_yyyy' => date("Y"),
  649. 'create_yyyymm' => date("Ym"),
  650. 'create_yyyymmdd' => date("Ymd"),
  651. ];
  652. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  653. while (true){
  654. if(in_array($todoData['sn'],$sns)){
  655. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  656. }else{
  657. $sns[] = $todoData['sn'];
  658. break;
  659. }
  660. }
  661. $res = Db::name('todo')->insertGetId($todoData);
  662. if (!$res) {
  663. \exception('执行人:' . $v . '派单失败');
  664. }
  665. $pusharr[] = [
  666. 'user_id' => $v,
  667. 'todo_id' => $res
  668. ];
  669. $taskData['user_id'] = $v;
  670. $taskData['bus_id'] = $res;
  671. $res = Db::name('task')->insert($taskData);
  672. if (!$res) {
  673. \exception('执行人:' . $v . '任务保存失败');
  674. }
  675. }
  676. if($pusharr){
  677. foreach ($pusharr as $k=>$v){
  678. // 极光推送
  679. send_jpush([$v['user_id']],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$v['todo_id']]);
  680. }
  681. }
  682. Db::commit();
  683. return true;
  684. }catch (\Exception $e){
  685. Db::rollback();
  686. $this->error = $e->getMessage();
  687. return false;
  688. }
  689. }
  690. public function formatOrderConvey($lists, $status = 0, $is_list = 0) {
  691. $newret = [];
  692. $newret1 = [];
  693. $newret2 = [];
  694. $newret3 = [];
  695. $newret4 = [];
  696. if (empty($lists)) {
  697. return [$newret, $newret1, $newret2, $newret3, $newret4];
  698. }
  699. // 只处理 work_type_mode = 3 的订单
  700. $orders = [];
  701. foreach ($lists as $v) {
  702. if (isset($v['work_type_mode']) && $v['work_type_mode'] == 3) {
  703. $orders[$v['id']] = $v;
  704. }
  705. }
  706. if (empty($orders)) {
  707. foreach ($lists as $v) {
  708. $this->classifyOrder($v, $status, $newret, $newret1, $newret2, $newret3, $newret4);
  709. }
  710. return [$newret, $newret1, $newret2, $newret3, $newret4];
  711. }
  712. $orderIds = array_keys($orders);
  713. $now = time();
  714. // ===== 1. order_convey(一次) =====
  715. $orderConveys = Db::name('order_convey')->whereIn('order_id', $orderIds)->select();
  716. $orderConveyMap = [];
  717. $deviceIds = [];
  718. $addressIds = [];
  719. foreach ($orderConveys as $oc) {
  720. $orderConveyMap[$oc['order_id']] = $oc;
  721. $deviceIds[] = $oc['device_id'];
  722. $addressIds[] = $oc['start'];
  723. $addressIds[] = $oc['end'];
  724. }
  725. // ===== 2. convey_cate + time(一次) =====
  726. $typeIds = array_column($orders, 'type');
  727. foreach ($orderConveys as $oc) {
  728. $typeIds[] = $oc['type'];
  729. }
  730. $typeIds = array_unique(array_filter($typeIds));
  731. $conveyMap = [];
  732. if ($typeIds) {
  733. $conveyMap = Db::name('convey_cate')
  734. ->alias('c')
  735. ->join('time t', 't.id=c.time_id')
  736. ->whereIn('c.id', $typeIds)
  737. ->field('c.id,c.cate,c.title,t.yy_time,t.bz_time,t.jg_time,t.wjjg_time')
  738. ->column('c.id,c.cate,c.title,t.yy_time,t.bz_time,t.jg_time,t.wjjg_time', 'c.id');
  739. }
  740. // ===== 3. address(一次) =====
  741. $addressIds = array_unique(array_filter($addressIds));
  742. $addressMap = $addressIds
  743. ? Db::name('address')->whereIn('id', $addressIds)->column('title', 'id')
  744. : [];
  745. // ===== 4. convey_device(一次) =====
  746. $deviceIds = array_unique(array_filter($deviceIds));
  747. $deviceMap = $deviceIds
  748. ? Db::name('convey_device')->whereIn('id', $deviceIds)->column('title', 'id')
  749. : [];
  750. // ===== 6. todo + user(一次) =====
  751. $todos = Db::name('todo')
  752. ->alias('t')
  753. ->join('user u', 'u.id=t.to_user_id')
  754. ->whereIn('t.order_id', $orderIds)
  755. ->where('t.todo_mode', 'in', [1, 2, 3, 4])
  756. ->where('t.del', 0)
  757. ->field('t.id,t.order_id,u.real_name,u.mobile,t.confirm_time')
  758. ->order('t.id asc')
  759. ->select();
  760. $todoGroup = [];
  761. $todoIds = [];
  762. foreach ($todos as $t) {
  763. $todoGroup[$t['order_id']][] = $t;
  764. $todoIds[] = $t['id'];
  765. }
  766. // ===== 7. todo_convey start_time(一次) =====
  767. $startTimeMap = $todoIds
  768. ? Db::name('todo_convey')->whereIn('todo_id', $todoIds)->column('start_time', 'todo_id')
  769. : [];
  770. // ===== 8. order_delay(一次) =====
  771. // $orderDelays = Db::name('order_delay')->whereIn('order_id', $orderIds)->select();
  772. // $delayGroup = [];
  773. // $delayReasonIds = [];
  774. // foreach ($orderDelays as $d) {
  775. // $delayGroup[$d['order_id']][] = $d;
  776. // if ($d['status'] == 0) {
  777. // $delayReasonIds[] = $d['delay_reason_id'];
  778. // }
  779. // }
  780. // $delayReasonIds = array_unique(array_filter($delayReasonIds));
  781. // $delayReasonMap = $delayReasonIds
  782. // ? Db::name('delay_reason')->whereIn('id', $delayReasonIds)->column('title', 'id')
  783. // : [];
  784. // ===== 9. 床号(一次) =====
  785. $bedMap = Db::name('order_convey_patient')->whereIn('order_id', $orderIds)->column('bed_number', 'order_id');
  786. // ===== 10. 用户(一次,real_name + mobile) =====
  787. $userRows = Db::name('user')
  788. ->whereIn('id', array_unique(array_filter(array_column($lists, 'user_id'))))
  789. ->field('id,real_name')
  790. ->select();
  791. $userMap = array_column($userRows, null, 'id');
  792. $priority = $this->priority ?? [];
  793. // ===== 循环内纯内存组装 + 分类 =====
  794. foreach ($orders as $id => $v) {
  795. $oc = $orderConveyMap[$id] ?? [];
  796. $convey = $conveyMap[$v['type']] ?? ($conveyMap[$oc['type'] ?? 0] ?? []);
  797. // ---- 基础字段 ----
  798. $v['type_name'] = $convey['title'] ?? '';
  799. $v['start_name'] = $addressMap[$oc['start'] ?? 0] ?? '';
  800. $v['end_name'] = $addressMap[$oc['end'] ?? 0] ?? '';
  801. $v['device_name'] = $deviceMap[$oc['device_id'] ?? 0] ?? '';
  802. $v['real_name'] = $userMap[$v['user_id']]['real_name'] ?? '';
  803. $v['priorityName'] = $priority[$v['priority']] ?? '';
  804. // ---- last_time ----
  805. $last = strtotime($v['ywc_time']) - $now;
  806. $v['last_time'] = $last > 0 ? round($last / 60) : 0;
  807. // ---- todo 汇总 ----
  808. $todo = $todoGroup[$id] ?? [];
  809. $usersArr = [];
  810. $confirmtime = '';
  811. foreach ($todo as $t) {
  812. $usersArr[] = $t['real_name'] . (!empty($t['mobile']) ? '[' . $t['mobile'] . ']' : '');
  813. if ($t['confirm_time']) {
  814. if (!$confirmtime || $t['confirm_time'] < $confirmtime) {
  815. $confirmtime = $t['confirm_time'];
  816. }
  817. }
  818. }
  819. $v['is_todo'] = $todo ? 1 : 0;
  820. $v['real_names'] = implode(',', $usersArr);
  821. $v['confirm_time'] = $confirmtime;
  822. // ---- start_time(第一个 todo 的 todo_convey.start_time)----
  823. $firstTodoId = $todo[0]['id'] ?? 0;
  824. $startTime = $startTimeMap[$firstTodoId] ?? '';
  825. $v['start_time'] = $startTime ? date('H:i', strtotime($startTime)) : '';
  826. // 兼容原 foreach 的字段名
  827. $v['starttime'] = $v['start_time'];
  828. // ---- delay ----
  829. $v['delay'] = 0;
  830. $v['delay_diff'] = 0;
  831. $v['delay_reason'] = '';
  832. // foreach (($delayGroup[$id] ?? []) as $d) {
  833. // $diff = $now - strtotime($d['start_time']);
  834. // if ($d['status'] == 0) {
  835. // $v['delay'] = 1;
  836. // $v['delay_reason'] = $delayReasonMap[$d['delay_reason_id']] ?? '';
  837. // }
  838. // $v['delay_diff'] += $diff;
  839. // }
  840. // $v['delay_diff'] = round($v['delay_diff'] / 60);
  841. // ---- status(与原 foreach 完全一致)----
  842. if ($v['delay'] == 1) {
  843. $v['status'] = 3;
  844. } else {
  845. $v['status'] = ($v['order_mode'] == 1) ? 1 : 2;
  846. }
  847. // ---- ss(按原 foreach:基于 xq_time,且 curtime > xqtime 才分段)----
  848. $xqtime = strtotime($v['xq_time']);
  849. $curtime = time();
  850. if ($curtime > $xqtime) {
  851. $ct = round(($curtime - $xqtime) / 60);
  852. if ($ct < ($convey['yy_time'] ?? 0)) {
  853. $ss = 0;
  854. } elseif ($ct < ($convey['bz_time'] ?? 0)) {
  855. $ss = 1;
  856. } elseif ($ct < ($convey['jg_time'] ?? 0)) {
  857. $ss = 2;
  858. } elseif ($ct < ($convey['wjjg_time'] ?? 0)) {
  859. $ss = 3;
  860. } else {
  861. $ss = 4;
  862. }
  863. } else {
  864. $ss = 0;
  865. }
  866. $v['ss'] = $ss;
  867. // ---- 时间展示 ----
  868. $v['xtime'] = date('H:i', strtotime($v['xq_time']));
  869. $v['stime'] = $v['send_time'] ? date('H:i', strtotime($v['send_time'])) : '';
  870. $v['ctime'] = $confirmtime ? date('H:i', strtotime($confirmtime)) : '';
  871. // ---- 床号(cate=1 才取)----
  872. $v['bed_number'] = (($convey['cate'] ?? 0) == 1) ? ($bedMap[$id] ?? '') : '';
  873. $orders[$id] = $v;
  874. // ---- 分类(用入参 $status,与原 foreach 一致)----
  875. $this->classifyOrder($v, $status, $newret, $newret1, $newret2, $newret3, $newret4);
  876. }
  877. // 非 work_type_mode=3 的数据按原字段分类(混合场景兜底)
  878. foreach ($lists as $v) {
  879. if (!isset($orders[$v['id']])) {
  880. $this->classifyOrder($v, $status, $newret, $newret1, $newret2, $newret3, $newret4);
  881. }
  882. }
  883. return [$newret, $newret1, $newret2, $newret3, $newret4];
  884. }
  885. private function classifyOrder($v, $status, &$newret, &$newret1, &$newret2, &$newret3, &$newret4) {
  886. $delay = $v['delay'] ?? 0;
  887. $orderMode = $v['order_mode'] ?? 0;
  888. // 延时任务
  889. if ($status == 3 && $delay == 1) {
  890. $newret[] = $v;
  891. $newret1[] = $v;
  892. }
  893. // 新任务
  894. if ($status == 1 && $orderMode == 1) {
  895. $newret[] = $v;
  896. $newret2[] = $v;
  897. }
  898. // 进行中
  899. if ($status == 2 && $orderMode == 4) {
  900. $newret[] = $v;
  901. $newret3[] = $v;
  902. }
  903. // 其他
  904. if (!$status || !in_array($status, [1, 2, 3])) {
  905. $newret[] = $v;
  906. $newret4[] = $v;
  907. }
  908. }
  909. //后台格式化订单详情
  910. public function formatOrder($v, $is_list = 0) {
  911. $v['order_type'] = '';
  912. $v['order_type_matter'] = '';
  913. $v['address_title'] = '';
  914. $v['repair_priority'] = '';
  915. $v['task_priority'] = 0;
  916. $v['cons'] = [];
  917. if ($v['work_type_mode'] == 1) {
  918. $typeInfo = (new \app\common\model\OrderType())
  919. ->getTypeByOrderId($v['id']);
  920. $v['order_type'] = $typeInfo && isset($typeInfo['title']) ? $typeInfo['title'] : '';
  921. $v['order_type_matter'] = $typeInfo ? $typeInfo['child_title'] : '';
  922. $v['address_title'] = $typeInfo ? $typeInfo['address_title'] : '';
  923. $v['repair_priority'] = $typeInfo ? $typeInfo['repair_priority'] : '';
  924. $v['task_priority'] = $typeInfo?($typeInfo['repair_priority_index']==3?1:0):0;
  925. $todo_mate = Db::name('todo_mate')
  926. ->where('order_id',$v['id'])
  927. ->select();
  928. if(!empty($todo_mate)){
  929. $cons = Db::name('todo_mate_item')
  930. ->alias('a')
  931. ->join('mate_goods b','b.id = a.items_id')
  932. ->where('a.todo_mate_id','in',array_column($todo_mate,'id'))
  933. ->field('a.*,b.title')
  934. ->select();
  935. foreach ($cons as $k1=>$v1){
  936. $v['cons'][] = [
  937. 'title' =>$v1['title'],
  938. 'total' =>$v1['total'],
  939. 'money' =>$v1['money'],
  940. 'total_money' =>$v1['total_money'],
  941. 'realName' =>$this->getTableField('user',['id'=>$v1['user_id']],'real_name'),
  942. ];
  943. }
  944. }
  945. }
  946. $v['type_name'] = '';
  947. $v['start_name'] = '';
  948. $v['end_name'] = '';
  949. $v['device_name'] = '';
  950. if ($v['work_type_mode'] == 3) {
  951. $oc = Db::name('order_convey')
  952. ->where('order_id', $v['id'])
  953. ->find();
  954. $v['type_name'] = $this->getTableField('convey_cate', ['id' => $oc['type']], 'title');
  955. $v['start_name'] = $this->getTableField('address', ['id' => $oc['start']], 'title');
  956. $v['end_name'] = $this->getTableField('address', ['id' => $oc['end']], 'title');
  957. $v['device_name'] = $this->getTableField('convey_device', ['id' => $oc['device_id']], 'title');
  958. $v['task_priority'] = $oc['priority']==3?2:0;
  959. }
  960. $v['work_type_mode_text'] = $this->getTableField('work_type_mode', ['id' => $v['work_type_mode']], 'name');
  961. $v['source_type_text'] =$v['from']>0? isset($this->source_type[$v['from']])?$this->source_type[$v['from']]:'':$this->getTableField('work_type_mode', ['id' => $v['work_type_mode']], 'name');
  962. $v['dep'] = $this->getTableField('dep', ['id' => $v['dep_id']], 'title');
  963. $v['order_mode_text'] = $this->getTableField('order_mode', ['id' => $v['order_mode']], 'in_content');
  964. $v['order_mode_out_text'] = $this->getTableField('order_mode', ['id' => $v['order_mode']], 'out_content');
  965. $v['order_mode_color'] = $this->getTableField('order_mode', ['id' => $v['order_mode']], 'color');
  966. $v['real_name'] = $this->getTableField('user', ['id' => $v['user_id']], 'real_name');
  967. $v['informer_user_name'] = $this->getTableField('user', ['id' => $v['informer_user']], 'real_name');
  968. $v['mobile'] = $this->getTableField('user', ['id' => $v['user_id']], 'mobile');
  969. $v['schedulContent'] = '';
  970. $v['to_user_name'] = '';
  971. $v['quality_cate_name'] = '';
  972. if($v['work_type_mode']==15){
  973. $v['quality_cate_name'] = model('QualityCate')->getPTitle($v['quality_cate']);
  974. }
  975. $todo = Db::name('todo')
  976. ->where('order_id', $v['id'])
  977. ->where('del',0)
  978. ->select();
  979. if($todo){
  980. $toUserInfo = Db::name('user')
  981. ->where('id','in',array_column($todo,'to_user_id'))
  982. ->column('real_name');
  983. $v['to_user_name'] = implode(',',$toUserInfo);
  984. }
  985. $dispatchLog = Db::name('dispatch_log')
  986. ->where('order_id',$v['id'])
  987. ->find();
  988. if($dispatchLog && $dispatchLog['content']){
  989. $v['schedulContent'] = $dispatchLog['content'];
  990. }
  991. $pDep = '';
  992. $depInfo = Db::name('dep')
  993. ->where('id',$v['dep_id'])
  994. ->find();
  995. if($depInfo){
  996. $pDep = Db::name('dep_cate')
  997. ->where('id',$depInfo['cate_id'])
  998. ->value('title');
  999. }
  1000. $v['dep_cate_name'] = $pDep;
  1001. if ($is_list > 0) {
  1002. $v['todo_list'] = [];
  1003. $todo = Db::name('todo')
  1004. ->where('order_id', $v['id'])
  1005. ->where('del',0)
  1006. ->select();
  1007. if (!empty($todo)) {
  1008. foreach ($todo as $k => $v1) {
  1009. $todo[$k]['to_real_name'] = $this->getTableField('user', ['id' => $v1['to_user_id']], 'real_name');
  1010. $todo[$k]['todo_mode_text'] = $this->getTableField('todo_mode', ['id' => $v1['todo_mode']], 'in_content');
  1011. $tx = $this->getTableField('todo_mode', ['id' => $v1['todo_mode']], 'out_content');
  1012. $todo[$k]['to_ok_images'] = !empty($v1['images'])?explode(',',$v1['images']):'';
  1013. $todo[$k]['todo_mode_out_text'] =$tx;
  1014. $todoConvey = Db::name('todo_convey')->where('todo_id',$v1['id'])->find();
  1015. $todo[$k]['start_img'] = $todoConvey?$todoConvey['start_img'] :'';
  1016. $todo[$k]['end_img'] = $todoConvey?$todoConvey['end_img'] :'';
  1017. }
  1018. $v['todo_list'] = $todo;
  1019. }
  1020. $v['comment'] = [];
  1021. if ($v['order_mode'] == 6) {
  1022. $v['comment'] = Db::name('comment')
  1023. ->where('type', $v['work_type_mode'])
  1024. ->where('from_id', $v['id'])
  1025. ->where('org_id', $v['org_id'])
  1026. ->find();
  1027. }
  1028. $v['oc'] = [];
  1029. $v['ocp'] = [];
  1030. if ($v['work_type_mode'] == 3) {
  1031. $oc = Db::name('order_convey')
  1032. ->where('order_id', $v['id'])
  1033. ->find();
  1034. $oc['type_name'] = $this->getTableField('convey_cate', ['id' => $oc['type']], 'title');
  1035. $oc['start_name'] = $this->getTableField('address', ['id' => $oc['start']], 'title');
  1036. $oc['end_name'] = $this->getTableField('address', ['id' => $oc['end']], 'title');
  1037. $oc['device_name'] = $this->getTableField('convey_device', ['id' => $oc['device_id']], 'title');
  1038. $v['oc'] = $oc;
  1039. $cate = $this->getTableField('convey_cate', ['id' => $oc['type']], 'cate');
  1040. if ($cate == 1) {
  1041. $ocp = Db::name('order_convey_patient')
  1042. ->where('order_id', $v['id'])
  1043. ->find();
  1044. $v['ocp'] = $ocp;
  1045. }
  1046. }
  1047. }
  1048. return $v;
  1049. }
  1050. public function newFormatOrder($v, $is_list = 0) {
  1051. $v['order_type'] = '';
  1052. $v['order_type_matter'] = '';
  1053. $v['address_title'] = '';
  1054. $v['repair_priority'] = '';
  1055. $v['task_priority'] = 0;
  1056. $v['cons'] = [];
  1057. if ($v['work_type_mode'] == 1) {
  1058. $typeInfo = (new \app\common\model\OrderType())
  1059. ->getTypeByOrderId($v['id']);
  1060. $v['order_type'] = $typeInfo && isset($typeInfo['title']) ? $typeInfo['title'] : '';
  1061. $v['order_type_matter'] = $typeInfo ? $typeInfo['child_title'] : '';
  1062. $v['address_title'] = $typeInfo ? $typeInfo['address_title'] : '';
  1063. $v['repair_priority'] = $typeInfo ? $typeInfo['repair_priority'] : '';
  1064. $v['task_priority'] = $typeInfo?($typeInfo['repair_priority_index']==3?1:0):0;
  1065. $todo_mate = Db::name('todo_mate')
  1066. ->where('order_id',$v['id'])
  1067. ->select();
  1068. if(!empty($todo_mate)){
  1069. $cons = Db::name('todo_mate_item')
  1070. ->alias('a')
  1071. ->join('mate_goods b','b.id = a.items_id')
  1072. ->where('a.todo_mate_id','in',array_column($todo_mate,'id'))
  1073. ->field('a.*,b.title')
  1074. ->select();
  1075. foreach ($cons as $k1=>$v1){
  1076. $v['cons'][] = [
  1077. 'title' =>$v1['title'],
  1078. 'total' =>$v1['total'],
  1079. 'money' =>$v1['money'],
  1080. 'total_money' =>$v1['total_money'],
  1081. 'realName' =>$this->getTableField('user',['id'=>$v1['user_id']],'real_name'),
  1082. ];
  1083. }
  1084. }
  1085. }
  1086. $v['type_name'] = '';
  1087. $v['start_name'] = '';
  1088. $v['end_name'] = '';
  1089. $v['device_name'] = '';
  1090. if ($v['work_type_mode'] == 3) {
  1091. $oc = Db::name('order_convey')
  1092. ->where('order_id', $v['id'])
  1093. ->find();
  1094. $v['type_name'] = $this->getTableField('convey_cate', ['id' => $oc['type']], 'title');
  1095. $v['start_name'] = $this->getTableField('address', ['id' => $oc['start']], 'title');
  1096. $v['end_name'] = $this->getTableField('address', ['id' => $oc['end']], 'title');
  1097. $v['device_name'] = $this->getTableField('convey_device', ['id' => $oc['device_id']], 'title');
  1098. $v['task_priority'] = $oc['priority']==3?2:0;
  1099. }
  1100. $v['work_type_mode_text'] = $this->getTableField('work_type_mode', ['id' => $v['work_type_mode']], 'name');
  1101. $v['source_type_text'] =$v['from']>0? isset($this->source_type[$v['from']])?$this->source_type[$v['from']]:'':$this->getTableField('work_type_mode', ['id' => $v['work_type_mode']], 'name');
  1102. $v['dep'] = $this->getTableField('dep', ['id' => $v['dep_id']], 'title');
  1103. $v['order_mode_text'] = $this->getTableField('order_mode', ['id' => $v['order_mode']], 'in_content');
  1104. $v['order_mode_out_text'] = $this->getTableField('order_mode', ['id' => $v['order_mode']], 'out_content');
  1105. $v['order_mode_color'] = $this->getTableField('order_mode', ['id' => $v['order_mode']], 'color');
  1106. $v['real_name'] = $this->getTableField('user', ['id' => $v['user_id']], 'real_name');
  1107. $v['informer_user_name'] = $this->getTableField('user', ['id' => $v['informer_user']], 'real_name');
  1108. $v['mobile'] = $this->getTableField('user', ['id' => $v['user_id']], 'mobile');
  1109. $v['schedulContent'] = '';
  1110. $v['to_user_name'] = '';
  1111. $v['quality_cate_name'] = '';
  1112. if($v['work_type_mode']==15){
  1113. $v['quality_cate_name'] = model('QualityCate')->getPTitle($v['quality_cate']);
  1114. }
  1115. $todo = Db::name('todo')
  1116. ->where('order_id', $v['id'])
  1117. ->where('del',0)
  1118. ->select();
  1119. if($todo){
  1120. $toUserInfo = Db::name('user')
  1121. ->where('id','in',array_column($todo,'to_user_id'))
  1122. ->column('real_name');
  1123. $v['to_user_name'] = implode(',',$toUserInfo);
  1124. }
  1125. $dispatchLog = Db::name('dispatch_log')
  1126. ->where('order_id',$v['id'])
  1127. ->find();
  1128. if($dispatchLog && $dispatchLog['content']){
  1129. $v['schedulContent'] = $dispatchLog['content'];
  1130. }
  1131. $pDep = '';
  1132. $depInfo = Db::name('dep')
  1133. ->where('id',$v['dep_id'])
  1134. ->find();
  1135. if($depInfo){
  1136. $pDep = Db::name('dep_cate')
  1137. ->where('id',$depInfo['cate_id'])
  1138. ->value('title');
  1139. }
  1140. $v['dep_cate_name'] = $pDep;
  1141. return $v;
  1142. }
  1143. //api格式化订单详情
  1144. public function apiFormatOrder($v, $is_list = 0,$todo_id=0) {
  1145. $v['delayStatus'] = 0;
  1146. $v['delayReason'] = '';
  1147. $v['videos'] = $v['videos']?$v['videos']:'';
  1148. $v['voices'] = $v['voices']?$v['voices']:'';
  1149. $v['images'] = $v['images']?$v['images']:'';
  1150. $v['repair'] = null;
  1151. if ($v['work_type_mode'] == 1) {
  1152. $v['repair'] = [];
  1153. $typeInfo = (new \app\common\model\OrderType())
  1154. ->getTypeByOrderId($v['id']);
  1155. $v['repair']['order_type'] = $typeInfo && isset($typeInfo['title']) ? $typeInfo['title'] : '';
  1156. $v['repair']['order_type_matter'] = $typeInfo ? $typeInfo['child_title'] : '';
  1157. $v['repair']['address_title'] = $typeInfo ? $typeInfo['address_title'] : '';
  1158. $v['repair']['type_id'] = $typeInfo ? $typeInfo['type_id'] : 0;
  1159. $v['repair']['address_id'] = $typeInfo ? $typeInfo['address_id'] : 0;
  1160. $v['repair']['repair_priority'] = $typeInfo ? $typeInfo['repair_priority'] : "";
  1161. }
  1162. $v['work_type_mode_text'] = $this->getTableField('work_type_mode', ['id' => $v['work_type_mode']], 'name');
  1163. $v['dep'] = $this->getTableField('dep', ['id' => $v['dep_id']], 'title');
  1164. $v['order_mode_text'] = $this->getTableField('order_mode', ['id' => $v['order_mode']], 'in_content');
  1165. $v['order_mode_out_text'] = $this->getTableField('order_mode', ['id' => $v['order_mode']], 'out_content');
  1166. $v['real_name'] = $this->getTableField('user', ['id' => $v['user_id']], 'real_name');
  1167. $v['mobile'] = $this->getTableField('user', ['id' => $v['user_id']], 'mobile');
  1168. $v['schedulContent'] = '';
  1169. $v['send_time'] = $v['send_time']?$v['send_time']:"";
  1170. $v['cancel_time'] = $v['cancel_time']?$v['cancel_time']:"";
  1171. $v['finish_time'] = $v['finish_time']?$v['finish_time']:"";
  1172. $v['quality_cate_name'] = '';
  1173. if($v['work_type_mode']==15){
  1174. $v['quality_cate_name'] = model('QualityCate')->getPTitle($v['quality_cate']);
  1175. }
  1176. $dispatchLog = Db::name('dispatch_log')
  1177. ->where('order_id',$v['id'])
  1178. ->find();
  1179. if($dispatchLog && $dispatchLog['content']){
  1180. $v['schedulContent'] = $dispatchLog['content'];
  1181. }
  1182. if ($is_list > 0) {
  1183. $v['todo_list'] = [];
  1184. $t = [];
  1185. if($todo_id >0){
  1186. $t[] = ['id','=',$todo_id];
  1187. }
  1188. $todo = Db::name('todo')
  1189. ->where('order_id', $v['id'])
  1190. ->where($t)
  1191. ->select();
  1192. if (!empty($todo)) {
  1193. $ysdign = model("Config")->getConfig("order_ys_sign",$v['org_id']);
  1194. foreach ($todo as $k => $v1) {
  1195. $todo[$k]['yssign'] = $ysdign == 1?1:0;
  1196. $todo[$k]['to_real_name'] = $this->getTableField('user', ['id' => $v1['to_user_id']], 'real_name');
  1197. $todo[$k]['todo_mode_text'] = $this->getTableField('todo_mode', ['id' => $v1['todo_mode']], 'in_content');
  1198. $tx = $this->getTableField('todo_mode', ['id' => $v1['todo_mode']], 'out_content');
  1199. $todo[$k]['startStatus'] = 0;
  1200. $todo[$k]['mobile'] = $this->getTableField('user', ['id' => $v1['to_user_id']], 'mobile');;
  1201. $todo[$k]['images'] = $v1['images']?$v1['images']:"";
  1202. $todo[$k]['reject_time'] = $v1['reject_time']?$v1['reject_time']:"";
  1203. $todo[$k]['confirm_time'] = $v1['confirm_time']?$v1['confirm_time']:"";
  1204. $todo[$k]['done_time'] = $v1['done_time']?$v1['done_time']:"";
  1205. $todo[$k]['sign'] = $v1['sign']?$v1['sign']:"";
  1206. $todo[$k]['nodo_reason'] = $v1['nodo_reason']?$v1['nodo_reason']:'';
  1207. $pause_name = '';
  1208. $pause_reason = '';
  1209. $pause_time = '';
  1210. $pauseList = [];
  1211. $pause_reason = $v1['pause_reason'];
  1212. $pause_time = $v1['pause_time'];
  1213. if($v1['todo_mode']==2 && $v1['pause']==1){
  1214. $pause_name = '已挂起';
  1215. $tx = $tx.'(已挂起)';
  1216. }
  1217. $pauseList = Db::name('todo_puase')
  1218. ->where('todo_id',$v1['id'])
  1219. ->select();
  1220. $pauseList = $pauseList?$pauseList:[];
  1221. $todo[$k]['pauseList'] = $pauseList;
  1222. $todo[$k]['todo_mode_out_text'] = $tx;
  1223. $todo[$k]['pause_name'] = $pause_name;
  1224. $todo[$k]['pause_time'] = $pause_time;
  1225. $todo[$k]['pause_reason'] = $pause_reason;
  1226. if($v['work_type_mode'] == 3){
  1227. $todo_convey = Db::name('todo_convey')
  1228. ->where('todo_id',$v1['id'])
  1229. ->find();
  1230. $todo[$k]['startStatus'] = isset($todo_convey['start_time'])&& !empty($todo_convey['start_time'])?1:0;
  1231. $todo[$k]['start_img'] = isset($todo_convey['start_img'])&& !empty($todo_convey['start_img'])?$todo_convey['start_img']:'';
  1232. $todo[$k]['end_img'] = isset($todo_convey['end_img'])&& !empty($todo_convey['end_img'])?$todo_convey['end_img']:'';
  1233. }
  1234. $todo_mate = Db::name('todo_mate')
  1235. ->where('todo_id',$v1['id'])
  1236. ->select();
  1237. $todo[$k]['cons'] = [];
  1238. if(!empty($todo_mate)){
  1239. $cons = Db::name('todo_mate_item')
  1240. ->alias('a')
  1241. ->join('mate_goods b','b.id = a.items_id')
  1242. ->where('a.todo_mate_id','in',array_column($todo_mate,'id'))
  1243. ->field('a.*,b.title')
  1244. ->select();
  1245. foreach ($cons as $k2=>$v2){
  1246. $todo[$k]['cons'][] = [
  1247. 'title' =>$v2['title'],
  1248. 'total' =>$v2['total'],
  1249. 'money' =>$v2['money'],
  1250. 'total_money' =>$v2['total_money'],
  1251. 'realName' =>$this->getTableField('user',['id'=>$v2['user_id']],'real_name'),
  1252. ];
  1253. }
  1254. }
  1255. }
  1256. $v['todo_list'] = $todo;
  1257. }
  1258. $v['comment'] = null;
  1259. if ($v['order_mode'] == 6) {
  1260. $v['comment'] = [];
  1261. $v['comment'] = Db::name('comment')
  1262. ->where('type', $v['work_type_mode'])
  1263. ->where('from_id', $v['id'])
  1264. ->where('org_id', $v['org_id'])
  1265. ->find();
  1266. }
  1267. $v['oc'] = null;
  1268. if ($v['work_type_mode'] == 3) {
  1269. $v['oc'] = [];
  1270. $oc = Db::name('order_convey')
  1271. ->where('order_id', $v['id'])
  1272. ->find();
  1273. $oc['type_name'] = $this->getTableField('convey_cate', ['id' => $oc['type']], 'title');
  1274. $oc['start_name'] = $this->getTableField('address', ['id' => $oc['start']], 'title');
  1275. $oc['end_name'] = $this->getTableField('address', ['id' => $oc['end']], 'title');
  1276. $oc['device_name'] = $this->getTableField('convey_device', ['id' => $oc['device_id']], 'title');
  1277. $oc['priority'] = isset($this->priority[$oc['priority']]) ? $this->priority[$oc['priority']] : "";
  1278. $sample = Db::name('order_convey_lis')
  1279. ->where('order_id', $v['id'])
  1280. ->column('barcode');
  1281. $oc['sample'] = implode(',', $sample);
  1282. $cate = $this->getTableField('convey_cate', ['id' => $oc['type']], 'cate');
  1283. $oc['conveyTypeCate'] = $cate;
  1284. $oc['typeScore'] = $oc['score'];
  1285. $v['oc'] = $oc;
  1286. if ($cate == 1) {
  1287. $ocp = Db::name('order_convey_patient')
  1288. ->where('order_id', $v['id'])
  1289. ->find();
  1290. $v['oc']['ocp'] = $ocp;
  1291. }
  1292. }
  1293. }
  1294. $v['delayStatus'] = 0;
  1295. $order_delay = Db::name('order_delay')
  1296. ->alias('a')
  1297. ->join('delay_reason b','a.delay_reason_id=b.id')
  1298. ->where('a.order_id',$v['id'])
  1299. ->field('a.*,b.title')
  1300. ->order('a.id desc')
  1301. ->find();
  1302. if($order_delay && $order_delay['status']==0){
  1303. $v['delayReason'] = $order_delay['title'];
  1304. $v['delayStatus'] = 1;
  1305. }
  1306. if($v['name']){
  1307. $v['real_name'] = $v['name'];
  1308. }
  1309. if($v['phone']){
  1310. $v['mobile'] = $v['phone'];
  1311. }
  1312. return $v;
  1313. }
  1314. public function cancel($id, $userId, $type = 1, $reason = '') {//type=1用户取消2调度取消
  1315. $info = $this
  1316. ->where('id', $id)
  1317. ->find();
  1318. if (!in_array($info['order_mode'], [1, 4])) {
  1319. $this->error = '当前订单不可取消';
  1320. }
  1321. $data = [
  1322. 'cancel_reason' => $reason,
  1323. 'cancel_user_id' => $userId,
  1324. 'cancel_time' => getTime(),
  1325. 'order_mode' => $type == 1 ? 2 : 3,
  1326. ];
  1327. $this->startTrans();
  1328. try {
  1329. $res = $this->where('id', $id)->update($data);
  1330. if (!$res) {
  1331. \exception('更新订单失败');
  1332. }
  1333. if ($type == 2) {
  1334. $todo = Db::name('todo')
  1335. ->where('order_id', $id)
  1336. ->select();
  1337. $tData = [
  1338. 'cancel_reason' => $reason,
  1339. 'todo_mode' => 6,
  1340. ];
  1341. if (!empty($todo)) {
  1342. $res = Db::name('todo')
  1343. ->where('order_id', $id)
  1344. ->update($tData);
  1345. if (!$res) {
  1346. \exception('更新工单失败');
  1347. }
  1348. Db::name('task')
  1349. ->where('bus_id', 'in', array_column($todo, 'id'))
  1350. ->where('type', 1)
  1351. ->delete();
  1352. }
  1353. }
  1354. $this->commit();
  1355. return true;
  1356. } catch (Exception $e) {
  1357. $this->error = $e->getMessage();
  1358. $this->rollback();
  1359. return false;
  1360. }
  1361. }
  1362. public function del($orderId, $userId) {
  1363. $this->startTrans();
  1364. try {
  1365. $res = $this
  1366. ->where('id', $orderId)->update([
  1367. 'del' => 1,
  1368. 'del_user_id' => $userId,
  1369. 'del_time' => getTime(),
  1370. ]);
  1371. if (!$res) {
  1372. \exception('订单删除失败');
  1373. }
  1374. $todo = Db::name('todo')
  1375. ->where('order_id', $orderId)
  1376. ->select();
  1377. if (!empty($todo)) {
  1378. $res = Db::name('todo')
  1379. ->where('order_id', $orderId)
  1380. ->update(['del' => 1]);
  1381. if (!$res) {
  1382. \exception('工单删除失败');
  1383. }
  1384. Db::name('task')
  1385. ->where('bus_id', 'in', array_column($todo, 'id'))
  1386. ->where('type', 1)
  1387. ->delete();
  1388. }
  1389. $this->commit();
  1390. return true;
  1391. } catch (Exception $e) {
  1392. Db::rollback();
  1393. $this->error = $e->getMessage();
  1394. return false;
  1395. }
  1396. }
  1397. //获取订单派单人数
  1398. public function sendUserNum($mode = 1,$orgId=0) {
  1399. $name = 'org_send_order' . $mode;
  1400. $value = (new \app\common\model\Config())
  1401. ->getConfig($name,$orgId);
  1402. return (!$value || $value == 0) ? 0 : 1;//0多人1单人
  1403. }
  1404. //派单
  1405. public function send($id, $userId, $data) {
  1406. $info = Db::name('orders')->where('id', $id)->find();
  1407. $oldInfo = $info;
  1408. if ($info['order_mode'] != 1) {
  1409. $this->error = '当前订单不可派发';
  1410. return false;
  1411. }
  1412. $data['userType'] = isset($data['userType']) ? $data['userType'] : 0;
  1413. if($info['source_type']==4 && $oldInfo['work_type_mode'] ==0 && $info['is_deal']==0){//一键呼叫派发
  1414. if(!isset($data['work_type_mode']) || $data['work_type_mode'] <0){
  1415. $this->error = '请选择转单类型';
  1416. return false;
  1417. }
  1418. $config = Db::name('config')
  1419. ->where('name','web_order_transfer_type')
  1420. ->value('value');
  1421. if(empty($config)){
  1422. $workType = [];
  1423. }else{
  1424. $workType = explode('|',$config);
  1425. }
  1426. if(!in_array($data['work_type_mode'],$workType)){
  1427. $this->error = '当前类型不能进行转单';
  1428. return false;
  1429. }
  1430. if($data['userType']==0){
  1431. $data['to_user_id'] = !isset($data['to_user_id'])?$data['to_user_id'.$data['work_type_mode']]:$data['to_user_id'];
  1432. }else{
  1433. $data['to_roles_id'] =!isset($data['to_roles_id'])? $data['to_roles_id'.$data['work_type_mode']]:$data['to_roles_id'];
  1434. }
  1435. $info['work_type_mode'] = $data['work_type_mode'];
  1436. if ($data['work_type_mode'] == 3) {
  1437. $result = validate('OrdersConvey')->check($data, []);
  1438. if (true !== $result) {
  1439. $this->error = validate('OrdersConvey')->getError();
  1440. return false;
  1441. }
  1442. }
  1443. }
  1444. $pusharr = []; // 需要推送给工人
  1445. $pushdis = []; // 需要推送给二级调度
  1446. if ($data['userType'] == 0) {
  1447. if (!isset($data['to_user_id']) || empty($data['to_user_id'])) {
  1448. $this->error = '请选择执行人';
  1449. return false;
  1450. }
  1451. if ($info['work_type_mode'] == 1) {
  1452. if (!isset($data['type_id']) || empty($data['type_id'])) {
  1453. $this->error = '请选择报修事项';
  1454. return false;
  1455. }
  1456. }
  1457. }
  1458. else {
  1459. if(two_dispatch_off($info['org_id'])!=1){
  1460. $this->error = '二级调度开关未开启';
  1461. return false;
  1462. }
  1463. if (!isset($data['to_roles_id']) || empty($data['to_roles_id'])) {
  1464. $this->error = '请选择二级调度';
  1465. return false;
  1466. }
  1467. }
  1468. $this->startTrans();
  1469. try {
  1470. if ($data['userType'] == 0) {
  1471. $send_user_num = $this->sendUserNum($info['work_type_mode'],$data['org_id']);
  1472. $users = explode(',', $data['to_user_id']);
  1473. if($send_user_num==1 && count($users) >1){
  1474. $this->error = '执行人只能选择单人';
  1475. return false;
  1476. }
  1477. $to_user_id = array_unique($users);
  1478. $todoData = [
  1479. 'order_id' => $id,
  1480. 'todo_content' => $data['todo_content'],
  1481. 'create_user_id' => $userId,
  1482. 'org_id' => $data['org_id'],
  1483. 'create_time' => getTime(),
  1484. 'todo_mode' => 1,
  1485. 'work_type_mode' => $info['work_type_mode'],
  1486. 'create_yyyy' => date('Y'),
  1487. 'create_yyyymm' => date('Ym'),
  1488. 'create_yyyymmdd' => date('Ymd'),
  1489. ];
  1490. $taskData = [
  1491. 'org_id' => $data['org_id'],
  1492. 'type' => 1,
  1493. 'start_time' => getTime(),
  1494. 'create_time' => getTime(),
  1495. ];
  1496. if($info['work_type_mode']==1){
  1497. if($info['source_type']==4 && $oldInfo['work_type_mode']==0 && $info['is_deal']==0) {
  1498. $taskData['priority'] = isset($data['repair_priority']) && $data['repair_priority']==3?1:0;
  1499. }else{
  1500. $orderRepair = Db::name('order_repair')
  1501. ->where('order_id',$id)
  1502. ->find();
  1503. $taskData['priority'] = !empty($orderRepair) && $orderRepair['repair_priority']==3?1:0;
  1504. }
  1505. }else if ($info['work_type_mode']==3){
  1506. if($info['source_type']==4 && $oldInfo['work_type_mode']==0 && $info['is_deal']==0) {
  1507. $taskData['priority'] = isset($data['repair_priority']) && $data['repair_priority']==3?2:0;
  1508. }else{
  1509. $order_convey = Db::name('order_convey')
  1510. ->where('order_id',$id)
  1511. ->find();
  1512. $taskData['priority'] = !empty($order_convey) && $order_convey['priority']==3?2:0;
  1513. }
  1514. }
  1515. $sns = [];
  1516. foreach ($to_user_id as $k => $v) {
  1517. if(empty($v)){
  1518. continue;
  1519. }
  1520. $todoData['to_user_id'] = $v;
  1521. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  1522. while (true){
  1523. if(in_array($todoData['sn'],$sns)){
  1524. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  1525. }else{
  1526. $sns[] = $todoData['sn'];
  1527. break;
  1528. }
  1529. }
  1530. $res = Db::name('todo')
  1531. ->insertGetId($todoData);
  1532. if (!$res) {
  1533. \exception('执行人:' . $v . '派单失败');
  1534. }
  1535. $pusharr[] = [
  1536. 'user_id' => $v,
  1537. 'todo_id' => $res
  1538. ];
  1539. $taskData['user_id'] = $v;
  1540. $taskData['bus_id'] = $res;
  1541. $res = Db::name('task')
  1542. ->insert($taskData);
  1543. if (!$res) {
  1544. \exception('执行人:' . $v . '任务保存失败');
  1545. }
  1546. }
  1547. if($info['source_type']==4 && $oldInfo['work_type_mode']==0 && $info['is_deal']==0){
  1548. $rr = ['order_mode' => 4, 'work_type_mode'=>$data['work_type_mode'],'send_time' => getTime(),'from'=>1];
  1549. }else{
  1550. $rr = ['order_mode' => 4, 'send_time' => getTime()];
  1551. }
  1552. $res = $this->where('id', $id)
  1553. ->update($rr);
  1554. if (!$res) {
  1555. \exception('订单更新失败');
  1556. }
  1557. }
  1558. else {
  1559. $pRolesId = explode(',',$data['to_roles_id']);
  1560. $pp = [];
  1561. foreach ($pRolesId as $k=>$v){
  1562. $logData = [
  1563. 'user_id' => $userId,
  1564. 'to_user_id' =>0,
  1565. 'create_time' => getTime(),
  1566. 'content' => isset($data['todo_content']) ? $data['todo_content'] : '',
  1567. 'order_id' => $id,
  1568. 'roles_id' => $v
  1569. ];
  1570. $pp[] = $logData;
  1571. }
  1572. $pushdis = Db::name('user_roles')
  1573. ->where('roles_id','in',$pRolesId)
  1574. ->column('user_id');
  1575. $res = Db::name('dispatch_log')
  1576. ->insertAll($pp);
  1577. if (!$res) {
  1578. \exception('派发失败');
  1579. }
  1580. if($info['source_type']==4 && $oldInfo['work_type_mode']==0 && $info['is_deal']==0){
  1581. $rrs = ['is_deal' => 1, 'work_type_mode'=>$data['work_type_mode']];
  1582. }else{
  1583. $rrs = ['is_deal' => 1];
  1584. }
  1585. $res = $this->where('id', $id)
  1586. ->update($rrs);
  1587. if (!$res) {
  1588. \exception('订单更新失败');
  1589. }
  1590. }
  1591. if ($info['work_type_mode'] == 1) {//报修订单
  1592. $rData = [];
  1593. if (isset($data['type_id']) && !empty($data['type_id'])) {
  1594. $rData['type_id'] = $data['type_id'];
  1595. }
  1596. if (isset($data['address_id']) && !empty($data['address_id'])) {
  1597. $rData['address_id'] = $data['address_id'];
  1598. }
  1599. if($info['source_type']==4 && $oldInfo['work_type_mode']==0 && $info['is_deal']==0) {
  1600. if (isset($data['repair_priority']) && !empty($data['repair_priority'])) {
  1601. $rData['repair_priority'] = $data['repair_priority'];
  1602. }
  1603. }
  1604. if (!empty($rData)) {
  1605. $old = Db::name('order_repair')
  1606. ->where('order_id', $id)
  1607. ->find();
  1608. if ($old) {
  1609. $rData['update_time'] = getTime();
  1610. $res = Db::name('order_repair')
  1611. ->where('order_id', $id)
  1612. ->update($rData);
  1613. }
  1614. else {
  1615. $rData['order_id'] = $id;
  1616. $res = Db::name('order_repair')
  1617. ->insert($rData);
  1618. }
  1619. if (!$res) {
  1620. \exception('保存维修扩展失败');
  1621. }
  1622. }
  1623. }else{
  1624. $old = Db::name('order_repair')
  1625. ->where('order_id', $id)
  1626. ->find();
  1627. if ($old) {
  1628. $res = Db::name('order_repair')
  1629. ->where('order_id', $id)
  1630. ->delete();
  1631. if (!$res) {
  1632. \exception('删除维修扩展失败');
  1633. }
  1634. }
  1635. }
  1636. if($info['source_type']==4 && $oldInfo['work_type_mode']==0 && $info['is_deal']==0){//一键呼叫 转单运送
  1637. if ($data['work_type_mode'] == 3) {
  1638. if (!$data['start'] || !$data['end']) {
  1639. $this->error = '取件与送达地点不能为空';
  1640. return false;
  1641. }
  1642. if ($data['start'] == $data['end']) {
  1643. $this->error = '取件与送达地点不能是同一地点';
  1644. return false;
  1645. }
  1646. if (!$data['xq_time'] || !$data['ywc_time']) {
  1647. $this->error = '应完成时间应和需求时间不能为空';
  1648. return false;
  1649. }
  1650. if ($data['xq_time'] >= $data['ywc_time']) {
  1651. $this->error = '应完成时间应大于需求时间';
  1652. return false;
  1653. }
  1654. if (strtotime($data['xq_time']) < time() - 10 * 60) {
  1655. $this->error = '需求时间已过时';
  1656. return false;
  1657. }
  1658. if (!$data['type']) {
  1659. $this->error = '运送类型不能为空';
  1660. return false;
  1661. }
  1662. // if(!$data['name']){
  1663. // $this->error = '联系人不能为空';
  1664. // return false;
  1665. // }
  1666. // if(!$data['phone']){
  1667. // $this->error = '联系人电话不能为空';
  1668. // return false;
  1669. // }
  1670. $ysData = array(
  1671. 'order_id' => $id,
  1672. 'type' => $data['type'],
  1673. 'start' => $data['start'],
  1674. 'end' => $data['end'],
  1675. 'xq_time' => $data['xq_time'],
  1676. 'ywc_time' => $data['ywc_time'],
  1677. 'name' => $data['name'],
  1678. 'phone' => $data['phone'],
  1679. 'device_id' => isset($data['device_id']) ? (int)$data['device_id'] : 0,
  1680. 'priority' => empty($data['priority']) ? 0 : $data['priority']
  1681. );
  1682. $check = Db::name('order_convey')
  1683. ->where('order_id',$id)
  1684. ->find();
  1685. if($check){
  1686. Db::name('order_convey')
  1687. ->where('order_id',$id)
  1688. ->update($ysData);
  1689. }else{
  1690. $oCid = Db::name('order_convey')
  1691. ->insertGetId($ysData);
  1692. if (!$oCid) {
  1693. exception('运送信息保存失败');
  1694. }
  1695. }
  1696. $conveyCate = Db::name('convey_cate')
  1697. ->where('id', $data['type'])
  1698. ->find();
  1699. if ($conveyCate['cate'] == 1) {
  1700. $patient = [
  1701. 'order_id' => $id,
  1702. 'bed_number' => isset($data['bed_number']) ? $data['bed_number'] : '',
  1703. 'name' => isset($data['p_name']) ? $data['p_name'] : '',
  1704. 'ba_number' => isset($data['ba_number']) ? $data['ba_number'] : '',
  1705. 'gender' => isset($data['gender']) && !empty($data['gender']) ? $data['gender'] : 0,
  1706. 'back' => isset($data['back']) && !empty($data['back']) ? $data['back'] : 0,
  1707. ];
  1708. $cp = Db::name('order_convey_patient')
  1709. ->where('order_id',$id)
  1710. ->find();
  1711. if($cp){
  1712. Db::name('order_convey_patient')
  1713. ->where('order_id',$id)
  1714. ->update($patient);
  1715. }else{
  1716. $ocPid = Db::name('order_convey_patient')
  1717. ->insertGetId($patient);
  1718. if (!$ocPid) {
  1719. exception('保存运送病人扩展失败');
  1720. }
  1721. }
  1722. }
  1723. }else{
  1724. Db::name('order_convey')
  1725. ->where('order_id',$id)
  1726. ->delete();
  1727. Db::name('order_convey_patient')
  1728. ->where('order_id',$id)
  1729. ->delete();
  1730. }
  1731. }
  1732. if($info['work_type_mode'] == 3){
  1733. $wlps = Db::connect('db_config_jili')->name('wlps')->where('order_id',$info['id'])->find();
  1734. if($wlps){
  1735. Db::connect('db_config_jili')->name('wlps')->where('id',$wlps['id'])->update([
  1736. 'send_time' => date('Y-m-d H:i:s')
  1737. ]);
  1738. }
  1739. }
  1740. $this->commit();
  1741. if($pusharr){
  1742. foreach ($pusharr as $k=>$v){
  1743. // 极光推送
  1744. send_jpush([$v['user_id']],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$v['todo_id']]);
  1745. }
  1746. }
  1747. if($pushdis){
  1748. foreach ($pushdis as $k=>$v){
  1749. // 极光推送
  1750. send_jpush([$v],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$info['id']]);
  1751. }
  1752. }
  1753. // 极光推送
  1754. send_jpush([$info['user_id']],AppMsg::PUSH_USER_ORDER_SEND,'',['id'=>$info['id']]);
  1755. return true;
  1756. } catch (Exception $e) {
  1757. $this->rollback();
  1758. $this->error = $e->getMessage();
  1759. return false;
  1760. }
  1761. }
  1762. //转单
  1763. public function zd_send($id, $data) {
  1764. $info = $this->where('id', $id)->find();
  1765. if ($info['order_mode'] != 1) {
  1766. $this->error = '当前订单不可转单';
  1767. return false;
  1768. }
  1769. if(!isset($data['work_type_mode']) || $data['work_type_mode'] <0){
  1770. $this->error = '请选择转单类型';
  1771. return false;
  1772. }
  1773. $config = Db::name('config')
  1774. ->where('name','web_order_transfer_type')
  1775. ->value('value');
  1776. if(empty($config)){
  1777. $workType = [];
  1778. }else{
  1779. $workType = explode('|',$config);
  1780. }
  1781. if(!in_array($data['work_type_mode'],[98,99])){
  1782. if(!in_array($data['work_type_mode'],$workType)){
  1783. $this->error = '当前类型不能进行转单';
  1784. return false;
  1785. }
  1786. }
  1787. $info['work_type_mode'] = $data['work_type_mode'];
  1788. if ($data['work_type_mode'] == 3) {
  1789. $result = validate('OrdersConvey')->check($data, []);
  1790. if (true !== $result) {
  1791. $this->error = validate('OrdersConvey')->getError();
  1792. return false;
  1793. }
  1794. }
  1795. if ($info['work_type_mode'] == 1) {
  1796. if (!isset($data['type_id']) || empty($data['type_id'])) {
  1797. $this->error = '请选择报修事项';
  1798. return false;
  1799. }
  1800. }
  1801. $this->startTrans();
  1802. try {
  1803. $rr['work_type_mode'] = $data['work_type_mode'];
  1804. $rr['update_time'] = getTime();
  1805. if($info['work_type_mode'] == 0 && $info['source_type'] == 4){
  1806. $rr['from'] = 1;
  1807. }
  1808. $res = $this->where('id', $id)
  1809. ->update($rr);
  1810. if (!$res) {
  1811. \exception('订单更新失败');
  1812. }
  1813. // if($info['work_type_mode'] == 3){
  1814. // $score = empty($data['score'])?0:floatval($data['score']);
  1815. // Db::name('order_convey')->where('order_id',$id)->update(['score'=>$score]);
  1816. // }
  1817. if ($info['work_type_mode'] == 1) {//报修订单
  1818. $rData = [];
  1819. if (isset($data['type_id']) && !empty($data['type_id'])) {
  1820. $rData['type_id'] = $data['type_id'];
  1821. }
  1822. if (isset($data['address_id']) && !empty($data['address_id'])) {
  1823. $rData['address_id'] = $data['address_id'];
  1824. }
  1825. if (isset($data['repair_priority']) && !empty($data['repair_priority'])) {
  1826. $rData['repair_priority'] = $data['repair_priority'];
  1827. }
  1828. if (!empty($rData)) {
  1829. $old = Db::name('order_repair')
  1830. ->where('order_id', $id)
  1831. ->find();
  1832. if ($old) {
  1833. $rData['update_time'] = getTime();
  1834. $res = Db::name('order_repair')
  1835. ->where('order_id', $id)
  1836. ->update($rData);
  1837. }
  1838. else {
  1839. $rData['order_id'] = $id;
  1840. $res = Db::name('order_repair')
  1841. ->insert($rData);
  1842. }
  1843. if (!$res) {
  1844. \exception('保存维修扩展失败');
  1845. }
  1846. }
  1847. }else{
  1848. $old = Db::name('order_repair')
  1849. ->where('order_id', $id)
  1850. ->find();
  1851. if ($old) {
  1852. $res = Db::name('order_repair')
  1853. ->where('order_id', $id)
  1854. ->delete();
  1855. if (!$res) {
  1856. \exception('删除维修扩展失败');
  1857. }
  1858. }
  1859. }
  1860. if ($data['work_type_mode'] == 3) {
  1861. if (!$data['start'] || !$data['end']) {
  1862. $this->error = '取件与送达地点不能为空';
  1863. return false;
  1864. }
  1865. if ($data['start'] == $data['end']) {
  1866. $this->error = '取件与送达地点不能是同一地点';
  1867. return false;
  1868. }
  1869. if (!$data['xq_time'] || !$data['ywc_time']) {
  1870. $this->error = '应完成时间应和需求时间不能为空';
  1871. return false;
  1872. }
  1873. if ($data['xq_time'] >= $data['ywc_time']) {
  1874. $this->error = '应完成时间应大于需求时间';
  1875. return false;
  1876. }
  1877. if (strtotime($data['xq_time']) < time() - 10 * 60) {
  1878. $this->error = '需求时间已过时';
  1879. return false;
  1880. }
  1881. if (!$data['type']) {
  1882. $this->error = '运送类型不能为空';
  1883. return false;
  1884. }
  1885. // if(!$data['name']){
  1886. // $this->error = '联系人不能为空';
  1887. // return false;
  1888. // }
  1889. // if(!$data['phone']){
  1890. // $this->error = '联系人电话不能为空';
  1891. // return false;
  1892. // }
  1893. $ysData = array(
  1894. 'order_id' => $id,
  1895. 'type' => $data['type'],
  1896. 'start' => $data['start'],
  1897. 'end' => $data['end'],
  1898. 'xq_time' => $data['xq_time'],
  1899. 'ywc_time' => $data['ywc_time'],
  1900. 'name' => $data['name'],
  1901. 'phone' => $data['phone'],
  1902. 'device_id' => isset($data['device_id']) ? (int)$data['device_id'] : 0,
  1903. 'priority' => empty($data['priority']) ? 0 : $data['priority']
  1904. );
  1905. $check = Db::name('order_convey')
  1906. ->where('order_id',$id)
  1907. ->find();
  1908. if($check){
  1909. Db::name('order_convey')
  1910. ->where('order_id',$id)
  1911. ->update($ysData);
  1912. }else{
  1913. $oCid = Db::name('order_convey')
  1914. ->insertGetId($ysData);
  1915. if (!$oCid) {
  1916. exception('运送信息保存失败');
  1917. }
  1918. }
  1919. $conveyCate = Db::name('convey_cate')
  1920. ->where('id', $data['type'])
  1921. ->find();
  1922. if ($conveyCate['cate'] == 1) {
  1923. $patient = [
  1924. 'order_id' => $id,
  1925. 'bed_number' => isset($data['bed_number']) ? $data['bed_number'] : '',
  1926. 'name' => isset($data['p_name']) ? $data['p_name'] : '',
  1927. 'ba_number' => isset($data['ba_number']) ? $data['ba_number'] : '',
  1928. 'gender' => isset($data['gender']) && !empty($data['gender']) ? $data['gender'] : 0,
  1929. 'back' => isset($data['back']) && !empty($data['back']) ? $data['back'] : 0,
  1930. ];
  1931. $cp = Db::name('order_convey_patient')
  1932. ->where('order_id',$id)
  1933. ->find();
  1934. if($cp){
  1935. Db::name('order_convey_patient')
  1936. ->where('order_id',$id)
  1937. ->update($patient);
  1938. }else{
  1939. $ocPid = Db::name('order_convey_patient')
  1940. ->insertGetId($patient);
  1941. if (!$ocPid) {
  1942. exception('保存运送病人扩展失败');
  1943. }
  1944. }
  1945. }
  1946. }else{
  1947. Db::name('order_convey')
  1948. ->where('order_id',$id)
  1949. ->delete();
  1950. Db::name('order_convey_patient')
  1951. ->where('order_id',$id)
  1952. ->delete();
  1953. }
  1954. //转投诉
  1955. if($data['work_type_mode']==98){
  1956. $complain=[
  1957. 'org_id'=>$info['org_id'],
  1958. 'dep_id'=>$info['dep_id'],
  1959. 'create_user_id'=>$info['user_id'],
  1960. 'content'=>$info['content'],
  1961. 'images'=>isset($info['images'])?$info['images']:'',
  1962. 'voices'=>isset($info['voices'])?$info['voices']:'',
  1963. 'videos'=>isset($info['videos'])?$info['videos']:'',
  1964. 'create_time'=>getTime(),
  1965. 'from'=>1,
  1966. 'create_yyyy'=>date('Y'),
  1967. 'create_yyyymm'=>date('Ym'),
  1968. 'create_yyyymmdd'=>date('Ymd'),
  1969. ];
  1970. $ret = Db::name('complain')->insert($complain);
  1971. if (!$ret) {
  1972. exception('转投诉失败');
  1973. }
  1974. }
  1975. //转隐患
  1976. if($data['work_type_mode']==99){
  1977. $complain=[
  1978. 'org_id'=>$info['org_id'],
  1979. 'dep_id'=>$info['dep_id'],
  1980. 'create_user_id'=>$info['user_id'],
  1981. 'content'=>$info['content'],
  1982. 'images'=>isset($info['images'])?$info['images']:'',
  1983. 'voices'=>isset($info['voices'])?$info['voices']:'',
  1984. 'videos'=>isset($info['videos'])?$info['videos']:'',
  1985. 'create_time'=>getTime(),
  1986. 'from'=>1,
  1987. 'create_yyyy'=>date('Y'),
  1988. 'create_yyyymm'=>date('Ym'),
  1989. 'create_yyyymmdd'=>date('Ymd'),
  1990. ];
  1991. $ret = Db::name('hiddendanger')->insert($complain);
  1992. if (!$ret) {
  1993. exception('转投诉失败');
  1994. }
  1995. }
  1996. if(in_array($data['work_type_mode'],[98,99])){
  1997. $res = $this
  1998. ->where('id', $id)->update([
  1999. 'del' => 1,
  2000. 'work_type_mode' => 0,
  2001. 'del_user_id' => $info['user_id'],
  2002. 'del_time' => getTime(),
  2003. ]);
  2004. if (!$res) {
  2005. \exception('订单删除失败');
  2006. }
  2007. }
  2008. $this->commit();
  2009. return true;
  2010. } catch (Exception $e) {
  2011. $this->rollback();
  2012. $this->error = $e->getMessage();
  2013. return false;
  2014. }
  2015. }
  2016. //批量派单
  2017. public function batchsend($id, $userId, $data) {
  2018. $ids = explode(',',$id);
  2019. $infos = $this->where('id', 'in',$ids)->select();
  2020. $pusharr = []; // 需要推送给工人
  2021. foreach ($infos as $k=>$info){
  2022. if ($info['order_mode'] != 1) {
  2023. $this->error = '当前选择订单中包含已派发订单,请重新选择';
  2024. return false;
  2025. }
  2026. $data['userType'] = isset($data['userType']) ? $data['userType'] : 0;
  2027. if ($data['userType'] == 0) {
  2028. if (!isset($data['to_user_id']) || empty($data['to_user_id'])) {
  2029. $this->error = '请选择执行人';
  2030. return false;
  2031. }
  2032. if ($info['work_type_mode'] == 1) {
  2033. if (!isset($data['type_id']) || empty($data['type_id'])) {
  2034. $this->error = '请选择报修事项';
  2035. return false;
  2036. }
  2037. }
  2038. }
  2039. else {
  2040. if(two_dispatch_off($info['org_id'])!=1){
  2041. $this->error = '二级调度开关未开启';
  2042. return false;
  2043. }
  2044. if (!isset($data['to_roles_id']) || empty($data['to_roles_id'])) {
  2045. $this->error = '请选择二级调度';
  2046. return false;
  2047. }
  2048. }
  2049. $this->startTrans();
  2050. try {
  2051. if ($data['userType'] == 0) {
  2052. $send_user_num = $this->sendUserNum($info['work_type_mode'],$data['org_id']);
  2053. $users = explode(',', $data['to_user_id']);
  2054. if($send_user_num==1 && count($users) >1){
  2055. $this->error = '执行人只能选择单人';
  2056. return false;
  2057. }
  2058. $to_user_id = array_unique($users);
  2059. $todoData = [
  2060. 'order_id' => $info['id'],
  2061. 'todo_content' => $data['todo_content'],
  2062. 'create_user_id' => $userId,
  2063. 'org_id' => $data['org_id'],
  2064. 'create_time' => getTime(),
  2065. 'todo_mode' => 1,
  2066. 'work_type_mode' => $info['work_type_mode'],
  2067. 'create_yyyy' => date('Y'),
  2068. 'create_yyyymm' => date('Ym'),
  2069. 'create_yyyymmdd' => date('Ymd'),
  2070. ];
  2071. $taskData = [
  2072. 'org_id' => $data['org_id'],
  2073. 'type' => 1,
  2074. 'start_time' => getTime(),
  2075. 'create_time' => getTime(),
  2076. ];
  2077. $sns = [];
  2078. foreach ($to_user_id as $k => $v) {
  2079. if(empty($v)){
  2080. continue;
  2081. }
  2082. $todoData['to_user_id'] = $v;
  2083. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  2084. while (true){
  2085. if(in_array($todoData['sn'],$sns)){
  2086. $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));
  2087. }else{
  2088. $sns[] = $todoData['sn'];
  2089. break;
  2090. }
  2091. }
  2092. $res = Db::name('todo')
  2093. ->insertGetId($todoData);
  2094. if (!$res) {
  2095. \exception('执行人:' . $v . '派单失败');
  2096. }
  2097. $pusharr[] = [
  2098. 'user_id' => $v,
  2099. 'todo_id' => $res
  2100. ];
  2101. $taskData['user_id'] = $v;
  2102. $taskData['bus_id'] = $res;
  2103. $res = Db::name('task')
  2104. ->insert($taskData);
  2105. if (!$res) {
  2106. \exception('执行人:' . $v . '任务保存失败');
  2107. }
  2108. }
  2109. $res = $this->where('id', $info['id'])
  2110. ->update(['order_mode' => 4, 'send_time' => getTime()]);
  2111. if (!$res) {
  2112. \exception('订单更新失败');
  2113. }
  2114. }
  2115. else {
  2116. $logData = [
  2117. 'user_id' => $userId,
  2118. 'to_user_id' => 0,
  2119. 'create_time' => getTime(),
  2120. 'content' => isset($data['todo_content']) ? $data['todo_content'] : '',
  2121. 'order_id' => $info['id'],
  2122. 'roles_id' => $data['to_roles_id']
  2123. ];
  2124. $res = Db::name('dispatch_log')
  2125. ->insertGetId($logData);
  2126. if (!$res) {
  2127. \exception('派发失败');
  2128. }
  2129. $res = $this->where('id', $info['id'])
  2130. ->update(['is_deal' => 1]);
  2131. if (!$res) {
  2132. \exception('订单更新失败');
  2133. }
  2134. }
  2135. if ($info['work_type_mode'] == 1) {//报修订单
  2136. $rData = [];
  2137. if (isset($data['type_id']) && !empty($data['type_id'])) {
  2138. $rData['type_id'] = $data['type_id'];
  2139. }
  2140. if (isset($data['address_id']) && !empty($data['address_id'])) {
  2141. $rData['address_id'] = $data['address_id'];
  2142. }
  2143. if (!empty($rData)) {
  2144. $old = Db::name('order_repair')
  2145. ->where('order_id', $info['id'])
  2146. ->find();
  2147. if ($old) {
  2148. $rData['update_time'] = getTime();
  2149. $res = Db::name('order_repair')
  2150. ->where('order_id', $info['id'])
  2151. ->update($rData);
  2152. }
  2153. else {
  2154. $rData['order_id'] = $info['id'];
  2155. $res = Db::name('order_repair')
  2156. ->insert($rData);
  2157. }
  2158. if (!$res) {
  2159. \exception('保存维修扩展失败');
  2160. }
  2161. }
  2162. }
  2163. if($info['work_type_mode'] == 3){
  2164. $wlps = Db::connect('db_config_jili')->name('wlps')->where('order_id',$info['id'])->find();
  2165. if($wlps){
  2166. Db::connect('db_config_jili')->name('wlps')->where('id',$wlps['id'])->update([
  2167. 'send_time' => date('Y-m-d H:i:s')
  2168. ]);
  2169. }
  2170. }
  2171. $this->commit();
  2172. } catch (Exception $e) {
  2173. $this->rollback();
  2174. $this->error = $e->getMessage();
  2175. return false;
  2176. }
  2177. // 极光推送
  2178. send_jpush([$info['user_id']],AppMsg::PUSH_USER_ORDER_SEND,'',['id'=>$info['id']]);
  2179. }
  2180. if($pusharr){
  2181. foreach ($pusharr as $k=>$v){
  2182. // 极光推送
  2183. send_jpush([$v['user_id']],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$v['todo_id']]);
  2184. }
  2185. }
  2186. return true;
  2187. }
  2188. //完成订单
  2189. public function finish($id) {
  2190. $info = $this->where('id', $id)->find();
  2191. if ($info['order_mode'] != 4) {
  2192. $this->error = '当前订单不可完成';
  2193. return false;
  2194. }
  2195. $this->startTrans();
  2196. try {
  2197. $res = $this->where('id', $id)
  2198. ->update([
  2199. 'order_mode' => 5,
  2200. 'finish_time' => getTime(),
  2201. ]);
  2202. if (!$res) {
  2203. \exception('订单更新失败');
  2204. }
  2205. $todo = Db::name('todo')
  2206. ->where('order_id', $id)
  2207. ->select();
  2208. if (!empty($todo)) {
  2209. foreach ($todo as $kk=>$vv){
  2210. $wh = [
  2211. 'todo_mode' => 3,
  2212. 'done_time' => getTime(),
  2213. 'wc_time'=>time() - strtotime($vv['confirm_time'])
  2214. ];
  2215. if($vv['todo_mode']==1){
  2216. $wh['confirm_time'] = $vv['create_time'];
  2217. $wh['wc_time'] = time() - strtotime($vv['create_time']);
  2218. }
  2219. $res = Db::name('todo')
  2220. ->where('id', $vv['id'])
  2221. ->update($wh);
  2222. if (!$res) {
  2223. \exception('工单更新失败');
  2224. }
  2225. }
  2226. $res = Db::name('task')
  2227. ->where('bus_id', 'in', array_column($todo, 'id'))
  2228. ->where('type', 1)
  2229. ->delete();
  2230. if (!$res) {
  2231. \exception('任务删除失败');
  2232. }
  2233. }
  2234. $this->commit();
  2235. // 极光推送
  2236. send_jpush([$info['user_id']],AppMsg::PUSH_USER_ORDER_FINISH,'',['id'=>$info['id']]);
  2237. return true;
  2238. } catch (Exception $e) {
  2239. $this->rollback();
  2240. $this->error = $e->getMessage();
  2241. return false;
  2242. }
  2243. }
  2244. //批量完成订单
  2245. public function batchfinish($id) {
  2246. $ids = explode(',',$id);
  2247. $infos = $this->where('id', 'in',$ids)->select();
  2248. $pusharr = []; // 需要推送
  2249. foreach ($infos as $k=>$info){
  2250. if ($info['order_mode'] != 4) {
  2251. $this->error = '当前所选订单有不可完成的订单';
  2252. return false;
  2253. }
  2254. $this->startTrans();
  2255. try {
  2256. $res = $this->where('id', $info['id'])
  2257. ->update([
  2258. 'order_mode' => 5,
  2259. 'finish_time' => getTime(),
  2260. ]);
  2261. if (!$res) {
  2262. \exception('订单更新失败');
  2263. }
  2264. $todo = Db::name('todo')
  2265. ->where('order_id', $info['id'])
  2266. ->select();
  2267. if (!empty($todo)) {
  2268. foreach ($todo as $kk=>$vv){
  2269. $wh = [
  2270. 'todo_mode' => 3,
  2271. 'done_time' => getTime(),
  2272. 'wc_time'=>time() - strtotime($vv['confirm_time'])
  2273. ];
  2274. if($vv['todo_mode']==1){
  2275. $wh['confirm_time'] = $vv['create_time'];
  2276. $wh['wc_time'] = time() - strtotime($vv['create_time']);
  2277. }
  2278. $res = Db::name('todo')
  2279. ->where('id', $vv['id'])
  2280. ->update($wh);
  2281. if (!$res) {
  2282. \exception('工单更新失败');
  2283. }
  2284. }
  2285. Db::name('task')
  2286. ->where('bus_id', 'in', array_column($todo, 'id'))
  2287. ->where('type', 1)
  2288. ->delete();
  2289. }
  2290. $this->commit();
  2291. $pusharr[] = [
  2292. 'user_id' => $info['user_id'],
  2293. 'id' => $info['id']
  2294. ];
  2295. } catch (Exception $e) {
  2296. $this->rollback();
  2297. $this->error = $e->getMessage();
  2298. return false;
  2299. }
  2300. }
  2301. if($pusharr){
  2302. foreach ($pusharr as $k=>$v){
  2303. // 极光推送
  2304. send_jpush([$v['user_id']],AppMsg::PUSH_USER_ORDER_FINISH,'',['id'=>$v['id']]);
  2305. }
  2306. }
  2307. return true;
  2308. }
  2309. //评价订单
  2310. public function addComment($id, $score, $content, $userId, $org_id) {
  2311. $info = $this->where('id', $id)->find();
  2312. if (!$info) {
  2313. $this->error = '订单不存在';
  2314. return false;
  2315. }
  2316. if ($info['user_id'] != $userId) {
  2317. $this->error = '订单只可由发起人评价';
  2318. return false;
  2319. }
  2320. if ($info['order_mode'] != 5) {
  2321. $this->error = '此状态不能评价';
  2322. return false;
  2323. }
  2324. $jsonArray = [
  2325. 'score'=>$score,
  2326. 'content'=>isset($content)?$content:'',
  2327. 'userId'=>$userId,
  2328. 'type'=>$info['work_type_mode'],
  2329. 'fromId'=>$id,
  2330. 'orgId'=>$org_id,
  2331. ];
  2332. $ret = model('Comment')->addSave($jsonArray);
  2333. if(!$ret){
  2334. $this->error = model('Comment')->getError();
  2335. return false;
  2336. }
  2337. return true;
  2338. }
  2339. //api 调度订单列表
  2340. public function lists($page, $size, $cur_order_mode, $userId, $orgId) {
  2341. $map[] = ['org_id', '=', $orgId];
  2342. $map[] = ['del', '=', 0];
  2343. $map2[] = ['todo_mode', '=', 4];
  2344. $map1 = [];
  2345. $auth = get_dispatch_auth($userId);
  2346. if (empty($auth)) {
  2347. $map[] = ['work_type_mode', '=', -1];
  2348. }
  2349. else {
  2350. $map[] = ['work_type_mode', 'in', $auth];
  2351. }
  2352. $org_two_dispatch = (new Config())->getConfig('org_two_dispatch',$orgId);
  2353. if($org_two_dispatch==0){//二级调度开关关闭
  2354. if ($cur_order_mode == 0) {//待处理
  2355. $map[] = ['order_mode', 'in', [1]];
  2356. $map[] = ['is_deal', '=', 0];
  2357. }
  2358. else {
  2359. if ($cur_order_mode == 1) {//已处理
  2360. $map[] = ['order_mode', 'in', [2, 3, 4, 5, 6]];
  2361. }
  2362. }
  2363. }else{
  2364. if (check_two_dispatch($userId) == 1) {//二级调度角色
  2365. $roles_id = Db::name('user_roles')
  2366. ->where('user_id',$userId)
  2367. ->value('roles_id');
  2368. $ids = Db::name('dispatch_log')
  2369. ->where('roles_id', $roles_id)
  2370. ->whereOr('to_user_id', $userId)
  2371. ->column('order_id');
  2372. if ($cur_order_mode == 2) {//驳回
  2373. if (empty($ids)) {
  2374. $map2[] = ['order_id', '=', -1];
  2375. }
  2376. else {
  2377. $map2[] = ['order_id', 'in', $ids];
  2378. }
  2379. }
  2380. else {
  2381. if (empty($ids)) {
  2382. $map[] = ['id', '=', -1];
  2383. }
  2384. else {
  2385. $map[] = ['id', 'in', $ids];
  2386. }
  2387. }
  2388. if ($cur_order_mode == 0) {//待处理
  2389. $map[] = ['order_mode', 'in', [1]];
  2390. }
  2391. else {
  2392. if ($cur_order_mode == 1) {//已处理
  2393. $map[] = ['order_mode', 'in', [2, 3, 4, 5, 6]];
  2394. }
  2395. }
  2396. }
  2397. else {
  2398. if ($cur_order_mode == 0) {//待处理
  2399. $map[] = ['order_mode', 'in', [1]];
  2400. $map[] = ['is_deal', '=', 0];
  2401. }
  2402. else {
  2403. if ($cur_order_mode == 1) {//已处理
  2404. $map[] = ['order_mode', 'in', [2, 3, 4, 5, 6]];
  2405. $map1[] = ['is_deal', '=', 1];
  2406. }
  2407. }
  2408. }
  2409. }
  2410. $offset = ($page - 1) * $size;
  2411. if ($cur_order_mode == 2) { //驳回订单
  2412. $list = Db::name('todo_view')
  2413. ->where($map)
  2414. ->where($map2)
  2415. ->limit($offset, $size)
  2416. ->order('id', 'desc')
  2417. ->select();
  2418. $data = [];
  2419. foreach ($list as $k => $v) {
  2420. $order = $this->where('id', $v['order_id'])
  2421. ->find()->toArray();
  2422. $v1 = $this->formatOrder($order);
  2423. $v1['is_transfer'] = ($order['source_type']==4 && $order['order_mode']==1 && $order['is_deal']==0)?1:0;
  2424. $ll = formatArray(
  2425. [
  2426. 'id',
  2427. 'order_mode',
  2428. 'create_time',
  2429. 'source_type',
  2430. 'work_type_mode',
  2431. 'send_time',
  2432. 'work_type_mode_text',
  2433. 'dep',
  2434. 'order_mode_text',
  2435. 'order_mode_out_text',
  2436. 'real_name',
  2437. 'is_transfer',
  2438. 'task_priority',
  2439. 'sn'
  2440. ]
  2441. , $v1);
  2442. if($order['from'] > 0){
  2443. $from = '';
  2444. if($order['from'] == 1){
  2445. $from = '一键呼叫';
  2446. }else if($order['from'] == 2){
  2447. $from = '隐患预警';
  2448. }else if($order['from'] == 3){
  2449. $from = '投诉';
  2450. }
  2451. $ll['work_type_mode_text'] = $ll['work_type_mode_text'].'('.$from.')';
  2452. }
  2453. $ll['todo_id'] = $v['id'];
  2454. $data[] = $ll;
  2455. }
  2456. return $data;
  2457. }
  2458. $list = $this->where($map)
  2459. ->whereOr($map1)
  2460. ->limit($offset, $size)
  2461. ->order('id', 'desc')
  2462. ->select();
  2463. $list = $list ? $list->toArray() : [];
  2464. $data = [];
  2465. foreach ($list as $k => $v) {
  2466. $v = $this->formatOrder($v);
  2467. $v['is_transfer'] = ($v['source_type']==4 && $v['order_mode']==1 && $v['is_deal']==0)?1:0;
  2468. $ll = formatArray(
  2469. [
  2470. 'id',
  2471. 'order_mode',
  2472. 'create_time',
  2473. 'source_type',
  2474. 'work_type_mode',
  2475. 'send_time',
  2476. 'work_type_mode_text',
  2477. 'dep',
  2478. 'order_mode_text',
  2479. 'order_mode_out_text',
  2480. 'real_name',
  2481. 'is_transfer',
  2482. 'task_priority',
  2483. 'sn'
  2484. ]
  2485. , $v);
  2486. if($v['from'] > 0){
  2487. $from = '';
  2488. if($v['from'] == 1){
  2489. $from = '一键呼叫';
  2490. }else if($v['from'] == 2){
  2491. $from = '隐患预警';
  2492. }else if($v['from'] == 3){
  2493. $from = '投诉';
  2494. }
  2495. $ll['work_type_mode_text'] = $ll['work_type_mode_text'].'('.$from.')';
  2496. }
  2497. $data[] = $ll;
  2498. }
  2499. return $data;
  2500. }
  2501. //api 发起人品控订单列表
  2502. public function userQualityLists($page, $size, $userId, $orgId) {
  2503. $map[] = ['org_id', '=', $orgId];
  2504. $map[] = ['del', '=', 0];
  2505. $map[] = ['user_id', '=', $userId];
  2506. $map[] = ['work_type_mode', '=', 15];
  2507. $offset = ($page - 1) * $size;
  2508. $list = $this->where($map)
  2509. ->limit($offset, $size)
  2510. ->order('id', 'desc')
  2511. ->select();
  2512. $list = $list ? $list->toArray() : [];
  2513. $data = [];
  2514. foreach ($list as $k => $v) {
  2515. $v = $this->formatOrder($v);
  2516. $ll = formatArray(
  2517. [
  2518. 'id',
  2519. 'create_time',
  2520. 'informer_user_name',
  2521. 'order_mode',
  2522. 'order_mode_out_text',
  2523. 'to_user_name',
  2524. 'real_name',
  2525. 'sn'
  2526. ]
  2527. , $v);
  2528. $data[] = $ll;
  2529. }
  2530. return $data;
  2531. }
  2532. //api 知会人品控订单列表
  2533. public function informerQualityLists($page, $size, $userId, $orgId) {
  2534. $map[] = ['org_id', '=', $orgId];
  2535. $map[] = ['del', '=', 0];
  2536. $map[] = ['informer_user', '=', $userId];
  2537. $map[] = ['work_type_mode', '=', 15];
  2538. $offset = ($page - 1) * $size;
  2539. $list = $this->where($map)
  2540. ->limit($offset, $size)
  2541. ->order('id', 'desc')
  2542. ->select();
  2543. $list = $list ? $list->toArray() : [];
  2544. $data = [];
  2545. foreach ($list as $k => $v) {
  2546. $v = $this->formatOrder($v);
  2547. $ll = formatArray(
  2548. [
  2549. 'id',
  2550. 'create_time',
  2551. 'informer_user_name',
  2552. 'order_mode',
  2553. 'order_mode_out_text',
  2554. 'to_user_name',
  2555. 'real_name',
  2556. 'sn'
  2557. ]
  2558. , $v);
  2559. $data[] = $ll;
  2560. }
  2561. return $data;
  2562. }
  2563. //api 订单详情
  2564. public function detail($orderId) {
  2565. $info = $this->where('id', $orderId)
  2566. ->find();
  2567. if (empty($info)) {
  2568. HelpHander::error('订单信息不存在');
  2569. }
  2570. $is_ch = 0;
  2571. if($info['order_mode'] == 4){
  2572. $todoInfo = Db::name('todo')->where('order_id',$info['id'])->where('del',0)->where('todo_mode','>',1)->find();
  2573. if(!$todoInfo){
  2574. $is_ch = 1;
  2575. }
  2576. }
  2577. $info['is_ch'] = $is_ch;
  2578. $info = $info->toArray();
  2579. $info = $this->apiFormatOrder($info, 1);
  2580. if($info['work_type_mode'] == 3){
  2581. // 地点路径
  2582. $conveyends = Db::name('order_convey_end')
  2583. ->alias('a')
  2584. ->join('address b','b.id = a.addr')
  2585. ->where('a.order_id',$orderId)
  2586. ->order('a.id asc')
  2587. ->field('a.*,b.title')
  2588. ->select();
  2589. $info['ends'] = $conveyends?$conveyends:[];
  2590. $payinfo = [
  2591. 'is_pay' => 0,
  2592. 'id' => 0,
  2593. 'url' => '',
  2594. 'money' => 0,
  2595. 'remark' => '',
  2596. 'type' => 1,
  2597. 'pay_time' => '',
  2598. ];
  2599. // 是否需要支付
  2600. $pay = Db::name('order_convey_pay')->where('order_id',$orderId)->find();
  2601. if($pay){
  2602. $payinfo['is_pay'] = $pay['status'] == 0?0:1;
  2603. $payinfo['url'] = url('h5/Index/pay',['id'=>$pay['id']],false,true);
  2604. $payinfo['money'] = round($pay['money'],2);
  2605. $payinfo['remark'] = $pay['remark'];
  2606. $payinfo['pay_time'] = $pay['pay_time']?$pay['pay_time']:'';
  2607. $payinfo['id'] = $pay['id'];
  2608. }
  2609. $info['pay'] = $payinfo;
  2610. }
  2611. return $info;
  2612. }
  2613. //抢单列表
  2614. public function queryGrabOrders($page, $size, $userId, $orgId) {
  2615. $rolesId = Db::name('user_roles')
  2616. ->where('user_id', $userId)
  2617. ->value('roles_id');
  2618. $rolesInfo = Db::name('roles')
  2619. ->where('id', $rolesId)
  2620. ->find();
  2621. if ($rolesInfo['parent_id'] > 0) {
  2622. $rolesId = $rolesInfo['parent_id'];
  2623. }
  2624. $workType = Db::name('work_type_mode')
  2625. ->where('type', 1)
  2626. ->where('roles', 'like', '%' . $rolesId . '%')
  2627. ->column('id');
  2628. if (empty($workType)) {
  2629. return [];
  2630. }
  2631. $n = [];
  2632. foreach ($workType as $k=>$v){
  2633. $orgGrabOrder = (new Config())->getConfig('org_grab_order'.$v,$orgId);
  2634. if($orgGrabOrder && $orgGrabOrder>0){
  2635. $n[] = $v;
  2636. }
  2637. }
  2638. if(empty($n)){
  2639. return [];
  2640. }
  2641. $workType = $n;
  2642. $map[] = ['org_id', '=', $orgId];
  2643. $map[] = ['del', '=', 0];
  2644. $map[] = ['order_mode', 'in', [1]];
  2645. $map[] = ['work_type_mode', 'in', $workType];
  2646. $offset = ($page - 1) * $size;
  2647. $list = $this->where($map)
  2648. // ->limit($offset, $size)
  2649. ->order('id', 'desc')
  2650. ->select();
  2651. $list = $list ? $list->toArray() : [];
  2652. $data = [];
  2653. // 预约类型-取15分钟后之前的订单
  2654. $curtime15 = time()+60*15;
  2655. foreach ($list as $k => $v) {
  2656. $rr = formatArray(
  2657. ['id', 'content', 'create_time', 'work_type_mode']
  2658. , $v);
  2659. $rr['depName'] = $this->getTableField('dep', ['id' => $v['dep_id']], 'title');
  2660. $convey = Db::name('order_convey')->where('order_id',$v['id'])->find();
  2661. $rr['start_address'] = '';
  2662. $rr['end_address'] = '';
  2663. $rr['convey_title'] = '';
  2664. if($v['work_type_mode'] == 3){
  2665. if($convey){
  2666. $rr['start_address'] = Db::name('address')->where('id',$convey['start'])->value('title');
  2667. $rr['end_address'] = Db::name('address')->where('id',$convey['end'])->value('title');
  2668. $cate = Db::name('convey_cate')->where('id',$convey['type'])->find();
  2669. $rr['convey_title'] = $cate?$cate['title']:'';
  2670. $conveyCate = Db::name('convey_cate')->where('id',$convey['type'])->find();
  2671. if($conveyCate && $conveyCate['priority'] != 4 && $convey['xq_time'] < date('Y-m-d H:i:s',$curtime15)){
  2672. $data[] = $rr;
  2673. }
  2674. }
  2675. }else{
  2676. $data[] = $rr;
  2677. }
  2678. }
  2679. $newData = array_page_list($data,$page,$size);
  2680. return $newData;
  2681. }
  2682. //抢单
  2683. public function grabOrdersEdit($order, $userId,$orderType,$addressId) {
  2684. $this->startTrans();
  2685. try {
  2686. $data = [
  2687. 'order_mode' => 4,
  2688. 'send_time' => getTime(),
  2689. ];
  2690. $res = $this->where('id', $order['id'])->update($data);
  2691. if (!$res) {
  2692. \exception('订单修改失败');
  2693. }
  2694. $orders = Db::name('orders')
  2695. ->where('id',$order['id'])
  2696. ->find();
  2697. if($orders['work_type_mode']==1){
  2698. $p = [
  2699. 'type_id'=>$orderType,
  2700. 'address_id'=>$addressId,
  2701. ];
  2702. $repair = Db::name('order_repair')
  2703. ->where('order_id', $order['id'])
  2704. ->find();
  2705. if($repair){
  2706. $r = Db::name('order_repair')
  2707. ->where('id', $repair['id'])
  2708. ->update($p);
  2709. }else{
  2710. $p['order_id'] = $order['id'];
  2711. $r = Db::name('order_repair')->insert($p);
  2712. }
  2713. if (!$r) {
  2714. \exception('订单扩展修改失败');
  2715. }
  2716. }
  2717. $todoData = [
  2718. 'order_id' => $order['id'],
  2719. 'todo_content' => '',
  2720. 'to_user_id' => $userId,
  2721. 'create_user_id' => $userId,
  2722. 'org_id' => $order['org_id'],
  2723. 'create_time' => getTime(),
  2724. 'xy_time' => time()-strtotime($orders['create_time']),
  2725. 'confirm_time' => getTime(),
  2726. 'todo_mode' => 2,
  2727. 'work_type_mode' => $order['work_type_mode'],
  2728. 'create_yyyy' => date('Y'),
  2729. 'create_yyyymm' => date('Ym'),
  2730. 'create_yyyymmdd' => date('Ymd'),
  2731. 'sn' => get_unique_sn(get_config('sn_prefix')),
  2732. ];
  2733. $res = Db::name('todo')
  2734. ->insertGetId($todoData);
  2735. if (!$res) {
  2736. \exception('抢单失败');
  2737. }
  2738. $taskData = [
  2739. 'org_id' => $order['org_id'],
  2740. 'type' => 1,
  2741. 'start_time' => getTime(),
  2742. 'create_time' => getTime(),
  2743. ];
  2744. $taskData['user_id'] = $userId;
  2745. $taskData['bus_id'] = $res;
  2746. if($orders['work_type_mode']==1){
  2747. $orderRepair = Db::name('order_repair')
  2748. ->where('order_id',$orders['id'])
  2749. ->find();
  2750. $taskData['priority'] = !empty($orderRepair) && $orderRepair['repair_priority']==3?1:0;
  2751. }else if ($orders['work_type_mode']==3){
  2752. $order_convey = Db::name('order_convey')
  2753. ->where('order_id',$orders['id'])
  2754. ->find();
  2755. $taskData['priority'] = !empty($order_convey) && $order_convey['priority']==3?2:0;
  2756. }
  2757. $res = Db::name('task')
  2758. ->insert($taskData);
  2759. if (!$res) {
  2760. \exception('任务保存失败');
  2761. }
  2762. $this->commit();
  2763. return true;
  2764. } catch (Exception $e) {
  2765. $this->error = $e->getMessage();
  2766. $this->rollback();
  2767. return false;
  2768. }
  2769. }
  2770. //用户订单列表
  2771. public function userOrdersByMode($page,$size,$userId,$mode,$type,$orgId){
  2772. $map[] = ['del', '=', 0];
  2773. $map[] = ['user_id', '=', $userId];
  2774. if($mode >0){
  2775. $map[] = ['work_type_mode', '=', $mode];
  2776. }
  2777. if($type >0 && in_array($type,[1,5,6])){
  2778. $map[] = ['order_mode', '=', $type];
  2779. }elseif ($type==7){//处理中
  2780. $map[] = ['order_mode', 'in', [1,4]];
  2781. }elseif ($type==8){//已挂起
  2782. $ids = Db::name('todo')
  2783. ->where('org_id',$orgId)
  2784. ->where('del',0)
  2785. ->where('work_type_mode',1)
  2786. ->where('todo_mode',2)
  2787. ->where('pause',1)
  2788. ->column('order_id');
  2789. if(empty($ids)){
  2790. $map[] = ['id', '=', -1];
  2791. }else{
  2792. $map[] = ['id', 'in', $ids];
  2793. }
  2794. }elseif ($type==9){//已取消
  2795. $map[] = ['order_mode', 'in', [2,3,7]];
  2796. }
  2797. $offset = ($page - 1) * $size;
  2798. $list = $this->where($map)
  2799. ->limit($offset, $size)
  2800. ->order('id', 'desc')
  2801. ->select();
  2802. $list = $list ? $list->toArray() : [];
  2803. $data = [];
  2804. foreach ($list as $k => $v) {
  2805. $v = $this->formatOrder($v);
  2806. $order_delay = Db::name('order_delay')
  2807. ->alias('a')
  2808. ->join('delay_reason b','a.delay_reason_id=b.id')
  2809. ->where('a.order_id',$v['id'])
  2810. ->field('a.*,b.title')
  2811. ->find();
  2812. if($order_delay && $order_delay['status']==0){
  2813. $v['order_mode_out_text'] = '延迟中';
  2814. $v['delay_reason'] = $order_delay['title'];
  2815. }
  2816. if($type==8){
  2817. $v['order_mode_out_text'] = $v['order_mode_out_text'].'(已挂起)';
  2818. }
  2819. $ll = formatArray(
  2820. [
  2821. 'id',
  2822. 'order_mode',
  2823. 'create_time',
  2824. 'source_type',
  2825. 'work_type_mode',
  2826. 'send_time',
  2827. 'work_type_mode_text',
  2828. 'dep',
  2829. 'order_mode_text',
  2830. 'order_mode_out_text',
  2831. 'real_name',
  2832. 'sn'
  2833. ]
  2834. , $v);
  2835. $data[] = $ll;
  2836. }
  2837. return $data;
  2838. }
  2839. //所有订单列表
  2840. public function queryAllOrder($orgId,$page,$size,$workTypeMode,$currOrderMode,$beginTime,$endTime,$dept=0){
  2841. if(in_array($workTypeMode,[0,1,2,3,4,15])){
  2842. $map[] = ['work_type_mode','=',$workTypeMode];
  2843. }
  2844. if($currOrderMode && $currOrderMode > 0){
  2845. $map[] = ['order_mode','=',$currOrderMode];
  2846. }
  2847. if($beginTime){
  2848. $map[] = ['create_time','>=',$beginTime.' 00:00:00'];
  2849. }
  2850. if($endTime){
  2851. $map[] = ['create_time','<=',$endTime.' 23:59:59'];
  2852. }
  2853. if($dept > 0){
  2854. $map[] = ['dep_id','=',$dept];
  2855. }
  2856. $map[] = ['del', '=', 0];
  2857. $map[] = ['org_id', '=', $orgId];
  2858. $offset = ($page - 1) * $size;
  2859. $list = $this->where($map)
  2860. ->limit($offset, $size)
  2861. ->order('id', 'desc')
  2862. ->select();
  2863. $list = $list ? $list->toArray() : [];
  2864. $data = [];
  2865. foreach ($list as $k => $v) {
  2866. $v = $this->apiFormatOrder($v);
  2867. $ll = formatArray(
  2868. [
  2869. 'id',
  2870. 'order_mode',
  2871. 'create_time',
  2872. 'source_type',
  2873. 'work_type_mode',
  2874. 'send_time',
  2875. 'work_type_mode_text',
  2876. 'dep',
  2877. 'order_mode_text',
  2878. 'order_mode_out_text',
  2879. 'real_name',
  2880. 'sn'
  2881. ]
  2882. , $v);
  2883. $data[] = $ll;
  2884. }
  2885. return $data;
  2886. }
  2887. //延迟任务
  2888. public function delay_reason($id,$delayReasonId,$type=0){
  2889. $ids = explode(',',$id);
  2890. $this->startTrans();
  2891. try{
  2892. foreach ($ids as $id){
  2893. $info = $this->where('id',$id)->find();
  2894. if (!in_array($info['order_mode'],[1,4])) {
  2895. \exception('选择的订单状态不能延迟');
  2896. }
  2897. $res = Db::name('order_delay')
  2898. ->where('order_id',$id)
  2899. ->where('status',0)
  2900. ->find();
  2901. if($res){
  2902. \exception('选择的订单已存在延时任务');
  2903. }
  2904. $curTime = date('Y-m-d H:i:s');
  2905. $res =Db::name('order_delay')
  2906. ->insert([
  2907. 'order_id' => $id,
  2908. 'delay_reason_id' => $delayReasonId,
  2909. 'start_time' => $curTime,
  2910. 'status' => 0,
  2911. 'type' => $type
  2912. ]);
  2913. if(!$res){
  2914. \exception('添加失败');
  2915. }
  2916. }
  2917. $this->commit();
  2918. return true;
  2919. }catch (Exception $e){
  2920. $this->rollback();
  2921. $this->error = $e->getMessage();
  2922. return false;
  2923. }
  2924. }
  2925. //取消延迟
  2926. public function batchcanceldelay($id){
  2927. $ids = explode(',',$id);
  2928. $this->startTrans();
  2929. try{
  2930. foreach ($ids as $id){
  2931. $info = Db::name('order_delay')
  2932. ->where('order_id',$id)
  2933. ->where('status',0)
  2934. ->find();
  2935. if(!$info){
  2936. \exception('选择的订单不存在延时任务');
  2937. }
  2938. $curTime = date('Y-m-d H:i:s');
  2939. $res =Db::name('order_delay')
  2940. ->where('order_id',$id)
  2941. ->update([
  2942. 'end_time' => $curTime,
  2943. 'diff' => strtotime($curTime) - strtotime($info['start_time']),
  2944. 'status' => 1
  2945. ]);
  2946. if(!$res){
  2947. \exception('添加失败');
  2948. }
  2949. }
  2950. $this->commit();
  2951. return true;
  2952. }catch (Exception $e){
  2953. $this->rollback();
  2954. $this->error = $e->getMessage();
  2955. return false;
  2956. }
  2957. }
  2958. public function addConveyEnd($orgId,$orderId,$addrId){
  2959. $order = Db::name('orders')
  2960. ->where('org_id',$orgId)
  2961. ->where('id',$orderId)
  2962. ->where('order_mode',4)
  2963. ->where('del',0)
  2964. ->where('work_type_mode',3)
  2965. ->find();
  2966. if(!$order){
  2967. $this->error = '订单不存在';
  2968. return false;
  2969. }
  2970. // 检查订单是不是病人运送
  2971. $convey = Db::name('order_convey')
  2972. ->alias('a')
  2973. ->join('convey_cate b','a.type = b.id')
  2974. ->where('a.order_id',$orderId)
  2975. ->where('b.cate',1)
  2976. ->field('a.*')
  2977. ->find();
  2978. if(!$convey){
  2979. $this->error = '订单不存在';
  2980. return false;
  2981. }
  2982. Db::startTrans();
  2983. try{
  2984. $ret = Db::name('order_convey_end')->insert([
  2985. 'order_id' => $orderId,
  2986. 'addr' => $convey['end'],
  2987. 'order_convey_id' => $convey['id'],
  2988. 'create_time' => date('Y-m-d H:i:s')
  2989. ]);
  2990. if(!$ret){
  2991. \exception('操作失败');
  2992. }
  2993. // 更换目的地
  2994. if($addrId != $convey['end']){
  2995. $res = Db::name('order_convey')->where('id', $convey['id'])->update([
  2996. 'end' => $addrId,
  2997. ]);
  2998. if(!$res){
  2999. \exception('操作失败');
  3000. }
  3001. }
  3002. Db::commit();
  3003. }catch (Exception $e){
  3004. Db::rollback();
  3005. $this->error = '操作失败';
  3006. return false;
  3007. }
  3008. return true;
  3009. }
  3010. // 途经点点扫码
  3011. public function sweepCode($code,$id,$num=0,$img='',$orgId=0,$userId=0){
  3012. $addrs = model('address')->checkAddrCode($code,2,$orgId);
  3013. if(!$addrs){
  3014. HelpHander::error('二维码不正确');
  3015. }
  3016. $info = Db::name('order_convey_end')->where('id',$id)->find();
  3017. if(!$info){
  3018. $this->error = '数据不存在';
  3019. return false;
  3020. }
  3021. if($info['addr'] != $addrs['id']){
  3022. $this->error = '地点不正确';
  3023. return false;
  3024. }
  3025. $totalNum = Db::name('orders')->where('id',$info['order_id'])->value('total_num');
  3026. if($totalNum > 0){
  3027. $totalNum2 = Db::name('order_convey_end')->where('order_id',$info['order_id'])->where('del',0)->where('scan',1)->sum('num');
  3028. $t2 = $totalNum2+$num;
  3029. if(intval($t2) > intval($totalNum) ){
  3030. $this->error = '送达数量不能超过领取总数量';
  3031. return false;
  3032. }
  3033. }
  3034. $res = Db::name('order_convey_end')->where('id',$id)->update([
  3035. 'scan' => 1,
  3036. 'update_time' => date('Y-m-d H:i:s'),
  3037. 'num'=>$num,
  3038. 'img'=>$img,
  3039. 'user_id'=>$userId
  3040. ]);
  3041. if(!$res){
  3042. $this->error = '操作失败';
  3043. return false;
  3044. }
  3045. return true;
  3046. }
  3047. //api获取调度,待处理,已处理,驳回数量
  3048. public function orderCount($userId, $orgId,$cur_order_mode=0) {
  3049. $map[] = ['org_id', '=', $orgId];
  3050. $map[] = ['del', '=', 0];
  3051. $map2[] = ['todo_mode', '=', 4];
  3052. $map1 = [];
  3053. $auth = get_dispatch_auth($userId);
  3054. if (empty($auth)) {
  3055. $map[] = ['work_type_mode', '=', -1];
  3056. }
  3057. else {
  3058. $map[] = ['work_type_mode', 'in', $auth];
  3059. }
  3060. $org_two_dispatch = (new Config())->getConfig('org_two_dispatch',$orgId);
  3061. if($org_two_dispatch==0){//二级调度开关关闭
  3062. if ($cur_order_mode == 0) {//待处理
  3063. $map[] = ['order_mode', 'in', [1]];
  3064. $map[] = ['is_deal', '=', 0];
  3065. }
  3066. else {
  3067. if ($cur_order_mode == 1) {//已处理
  3068. $map[] = ['order_mode', 'in', [2, 3, 4, 5, 6]];
  3069. }
  3070. }
  3071. }else{
  3072. if (check_two_dispatch($userId) == 1) {//二级调度角色
  3073. $roles_id = Db::name('user_roles')
  3074. ->where('user_id',$userId)
  3075. ->value('roles_id');
  3076. $ids = Db::name('dispatch_log')
  3077. ->where('roles_id', $roles_id)
  3078. ->whereOr('to_user_id', $userId)
  3079. ->column('order_id');
  3080. if ($cur_order_mode == 2) {//驳回
  3081. if (empty($ids)) {
  3082. $map2[] = ['order_id', '=', -1];
  3083. }
  3084. else {
  3085. $map2[] = ['order_id', 'in', $ids];
  3086. }
  3087. }
  3088. else {
  3089. if (empty($ids)) {
  3090. $map[] = ['id', '=', -1];
  3091. }
  3092. else {
  3093. $map[] = ['id', 'in', $ids];
  3094. }
  3095. }
  3096. if ($cur_order_mode == 0) {//待处理
  3097. $map[] = ['order_mode', 'in', [1]];
  3098. }
  3099. else {
  3100. if ($cur_order_mode == 1) {//已处理
  3101. $map[] = ['order_mode', 'in', [2, 3, 4, 5, 6]];
  3102. }
  3103. }
  3104. }
  3105. else {
  3106. if ($cur_order_mode == 0) {//待处理
  3107. $map[] = ['order_mode', 'in', [1]];
  3108. $map[] = ['is_deal', '=', 0];
  3109. }
  3110. else {
  3111. if ($cur_order_mode == 1) {//已处理
  3112. $map[] = ['order_mode', 'in', [2, 3, 4, 5, 6]];
  3113. $map1[] = ['is_deal', '=', 1];
  3114. }
  3115. }
  3116. }
  3117. }
  3118. if ($cur_order_mode == 2) { //驳回订单
  3119. $count = Db::name('todo_view')
  3120. ->where($map)
  3121. ->where($map2)
  3122. ->count();
  3123. return $count;
  3124. }
  3125. $count = $this->where($map)
  3126. ->whereOr($map1)
  3127. ->count();
  3128. return $count;
  3129. }
  3130. public function addBxOrders($data){
  3131. if($data['type_id'] < 1){
  3132. $this->error = '报修事项不能为空';
  3133. return false;
  3134. }
  3135. if($data['repair_priority'] < 1){
  3136. $this->error = '请选择紧急程度';
  3137. return false;
  3138. }
  3139. if(empty($data['images']) && empty($data['voices']) && empty($data['content'])){
  3140. $this->error = '内容不能为空';
  3141. return false;
  3142. }
  3143. $odata = [
  3144. 'user_id'=>$data['user_id'],
  3145. 'org_id'=> $data['org_id'],
  3146. 'dep_id'=>$data['dep_id'],
  3147. 'images'=>$data['images'],
  3148. 'videos'=>$data['videos'],
  3149. 'voices'=>$data['voices'],
  3150. 'content'=>$data['content'],
  3151. 'work_type_mode'=>$data['work_type_mode'],
  3152. 'source_type'=>$data['source_type'],
  3153. 'sn'=>get_unique_sn(get_config('sn_prefix')),
  3154. 'order_mode'=>4,
  3155. 'create_time'=>date('Y-m-d H:i:s'),
  3156. 'send_time'=>date('Y-m-d H:i:s'),
  3157. 'create_yyyy'=>date('Y'),
  3158. 'create_yyyymm'=>date('Ym'),
  3159. 'create_yyyymmdd'=>date('Ymd'),
  3160. 'from'=>1,
  3161. ];
  3162. Db::startTrans();
  3163. try {
  3164. $orderId = Db::name('orders')->insertGetId($odata);
  3165. if(!$orderId){
  3166. \exception('操作失败');
  3167. }
  3168. $orData = [
  3169. 'order_id'=>$orderId,
  3170. 'type_id'=>$data['type_id'],
  3171. 'address_id'=>$data['address_id'],
  3172. 'repair_priority'=>$data['repair_priority'],
  3173. 'update_time'=>date('Y-m-d H:i:s'),
  3174. ];
  3175. $or = Db::name('order_repair')->insert($orData);
  3176. if(!$or){
  3177. \exception('操作失败');
  3178. }
  3179. $tData = [
  3180. 'order_id'=>$orderId,
  3181. 'to_user_id'=>$data['user_id'],
  3182. 'todo_content'=>$data['content'],
  3183. 'org_id'=>$data['org_id'],
  3184. 'create_user_id'=>$data['user_id'],
  3185. 'create_time'=>date('Y-m-d H:i:s'),
  3186. 'todo_mode'=>2,
  3187. 'work_type_mode'=>$data['work_type_mode'],
  3188. 'create_yyyy'=>date('Y'),
  3189. 'create_yyyymm'=>date('Ym'),
  3190. 'create_yyyymmdd'=>date('Ymd'),
  3191. 'sn'=>get_unique_sn(get_config('sn_prefix')),
  3192. ];
  3193. $todoId = Db::name('todo')->insertGetId($tData);
  3194. if(!$todoId){
  3195. \exception('操作失败');
  3196. }
  3197. $taskData = [
  3198. 'org_id' => $data['org_id'],
  3199. 'user_id' => $data['user_id'],
  3200. 'type' => 1,
  3201. 'start_time' => getTime(),
  3202. 'create_time' => getTime(),
  3203. 'bus_id' => $todoId,
  3204. 'priority' => $data['repair_priority']==3 ?1:0,
  3205. ];
  3206. $task = Db::name('task')->insert($taskData);
  3207. if(!$task){
  3208. \exception('任务保存失败');
  3209. }
  3210. Db::commit();
  3211. } catch (\Exception $e) {
  3212. Db::rollback();
  3213. $this->error = '操作失败';
  3214. return false;
  3215. }
  3216. return true;
  3217. }
  3218. public function autoSend($id){
  3219. $info = Db::name('orders')
  3220. ->where('id',$id)
  3221. ->find();
  3222. // $org_auto_send = (new \app\common\model\Config())
  3223. // ->getConfig('org_auto_send',$info['org_id']);
  3224. // if(!$org_auto_send){
  3225. // $this->error='自动派单未开启';
  3226. // return false;
  3227. // }
  3228. $repair = Db::name('order_repair')
  3229. ->where('order_id',$id)
  3230. ->find();
  3231. if(empty($repair) || strlen($repair['type_id'])==0){
  3232. $this->error='订单报修事项为空';
  3233. return false;
  3234. }
  3235. $parent_id = Db::name('order_type')
  3236. ->where('id',$repair['type_id'])
  3237. ->value('parent_id');
  3238. if(empty($info)){
  3239. $this->error='订单信息不存在';
  3240. return false;
  3241. }
  3242. if($info['work_type_mode']!=1){
  3243. $this->error='当前订单类型不能自动派单';
  3244. return false;
  3245. }
  3246. if($info['order_mode']!=1){
  3247. $this->error='当前订单已处理';
  3248. return false;
  3249. }
  3250. $depInfo = Db::name('order_auto_send_area')
  3251. ->where('dep_id',$info['dep_id'])
  3252. ->find();
  3253. $workUser = get_sort_user($info['org_id'],1,$parent_id);
  3254. if(empty($workUser)){
  3255. $this->error='人员不存在';
  3256. return false;
  3257. }
  3258. //当前科室未设置负责人
  3259. if(empty($depInfo) || empty($depInfo['user_id'])){
  3260. $lastUser = Db::name('order_auto_send_log')
  3261. ->where('org_id',$info['org_id'])
  3262. ->where('type',0)
  3263. ->where('type_id',$parent_id)
  3264. ->order('id','desc')
  3265. ->value('user_id');
  3266. $newSort = cache("org_user_sort_".$info['org_id']);
  3267. if(empty($newSort)){
  3268. $newSort = get_sort_user($info['org_id'],1,$parent_id);
  3269. }else{
  3270. $newSort = Db::name('user')
  3271. ->where('id','in',$newSort)
  3272. ->where('type_id',$parent_id)
  3273. ->column('id');
  3274. }
  3275. if(cache("auto_send_end_".$info['org_id'])){
  3276. $userId = $newSort[0];
  3277. cache("auto_send_end_".$info['org_id'],false);
  3278. }else{
  3279. $curKey = array_search($lastUser,$newSort);
  3280. if(strlen($curKey) >0){
  3281. if(isset($newSort[$curKey+1])){
  3282. $userId = $newSort[$curKey+1];
  3283. if(!isset($newSort[$curKey+2])){
  3284. cache("org_user_sort_".$info['org_id'],null);
  3285. cache("org_user_sort_list_".$info['org_id'],null);
  3286. cache("auto_send_end_".$info['org_id'],1);
  3287. }
  3288. }else{
  3289. cache("org_user_sort_".$info['org_id'],null);
  3290. cache("org_user_sort_list_".$info['org_id'],null);
  3291. $userId = $newSort[0];
  3292. }
  3293. }else{
  3294. cache("org_user_sort_".$info['org_id'],null);
  3295. cache("org_user_sort_list_".$info['org_id'],null);
  3296. $userId = $newSort[0];
  3297. }
  3298. }
  3299. $type =0;
  3300. }else{//订单科室设置负责人
  3301. $lastUser = Db::name('order_auto_send_log')
  3302. ->where('org_id',$info['org_id'])
  3303. ->where('type',1)
  3304. ->where('dep_id',$info['dep_id'])
  3305. ->where('type_id',$parent_id)
  3306. ->order('id','desc')
  3307. ->value('user_id');
  3308. $idList = explode(',',$depInfo['user_id']);
  3309. $uu = Db::name('user')
  3310. ->where('del',0)
  3311. ->where('enable',1)
  3312. ->where('enable_sorts',1)
  3313. ->where('work',1)
  3314. ->where('type_id',$parent_id)
  3315. ->where('id','in',$idList)
  3316. ->order(['sorts'=>'desc','id'=>'asc'])
  3317. ->column('id');
  3318. if(empty($uu)){
  3319. Db::name('order_auto_send_area')
  3320. ->where('dep_id',$info['dep_id'])
  3321. ->delete();
  3322. $this->autoSend($id);
  3323. }else{
  3324. $old = cache("org_user_sort_".$info['org_id']);
  3325. $old_data = $uu;
  3326. $uu = [];
  3327. $not_exits = [];
  3328. if($old){
  3329. foreach ($old_data as $k=>$v){
  3330. if(in_array($v,$old)){
  3331. $kk = array_search($v,$old);
  3332. $uu[$kk] = $v;
  3333. }else{
  3334. $not_exits[] = $v;
  3335. }
  3336. }
  3337. }else{
  3338. $uu = $old_data;
  3339. }
  3340. ksort($uu);
  3341. $aa = [];
  3342. foreach ($uu as $k=>$v){
  3343. $aa[] = $v;
  3344. }
  3345. foreach ($not_exits as $k=>$v){
  3346. array_push($aa,$v);
  3347. }
  3348. $uu = $aa;
  3349. if(empty($lastUser) || !in_array($lastUser,$uu)){
  3350. $userId = $uu[0];
  3351. }else{
  3352. if($lastUser==$uu[count($uu)-1]){
  3353. $userId = $uu[0];
  3354. }else{
  3355. $cc = array_search($lastUser,$uu);
  3356. if(strlen($cc) >0){
  3357. if(isset($uu[$cc+1])){
  3358. $userId = $uu[$cc+1];
  3359. }else{
  3360. $userId = $uu[0];
  3361. }
  3362. }
  3363. }
  3364. }
  3365. }
  3366. $newSort = $uu;
  3367. $type =1;
  3368. }
  3369. $log = [
  3370. 'org_id'=>$info['org_id'],
  3371. 'order_id'=>$id,
  3372. 'user_id'=>$userId,
  3373. 'type_id'=>$parent_id,
  3374. 'dep_id'=>$type==1?$info['dep_id']:0,
  3375. 'type'=>$type,
  3376. 'create_time'=>getTime(),
  3377. 'user_sort'=>json_encode($newSort)
  3378. ];
  3379. Db::startTrans();
  3380. try{
  3381. $r =Db::name('order_auto_send_log')
  3382. ->insertGetId($log);
  3383. // Db::commit();
  3384. // return true;
  3385. if(!$r){
  3386. \exception('派单失败');
  3387. }
  3388. if($type==1){
  3389. $rr = Db::name('order_auto_send_area')
  3390. ->where('dep_id',$info['dep_id'])
  3391. ->update(['last_user'=>$userId,'update_time'=>getTime()]);
  3392. if(!$rr){
  3393. \exception('更新派单区域管理失败');
  3394. }
  3395. }
  3396. $todoData = [
  3397. 'order_id' => $id,
  3398. 'todo_content' => $info['content'],
  3399. 'create_user_id' => $info['user_id'],
  3400. 'org_id' => $info['org_id'],
  3401. 'create_time' => getTime(),
  3402. 'todo_mode' => 1,
  3403. 'work_type_mode' => $info['work_type_mode'],
  3404. 'create_yyyy' => date('Y'),
  3405. 'create_yyyymm' => date('Ym'),
  3406. 'create_yyyymmdd' => date('Ymd'),
  3407. ];
  3408. $taskData = [
  3409. 'org_id' => $info['org_id'],
  3410. 'type' => 1,
  3411. 'start_time' => getTime(),
  3412. 'create_time' => getTime(),
  3413. ];
  3414. if($info['work_type_mode']==1){
  3415. $orderRepair = Db::name('order_repair')
  3416. ->where('order_id',$info['id'])
  3417. ->find();
  3418. $taskData['priority'] = !empty($orderRepair) && $orderRepair['repair_priority']==3?1:0;
  3419. }else if ($info['work_type_mode']==3){
  3420. $order_convey = Db::name('order_convey')
  3421. ->where('order_id',$info['id'])
  3422. ->find();
  3423. $taskData['priority'] = !empty($order_convey) && $order_convey['priority']==3?2:0;
  3424. }
  3425. $sns = [];
  3426. $to_user_id = [$userId];
  3427. $snpre = (new Config())->getConfig('sn_prefix');
  3428. foreach ($to_user_id as $k => $v) {
  3429. if(empty($v)){
  3430. continue;
  3431. }
  3432. $todoData['to_user_id'] = $v;
  3433. while (true){ //获取唯一工单号
  3434. $sn = get_unique_sn($snpre);
  3435. if(!in_array($sn,$sns)){
  3436. $ret = Db::name('todo')->where('sn',$sn)->find();
  3437. if(!$ret){
  3438. $todoData['sn'] = $sn;
  3439. break;
  3440. }
  3441. }
  3442. }
  3443. $todoData['is_auto'] = 1;
  3444. $res = Db::name('todo')
  3445. ->insertGetId($todoData);
  3446. if (!$res) {
  3447. \exception('执行人:' . $v . '派单失败');
  3448. }
  3449. $pusharr[] = [
  3450. 'user_id' => $v,
  3451. 'todo_id' => $res
  3452. ];
  3453. $taskData['user_id'] = $v;
  3454. $taskData['bus_id'] = $res;
  3455. $res = Db::name('task')
  3456. ->insert($taskData);
  3457. if (!$res) {
  3458. \exception('执行人:' . $v . '任务保存失败');
  3459. }
  3460. }
  3461. $r = Db::name('orders')
  3462. ->where('id',$id)
  3463. ->update(['order_mode'=>4]);
  3464. if(!$r){
  3465. \exception('操作失败');
  3466. }
  3467. if($pusharr) {
  3468. foreach ($pusharr as $k => $v) {
  3469. // 极光推送
  3470. send_jpush([$v['user_id']], AppMsg::PUSH_WORKER_ORDER_SEND, '', ['id' => $v['todo_id']]);
  3471. }
  3472. }
  3473. // 极光推送
  3474. send_jpush([$info['user_id']],AppMsg::PUSH_USER_ORDER_SEND,'',['id'=>$info['id']]);
  3475. Db::commit();
  3476. return true;
  3477. }catch (Exception $e){
  3478. Db::rollback();
  3479. $this->error=$e->getMessage();
  3480. return false;
  3481. }
  3482. }
  3483. public function get_cur_day_lists($org,$limit=5)
  3484. {
  3485. $ret = Db::name('orders')
  3486. ->alias('o')
  3487. ->where('o.org_id',$org)
  3488. ->where('o.del',0)
  3489. // ->where('o.order_mode','in',[1,4])
  3490. //->where('o.work_type_mode',3)
  3491. ->where('o.create_yyyymmdd',date('Ymd'))
  3492. ->order('o.id','desc')
  3493. ->limit($limit)->select();
  3494. foreach ($ret as $k=>$v){
  3495. $todo =Db::name('todo')
  3496. ->alias('t')
  3497. ->where('t.order_id',$v['id'])
  3498. ->join('user u','u.id = t.to_user_id')
  3499. // ->where('t.todo_mode','in',[1,2,3])
  3500. ->where('t.del',0)
  3501. ->field('u.real_name,t.create_time,t.confirm_time')
  3502. ->order('t.id','asc')
  3503. ->select();
  3504. $users = [];
  3505. $confirmTime = '';
  3506. foreach ($todo as $kk=>$vv){
  3507. $users[] = $vv['real_name'];
  3508. if(!$confirmTime && $vv['confirm_time']){
  3509. $confirmTime = $vv['confirm_time'];
  3510. }else if($confirmTime && $vv['confirm_time'] && $vv['confirm_time'] < $confirmTime){
  3511. $confirmTime = $vv['confirm_time'];
  3512. }
  3513. }
  3514. $ret[$k]['real_names'] = implode(',',$users);
  3515. $ret[$k]['send_time'] = $todo?$todo[0]['create_time']:'';
  3516. $ret[$k]['confirm_time'] = $confirmTime;
  3517. $ret[$k]['order_model_txt'] = Db::name('order_mode')
  3518. ->where('id',$v['order_mode'])
  3519. ->value('out_content');
  3520. }
  3521. return $ret?$ret:[];
  3522. }
  3523. public function get_cur_day_lists_bak($org,$limit=5)
  3524. {
  3525. $ret = Db::name('orders')
  3526. ->alias('o')
  3527. ->join('order_convey oc','oc.order_id = o.id')
  3528. ->field('o.*,oc.type,oc.start,oc.end,oc.xq_time,oc.ywc_time,oc.device_id,oc.name,oc.phone,oc.priority')
  3529. ->where('o.org_id',$org)
  3530. ->where('o.del',0)
  3531. ->where('o.order_mode','in',[1,4])
  3532. ->where('o.work_type_mode',3)
  3533. ->where('o.create_yyyymmdd',date('Ymd'))
  3534. ->order('oc.xq_time','ASC')
  3535. ->limit($limit)->select();
  3536. foreach ($ret as $k=>$v){
  3537. $ret[$k]['start_name'] = $this->getTableField('address',array('id'=>$v['start']),'title');
  3538. $ret[$k]['end_name'] = $this->getTableField('address',array('id'=>$v['end']),'title');
  3539. $ret[$k]['type_name'] = $this->getTableField('convey_cate',array('id'=>$v['type']),'title');
  3540. $ret[$k]['real_name'] = $this->getTableField('user',array('id'=>$v['user_id']),'real_name');
  3541. $todo =Db::name('todo')
  3542. ->alias('t')
  3543. ->where('t.order_id',$v['id'])
  3544. ->join('user u','u.id = t.to_user_id')
  3545. ->where('t.todo_mode','in',[1,2,3])
  3546. ->where('t.del',0)
  3547. ->field('u.real_name,t.create_time,t.confirm_time')
  3548. ->order('t.id','asc')
  3549. ->select();
  3550. $users = [];
  3551. $confirmTime = '';
  3552. foreach ($todo as $kk=>$vv){
  3553. $users[] = $vv['real_name'];
  3554. if(!$confirmTime && $vv['confirm_time']){
  3555. $confirmTime = $vv['confirm_time'];
  3556. }else if($confirmTime && $vv['confirm_time'] && $vv['confirm_time'] < $confirmTime){
  3557. $confirmTime = $vv['confirm_time'];
  3558. }
  3559. }
  3560. $ret[$k]['real_names'] = implode(',',$users);
  3561. $ret[$k]['send_time'] = $todo?$todo[0]['create_time']:'';
  3562. $ret[$k]['confirm_time'] = $confirmTime;
  3563. $ret[$k]['device_name'] = '';
  3564. if($v['device_id'] > 0){
  3565. $ret[$k]['device_name'] = $this->getTableField('convey_device',array('id'=>$v['device_id']),'title');
  3566. }
  3567. $last = strtotime($v['ywc_time']) - time();
  3568. $ret[$k]['last_time'] = $last > 0?round($last/60):0;
  3569. }
  3570. return $ret?$ret:[];
  3571. }
  3572. public function delConveyEnd($orderId,$orgId){
  3573. $order = Db::name('orders')
  3574. ->where('org_id',$orgId)
  3575. ->where('id',$orderId)
  3576. ->where('order_mode',4)
  3577. ->where('del',0)
  3578. ->where('work_type_mode',3)
  3579. ->find();
  3580. if(!$order){
  3581. $this->error = '订单不存在';
  3582. return false;
  3583. }
  3584. // 检查订单是不是病人运送
  3585. $convey = Db::name('order_convey')
  3586. ->alias('a')
  3587. ->join('convey_cate b','a.type = b.id')
  3588. ->where('a.order_id',$orderId)
  3589. // ->where('b.cate',1)
  3590. ->field('a.*')
  3591. ->find();
  3592. if(!$convey){
  3593. $this->error = '订单不存在';
  3594. return false;
  3595. }
  3596. $orderEnd = Db::name('order_convey_end')
  3597. ->where('order_convey_id',$convey['id'])
  3598. ->where('del',0)
  3599. ->order('id','desc')
  3600. ->select();
  3601. if(!$orderEnd){
  3602. $this->error = '没有途径地点不能删除目的地';
  3603. return false;
  3604. }
  3605. Db::startTrans();
  3606. try{
  3607. $ret = Db::name('order_convey_end')
  3608. ->where('id',$orderEnd[0]['id'])->update([
  3609. 'del' => 1,
  3610. 'update_time' => date('Y-m-d H:i:s')
  3611. ]);
  3612. if(!$ret){
  3613. \exception('操作失败');
  3614. }
  3615. // 更换目的地
  3616. $res = Db::name('order_convey')
  3617. ->where('id', $convey['id'])->update([
  3618. 'end' => $orderEnd[0]['addr'],
  3619. ]);
  3620. if(!$res){
  3621. \exception('操作失败');
  3622. }
  3623. Db::commit();
  3624. }catch (Exception $e){
  3625. Db::rollback();
  3626. $this->error = '操作失败';
  3627. return false;
  3628. }
  3629. return true;
  3630. }
  3631. }