StockInOrderClass.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <?php
  2. namespace bizGhs\order\classes;
  3. use biz\shop\classes\ShopCapitalClass;
  4. use biz\shop\classes\ShopClass;
  5. use biz\stat\classes\StatOutClass;
  6. use biz\stat\classes\StatStockInClass;
  7. use biz\stat\classes\StatStockOutClass;
  8. use bizGhs\order\models\StockOutOrderItem;
  9. use bizGhs\order\traits\OrderTrait;
  10. use bizGhs\product\classes\ProductClass;
  11. use bizGhs\shop\classes\MainClass;
  12. use bizGhs\stock\classes\StockRecordClass;
  13. use bizHd\stat\classes\StatIncomeClass;
  14. use common\components\dict;
  15. use common\components\orderSn;
  16. use common\components\util;
  17. use Yii;
  18. use bizGhs\base\classes\BaseClass;
  19. class StockInOrderClass extends BaseClass
  20. {
  21. use OrderTrait;
  22. const STATUS_WAIT = 1; //待入库
  23. const STATUS_COMPLETE = 2; //已入库
  24. const STATUS_CANCEL = 3; //取消入库
  25. const ACTION_CONFIRM = 'confirm'; //直接入库
  26. public static $baseFile = '\bizGhs\order\models\StockInOrder';
  27. public static $statusMap = [
  28. self::STATUS_WAIT => '待入库',
  29. self::STATUS_COMPLETE => '已入库',
  30. ];
  31. //2021.1.25 lqh 订单列表
  32. public static function getOrderList($where)
  33. {
  34. $data = self::getList('*', $where, 'addTime DESC');
  35. $list = isset($data['list']) && !empty($data['list']) ? $data['list'] : [];
  36. if (empty($list)) {
  37. return $data;
  38. }
  39. $ids = array_column($list, 'outShopId');
  40. $ids = array_filter(array_unique($ids));
  41. $shopInfo = ShopClass::getByIds($ids, null, 'id');
  42. foreach ($list as $key => $val) {
  43. $outShopId = $val['outShopId'] ?? 0;
  44. $list[$key]['outShopName'] = $shopInfo[$outShopId]['shopName'] ?? '';
  45. }
  46. $data['list'] = $list;
  47. $data['list'] = self::groupAdminList($list);
  48. $data['list'] = self::groupStatusName($data['list']);
  49. return $data;
  50. }
  51. //入库 (状态在待入库中 )lqh 2021.1.23
  52. public static function addOrder($outOrderData)
  53. {
  54. $data = [];
  55. $data['status'] = self::STATUS_WAIT;//待入库
  56. $orderSn = orderSn::getGhsStockInSn();
  57. $data['orderSn'] = $orderSn;
  58. $data['sjId'] = $outOrderData['sjId'];
  59. $data['outShopId'] = $outOrderData['outShopId'] ?? 0;
  60. $data['outMainId'] = $outOrderData['outMainId'] ?? 0;
  61. $data['inShopId'] = $outOrderData['inShopId'];
  62. $data['inMainId'] = $outOrderData['inMainId'] ?? 0;
  63. $data['outOrderSn'] = $outOrderData['orderSn'];
  64. $data['adminId'] = $outOrderData['adminId'];
  65. $data['bigNum'] = $outOrderData['bigNum'];
  66. $data['smallNum'] = $outOrderData['smallNum'];
  67. $data['price'] = $outOrderData['price'];
  68. $data['remark'] = $outOrderData['remark'];
  69. $ghsItemInfo = $outOrderData['itemInfo'];
  70. $shopId = $outOrderData['inShopId'] ?? 0;
  71. $mainId = $outOrderData['inMainId'] ?? 0;
  72. //入库: 需要将itemId 转换成对应的productId,若没有对应的productId,则需要新增
  73. ProductClass::complementProduct($data['sjId'], $mainId, $shopId, $ghsItemInfo);
  74. $itemIds = array_column($ghsItemInfo, "itemId");
  75. $productData = ProductClass::getGhsProductDataByItemIds($mainId, $itemIds);
  76. $itemData = array_column($productData, null, 'itemId');
  77. $connection = Yii::$app->db;
  78. $transaction = $connection->beginTransaction();
  79. try {
  80. //写入订单表
  81. $order = self::add($data);
  82. //写入详情表
  83. $batchData = [];
  84. foreach ($ghsItemInfo as $v) {
  85. $tmp = [];
  86. $itemId = $v['itemId'];
  87. $productId = $itemData[$itemId]['id'] ?? 0;
  88. if (!$productId) {
  89. util::fail("入库失败");
  90. }
  91. $tmp['productId'] = $productId;
  92. $tmp['orderSn'] = $orderSn;
  93. $tmp['itemId'] = $itemId;
  94. $tmp['itemStock'] = $itemData[$itemId]['stock'] ?? 0;//当时库存
  95. $tmp['itemNum'] = $v['itemNum'];
  96. $tmp['itemPrice'] = $v['itemPrice']; //售卖的价格
  97. $ratio = $itemData[$itemId]['ratio'] ?? 0;
  98. $formatStock = ProductClass::formatStock($tmp['itemStock'], $ratio);
  99. $itemInfo = [
  100. 'itemName' => $v['itemName'] ?? '',
  101. 'itemCover' => $v['cover'] ?? '',
  102. 'bigNum' => $v['bigNum'],// 出库的大单位数量
  103. 'smallNum' => $v['smallNum'], //出库的小单位数量
  104. 'bigNumStock' => $formatStock['bigNum'],// 当时库存大单位数
  105. 'smallNumStock' => $formatStock['smallNum'],//当时库存 小单位数
  106. 'itemUnit' => $v['itemUnit'],
  107. 'ratio' => $v['ratio'],// 比例
  108. 'rank' => $v['rank'] ?? 'B',// 花材级别
  109. 'bigUnit' => $v['bigUnit'],
  110. 'smallUnit' => $v['smallUnit'],
  111. ];
  112. $tmp['itemInfo'] = json_encode($itemInfo);
  113. $tmp['shopId'] = $outOrderData['inShopId'] ?? 0;
  114. $tmp['mainId'] = $outOrderData['inMainId'] ?? 0;
  115. $batchData[] = $tmp;
  116. }
  117. StockInOrderItemClass::batchAddOrderItem($batchData);
  118. $transaction->commit();
  119. return $order;
  120. } catch (\Exception $exception) {
  121. $transaction->rollBack();
  122. util::fail("入库失败" . $exception->getMessage());
  123. }
  124. }
  125. //确定入库
  126. //修改状态 1=》2
  127. // 加库存
  128. // 加流水记录
  129. //增加门店收支记录 : 出库的门店加金额,入库的门店减金额(用成本价计算)
  130. public static function confirmOrder($orderSn, $shopId, $adminId)
  131. {
  132. $data = ['status' => self::STATUS_COMPLETE, 'adminId' => $adminId];
  133. $orderData = self::getOrderDetail($orderSn, $shopId);
  134. if ($orderData['status'] != self::STATUS_WAIT) {
  135. util::fail("订单已处理");
  136. }
  137. $orderId = $orderData['id'];
  138. self::updateById($orderId, $data);
  139. //加库存
  140. $itemInfo = $orderData['itemInfo'] ?? [];
  141. if (empty($itemInfo)) {
  142. util::fail("订单异常");
  143. }
  144. $inProductMapData = ProductClass::getProductMapData($itemInfo);
  145. $inTotalCost = 0;
  146. foreach ($itemInfo as $k => $v) {
  147. $stockInfo = ProductClass::addStockByItemNum($v['productId'], $v['itemNum']);
  148. $itemInfo[$k]['oldStock'] = $stockInfo['oldStock'];
  149. $itemInfo[$k]['itemStock'] = $stockInfo['oldStock'];
  150. $itemInfo[$k]['newStock'] = $stockInfo['newStock'];
  151. $inPId = $v['productId'];
  152. $inNum = $v['itemNum'];
  153. $cost = $inProductMapData[$inPId]['cost'] ?? 0; //成本
  154. $inTotalCost = bcadd($inTotalCost, bcmul($inNum, $cost, 2), 2);
  155. }
  156. //流水记录
  157. $orderData['shopId'] = $shopId;
  158. $orderData['itemInfo'] = $itemInfo;
  159. $orderData['ptStyle'] = dict::getDict('ptStyle', 'ghs');
  160. StockRecordClass::addRecordByOrder($orderData, StockRecordClass::STOCK_RECORD_TYPE_IN_STOCK);
  161. $outOrderSn = $orderData['outOrderSn'];
  162. $outShopId = $orderData['outShopId'];
  163. $outOrderInfo = StockOutOrderClass::getOrderDetail($outOrderSn, $outShopId);
  164. $payWay = dict::getDict('payWay', 'unknown');
  165. if (empty($outOrderInfo)) {
  166. util::fail('没有找到出库单');
  167. }
  168. $outOrderInfoItem = $outOrderInfo['itemInfo'] ?? '';
  169. if (empty($outOrderInfoItem)) {
  170. util::fail('没有出库单信息');
  171. }
  172. $outTotalCost = 0;
  173. $outProductData = ProductClass::getProductMapData($outOrderInfoItem);
  174. foreach ($outOrderInfoItem as $v) {
  175. $pId = $v['productId'];
  176. $num = $v['itemNum'];
  177. $cost = $outProductData[$pId]['cost'] ?? 0; //成本
  178. $outTotalCost = bcadd($outTotalCost, bcmul($num, $cost, 2), 2);
  179. }
  180. $outEvent = '出库';
  181. $outCapitalType = dict::getDict('capitalType', 'ghsCheckOut', 'id');
  182. $shop = ShopClass::getLockById($outShopId);
  183. if (empty($shop)) {
  184. util::fail('没有找到出库门店');
  185. }
  186. $mainId = $shop->mainId ?? 0;
  187. $main = MainClass::getLockById($mainId);
  188. if (empty($main)) {
  189. util::fail('没有main信息');
  190. }
  191. $outCurrentTotalIncome = bcadd($main->totalIncome, $outTotalCost, 2);
  192. $currentTotalStockOut = bcadd($main->totalStockOut, $outTotalCost, 2);
  193. $main->totalIncome = $outCurrentTotalIncome;
  194. $main->totalStockOut = $currentTotalStockOut;
  195. $main->save();
  196. $capitalData = [
  197. 'capitalType' => $outCapitalType,
  198. 'io' => 1,
  199. 'totalIncome' => $outCurrentTotalIncome,
  200. 'payWay' => $payWay,
  201. 'amount' => $outTotalCost,
  202. 'sjId' => $outOrderInfo['sjId'] ?? 0,
  203. 'shopId' => $outShopId,
  204. 'event' => $outEvent,
  205. 'mainId' => $mainId,
  206. ];
  207. ShopCapitalClass::addCapital($capitalData);
  208. //每天和每月收入统计,出库也算收入
  209. StatIncomeClass::updateOrInsert($main, $shop, $outTotalCost);
  210. //出库每日和每月统计
  211. StatStockOutClass::replace($main, $shop, $outTotalCost);
  212. //入库门店
  213. $inEvent = '入库';
  214. $inCapitalType = dict::getDict('capitalType', 'ghsCheckIn', 'id');
  215. $inShop = ShopClass::getLockById($shopId);
  216. if (empty($inShop)) {
  217. util::fail('没有找到入库门店');
  218. }
  219. $inMainId = $inShop->mainId ?? 0;
  220. $inMain = MainClass::getLockById($inMainId);
  221. if (empty($inMain)) {
  222. util::fail('没有main信息');
  223. }
  224. $inCurrentTotalExpend = bcadd($inMain->totalExpend, $inTotalCost, 2);
  225. $inMain->totalExpend = $inCurrentTotalExpend;
  226. $currentTotalStockIn = bcadd($inMain->totalStockIn, $inTotalCost, 2);
  227. $inMain->totalStockIn = $currentTotalStockIn;
  228. $inMain->save();
  229. $capitalData = [
  230. 'capitalType' => $inCapitalType,
  231. 'io' => 0,
  232. 'totalExpend' => $inCurrentTotalExpend,
  233. 'payWay' => $payWay,
  234. 'amount' => $inTotalCost,
  235. 'sjId' => $orderData['sjId'] ?? 0,
  236. 'shopId' => $shopId,
  237. 'event' => $inEvent,
  238. 'mainId' => $mainId,
  239. ];
  240. ShopCapitalClass::addCapital($capitalData);
  241. //当天和当月支出统计,调拨入库算支出
  242. StatOutClass::updateOrInsert($main, $shop, $inTotalCost);
  243. //入库每天和每月统计
  244. StatStockInClass::replace($inMain, $inShop, $inTotalCost);
  245. }
  246. //2021.1.23 lqh 订单详情
  247. public static function getOrderDetail($orderSn, $shopId)
  248. {
  249. $orderData = self::orderExist(['orderSn' => $orderSn, 'inShopId' => $shopId]);
  250. $orderInfo = StockInOrderItemClass::getOrderItemDetail($orderSn);
  251. $itemData = [];
  252. if ($orderInfo) {
  253. foreach ($orderInfo as $v) {
  254. $info = json_decode($v['itemInfo'], true);
  255. $tmp = $info;
  256. $tmp['itemCover'] = self::groupImg($info['itemCover']);
  257. unset($v['itemInfo']);
  258. if (!isset($tmp['rank'])) {
  259. $tmp['rank'] = 'B';
  260. }
  261. $tmp = array_merge($tmp, $v);
  262. $itemData[] = $tmp;
  263. }
  264. }
  265. $orderData = self::groupAdmin($orderData);
  266. $orderData['itemInfo'] = $itemData;
  267. $orderData['statusName'] = self::getStatusName($orderData['status']);
  268. $outShopId = $orderData['outShopId'] ?? 0;
  269. $outShop = ShopClass::getById($outShopId);
  270. $outShopName = $outShop['shopName'] ?? '';
  271. $orderData['outShopName'] = $outShopName;
  272. return $orderData;
  273. }
  274. //2021.1.25 lqh 判断定时是否存在
  275. public static function orderExist($where)
  276. {
  277. $orderData = self::getByCondition($where);
  278. if (!$orderData) {
  279. util::fail('订单不存在');
  280. }
  281. return $orderData;
  282. }
  283. // 组装状态码 lqh 2021.1.30
  284. public static function groupStatusName($list)
  285. {
  286. foreach ($list as $k => $val) {
  287. $status = $val['status'] ?? 0;
  288. $list[$k]['statusName'] = self::getStatusName($status);
  289. }
  290. return $list;
  291. }
  292. // 获取状态码名称
  293. public static function getStatusName($status)
  294. {
  295. return self::$statusMap[$status] ?? '';
  296. }
  297. //组装出库门店信息
  298. public static function groupOutShopName($list)
  299. {
  300. foreach ($list as $k => $val) {
  301. $list[$k]['shopName'] = "出库门店名称";
  302. }
  303. return $list;
  304. }
  305. //取消入库
  306. public static function cancelOrder($order, $adminId)
  307. {
  308. if ($order->status != self::STATUS_WAIT) {
  309. util::fail('订单不能取消');
  310. }
  311. $order->status = self::STATUS_CANCEL;
  312. $order->adminId = $adminId;
  313. $order->save();
  314. $outOrderSn = $order->outOrderSn ?? '';
  315. $outShopId = $order->outShopId ?? '';
  316. $outOrderData = StockOutOrderClass::getOrderDetail($outOrderSn, $outShopId);
  317. $outOrderData['shopId'] = $outShopId;
  318. //加库存
  319. $itemInfo = $outOrderData['itemInfo'] ?? [];
  320. if (empty($itemInfo)) {
  321. util::fail("订单异常");
  322. }
  323. foreach ($itemInfo as $k => $v) {
  324. $stockInfo = ProductClass::addStockByItemNum($v['productId'], $v['itemNum']);
  325. $itemInfo[$k]['oldStock'] = $stockInfo['oldStock'];
  326. $itemInfo[$k]['itemStock'] = $stockInfo['oldStock'];
  327. $itemInfo[$k]['newStock'] = $stockInfo['newStock'];
  328. }
  329. $outOrderData['itemInfo'] = $itemInfo;
  330. $outOrderData['ptStyle'] = dict::getDict('ptStyle', 'ghs');
  331. StockRecordClass::addRecordByOrder($outOrderData, StockRecordClass::STOCK_RECORD_TYPE_IN_STOCK_CANCEL);
  332. //修改出库订单状态
  333. $whereOut = [
  334. 'orderSn' => $outOrderSn,
  335. 'outShopId' => $outShopId,
  336. ];
  337. StockOutOrderClass::updateByCondition($whereOut, ['status' => StockOutOrderClass::STATUS_CANCEL]);
  338. }
  339. }