OrderGoodsClass.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. <?php
  2. namespace bizHd\order\classes;
  3. use biz\stock\classes\GoodsStockRecordClass;
  4. use bizGhs\product\classes\ProductClass;
  5. use bizGhs\stock\classes\StockRecordClass;
  6. use bizHd\goods\classes\GoodsClass;
  7. use bizHd\work\classes\WorkClass;
  8. use common\components\business;
  9. use common\components\dict;
  10. use common\components\imgUtil;
  11. use common\components\util;
  12. use Yii;
  13. use bizHd\base\classes\BaseClass;
  14. class OrderGoodsClass extends BaseClass
  15. {
  16. public static $baseFile = '\bizHd\order\models\OrderGoods';
  17. const ACTION_CONSUME = 'consume'; //消耗花材
  18. const ACTION_CONSUME_CANCEL = 'consumeCancel'; //取消消耗花材
  19. const ACTION_WASTAGE = 'wastage'; //取消消耗花材
  20. const ACTION_WASTAGE_CANCEL = 'wastageCancel'; //取消消耗花材
  21. //取订单 ssh 2020.1.2
  22. public static function getGoodsListById($id)
  23. {
  24. $arr = self::getAllByCondition(['orderId' => $id], null, '*');
  25. if (empty($arr)) {
  26. return [];
  27. }
  28. foreach ($arr as $key => $val) {
  29. $val = business::formatOrderGoodsCover($val);
  30. $arr[$key] = $val;
  31. }
  32. return $arr;
  33. }
  34. public static function getListBySn($sn)
  35. {
  36. $list = self::getAllByCondition(['orderSn' => $sn], null, '*');
  37. if (empty($list)) {
  38. return [];
  39. }
  40. foreach ($list as $key => $val) {
  41. $shortCover = isset($val['cover']) && !empty($val['cover']) ? $val['cover'] : 'hhb_small.png';
  42. $smallCover = imgUtil::groupImg($shortCover) . "?x-oss-process=image/resize,m_fill,h_130,w_130";
  43. $bigCover = imgUtil::groupImg($shortCover) . "?x-oss-process=image/resize,m_fill,h_700,w_700";
  44. $list[$key]['shortCover'] = $shortCover;
  45. $list[$key]['smallCover'] = $smallCover;
  46. $list[$key]['bigCover'] = $bigCover;
  47. }
  48. return $list;
  49. }
  50. //批量取订单 ssh 2020.1.2
  51. public static function getGoodsListByOrderSns($sns)
  52. {
  53. $arr = self::getAllByCondition(['orderSn' => ['in', $sns]], null, '*');
  54. if (empty($arr)) {
  55. return [];
  56. }
  57. $data = [];
  58. foreach ($arr as $info) {
  59. $orderId = $info['id'];
  60. $info = business::formatOrderGoodsCover($info);
  61. $data[$orderId][] = $info;
  62. }
  63. return $data;
  64. }
  65. //退货增加库存 ssh 20220427
  66. public static function refundAddStock($orderSn, $sjId, $shopId, $mainId, $goodsId, $goodsNum, $shopAdminName, $orderId)
  67. {
  68. //取消制作单
  69. // $work = WorkClass::getByCondition(['orderId' => $orderId, 'goodsId' => $goodsId], true);
  70. // WorkClass::removeWork($work, $goodsNum);
  71. //加商品库存
  72. $params = ['reduceSale' => 1];
  73. $respond = GoodsClass::addStock($goodsId, $mainId, $goodsNum, $params);
  74. //商品流水记录
  75. $data = [];
  76. $data['sjId'] = $sjId;
  77. $data['shopId'] = $shopId;
  78. $data['mainId'] = $mainId;
  79. $data['orderSn'] = $orderSn;
  80. $data['goodsId'] = $goodsId;
  81. $data['goodsNum'] = $goodsNum;
  82. $data['oldStock'] = $respond['oldStock'] ?? 0;
  83. $data['newStock'] = $respond['newStock'] ?? 0;
  84. $data['relateName'] = $shopAdminName;
  85. GoodsStockRecordClass::refund($data);
  86. return true;
  87. }
  88. //制作制作单完成,新增商品库存
  89. public static function addGoodsStockByMakeGoods($orderSn, $sjId, $shopId, $mainId, $goodsId, $goodsNum, $staffName)
  90. {
  91. //加商品库存
  92. $respond = GoodsClass::addStock($goodsId, $mainId, $goodsNum);
  93. //商品流水记录
  94. $data = [];
  95. $data['sjId'] = $sjId;
  96. $data['shopId'] = $shopId;
  97. $data['mainId'] = $mainId;
  98. $data['orderSn'] = $orderSn;
  99. $data['goodsId'] = $goodsId;
  100. $data['goodsNum'] = $goodsNum;
  101. $data['oldStock'] = $respond['oldStock'] ?? 0;
  102. $data['newStock'] = $respond['newStock'] ?? 0;
  103. $data['relateName'] = $staffName;
  104. GoodsStockRecordClass::addMakeGoods($data);
  105. return true;
  106. }
  107. //制作制作单消耗花材(单个)
  108. public static function consumeItemByMakeGoods($orderSn, $sjId, $shopId, $productId, $num, $unitType)
  109. {
  110. $respond = self::changeItemByMakeGoods($orderSn, $sjId, $shopId, $productId, $num, $unitType, self::ACTION_CONSUME);
  111. return $respond;
  112. }
  113. //制作制作单 花材损耗(单个)
  114. public static function wastageItemByMakeGoods($orderSn, $sjId, $shopId, $productId, $num, $unitType)
  115. {
  116. $respond = self::changeItemByMakeGoods($orderSn, $sjId, $shopId, $productId, $num, $unitType, self::ACTION_WASTAGE);
  117. return $respond;
  118. }
  119. //取消制作单 花材消耗退回(单个)
  120. public static function consumeItemByMakeGoodsCancel($orderSn, $sjId, $shopId, $productId, $num, $unitType)
  121. {
  122. $respond = self::changeItemByMakeGoods($orderSn, $sjId, $shopId, $productId, $num, $unitType, self::ACTION_CONSUME_CANCEL);
  123. return $respond;
  124. }
  125. //取消制作单 花材损耗退回(单个)
  126. public static function wastageItemByMakeGoodsCancel($orderSn, $sjId, $shopId, $productId, $num, $unitType)
  127. {
  128. $respond = self::changeItemByMakeGoods($orderSn, $sjId, $shopId, $productId, $num, $unitType, self::ACTION_WASTAGE_CANCEL);
  129. return $respond;
  130. }
  131. //action 值
  132. // consume(制作制作单消耗花材) ,cancelConsume(取消制作制作单消耗花材)
  133. // wastage (制作制作单损耗花材),cancelWastage (取消制作制作单损耗花材)
  134. public static function changeItemByMakeGoods($orderSn, $sjId, $shopId, $productId, $num, $unitType, $action)
  135. {
  136. $bigNum = 0;
  137. $smallNum = 0;
  138. if ($unitType == dict::getDict('unitType', 'big')) {
  139. //大单位
  140. $bigNum = $num;
  141. } else {
  142. //小单位
  143. $smallNum = $num;
  144. }
  145. $stockInfo = [];
  146. switch ($action) {
  147. case self::ACTION_WASTAGE:
  148. case self::ACTION_CONSUME:
  149. $stockInfo = ProductClass::decreaseStock($productId, $bigNum, $smallNum, true);
  150. break;
  151. case self::ACTION_CONSUME_CANCEL:
  152. case self::ACTION_WASTAGE_CANCEL:
  153. $stockInfo = ProductClass::addStock($productId, $bigNum, $smallNum);
  154. break;
  155. default:
  156. util::fail("非法参数");
  157. }
  158. if (empty($stockInfo)) {
  159. util::fail("非法参数");
  160. }
  161. //记录流流水
  162. $productData = ProductClass::getById($productId);
  163. $record = [];
  164. $record['sjId'] = $sjId;
  165. $record['shopId'] = $shopId;
  166. $record['mainId'] = $productData['mainId'];
  167. $record['orderSn'] = $orderSn;
  168. $record['itemId'] = $productData['itemId'];
  169. $record['productId'] = $productId;
  170. $record['itemNum'] = $stockInfo['itemNum'];
  171. $record['oldStock'] = $stockInfo['oldStock'];
  172. $record['newStock'] = $stockInfo['newStock'];
  173. switch ($action) {
  174. case self::ACTION_CONSUME:
  175. StockRecordClass::makeGoodsConsume($record);
  176. break;
  177. case self::ACTION_WASTAGE:
  178. StockRecordClass::makeGoodsWastage($record);
  179. break;
  180. case self::ACTION_CONSUME_CANCEL:
  181. StockRecordClass::cancelMakeGoodsConsume($record);
  182. break;
  183. case self::ACTION_WASTAGE_CANCEL:
  184. StockRecordClass::cancelMakeGoodsWastage($record);
  185. break;
  186. }
  187. return $stockInfo;
  188. }
  189. //花店商家自主开单,库存不足则不能开单
  190. public static function addData($data, $custom = null, $goodsInfo = [])
  191. {
  192. $goodsId = $data['goodsId'] ?? 0;
  193. $num = $data['num'] ?? 0;
  194. $mainId = $data['mainId'] ?? 0;
  195. $orderSn = $data['orderSn'] ?? "";
  196. $shopId = $data['shopId'] ?? 0;
  197. $sjId = $data['sjId'] ?? 0;
  198. $customName = $custom['name'] ?? '';
  199. $params = ['addSale' => 1];
  200. $respond = GoodsClass::decreaseStock($goodsId, $mainId, $num, true, $params);
  201. $oldStock = $respond['oldStock'] ?? 0;
  202. $newStock = $respond['newStock'] ?? 0;
  203. $recordData = [];
  204. $recordData['sjId'] = $sjId;
  205. $recordData['shopId'] = $shopId;
  206. $recordData['mainId'] = $mainId;
  207. $recordData['orderSn'] = $orderSn;
  208. $recordData['goodsId'] = $goodsId;
  209. $recordData['goodsNum'] = $num;
  210. $recordData['oldStock'] = $oldStock;
  211. $recordData['newStock'] = $newStock;
  212. $recordData['relateName'] = $customName;
  213. GoodsStockRecordClass::sellGoods($recordData);
  214. $currentGoods = $goodsInfo[$goodsId] ?? [];
  215. if (!empty($currentGoods)) {
  216. //如果定义库存充值的商品,并且库存低于99时,自动增加库存到999。
  217. if (isset($currentGoods['stockSet']) && $currentGoods['stockSet'] == 0) {
  218. if ($newStock < 99) {
  219. $addNum = bcsub(999, $newStock);
  220. $ret = GoodsClass::addStock($goodsId, $mainId, $addNum);
  221. $oldStock = $ret['oldStock'] ?? 0;
  222. $newStock = $ret['newStock'] ?? 0;
  223. $recordData = [];
  224. $recordData['sjId'] = $sjId;
  225. $recordData['shopId'] = $shopId;
  226. $recordData['mainId'] = $mainId;
  227. $recordData['orderSn'] = '';
  228. $recordData['goodsId'] = $goodsId;
  229. $recordData['goodsNum'] = $addNum;
  230. $recordData['oldStock'] = $oldStock;
  231. $recordData['newStock'] = $newStock;
  232. $recordData['relateName'] = '系统';
  233. $recordData['remark'] = '自动补充库存';
  234. GoodsStockRecordClass::pdGoods($recordData);
  235. }
  236. }
  237. }
  238. return self::add($data, true);
  239. }
  240. //制作制作单消耗花材(批量)
  241. //消耗花材信息:$consumeItemInfo = [{"id":12233,"num":1,"unitType":0}]
  242. public static function consumeItemByMakeGoodsBatch($orderSn, $sjId, $shopId, $consumeItemInfo)
  243. {
  244. if (empty($consumeItemInfo)) {
  245. util::fail("参数错误");
  246. }
  247. //花材消耗
  248. foreach ($consumeItemInfo as $v) {
  249. //库存减少
  250. $bigNum = 0;
  251. $smallNum = 0;
  252. $productId = $v['id'];
  253. if ($v['unitType'] == 0) {
  254. //大单位
  255. $bigNum = $v['num'];
  256. } else {
  257. //小单位
  258. $smallNum = $v['num'];
  259. }
  260. //扣库存
  261. $stockInfo = ProductClass::decreaseStock($productId, $bigNum, $smallNum, true);
  262. //记录流流水
  263. $productData = ProductClass::getById($productId);
  264. $record = [];
  265. $record['sjId'] = $sjId;
  266. $record['shopId'] = $shopId;
  267. $record['mainId'] = $productData['mainId'];
  268. $record['orderSn'] = $orderSn;
  269. $record['itemId'] = $productData['itemId'];
  270. $record['productId'] = $productId;
  271. $record['itemNum'] = $stockInfo['itemNum'];
  272. $record['oldStock'] = $stockInfo['oldStock'];
  273. $record['newStock'] = $stockInfo['newStock']; //
  274. StockRecordClass::makeGoodsConsume($record);
  275. }
  276. return true;
  277. }
  278. //制作制作单 花材损耗(批量)
  279. //损耗花材信息:$wastageItemInfo = [{"id":12233,"num":1,"unitType":0}]
  280. public static function wastageItemByMakeGoodsBatch($orderSn, $sjId, $shopId, $wastageItemInfo)
  281. {
  282. //花材损耗
  283. if (empty($wastageItemInfo)) {
  284. util::fail("参数错误");
  285. }
  286. foreach ($wastageItemInfo as $v) {
  287. //库存减少
  288. $bigNum = 0;
  289. $smallNum = 0;
  290. $productId = $v['id'];
  291. if ($v['unitType'] == 0) {
  292. //大单位
  293. $bigNum = $v['num'];
  294. } else {
  295. //小单位
  296. $smallNum = $v['num'];
  297. }
  298. //扣库存
  299. $stockInfo = ProductClass::decreaseStock($productId, $bigNum, $smallNum, true);
  300. //记录流流水
  301. $productData = ProductClass::getById($productId);
  302. $record = [];
  303. $record['sjId'] = $sjId;
  304. $record['shopId'] = $shopId;
  305. $record['mainId'] = $productData['mainId'];
  306. $record['orderSn'] = $orderSn;
  307. $record['itemId'] = $productData['itemId'];
  308. $record['productId'] = $productId;
  309. $record['itemNum'] = $stockInfo['itemNum'];
  310. $record['oldStock'] = $stockInfo['oldStock'];
  311. $record['newStock'] = $stockInfo['newStock']; //
  312. StockRecordClass::makeGoodsWastage($record);
  313. }
  314. }
  315. //制作单取消
  316. //退回花材损耗,退回花材消耗,退回商品库存
  317. public static function cancelMakeGoods($orderSn)
  318. {
  319. //是否有损耗
  320. $whereWastage = [];
  321. $whereWastage['orderSn'] = $orderSn;
  322. $whereWastage['recordType'] = StockRecordClass::STOCK_RECORD_TYPE_GOODS_WASTAGE;
  323. $wastageData = StockRecordClass::getAllByCondition($whereWastage, null, "*");
  324. if ($wastageData) {
  325. foreach ($wastageData as $v) {
  326. //加库存
  327. $stockInfo = ProductClass::addStockByItemNum($v['productId'], $v['itemNum']);
  328. //加流水记录
  329. $wastageRecord = $v;
  330. $wastageRecord['oldStock'] = $stockInfo['oldStock'];
  331. $wastageRecord['newStock'] = $stockInfo['newStock'];
  332. unset($wastageRecord['id']);
  333. StockRecordClass::cancelMakeGoodsWastage($wastageRecord);
  334. }
  335. }
  336. //是否有消耗
  337. $whereConsume = [];
  338. $whereConsume['orderSn'] = $orderSn;
  339. $whereConsume['recordType'] = StockRecordClass::STOCK_RECORD_TYPE_GOODS_CONSUME;
  340. $consumeData = StockRecordClass::getAllByCondition($whereConsume, null, "*");
  341. if ($consumeData) {
  342. foreach ($consumeData as $c) {
  343. //加库存
  344. $stockInfo = ProductClass::addStockByItemNum($c['productId'], $c['itemNum']);
  345. //加流水记录
  346. $consumeRecord = $c;
  347. $consumeRecord['oldStock'] = $stockInfo['oldStock'];
  348. $consumeRecord['newStock'] = $stockInfo['newStock'];
  349. unset($consumeRecord['id']);
  350. StockRecordClass::cancelMakeGoodsConsume($consumeRecord);
  351. }
  352. }
  353. //是否有商品
  354. $whereGoods = [];
  355. $whereGoods['orderSn'] = $orderSn;
  356. $whereGoods['recordType'] = GoodsStockRecordClass::STOCK_RECORD_TYPE_PURCHASE;
  357. $goodsData = GoodsStockRecordClass::getByCondition($whereGoods, null, "*");
  358. if ($goodsData) {
  359. //减库存
  360. GoodsClass::decreaseStock($goodsData['goodsId'], $goodsData['mainId'], $goodsData['goodsNum']);
  361. //流水记录
  362. unset($goodsData['id']);
  363. GoodsStockRecordClass::cancelMakeGoods($goodsData);
  364. }
  365. }
  366. //该方法已经拆开来了(弃用)
  367. //制作商品库存变更方法(加商品库存,减花材库存(消耗、损耗))
  368. //消耗花材信息:$consumeItemInfo = [{"id":12233,"num":1,"unitType":0}]
  369. //损耗花材信息:$wastageItemInfo = [{"id":12233,"num":1,"unitType":0}]
  370. //id 是当前产品的id,单价unitType 是当前单位类型,0表示大单位,1表示小单位,默认0 num 是当前花材数量
  371. public static function changeStockByMakeGoods($orderSn, $sjId, $shopId, $mainId, $goodsId, $goodsNum, $consumeItemInfo, $wastageItemInfo)
  372. {
  373. //加商品库存
  374. GoodsClass::addStock($goodsId, $mainId, $goodsNum);
  375. //商品流水记录
  376. $data = [];
  377. $data['sjId'] = $sjId;
  378. $data['shopId'] = $shopId;
  379. $data['mainId'] = $mainId;
  380. $data['orderSn'] = $orderSn;
  381. $data['goodsId'] = $goodsId;
  382. $data['goodsNum'] = $goodsNum;
  383. GoodsStockRecordClass::addMakeGoods($data);
  384. //花材消耗
  385. if (!empty($consumeItemInfo)) {
  386. foreach ($consumeItemInfo as $v) {
  387. //库存减少
  388. $bigNum = 0;
  389. $smallNum = 0;
  390. $productId = $v['id'];
  391. if ($v['unitType'] == 0) {
  392. //大单位
  393. $bigNum = $v['num'];
  394. } else {
  395. //小单位
  396. $smallNum = $v['num'];
  397. }
  398. //扣库存
  399. $stockInfo = ProductClass::decreaseStock($productId, $bigNum, $smallNum, true);
  400. //记录流流水
  401. $productData = ProductClass::getById($productId);
  402. $record = [];
  403. $record['sjId'] = $sjId;
  404. $record['shopId'] = $shopId;
  405. $record['mainId'] = $productData['mainId'];
  406. $record['orderSn'] = $orderSn;
  407. $record['itemId'] = $productData['itemId'];
  408. $record['productId'] = $productId;
  409. $record['itemNum'] = $stockInfo['itemNum'];
  410. $record['oldStock'] = $stockInfo['oldStock'];
  411. $record['newStock'] = $stockInfo['newStock']; //
  412. StockRecordClass::makeGoodsConsume($record);
  413. }
  414. }
  415. //花材损耗
  416. if (!empty($wastageItemInfo)) {
  417. foreach ($wastageItemInfo as $v) {
  418. //库存减少
  419. $bigNum = 0;
  420. $smallNum = 0;
  421. $productId = $v['id'];
  422. if ($v['unitType'] == 0) {
  423. //大单位
  424. $bigNum = $v['num'];
  425. } else {
  426. //小单位
  427. $smallNum = $v['num'];
  428. }
  429. //扣库存
  430. $stockInfo = ProductClass::decreaseStock($productId, $bigNum, $smallNum, true);
  431. //记录流流水
  432. $productData = ProductClass::getById($productId);
  433. $record = [];
  434. $record['sjId'] = $sjId;
  435. $record['shopId'] = $shopId;
  436. $record['mainId'] = $productData['mainId'];
  437. $record['orderSn'] = $orderSn;
  438. $record['itemId'] = $productData['itemId'];
  439. $record['productId'] = $productId;
  440. $record['itemNum'] = $stockInfo['itemNum'];
  441. $record['oldStock'] = $stockInfo['oldStock'];
  442. $record['newStock'] = $stockInfo['newStock'];
  443. StockRecordClass::makeGoodsWastage($record);
  444. }
  445. }
  446. return true;
  447. }
  448. }