Order.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. <?php
  2. namespace app\data\controller\api\business;
  3. use app\data\model\DataUser;
  4. use app\data\model\ShopGoodsItem;
  5. use app\data\model\ShopOrder;
  6. use app\data\model\ShopOrderItem;
  7. use app\data\model\ShopOrderSend;
  8. use app\data\model\SystemUserAddress;
  9. use think\admin\Controller;
  10. use hg\apidoc\annotation\Title;
  11. use hg\apidoc\annotation\Method;
  12. use hg\apidoc\annotation\Param;
  13. use hg\apidoc\annotation\Returned;
  14. use Yansongda\Pay\Exceptions\GatewayException;
  15. use Yansongda\Pay\Pay;
  16. use app\data\model\ShopGoods;
  17. use app\data\model\ShopOrderPay;
  18. /**
  19. * 商家订单数据接口
  20. */
  21. class Order extends Controller
  22. {
  23. /**
  24. * @Title ("主页订单上标数量")
  25. * @Method ("get")
  26. * @return void
  27. * @throws \think\db\exception\DbException
  28. */
  29. public function order_statistics(){
  30. $admin_id=$this->uuid();
  31. $count = ['待付款','待发货','待收货','退款/售后'];
  32. $where=[];
  33. foreach ($count as &$v){
  34. switch ($v){
  35. case '待付款':
  36. $array = '2';
  37. break;
  38. case '待发货':
  39. $array = '4';
  40. break;
  41. case '待收货':
  42. $array = '5';
  43. break;
  44. case '退款/售后':
  45. $array = '7,8';
  46. $where['refund_del'] = 1;
  47. break;
  48. }
  49. $v=ShopOrder::mk()->where('admin_id',$admin_id->id)->whereIn('status',$array)->where($where)->count();
  50. }
  51. $this->success('商城订单上标数量',$count);
  52. }
  53. /**
  54. * @Title ("商城订单上标数量")
  55. * @Method ("get")
  56. * @return void
  57. * @throws \think\db\exception\DbException
  58. */
  59. public function order_count(){
  60. $admin_id=$this->uuid();
  61. $count = ['全部','待付款','待发货','待收货','已完成'];
  62. foreach ($count as &$v){
  63. switch ($v){
  64. case '全部':
  65. $array = '0,1,2,3,4,5,6';
  66. break;
  67. case '待付款':
  68. $array = '2';
  69. break;
  70. case '待发货':
  71. $array = '4';
  72. break;
  73. case '待收货':
  74. $array = '5';
  75. break;
  76. case '已完成':
  77. $array = '6';
  78. break;
  79. }
  80. $v=ShopOrder::mk()->where('admin_id',$admin_id->id)->whereIn('status',$array)->count();
  81. }
  82. $this->success('商城订单上标数量',$count);
  83. }
  84. /**
  85. * @Title("我的订单")
  86. * @Method("post")
  87. * @Param ("page",desc="页码")
  88. * @Param("order_name",desc="搜索名称")
  89. * @Param ("status",desc="1全部 2 待支付 3代发货 4 待收货 5已完成")
  90. */
  91. public function order_list(){
  92. $admin_id=$this->uuid();
  93. $status = input('status',1);
  94. if(!empty($status)){
  95. switch ($status){
  96. case 1:
  97. $array = [0,1,2,3,4,5];
  98. break;
  99. case 2:
  100. $array = [2];
  101. break;
  102. case 3:
  103. $array = [4];
  104. break;
  105. case 4:
  106. $array = [5];
  107. break;
  108. case 5:
  109. $array = [6];
  110. break;
  111. }
  112. }
  113. $query = ShopOrder::mQuery()->like('order_name');
  114. $list = $query ->where('admin_id',$admin_id['id'])
  115. ->whereIn('status',$array)->order('id desc')->page(true, false, false, 10);
  116. foreach ($list['list'] as $k=>$v){
  117. $list['list'][$k]['goods_item']=ShopOrderItem::mk()->where('order_no',$list['list'][$k]['order_no'])->select();
  118. $list['list'][$k]['user_address']=ShopOrderSend::mk()->where('order_no',$list['list'][$k]['order_no'])->find();
  119. }
  120. $this->success('店铺订单列表',$list);
  121. }
  122. /**
  123. * @Title ("订单详情")
  124. * @Method ("post")
  125. * @Param ("order_id",desc="订单id")
  126. * @return void
  127. * @throws \think\db\exception\DataNotFoundException
  128. * @throws \think\db\exception\DbException
  129. * @throws \think\db\exception\ModelNotFoundException
  130. */
  131. public function order_info(){
  132. $admin_id=$this->uuid();
  133. $order_id = strval(input('order_id'));
  134. $str_admin_id = strval($admin_id['id']);
  135. $arr = [
  136. 'admin_id' => $str_admin_id,
  137. 'id' => $order_id
  138. ];
  139. $list = ShopOrder::mk()->where($arr)->find();
  140. $list['time']=0;
  141. if($list['status']==2){
  142. $list['time'] = strtotime($list['create_at'])+30*60-time();
  143. /* if($list['list']['time']<=3){
  144. ShopOrder::mk()->where('id',$list['list']['id'])->save(['status'=>0]);
  145. }*/
  146. }
  147. $list['user']=DataUser::mk()->where('id',$list['uuid'])->field('nickname,phone')->find();
  148. $list['goods_item']=ShopOrderItem::mk()->where('order_no',$list['order_no'])->select();
  149. $list['user_address']=ShopOrderSend::mk()->where('order_no',$list['order_no'])->find();
  150. $list['user_info']=DataUser::mk()->where('id',$list['uuid'])->field('headimg,nickname')->find();
  151. $this->success('店铺订单列表',$list);
  152. }
  153. /**
  154. * @Title ("退款订单列表")
  155. * @Method ("get")
  156. * @Param ("page",desc="页码")
  157. * @return void
  158. * @throws \think\db\exception\DataNotFoundException
  159. * @throws \think\db\exception\DbException
  160. * @throws \think\db\exception\ModelNotFoundException
  161. */
  162. public function refund_list(){
  163. $admin_id=$this->uuid();
  164. $status =[7,8];
  165. $query = ShopOrder::mQuery()->like('order_name');
  166. $list = $query ->where('admin_id',$admin_id['id'])
  167. ->whereIn('status',$status)->where('refund_del',1)->order('id desc')->page(true, false, false, 10);
  168. foreach ($list['list'] as $k=>$v){
  169. $list['list'][$k]['goods_item']=ShopOrderItem::mk()->where('order_no',$list['list'][$k]['order_no'])->select();
  170. $list['list'][$k]['user_address']=ShopOrderSend::mk()->where('order_no',$list['list'][$k]['order_no'])->find();
  171. }
  172. $this->success('退款订单',$list);
  173. }
  174. /**
  175. * @Title ("退款操作接口")
  176. * @Method ("post")
  177. * @Param ("order_id",desc="订单id")
  178. * @Param ("type",desc="退款操作 type=1同意退款 type=2 不同意驳回")
  179. * @Param ("reason",desc="拒绝退款原因")
  180. * @return void
  181. * @throws \think\db\exception\DataNotFoundException
  182. * @throws \think\db\exception\DbException
  183. * @throws \think\db\exception\ModelNotFoundException
  184. */
  185. public function examine_refund(){
  186. $admnd_id=$this->uuid();
  187. $data = $this->_vali([
  188. 'order_id.require'=>'退款订单不能为空',
  189. 'type.require'=>'操作类型能为空',
  190. 'reason.default'=>'',
  191. ]);
  192. $info = ShopOrder::mk()->where(['id'=>$data['order_id'],'admin_id'=>$admnd_id['id'],'status'=>7])->find();
  193. $pay_money = ShopOrderPay::mk()->where(['status' => 2, 'pay_no'=>$info['payment_trade']])->value('money');
  194. if(empty($info)){
  195. $this->error('订单信息有误');
  196. }
  197. else{
  198. // 退款操作
  199. if($data['type']==1){
  200. //同意退款
  201. if($info['payment_type']=='支付宝支付') {
  202. $result = json_decode($this->refund_order($info['payment_trade'], $info['refund_money']), true);
  203. }
  204. if($info['payment_type']=='微信支付') {
  205. $result = json_decode($this->wxrefund_order($info['payment_trade'], $info['refund_money'],$pay_money), true);
  206. }
  207. if($result) {
  208. ShopOrder::mk()->where(['id' => $data['order_id'], 'admin_id' => $admnd_id['id']])->save(['status' => 8, 'refund_status' => 2, 'dk_time' => date('Y-m-d H:i:s')]);
  209. $this->success('已同意退款,支付金额原路退回');
  210. }
  211. else{
  212. $this->error('金额未退回查看支付账户');
  213. }
  214. }
  215. //统一退货
  216. else {
  217. ShopOrder::mk()->where(['id'=>$data['order_id'],'admin_id'=>$admnd_id['id']])->save(['status' => 4,'refund_status'=>3,'refuse_reason'=>$data['reason'],'dk_time'=>date('Y-m-d H:i:s')]);
  218. //不同意退款
  219. $this->success('不同意退款');
  220. }
  221. }
  222. }
  223. public function refund_order($pay_no,$money){
  224. $config = [
  225. 'app_id' => '2021003161685907',
  226. 'notify_url' => '',
  227. 'return_url' => '',
  228. 'ali_public_key' =>'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0+yqR2nQ7uZBHoHeeLspwvZcB/jgMyjAxkJk7Dm9IR5VhTTSXNQYmOOjs+g628G52xxHQ/Z1pPK3dFshqIBTQC0VrrTyWFhypb8veKeo5RFzgWKvl1awvOdf5r6qXM6b3OjaBYqiqvpLdpZdVkEY9rLOwh6LM8XKYE3CfM466KypxYBrUeXRmDhweWVScSuOJGuhmd1O2RI2TIHjosxG10v4/s3nfNZ+aGQ+UnASRZbJ0GyyFlqyJ+mZGyAJBahWI4YYG6ZJMp2YNNUAWeb++gVG1Zw+HYMG57C0W6PCZ0LvS454ZRyx72WP+nKi7LMj8fkintEPbOkRd3M/OF42gQIDAQAB',
  229. 'private_key' =>'MIIEogIBAAKCAQEA0+yqR2nQ7uZBHoHeeLspwvZcB/jgMyjAxkJk7Dm9IR5VhTTSXNQYmOOjs+g628G52xxHQ/Z1pPK3dFshqIBTQC0VrrTyWFhypb8veKeo5RFzgWKvl1awvOdf5r6qXM6b3OjaBYqiqvpLdpZdVkEY9rLOwh6LM8XKYE3CfM466KypxYBrUeXRmDhweWVScSuOJGuhmd1O2RI2TIHjosxG10v4/s3nfNZ+aGQ+UnASRZbJ0GyyFlqyJ+mZGyAJBahWI4YYG6ZJMp2YNNUAWeb++gVG1Zw+HYMG57C0W6PCZ0LvS454ZRyx72WP+nKi7LMj8fkintEPbOkRd3M/OF42gQIDAQABAoIBACIGS0hv6sWQXkAhpbBIjGnq19fH02cjUeAC5OUwV/crQZvDYUraGqDhW3UVAe4qakaNgbudpEG5Xk7mGr9M6xDQrDyCfK5GdRG7YknC0VEFvj+1sm9f0bxigXkwf3WrDkcnc2mUWo2M5fTCK3YfuXxSNPPhp4PGa7mOgn07NyYH1+Zt4YZO6fBiHSqsgJo8tevWtjvrnc0cg2cUpDWQ41oGQRwD8S6QprOyCTAmCIsNNhlM19ebeFxG+8v0T3YQ9sWEMkdIXReGhEQbOxVeorp9rmViEf/EsZHV9QAWcZk2fAMwSCeC3CIBeorNdAAVxLUHNQP6slPDCQeCtFeWhIkCgYEA6uX5QetZkGQoKHZ5MEQt6AhLN3dPPv8E28kAT9UZcqMASMjyICzRvAeUPDuBrdy7lkufMo4GLYF5sFII4seMmxeHZCB0zdsnqNpoosXQFsK1tR9Q08E5tety/y8VfuONnyHICIV8wEgFtcHxYwCP9itiYpaiFdMhiuWrlGie8gMCgYEA5vZa1WitoSEVvf4c9QBWcw1eBC1P+oVgTmhBaYNRx1X6WZbP7NEqiYjwZOnXprTq8Gd8jIOHkDBOhtve3THiY4tpa1g3Kni0d9RHshYRKa9YTnAqDL4f7D8QC1mH8hDq26FsPMkehGQixVa5CwpP7Tu3KBY0Xmm4CFUPDhIZMCsCgYBx2UzaGkuqpCCim+lY73Kgh4SNOZJ7Ifck32L7TnmrCj3VCS/xUEfHLpU2LFFKBzYUPkrGofd0jtCAGQKdh8IqWVkRunliXNn4CQO2ANI+ddjEFI2EVJ64AYoXDKcKfRfjDOh62NgCCeZalcl9BoS/938T8ZZVpaMYQwDKSXrgKQKBgBCXegcCshZ1Lf6sFqBzGcLCHxLlvm0cz8JSMwDFckaDoqx07RLyI8Almj9lnRxYutfyVzww5rgxADMn8Gargrvr8/LGL5BZg31oPo5Ij4sTEaDw5dRshBaQoTJviBiXpoeInSHwwMR5/RV4GWr1nrBILewvTCvMJHBUy/QS0MRpAoGAe8GMTvLMjgJPnBJK6+p6vNDrpsZTNDlMhSrGFyxskwCeLZpSBFejN12HVoDXuypeA2KO7j6DXR4VxDyS8P0hUlc+iE9IHklT+PMxIuR88x6rqAL/a3DO+QkfYSb0IODLM0UlAFCp6/k7Lt73lkF9sJ4JRP4Fw3R3ddskYu33CzI=',
  230. 'log' => [ // optional
  231. 'file' => './logs/alipay.log',
  232. 'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
  233. 'type' => 'single', // optional, 可选 daily.
  234. 'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
  235. ],
  236. 'http' => [ // optional
  237. 'timeout' => 5.0,
  238. 'connect_timeout' => 5.0,
  239. // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
  240. ],
  241. // 'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
  242. ];
  243. try{
  244. $order = [
  245. 'out_trade_no' => $pay_no,
  246. 'refund_amount' => $money,
  247. ];
  248. Pay::alipay($config)->refund($order);
  249. return true;
  250. }
  251. catch(GatewayException $e){
  252. return false;
  253. }
  254. }
  255. public function wxrefund_order($pay_no,$money,$pay_money){
  256. $config = [
  257. 'appid' => 'wxa5033cf91977e574', // APP APPID
  258. 'app_id' => 'wxa5033cf91977e574', // 公众号 APPID
  259. 'miniapp_id' => 'wxa5033cf91977e574', // 小程序 APPID
  260. 'mch_id' => '1634830915',
  261. 'key' => '7aa3fg0htful8nttb135rnusbvmeggbi',
  262. 'notify_url' => '',
  263. 'cert_client' => '/www/wwwroot/ship-expert.zhousi.hdlkeji.com/ship-expert/public/cert/apiclient_cert.pem', // optional, 退款,红包等情况时需要用到
  264. 'cert_key' => '/www/wwwroot/ship-expert.zhousi.hdlkeji.com/ship-expert/public/cert/apiclient_key.pem',// optional, 退款,红包等情况时需要用到
  265. 'log' => [ // optional
  266. 'file' => './logs/wechat.log',
  267. 'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
  268. 'type' => 'single', // optional, 可选 daily.
  269. 'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
  270. ],
  271. 'http' => [ // optional
  272. 'timeout' => 5.0,
  273. 'connect_timeout' => 5.0,
  274. // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
  275. ],
  276. // 'mode' => 'dev',
  277. ];
  278. try{
  279. $order = [
  280. 'out_trade_no' => $pay_no,
  281. 'out_refund_no' => time(),
  282. 'total_fee' => $pay_money*100,
  283. 'refund_fee' => $money*100,
  284. 'refund_desc' => '退款',
  285. ];
  286. Pay::wechat($config)->refund($order); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。
  287. return true;
  288. }
  289. catch(GatewayException $e){
  290. return false;
  291. }
  292. }
  293. /**
  294. * @Title ("立即发货")
  295. * @Method ("post")
  296. * @Param ("order_no",desc="订单编号")
  297. * @Param ("send_number",desc="快递编号")
  298. * @Param ("company_name",desc="快递公司")
  299. * @Param ("name",desc="发货姓名")
  300. * @Param ("phone",desc="发货联系号码")
  301. * @Param ("province",desc="省")
  302. * @Param ("city",desc="城市")
  303. * @Param ("area",desc="地区")
  304. * @Param ("address",desc="详细地址")
  305. * @return void
  306. */
  307. public function order_send(){
  308. $admin_id = $this->uuid();
  309. $data = $this->_vali(
  310. [
  311. 'order_no.require'=>'订单信息不能为空',
  312. 'send_number.require'=>'快递单号不能为空',
  313. 'company_name.require'=>'快递公司名称不能为空',
  314. 'name.require'=>'发货商家联系人',
  315. 'phone.require'=>'商家联系号码',
  316. 'province.require'=>'发货商家省',
  317. 'city.require'=>'商家市',
  318. 'area.require'=>'发货商家区县',
  319. 'address.require'=>'详细地址'
  320. ]
  321. );
  322. $send_data = [
  323. 'send_number'=>$data['send_number'],
  324. 'company_name'=>$data['company_name'],
  325. 'send_datetime'=>date('Y-m-d H:i:s'),
  326. 'fa_name'=>$data['name'],
  327. 'fa_phone'=>$data['phone'],
  328. 'fa_address'=>$data['province'].$data['city'].$data['area'].$data['address'],
  329. 'shou_name'=>$data['name'],
  330. 'shou_phone'=>$data['phone'],
  331. 'shou_address'=>$data['province'].$data['city'].$data['area'].$data['address'],
  332. ];
  333. ShopOrderSend::mk()->where('order_no',$data['order_no'])->save($send_data);
  334. ShopOrder::mk()->where('order_no',$data['order_no'])->save(['status'=>5]);
  335. $this->success('发货成功');
  336. }
  337. /**
  338. * @Title ("删除退款记录")
  339. * @Method ("post")
  340. * @Param ("order_id",desc="订单id")
  341. * @return void
  342. */
  343. public function del_refund(){
  344. $this->uuid();
  345. $data = $this->_vali(
  346. [
  347. 'order_id.require'=>'订单id不能为空',
  348. ]
  349. );
  350. ShopOrder::mk()->where('id',$data['order_id'])->save(['refund_del'=>2]);
  351. $this->success('退款记录已清除');
  352. }
  353. public function uuid(){
  354. $purchase_model = new Common($this->app);
  355. $uuid = $purchase_model->uuid();
  356. return $uuid;
  357. }
  358. }