StoreOrder.php 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2017/11/11
  6. */
  7. namespace app\admin\model\order;
  8. use app\admin\model\ump\StoreCouponUser;
  9. use app\admin\model\wechat\WechatUser;
  10. use app\admin\model\ump\StorePink;
  11. use app\admin\model\order\StoreOrderCartInfo;
  12. use app\admin\model\store\StoreProduct;
  13. use app\admin\model\routine\RoutineFormId;
  14. use app\core\model\routine\RoutineTemplate;
  15. use service\ProgramTemplateService;
  16. use service\PHPExcelService;
  17. use traits\ModelTrait;
  18. use basic\ModelBasic;
  19. use app\core\util\WechatTemplateService;
  20. use think\Url;
  21. use think\Db;
  22. use app\admin\model\user\User;
  23. use app\admin\model\user\UserBill;
  24. /**
  25. * 订单管理Model
  26. * Class StoreOrder
  27. * @package app\admin\model\store
  28. */
  29. class StoreOrder extends ModelBasic
  30. {
  31. use ModelTrait;
  32. public static function orderCount(){
  33. $data['wz']=self::statusByWhere(0,new self())->where(['is_system_del'=>0])->count();
  34. $data['wf']=self::statusByWhere(1,new self())->where(['is_system_del'=>0])->count();
  35. $data['ds']=self::statusByWhere(2,new self())->where(['is_system_del'=>0])->count();
  36. $data['dp']=self::statusByWhere(3,new self())->where(['is_system_del'=>0])->count();
  37. $data['jy']=self::statusByWhere(4,new self())->where(['is_system_del'=>0])->count();
  38. $data['tk']=self::statusByWhere(-1,new self())->where(['is_system_del'=>0])->count();
  39. $data['yt']=self::statusByWhere(-2,new self())->where(['is_system_del'=>0])->count();
  40. $data['del']=self::statusByWhere(-4,new self())->where(['is_system_del'=>0])->count();
  41. $data['general']=self::where(['pink_id'=>0,'combination_id'=>0,'seckill_id'=>0,'bargain_id'=>0,'is_system_del'=>0])->count();
  42. $data['pink']=self::where('pink_id|combination_id','>',0)->where('is_system_del',0)->count();
  43. $data['seckill']=self::where('seckill_id','>',0)->where('is_system_del',0)->count();
  44. $data['bargain']=self::where('bargain_id','>',0)->where('is_system_del',0)->count();
  45. return $data;
  46. }
  47. public static function OrderList($where){
  48. $model = self::getOrderWhere($where,self::alias('a')->join('user r','r.uid=a.uid','LEFT'),'a.','r')->field('a.*,r.nickname,r.phone');
  49. if($where['order']!=''){
  50. $model = $model->order(self::setOrder($where['order']));
  51. }else{
  52. $model = $model->order('a.id desc');
  53. }
  54. if(isset($where['excel']) && $where['excel']==1){
  55. $data=($data=$model->select()) && count($data) ? $data->toArray() : [];
  56. }else{
  57. $data=($data=$model->page((int)$where['page'],(int)$where['limit'])->select()) && count($data) ? $data->toArray() : [];
  58. }
  59. // $data=($data=$model->page((int)$where['page'],(int)$where['limit'])->select()) && count($data) ? $data->toArray() : [];
  60. foreach ($data as &$item){
  61. $_info = Db::name('store_order_cart_info')->where('oid',$item['id'])->field('cart_info')->select();
  62. foreach ($_info as $k=>$v){
  63. $_info[$k]['cart_info'] = json_decode($v['cart_info'],true);
  64. }
  65. $item['_info'] = $_info;
  66. $item['add_time'] = date('Y-m-d H:i:s',$item['add_time']);
  67. if($item['pink_id'] || $item['combination_id']){
  68. $pinkStatus = StorePink::where('order_id_key',$item['id'])->value('status');
  69. switch ($pinkStatus){
  70. case 1:
  71. $item['pink_name'] = '[拼团订单]正在进行中';
  72. $item['color'] = '#f00';
  73. break;
  74. case 2:
  75. $item['pink_name'] = '[拼团订单]已完成';
  76. $item['color'] = '#00f';
  77. break;
  78. case 3:
  79. $item['pink_name'] = '[拼团订单]未完成';
  80. $item['color'] = '#f0f';
  81. break;
  82. default:
  83. $item['pink_name'] = '[拼团订单]历史订单';
  84. $item['color'] = '#457856';
  85. break;
  86. }
  87. }elseif ($item['seckill_id']){
  88. $item['pink_name'] = '[秒杀订单]';
  89. $item['color'] = '#32c5e9';
  90. }elseif ($item['bargain_id']){
  91. $item['pink_name'] = '[砍价订单]';
  92. $item['color'] = '#12c5e9';
  93. }else{
  94. $item['pink_name'] = '[普通订单]';
  95. $item['color'] = '#895612';
  96. }
  97. if($item['paid']==1){
  98. switch ($item['pay_type']){
  99. case 'weixin':
  100. $item['pay_type_name']='微信支付';
  101. break;
  102. case 'yue':
  103. $item['pay_type_name']='余额支付';
  104. break;
  105. case 'offline':
  106. $item['pay_type_name']='线下支付';
  107. break;
  108. default:
  109. $item['pay_type_name']='其他支付';
  110. break;
  111. }
  112. }else{
  113. switch ($item['pay_type']){
  114. default:
  115. $item['pay_type_name']='未支付';
  116. break;
  117. case 'offline':
  118. $item['pay_type_name']='线下支付';
  119. $item['pay_type_info']=1;
  120. break;
  121. }
  122. }
  123. if($item['paid']==0 && $item['status']==0){
  124. $item['status_name']='未支付';
  125. }else if($item['paid']==1 && $item['status']==0 && $item['refund_status']==0){
  126. $item['status_name']='未发货';
  127. }else if($item['paid']==1 && $item['status']==1 && $item['refund_status']==0){
  128. $item['status_name']='待收货';
  129. }else if($item['paid']==1 && $item['status']==2 && $item['refund_status']==0){
  130. $item['status_name']='待评价';
  131. }else if($item['paid']==1 && $item['status']==3 && $item['refund_status']==0){
  132. $item['status_name']='已完成';
  133. }else if($item['paid']==1 && $item['refund_status']==1){
  134. $refundReasonTime = date('Y-m-d H:i', $item['refund_reason_time']);
  135. $refundReasonWapImg = json_decode($item['refund_reason_wap_img'], true);
  136. $img = '';
  137. if(count($refundReasonWapImg) && is_array($refundReasonWapImg)){
  138. foreach ($refundReasonWapImg as $itemImg){
  139. if(strlen(trim($itemImg)))
  140. $img .='<img style="height:50px;" src="'.$itemImg.'" />';
  141. }
  142. }
  143. if(!strlen(trim($img))) $img = '无';
  144. $item['status_name']=<<<HTML
  145. <b style="color:#f124c7">申请退款</b><br/>
  146. <span>退款原因:{$item['refund_reason_wap']}</span><br/>
  147. <span>备注说明:{$item['refund_reason_wap_explain']}</span><br/>
  148. <span>退款时间:{$refundReasonTime}</span><br/>
  149. <span>退款凭证:{$img}</span>
  150. HTML;
  151. }else if($item['paid']==1 && $item['refund_status']==2){
  152. $item['status_name']='已退款';
  153. }
  154. if($item['paid']==0 && $item['status']==0 && $item['refund_status']==0){
  155. $item['_status']=1;
  156. }else if($item['paid']==1 && $item['status']==0 && $item['refund_status']==0){
  157. $item['_status']=2;
  158. }else if($item['paid']==1 && $item['refund_status']==1){
  159. $item['_status']=3;
  160. }else if($item['paid']==1 && $item['status']==1 && $item['refund_status']==0){
  161. $item['_status']=4;
  162. }else if($item['paid']==1 && $item['status']==2 && $item['refund_status']==0){
  163. $item['_status']=5;
  164. }else if($item['paid']==1 && $item['status']==3 && $item['refund_status']==0){
  165. $item['_status']=6;
  166. }else if($item['paid']==1 && $item['refund_status']==2){
  167. $item['_status']=7;
  168. }
  169. }
  170. if(isset($where['excel']) && $where['excel']==1){
  171. self::SaveExcel($data);
  172. }
  173. $count=self::getOrderWhere($where,self::alias('a')->join('user r','r.uid=a.uid','LEFT'),'a.','r')->count();
  174. return compact('count','data');
  175. }
  176. /*
  177. * 保存并下载excel
  178. * $list array
  179. * return
  180. */
  181. public static function SaveExcel($list){
  182. $export = [];
  183. foreach ($list as $index=>$item){
  184. $_info = Db::name('store_order_cart_info')->where('oid',$item['id'])->column('cart_info');
  185. $goodsName = [];
  186. foreach ($_info as $k=>$v){
  187. $v = json_decode($v,true);
  188. $goodsName[] = implode(
  189. [$v['productInfo']['store_name'],
  190. isset($v['productInfo']['attrInfo']) ? '('.$v['productInfo']['attrInfo']['suk'].')' : '',
  191. "[{$v['cart_num']} * {$v['truePrice']}]"
  192. ],' ');
  193. }
  194. $item['cartInfo'] = $_info;
  195. $sex=Db::name('wechat_user')->where('uid',$item['uid'])->value('sex');
  196. if($sex==1) $sex_name='男';
  197. else if($sex==2) $sex_name='女';
  198. else $sex_name='未知';
  199. $export[] = [
  200. $item['order_id'],
  201. $sex_name,
  202. $item['phone'],
  203. $item['real_name'],
  204. $item['user_phone'],
  205. $item['user_address'],
  206. $goodsName,
  207. $item['total_price'],
  208. $item['pay_price'],
  209. $item['pay_postage'],
  210. $item['coupon_price'],
  211. $item['pay_type_name'],
  212. $item['pay_time'] > 0 ? date('Y/md H:i',$item['pay_time']) : '暂无',
  213. $item['status_name'],
  214. $item['add_time'],
  215. $item['mark']
  216. ];
  217. }
  218. PHPExcelService::setExcelHeader(['订单号','性别','电话','收货人姓名','收货人电话','收货地址','商品信息',
  219. '总价格','实际支付','邮费','优惠金额','支付状态','支付时间','订单状态','下单时间','用户备注'])
  220. ->setExcelTile('订单导出'.date('YmdHis',time()),'订单信息'.time(),' 生成时间:'.date('Y-m-d H:i:s',time()))
  221. ->setExcelContent($export)
  222. ->ExcelSave();
  223. }
  224. /**
  225. * @param $where
  226. * @return array
  227. */
  228. public static function systemPage($where,$userid=false){
  229. $model = self::getOrderWhere($where,self::alias('a')->join('user r','r.uid=a.uid','LEFT'),'a.','r')->field('a.*,r.nickname');
  230. if($where['order']){
  231. $model = $model->order('a.'.$where['order']);
  232. }else{
  233. $model = $model->order('a.id desc');
  234. }
  235. if($where['export'] == 1){
  236. $list = $model->select()->toArray();
  237. $export = [];
  238. foreach ($list as $index=>$item){
  239. if ($item['pay_type'] == 'weixin'){
  240. $payType = '微信支付';
  241. }elseif($item['pay_type'] == 'yue'){
  242. $payType = '余额支付';
  243. }elseif($item['pay_type'] == 'offline'){
  244. $payType = '线下支付';
  245. }else{
  246. $payType = '其他支付';
  247. }
  248. $_info = Db::name('store_order_cart_info')->where('oid',$item['id'])->column('cart_info');
  249. $goodsName = [];
  250. foreach ($_info as $k=>$v){
  251. $v = json_decode($v,true);
  252. $goodsName[] = implode(
  253. [$v['productInfo']['store_name'],
  254. isset($v['productInfo']['attrInfo']) ? '('.$v['productInfo']['attrInfo']['suk'].')' : '',
  255. "[{$v['cart_num']} * {$v['truePrice']}]"
  256. ],' ');
  257. }
  258. $item['cartInfo'] = $_info;
  259. $export[] = [
  260. $item['order_id'],$payType,
  261. $item['total_num'],$item['total_price'],$item['total_postage'],$item['pay_price'],$item['refund_price'],
  262. $item['mark'],$item['remark'],
  263. [$item['real_name'],$item['user_phone'],$item['user_address']],
  264. $goodsName,
  265. [$item['paid'] == 1? '已支付':'未支付','支付时间: '.($item['pay_time'] > 0 ? date('Y/md H:i',$item['pay_time']) : '暂无')]
  266. ];
  267. $list[$index] = $item;
  268. }
  269. PHPExcelService::setExcelHeader(['订单号','支付方式','商品总数','商品总价','邮费','支付金额','退款金额','用户备注','管理员备注','收货人信息','商品信息','支付状态'])
  270. ->setExcelTile('订单导出','订单信息'.time(),' 生成时间:'.date('Y-m-d H:i:s',time()))
  271. ->setExcelContent($export)
  272. ->ExcelSave();
  273. }
  274. return self::page($model,function ($item){
  275. $_info = Db::name('store_order_cart_info')->where('oid',$item['id'])->field('cart_info')->select();
  276. foreach ($_info as $k=>$v){
  277. $_info[$k]['cart_info'] = json_decode($v['cart_info'],true);
  278. }
  279. $item['_info'] = $_info;
  280. if($item['pink_id'] && $item['combination_id']){
  281. $pinkStatus = StorePink::where('order_id_key',$item['id'])->value('status');
  282. switch ($pinkStatus){
  283. case 1:
  284. $item['pink_name'] = '[拼团订单]正在进行中';
  285. $item['color'] = '#f00';
  286. break;
  287. case 2:
  288. $item['pink_name'] = '[拼团订单]已完成';
  289. $item['color'] = '#00f';
  290. break;
  291. case 3:
  292. $item['pink_name'] = '[拼团订单]未完成';
  293. $item['color'] = '#f0f';
  294. break;
  295. default:
  296. $item['pink_name'] = '[拼团订单]历史订单';
  297. $item['color'] = '#457856';
  298. break;
  299. }
  300. }else{
  301. if($item['seckill_id']){
  302. $item['pink_name'] = '[秒杀订单]';
  303. $item['color'] = '#32c5e9';
  304. }elseif ($item['bargain_id']){
  305. $item['pink_name'] = '[砍价订单]';
  306. $item['color'] = '#12c5e9';
  307. }else{
  308. $item['pink_name'] = '[普通订单]';
  309. $item['color'] = '#895612';
  310. }
  311. }
  312. },$where);
  313. }
  314. public static function statusByWhere($status,$model = null,$alert='')
  315. {
  316. if($model == null) $model = new self;
  317. if('' === $status)
  318. return $model;
  319. else if($status == 0)//未支付
  320. return $model->where($alert.'paid',0)->where($alert.'status',0)->where($alert.'refund_status',0);
  321. else if($status == 1)//已支付 未发货
  322. return $model->where($alert.'paid',1)->where($alert.'status',0)->where($alert.'refund_status',0);
  323. else if($status == 2)//已支付 待收货
  324. return $model->where($alert.'paid',1)->where($alert.'status',1)->where($alert.'refund_status',0);
  325. else if($status == 3)// 已支付 已收货 待评价
  326. return $model->where($alert.'paid',1)->where($alert.'status',2)->where($alert.'refund_status',0);
  327. else if($status == 4)// 交易完成
  328. return $model->where($alert.'paid',1)->where($alert.'status',3)->where($alert.'refund_status',0);
  329. else if($status == -1)//退款中
  330. return $model->where($alert.'paid',1)->where($alert.'refund_status',1);
  331. else if($status == -2)//已退款
  332. return $model->where($alert.'paid',1)->where($alert.'refund_status',2);
  333. else if($status == -3)//退款
  334. return $model->where($alert.'paid',1)->where($alert.'refund_status','in','1,2');
  335. else if($status == -4)//已删除
  336. return $model->where($alert.'is_del',1);
  337. else
  338. return $model;
  339. }
  340. public static function timeQuantumWhere($startTime = null,$endTime = null,$model = null)
  341. {
  342. if($model === null) $model = new self;
  343. if($startTime != null && $endTime != null)
  344. $model = $model->where('add_time','>',strtotime($startTime))->where('add_time','<',strtotime($endTime));
  345. return $model;
  346. }
  347. public static function changeOrderId($orderId)
  348. {
  349. $ymd = substr($orderId,2,8);
  350. $key = substr($orderId,16);
  351. return 'wx'.$ymd.date('His').$key;
  352. }
  353. /**
  354. * 线下付款
  355. * @param $id
  356. * @return $this
  357. */
  358. public static function updateOffline($id){
  359. $orderId = self::where('id',$id)->value('order_id');
  360. $res = self::where('order_id',$orderId)->update(['paid'=>1,'pay_time'=>time()]);
  361. return $res;
  362. }
  363. /**
  364. * TODO 公众号退款发送模板消息
  365. * @param $oid
  366. * $oid 订单id key
  367. */
  368. public static function refundTemplate($data,$oid)
  369. {
  370. $order = self::where('id',$oid)->find();
  371. WechatTemplateService::sendTemplate(WechatUser::where('uid',$order['uid'])->value('openid'),WechatTemplateService::ORDER_REFUND_STATUS, [
  372. 'first'=>'亲,您购买的商品已退款,本次退款'.$data['refund_price'].'金额',
  373. 'keyword1'=>$order['order_id'],
  374. 'keyword2'=>$order['pay_price'],
  375. 'keyword3'=>date('Y-m-d H:i:s',$order['add_time']),
  376. 'remark'=>'点击查看订单详情'
  377. ],Url::build('wap/My/order',['uni'=>$order['order_id']],true,true));
  378. }
  379. /**
  380. * TODO 小程序余额退款模板消息
  381. * @param $oid
  382. * @return bool|mixed
  383. * @throws \think\db\exception\DataNotFoundException
  384. * @throws \think\db\exception\ModelNotFoundException
  385. * @throws \think\exception\DbException
  386. */
  387. public static function refundRoutineTemplate($oid){
  388. $order = self::where('id',$oid)->find();
  389. $data['keyword1'] = $order['order_id'];
  390. $data['keyword2'] = date('Y-m-d H:i:s',time());
  391. $data['keyword3'] = $order['pay_price'];
  392. if($order['pay_type'] == 'yue') $data['keyword4'] = '余额支付';
  393. else if($order['pay_type'] == 'weixin') $data['keyword4'] = '微信支付';
  394. else if($order['pay_type'] == 'offline') $data['keyword4'] = '线下支付';
  395. $data['keyword5'] = '已成功退款';
  396. return RoutineTemplate::sendOut('ORDER_REFUND_SUCCESS',$order['uid'],$data);
  397. }
  398. /**
  399. * 处理where条件
  400. * @param $where
  401. * @param $model
  402. * @return mixed
  403. */
  404. public static function getOrderWhere($where,$model,$aler='',$join=''){
  405. // $model = $model->where('combination_id',0);
  406. $model = $model->where('is_system_del',0);
  407. if($where['status'] != '') {
  408. $model = self::statusByWhere($where['status'],$model,$aler);
  409. }else{
  410. $model = $model->where('paid',1);
  411. }
  412. if($where['is_del'] != '' && $where['is_del'] != -1) $model = $model->where($aler.'is_del',$where['is_del']);
  413. if(isset($where['combination_id'])){
  414. if($where['combination_id'] =='普通订单'){
  415. $model = $model->where($aler.'combination_id',0)->where($aler.'seckill_id',0)->where($aler.'bargain_id',0);
  416. }
  417. if($where['combination_id'] =='拼团订单'){
  418. $model = $model->where($aler.'combination_id',">",0)->where($aler.'pink_id',">",0);
  419. }
  420. if($where['combination_id'] =='秒杀订单'){
  421. $model = $model->where($aler.'seckill_id',">",0);
  422. }
  423. if($where['combination_id'] =='砍价订单'){
  424. $model = $model->where($aler.'bargain_id',">",0);
  425. }
  426. }
  427. if(isset($where['type'])){
  428. switch ($where['type']){
  429. case 1:
  430. $model = $model->where($aler.'combination_id',0)->where($aler.'seckill_id',0)->where($aler.'bargain_id',0);
  431. break;
  432. case 2:
  433. // $model = $model->where($aler.'combination_id',">",0)->where($aler.'pink_id',">",0);
  434. $model = $model->where($aler.'combination_id',">",0);
  435. break;
  436. case 3:
  437. $model = $model->where($aler.'seckill_id',">",0);
  438. break;
  439. case 4:
  440. $model = $model->where($aler.'bargain_id',">",0);
  441. break;
  442. }
  443. }
  444. if($where['real_name'] != ''){
  445. $model = $model->where($aler.'order_id|'.$aler.'real_name|'.$aler.'user_phone'.($join ? '|'.$join.'.nickname|'.$join.'.uid|'.$join.'.phone':''),'LIKE',"%$where[real_name]%");
  446. }
  447. if($where['data'] !== ''){
  448. $model = self::getModelTime($where,$model,$aler.'add_time');
  449. }
  450. return $model;
  451. }
  452. public static function getBadge($where){
  453. $price=self::getOrderPrice($where);
  454. return [
  455. [
  456. 'name'=>'订单数量',
  457. 'field'=>'件',
  458. 'count'=>$price['count_sum'],
  459. 'background_color'=>'layui-bg-blue',
  460. 'col'=>2
  461. ],
  462. [
  463. 'name'=>'售出商品',
  464. 'field'=>'件',
  465. 'count'=>$price['total_num'],
  466. 'background_color'=>'layui-bg-blue',
  467. 'col'=>2
  468. ],
  469. [
  470. 'name'=>'订单金额',
  471. 'field'=>'元',
  472. 'count'=>$price['pay_price'],
  473. 'background_color'=>'layui-bg-blue',
  474. 'col'=>2
  475. ],
  476. [
  477. 'name'=>'退款金额',
  478. 'field'=>'元',
  479. 'count'=>$price['refund_price'],
  480. 'background_color'=>'layui-bg-blue',
  481. 'col'=>2
  482. ],
  483. [
  484. 'name'=>'微信支付金额',
  485. 'field'=>'元',
  486. 'count'=>$price['pay_price_wx'],
  487. 'background_color'=>'layui-bg-blue',
  488. 'col'=>2
  489. ],
  490. [
  491. 'name'=>'余额支付金额',
  492. 'field'=>'元',
  493. 'count'=>$price['pay_price_yue'],
  494. 'background_color'=>'layui-bg-blue',
  495. 'col'=>2
  496. ],
  497. [
  498. 'name'=>'运费金额',
  499. 'field'=>'元',
  500. 'count'=>$price['pay_postage'],
  501. 'background_color'=>'layui-bg-blue',
  502. 'col'=>2
  503. ],
  504. [
  505. 'name'=>'分佣金额',
  506. 'field'=>'元',
  507. 'count'=>$price['brokerage'],
  508. 'background_color'=>'layui-bg-blue',
  509. 'col'=>2
  510. ],
  511. [
  512. 'name'=>'线下支付金额',
  513. 'field'=>'元',
  514. 'count'=>$price['pay_price_offline'],
  515. 'background_color'=>'layui-bg-blue',
  516. 'col'=>2
  517. ],
  518. [
  519. 'name'=>'积分抵扣',
  520. 'field'=>'分',
  521. 'count'=>$price['use_integral'].'(抵扣金额:¥'.$price['deduction_price'].')',
  522. 'background_color'=>'layui-bg-blue',
  523. 'col'=>2
  524. ],
  525. [
  526. 'name'=>'退回积分',
  527. 'field'=>'元',
  528. 'count'=>$price['back_integral'],
  529. 'background_color'=>'layui-bg-blue',
  530. 'col'=>2
  531. ]
  532. ];
  533. }
  534. /**
  535. * 处理订单金额
  536. * @param $where
  537. * @return array
  538. */
  539. public static function getOrderPrice($where){
  540. $where['is_del'] = 0;//删除订单不统计
  541. $model = new self;
  542. $price = array();
  543. $price['pay_price'] = 0;//支付金额
  544. $price['refund_price'] = 0;//退款金额
  545. $price['pay_price_wx'] = 0;//微信支付金额
  546. $price['pay_price_yue'] = 0;//余额支付金额
  547. $price['pay_price_offline'] = 0;//线下支付金额
  548. $price['pay_price_other'] = 0;//其他支付金额
  549. $price['use_integral'] = 0;//用户使用积分
  550. $price['back_integral'] = 0;//退积分总数
  551. $price['deduction_price'] = 0;//抵扣金额
  552. $price['total_num'] = 0; //商品总数
  553. $price['count_sum'] = 0; //商品总数
  554. $price['brokerage'] =0;
  555. $price['pay_postage'] =0;
  556. $whereData=['is_del'=>0];
  557. if($where['status']==''){
  558. $whereData['paid']=1;
  559. $whereData['refund_status']=0;
  560. }
  561. $ids= self::getOrderWhere($where,$model)->where($whereData)->column('id');
  562. if(count($ids)){
  563. $price['brokerage'] = UserBill::where(['category'=>'now_money','type'=>'brokerage'])->where('link_id','in',$ids)->sum('number');
  564. }
  565. $price['refund_price'] = self::getOrderWhere($where,$model)->where(['is_del'=>0,'paid'=>1,'refund_status'=>2])->sum('refund_price');
  566. $sumNumber =self::getOrderWhere($where,$model)->where($whereData)->field([
  567. 'sum(total_num) as sum_total_num',
  568. 'count(id) as count_sum',
  569. 'sum(pay_price) as sum_pay_price',
  570. 'sum(pay_postage) as sum_pay_postage',
  571. 'sum(use_integral) as sum_use_integral',
  572. 'sum(back_integral) as sum_back_integral',
  573. 'sum(deduction_price) as sum_deduction_price'
  574. ])->find();
  575. if($sumNumber) {
  576. $price['count_sum'] = $sumNumber['count_sum'];
  577. $price['total_num'] = $sumNumber['sum_total_num'];
  578. $price['pay_price'] = $sumNumber['sum_pay_price'];
  579. $price['pay_postage'] = $sumNumber['sum_pay_postage'];
  580. $price['use_integral'] = $sumNumber['sum_use_integral'];
  581. $price['back_integral'] = $sumNumber['sum_back_integral'];
  582. $price['deduction_price'] = $sumNumber['sum_deduction_price'];
  583. }
  584. $list = self::getOrderWhere($where,$model)->where($whereData)->group('pay_type')->column('sum(pay_price) as sum_pay_price,pay_type','id');
  585. foreach ($list as $v){
  586. if ($v['pay_type'] == 'weixin'){
  587. $price['pay_price_wx'] = $v['sum_pay_price'];
  588. }elseif($v['pay_type'] == 'yue'){
  589. $price['pay_price_yue'] = $v['sum_pay_price'];
  590. }elseif($v['pay_type'] == 'offline'){
  591. $price['pay_price_offline'] = $v['sum_pay_price'];
  592. }else{
  593. $price['pay_price_other'] = $v['sum_pay_price'];
  594. }
  595. }
  596. return $price;
  597. }
  598. public static function systemPagePink($where){
  599. $model = new self;
  600. $model = self::getOrderWherePink($where,$model);
  601. $model = $model->order('id desc');
  602. if($where['export'] == 1){
  603. $list = $model->select()->toArray();
  604. $export = [];
  605. foreach ($list as $index=>$item){
  606. if ($item['pay_type'] == 'weixin'){
  607. $payType = '微信支付';
  608. }elseif($item['pay_type'] == 'yue'){
  609. $payType = '余额支付';
  610. }elseif($item['pay_type'] == 'offline'){
  611. $payType = '线下支付';
  612. }else{
  613. $payType = '其他支付';
  614. }
  615. $_info = Db::name('store_order_cart_info')->where('oid',$item['id'])->column('cart_info');
  616. $goodsName = [];
  617. foreach ($_info as $k=>$v){
  618. $v = json_decode($v,true);
  619. $goodsName[] = implode(
  620. [$v['productInfo']['store_name'],
  621. isset($v['productInfo']['attrInfo']) ? '('.$v['productInfo']['attrInfo']['suk'].')' : '',
  622. "[{$v['cart_num']} * {$v['truePrice']}]"
  623. ],' ');
  624. }
  625. $item['cartInfo'] = $_info;
  626. $export[] = [
  627. $item['order_id'],$payType,
  628. $item['total_num'],$item['total_price'],$item['total_postage'],$item['pay_price'],$item['refund_price'],
  629. $item['mark'],$item['remark'],
  630. [$item['real_name'],$item['user_phone'],$item['user_address']],
  631. $goodsName,
  632. [$item['paid'] == 1? '已支付':'未支付','支付时间: '.($item['pay_time'] > 0 ? date('Y/md H:i',$item['pay_time']) : '暂无')]
  633. ];
  634. $list[$index] = $item;
  635. }
  636. ExportService::exportCsv($export,'订单导出'.time(),['订单号','支付方式','商品总数','商品总价','邮费','支付金额','退款金额','用户备注','管理员备注','收货人信息','商品信息','支付状态']);
  637. }
  638. return self::page($model,function ($item){
  639. $item['nickname'] = WechatUser::where('uid',$item['uid'])->value('nickname');
  640. $_info = Db::name('store_order_cart_info')->where('oid',$item['id'])->field('cart_info')->select();
  641. foreach ($_info as $k=>$v){
  642. $_info[$k]['cart_info'] = json_decode($v['cart_info'],true);
  643. }
  644. $item['_info'] = $_info;
  645. },$where);
  646. }
  647. /**
  648. * 处理where条件
  649. * @param $where
  650. * @param $model
  651. * @return mixed
  652. */
  653. public static function getOrderWherePink($where,$model){
  654. $model = $model->where('combination_id','GT',0);
  655. if($where['status'] != '') $model = $model::statusByWhere($where['status']);
  656. // if($where['is_del'] != '' && $where['is_del'] != -1) $model = $model->where('is_del',$where['is_del']);
  657. if($where['real_name'] != ''){
  658. $model = $model->where('order_id|real_name|user_phone','LIKE',"%$where[real_name]%");
  659. }
  660. if($where['data'] !== ''){
  661. list($startTime,$endTime) = explode(' - ',$where['data']);
  662. $model = $model->where('add_time','>',strtotime($startTime));
  663. $model = $model->where('add_time','<',strtotime($endTime));
  664. }
  665. return $model;
  666. }
  667. /**
  668. * 处理订单金额
  669. * @param $where
  670. * @return array
  671. */
  672. public static function getOrderPricePink($where){
  673. $model = new self;
  674. $price = array();
  675. $price['pay_price'] = 0;//支付金额
  676. $price['refund_price'] = 0;//退款金额
  677. $price['pay_price_wx'] = 0;//微信支付金额
  678. $price['pay_price_yue'] = 0;//余额支付金额
  679. $price['pay_price_offline'] = 0;//线下支付金额
  680. $price['pay_price_other'] = 0;//其他支付金额
  681. $price['use_integral'] = 0;//用户使用积分
  682. $price['back_integral'] = 0;//退积分总数
  683. $price['deduction_price'] = 0;//抵扣金额
  684. $price['total_num'] = 0; //商品总数
  685. $model = self::getOrderWherePink($where,$model);
  686. $list = $model->select()->toArray();
  687. foreach ($list as $v){
  688. $price['total_num'] = bcadd($price['total_num'],$v['total_num'],0);
  689. $price['pay_price'] = bcadd($price['pay_price'],$v['pay_price'],2);
  690. $price['refund_price'] = bcadd($price['refund_price'],$v['refund_price'],2);
  691. $price['use_integral'] = bcadd($price['use_integral'],$v['use_integral'],2);
  692. $price['back_integral'] = bcadd($price['back_integral'],$v['back_integral'],2);
  693. $price['deduction_price'] = bcadd($price['deduction_price'],$v['deduction_price'],2);
  694. if ($v['pay_type'] == 'weixin'){
  695. $price['pay_price_wx'] = bcadd($price['pay_price_wx'],$v['pay_price'],2);
  696. }elseif($v['pay_type'] == 'yue'){
  697. $price['pay_price_yue'] = bcadd($price['pay_price_yue'],$v['pay_price'],2);
  698. }elseif($v['pay_type'] == 'offline'){
  699. $price['pay_price_offline'] = bcadd($price['pay_price_offline'],$v['pay_price'],2);
  700. }else{
  701. $price['pay_price_other'] = bcadd($price['pay_price_other'],$v['pay_price'],2);
  702. }
  703. }
  704. return $price;
  705. }
  706. /**
  707. * 获取昨天的订单 首页在使用
  708. * @param int $preDay
  709. * @param int $day
  710. * @return $this|StoreOrder
  711. */
  712. public static function isMainYesterdayCount($preDay = 0,$day = 0){
  713. $model = new self();
  714. $model = $model->where('add_time','gt',$preDay);
  715. $model = $model->where('add_time','lt',$day);
  716. return $model;
  717. }
  718. /**
  719. * 获取用户购买次数
  720. * @param int $uid
  721. * @return int|string
  722. */
  723. public static function getUserCountPay($uid = 0){
  724. if(!$uid) return 0;
  725. return self::where('uid',$uid)->where('paid',1)->count();
  726. }
  727. /**
  728. * 获取单个用户购买列表
  729. * @param array $where
  730. * @return array
  731. */
  732. public static function getOneorderList($where){
  733. return self::where(['uid'=>$where['uid']])
  734. ->order('add_time desc')
  735. ->page((int)$where['page'],(int)$where['limit'])
  736. ->field(['order_id','real_name','total_num','total_price','pay_price',
  737. 'FROM_UNIXTIME(pay_time,"%Y-%m-%d") as pay_time','paid','pay_type',
  738. 'pink_id','seckill_id','bargain_id'
  739. ])->select()
  740. ->toArray();
  741. }
  742. /*
  743. * 设置订单统计图搜索
  744. * $where array 条件
  745. * return object
  746. */
  747. public static function setEchatWhere($where,$status=null,$time=null){
  748. $model=self::statusByWhere($where['status']);
  749. if($status!==null) $where['type']=$status;
  750. if($time===true) $where['data']='';
  751. switch ($where['type']){
  752. case 1:
  753. //普通商品
  754. $model=$model->where('combination_id',0)->where('seckill_id',0)->where('bargain_id',0);
  755. break;
  756. case 2:
  757. //拼团商品
  758. $model=$model->where('combination_id',">",0)->where('pink_id',">",0);
  759. break;
  760. case 3:
  761. //秒杀商品
  762. $model=$model->where('seckill_id',">",0);
  763. break;
  764. case 4:
  765. //砍价商品
  766. $model=$model->where('bargain_id','>',0);
  767. break;
  768. }
  769. return self::getModelTime($where,$model);
  770. }
  771. /*
  772. * 获取订单数据统计图
  773. * $where array
  774. * $limit int
  775. * return array
  776. */
  777. public static function getEchartsOrder($where,$limit=20){
  778. $orderlist=self::setEchatWhere($where)->field([
  779. 'FROM_UNIXTIME(add_time,"%Y-%m-%d") as _add_time',
  780. 'sum(total_num) total_num',
  781. 'count(*) count',
  782. 'sum(total_price) total_price',
  783. 'sum(refund_price) refund_price',
  784. 'group_concat(cart_id SEPARATOR "|") cart_ids'
  785. ])->group('_add_time')->order('_add_time asc')->select();
  786. count($orderlist) && $orderlist=$orderlist->toArray();
  787. $legend=['商品数量','订单数量','订单金额','退款金额'];
  788. $seriesdata=[
  789. [
  790. 'name'=>$legend[0],
  791. 'type'=>'line',
  792. 'data'=>[],
  793. ],
  794. [
  795. 'name'=>$legend[1],
  796. 'type'=>'line',
  797. 'data'=>[]
  798. ],
  799. [
  800. 'name'=>$legend[2],
  801. 'type'=>'line',
  802. 'data'=>[]
  803. ],
  804. [
  805. 'name'=>$legend[3],
  806. 'type'=>'line',
  807. 'data'=>[]
  808. ]
  809. ];
  810. $xdata=[];
  811. $zoom='';
  812. foreach ($orderlist as $item){
  813. $xdata[]=$item['_add_time'];
  814. $seriesdata[0]['data'][]=$item['total_num'];
  815. $seriesdata[1]['data'][]=$item['count'];
  816. $seriesdata[2]['data'][]=$item['total_price'];
  817. $seriesdata[3]['data'][]=$item['refund_price'];
  818. }
  819. count($xdata) > $limit && $zoom=$xdata[$limit-5];
  820. $badge=self::getOrderBadge($where);
  821. $bingpaytype=self::setEchatWhere($where)->group('pay_type')->field(['count(*) as count','pay_type'])->select();
  822. count($bingpaytype) && $bingpaytype=$bingpaytype->toArray();
  823. $bing_xdata=['微信支付','余额支付','其他支付'];
  824. $color=['#ffcccc','#99cc00','#fd99cc','#669966'];
  825. $bing_data=[];
  826. foreach ($bingpaytype as $key=>$item){
  827. if($item['pay_type']=='weixin'){
  828. $value['name']=$bing_xdata[0];
  829. }else if($item['pay_type']=='yue'){
  830. $value['name']=$bing_xdata[1];
  831. }else{
  832. $value['name']=$bing_xdata[2];
  833. }
  834. $value['value']=$item['count'];
  835. $value['itemStyle']['color']=isset($color[$key]) ? $color[$key]:$color[0];
  836. $bing_data[]=$value;
  837. }
  838. return compact('zoom','xdata','seriesdata','badge','legend','bing_data','bing_xdata');
  839. }
  840. public static function getOrderBadge($where){
  841. return [
  842. [
  843. 'name'=>'拼团订单数量',
  844. 'field'=>'个',
  845. 'count'=>self::setEchatWhere($where,2)->count(),
  846. 'content'=>'拼团总订单数量',
  847. 'background_color'=>'layui-bg-cyan',
  848. 'sum'=>self::setEchatWhere($where,2,true)->count(),
  849. 'class'=>'fa fa-line-chart',
  850. 'col'=>2
  851. ],
  852. [
  853. 'name'=>'砍价订单数量',
  854. 'field'=>'个',
  855. 'count'=>self::setEchatWhere($where,4)->count(),
  856. 'content'=>'砍价总订单数量',
  857. 'background_color'=>'layui-bg-cyan',
  858. 'sum'=>self::setEchatWhere($where,4,true)->count(),
  859. 'class'=>'fa fa-line-chart',
  860. 'col'=>2
  861. ],
  862. [
  863. 'name'=>'秒杀订单数量',
  864. 'field'=>'个',
  865. 'count'=>self::setEchatWhere($where,3)->count(),
  866. 'content'=>'秒杀总订单数量',
  867. 'background_color'=>'layui-bg-cyan',
  868. 'sum'=>self::setEchatWhere($where,3,true)->count(),
  869. 'class'=>'fa fa-line-chart',
  870. 'col'=>2
  871. ],
  872. [
  873. 'name'=>'普通订单数量',
  874. 'field'=>'个',
  875. 'count'=>self::setEchatWhere($where,1)->count(),
  876. 'content'=>'普通总订单数量',
  877. 'background_color'=>'layui-bg-cyan',
  878. 'sum'=>self::setEchatWhere($where,1,true)->count(),
  879. 'class'=>'fa fa-line-chart',
  880. 'col'=>2,
  881. ],
  882. [
  883. 'name'=>'使用优惠卷金额',
  884. 'field'=>'元',
  885. 'count'=>self::setEchatWhere($where)->sum('coupon_price'),
  886. 'content'=>'普通总订单数量',
  887. 'background_color'=>'layui-bg-cyan',
  888. 'sum'=>self::setEchatWhere($where,null,true)->sum('coupon_price'),
  889. 'class'=>'fa fa-line-chart',
  890. 'col'=>2
  891. ],
  892. [
  893. 'name'=>'积分消耗数',
  894. 'field'=>'个',
  895. 'count'=>self::setEchatWhere($where)->sum('use_integral'),
  896. 'content'=>'积分消耗总数',
  897. 'background_color'=>'layui-bg-cyan',
  898. 'sum'=>self::setEchatWhere($where,null,true)->sum('use_integral'),
  899. 'class'=>'fa fa-line-chart',
  900. 'col'=>2
  901. ],
  902. [
  903. 'name'=>'积分抵扣金额',
  904. 'field'=>'个',
  905. 'count'=>self::setEchatWhere($where)->sum('deduction_price'),
  906. 'content'=>'积分抵扣总金额',
  907. 'background_color'=>'layui-bg-cyan',
  908. 'sum'=>self::setEchatWhere($where,null,true)->sum('deduction_price'),
  909. 'class'=>'fa fa-money',
  910. 'col'=>2
  911. ],
  912. [
  913. 'name'=>'在线支付金额',
  914. 'field'=>'元',
  915. 'count'=>self::setEchatWhere($where)->where('pay_type','weixin')->sum('pay_price'),
  916. 'content'=>'在线支付总金额',
  917. 'background_color'=>'layui-bg-cyan',
  918. 'sum'=>self::setEchatWhere($where,null,true)->where('pay_type','weixin')->sum('pay_price'),
  919. 'class'=>'fa fa-weixin',
  920. 'col'=>2
  921. ],
  922. [
  923. 'name'=>'余额支付金额',
  924. 'field'=>'元',
  925. 'count'=>self::setEchatWhere($where)->where('pay_type','yue')->sum('pay_price'),
  926. 'content'=>'余额支付总金额',
  927. 'background_color'=>'layui-bg-cyan',
  928. 'sum'=>self::setEchatWhere($where,null,true)->where('pay_type','yue')->sum('pay_price'),
  929. 'class'=>'fa fa-balance-scale',
  930. 'col'=>2
  931. ],
  932. [
  933. 'name'=>'赚取积分',
  934. 'field'=>'分',
  935. 'count'=>self::setEchatWhere($where)->sum('gain_integral'),
  936. 'content'=>'赚取总积分',
  937. 'background_color'=>'layui-bg-cyan',
  938. 'sum'=>self::setEchatWhere($where,null,true)->sum('gain_integral'),
  939. 'class'=>'fa fa-gg-circle',
  940. 'col'=>2
  941. ],
  942. [
  943. 'name'=>'交易额',
  944. 'field'=>'元',
  945. 'count'=>self::setEchatWhere($where)->sum('pay_price'),
  946. 'content'=>'总交易额',
  947. 'background_color'=>'layui-bg-cyan',
  948. 'sum'=>self::setEchatWhere($where,null,true)->sum('pay_price'),
  949. 'class'=>'fa fa-jpy',
  950. 'col'=>2
  951. ],
  952. [
  953. 'name'=>'订单商品数量',
  954. 'field'=>'元',
  955. 'count'=>self::setEchatWhere($where)->sum('total_num'),
  956. 'content'=>'订单商品总数量',
  957. 'background_color'=>'layui-bg-cyan',
  958. 'sum'=>self::setEchatWhere($where,null,true)->sum('total_num'),
  959. 'class'=>'fa fa-cube',
  960. 'col'=>2
  961. ]
  962. ];
  963. }
  964. /**微信 订单发货
  965. * @param $oid
  966. * @param array $postageData
  967. */
  968. public static function orderPostageAfter($oid,$postageData = [])
  969. {
  970. $order = self::where('id',$oid)->find();
  971. $url = Url::build('wap/My/order',['uni'=>$order['order_id']],true,true);
  972. $group = [
  973. 'first'=>'亲,您的订单已发货,请注意查收',
  974. 'remark'=>'点击查看订单详情'
  975. ];
  976. if($postageData['delivery_type'] == 'send'){//送货
  977. $goodsName = StoreOrderCartInfo::getProductNameList($order['id']);
  978. if($order['is_channel']){
  979. //小程序送货模版消息
  980. RoutineTemplate::sendOrderPostage($order);
  981. }else{//公众号
  982. $openid = WechatUser::where('uid',$order['uid'])->value('openid');
  983. $group = array_merge($group,[
  984. 'keyword1'=>$goodsName,
  985. 'keyword2'=>$order['pay_type'] == 'offline' ? '线下支付' : date('Y/m/d H:i',$order['pay_time']),
  986. 'keyword3'=>$order['user_address'],
  987. 'keyword4'=>$postageData['delivery_name'],
  988. 'keyword5'=>$postageData['delivery_id']
  989. ]);
  990. WechatTemplateService::sendTemplate($openid,WechatTemplateService::ORDER_DELIVER_SUCCESS,$group,$url);
  991. }
  992. }else if($postageData['delivery_type'] == 'express') {//发货
  993. if ($order['is_channel']) {
  994. //小程序发货模版消息
  995. RoutineTemplate::sendOrderPostage($order,1);
  996. } else {//公众号
  997. $openid = WechatUser::where('uid',$order['uid'])->value('openid');
  998. $group = array_merge($group, [
  999. 'keyword1' => $order['order_id'],
  1000. 'keyword2' => $postageData['delivery_name'],
  1001. 'keyword3' => $postageData['delivery_id']
  1002. ]);
  1003. WechatTemplateService::sendTemplate($openid, WechatTemplateService::ORDER_POSTAGE_SUCCESS, $group, $url);
  1004. }
  1005. }else if($postageData['delivery_type'] == 'fictitious'){
  1006. if ($order['is_channel']) {
  1007. }else{
  1008. }
  1009. }
  1010. }
  1011. /**
  1012. * 小程序 订单发货提醒
  1013. * @param int $oid
  1014. * @param array $postageData
  1015. * @return bool
  1016. */
  1017. public static function sendOrderGoods($oid = 0,$postageData=array()){
  1018. if(!$oid || !$postageData) return true;
  1019. $order = self::where('id',$oid)->find();
  1020. $routine_openid = WechatUser::uidToRoutineOpenid($order['uid']);
  1021. if(!$routine_openid) return true;
  1022. if($postageData['delivery_type'] == 'send'){//送货
  1023. RoutineTemplate::sendOrderPostage($order);
  1024. }else if($postageData['delivery_type'] == 'express'){//发货
  1025. RoutineTemplate::sendOrderPostage($order,1);
  1026. }
  1027. }
  1028. /** 收货后发送模版消息
  1029. * @param $order
  1030. */
  1031. public static function orderTakeAfter($order)
  1032. {
  1033. $title = '';
  1034. $cartInfo = self::getDb('StoreOrderCartInfo')->where('oid', $order['id'])->column('cart_info');
  1035. if(count($cartInfo)){
  1036. foreach ($cartInfo as $key=>&$cart){
  1037. $cart = json_decode($cart,true);
  1038. $title .= $cart['productInfo']['store_name'].',';
  1039. }
  1040. }
  1041. if(strlen(trim($title)))
  1042. $title = substr($title,0,bcsub(strlen($title),1,0));
  1043. else{
  1044. $cartInfo = self::getDb('store_cart')->alias('a')->where('a.id','in',implode(',',json_decode($order['cart_id'],true)))->find();
  1045. $title = StoreProduct::where('id',$cartInfo['product_id'])->value('store_name');
  1046. }
  1047. if($order['is_channel']){//小程序
  1048. RoutineTemplate::sendOut('OREDER_TAKEVER',$order['uid'],[
  1049. 'keyword1'=>$order['order_id'],
  1050. 'keyword2'=>$title,
  1051. 'keyword3'=>$order['pay_price'],
  1052. 'keyword4'=>date('Y-m-d H:i:s',time()),
  1053. ]);
  1054. }else{
  1055. $openid = WechatUser::where('uid',$order['uid'])->value('openid');
  1056. WechatTemplateService::sendTemplate($openid,WechatTemplateService::ORDER_TAKE_SUCCESS,[
  1057. 'first'=>'亲,您的订单已收货',
  1058. 'keyword1'=>$order['order_id'],
  1059. 'keyword2'=>'已收货',
  1060. 'keyword3'=>date('Y-m-d H:i:s',time()),
  1061. 'keyword4'=>$title,
  1062. 'remark'=>'感谢您的光临!'
  1063. ]);
  1064. }
  1065. }
  1066. /*
  1067. * 不退款发送模板消息
  1068. * @param int $id 订单id
  1069. * @param array $data 退款详情
  1070. * */
  1071. public static function refundNoPrieTemplate($id,$data)
  1072. {
  1073. $order=self::get($id);
  1074. if($order) return false;
  1075. //小程序模板消息
  1076. $cartInfo = self::getDb('StoreOrderCartInfo')->where('oid', $order['id'])->column('product_id') ?: [];
  1077. $title='';
  1078. foreach ($cartInfo as $k => $productId) {
  1079. $store_name=self::getDb('store_product')->where('id',$productId)->value('store_name');
  1080. $title.=$store_name.',';
  1081. }
  1082. if($order->is_channel){
  1083. RoutineTemplate::sendOut('ORDER_REFUND_FILE',$order->uid,[
  1084. 'keyword1'=>$order->order_id,
  1085. 'keyword2'=>$title,
  1086. 'keyword3'=>$order->pay_price,
  1087. 'keyword4'=>$data,
  1088. ]);
  1089. }else{
  1090. WechatTemplateService::sendTemplate(WechatUser::where(['uid'=>$order->uid])->value('openid'),WechatTemplateService::ORDER_REFUND_STATUS,[
  1091. 'first'=>'很抱歉您的订单退款失败,失败原因:'.$data,
  1092. 'keyword1'=>$order->order_id,
  1093. 'keyword2'=>$order->pay_price,
  1094. 'keyword3'=>date('Y-m-d H:i:s',time()),
  1095. 'remark'=>'给您带来的不便,请谅解!'
  1096. ]);
  1097. }
  1098. }
  1099. /**
  1100. * 获取订单总数
  1101. * @param int $uid
  1102. * @return int|string
  1103. */
  1104. public static function getOrderCount($uid = 0){
  1105. if(!$uid) return 0;
  1106. return self::where('uid',$uid)->where('paid',1)->where('refund_status',0)->where('status',2)->count();
  1107. }
  1108. /**
  1109. * 获取已支付的订单
  1110. * @param int $is_promoter
  1111. * @return int|string
  1112. */
  1113. public static function getOrderPayCount($is_promoter = 0){
  1114. return self::where('o.paid',1)->alias('o')->join('User u','u.uid=o.uid')->where('u.is_promoter',$is_promoter)->count();
  1115. }
  1116. /**
  1117. * 获取最后一个月已支付的订单
  1118. * @param int $is_promoter
  1119. * @return int|string
  1120. */
  1121. public static function getOrderPayMonthCount($is_promoter = 0){
  1122. return self::where('o.paid',1)->alias('o')->whereTime('o.pay_time','last month')->join('User u','u.uid=o.uid')->where('u.is_promoter',$is_promoter)->count();
  1123. }
  1124. /** 订单收货处理积分
  1125. * @param $order
  1126. * @return bool
  1127. */
  1128. public static function gainUserIntegral($order)
  1129. {
  1130. if($order['gain_integral'] > 0){
  1131. $userInfo = User::get($order['uid']);
  1132. ModelBasic::beginTrans();
  1133. $res1 = false != User::where('uid',$userInfo['uid'])->update(['integral'=>bcadd($userInfo['integral'],$order['gain_integral'],2)]);
  1134. $res2 = false != UserBill::income('购买商品赠送积分',$order['uid'],'integral','gain',$order['gain_integral'],$order['id'],bcadd($userInfo['integral'],$order['gain_integral'],2),'购买商品赠送'.floatval($order['gain_integral']).'积分');
  1135. $res = $res1 && $res2;
  1136. ModelBasic::checkTrans($res);
  1137. return $res;
  1138. }
  1139. return true;
  1140. }
  1141. public static function integralBack($id){
  1142. $order = self::get($id)->toArray();
  1143. if(!(float)bcsub($order['use_integral'],0,2) && !$order['back_integral']) return true;
  1144. if($order['back_integral'] && !(int)$order['use_integral']) return true;
  1145. ModelBasic::beginTrans();
  1146. $data['back_integral'] = bcsub($order['use_integral'],$order['use_integral'],0);
  1147. if(!$data['back_integral']) return true;
  1148. $data['use_integral'] = 0;
  1149. $data['deduction_price'] = 0.00;
  1150. $data['pay_price'] = 0.00;
  1151. $data['coupon_id'] = 0.00;
  1152. $data['coupon_price'] = 0.00;
  1153. $res4 = true;
  1154. $integral = User::where('uid',$order['uid'])->value('integral');
  1155. $res1 = User::bcInc($order['uid'],'integral',$data['back_integral'],'uid');
  1156. $res2 = UserBill::income('商品退积分',$order['uid'],'integral','pay_product_integral_back',$data['back_integral'],$order['id'],bcadd($integral,$data['back_integral'],2),'订单退积分'.floatval($data['back_integral']).'积分到用户积分');
  1157. $res3 = self::edit($data,$id);
  1158. if($order['coupon_id']) $res4 = StoreCouponUser::recoverCoupon($order['coupon_id']);
  1159. StoreOrderStatus::setStatus($id,'integral_back','商品退积分:'.$data['back_integral']);
  1160. $res = $res1 && $res2 && $res3 && $res4;
  1161. ModelBasic::checkTrans($res);
  1162. return $res;
  1163. }
  1164. }