BatchSendController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <?php
  2. /**
  3. * Author: 芸众商城 www.yunzshop.com
  4. * Date: 2017/11/21
  5. * Time: 下午4:01
  6. */
  7. namespace app\backend\modules\order\controllers;
  8. use app\backend\modules\member\models\Member;
  9. use app\backend\modules\order\models\Order;
  10. use app\common\components\BaseController;
  11. use app\common\exceptions\ShopException;
  12. use app\common\helpers\Url;
  13. use app\common\models\order\Express;
  14. use app\common\repositories\ExpressCompany;
  15. use app\frontend\models\OrderGoods;
  16. class BatchSendController extends BaseController
  17. {
  18. private $originalName;
  19. private $reader;
  20. private $success_num = 0;
  21. private $err_array = [];
  22. private $error_msg;
  23. private $uid =array();
  24. public function preAction()
  25. {
  26. parent::preAction();
  27. // 生成目录
  28. if (!is_dir(storage_path('app/public/orderexcel'))) {
  29. mkdir(storage_path('app/public/orderexcel'), 0777);
  30. }
  31. }
  32. public function index()
  33. {
  34. // $send_data = request()->send;
  35. $send_data = [];
  36. $express = json_decode(request()->body);
  37. $send_data['express_code'] = $express->value;
  38. $send_data['express_company_name'] = $express->name;
  39. $send_data['excelfile'] = request()->file;
  40. if (\Request::isMethod('post')) {
  41. if ($send_data['express_company_name'] == "顺丰" && $send_data['express_code'] != "SF") {
  42. return $this->errorJson('上传失败,请重新上传');
  43. }
  44. if (!$send_data['excelfile']) {
  45. return $this->errorJson('请上传文件');
  46. }
  47. if ($send_data['excelfile']->isValid()) {
  48. try {
  49. $this->uploadExcel($send_data['excelfile']);
  50. } catch (ShopException $exception) {
  51. return $this->errorJson($exception->getMessage());
  52. }
  53. // $this->readExcel();
  54. $this->handleOrders($this->getRow(), $send_data);
  55. $this->sendMessage($this->uid);
  56. $msg = $this->success_num . '个订单发货成功。';
  57. return $this->successJson('ok',$msg . $this->error_msg);
  58. // return $this->message($msg . $this->error_msg, Url::absoluteWeb('order.batch-send.index'));
  59. }
  60. }
  61. return view('order.batch_send_vue', [])->render();
  62. }
  63. protected $importData;
  64. /**
  65. * @name 保存excel文件
  66. * @param $file
  67. * @throws ShopException
  68. * @author
  69. */
  70. private function uploadExcel($file)
  71. {
  72. $originalName = $file->getClientOriginalName(); // 文件原名
  73. $ext = $file->getClientOriginalExtension(); // 扩展名
  74. $realPath = $file->getRealPath(); //临时文件的绝对路径
  75. if (!in_array($ext, ['xls', 'xlsx','csv'])) {
  76. throw new ShopException('不是xls、xlsx文件格式!');
  77. }
  78. $this->importData = \app\exports\ExcelService::importToArray($file);
  79. // $newOriginalName = md5($originalName . str_random(6)) .'.'. $ext;
  80. // \Storage::disk('orderexcel')->put($newOriginalName, file_get_contents($realPath));
  81. // $this->originalName = $newOriginalName;
  82. }
  83. /**
  84. * 读取文件
  85. * @author
  86. */
  87. private function readExcel()
  88. {
  89. //$this->reader = \Excel::load(storage_path('app/public/orderexcel') . '/' . $this->originalName);
  90. }
  91. /**
  92. * @name 获取表格内容
  93. * @return array
  94. * @author
  95. */
  96. private function getRow()
  97. {
  98. $values = $this->importData[0];
  99. array_shift($values); // 删除标题
  100. return $values?:[];
  101. $values = [];
  102. $sheet = $this->reader->getActiveSheet();
  103. $highestRow = $sheet->getHighestRow();
  104. $highestColumn = $sheet->getHighestColumn();
  105. $highestColumnCount = \PHPExcel_Cell::columnIndexFromString($highestColumn);
  106. $row = 2;
  107. while ($row <= $highestRow) {
  108. $rowValue = array();
  109. $col = 0;
  110. while ($col < $highestColumnCount) {
  111. $rowValue[] = (string)$sheet->getCellByColumnAndRow($col, $row)->getValue();
  112. ++$col;
  113. }
  114. $values[] = $rowValue;
  115. ++$row;
  116. }
  117. return $values;
  118. }
  119. /**
  120. * @name 订单发货
  121. * @param $values
  122. * @param $send_data
  123. * @author
  124. */
  125. private function handleOrders($values, $send_data)
  126. {
  127. foreach ($values as $rownum => $col) {
  128. $order_sn = trim($col[0]);
  129. $express_sn = trim($col[1]);
  130. if (empty($order_sn)) {
  131. continue;
  132. }
  133. if (empty($express_sn)) {
  134. $this->err_array[] = $order_sn;
  135. continue;
  136. }
  137. if ($order_sn == $express_sn) {
  138. $this->err_array[] = '发货失败,订单号为' . $order_sn . '快递单号不能与订单编号一致';
  139. // $this->err_array[] = $order_sn;
  140. continue;
  141. }
  142. // $order = Order::select('id', 'order_sn', 'status', 'refund_id','uid')->whereStatus(1)->whereOrderSn($order_sn)->first();
  143. $order = Order::select('id', 'order_sn', 'status', 'refund_id','uid','is_all_send_goods')->whereIn('status',[1,2])->whereOrderSn($order_sn)->first();
  144. //判断如果没有查询到 或者 查询到了 订单状态为已发货 订单状态不为部分发货
  145. if (!$order || ($order['status'] == 2 && $order->is_all_send_goods != 1)) {
  146. $this->err_array[] = $order_sn;
  147. continue;
  148. }
  149. //如果是部分发货则走新逻辑 -- 如果是未发货状态则走以前的不变
  150. if($order['status'] == 2){
  151. //存储新的物流信息
  152. $db_express_model = new Express();
  153. $db_express_model->order_id = $order->id;
  154. $db_express_model->express_code = $send_data['express_code'];
  155. $db_express_model->express_company_name = $send_data['express_company_name'];
  156. $db_express_model->express_sn = $express_sn;
  157. $db_express_model->save();
  158. //修改订单商品状态
  159. $where[] = ['order_id','=',$order->id];
  160. $where[] = ['order_express_id','=',null];
  161. $param['order_goods_ids'] = OrderGoods::where($where)->update(['order_express_id'=>$db_express_model->id]);
  162. //修改订单表是否全部发货 为全部发货
  163. $order->is_all_send_goods = 2;
  164. }else {
  165. $express_model = Express::where('order_id', $order->id)->first();
  166. !$express_model && $express_model = new Express();
  167. $express_model->order_id = $order->id;
  168. $express_model->express_company_name = $send_data['express_company_name'];
  169. $express_model->express_code = $send_data['express_code'];
  170. $express_model->express_sn = $express_sn;
  171. $express_model->save();
  172. }
  173. $order->send_time = time();
  174. $order->status = 2;
  175. $this->uid[] = $order->uid;
  176. $order->save();
  177. $order->fireSentEvent();
  178. $this->success_num += 1;
  179. }
  180. $this->setErrorMsg();
  181. }
  182. /**
  183. * @name 设置错误信息
  184. * @author
  185. */
  186. private function setErrorMsg()
  187. {
  188. if (count($this->err_array) > 0) {
  189. $num = 1;
  190. $this->error_msg = '<br>' . count($this->err_array) . '个订单发货失败,失败的订单编号: <br>';
  191. foreach ($this->err_array as $k => $v) {
  192. $this->error_msg .= $v . ' ';
  193. if (($num % 2) == 0) {
  194. $this->error_msg .= '<br>';
  195. }
  196. ++$num;
  197. }
  198. }
  199. }
  200. /**
  201. * @name 获取示例excel
  202. * @author
  203. */
  204. public function getExample()
  205. {
  206. $export_data[0] = ["订单编号", "快递单号"];
  207. $file_name = date('Y-m-d-h-i-s', time()) . "批量发货数据模板.xls";
  208. return \app\exports\ExcelService::fromArrayExport($export_data, $file_name);
  209. // 商城更新,无法使用
  210. // \Excel::create('批量发货数据模板', function ($excel) use ($export_data) {
  211. // $excel->setTitle('Office 2005 XLSX Document');
  212. // $excel->setCreator('芸众商城')
  213. // ->setLastModifiedBy("芸众商城")
  214. // ->setSubject("Office 2005 XLSX Test Document")
  215. // ->setDescription("Test document for Office 2005 XLSX, generated using PHP classes.")
  216. // ->setKeywords("office 2005 openxml php")
  217. // ->setCategory("report file");
  218. // $excel->sheet('info', function ($sheet) use ($export_data) {
  219. // $sheet->rows($export_data);
  220. // });
  221. // })->download('csv');//->export('xls');
  222. }
  223. private function sendMessage($uid)
  224. {
  225. try {
  226. \Log::debug('批量发货短信');
  227. //sms_send 是否开启
  228. $smsSet = \Setting::get('shop.sms');
  229. //是否设置
  230. if ($smsSet['type'] != 3 || empty($smsSet['aly_templateBalanceCode'])) {
  231. return false;
  232. }
  233. //查询余额,获取余额超过该值的用户,并把没有手机号的筛选掉
  234. $mobile = Member::uniacid()
  235. ->WhereIn('uid',$uid)
  236. ->select('uid', 'mobile')
  237. ->whereNotNull('mobile')
  238. ->get();
  239. if (empty($mobile)) {
  240. \Log::debug('未找到满足条件会员');
  241. return false;
  242. } else {
  243. $mobile = $mobile->toArray();
  244. }
  245. $name = \Setting::get('shop.shop')['name'];
  246. foreach ($mobile as $key => $value) {
  247. if (!$value['mobile']) {
  248. continue;
  249. }
  250. $data = Array( // 短信模板中字段的值
  251. "shop" => $name,
  252. );
  253. //todo 发送短信
  254. app('sms')->sendGoods($value['mobile'], $data);
  255. }
  256. return true;
  257. } catch (\Exception $e) {
  258. return false;
  259. }
  260. }
  261. public function getExpress()
  262. {
  263. $data = \app\common\repositories\ExpressCompany::create()->all();
  264. return $this->successJson('ok',$data);
  265. }
  266. }