| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- <?php
- /**
- * Author: 芸众商城 www.yunzshop.com
- * Date: 2017/11/21
- * Time: 下午4:01
- */
- namespace app\backend\modules\order\controllers;
- use app\backend\modules\member\models\Member;
- use app\backend\modules\order\models\Order;
- use app\common\components\BaseController;
- use app\common\exceptions\ShopException;
- use app\common\helpers\Url;
- use app\common\models\order\Express;
- use app\common\repositories\ExpressCompany;
- use app\frontend\models\OrderGoods;
- class BatchSendController extends BaseController
- {
- private $originalName;
- private $reader;
- private $success_num = 0;
- private $err_array = [];
- private $error_msg;
- private $uid =array();
- public function preAction()
- {
- parent::preAction();
- // 生成目录
- if (!is_dir(storage_path('app/public/orderexcel'))) {
- mkdir(storage_path('app/public/orderexcel'), 0777);
- }
- }
- public function index()
- {
- // $send_data = request()->send;
- $send_data = [];
- $express = json_decode(request()->body);
- $send_data['express_code'] = $express->value;
- $send_data['express_company_name'] = $express->name;
- $send_data['excelfile'] = request()->file;
- if (\Request::isMethod('post')) {
- if ($send_data['express_company_name'] == "顺丰" && $send_data['express_code'] != "SF") {
- return $this->errorJson('上传失败,请重新上传');
- }
- if (!$send_data['excelfile']) {
- return $this->errorJson('请上传文件');
- }
- if ($send_data['excelfile']->isValid()) {
- try {
- $this->uploadExcel($send_data['excelfile']);
- } catch (ShopException $exception) {
- return $this->errorJson($exception->getMessage());
- }
- // $this->readExcel();
- $this->handleOrders($this->getRow(), $send_data);
- $this->sendMessage($this->uid);
- $msg = $this->success_num . '个订单发货成功。';
- return $this->successJson('ok',$msg . $this->error_msg);
- // return $this->message($msg . $this->error_msg, Url::absoluteWeb('order.batch-send.index'));
- }
- }
- return view('order.batch_send_vue', [])->render();
- }
- protected $importData;
- /**
- * @name 保存excel文件
- * @param $file
- * @throws ShopException
- * @author
- */
- private function uploadExcel($file)
- {
- $originalName = $file->getClientOriginalName(); // 文件原名
- $ext = $file->getClientOriginalExtension(); // 扩展名
- $realPath = $file->getRealPath(); //临时文件的绝对路径
- if (!in_array($ext, ['xls', 'xlsx','csv'])) {
- throw new ShopException('不是xls、xlsx文件格式!');
- }
- $this->importData = \app\exports\ExcelService::importToArray($file);
- // $newOriginalName = md5($originalName . str_random(6)) .'.'. $ext;
- // \Storage::disk('orderexcel')->put($newOriginalName, file_get_contents($realPath));
- // $this->originalName = $newOriginalName;
- }
- /**
- * 读取文件
- * @author
- */
- private function readExcel()
- {
- //$this->reader = \Excel::load(storage_path('app/public/orderexcel') . '/' . $this->originalName);
- }
- /**
- * @name 获取表格内容
- * @return array
- * @author
- */
- private function getRow()
- {
- $values = $this->importData[0];
- array_shift($values); // 删除标题
- return $values?:[];
- $values = [];
- $sheet = $this->reader->getActiveSheet();
- $highestRow = $sheet->getHighestRow();
- $highestColumn = $sheet->getHighestColumn();
- $highestColumnCount = \PHPExcel_Cell::columnIndexFromString($highestColumn);
- $row = 2;
- while ($row <= $highestRow) {
- $rowValue = array();
- $col = 0;
- while ($col < $highestColumnCount) {
- $rowValue[] = (string)$sheet->getCellByColumnAndRow($col, $row)->getValue();
- ++$col;
- }
- $values[] = $rowValue;
- ++$row;
- }
- return $values;
- }
- /**
- * @name 订单发货
- * @param $values
- * @param $send_data
- * @author
- */
- private function handleOrders($values, $send_data)
- {
- foreach ($values as $rownum => $col) {
- $order_sn = trim($col[0]);
- $express_sn = trim($col[1]);
- if (empty($order_sn)) {
- continue;
- }
- if (empty($express_sn)) {
- $this->err_array[] = $order_sn;
- continue;
- }
- if ($order_sn == $express_sn) {
- $this->err_array[] = '发货失败,订单号为' . $order_sn . '快递单号不能与订单编号一致';
- // $this->err_array[] = $order_sn;
- continue;
- }
- // $order = Order::select('id', 'order_sn', 'status', 'refund_id','uid')->whereStatus(1)->whereOrderSn($order_sn)->first();
- $order = Order::select('id', 'order_sn', 'status', 'refund_id','uid','is_all_send_goods')->whereIn('status',[1,2])->whereOrderSn($order_sn)->first();
- //判断如果没有查询到 或者 查询到了 订单状态为已发货 订单状态不为部分发货
- if (!$order || ($order['status'] == 2 && $order->is_all_send_goods != 1)) {
- $this->err_array[] = $order_sn;
- continue;
- }
- //如果是部分发货则走新逻辑 -- 如果是未发货状态则走以前的不变
- if($order['status'] == 2){
- //存储新的物流信息
- $db_express_model = new Express();
- $db_express_model->order_id = $order->id;
- $db_express_model->express_code = $send_data['express_code'];
- $db_express_model->express_company_name = $send_data['express_company_name'];
- $db_express_model->express_sn = $express_sn;
- $db_express_model->save();
- //修改订单商品状态
- $where[] = ['order_id','=',$order->id];
- $where[] = ['order_express_id','=',null];
- $param['order_goods_ids'] = OrderGoods::where($where)->update(['order_express_id'=>$db_express_model->id]);
- //修改订单表是否全部发货 为全部发货
- $order->is_all_send_goods = 2;
- }else {
- $express_model = Express::where('order_id', $order->id)->first();
- !$express_model && $express_model = new Express();
- $express_model->order_id = $order->id;
- $express_model->express_company_name = $send_data['express_company_name'];
- $express_model->express_code = $send_data['express_code'];
- $express_model->express_sn = $express_sn;
- $express_model->save();
- }
- $order->send_time = time();
- $order->status = 2;
- $this->uid[] = $order->uid;
- $order->save();
- $order->fireSentEvent();
- $this->success_num += 1;
- }
- $this->setErrorMsg();
- }
- /**
- * @name 设置错误信息
- * @author
- */
- private function setErrorMsg()
- {
- if (count($this->err_array) > 0) {
- $num = 1;
- $this->error_msg = '<br>' . count($this->err_array) . '个订单发货失败,失败的订单编号: <br>';
- foreach ($this->err_array as $k => $v) {
- $this->error_msg .= $v . ' ';
- if (($num % 2) == 0) {
- $this->error_msg .= '<br>';
- }
- ++$num;
- }
- }
- }
- /**
- * @name 获取示例excel
- * @author
- */
- public function getExample()
- {
- $export_data[0] = ["订单编号", "快递单号"];
- $file_name = date('Y-m-d-h-i-s', time()) . "批量发货数据模板.xls";
- return \app\exports\ExcelService::fromArrayExport($export_data, $file_name);
- // 商城更新,无法使用
- // \Excel::create('批量发货数据模板', function ($excel) use ($export_data) {
- // $excel->setTitle('Office 2005 XLSX Document');
- // $excel->setCreator('芸众商城')
- // ->setLastModifiedBy("芸众商城")
- // ->setSubject("Office 2005 XLSX Test Document")
- // ->setDescription("Test document for Office 2005 XLSX, generated using PHP classes.")
- // ->setKeywords("office 2005 openxml php")
- // ->setCategory("report file");
- // $excel->sheet('info', function ($sheet) use ($export_data) {
- // $sheet->rows($export_data);
- // });
- // })->download('csv');//->export('xls');
- }
- private function sendMessage($uid)
- {
- try {
- \Log::debug('批量发货短信');
- //sms_send 是否开启
- $smsSet = \Setting::get('shop.sms');
- //是否设置
- if ($smsSet['type'] != 3 || empty($smsSet['aly_templateBalanceCode'])) {
- return false;
- }
- //查询余额,获取余额超过该值的用户,并把没有手机号的筛选掉
- $mobile = Member::uniacid()
- ->WhereIn('uid',$uid)
- ->select('uid', 'mobile')
- ->whereNotNull('mobile')
- ->get();
- if (empty($mobile)) {
- \Log::debug('未找到满足条件会员');
- return false;
- } else {
- $mobile = $mobile->toArray();
- }
- $name = \Setting::get('shop.shop')['name'];
- foreach ($mobile as $key => $value) {
- if (!$value['mobile']) {
- continue;
- }
- $data = Array( // 短信模板中字段的值
- "shop" => $name,
- );
- //todo 发送短信
- app('sms')->sendGoods($value['mobile'], $data);
- }
- return true;
- } catch (\Exception $e) {
- return false;
- }
- }
- public function getExpress()
- {
- $data = \app\common\repositories\ExpressCompany::create()->all();
- return $this->successJson('ok',$data);
- }
- }
|