store_id = $store_id; if (\Yii::$app->store) { $this->store = \Yii::$app->store; } else { $this->store = Store::findOne($store_id); } $this->order_id = $order_id; $this->print_type = $print_type; $this->order_type = $order_type; } public function print_order() { try { $this->setting = PrinterSetting::findOne(['store_id' => $this->store_id]);//打印设置 if (!$this->setting) { \Yii::warning('未设置打印设置'); throw new \Exception('未设置打印设置'); } $type = json_decode($this->setting->type, true); if (!($type[$this->print_type] && $type[$this->print_type] == 1 || $this->print_type == 'reprint')) { \Yii::warning('打印设置打印方式'); throw new \Exception('打印设置打印方式'); } $this->printer = Printer::findOne(['id' => $this->setting->printer_id, 'is_delete' => 0]); if (!$this->printer) {//打印机参数 \Yii::warning('未找到设置的打印机'); throw new \Exception('未找到设置的打印机'); } $this->printer_setting = json_decode($this->printer->printer_setting, true);//打印机配置 if ($this->order_type == 0) {//商城订单打印 $this->order = Order::find()->where(['id' => $this->order_id, 'is_delete' => 0])->one(); if ($this->order->type == 2) { $bSetting = BargainSetting::findOne(['store_id' => $this->store_id]); if (!$bSetting || $bSetting->is_print == 0) { throw new \Exception('砍价未开启打印'); } } $this->goods_list = $this->getOrderGoodsList($this->order['id']); $this->extra = [ 'order_type' => "商城订单", 'send_type' => $this->order->is_offline == 0 ? '快递配送' : "到店自提", ]; } elseif ($this->order_type == 1) {//秒杀打印 $ms_setting = MsSetting::findOne(['store_id' => $this->store_id]); if (!$ms_setting || $ms_setting->is_print == 0) { throw new \Exception('秒杀未开启打印'); } $this->order = MsOrder::find()->where(['id' => $this->order_id, 'is_delete' => 0])->one(); $this->goods_list = $this->getMsOrderGoodsList(); $this->extra = [ 'order_type' => "秒杀订单", 'send_type' => $this->order->is_offline == 0 ? '快递配送' : "到店自提" ]; } elseif ($this->order_type == 2) {//拼团订单打印 $pt_setting = PtSetting::findOne(['store_id' => $this->store_id]); if (!$pt_setting || $pt_setting->is_print == 0) { throw new \Exception('拼团未开启打印'); } $this->order = PtOrder::find()->where(['id' => $this->order_id, 'is_delete' => 0])->one(); $this->goods_list = $this->getPtOrderGoodsList(); $this->extra = [ 'order_type' => "拼团订单", 'send_type' => $this->order->offline == 1 ? '快递配送' : "到店自提", ]; } elseif ($this->order_type == 3) {//预约订单打印 return false; $this->order = YyOrder::find()->where(['id' => $this->order_id, 'is_delete' => 0])->one(); $this->goods_list = $this->getYyOrderGoodsList(); } else { throw new \Exception('未知的错误'); } switch ($this->order->pay_type) { case 0: $this->extra['pay_type'] = "线上支付"; break; case 1: $this->extra['pay_type'] = "线上支付"; break; case 2: $this->extra['pay_type'] = "货到付款"; break; case 3: $this->extra['pay_type'] = "余额支付"; break; default: $this->extra['pay_type'] = ""; } if ($this->printer->printer_type == 'kdt2') { $res = $this->printer_1(); } if ($this->printer->printer_type == 'yilianyun-k4') { $res = $this->printer_2(); } if ($this->printer->printer_type == 'feie') { $res = $this->printer_3(); } if ($this->printer->printer_type == 'gp') { $res = $this->printer_4(); } return [ 'code' => 1, 'msg' => '打印成功', 'data' => $res ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage(), 'data' => $e ]; } } /** * 365打印机 */ private function printer_1() { $big = [ 1 => [ 'start' => '', 'end' => '' ], 2 => [ 'start' => "", 'end' => "" ], 3 => [ 'start' => '', 'end' => '' ], ]; $start = $big[$this->setting->big]['start']; $end = $big[$this->setting->big]['end']; date_default_timezone_set("Asia/Shanghai"); // $order = Order::findOne(['id' => $this->order_id, 'is_delete' => 0]); $order = $this->order; $addtime = date('Y-m-d H:i:s', $order['addtime']); // $goods_list = $this->getOrderGoodsList($order->id); $goods_list = $this->goods_list; header("Content-Type: text/html;charset=utf-8"); $DEVICE_NO = $this->printer_setting['name']; $key = $this->printer_setting['key']; $time = $this->printer_setting['time'];//打印联数 $content = ""; $content .= "{$this->store->name}
"; $content .= "订单类型:{$this->extra['order_type']}
"; $content .= "支付方式:{$this->extra['pay_type']}
"; $isPay = $order['is_pay'] == 1 ? '已支付' : '未支付'; $content .= "支付状态:{$isPay}
"; $content .= "发货方式:{$this->extra['send_type']}
"; $content .= "订单号:{$order['order_no']}
"; $content .= "下单时间:{$addtime}
"; if ($this->setting->is_attr == 0) { $content .= "--------------------------------
"; $content .= "名称      单价 数量 金额
"; $content .= "--------------------------------
"; foreach ($goods_list as $k => $v) { $price = round($v['total_price'] / $v['num'], 2); $arr = $this->r_str_pad_1($v['name'], 7); foreach ($arr as $index => $value) { if ($index == 0) { $content .= $value . " " . str_pad($price, 5) . " " . str_pad($v['num'], 6) . " " . round($v['total_price'], 2) . '
'; } else { $content .= $value . '
'; } } } } else { /** * $content .= "--------------------------------
"; * $content .= "名称   规格  单价 数量 金额
"; * $content .= "--------------------------------
"; * foreach ($goods_list as $k => $v) { * $attr = json_decode($v['attr'], true); * $attr_arr = []; * foreach ($attr as $i => $j) { * $attr_arr[] = $j['attr_group_name'] . $j['attr_name']; * } * $attr_str = implode(',', $attr_arr); * $attr_arr_1 = $this->r_str_pad_1($attr_str, 4); * $price = round($v['total_price'] / $v['num'], 2); * $arr = $this->r_str_pad_1($v['name'], 4); * $a = count($attr_arr_1) >= count($arr) ? $attr_arr_1 : $arr; * foreach ($a as $index => $value) { * $string = ""; * $string_1 = ""; * if (isset($arr[$index])) { * $string = $arr[$index]; * } * if (isset($attr_arr_1[$index])) { * if (!$string) { * $string = str_pad($string, 8); * } * $string_1 = $attr_arr_1[$index]; * } * if ($index == 0) { * $content .= $string . " " . $string_1 . str_pad($price, 5) . " " . str_pad($v['num'], 3) . " " . round($v['total_price'], 2) . '
'; * } else { * $content .= $string . " " . $string_1 . '
'; * } * } * } * */ $content .= "--------------------------------
"; $content .= "名称 数量 金额
"; $content .= "--------------------------------
"; foreach ($goods_list as $k => $v) { $attr = json_decode($v['attr'], true); $attr_arr = []; foreach ($attr as $i => $j) { $attr_arr[] = $j['attr_group_name'] . $j['attr_name']; } $attr_str = implode(',', $attr_arr); $name = $v['name'] . '(' . $attr_str . ')'; $name_arr = $this->r_str_pad_1($name, 8); foreach ($name_arr as $index => $value) { if ($index == count($name_arr) - 1) { $content .= $name_arr[$index] . " " . str_pad('×' . $v['num'], 7) . " " . round($v['total_price'], 2) . "
"; } else { $content .= $name_arr[$index] . '
'; } } } } $content .= "--------------------------------
"; if ($order['express_price']) { $content .= "运费:{$order['express_price']}元
"; } $content .= "总计:{$order['total_price']}元
"; if (isset($order['user_coupon_id'])) { $content .= "优惠券优惠:{$order['coupon_sub_price']}元
"; } if (isset($order['integral'])) { $integral = json_decode($order['integral'], true); if ($integral['forehead'] != 0) { $content .= "积分抵扣:{$integral['forehead']}元
"; } } if (isset($order['discount']) && $order['discount'] < 10) { $content .= "会员折扣:{$order['discount']}折
"; } $content .= "实付:{$order['pay_price']}元
"; if ($this->order_type != 3) { if ((isset($order['is_offline']) && $order['is_offline'] != 1) || (isset($order['offline']) && $order['offline'] != 2)) { $content .= "{$start}收货人:{$order['name']}
"; $content .= "收货地址:{$order['address']}
"; $content .= "收货人电话:{$order['mobile']}
{$end}"; $content .= "--------------------------------
"; } else { $content .= "{$start}联系人:{$order['name']}
"; $content .= "联系人电话:{$order['mobile']}
{$end}"; $content .= "--------------------------------
"; $content .= "门店信息
"; $content .= "{$this->order->shop->name}
"; $content .= "{$this->order->shop->mobile}
"; $content .= "{$this->order->shop->address}
"; $content .= "--------------------------------
"; } } if ($order['content']) { $content .= "备注:{$order['content']}
"; } else { $orderForm = OrderForm::findAll([ 'order_id' => $this->order->id, 'store_id' => $this->store->id, 'is_delete' => 0 ]); if ($orderForm) { /* @var $orderForm OrderForm[] */ foreach ($orderForm as $item) { $content .= $item->key . ':' . $item->value . "
"; } } } // $content .= "http://open.printcenter.cn
"; $result = $this->sendSelfFormatOrderInfo($DEVICE_NO, $key, $time, $content); \Yii::warning('==>>' . $result); $result = \Yii::$app->serializer->decode($result); if ($result['responseCode'] != 0) { throw new Exception($result['msg'], $result); } return $result; } /** * 365打印机 */ private function sendSelfFormatOrderInfo($device_no, $key, $times, $orderInfo) { // $times打印次数 $selfMessage = array( 'deviceNo' => $device_no, 'printContent' => $orderInfo, 'key' => $key, 'times' => $times ); $url = "http://open.printcenter.cn:8080/addOrder"; $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded ", 'method' => 'POST', 'content' => http_build_query($selfMessage), ), ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); return $result; } /** * @param $order_id * @return mixed * 订单商品详情 */ public function getOrderGoodsList($order_id) { $order_detail_list = OrderDetail::find()->alias('od') ->leftJoin(['g' => Goods::tableName()], 'od.goods_id=g.id') ->where([ 'od.is_delete' => 0, 'od.order_id' => $order_id, ])->select('od.*,g.name')->asArray()->all(); return $order_detail_list; } /** * 补齐空格 * 截取七个中文字符长度 */ private function r_str_pad($input, $n = 7) { $string = ""; $count = 0; $c_count = 0; for ($i = 0; $i < mb_strlen($input, 'UTF-8'); $i++) { $char = mb_substr($input, $i, 1, 'UTF-8'); $string .= $char; if (strlen($char) == 3) { $count += 2; $c_count++; } else { $count += 1; } if ($count >= $n * 2) { break; } } if ($count < $n * 2) { $string = str_pad($string, $n * 2 + $c_count); } return $string; } /** * 补齐空格 * 每n个中文字符长度为一个数组元素 */ private function r_str_pad_1($input, $n = 7) { $string = ""; $count = 0; $c_count = 0; $arr = array(); for ($i = 0; $i < mb_strlen($input, 'UTF-8'); $i++) { $char = mb_substr($input, $i, 1, 'UTF-8'); $string .= $char; if (strlen($char) == 3) { $count += 2; $c_count++; } else { $count += 1; } if ($count >= $n * 2) { $arr[] = $string; $string = ''; $count = 0; $c_count = 0; } } if ($count < $n * 2) { $string = str_pad($string, $n * 2 + $c_count); $arr[] = $string; } return $arr; } /** * 易联云打印机-k4 */ private function printer_2() { $big = [ 1 => [ 'start' => '', 'end' => '' ], 2 => [ 'start' => '', 'end' => '' ], 3 => [ 'start' => '', 'end' => '' ], ]; $start = $big[$this->setting->big]['start']; $end = $big[$this->setting->big]['end']; date_default_timezone_set("Asia/Shanghai"); $machine_code = $this->printer_setting['machine_code'];//终端编号 $key = $this->printer_setting['key'];//终端密钥 $client_id = $this->printer_setting['client_id'];//用户ID $client_key = $this->printer_setting['client_key'];//用户密钥 $time = $this->printer_setting['time'];//打印联数 // $order = Order::findOne(['id' => $this->order_id, 'is_delete' => 0]); $order = $this->order; $addtime = date('Y-m-d H:i:s', $order['addtime']); // $goods_list = $this->getOrderGoodsList($order->id); $goods_list = $this->goods_list; $print = new Yprint(); $content = "{$time}"; $content .= "
{$this->store->name}
\n"; $content .= "订单类型:{$this->extra['order_type']}\n"; $content .= "支付方式:{$this->extra['pay_type']}\n"; $isPay = $order['is_pay'] == 1 ? '已支付' : '未支付'; $content .= "支付状态:{$isPay}\n"; $content .= "发货方式:{$this->extra['send_type']}\n"; $content .= "订单号:{$order['order_no']}\n"; $content .= "下单时间:{$addtime}\n"; $content .= "--------------------------------\n"; if ($this->setting->is_attr == 0) { $content .= ""; foreach ($goods_list as $k => $v) { $price = round($v['total_price'] / $v['num'], 2); $v['name'] = str_replace(',', ',', $v['name']); $arr = $this->r_str_pad_1($v['name'], 8); foreach ($arr as $index => $value) { if ($index == 0) { $content .= ""; } else { $content .= ""; } } } $content .= "
名称数量单价
" . $value . "" . $v['num'] . "" . $price . "
" . $value . "
"; } else { /** * $content .= ""; * foreach ($goods_list as $k => $v) { * $attr = json_decode($v['attr'], true); * $attr_arr = []; * foreach ($attr as $i => $j) { * $attr_arr[] = $j['attr_group_name'] . $j['attr_name']; * } * $attr_str = implode(',', $attr_arr); * $attr_arr_1 = $this->r_str_pad_1($attr_str, 4); * $price = round($v['total_price'] / $v['num'], 2); * $v['name'] = str_replace(',', ',', $v['name']); * $arr = $this->r_str_pad_1($v['name'], 4); * $a = count($attr_arr_1) >= count($arr) ? $attr_arr_1 : $arr; * foreach ($a as $index => $value) { * $string = ""; * $string_1 = ""; * if (isset($arr[$index])) { * $string = $arr[$index]; * } * if (isset($attr_arr_1[$index])) { * if (!$string) { * $string = str_pad($string, 8); * } * $string_1 = $attr_arr_1[$index]; * } * if ($index == 0) { * $content .= ""; * } else { * $content .= ""; * } * } * } * $content .= "
名称规格数量单价
" . $string . "" . $string_1 . "" . $v['num'] . "" . $price . "
" . $string . "" . $string_1 . "
"; * */ $content .= ""; foreach ($goods_list as $k => $v) { $attr = json_decode($v['attr'], true); $attr_arr = []; foreach ($attr as $i => $j) { $attr_arr[] = $j['attr_group_name'] . $j['attr_name']; } $attr_str = implode(',', $attr_arr); $name = $v['name'] . '(' . $attr_str . ')'; $name_arr = $this->r_str_pad_1($name, 6); foreach ($name_arr as $index => $value) { if ($index == count($name_arr) - 1) { $content .= ""; } else { $content .= ""; } } } $content .= "
名称数量总价
" . $name_arr[$index] . "" . '×' . $v['num'] . "" . round($v['total_price'], 2) . "
" . $name_arr[$index] . "
"; } $content .= "--------------------------------\n"; if ($order['express_price']) { $content .= "运费:{$order['express_price']}元\n"; } $content .= "总计:{$order['total_price']}元\n"; if (isset($order['user_coupon_id'])) { $content .= "优惠券优惠:{$order['coupon_sub_price']}元\n"; } if (isset($order['integral'])) { $integral = json_decode($order['integral'], true); if ($integral['forehead'] != 0) { $content .= "积分抵扣:{$integral['forehead']}元\n"; } } if (isset($order['discount']) && $order['discount'] < 10) { $content .= "会员折扣:{$order['discount']}折\n"; } $content .= "实付:{$order['pay_price']}元\n"; if ($this->order_type != 3) { if ((isset($order['is_offline']) && $order['is_offline'] != 1) || (isset($order['offline']) && $order['offline'] != 2)) { $content .= "{$start}收货人:{$order['name']}\n"; $content .= "收货地址:{$order['address']}\n"; $content .= "收货人电话:{$order['mobile']}\n{$end}"; $content .= "--------------------------------\n"; } else { $content .= "{$start}联系人:{$order['name']}\n"; $content .= "联系人电话:{$order['mobile']}\n{$end}"; $content .= "--------------------------------\n"; $content .= "门店信息\n"; $content .= "{$this->order->shop->name}\n"; $content .= "{$this->order->shop->mobile}\n"; $content .= "{$this->order->shop->address}\n"; $content .= "--------------------------------\n"; } } if ($order['content']) { $content .= "备注:{$order['content']}\n"; } else { $orderForm = OrderForm::findAll([ 'order_id' => $this->order->id, 'store_id' => $this->store->id, 'is_delete' => 0 ]); if ($orderForm) { /* @var $orderForm OrderForm[] */ foreach ($orderForm as $item) { $content .= $item->key . ':' . $item->value . "\n"; } } } $result = $print->action_print($client_id, $machine_code, $content, $client_key, $key); $result = \Yii::$app->serializer->decode($result); switch ($result['state']) { case 1: return $result; break; case 2: throw new Exception('提交时间超时。验证你所提交的时间戳超过3分钟后拒绝接受', $result); break; case 3: throw new Exception('参数有误', $result); break; case 4: throw new Exception('sign加密验证失败', $result); break; default: throw new Exception('打印机设置错误', $result); break; } } /** * 补齐空格 * 截取$n个中文字符长度 */ private function r_mb_str($input, $n) { $string = ""; $count = 0; $c_count = 0; for ($i = 0; $i < mb_strlen($input, 'UTF-8'); $i++) { $char = mb_substr($input, $i, 1, 'UTF-8'); $string .= $char; if (strlen($char) == 3) { $count += 2; $c_count++; } else { $count += 1; } if ($count >= 2 * $n) { break; } } if ($count < 2 * $n) { $string = str_pad($string, 2 * $n + $c_count); } return $string; } //飞鹅打印机 public function printer_3() { $big = [ 1 => [ 'start' => '', 'end' => '' ], 2 => [ 'start' => '', 'end' => '' ], 3 => [ 'start' => '', 'end' => '' ], ]; $start = $big[$this->setting->big]['start']; $end = $big[$this->setting->big]['end']; date_default_timezone_set("Asia/Shanghai"); // $order = Order::findOne(['id' => $this->order_id, 'is_delete' => 0]); $order = $this->order; $addtime = date('Y-m-d H:i:s', $order['addtime']); // $goods_list = $this->getOrderGoodsList($order->id); $goods_list = $this->goods_list; $time = $this->printer_setting['time'];//打印联数 $content = ""; $content .= "{$this->store->name}
"; $content .= "订单类型:{$this->extra['order_type']}
"; $content .= "支付方式:{$this->extra['pay_type']}
"; $isPay = $order['is_pay'] == 1 ? '已支付' : '未支付'; $content .= "支付状态:{$isPay}
"; $content .= "发货方式:{$this->extra['send_type']}
"; $content .= "订单号:{$order['order_no']}
"; $content .= "下单时间:{$addtime}
"; if ($this->setting->is_attr == 0) { $content .= "--------------------------------
"; $content .= "名称      单价 数量 金额
"; $content .= "--------------------------------
"; // foreach ($goods_list as $k => $v) { // $price = round($v['total_price'] / $v['num'], 2); // $content .= $this->r_str_pad($v['name']) . " " . str_pad($price, 5) . " " . str_pad($v['num'], 4) . " " . round($v['total_price'], 2) . '
'; // } foreach ($goods_list as $k => $v) { $price = round($v['total_price'] / $v['num'], 2); $arr = $this->r_str_pad_1($v['name'], 7); foreach ($arr as $index => $value) { if ($index == 0) { $content .= $value . " " . str_pad($price, 5) . " " . str_pad($v['num'], 6) . " " . round($v['total_price'], 2) . '
'; } else { $content .= $value . '
'; } } } } else { /** * $content .= "--------------------------------
"; * $content .= "名称   规格  单价 数量 金额
"; * $content .= "--------------------------------
"; * foreach ($goods_list as $k => $v) { * $attr = json_decode($v['attr'], true); * $attr_arr = []; * foreach ($attr as $i => $j) { * $attr_arr[] = $j['attr_group_name'] . $j['attr_name']; * } * $attr_str = implode(',', $attr_arr); * $attr_arr_1 = $this->r_str_pad_1($attr_str, 4); * $price = round($v['total_price'] / $v['num'], 2); * $arr = $this->r_str_pad_1($v['name'], 4); * $a = count($attr_arr_1) >= count($arr) ? $attr_arr_1 : $arr; * foreach ($a as $index => $value) { * $string = ""; * $string_1 = ""; * if (isset($arr[$index])) { * $string = $arr[$index]; * } * if (isset($attr_arr_1[$index])) { * if (!$string) { * $string = str_pad($string, 8); * } * $string_1 = $attr_arr_1[$index]; * } * if ($index == 0) { * $content .= $string . " " . $string_1 . str_pad($price, 5) . " " . str_pad($v['num'], 3) . " " . round($v['total_price'], 2) . '
'; * } else { * $content .= $string . " " . $string_1 . '
'; * } * } * } * */ $content .= "--------------------------------
"; $content .= "名称 数量 金额
"; $content .= "--------------------------------
"; foreach ($goods_list as $k => $v) { $attr = json_decode($v['attr'], true); $attr_arr = []; foreach ($attr as $i => $j) { $attr_arr[] = $j['attr_group_name'] . $j['attr_name']; } $attr_str = implode(',', $attr_arr); $name = $v['name'] . '(' . $attr_str . ')'; $name_arr = $this->r_str_pad_1($name, 8); foreach ($name_arr as $index => $value) { if ($index == count($name_arr) - 1) { $content .= $name_arr[$index] . " " . str_pad('×' . $v['num'], 7) . " " . round($v['total_price'], 2) . "
"; } else { $content .= $name_arr[$index] . '
'; } } } } $content .= "--------------------------------
"; if ($order['express_price']) { $content .= "运费:{$order['express_price']}元
"; } $content .= "总计:{$order['total_price']}元
"; if (isset($order['user_coupon_id'])) { $content .= "优惠券优惠:{$order['coupon_sub_price']}元
"; } if (isset($order['integral'])) { $integral = json_decode($order['integral'], true); if ($integral['forehead'] != 0) { $content .= "积分抵扣:{$integral['forehead']}元
"; } } if (isset($order['discount']) && $order['discount'] < 10) { $content .= "会员折扣:{$order['discount']}折
"; } $content .= "实付:{$order['pay_price']}元
"; if ($this->order_type != 3) { if ((isset($order['is_offline']) && $order['is_offline'] != 1) || (isset($order['offline']) && $order['offline'] != 2)) { $content .= "{$start}收货人:{$order['name']}
"; $content .= "收货地址:{$order['address']}
"; $content .= "收货人电话:{$order['mobile']}
{$end}"; $content .= "--------------------------------
"; } else { $content .= "{$start}联系人:{$order['name']}
"; $content .= "联系人电话:{$order['mobile']}
{$end}"; $content .= "--------------------------------
"; $content .= "门店信息
"; $content .= "{$this->order->shop->name}
"; $content .= "{$this->order->shop->mobile}
"; $content .= "{$this->order->shop->address}
"; $content .= "--------------------------------
"; } } if ($order['content']) { $content .= "备注:{$order['content']}
"; } else { $orderForm = OrderForm::findAll([ 'order_id' => $this->order->id, 'store_id' => $this->store->id, 'is_delete' => 0 ]); if ($orderForm) { /* @var $orderForm OrderForm[] */ foreach ($orderForm as $item) { $content .= $item->key . ':' . $item->value . "
"; } } } \Yii::warning('飞鹅打印'); $resule = $this->wp_print($this->printer_setting['sn'], $content, $time); $resule = \Yii::$app->serializer->decode($resule); if ($resule['ret'] != 0) { throw new Exception($resule['msg'], $resule); } return $resule; }/* * 方法1 拼凑订单内容时可参考如下格式 根据打印纸张的宽度,自行调整内容的格式,可参考下面的样例格式 */ private function wp_print($printer_sn, $orderInfo, $times) { $user = $this->printer_setting['user']; $ukey = $this->printer_setting['ukey']; $time = time(); $ip = 'api.feieyun.cn'; $path = '/Api/Open/'; $content = array( 'user' => $user, 'stime' => $time, 'sig' => sha1($user . $ukey . $time), 'apiname' => 'Open_printMsg', 'sn' => $printer_sn, 'content' => $orderInfo, 'times' => $times//打印次数 ); $client = new FeieYun($ip, 80); if (!$client->post($path, $content)) { return 'error'; } else { //服务器返回的JSON字符串,建议要当做日志记录起来 return $client->getContent(); } } //秒杀商品详情 public function getMsOrderGoodsList() { $ms_goods = MsGoods::findOne(['id' => $this->order['goods_id']]); $list['name'] = $ms_goods->name; $list['total_price'] = $this->order['pay_price']; $list['num'] = $this->order['num']; $list['attr'] = $this->order['attr']; $new_list = []; array_push($new_list, $list); return $new_list; } //拼团商品详情 public function getPtOrderGoodsList() { $order_detail_list = PtOrderDetail::find()->alias('od') ->leftJoin(['g' => PtGoods::tableName()], 'od.goods_id=g.id') ->where(['od.is_delete' => 0, 'od.order_id' => $this->order['id']]) ->select(['od.*', 'g.name'])->asArray()->all(); return $order_detail_list; } //预约商品详情 public function getYyOrderGoodsList() { $order_detail_list = YyOrder::find()->alias('od') ->leftJoin(['g' => YyGoods::tableName()], 'od.goods_id = g.id') ->where(['od.is_delete' => 0, 'od.order_id' => $this->order['id']]) ->select(['od.*', 'g.name'])->asArray()->one(); $order_detail_list['num'] = 1; return [$order_detail_list]; } public function printer_4() { $big = $this->setting->big; $order = $this->order; $addtime = date('Y-m-d H:i:s', $order['addtime']); $goods_list = $this->goods_list; header("Content-Type: text/html;charset=utf-8"); $content = ""; $content .= "{$this->store->name}"; $content .= "订单类型:{$this->extra['order_type']}"; $content .= "支付方式:{$this->extra['pay_type']}"; $isPay = $order['is_pay'] == 1 ? '已支付' : '未支付'; $content .= "支付状态:{$isPay}"; $content .= "发货方式:{$this->extra['send_type']}"; $content .= "订单号:{$order['order_no']}"; $content .= "下单时间:{$addtime}"; if ($this->setting->is_attr == 0) { $content .= "--------------------------------"; $content .= "名称      单价 数量 金额"; $content .= "--------------------------------"; foreach ($goods_list as $k => $v) { $price = round($v['total_price'] / $v['num'], 2); $arr = $this->r_str_pad_1($v['name'], 7); foreach ($arr as $index => $value) { if ($index == 0) { $content .= $value . " " . str_pad($price, 5) . " " . str_pad($v['num'], 6) . " " . round($v['total_price'], 2) . ''; } else { $content .= $value . ''; } } } } else { $content .= "--------------------------------"; $content .= "名称 数量 金额 "; $content .= "--------------------------------"; foreach ($goods_list as $k => $v) { $attr = json_decode($v['attr'], true); $attr_arr = []; foreach ($attr as $i => $j) { $attr_arr[] = $j['attr_group_name'] . $j['attr_name']; } $attr_str = implode(',', $attr_arr); $name = $v['name'] . '(' . $attr_str . ')'; $name_arr = $this->r_str_pad_1($name, 8); foreach ($name_arr as $index => $value) { if ($index == count($name_arr) - 1) { $content .= $name_arr[$index] . " " . str_pad('×' . $v['num'], 7) . " " . round($v['total_price'], 2) . ""; } else { $content .= $name_arr[$index] . ''; } } } } $content .= "--------------------------------"; if ($order['express_price']) { $content .= "运费:{$order['express_price']}元"; } $content .= "总计:{$order['total_price']}元"; if (isset($order['user_coupon_id'])) { $content .= "优惠券优惠:{$order['coupon_sub_price']}元"; } if (isset($order['integral'])) { $integral = json_decode($order['integral'], true); if ($integral['forehead'] != 0) { $content .= "积分抵扣:{$integral['forehead']}元"; } } if (isset($order['discount']) && $order['discount'] < 10) { $content .= "会员折扣:{$order['discount']}折"; } $content .= "实付:{$order['pay_price']}元"; if ($this->order_type != 3) { if ((isset($order['is_offline']) && $order['is_offline'] != 1) || (isset($order['offline']) && $order['offline'] != 2)) { $content .= "收货人:{$order['name']}"; $content .= "收货地址:{$order['address']}"; $content .= "收货人电话:{$order['mobile']}"; $content .= "--------------------------------"; } else { $content .= "联系人:{$order['name']}"; $content .= "联系人电话:{$order['mobile']}"; $content .= "--------------------------------"; $content .= "门店信息"; $content .= "{$this->order->shop->name}"; $content .= "{$this->order->shop->mobile}"; $content .= "{$this->order->shop->address}"; $content .= "--------------------------------"; } } if ($order['content']) { $content .= "备注:{$order['content']}"; } else { $orderForm = OrderForm::findAll([ 'order_id' => $this->order->id, 'store_id' => $this->store->id, 'is_delete' => 0 ]); if ($orderForm) { /* @var $orderForm OrderForm[] */ foreach ($orderForm as $item) { $content .= $item->key . ':' . $item->value . ""; } } } $content .= ""; $res = $this->poscom($content); \Yii::warning($res); $res = \Yii::$app->serializer->decode($res); if ($res['code'] != 0) { throw new Exception($res['msg'], $res); } return $res; } public function poscom($msgDetail, $times = 1) { $reqTime = $this->getMillisecond(); $memberCode = $this->printer_setting['memberCode']; $deviceNo = $this->printer_setting['deviceNo']; $apiKey = $this->printer_setting['apiKey']; $orderNo = $this->order['order_no'] . '-' . $times . '-' . $this->print_type; $securityCode = md5($memberCode . $deviceNo . $orderNo . $reqTime . $apiKey); $url = 'http://api.poscom.cn/apisc/sendMsg'; $content['charset'] = 'UTF-8'; $content['reqTime'] = $reqTime; $content['memberCode'] = $memberCode; $content['deviceNo'] = $deviceNo; $content['securityCode'] = $securityCode; $content['msgDetail'] = $msgDetail; $content['msgNo'] = $orderNo; $content['mode'] = 2; $content['times'] = $this->printer_setting['time'] > 5 ? 5 : $this->printer_setting['time']; $res = $this->request_post($url, $content); return $res; } public function getMillisecond() { list($t1, $t2) = explode(' ', microtime()); return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000); } public function request_post($url = '', $post_data = array()) { if (empty($url) || empty($post_data)) { return false; } $postUrl = $url; $curlPost = $post_data; $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL, $postUrl);//抓取指定网页 curl_setopt($ch, CURLOPT_HEADER, 0);//设置header curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_POST, 1);//post提交方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); $data = curl_exec($ch);//运行curl curl_close($ch); return $data; } }