Engineer.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 小程序公共API服务
  7. */
  8. namespace app\bestbao\controller\api\v1;
  9. use app\bestbao\controller\api\Base;
  10. use app\bestbao\model\BestbaoEngineer;
  11. use app\bestbao\model\BestbaoProcess;
  12. use app\bestbao\model\BestbaoOrder;
  13. class Engineer extends Base{
  14. public function initialize() {
  15. parent::initialize();
  16. $this->isUserAuth();
  17. }
  18. /**
  19. * 判断是否维修工程师
  20. **/
  21. public function isEngineer(){
  22. $param['signkey'] = $this->request->param('signkey');
  23. $param['sign'] = $this->request->param('sign');
  24. $rel = $this->apiSign($param);
  25. if($rel['code'] != 200){
  26. return enjson($rel['code'],'签名验证失败');
  27. }
  28. $rel = BestbaoEngineer::where(['uid' => $this->user->id])->count();
  29. return enjson(200,'成功', $rel);
  30. }
  31. /**
  32. * 读取工程师的订单
  33. */
  34. public function index(){
  35. $param = [
  36. 'page' => $this->request->param('page/d',1),
  37. 'types' => $this->request->param('types/d',0),
  38. 'sign' => $this->request->param('sign/s'),
  39. ];
  40. $rel = $this->apiSign($param);
  41. if($rel['code'] != 200){
  42. return enjson($rel['code'],'签名验证失败');
  43. }
  44. //我的工单
  45. $engineer = BestbaoEngineer::where(['uid' => $this->user->id])->field('id')->find();
  46. if(empty($engineer)){
  47. return enjson($rel['code'],'我不是工程师');
  48. }
  49. $condition[] = ['member_miniapp_id','=',$this->miniapp_id];
  50. switch ($param['types']) {
  51. case 1:
  52. $condition[] = ['state','=',0];
  53. $condition[] = ['engineer_id','=',$engineer->id];
  54. break;
  55. case 2:
  56. $condition[] = ['state','>=',1];
  57. $condition[] = ['state','<=',2];
  58. $condition[] = ['engineer_id','=',$engineer->id];
  59. break;
  60. case 3:
  61. $condition[] = ['state','=',3];
  62. $condition[] = ['engineer_id','=',$engineer->id];
  63. break;
  64. default:
  65. $condition[] = ['state','=',0];
  66. $condition[] = ['engineer_id','=',0];
  67. break;
  68. }
  69. $order = BestbaoOrder::where($condition)->field('id,title,update_time,state,urgent,engineer_id,phone,realname,address,engineer_id')->order('id desc')->page($param['page'],10)->select();
  70. if($order->isEmpty()){
  71. return enjson(204);
  72. }
  73. $data = $order->toArray();
  74. foreach ($data as $key => $value) {
  75. $data[$key]['update_time'] = date('Y-m-d H:i',$value['update_time']);
  76. $data[$key]['state_text'] = BestbaoOrder::stateText($value['state'],$value['engineer_id']);
  77. $data[$key]['urgent_text'] = BestbaoOrder::urgentText($value['urgent']);
  78. }
  79. return enjson(200,'操作成功',$data);
  80. }
  81. /**
  82. * 订单详情
  83. * @return void
  84. */
  85. public function reView(){
  86. $param = [
  87. 'id' => $this->request->param('id/d',0),
  88. 'sign' => $this->request->param('sign/s'),
  89. ];
  90. $rel = $this->apiSign($param);
  91. if($rel['code'] != 200){
  92. return enjson($rel['code'],'签名验证失败');
  93. }
  94. //查询用户的工程师
  95. $engineer = BestbaoEngineer::where(['uid' => $this->user->id])->field('id,level,title')->find();
  96. if(empty($engineer)){
  97. return enjson(403,'你不是工程师');
  98. }
  99. $condition['member_miniapp_id'] = $this->miniapp_id;
  100. $condition['id'] = $param['id'];
  101. $order = BestbaoOrder::with(['user' => function($query){
  102. $query->field('nickname,phone_uid,id,face');
  103. }])->where($condition)->find();
  104. if(empty($order)){
  105. return enjson(403,'未找到当前工单');
  106. }
  107. if($order->engineer_id > 0){
  108. if($order->engineer_id != $engineer->id){
  109. return enjson(403,'不是您的工单');
  110. }
  111. }
  112. $order['update_time'] = date('Y-m-d H:i',$order['update_time']);
  113. $order['state_text'] = BestbaoOrder::stateText($order['state'],$order['engineer_id']);
  114. $order['urgent_text'] = BestbaoOrder::urgentText($order['urgent']);
  115. $order['imgs'] = json_decode($order['imgs'],true);
  116. $order['solve_time'] = empty($order['solve_time'])?'':date('Y-m-d H:i',$order['solve_time']);
  117. $info = BestbaoProcess::where(['order_id' => $param['id']])->select();
  118. $process = [];
  119. foreach ($info as $key => $value) {
  120. $process[$key]['text'] = $value['remarks'];
  121. $process[$key]['desc'] = date('Y-m-d H:i',$value['create_time']);
  122. }
  123. return enjson(200,'操作成功',['order'=>$order,'process' =>$process]);
  124. }
  125. /**
  126. * 接受工单*
  127. * @return void
  128. */
  129. public function doOrder(){
  130. $param = [
  131. 'id' => $this->request->param('id/d',0),
  132. 'solve_time' => $this->request->param('solve_time'),
  133. 'sign' => $this->request->param('sign/s'),
  134. ];
  135. $rel = $this->apiSign($param);
  136. if($rel['code'] != 200){
  137. return enjson($rel['code'],'签名验证失败');
  138. }
  139. $validate = $this->validate($param,'Order.doOrder');
  140. if(true !== $validate){
  141. return json(['code'=>403,'msg'=>$validate]);
  142. }
  143. //我的工单
  144. $engineer = BestbaoEngineer::where(['uid' => $this->user->id])->field('id,level,title')->find();
  145. if(empty($engineer)){
  146. return enjson($rel['code'],'我不是工程师');
  147. }
  148. $condition['member_miniapp_id'] = $this->miniapp_id;
  149. $condition['id'] = $param['id'];
  150. $condition['state'] = 0;
  151. $condition['engineer_id'] = 0;
  152. $order = BestbaoOrder::where($condition)->find();
  153. if(empty($order)){
  154. return enjson(403,'当前工单已有其它工程师服务中');
  155. }
  156. switch ($engineer->level) {
  157. case 1:
  158. $level = '中级工程师:';
  159. break;
  160. case 2:
  161. $level = '高级工程师:';
  162. break;
  163. default:
  164. $level = '初级工程师:';
  165. break;
  166. }
  167. $remarks = $level.'['.$engineer->title.']电话:['.$this->user->phone_uid.']预计服务时间:['.$param['solve_time'].']';
  168. BestbaoProcess::create(['member_miniapp_id' => $this->miniapp_id,'order_id' => $order->id,'engineer_id' => $engineer->id,'remarks' =>$remarks]);
  169. $order->engineer_id = $engineer->id;
  170. $order->save();
  171. return enjson(200,'工单接受成功,请注意服务时间,不要超时。');
  172. }
  173. /**
  174. * 工单流转
  175. * @return void
  176. */
  177. public function changeOrder(){
  178. $param = [
  179. 'id' => $this->request->param('id/d'),
  180. 'change_id' => $this->request->param('change_id/d',0),
  181. 'change_engineer' => $this->request->param('change_engineer/s'),
  182. 'sign' => $this->request->param('sign/s'),
  183. ];
  184. $rel = $this->apiSign($param);
  185. if($rel['code'] != 200){
  186. return enjson($rel['code'],'签名验证失败');
  187. }
  188. $validate = $this->validate($param,'Order.changeOrder');
  189. if(true !== $validate){
  190. return json(['code'=>403,'msg'=>$validate]);
  191. }
  192. //查询其它工程师
  193. $engineer = BestbaoEngineer::where(['uid' => $this->user->id])->field('id,level,title,uid')->find();
  194. if(empty($engineer)){
  195. return enjson($rel['code'],'你不是工程师');
  196. }
  197. //我的订单
  198. $condition['id'] = $param['id']; //工单ID
  199. $condition['member_miniapp_id'] = $this->miniapp_id; //所属应用ID
  200. $condition['engineer_id'] = $engineer->id; //工程师ID
  201. $condition['state'] = 0; //状态
  202. $order = BestbaoOrder::where($condition)->find();
  203. if(empty($order)){
  204. return enjson(403,'未找到工单');
  205. }
  206. //转出工程师
  207. $change_engineer = BestbaoEngineer::where(['id' => $param['change_id']])->field('id,level,title,uid')->find();
  208. if(empty($change_engineer)){
  209. return enjson($rel['code'],'未找不流转对象');
  210. }
  211. switch ($change_engineer->level) {
  212. case 1:
  213. $level = '中级工程师:';
  214. break;
  215. case 2:
  216. $level = '高级工程师:';
  217. break;
  218. default:
  219. $level = '初级工程师:';
  220. break;
  221. }
  222. $remarks = $level.'['.$change_engineer->title.']为你服务,电话:'.$change_engineer->user->phone_uid;
  223. BestbaoProcess::create(['member_miniapp_id' => $this->miniapp_id,'order_id' => $order->id,'engineer_id' => $engineer->id,'remarks' =>$remarks]);
  224. $order->engineer_id = $change_engineer->id;
  225. $order->save();
  226. return enjson(200,'工单已转给其它工程师');
  227. }
  228. /**
  229. * 工单完结
  230. * @return void
  231. */
  232. public function orderEnd(){
  233. $param = [
  234. 'id' => $this->request->param('id/d',0),
  235. 'servertypes' => $this->request->param('servertypes/s'),
  236. 'buytypes' => $this->request->param('buytypes/s'),
  237. 'question' => $this->request->param('question/s'),
  238. 'answer' => $this->request->param('answer/s'),
  239. 'accessories' => $this->request->param('accessories/s'),
  240. 'accessories_price' => $this->request->param('accessories_price/f',0),
  241. 'service_price' => $this->request->param('service_price/f',0),
  242. 'discount_price' => $this->request->param('discount_price/f',0),
  243. 'price' => money($this->request->param('price/f',0)),
  244. 'sign' => $this->request->param('sign/s'),
  245. ];
  246. $rel = $this->apiSign($param);
  247. if($rel['code'] != 200){
  248. return enjson($rel['code'],'签名验证失败');
  249. }
  250. //费用
  251. $price = money($param['accessories_price']+$param['service_price']-$param['discount_price']);
  252. if($price < 0){
  253. return enjson(403,'应付金额禁止小于0元');
  254. }
  255. if($param['price'] != $price){
  256. return enjson(403,'应付金额金额有误');
  257. }
  258. //查询其它工程师
  259. $engineer = BestbaoEngineer::where(['uid' => $this->user->id])->field('id,level,title')->find();
  260. if(empty($engineer)){
  261. return enjson($rel['code'],'你不是工程师');
  262. }
  263. //我的订单
  264. $condition['member_miniapp_id'] = $this->miniapp_id;
  265. $condition['id'] = $param['id'];
  266. $condition['state'] = 0;
  267. $condition['engineer_id'] = $engineer->id;
  268. $order = BestbaoOrder::where($condition)->find();
  269. if(empty($order)){
  270. return enjson(403,'不是你的的服务工单');
  271. }
  272. $order->server_types = $param['servertypes'];
  273. $order->buy_types = $param['buytypes'];
  274. $order->real_question = $param['question'];
  275. $order->answer = $param['answer'];
  276. $order->accessories = $param['accessories'];
  277. $order->accessories_price = $param['accessories_price'];
  278. $order->service_price = $param['service_price'];
  279. $order->discount_price = $param['discount_price'];
  280. if($price > 0){
  281. if($param['buytypes'] == '在线支付'){
  282. $order->state = 1;
  283. $remarks = '完成服务,请客户确认工单,并支付费用';
  284. }else{
  285. $order->state = 2;
  286. $remarks = '工单完成服务,请评价';
  287. }
  288. }else{
  289. $order->state = 2;;
  290. $remarks = '工单完成服务,请评价';
  291. }
  292. $order->price = $price;
  293. $order->solve_time = time();
  294. $order->save();
  295. BestbaoProcess::create(['member_miniapp_id' => $this->miniapp_id,'order_id' => $order->id,'engineer_id' => $engineer->id,'remarks' => $remarks]);
  296. return enjson(200,'确认工单成功');
  297. }
  298. }