ProductClass.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. <?php
  2. namespace bizGhs\product\classes;
  3. use biz\item\models\PtItemClass;
  4. use bizGhs\base\classes\BaseClass;
  5. use bizGhs\item\classes\ItemClass;
  6. use bizGhs\item\classes\ItemClassClass;
  7. use bizGhs\order\traits\OrderTrait;
  8. use common\components\imgUtil;
  9. use common\components\stringUtil;
  10. use common\components\util;
  11. use common\services\xhItemService;
  12. use Yii;
  13. use yii\di\ServiceLocator;
  14. class ProductClass extends BaseClass
  15. {
  16. use OrderTrait;
  17. public static $baseFile = '\bizGhs\product\models\Product';
  18. const PRICE_LABEL_AUTO = 1; //自动调价
  19. const PRICE_LABEL_CHANGE = 2; //改价
  20. const LOCK_STOCK = 'lock_stock';//修改库存锁
  21. const LOCK_PRICE = 'lock_price'; //改价锁
  22. const LOCK_CHECK_STOCK = 'lock_check_stock'; //判断库存
  23. //根据itemIds获取相应的花材信息
  24. public static function getProductInfoByItemIds(array $itemIds, $shopId)
  25. {
  26. $where = ['itemId' => ['in', $itemIds], 'delStatus' => 0, 'shopId' => $shopId];
  27. $data = self::getAllList('*', $where);
  28. $data = self::groupItemBaseInfo($data);
  29. return $data;
  30. }
  31. //根据花材ID,获取花材名称,图片
  32. public static function groupItemBaseInfo($list)
  33. {
  34. //取得itemIds
  35. $itemIds = array_column($list, 'itemId');
  36. //获取相应的图片,名称,py
  37. $where = ['id' => ['in', $itemIds]];
  38. $data = xhItemService::getAllByCondition($where, null, '*');
  39. if (!empty($data)) {
  40. $data = array_column($data, NULL, 'id');
  41. foreach ($list as $k => $v) {
  42. if (isset($data[$v['itemId']]['cover']) && !empty($data[$v['itemId']]['cover'])) {
  43. $cover = self::groupImg($data[$v['itemId']]['cover']);
  44. } else {
  45. //没有图片时取默认图片 ssh 2021.2.18
  46. $cover = imgUtil::getPrefix() . '/hhb_small.png';
  47. }
  48. $unitNum = $data[$v['itemId']]['ratio'] ?? 0;
  49. $stockInfo = self::formatStock($v['stock'], $unitNum);
  50. $list[$k]['cover'] = $cover;
  51. $list[$k]['bigNum'] = $stockInfo['bigNum'];
  52. $list[$k]['smallNum'] = $stockInfo['smallNum'];
  53. $list[$k]['itemName'] = $data[$v['itemId']]['name'] ?? '';
  54. $list[$k]['py'] = $data[$v['itemId']]['py'] ?? '';
  55. $list[$k]['ratio'] = $unitNum ?? 0;
  56. //换算大小单位对应价格
  57. $list[$k]['bigPrice'] = $v['price']; //大单位价格就是product表存的价格
  58. $smallPrice = 0;
  59. if ($unitNum) {
  60. $smallPrice = bcdiv($v['price'], $unitNum, 2);
  61. }
  62. $list[$k]['smallPrice'] = $smallPrice;
  63. $list[$k]['bigUnit'] = $data[$v['itemId']]['bigUnit'];
  64. $list[$k]['smallUnit'] = $data[$v['itemId']]['smallUnit'];
  65. }
  66. }
  67. return $list;
  68. }
  69. //获取详情 ruidian 2021.5.3
  70. public static function getItemInfo($id)
  71. {
  72. $info = self::getById($id);
  73. if (empty($info)) {
  74. return $info;
  75. }
  76. $list = self::groupProductInfo([$info]);
  77. return current($list);
  78. }
  79. //花材图片,名称,大小单位,小单位价格
  80. public static function groupProductInfo($list)
  81. {
  82. foreach ($list as $k => $v) {
  83. if ($v['cover']) {
  84. $cover = self::groupImg($v['cover']);
  85. } else {
  86. $cover = imgUtil::getPrefix() . '/hhb_small.png';
  87. }
  88. $ratio = $v['ratio'];
  89. $stockInfo = self::formatStock($v['stock'], $ratio);
  90. $list[$k]['cover'] = $cover;
  91. $list[$k]['bigNum'] = $stockInfo['bigNum'];
  92. $list[$k]['smallNum'] = $stockInfo['smallNum'];
  93. $list[$k]['itemName'] = $v['name'] ?? '';
  94. //换算大小单位对应价格
  95. $list[$k]['bigPrice'] = $v['price']; //大单位价格就是product表存的价格
  96. $smallPrice = 0;
  97. if ($ratio) {
  98. $smallPrice = bcdiv($v['price'], $ratio, 2);
  99. }
  100. $list[$k]['smallPrice'] = $smallPrice;
  101. }
  102. return $list;
  103. }
  104. //根据花材ID,库存=》 计算出多少扎,多少支
  105. public static function formatStockByItemId($itemId, $stock)
  106. {
  107. $unitNum = xhItemService::getItemUnitNum($itemId);
  108. return self::formatStock($stock, $unitNum);
  109. }
  110. //花材的库存转换: 库存是小数,根据各个花材的unitNum, 计算出多少扎,多少支
  111. public static function formatStock($stock, $unitNum)
  112. {
  113. $pn = true; //正数
  114. if ($stock < 0) {
  115. $pn = false;
  116. $stock = abs($stock);
  117. }
  118. $bigNum = floor($stock); // 扎
  119. $stockArr = explode('.', $stock);
  120. $smallNum = 0; //支
  121. if (count($stockArr) === 2) {
  122. $smallNum = bcmul(($stock - $bigNum), $unitNum);
  123. }
  124. if (!$pn) {
  125. $bigNum *= -1;
  126. $smallNum *= -1;
  127. }
  128. return [
  129. 'bigNum' => $bigNum,
  130. 'smallNum' => $smallNum,
  131. ];
  132. }
  133. /**
  134. * 根据 花材ID,将花材大小数量 换算成小数
  135. * @param $bigNum 大单位 数量
  136. * @param $smallNum 小单位 数量
  137. * @param $itemId 花材ID
  138. * @return string
  139. */
  140. public static function mergeItemNumByItemId($bigNum, $smallNum, $itemId)
  141. {
  142. $unitNum = xhItemService::getItemUnitNum($itemId);
  143. return self::mergeItemNum($bigNum, $smallNum, $unitNum);
  144. }
  145. //花材扎、支 合并转换 小数
  146. /**
  147. * @param $bigNum 大单位 数量
  148. * @param $smallNum 小单位 数量
  149. * @param $unitNum 花材比例
  150. * @return string
  151. */
  152. public static function mergeItemNum($bigNum, $smallNum, $unitNum)
  153. {
  154. $stockDecimal = 0;
  155. if ($unitNum > 0) {
  156. $stockDecimal = bcdiv($smallNum, $unitNum, 2);
  157. }
  158. $itemNum = bcadd($bigNum, $stockDecimal, 2);
  159. return $itemNum;
  160. }
  161. //获取常用的itemIds
  162. public static function getOftenItemIds($shopId)
  163. {
  164. $data = self::getLimitList("itemId", ['shopId' => $shopId], 10, 'actualSold desc');
  165. if ($data) {
  166. $data = array_column($data, 'itemId');
  167. }
  168. return $data;
  169. }
  170. //加库存,允许负库存,负数数量(盘点时)
  171. /**
  172. * @param $productId 门店下的花材ID(xhGhsItemInfo 主键ID)
  173. * @param $itemNumBundle 花材数量(扎)
  174. * @param $itemNumPiece 花材数量(支)
  175. * @return mixed
  176. */
  177. public static function addStock($productId, $itemNumBundle, $itemNumPiece)
  178. {
  179. $key = self::LOCK_STOCK . '_' . $productId;
  180. $lock = util::lock($key);
  181. if (!$lock) {
  182. util::fail("系统繁忙中,请稍后再试!");
  183. }
  184. $productData = self::getById($productId);
  185. if (!$productData) {
  186. util::unlock($key);
  187. util::fail("花材不存在");
  188. }
  189. // $itemId = $productData['itemId'];
  190. $ratio = $productData['ratio'];
  191. //转成小数,加库存
  192. $itemNum = self::mergeItemNum($itemNumBundle, $itemNumPiece, $ratio);
  193. $newStock = bcadd($productData['stock'], $itemNum, 2);
  194. self::updateStockById($productId, $newStock);
  195. util::unlock($key);
  196. return ['oldStock'=>$productData['stock'],'newStock'=>$newStock];
  197. }
  198. //todo 库存修改 加锁
  199. /**
  200. * 对商品ID 加库存
  201. * @param $productId 商品ID
  202. * @param $itemNum 数量
  203. * @return mixed
  204. */
  205. public static function addStockByItemNum($productId, $itemNum)
  206. {
  207. $key = self::LOCK_STOCK . '_' . $productId;
  208. $lock = util::lock($key);
  209. if (!$lock) {
  210. util::fail("系统繁忙中,请稍后再试!");
  211. }
  212. $productData = self::getById($productId, true);
  213. if (!$productData) {
  214. util::unlock($key);
  215. util::fail("花材不存在");
  216. }
  217. $newStock = bcadd($productData->stock, $itemNum, 2);
  218. self::updateStockById($productId, $newStock);
  219. util::unlock($key);
  220. return ['oldStock'=>$productData['stock'],'newStock'=>$newStock];
  221. }
  222. //减库存,允许负库存,负数数量(盘点时)
  223. //todo 库存修改 加锁
  224. /**
  225. * @param $productId 门店下的花材ID(xhGhsItemInfo 主键ID)
  226. * @param $itemNumBundle 花材数量(扎)
  227. * @param $itemNumPiece 花材数量(支)
  228. * @param $checkStock boolean 是否需要判断库存
  229. * @return mixed
  230. */
  231. public static function decreaseStock($productId, $itemNumBundle, $itemNumPiece,$checkStock=false)
  232. {
  233. $key = self::LOCK_STOCK . '_' . $productId;
  234. $lock = util::lock($key);
  235. if (!$lock) {
  236. util::fail("系统繁忙中,请稍后再试!");
  237. }
  238. $productData = self::getById($productId, true);
  239. if (!$productData) {
  240. util::unlock($key);
  241. util::fail("花材不存在");
  242. }
  243. $ratio = $productData->ratio;
  244. //转成小数,更新库存
  245. $itemNum = self::mergeItemNum($itemNumBundle, $itemNumPiece, $ratio);
  246. $newStock = bcsub($productData->stock, $itemNum, 2);
  247. if($checkStock && $newStock < 0){
  248. //需要判断库存是否充足
  249. util::unlock($key);
  250. util::fail("库存不足");
  251. }
  252. self::updateStockById($productId, $newStock);
  253. util::unlock($key);
  254. return ['oldStock'=>$productData['stock'],'newStock'=>$newStock];
  255. }
  256. //根据数量减库存
  257. //todo 库存修改 加锁
  258. /**
  259. * @param $productId
  260. * @param $itemNum
  261. * @return mixed 返回减之前的库存,和减之后的库存
  262. */
  263. public static function decreaseStockByItemNum($productId, $itemNum,$checkStock=false)
  264. {
  265. $key = self::LOCK_STOCK . '_' . $productId;
  266. $lock = util::lock($key);
  267. if (!$lock) {
  268. util::fail("系统繁忙中,请稍后再试!");
  269. }
  270. $productData = self::getById($productId);
  271. if (!$productData) {
  272. util::unlock($key);
  273. util::fail("花材不存在");
  274. }
  275. $newStock = bcsub($productData['stock'], $itemNum, 2);
  276. if($checkStock && $newStock < 0){
  277. //需要判断库存是否充足
  278. util::unlock($key);
  279. util::fail("库存不足");
  280. }
  281. self::updateStockById($productId, $newStock);
  282. util::unlock($key);
  283. return ['oldStock'=>$productData['stock'],'newStock'=>$newStock];
  284. }
  285. //计算价格
  286. /**
  287. * @param $productId 门店下的花材ID(xhGhsItemInfo 主键ID)
  288. * @param $bigNum 花材数量(扎)
  289. * @param $smallNum 花材数量(支)
  290. * @return float
  291. */
  292. public static function computedPrice($productId, $bigNum, $smallNum)
  293. {
  294. //获取itemId的价格
  295. $productData = self::getById($productId);
  296. if (!$productData) {
  297. util::fail("花材不存在");
  298. }
  299. $price = $productData['price'];
  300. $itemId = $productData['itemId'];
  301. $unitNum = xhItemService::getItemUnitNum($itemId);
  302. //换算出一支多少钱
  303. $piecePrice = 0;
  304. if ($unitNum > 0) {
  305. //有支
  306. $unitPrice = bcdiv($price, $unitNum, 2);
  307. $piecePrice = bcmul($unitPrice, $smallNum, 2);
  308. }
  309. $bundlePrice = bcmul($price, $bigNum, 2);
  310. $total = bcadd($bundlePrice, $piecePrice, 2);
  311. return $total;
  312. }
  313. //根据门店ID, 平台花材ID, 获取门店的花材ID
  314. public static function getGhsProductId($shopId, $itemId)
  315. {
  316. $data = self::getGhsProductDataByItemId($shopId, $itemId);
  317. if ($data) {
  318. return $data['id'];
  319. }
  320. return 0;
  321. }
  322. public static function getGhsProductDataByItemId($shopId, $itemId)
  323. {
  324. $where = [
  325. 'shopId' => $shopId,
  326. 'itemId' => $itemId,
  327. ];
  328. $data = self::getByCondition($where);
  329. return $data;
  330. }
  331. //根据多个itemIds shopId 获取对应的 productId linqh 2021.1.24
  332. public static function getGhsProductDataByItemIds($shopId, $itemIds)
  333. {
  334. $where = ['itemId' => ['in', $itemIds], 'shopId' => $shopId];
  335. $data = self::getAllByCondition($where, null, "*");
  336. return $data;
  337. }
  338. //补全itemId (针对入库时 当前门店下无对应的花材 itemId) linqh 2021.1.24
  339. public static function complementProduct($sjId, $shopId, $itemInfo)
  340. {
  341. $itemIds = array_column($itemInfo, "itemId");
  342. $itemData = array_column($itemInfo, null, "itemId");
  343. $productData = self::getGhsProductDataByItemIds($shopId, $itemIds);
  344. if (count($productData) !== count($itemIds)) {
  345. $productDataItemIds = array_column($productData, 'itemId');
  346. //取差集
  347. $diffItemIds = array_diff($itemIds, $productDataItemIds);
  348. if ($diffItemIds) {
  349. //新增到product表,price = itemPrice (出库时的售价), stock=0
  350. foreach ($diffItemIds as $v) {
  351. $addData = [];
  352. $addData['sjId'] = $sjId;
  353. $addData['shopId'] = $shopId;
  354. $addData['itemId'] = $v;
  355. $addData['price'] = $itemData[$v]['itemPrice'] ?? 0;
  356. self::add($addData);
  357. }
  358. }
  359. }
  360. }
  361. //有效花材判断,包括id有效、同个门店等 ssh 2021.1.19
  362. public static function valid($list, $shopId)
  363. {
  364. $ids = array_unique(array_filter(array_column($list, 'productId')));
  365. $productList = self::getByIds($ids, null, 'id');
  366. if (!empty($productList)) {
  367. foreach ($productList as $product) {
  368. if (isset($product['shopId']) == false || $product['shopId'] != $shopId) {
  369. util::fail('只能选择同一家的商品下单');
  370. }
  371. }
  372. if (count($productList) != count($ids)) {
  373. util::fail('存在无效商品');
  374. }
  375. } else {
  376. util::fail('商品不存在');
  377. }
  378. }
  379. //通过ids 批量获取花材商品的信息
  380. public static function getProductByIds($ids)
  381. {
  382. return self::getByIds($ids);
  383. }
  384. //修改花材商品的库存: 统一方法
  385. //todo 库存修改 加锁
  386. public static function updateStockById($id, $stock, $adminId = 0)
  387. {
  388. $data['stock'] = $stock;
  389. if ($adminId) {
  390. $data['adminId'] = $adminId;
  391. }
  392. $res = self::updateById($id, $data);
  393. return $res;
  394. }
  395. //订单退回库存
  396. public static function backStockByOrderItemInfo($orderItemInfo)
  397. {
  398. foreach ($orderItemInfo as $v) {
  399. ProductClass::addStockByItemNum($v['productId'], $v['itemNum']);
  400. }
  401. }
  402. //库存告警的itemIds (库存数量少于告警数量) linqh 2021.1.26
  403. public static function getItemIdsWarning($sjId, $shopId)
  404. {
  405. //获取当前门店下的 itemId=>stock
  406. $productData = ProductClass::getAllList("itemId,stock", ['shopId' => $shopId]);
  407. $productItemStock = [];
  408. if ($productData) {
  409. foreach ($productData as $v) {
  410. $productItemStock[$v['itemId']] = $v['stock'];
  411. }
  412. }
  413. //获取sjId 下 对应的itemId=>stockWaring
  414. $itemData = ItemClass::getAllList("itemId,stockWarning", ['sjId' => $sjId]);
  415. $itemStockWaring = [];
  416. if ($itemData) {
  417. foreach ($itemData as $v) {
  418. $itemStockWaring[$v['itemId']] = $v['stockWarning'];
  419. }
  420. }
  421. //取库存数量少于告警数量 的itemId
  422. $itemIds = [];
  423. foreach ($productItemStock as $k => $v) {
  424. $stockWaring = $itemStockWaring[$k] ?? 0;
  425. if ($v <= $stockWaring) {
  426. $itemIds[] = $k;
  427. }
  428. }
  429. return $itemIds;
  430. }
  431. //获取当前门店下商品信息 linqh 2021.1.28
  432. public static function getProductData($id, $shopId, $obj = false)
  433. {
  434. return ProductClass::getByCondition(['id' => $id, 'shopId' => $shopId], $obj);
  435. }
  436. //修改价格 linqh 2021.1.28
  437. public static function changePrice($id, $shopId, $price, $priceLabel)
  438. {
  439. $res = ProductClass::updateByCondition(['id' => $id, 'shopId' => $shopId], ['price' => $price, 'priceLabel' => $priceLabel]);
  440. return $res;
  441. }
  442. //下单时计算商品的价格 linqh 2021.1.28
  443. //itemInfo : [{"classId":5,"productId":3,"bigNum":1,"smallNum":2},{"classId":5,"productId":4,"bigNum":1,"smallNum":5}]
  444. //返回 [{"productId":3,"price":2.1}]
  445. public static function formatProductInfo(array $itemInfo)
  446. {
  447. $data = [];
  448. if (empty($itemInfo)) {
  449. util::fail('请选择花材');
  450. }
  451. $itemInfo = self::mergeItemInfo($itemInfo);
  452. $productIds = array_column($itemInfo, 'productId');
  453. $productData = ProductClass::getProductByIds($productIds);
  454. $productData = array_column($productData, NULL, 'id');
  455. $totalPrice = 0;
  456. $totalBigNum = 0;
  457. $totalSmallNum = 0;
  458. foreach ($itemInfo as $v) {
  459. $productId = $v['productId'];
  460. $itemId = $productData[$productId]['itemId'] ?? 0;
  461. $ratio = $productData[$productId]['ratio'] ?? 0;
  462. //大小数量合并多少扎
  463. $itemNum = self::mergeItemNum($v['bigNum'], $v['smallNum'], $ratio);
  464. //售卖价格
  465. $itemPrice = $productData[$productId]['price'] ?? 0;
  466. //合计价格
  467. $price = bcmul($itemNum, $itemPrice, 2);
  468. $tmp = [];
  469. $tmp['productId'] = $productId;
  470. $tmp['price'] = $price;
  471. $totalPrice = bcadd($totalPrice, $price, 2);
  472. $tmp['name'] = $productData[$productId]['name'] ?? '';
  473. $tmp['smallUnit'] = $productData[$productId]['smallUnit'];
  474. $tmp['bigUnit'] = $productData[$productId]['bigUnit'];
  475. $tmp['cover'] = $productData[$productId]['cover'] ?? '';
  476. $tmp['itemId'] = $itemId;
  477. $tmp['rank'] = $productData[$productId]['rank'] ?? '';
  478. $tmp['unitPrice'] = $itemPrice;
  479. $tmp['num'] = $itemNum;
  480. $tmp['bigNum'] = $v['bigNum'];
  481. $tmp['smallNum'] = $v['smallNum'];
  482. $totalBigNum += $v['bigNum'];
  483. $totalSmallNum += $v['smallNum'];
  484. $data[] = $tmp;
  485. }
  486. return ['product' => $data, 'smallNum' => $totalSmallNum, 'bigNum' => $totalBigNum, 'price' => $totalPrice];
  487. }
  488. // //修改某个花材的成本价(采购之后要用到) linqh 2021.04.06
  489. public static function changeCost($productId, $cost)
  490. {
  491. return self::updateById($productId, ['cost' => $cost]);
  492. }
  493. //更新某个花材的加价 2021.04.06
  494. public static function changeAddPrice($productId, $addPrice)
  495. {
  496. return self::updateById($productId, ['addPrice' => $addPrice]);
  497. }
  498. //根据productId 计算花材的重量
  499. public static function getWeight($productId, $bigNum, $smallNum)
  500. {
  501. $productInfo = self::getById($productId);
  502. if (empty($productInfo)) {
  503. return 0;
  504. }
  505. $ratio = $productInfo['ratio'];
  506. $weight = $productInfo['weight'];
  507. $mergeNum = self::mergeItemNum($bigNum, $smallNum, $ratio);
  508. return bcmul($mergeNum, $weight, 2);
  509. }
  510. //修改product
  511. public static function updateProduct($data)
  512. {
  513. $id = $data['id'] ?? 0;
  514. $model = self::getById($id);
  515. if (!$model) {
  516. util::fail("该花材不存在");
  517. }
  518. $upData = [];
  519. if (isset($data['name'])) {
  520. if (empty($data['name'])) {
  521. util::fail("请输入花材名称");
  522. }
  523. $upData['name'] = $data['name'];
  524. $py = stringUtil::py($data['name']);
  525. $upData['py'] = $py;
  526. }
  527. if (isset($data['cover'])) {
  528. if (empty($data['cover'])) {
  529. util::fail("请输入花材图片");
  530. }
  531. $upData['cover'] = $data['cover'];
  532. }
  533. // if (isset($data['alias'])) {
  534. // if (empty($data['alias'])) {
  535. // util::fail("请输入花材别名");
  536. // }
  537. // $upData['alias'] = $data['alias'];
  538. // }
  539. if (isset($data['cost'])) {
  540. if (empty($data['cost'])) {
  541. util::fail("请输入花材成本价");
  542. }
  543. $upData['cost'] = $data['cost'];
  544. }
  545. if (isset($data['ratio'])) {
  546. if (empty($data['ratio'])) {
  547. util::fail("请输入花材比例");
  548. }
  549. $upData['ratio'] = $data['ratio'];
  550. }
  551. if (isset($data['weight'])) {
  552. $upData['weight'] = $data['weight'];
  553. }
  554. if (isset($data['addPrice'])) {
  555. $upData['addPrice'] = $data['addPrice'];
  556. }
  557. if (isset($data['stockWarning'])) {
  558. $upData['stockWarning'] = $data['stockWarning'];
  559. }
  560. if (isset($data['bigUnit'])) {
  561. if (empty($data['bigUnit'])) {
  562. util::fail("请输入花材大单位");
  563. }
  564. $upData['bigUnit'] = $data['bigUnit'];
  565. }
  566. if (isset($data['smallUnit'])) {
  567. if (empty($data['smallUnit'])) {
  568. util::fail("请输入花材小单位");
  569. }
  570. $upData['smallUnit'] = $data['smallUnit'];
  571. }
  572. if (isset($data['inTurn'])) {
  573. $upData['inTurn'] = $data['inTurn'];
  574. }
  575. //分类ID
  576. if (isset($data["classId"])) {
  577. $classId = $data['classId'];
  578. ItemClassClass::valid($classId, $model['sjId']);
  579. $upData['classId'] = $classId;
  580. }
  581. unset($data['id']);
  582. if (empty($upData)) {
  583. util::fail("参数错误");
  584. }
  585. self::updateById($id, $upData);
  586. }
  587. //自动改价 2021.4.14
  588. public static function autoPriceById($productId)
  589. {
  590. $product = self::getById($productId);
  591. if ($product && $product['priceLabel'] == self::PRICE_LABEL_AUTO) {
  592. $price = bcadd($product['cost'], $product['addPrice'], 2);
  593. self::changePrice($productId, $product['shopId'], $price, self::PRICE_LABEL_AUTO);
  594. }
  595. }
  596. //获取当前门店下所有的product
  597. public static function getAllProduct($sjId, $shopId, $field = "*")
  598. {
  599. $where = [
  600. 'sjId' => $sjId,
  601. 'shopId' => $shopId,
  602. ];
  603. return self::getAllByCondition($where, null, $field);
  604. }
  605. //获取当前门店下所有花材的库存数量,及成本价,库存预警的花材数量 linqh 2021-04-20
  606. public static function getProductStockByShopId($sjId, $shopId)
  607. {
  608. $productInfo = self::getAllProduct($sjId, $shopId, "*");
  609. $data = [
  610. 'stockBigNum' => 0,
  611. 'stockSmallNum' => 0,
  612. 'stockCost' => 0,
  613. 'stockWarning' => 0,
  614. ];
  615. if ($productInfo) {
  616. foreach ($productInfo as $v) {
  617. $stock = self::formatStock($v['stock'], $v['ratio']);
  618. $data['stockBigNum'] = bcadd($data['stockBigNum'], $stock['bigNum']);
  619. $data['stockSmallNum'] = bcadd($data['stockSmallNum'], $stock['smallNum']);
  620. $data['stockCost'] = bcadd($data['stockCost'], bcmul($v['stock'], $v['cost'], 2), 2);
  621. if ($v['stock'] <= $v['stockWarning']) {
  622. $data['stockWarning']++;
  623. }
  624. }
  625. }
  626. return $data;
  627. }
  628. //补className
  629. public static function groupClassName($sjId, $data)
  630. {
  631. //补className
  632. //获取当前商家下所有itemId=>classId
  633. $itemInfo = ItemClass::getGhsItemAll($sjId, "itemId,classId");
  634. $itemClassMap = [];
  635. foreach ($itemInfo as $v) {
  636. $itemClassMap[$v['itemId']] = $v['classId'];
  637. }
  638. //获取classId=>name
  639. $itemClassInfo = ItemClassClass::getAll($sjId, "id,name");
  640. $classNameMap = [];
  641. foreach ($itemClassInfo as $v) {
  642. $classNameMap[$v['id']] = $v['name'];
  643. }
  644. foreach ($data as $k => $v) {
  645. $itemId = $v['itemId'];
  646. $classId = $itemClassMap[$itemId] ?? 0;
  647. $className = $classNameMap[$classId] ?? '';
  648. $v['className'] = $className;
  649. $data[$k] = $v;
  650. }
  651. return $data;
  652. }
  653. //供货商的productId => 零售端的productId ,不存在的补productId(放在默认分类)
  654. //productList [{"productId":"113","bigNum":1,"smallNum":0,"classId":"-2","itemId":1}]
  655. public static function toggleProductList($productList, $hdShopId, $hdSjId)
  656. {
  657. $itemIds = array_column($productList, "itemId");
  658. $hdProductData = self::getProductInfoByItemIds($itemIds, $hdShopId);
  659. $hdProductData = array_column($hdProductData, null, "itemId");
  660. //获取默认分类ID
  661. $defaultClassId = ItemClassClass::getDefaultClassId($hdSjId);
  662. foreach ($productList as $k => $v) {
  663. $itemId = $v['itemId'] ?? 0;
  664. if (!isset($hdProductData[$itemId])) {
  665. //不存在,则新增
  666. //获取ptItem信息,写入product
  667. $ptItem = \biz\item\classes\PtItemClass::getById($itemId);
  668. unset($ptItem['addTime']);
  669. unset($ptItem['updateTime']);
  670. $productData = $ptItem;
  671. $productData['sjId'] = $hdSjId;
  672. $productData['shopId'] = $hdShopId;
  673. $productData['itemId'] = $itemId;
  674. $productData['classId'] = $defaultClassId;
  675. unset($productData['id']);
  676. $productData['rank'] = 'A';
  677. //计算价格
  678. $cost = $v['cost'] ?? 0;
  679. $addPrice = $v['addPrice'] ?? 0;
  680. $productData['price'] = bcadd($cost, $addPrice, 2);
  681. $addProduct = ProductClass::add($productData);
  682. $hdProductId = $addProduct['id'];
  683. } else {
  684. $hdProductId = $hdProductData[$itemId]['id'];
  685. }
  686. $productList[$k]['hdProductId'] = $hdProductId;
  687. }
  688. return $productList;
  689. }
  690. //供货商、零售端新开门店时,初始化花材
  691. public static function newShopInitProduct($sjId,$shopId,$newShopId,$adminId)
  692. {
  693. $product = self::getAllProduct($sjId, $shopId, "name,cover,classId,itemId,rank,price,priceLabel,cost,addPrice,stockWarning,weight,alias,py,ratio,bigUnit,smallUnit,bigUnitId,smallUnitId,inTurn");
  694. $productData = [];
  695. foreach ($product as $v) {
  696. $tmp = $v;
  697. $tmp['sjId'] = $sjId;
  698. $tmp['shopId'] = $newShopId;
  699. $tmp['adminId'] = $adminId;
  700. $productData[] = $tmp;
  701. }
  702. self::batchAdd($productData);
  703. }
  704. }