printUtil.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <?php
  2. namespace common\components;
  3. use biz\shop\classes\ShopAdminClass;
  4. use Yii;
  5. use yii\helpers\Json;
  6. use linslin\yii2\curl;
  7. class printUtil
  8. {
  9. public $access_token;
  10. public $user = 'shish@zhhinc.com', $uKey = 'Du4uwgvtAVmcEzbP', $sn, $times = 1;
  11. const IP = 'api.feieyun.cn'; //接口IP或域名
  12. const PORT = 80; //接口IP端口
  13. const PATH = '/Api/Open/'; //接口路径
  14. public function __construct($sn)
  15. {
  16. header("Content-type: text/html; charset=utf-8");
  17. $fei = Yii::getAlias("@vendor/feie");
  18. require_once($fei . '/HttpClient.class.php');
  19. $this->sn = $sn;
  20. }
  21. public function printLabelMsg($content)
  22. {
  23. $time = time(); //请求时间
  24. $msgInfo = array(
  25. 'user' => $this->user,
  26. 'stime' => $time,
  27. 'sig' => $this->signature($time),
  28. 'apiname' => 'Open_printLabelMsg',
  29. 'sn' => $this->sn,
  30. 'content' => $content,
  31. 'times' => $this->times//打印次数
  32. );
  33. try {
  34. $client = new \HttpClient(self::IP, self::PORT);
  35. $client->useGzip(false); //禁用 Gzip
  36. $rs = $client->post(self::PATH, $msgInfo);
  37. //服务器返回的JSON字符串,建议要当做日志记录起来
  38. $result = $client->getContent();
  39. //echo $result;
  40. } catch (\Exception $e) {
  41. Yii::error('打印日志哈:' . $e->getMessage());
  42. noticeUtil::push("出现打印标签,内容:{$content},原因:" . $e->getMessage(), '15280215347');
  43. return;
  44. }
  45. if (!$rs) {
  46. //echo 'error';
  47. } else {
  48. //服务器返回的JSON字符串,建议要当做日志记录起来
  49. $result = $client->getContent();
  50. //echo $result;
  51. }
  52. }
  53. /**
  54. * 打印订单
  55. *
  56. * @param array|null $logMeta 打印日志上下文:mainId、orderId、orderSn、printSn、writeLog
  57. */
  58. public function printMsg($content, $shop = null, $orderSn = '', $logMeta = null)
  59. {
  60. $contentLength = strlen($content);
  61. if ($contentLength > 5000) {
  62. $contents = explode("<BR>", $content);
  63. $newContent = '';
  64. foreach ($contents as $line) {
  65. if (strlen($newContent . $line . "<BR>") > 5000) {
  66. $this->doPrint($newContent, $shop, $orderSn, $logMeta);
  67. $newContent = $line . "<BR>";
  68. } else {
  69. $newContent .= $line . "<BR>";
  70. }
  71. }
  72. if (!empty($newContent)) {
  73. $this->doPrint($newContent, $shop, $orderSn, $logMeta);
  74. }
  75. } else {
  76. $this->doPrint($content, $shop, $orderSn, $logMeta);
  77. }
  78. }
  79. /**
  80. * 飞鹅打印回调地址
  81. */
  82. protected function getCallbackUrl()
  83. {
  84. $host = Yii::$app->params['ghsHost'] ?? '';
  85. return rtrim($host, '/') . '/feieyun/call-back';
  86. }
  87. private function doPrint($content, $shop = null, $orderSn = '', $logMeta = null)
  88. {
  89. $time = time(); //请求时间
  90. $msgInfo = array(
  91. 'user' => $this->user,
  92. 'stime' => $time,
  93. 'sig' => $this->signature($time),
  94. 'apiname' => 'Open_printMsg',
  95. 'sn' => $this->sn,
  96. 'content' => $content,
  97. 'times' => $this->times//打印次数
  98. );
  99. // 写入打印日志时需要带回调地址
  100. if (!empty($logMeta['writeLog'])) {
  101. $msgInfo['backurl'] = $this->getCallbackUrl();
  102. }
  103. try {
  104. $client = new \HttpClient(self::IP, self::PORT);
  105. $client->useGzip(false); // 禁用 Gzip
  106. $rs = $client->post(self::PATH, $msgInfo);
  107. } catch (\Exception $e) {
  108. Yii::error('打印日志呢:' . $e->getMessage());
  109. noticeUtil::push($shop->merchantName . $shop->shopName . " 出现订单打印未成功,订单号:{$orderSn},原因:" . $e->getMessage(), '15280215347');
  110. return;
  111. }
  112. if (!$rs) {
  113. //echo 'error';
  114. } else {
  115. //服务器返回的JSON字符串,建议要当做日志记录起来
  116. $result = $client->getContent();
  117. Yii::info('打印日志吧:' . $result);
  118. $arr = json_decode($result, true);
  119. if (isset($arr['ret']) && intval($arr['ret']) === 0 && !empty($arr['data']) && !empty($logMeta['writeLog'])) {
  120. feiePrintLogUtil::appendPending(
  121. $logMeta['mainId'] ?? 0,
  122. $logMeta['orderId'] ?? 0,
  123. $logMeta['orderSn'] ?? $orderSn,
  124. $logMeta['printSn'] ?? $this->sn,
  125. $arr['data']
  126. );
  127. }
  128. if (isset($arr['ret']) && $arr['ret'] == 1001) {
  129. $msg = $arr['msg'] ?? '';
  130. $sjName = $shop->merchantName ?? '';
  131. $mainId = $shop->mainId ?? 0;
  132. $shopName = $shop->shopName ?? '';
  133. noticeUtil::push($sjName . $shopName . " 出现订单打印未成功,订单号:{$orderSn},原因:" . $msg, '15280215347');
  134. $staffList = ShopAdminClass::getAllByCondition(['mainId' => $mainId], null, '*', null, true);
  135. if (!empty($staffList)) {
  136. foreach ($staffList as $staff) {
  137. $remind = $staff->remind ?? 0;
  138. $isPt = $staff->isPt ?? 0;
  139. $delStatus = $staff->delStatus ?? 0;
  140. if ($isPt == 0 && $remind == 1 && $delStatus == 0) {
  141. // $mobile = $staff->mobile ?? '';
  142. // sms::send($mobile . ',' . $shopName, '请注意,您有一个订单花材很多,小票没有打出来。门店:{$var}');
  143. // noticeUtil::push('已经通知手机号:' . $mobile, '15280215347');
  144. }
  145. }
  146. }
  147. }
  148. }
  149. }
  150. public function signature($time)
  151. {
  152. return sha1($this->user . $this->uKey . $time);//公共参数,请求公钥
  153. }
  154. //批量添加打印机 ssh 20210712
  155. public function addPrint($key, $shopName)
  156. {
  157. $printerContent = "sn{$this->sn}#{$key}#{$shopName}";
  158. $time = time(); //请求时间
  159. $msgInfo = array(
  160. 'user' => $this->user,
  161. 'stime' => $time,
  162. 'sig' => $this->signature($time),
  163. 'apiname' => 'Open_printerAddlist',
  164. 'printerContent' => $printerContent
  165. );
  166. $client = new \HttpClient(self::IP, self::PORT);
  167. if (!$client->post(self::PATH, $msgInfo)) {
  168. return false;
  169. }
  170. $content = $client->getContent();
  171. $respond = json_decode($content, true);
  172. if (isset($respond['data']['ok']) && !empty($respond['data']['ok'])) {
  173. return true;
  174. }
  175. $no = $respond['data']['no'][0] ?? '';
  176. if (strstr($no, "已被添加过")) {
  177. return true;
  178. }
  179. return false;
  180. }
  181. //查询打印机状态 ssh 20210714
  182. public function queryPrinterStatus($sn)
  183. {
  184. $time = time(); //请求时间
  185. $msgInfo = array(
  186. 'user' => $this->user,
  187. 'stime' => $time,
  188. 'sig' => $this->signature($time),
  189. 'apiname' => 'Open_queryPrinterStatus',
  190. 'sn' => $sn
  191. );
  192. $client = new \HttpClient(self::IP, self::PORT);
  193. if (!$client->post(self::PATH, $msgInfo)) {
  194. echo 'error';
  195. }
  196. $client->getContent();
  197. }
  198. //飞鹅自带函数 ssh 20220601
  199. public function bar_code($strnum)
  200. {
  201. $chr = '';
  202. $codeB = array("\x30", "\x31", "\x32", "\x33", "\x34", "\x35", "\x36", "\x37", "\x38", "\x39");//匹配字符集B
  203. $codeC = array("\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\x09", "\x0A", "\x0B", "\x0C", "\x0D", "\x0E", "\x0F", "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", "\x18", "\x19", "\x1A", "\x1B", "\x1C", "\x1D", "\x1E", "\x1F", "\x20", "\x21", "\x22", "\x23", "\x24", "\x25", "\x26", "\x27", "\x28", "\x29", "\x2A", "\x2B", "\x2C", "\x2D", "\x2E", "\x2F", "\x30", "\x31", "\x32", "\x33", "\x34", "\x35", "\x36", "\x37", "\x38", "\x39", "\x3A", "\x3B", "\x3C", "\x3D", "\x3E", "\x3F", "\x40", "\x41", "\x42", "\x43", "\x44", "\x45", "\x46", "\x47", "\x48", "\x49", "\x4A", "\x4B", "\x4C", "\x4D", "\x4E", "\x4F", "\x50", "\x51", "\x52", "\x53", "\x54", "\x55", "\x56", "\x57", "\x58", "\x59", "\x5A", "\x5B", "\x5C", "\x5D", "\x5E", "\x5F", "\x60", "\x61", "\x62", "\x63");//匹配字符集C
  204. $length = strlen($strnum);
  205. $b = array();
  206. $b[0] = "\x1b";
  207. $b[1] = "\x64";
  208. $b[2] = "\x02";
  209. $b[3] = "\x1d";
  210. $b[4] = "\x48";
  211. $b[5] = "\x32";//条形码显示控制,\x32上图下字,\x31上字下图,\x30只显示条形码
  212. $b[6] = "\x1d";
  213. $b[7] = "\x68";
  214. $b[8] = "\x50";// \x30 设置条形码高度,7F是最大的高度
  215. $b[9] = "\x1d";
  216. $b[10] = "\x77";
  217. $b[11] = "\x02";// \x01 设置条形码宽度,1-6
  218. $b[12] = "\x1d";
  219. $b[13] = "\x6b";
  220. $b[14] = "\x49";//选择条形码类型code128,code39,codabar等等
  221. $b[15] = chr($length + 2);
  222. $b[16] = "\x7b";
  223. $b[17] = "\x42";//选择字符集
  224. if ($length > 14 && is_numeric($strnum)) {//大于14个字符,且为纯数字的进来这个区间
  225. $b[17] = "\x43";
  226. $j = 0;
  227. $key = 18;
  228. $ss = $length / 2;//初始化数组长度
  229. if ($length % 2 == 1) {//判断条形码为单数
  230. $ss = $ss - 0.5;
  231. }
  232. for ($i = 0; $i < $ss; $i++) {
  233. $temp = substr($strnum, $j, 2);
  234. $iindex = intval($temp);
  235. $j = $j + 2;
  236. if ($iindex == 0) {
  237. $chr = '';
  238. if ($b[$key + $i - 1] == '0' && $b[$key + $i - 2] == '0') {//判断前面的为字符集B,此时不需要转换字符集
  239. $b[$key + $i] = $codeB[0];
  240. $b[$key + $i + 1] = $codeB[0];
  241. $key += 1;
  242. } else {
  243. if ($b[$key + $i - 1] == 'C' && $b[$key + $i - 2] == '{') {//判断前面的为字符集C时转换字符集B
  244. $b[$key + $i - 2] = "\x7b";
  245. $b[$key + $i - 1] = "\x42";
  246. $b[$key + $i] = $codeB[0];
  247. $b[$key + $i + 1] = $codeB[0];
  248. $key += 1;
  249. } else {
  250. $b[$key + $i] = "\x7b";
  251. $b[$key + $i + 1] = "\x42";
  252. $b[$key + $i + 2] = $codeB[0];
  253. $b[$key + $i + 3] = $codeB[0];
  254. $key += 3;
  255. }
  256. }
  257. } else {
  258. if ($b[$key + $i - 1] == '0' && $b[$key + $i - 2] == '0' && $chr != 'chr') {//判断前面的为字符集B,此时要转换字符集C
  259. $b[$key + $i] = "\x7b";
  260. $b[$key + $i + 1] = "\x43";
  261. $b[$key + $i + 2] = $codeC[$iindex];
  262. $key += 2;
  263. } else {
  264. $chr = '';
  265. $b[$key + $i] = $codeC[$iindex];
  266. if ($iindex == 48) $chr = 'chr';//判断chr(48)等于0的情况
  267. }
  268. }
  269. }
  270. @$lastkey = end(array_keys($b));//取得数组的最后一个元素的键
  271. if ($length % 2 > 0) {
  272. $lastnum = substr($strnum, -1);//取得字符串的最后一个数字
  273. if ($b[$lastkey] == '0' && $b[$lastkey - 1] == '0') {//判断前面的为字符集B,此时不需要转换字符集
  274. $b[$lastkey + 1] = $codeB[$lastnum];
  275. } else {
  276. $b[$lastkey + 1] = "\x7b";
  277. $b[$lastkey + 2] = "\x42";
  278. $b[$lastkey + 3] = $codeB[$lastnum];
  279. }
  280. }
  281. @$b[15] = chr(end(array_keys($b)) - 15);//得出条形码长度
  282. $str = implode("", $b);
  283. } else {//1-14个字符的纯数字和非纯数字的条形码进来这个区间,支持数字,大小写字母,特殊字符例如: !@#$%^&*()-=+_
  284. $str = "\x1b\x64\x02\x1d\x48\x32\x1d\x68\x50\x1d\x77\x02\x1d\x6b\x49" . chr($length + 2) . "\x7b\x42" . $strnum;
  285. }
  286. return $str;
  287. }
  288. }