where('product_id', $params['product_id'])->find(); if ($storage) { $after_nums = $storage['nums'] + $params['nums']; if ($type == 1) { $storeProduct = StoreProduct::where('id', $params['product_id'])->findOrEmpty(); if (!$storeProduct) { throw new BusinessException('商品不存在'); } if ($storeProduct['purchase'] <= 0) { $total_price = 0; } else { $total_price = bcmul($after_nums, $storeProduct['purchase'], 2); } WarehouseStorage::update(['nums' => $after_nums, 'total_price' => $total_price], ['id' => $storage['id']]); SqlChannelLog('WarehouseStorage', $storage['id'], $after_nums, 1, Request()->url(), $admin_id); } } else { $after_nums = $params['nums']; $storeProduct = StoreProduct::where('id', $params['product_id'])->findOrEmpty(); if (!$storeProduct) { throw new BusinessException('商品不存在'); } if ($storeProduct['purchase'] <= 0) { $total_price = 0; } else { $total_price = bcmul($after_nums, $storeProduct['purchase'], 2); } $data = [ 'warehouse_id' => $params['warehouse_id'], 'product_id' => $params['product_id'], 'nums' => $params['nums'], 'total_price' => $total_price ]; $storage = WarehouseStorage::create($data); SqlChannelLog('WarehouseStorage', $storage['id'], -$params['nums'], 1, Request()->url(), $admin_id); } } $batch_count = WarehouseProduct::where(['product_id' => $params['product_id'], 'warehouse_id' => $params['warehouse_id'], 'store_id' => $params['store_id']])->count(); $data = [ 'warehouse_id' => $params['warehouse_id'], 'supplier_id' => $params['supplier_id'] ?? 0, 'oid' => $params['oid'] ?? 0, 'store_id' => $params['store_id'] ?? 0, 'product_id' => $params['product_id'], 'batch' => $batch_count + 1, 'nums' => $params['nums'], 'before_nums' => 0, 'after_nums' => 0, 'price' => $params['price'] ?? '', 'purchase' => $params['purchase'] ?? '', 'total_price' => $params['total_price'] ?? '', 'admin_id' => $params['admin_id'], 'code' => $params['code'] ?? '', 'status' => 1, 'pay_type' => $params['pay_type'] ?? 0, 'mark' => $params['mark'] ?? '', ]; if (isset($params['manufacture']) && $params['manufacture'] != '') { $data['manufacture'] = strtotime($params['manufacture']); } if (isset($params['expiration_date']) && $params['expiration_date'] != '') { $data['expiration_date'] = strtotime($params['expiration_date']); } $res = WarehouseProduct::create($data); SqlChannelLog('WarehouseProduct', $res['id'], $params['nums'], 1, Request()->url(), $admin_id); return $res; } catch (\Throwable $e) { throw new BusinessException($e->getMessage()); } } /** * 设置出库商品 */ public static function setOutbound(array $params, $type = 1, $admin_id = 0) { Db::startTrans(); try { $after_nums = 0; if ($params['order_type'] != 6) { $storage = WarehouseStorage::where('warehouse_id', $params['warehouse_id'])->where('product_id', $params['product_id'])->find(); if ($storage) { $after_nums = bcsub($storage['nums'], $params['nums']); $total_price = bcmul($after_nums, $params['purchase'], 2); WarehouseStorage::update(['nums' => bcsub($storage['nums'], $params['nums']), 'total_price' => $total_price], ['id' => $storage['id']]); SqlChannelLog('WarehouseStorage', $storage['id'], bcsub($storage['nums'], $params['nums']), -1, Request()->url(), $admin_id); } else { $data = [ 'warehouse_id' => $params['warehouse_id'], 'product_id' => $params['product_id'], 'nums' => -$params['nums'], 'total_price' => 0 ]; $storage = WarehouseStorage::create($data); SqlChannelLog('WarehouseStorage', $storage->id, -$params['nums'], -1, Request()->url(), $admin_id); } } else { $storage['nums'] = 0; } $batch_count = WarehouseProduct::where(['product_id' => $params['product_id'], 'warehouse_id' => $params['warehouse_id'], 'financial_pm' => $params['financial_pm'], 'store_id' => $params['store_id']])->count(); $data = [ 'warehouse_id' => $params['warehouse_id'], 'supplier_id' => $params['supplier_id'] ?? 0, 'oid' => $params['oid'] ?? 0, 'store_id' => $params['store_id'] ?? 0, 'product_id' => $params['product_id'], 'financial_pm' => $params['financial_pm'], 'batch' => $batch_count + 1, 'nums' => $params['nums'], 'before_nums' => $storage['nums'], 'after_nums' => $after_nums, 'price' => $params['price'] ?? 0, 'purchase' => $params['purchase'] ?? 0, 'vip_price' => $params['vip_price'] ?? 0, 'total_price' => $params['total_price'] ?? 0, 'admin_id' => $params['admin_id'], 'code' => $params['code'] ?? '', 'unit' => $params['unit'] ?? 0, 'status' => 0, 'mark' => $params['mark'] ?? '', 'order_type' => $params['order_type'] ?? '', ]; $res = WarehouseProduct::create($data); SqlChannelLog('WarehouseProduct', $res->id, $params['nums'], $params['financial_pm'] == 1 ? 1 : -1, Request()->url(), $admin_id); Db::commit(); return $res; } catch (\Throwable $e) { Db::rollback(); throw new BusinessException($e->getMessage()); } } /** * @notes 编辑商品仓储信息 * @param array $params * @param int $admin_id * @return bool * @author admin * @date 2024/07/31 16:55 */ public static function edit(array $params, $admin_id = 0) { Db::startTrans(); try { $find = WarehouseOrder::where('id', $params['oid'])->find(); if ($find) { $res = WarehouseProduct::where('id', $params['id'])->withTrashed()->find(); if ($params['nums'] > $res['nums']) { $nums = bcsub($params['nums'], $res['nums'], 2); self::incWarehouseProduct($res, $nums); } else { if ($params['nums'] == 0) { self::decWarehouseProduct($res, $res['nums']); } else { $nums = bcsub($res['nums'], $params['nums'], 2); self::decWarehouseProduct($res, $nums); } } $datas = [ 'total_price' => $params['total_price'], ]; if ($find['financial_pm'] == 1) { $datas['supplier_id'] = $params['supplier_id']; $datas['pay_type'] = $params['pay_type']; $datas['purchase'] = $params['purchase']; } else { $datas['price'] = $params['price']; } if (isset($params['manufacture']) && $params['manufacture'] != '') { $datas['manufacture'] = strtotime($params['manufacture']); } if (isset($params['expiration_date']) && $params['expiration_date'] != '') { $datas['expiration_date'] = strtotime($params['expiration_date']); } $res->save($datas); } Db::commit(); return $res; } catch (\Exception $e) { Db::rollback(); throw new BusinessException($e->getMessage()); } } /** * @notes 删除商品仓储信息 * @param array $params * @param int $admin_id * @return bool * @throws DataNotFoundException * @throws DbException * @throws ModelNotFoundException * @author admin * @date 2024/07/31 16:55 */ public static function delete(array $params, $admin_id = 0): bool { $res = WarehouseProduct::where('id', $params['id'])->find(); if ($res) { Db::startTrans(); try { if ($res['financial_pm'] == 1) { self::decWarehouseProduct($res, $res['nums']); } else { self::incWarehouseProduct($res, $res['nums']); } $res->delete(); Db::commit(); return true; } catch (\Throwable $th) { Db::rollback(); throw new BusinessException($th->getMessage()); } } throw new BusinessException('没有查到出入库信息'); } /** * @notes 结算 * @param $id * @return void */ public static function settlement($id) { Db::startTrans(); try { $find = WarehouseProduct::where(['id' => $id, 'financial_pm' => 1, 'is_pay' => 0])->find(); if ($find) { $find->is_pay = 1; $find->save(); } else { throw new BusinessException('没有查到出入库信息'); } Db::commit(); } catch (\Throwable $th) { Db::rollback(); throw new BusinessException($th->getMessage()); } } /** * @notes 仓库重置出入库数量 * @param $params * @param int $admin_id * @return void */ public static function settNums($params, $admin_id = 0) { Db::startTrans(); try { $res = WarehouseProduct::where('id', $params['id'])->find(); if ($res) { if ($params['nums'] > $res['nums']) { $nums = bcsub($params['nums'], $res['nums'], 2); self::incWarehouseProduct($res, $nums); } else { $nums = bcsub($res['nums'], $params['nums'], 2); self::decWarehouseProduct($res, $nums); } if ($res['financial_pm'] == 1) { $datas = [ 'nums' => $params['nums'], 'total_price' => bcmul($params['nums'], $res['purchase'], 2), ]; } else { $datas = [ 'nums' => $params['nums'], 'total_price' => bcmul($params['nums'], $res['price'], 2), ]; } $res->save($datas); } Db::commit(); } catch (\Throwable $th) { Db::rollback(); throw new BusinessException($th->getMessage()); } } /** * @notes 获取商品仓储信息详情 * @param $params * @return array * @author admin * @date 2024/07/31 16:55 */ public static function detail($params): array { $data = WarehouseProduct::findOrEmpty($params['id'])->toArray(); if ($data) { $data['manufacture'] = date('Y-m-d', $data['manufacture']); $data['expiration_date'] = date('Y-m-d', $data['expiration_date']); } return $data; } /** * 增加商品入库数量 * @param $warehouseProduct * @param $nums * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function incWarehouseProduct($warehouseProduct, $nums) { $warehouseStorage = WarehouseStorage::where('warehouse_id', $warehouseProduct['warehouse_id']) ->where('product_id', $warehouseProduct['product_id'])->find(); $warehouseStorage->nums = bcadd($warehouseStorage->nums, $nums, 2); $warehouseStorage->save(); SqlChannelLog('WarehouseStorage', $warehouseStorage['id'], $nums, 1, Request()->url()); $update = [ 'nums' => bcadd($warehouseProduct['nums'], $nums, 2), 'total_price' => bcadd($warehouseProduct['total_price'], bcmul($nums, $warehouseProduct['price'], 2), 2), ]; WarehouseProduct::where('id', $warehouseProduct['id'])->update($update); SqlChannelLog('WarehouseProduct', $warehouseProduct['id'], $nums, 1, Request()->url()); $find = WarehouseProduct::where('oid', $warehouseProduct['oid'])->field('sum(nums) as nums,sum(total_price) as total_price')->find(); if ($find) { WarehouseOrder::where('id', $warehouseProduct['oid'])->update([ 'nums' => $find['nums'], 'total_price' => $find['total_price'] ]); } self::updateStoreStorage($warehouseProduct, $nums); } /** * 减少商品入库数量 * @param $warehouseProduct * @param $nums * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function decWarehouseProduct($warehouseProduct, $nums) { $warehouseStorage = WarehouseStorage::where('warehouse_id', $warehouseProduct['warehouse_id']) ->where('product_id', $warehouseProduct['product_id'])->find(); $warehouseStorage->nums = bcsub($warehouseStorage->nums, $nums, 2); $warehouseStorage->save(); SqlChannelLog('WarehouseStorage', $warehouseStorage['id'], $nums, -1, Request()->url()); $update = [ 'nums' => bcsub($warehouseProduct['nums'], $nums, 2), 'total_price' => bcsub($warehouseProduct['total_price'], bcmul($nums, $warehouseProduct['price'], 2), 2), ]; WarehouseProduct::where('id', $warehouseProduct['id'])->update($update); SqlChannelLog('WarehouseProduct', $warehouseProduct['id'], $nums, -1, Request()->url()); $find = WarehouseProduct::where('oid', $warehouseProduct['oid'])->field('sum(nums) as nums,sum(total_price) as total_price')->find(); if ($find) { WarehouseOrder::where('id', $warehouseProduct['oid'])->update([ 'nums' => $find['nums'], 'total_price' => $find['total_price'] ]); } self::updateStoreStorage($warehouseProduct, $nums); } /** * 修改门店商品库存 * @param $warehouseProduct * @param $nums * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function updateStoreStorage($warehouseProduct, $nums) { if ($warehouseProduct['store_id'] == 1 && $warehouseProduct['status'] == 1) { // 入库单已确认,减少门店库存 $storeBranchProduct = StoreBranchProduct::where('store_id', $warehouseProduct->store_id) ->where('product_id', $warehouseProduct->product_id)->find(); if (!empty($storeBranchProduct)) { $storeBranchProduct->stock = $storeBranchProduct->stock - $nums; $storeBranchProduct->save(); } } } }