StockInOrderClass.php 14 KB

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