StatBookController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <?php
  2. namespace ghs\controllers;
  3. use biz\shop\classes\ShopExtClass;
  4. use bizGhs\book\classes\BookItemClass;
  5. use bizGhs\book\classes\BookItemCustomClass;
  6. use bizGhs\product\classes\ProductClass;
  7. use common\components\dateUtil;
  8. use common\components\printUtil;
  9. use common\components\stringUtil;
  10. use Yii;
  11. use common\components\util;
  12. class StatBookController extends BaseController
  13. {
  14. //导出库存分配 ssh 20240808
  15. public function actionExportStockAssign()
  16. {
  17. $mainId = $this->mainId ?? 0;
  18. $shop = $this->shop;
  19. $bookSn = $shop->bookSn ?? 0;
  20. if (empty($bookSn)) {
  21. util::fail('没有开启预订活动');
  22. }
  23. $productList = ProductClass::getAllByCondition(['mainId' => $mainId, 'stock>' => 0], null, '*', 'id');
  24. $bookItemRes = BookItemClass::getAllByCondition(['bookSn' => $bookSn], null, '*', null);
  25. if (empty($bookItemRes)) {
  26. util::fail('没有预订花材');
  27. }
  28. $bookItemCustomData = BookItemCustomClass::getAllByCondition(['bookSn' => $bookSn], null, '*');
  29. $bookItemCustomRes = [];
  30. if (!empty($bookItemCustomData)) {
  31. foreach ($bookItemCustomData as $bc) {
  32. $itemId = $bc['itemId'] ?? 0;
  33. $bookItemCustomRes[$itemId][] = $bc;
  34. }
  35. }
  36. $arr = [];
  37. foreach ($bookItemRes as $bookItemSingle) {
  38. $productId = $bookItemSingle['itemId'] ?? 0;
  39. $onNum = $bookItemSingle['onNum'] ?? 0;
  40. $currentProduct = $productList[$productId] ?? [];
  41. $stock = $currentProduct['stock'] ?? 0;
  42. $remainNum = $stock > $onNum ? bcsub($stock, $onNum) : 0;
  43. if (isset($bookItemCustomRes[$productId]) == false) {
  44. continue;
  45. }
  46. $currentBookItemCustom = $bookItemCustomRes[$productId];
  47. foreach ($currentBookItemCustom as $current) {
  48. $itemName = $current['name'] ?? '';
  49. $bookDataName = $current['customName'] ?? '';
  50. $seatSn = $current['seatSn'] ?? '';
  51. $bookNum = $current['bookNum'] ?? 0;
  52. $onNum = $current['onNum'] ?? 0;
  53. $roadNum = $current['roadNum'] ?? 0;
  54. $sub = bcsub($bookNum, $onNum);
  55. $wait = bcsub($sub, $roadNum);
  56. if ($remainNum <= 0) {
  57. continue;
  58. }
  59. $upNum = $remainNum >= $wait ? $wait : $remainNum;
  60. $enough = $remainNum >= $wait ? '√' : '';
  61. $remainNum = bcsub($remainNum, $upNum);
  62. $arr[] = [
  63. 'itemName' => $itemName,
  64. 'customName' => $bookDataName,
  65. 'seatSn' => $seatSn,
  66. 'bookNum' => $bookNum,
  67. 'onNum' => $onNum,
  68. 'roadNum' => $roadNum,
  69. 'wait' => $upNum,
  70. 'enough'=>$enough,
  71. ];
  72. }
  73. }
  74. if (empty($arr)) {
  75. util::fail('没有数据要导出');
  76. }
  77. $phpExcelFile = Yii::getAlias("@vendor/phpoffice/phpexcel/");
  78. require_once($phpExcelFile . 'Classes/PHPExcel.php');
  79. $objPHPExcel = new \PHPExcel();
  80. $objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
  81. ->setLastModifiedBy("Maarten Balliauw")
  82. ->setTitle("Office 2007 XLSX Document")
  83. ->setSubject("Office 2007 XLSX Document")
  84. ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
  85. ->setKeywords("office 2007 openxml php")
  86. ->setCategory("file");
  87. $ghsTitle = '供货商';
  88. $objPHPExcel->getActiveSheet()->getHeaderFooter()->setOddHeader(date('n月j日') . " " . $ghsTitle);
  89. $objPHPExcel->getActiveSheet()->getPageMargins()->setTop(0.7);
  90. $objPHPExcel->getActiveSheet()->getPageMargins()->setBottom(0.1);
  91. $objPHPExcel->getActiveSheet()->getPageMargins()->setLeft(0.5);
  92. $objPHPExcel->getActiveSheet()->getPageMargins()->setRight(0);
  93. $objPHPExcel->getActiveSheet()->getPageMargins()->setHeader(0.1);
  94. $objPHPExcel->getActiveSheet()->getPageMargins()->setFooter(0);
  95. $objPHPExcel->getActiveSheet()->setCellValue('A1', '名称');
  96. $objPHPExcel->getActiveSheet()->setCellValue('B1', '客户 / 货位');
  97. $objPHPExcel->getActiveSheet()->setCellValue('C1', '预订数');
  98. $objPHPExcel->getActiveSheet()->setCellValue('D1', '已上架');
  99. $objPHPExcel->getActiveSheet()->setCellValue('E1', '路上');
  100. $objPHPExcel->getActiveSheet()->setCellValue('F1', '要上架');
  101. $objPHPExcel->getActiveSheet()->setCellValue('G1', '');
  102. //设置宽度
  103. $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
  104. $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(18);
  105. //加粗
  106. $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(9)->setBold(true);
  107. $objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setSize(9)->setBold(true);
  108. $objPHPExcel->getActiveSheet()->getStyle('C1')->getFont()->setSize(9)->setBold(true);
  109. $objPHPExcel->getActiveSheet()->getStyle('D1')->getFont()->setSize(9)->setBold(true);
  110. $objPHPExcel->getActiveSheet()->getStyle('E1')->getFont()->setSize(9)->setBold(true);
  111. $objPHPExcel->getActiveSheet()->getStyle('F1')->getFont()->setSize(9)->setBold(true);
  112. $objPHPExcel->getActiveSheet()->getStyle('G1')->getFont()->setSize(9)->setBold(true);
  113. $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  114. $objPHPExcel->getActiveSheet()->getStyle('B1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  115. $objPHPExcel->getActiveSheet()->getStyle('C1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  116. $objPHPExcel->getActiveSheet()->getStyle('D1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  117. $objPHPExcel->getActiveSheet()->getStyle('E1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  118. $objPHPExcel->getActiveSheet()->getStyle('F1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  119. $objPHPExcel->getActiveSheet()->getStyle('G1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  120. $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
  121. $objPHPExcel->getActiveSheet()->getStyle('B1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
  122. $objPHPExcel->getActiveSheet()->getStyle('C1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
  123. $objPHPExcel->getActiveSheet()->getStyle('D1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
  124. $objPHPExcel->getActiveSheet()->getStyle('E1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
  125. $objPHPExcel->getActiveSheet()->getStyle('F1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
  126. $objPHPExcel->getActiveSheet()->getStyle('G1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
  127. $baseRow = 2;
  128. foreach ($arr as $key => $bookData) {
  129. $i = $baseRow + $key;
  130. $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, $bookData['itemName']);
  131. $customName = $bookData['seatSn'] == 0 ? $bookData['customName'] : $bookData['customName'].' / '.$bookData['seatSn'];
  132. $objPHPExcel->getActiveSheet()->setCellValue('B' . $i, $customName);
  133. $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, $bookData['bookNum']);
  134. $objPHPExcel->getActiveSheet()->setCellValue('D' . $i, $bookData['onNum']);
  135. $objPHPExcel->getActiveSheet()->setCellValue('E' . $i, $bookData['roadNum']);
  136. $objPHPExcel->getActiveSheet()->setCellValue('F' . $i, $bookData['wait']);
  137. $objPHPExcel->getActiveSheet()->setCellValue('G' . $i, $bookData['enough']);
  138. //居左
  139. $objPHPExcel->getActiveSheet()->getStyle('A' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  140. $objPHPExcel->getActiveSheet()->getStyle('B' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  141. $objPHPExcel->getActiveSheet()->getStyle('C' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  142. $objPHPExcel->getActiveSheet()->getStyle('D' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  143. $objPHPExcel->getActiveSheet()->getStyle('E' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  144. $objPHPExcel->getActiveSheet()->getStyle('F' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  145. $objPHPExcel->getActiveSheet()->getStyle('G' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  146. }
  147. $fileName = '库存分配-' . time();
  148. $objPHPExcel->getActiveSheet()->setTitle($fileName);
  149. $objPHPExcel->setActiveSheetIndex(0);
  150. $dir = './priceTable/' . $mainId;
  151. if (file_exists($dir) == false) {
  152. mkdir($dir, 0777, true);
  153. }
  154. $date = $fileName;
  155. $file = $date . '.xls';
  156. $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
  157. if (file_exists($dir . '/' . $file)) {
  158. unlink($dir . '/' . $file);
  159. }
  160. $objWriter->save($dir . '/' . $file);
  161. $fileUrl = Yii::$app->params['ghsHost'] . '/priceTable/' . $mainId . '/' . $file;
  162. util::success(['file' => $fileUrl, 'shortFile' => $file]);
  163. }
  164. public function actionList()
  165. {
  166. $get = Yii::$app->request->get();
  167. $where = [];
  168. $where['mainId'] = $this->mainId;
  169. $bookSn = $get['bookSn'] ?? '';
  170. $itemList = ProductClass::getAllByCondition(['mainId' => $this->mainId], null, 'id,stock', 'id', true);
  171. $list = BookItemClass::getAllByCondition($where, 'time DESC', '*');
  172. $table = [];
  173. if (!empty($list)) {
  174. foreach ($list as $key => $val) {
  175. $productId = $val['itemId'] ?? 0;
  176. $stock = 0;
  177. if (isset($itemList[$productId])) {
  178. $product = $itemList[$productId];
  179. $stock = $product->stock;
  180. }
  181. $stock = floatval($stock);
  182. $list[$key]['stock'] = $stock;
  183. $time = $val['time'];
  184. $shortTime = substr($time, 4, 4);
  185. $list[$key]['shortTime'] = $shortTime;
  186. $table[] = [
  187. 'shortTime' => $shortTime,
  188. 'name' => $val['name'],
  189. 'num' => $val['num'],
  190. 'stock' => $stock,
  191. 'remark' => '',
  192. ];
  193. }
  194. }
  195. $shop = $this->shop;
  196. $title = $shop->shopName == '首店' ? $shop->merchantName : $shop->merchantName . "({$shop->shopName})";
  197. $printData = [
  198. 'title' => "【{$title}】预订汇总",
  199. 'table' => $table,
  200. ];
  201. util::success(['list' => $list, 'printData' => $printData]);
  202. }
  203. //花材销量 ssh 20211021
  204. public function actionProfile()
  205. {
  206. $get = Yii::$app->request->get();
  207. $where = [];
  208. $where['mainId'] = $this->mainId;
  209. $bookSn = $get['bookSn'] ?? '';
  210. $staffId = $get['staffId'] ?? 0;
  211. $search = $get['search'] ?? '';
  212. $shop = $this->shop;
  213. if (empty($bookSn)) {
  214. $shop = $this->shop;
  215. $bookSn = $shop->bookSn ?? 0;
  216. if (empty($bookSn)) {
  217. util::success(['list' => [], 'shop' => $shop, 'hint' => 'no bookSn']);
  218. }
  219. }
  220. $where['bookSn'] = $bookSn;
  221. if (!empty($search)) {
  222. if (stringUtil::isLetter($search)) {
  223. $search = strtolower($search);
  224. $where['py'] = ['like', $search];
  225. } else {
  226. $where['name'] = ['like', $search];
  227. }
  228. }
  229. if (!empty($staffId)) {
  230. $where['cgStaffId'] = $staffId;
  231. }
  232. $list = BookItemClass::getAllByCondition($where, '(bookNum-onNum) DESC', '*');
  233. if (!empty($list)) {
  234. $ids = array_column($list, 'itemId');
  235. $productList = ProductClass::getAllByCondition(['id' => ['in', $ids]], null, '*', 'id', true);
  236. foreach ($list as $key => $val) {
  237. $productId = $val['itemId'] ?? 0;
  238. $onNum = $val['onNum'] ?? 0;
  239. $currentProduct = $productList[$productId] ?? [];
  240. $stock = $currentProduct->stock ?? 0;
  241. $remainNum = $stock > $onNum ? bcsub($stock, $onNum) : 0;
  242. $list[$key]['remainStockNum'] = $remainNum;
  243. }
  244. }
  245. util::success(['list' => $list, 'shop' => $shop]);
  246. }
  247. public function actionPrintOrder()
  248. {
  249. util::fail('开发中');
  250. $get = Yii::$app->request->get();
  251. $where = [];
  252. $where['mainId'] = $this->mainId;
  253. $searchTime = $get['searchTime'] ?? 'today';
  254. if (!empty($searchTime)) {
  255. $startTime = $get['startTime'] ?? '';
  256. $endTime = $get['endTime'] ?? '';
  257. $period = dateUtil::formatTime($searchTime, $startTime, $endTime, true);
  258. $where['time'] = ['between', [$period['startTime'], $period['endTime']]];
  259. }
  260. $list = BookItemClass::getAllByCondition($where, 'time DESC', '*');
  261. if (empty($list)) {
  262. util::fail('没有花材需要打印');
  263. }
  264. $shop = $this->shop;
  265. $num = count($list);
  266. $pageSize = 30;
  267. $ratio = ceil($num / $pageSize);
  268. if ($ratio > 1) {
  269. for ($i = 1; $i <= $ratio; $i++) {
  270. $offset = ($i - 1) * $pageSize;
  271. $current = array_slice($list, $offset, $pageSize);
  272. self::printOrder($current, $shop, $i);
  273. }
  274. } else {
  275. self::printOrder($list, $shop);
  276. }
  277. util::complete('打印成功');
  278. }
  279. public static function printOrder($list, $shop, $order = 0)
  280. {
  281. util::fail('开发中');
  282. $content = "<CB>预订汇总</CB><BR><BR>";
  283. if ($order > 0) {
  284. $content .= "<CB>第{$order}页</CB><BR><BR>";
  285. }
  286. $content .= '日期 / 花材 / 数量<BR>';
  287. $content .= '--------------------------------<BR>';
  288. foreach ($list as $item) {
  289. $date1 = $item['time'];
  290. $date2 = substr($date1, 4, 4);
  291. $name = $item['name'] ?? '';
  292. $num = $item['num'] ?? 0;
  293. $content .= $date2 . ' ' . $name . ' ' . $num . '<BR>';
  294. $content .= '--------------------------------<BR>';
  295. }
  296. $content .= "<BR><BR><BR>";
  297. $shopId = $shop->id ?? 0;
  298. $ext = ShopExtClass::getByCondition(['shopId' => $shopId]);
  299. $printSn = $ext['printSn'] ?? '';
  300. if (empty($printSn)) {
  301. util::fail('没有找到打印机');
  302. }
  303. $p = new printUtil($printSn);
  304. $p->printMsg($content, $shop);
  305. }
  306. }