|
|
@@ -0,0 +1,225 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace bizGhs\order\classes;
|
|
|
+
|
|
|
+use bizGhs\product\classes\ProductClass;
|
|
|
+use bizGhs\stock\services\StockRecordService;
|
|
|
+use common\components\orderSn;
|
|
|
+use common\components\util;
|
|
|
+use common\services\xhItemService;
|
|
|
+use Yii;
|
|
|
+use bizGhs\base\classes\BaseClass;
|
|
|
+use bizGhs\order\traits\OrderTrait;
|
|
|
+class StockOutOrderClass extends BaseClass
|
|
|
+{
|
|
|
+ use OrderTrait;
|
|
|
+ const STATUS_WAIT = 1; //待出库
|
|
|
+ const STATUS_COMPLETE = 2 ; //已出库
|
|
|
+ const STATUS_CANCEL = 3; //取消出库
|
|
|
+
|
|
|
+ const ACTION_WAIT = 'wait';
|
|
|
+ const ACTION_CONFIRM = 'confirm'; //直接入库
|
|
|
+
|
|
|
+ public static $baseFile = '\bizGhs\order\models\StockOutOrder';
|
|
|
+
|
|
|
+ //2021.1.23 linqh 新增出库订单: 保存订单表和订单详情表
|
|
|
+ public static function addOrder($data)
|
|
|
+ {
|
|
|
+
|
|
|
+ $action = $data['action'];
|
|
|
+ $data['status'] = self::STATUS_WAIT; //待入库
|
|
|
+ $orderSn =orderSn::getGhsStockOutSn();
|
|
|
+ $data['orderSn'] = $orderSn;
|
|
|
+ $ghsItemInfo = $data['itemInfo']; // [{bigNum:0,smallNum:0,productId:1}]
|
|
|
+ $bigNum = 0; //总共多少扎
|
|
|
+ $smallNum = 0; //总共多少支
|
|
|
+
|
|
|
+ $productIds = array_column($ghsItemInfo,'productId');
|
|
|
+ $productData = ProductClass::getProductByIds($productIds);
|
|
|
+ $itemIds = array_column($productData,'itemId');
|
|
|
+ $productData = array_column($productData, NULL, 'id');
|
|
|
+
|
|
|
+ $itemData = xhItemService::getByIds($itemIds);
|
|
|
+ $itemData = array_column($itemData, NULL, 'id');
|
|
|
+
|
|
|
+ if(!empty($ghsItemInfo)){
|
|
|
+ foreach ($ghsItemInfo as $v){
|
|
|
+ $bigNum += $v['bigNum']??0;
|
|
|
+ $smallNum += $v['smallNum']??0;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $data['bigNum'] = $bigNum;
|
|
|
+ $data['smallNum'] = $smallNum;
|
|
|
+
|
|
|
+ $connection = Yii::$app->db;
|
|
|
+ $transaction = $connection->beginTransaction();
|
|
|
+ try{
|
|
|
+ $order = self::add($data);
|
|
|
+ //写入详情表
|
|
|
+ $batchData = [];
|
|
|
+ foreach ($ghsItemInfo as $v){
|
|
|
+ $tmp = [];
|
|
|
+ $productId = $v['productId']??0;
|
|
|
+ $itemId = $productData[$productId]['itemId'];
|
|
|
+ $tmp['productId'] = $productId;
|
|
|
+ $tmp['orderSn'] = $orderSn;
|
|
|
+ $tmp['itemId'] = $itemId;
|
|
|
+ $tmp['itemStock'] = $productData[$productId]['stock']??0;//当时库存
|
|
|
+ $unitNum = $itemData[$itemId]['unitNum']??0;
|
|
|
+ $tmp['itemNum'] = ProductClass::mergeItemNum($v['bigNum'],$v['smallNum'],$unitNum);
|
|
|
+
|
|
|
+ $stockFormat= ProductClass::formatStock($tmp['itemStock'],$unitNum); // 库存总单位数量转大小单位的数量
|
|
|
+ $itemInfo = [
|
|
|
+ 'itemName'=> $itemData[$itemId]['name']??'',
|
|
|
+ 'itemCover'=> $itemData[$itemId]['cover']??'',
|
|
|
+ 'bigNum'=> $v['bigNum']??0,// 出库的大单位数量
|
|
|
+ 'smallNum'=> $v['smallNum']??0, //出库的小单位数量
|
|
|
+ 'bigNumStock'=> $stockFormat['bigNum'],// 当时库存大单位数
|
|
|
+ 'smallNumStock'=> $stockFormat['smallNum'],//当时库存 小单位数
|
|
|
+
|
|
|
+ 'itemUnit'=> $unitNum?2:1,
|
|
|
+ 'itemBigUnit'=> xhItemService::getUnitName($itemData[$itemId]['bigUnit']??1),
|
|
|
+ 'itemSmallUnit'=> xhItemService::getUnitName($itemData[$itemId]['smallUnit']??2),
|
|
|
+ ];
|
|
|
+ $tmp['itemInfo'] = json_encode($itemInfo);
|
|
|
+ $batchData[] = $tmp;
|
|
|
+ }
|
|
|
+ StockOutOrderItemClass::batchAddOrderItem($batchData);
|
|
|
+ $transaction->commit();
|
|
|
+ if($action===self::ACTION_CONFIRM){
|
|
|
+ //直接入库
|
|
|
+ self::confirmOrder($orderSn,$data['outShopId'],$data['adminId']);
|
|
|
+ }
|
|
|
+ return $order;
|
|
|
+ }catch (\Exception $exception){
|
|
|
+ $transaction->rollBack();
|
|
|
+ util::fail('保存失败'.$exception->getMessage());
|
|
|
+ //钉钉告警?
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //2021.1.23 linqh 确认出库 :
|
|
|
+ // 一、从状态 1 修改为 2
|
|
|
+ // 二、 减改门店的库存,
|
|
|
+ // 三、增加流水记录
|
|
|
+ // 四、写入一条数据到入库门店的入库订单表(生成入库订单号)
|
|
|
+ // 五、将入库订单号保存当前记录中
|
|
|
+ public static function confirmOrder($orderSn,$shopId,$adminId)
|
|
|
+ {
|
|
|
+ $where = [
|
|
|
+ 'orderSn'=>$orderSn,
|
|
|
+ 'status'=>self::STATUS_WAIT,
|
|
|
+ 'outShopId'=>$shopId,
|
|
|
+ ];
|
|
|
+ self::orderExist($where);
|
|
|
+ $data = [
|
|
|
+ 'status'=>self::STATUS_COMPLETE,
|
|
|
+ 'adminId'=>$adminId,
|
|
|
+ ];
|
|
|
+ $orderData = self::getOrderDetail($orderSn,$shopId);
|
|
|
+ $merchantId = $orderData['merchantId'];
|
|
|
+ $orderId = $orderData['id'];
|
|
|
+ $connection = Yii::$app->db;
|
|
|
+ $transaction = $connection->beginTransaction();
|
|
|
+ try{
|
|
|
+ //修改状态
|
|
|
+ self::updateByCondition($where,$data);
|
|
|
+ //减库存
|
|
|
+ $itemInfo = $orderData['itemInfo']??[];
|
|
|
+ if(empty($itemInfo)){
|
|
|
+ $transaction->rollBack();
|
|
|
+ util::fail("订单异常");
|
|
|
+ }
|
|
|
+ $productData = self::getProductMapData($itemInfo);
|
|
|
+ foreach ($itemInfo as $v){
|
|
|
+ $itemId = $v['itemId'];
|
|
|
+ $productId = $v['productId'];
|
|
|
+ $record = [];
|
|
|
+ $itemNum = ProductClass::mergeItemNumByItemId($v['bigNum'],$v['smallNum'],$itemId);
|
|
|
+ $record['merchantId'] = $merchantId;
|
|
|
+ $record['shopId'] = $shopId;
|
|
|
+ $record['orderSn'] = $orderSn;
|
|
|
+ $record['itemId'] = $itemId;
|
|
|
+ $record['itemNum'] = $itemNum;
|
|
|
+ $record['oldStock'] = $productData[$productId]['stock'];
|
|
|
+ $record['newStock'] = bcadd($productData[$productId]['stock'],$itemNum,2);
|
|
|
+ //记录流水
|
|
|
+ StockRecordService::addPurchaseOrderRecord($record);
|
|
|
+ //减库存
|
|
|
+ ProductClass::decreaseStock($productId,$v['bigNum'],$v['smallNum']);
|
|
|
+ }
|
|
|
+ //写入一条数据到入库门店的入库订单表(生成入库订单号
|
|
|
+ $inOrderData = StockInOrderClass::addOrder($data);
|
|
|
+ $inOrderSn = $inOrderData['sn'];
|
|
|
+ //更新入库订单号
|
|
|
+ self::updateById($orderId,['inOrderSn'=>$inOrderSn]);
|
|
|
+ //完成,提交事务
|
|
|
+ $transaction->commit();
|
|
|
+ }catch (\Exception $exception){
|
|
|
+ $transaction->rollBack();
|
|
|
+ util::fail("操作失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //2021.1.23. linqh 取消出库 : 从状态1 修改为 3 即完成
|
|
|
+ public static function cancelOrder($orderSn,$shopId,$adminId)
|
|
|
+ {
|
|
|
+ $where = [
|
|
|
+ 'orderSn'=>$orderSn,
|
|
|
+ 'status'=>self::STATUS_WAIT,
|
|
|
+ 'outShopId'=>$shopId,
|
|
|
+ ];
|
|
|
+ $data = [
|
|
|
+ 'status'=>self::STATUS_CANCEL,
|
|
|
+ 'adminId'=>$adminId,
|
|
|
+ ];
|
|
|
+
|
|
|
+ return self::updateByCondition($where,$data);
|
|
|
+ }
|
|
|
+
|
|
|
+ //2021.1.23 linqh 订单列表
|
|
|
+ public static function getOrderList($where)
|
|
|
+ {
|
|
|
+ $data = self::getList('*', $where, 'addTime DESC');
|
|
|
+ $list = isset($data['list']) && !empty($data['list']) ? $data['list'] : [];
|
|
|
+ if (empty($list)) {
|
|
|
+ return $data;
|
|
|
+ }
|
|
|
+ $data['list'] = $list;
|
|
|
+ $data['list'] = self::groupAdminList($list);
|
|
|
+ return $data;
|
|
|
+ }
|
|
|
+
|
|
|
+ //2021.1.23 linqh 订单详情
|
|
|
+ public static function getOrderDetail($orderSn,$shopId)
|
|
|
+ {
|
|
|
+ $orderData = self::orderExist(['orderSn'=>$orderSn,'outShopId'=>$shopId]);
|
|
|
+ $orderInfo = StockOutOrderItemClass::getOrderItemDetail($orderSn);
|
|
|
+ $itemData = [];
|
|
|
+ if($orderInfo) {
|
|
|
+ foreach ($orderInfo as $v) {
|
|
|
+ $info = json_decode($v['itemInfo'],true);
|
|
|
+ $tmp = $info;
|
|
|
+ $tmp['itemCover'] = self::groupImg($info['itemCover']);
|
|
|
+ $tmp['productId'] = $v['productId'];
|
|
|
+ $tmp['itemId'] = $v['itemId'];
|
|
|
+ $itemData[] = $tmp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $orderData = self::groupAdmin($orderData);
|
|
|
+ $orderData['itemInfo'] = $itemData;
|
|
|
+ return $orderData;
|
|
|
+ }
|
|
|
+ //2021.1.23 linqh 判断定时是否存在
|
|
|
+ public static function orderExist($where)
|
|
|
+ {
|
|
|
+ $orderData = self::getByCondition($where);
|
|
|
+ if(!$orderData) {
|
|
|
+ util::fail('订单不存在');
|
|
|
+ }
|
|
|
+ return $orderData;
|
|
|
+ }
|
|
|
+}
|