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 = '
' . count($this->err_array) . '个订单发货失败,失败的订单编号:
';
foreach ($this->err_array as $k => $v) {
$this->error_msg .= $v . ' ';
if (($num % 2) == 0) {
$this->error_msg .= '
';
}
++$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);
}
}