StoreGoodsSku.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\store\model;
  11. use app\model\BaseModel;
  12. use app\model\goods\Goods;
  13. class StoreGoodsSku extends BaseModel
  14. {
  15. /**
  16. * 添加店铺sku
  17. * @param $data
  18. * @return array
  19. */
  20. public function addStoreGoodsSku($data)
  21. {
  22. $res = model('store_goods_sku')->add($data);
  23. //判断当前有没有store_goods
  24. $store_goods_info = model('store_goods')->getInfo([ [ 'goods_id', '=', $data[ 'goods_id' ] ], [ 'store_id', '=', $data[ 'store_id' ] ] ], 'id');
  25. if (empty($store_goods_info)) {
  26. $store_goods_data = [
  27. 'goods_id' => $data[ 'goods_id' ],
  28. 'store_id' => $data[ 'store_id' ],
  29. 'create_time' => time(),
  30. ];
  31. model('store_goods')->add($store_goods_data);
  32. }
  33. return $this->success($res);
  34. }
  35. /**
  36. * 获取门店商品sku详情
  37. * @param $condition
  38. * @param string $field
  39. * @return array
  40. */
  41. public function getStoreGoodsSkuInfo($condition, $field = '*')
  42. {
  43. $res = model('store_goods_sku')->getInfo($condition, $field);
  44. if (!empty($info)) {
  45. if (isset($info[ 'stock' ])) {
  46. $info[ 'stock' ] = numberFormat($info[ 'stock' ]);
  47. }
  48. if (isset($info[ 'sale_num' ])) {
  49. $info[ 'sale_num' ] = numberFormat($info[ 'sale_num' ]);
  50. }
  51. if (isset($info[ 'real_stock' ])) {
  52. $info[ 'real_stock' ] = numberFormat($info[ 'real_stock' ]);
  53. }
  54. }
  55. return $this->success($res);
  56. }
  57. /**
  58. * 增加库存
  59. * @param param
  60. */
  61. public function incStock($param)
  62. {
  63. $condition = array (
  64. [ 'store_id', '=', $param[ 'store_id' ] ],
  65. [ 'sku_id', '=', $param[ 'sku_id' ] ]
  66. );
  67. $num = $param[ 'stock' ];
  68. $store_sku_info = model('store_goods_sku')->getInfo($condition, 'id, goods_id');
  69. if (empty($store_sku_info))
  70. return $this->error(-1, "");
  71. //编辑sku库存
  72. $result = model('store_goods_sku')->setInc($condition, 'stock', $num);
  73. model('store_goods')->setInc([ [ 'goods_id', '=', $store_sku_info[ 'goods_id' ] ], [ 'store_id', '=', $param[ 'store_id' ] ] ], 'stock', $num);
  74. return $this->success($result);
  75. }
  76. /**
  77. * 减少库存
  78. * @param $param
  79. * @return array
  80. */
  81. public function decStock($param)
  82. {
  83. $condition = array (
  84. [ 'store_id', '=', $param[ 'store_id' ] ],
  85. [ 'sku_id', '=', $param[ 'sku_id' ] ]
  86. );
  87. $num = $param[ 'stock' ];
  88. $store_sku_info = model('store_goods_sku')->getInfo($condition, 'id, goods_id, stock');
  89. if (empty($store_sku_info)) {
  90. return $this->error(-1, '库存不足!');
  91. }
  92. $store_sku_info[ 'stock' ] = numberFormat($store_sku_info[ 'stock' ]);
  93. if (( $store_sku_info[ 'stock' ] - $num ) < 0) {
  94. return $this->error(-1, '库存不足!');
  95. }
  96. //编辑sku库存
  97. $result = model('store_goods_sku')->setDec($condition, 'stock', $num);
  98. model('store_goods')->setDec([ [ 'goods_id', '=', $store_sku_info[ 'goods_id' ] ], [ 'store_id', '=', $param[ 'store_id' ] ] ], 'stock', $num);
  99. return $this->success($result);
  100. }
  101. /**
  102. * 编辑门店商品库存信息
  103. * @param $goods_sku_array
  104. */
  105. public function editStock($store_goods_sku_array)
  106. {
  107. model('store_goods_sku')->startTrans();
  108. try {
  109. foreach ($store_goods_sku_array as $item) {
  110. $sku_info_result = $this->getStoreGoodsSkuInfo([ [ "store_id", "=", $item[ "store_id" ] ], [ "sku_id", "=", $item[ "sku_id" ] ] ], "sku_id");
  111. $sku_info = $sku_info_result[ "data" ];
  112. if (empty($sku_info)) {
  113. $sku_data = array (
  114. "goods_id" => $item[ "goods_id" ],
  115. "sku_id" => $item[ "sku_id" ],
  116. "store_id" => $item[ "store_id" ],
  117. );
  118. $this->addStoreGoodsSku($sku_data);
  119. }
  120. if ($item[ 'stock' ] > 0) {
  121. $item_result = $this->incStock($item);
  122. } else {
  123. $item[ 'stock' ] = abs($item[ 'stock' ]);
  124. $item_result = $this->decStock($item);
  125. }
  126. if ($item_result[ "code" ] < 0) {
  127. model('store_goods_sku')->rollback();
  128. return $item_result;
  129. }
  130. }
  131. model('store_goods_sku')->commit();
  132. return $this->success();
  133. } catch (\Exception $e) {
  134. model('store_goods_sku')->rollback();
  135. return $this->error($e->getMessage());
  136. }
  137. }
  138. /**
  139. * 门店库存批量修改(导入excel)
  140. * @param $param
  141. * @param $site_id
  142. * @return array
  143. */
  144. public function importStoreGoodsStock($param, $site_id, $store_id)
  145. {
  146. $PHPReader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
  147. //载入文件
  148. $PHPExcel = $PHPReader->load($param[ 'path' ]);
  149. //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
  150. $currentSheet = $PHPExcel->getSheet(0);
  151. //获取总行数
  152. $allRow = $currentSheet->getHighestRow();
  153. if ($allRow < 2) {
  154. return $this->error('', '导入了一个空文件');
  155. }
  156. //添加文件上传记录
  157. $error_num = 0;
  158. $data = [
  159. 'site_id' => $site_id,
  160. 'store_id' => $store_id,
  161. 'filename' => $param[ 'filename' ],
  162. 'path' => $param[ 'path' ],
  163. 'sku_num' => $allRow - 1,
  164. 'create_time' => time()
  165. ];
  166. $res = model('store_stock_import')->add($data);
  167. if (!$res) {
  168. return $this->error('', '上传文件失败');
  169. }
  170. model('store_stock_import')->startTrans();
  171. try {
  172. for ($i = 2; $i <= $allRow; $i++) {
  173. //商品id
  174. $goods_id = $PHPExcel->getActiveSheet()->getCell('A' . $i)->getValue();
  175. $goods_id = trim($goods_id, ' ');
  176. //商品名称
  177. $goods_name = $PHPExcel->getActiveSheet()->getCell('B' . $i)->getValue();
  178. $goods_name = trim($goods_name, ' ');
  179. //sku_id
  180. $sku_id = $PHPExcel->getActiveSheet()->getCell('C' . $i)->getValue();
  181. $sku_id = trim($sku_id, ' ');
  182. //sku名称
  183. $sku_name = $PHPExcel->getActiveSheet()->getCell('D' . $i)->getValue();
  184. $sku_name = trim($sku_name, ' ');
  185. //库存(增/减)
  186. $stock = $PHPExcel->getActiveSheet()->getCell('F' . $i)->getValue();
  187. $stock = trim($stock, ' ');
  188. if (empty($goods_id) || empty($sku_id) || empty($stock)) {
  189. $error_num += 1;
  190. model('store_stock_import')->update([ 'error_num' => $error_num ], [ [ 'id', '=', $res ] ]);
  191. //添加失败记录
  192. model('store_stock_import_log')->add(
  193. [
  194. 'store_id' => $store_id, 'file_id' => $res, 'goods_id' => $goods_id, 'goods_name' => $goods_name, 'sku_id' => $sku_id,
  195. 'sku_name' => $sku_name, 'stock' => $stock, 'status' => -1, 'reason' => '商品编号、sku编号或者库存为空'
  196. ]
  197. );
  198. continue;
  199. }
  200. $goods_model = new Goods();
  201. $sku_info = $goods_model->getGoodsSkuInfo([ [ 'sku_id', '=', $sku_id ], [ 'goods_id', '=', $goods_id ], [ 'site_id', '=', $site_id ] ]);
  202. if (empty($sku_info[ 'data' ])) {
  203. $error_num += 1;
  204. model('store_stock_import')->update([ 'error_num' => $error_num ], [ [ 'id', '=', $res ] ]);
  205. //添加失败记录
  206. model('store_stock_import_log')->add(
  207. [
  208. 'store_id' => $store_id, 'file_id' => $res, 'goods_id' => $goods_id, 'goods_name' => $goods_name, 'sku_id' => $sku_id,
  209. 'sku_name' => $sku_name, 'stock' => $stock, 'status' => -1, 'reason' => '商品不存在'
  210. ]
  211. );
  212. continue;
  213. }
  214. $sku_info_result = $this->getStoreGoodsSkuInfo([ [ "store_id", "=", $store_id ], [ "sku_id", "=", $sku_id ] ], "sku_id");
  215. $sku_info = $sku_info_result[ "data" ];
  216. if (empty($sku_info)) {
  217. $sku_data = array (
  218. "goods_id" => $goods_id,
  219. "sku_id" => $sku_id,
  220. "store_id" => $store_id,
  221. );
  222. $this->addStoreGoodsSku($sku_data);
  223. }
  224. $store_data = [
  225. 'store_id' => $store_id,
  226. 'sku_id' => $sku_id,
  227. 'stock' => $stock
  228. ];
  229. if ($stock > 0) {
  230. $item_result = $this->incStock($store_data);
  231. } else {
  232. $store_data[ 'stock' ] = abs($store_data[ 'stock' ]);
  233. $item_result = $this->decStock($store_data);
  234. }
  235. if ($item_result[ "code" ] < 0) {
  236. $error_num += 1;
  237. model('store_stock_import')->update([ 'error_num' => $error_num ], [ [ 'id', '=', $res ] ]);
  238. //添加失败记录
  239. model('store_stock_import_log')->add(
  240. [
  241. 'store_id' => $store_id, 'file_id' => $res, 'goods_id' => $goods_id, 'goods_name' => $goods_name, 'sku_id' => $sku_id,
  242. 'sku_name' => $sku_name, 'stock' => $stock, 'status' => -1, 'reason' => $item_result[ 'message' ]
  243. ]
  244. );
  245. continue;
  246. }
  247. //添加记录
  248. model('store_stock_import_log')->add(
  249. [
  250. 'store_id' => $store_id, 'file_id' => $res, 'goods_id' => $goods_id, 'goods_name' => $goods_name, 'sku_id' => $sku_id,
  251. 'sku_name' => $sku_name, 'stock' => $stock, 'status' => 0, 'reason' => ''
  252. ]
  253. );
  254. }
  255. model('store_stock_import')->commit();
  256. return $this->success();
  257. } catch (\Exception $e) {
  258. model('store_stock_import')->rollback();
  259. model('store_stock_import')->update([ 'error_num' => $allRow - 1 ], [ [ 'id', '=', $res ] ]);
  260. return $this->error('', $e->getMessage());
  261. }
  262. }
  263. /**
  264. * 核验门店库存是否足够
  265. * @param $params
  266. */
  267. public function checkStoreGoodsSkuStock($params)
  268. {
  269. $store_id = $params[ 'store_id' ];
  270. $goods_id = $params[ 'goods_id' ];
  271. $sku_id = $params[ 'sku_id' ];
  272. $site_id = $params[ 'site_id' ];
  273. $num = $params[ 'num' ];
  274. $sku_condition = array (
  275. [ 'goods_id', '=', $goods_id ],
  276. [ 'sku_id', '=', $sku_id ],
  277. [ 'store_id', '=', $store_id ],
  278. );
  279. $store_sku_info = model('store_goods_sku')->getInfo($sku_condition, 'stock');
  280. if (empty($store_sku_info)) {
  281. return $this->error(-1, '库存不足!');
  282. }
  283. $store_sku_info[ 'stock' ] = numberFormat($store_sku_info[ 'stock' ]);
  284. if (( $store_sku_info[ 'stock' ] - $num ) < 0) {
  285. return $this->error(-1, '库存不足!');
  286. }
  287. return $this->success();
  288. }
  289. }