| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- <?php
- /**
- * Niushop商城系统 - 团队十年电商经验汇集巨献!
- * =========================================================
- * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
- * ----------------------------------------------
- * 官方网址: https://www.niushop.com
- * =========================================================
- */
- namespace addon\stock\model\stock;
- use app\model\store\Store;
- use app\model\BaseModel;
- use app\model\storegoods\StoreGoods;
- /**
- * 盘点
- *
- * @author Administrator
- *
- */
- class Inventory extends BaseModel
- {
- /**
- * 添加盘点单
- * @param array $inventory_data
- * @param array $inventory_goods_data (sku_id:盘点数量,sku_id:盘点数量)
- */
- public function addInventory($params)
- {
- //同商品同时只能存在一个盘点单据
- model('stock_inventory')->startTrans();
- try {
- $site_id = $params[ 'site_id' ];
- $store_id = $params[ 'store_id' ];
- $sku_list = $params[ 'sku_list' ];
- $user_info = $params[ 'user_info' ];
- $inventory_no = 'PD' . date('ymdhis', time()) . rand(1111, 9999);
- //查询门店名称信息
- $store_model = new Store();
- $store_condition = array (
- [ 'store_id', '=', $store_id ]
- );
- $store_info = $store_model->getStoreInfo($store_condition, 'store_name')[ 'data' ] ?? [];
- if (empty($store_info)) {
- model('stock_inventory')->rollback();
- return $this->success([], '找不到所选的门店');
- }
- $store_name = $store_info[ 'store_name' ];
- $common_data = array (
- 'site_id' => $site_id,
- 'create_time' => time(),
- 'store_id' => $store_id
- );
- $data = array (
- 'operater' => $user_info[ 'uid' ] ?? 0,
- 'operater_name' => $user_info[ 'username' ] ?? '',
- 'create_time' => time(),
- 'inventory_no' => $inventory_no,
- 'store_name' => $store_name,
- 'remark' => $params[ 'remark' ] ?? ''
- );
- //盘点单据
- $inventory_data = array_merge($data, $common_data);
- $inventory_id = model('stock_inventory')->add($inventory_data);
- $common_data[ 'inventory_id' ] = $inventory_id;
- foreach ($sku_list as $k => $goods_sku) {
- $goods_sku_id = $goods_sku[ 'goods_sku_id' ];
- $goods_num = numberFormat($goods_sku[ 'goods_num' ]);
- $goods_remark = '';
- //具体业务尚未调试,表结构不一致
- $goods_sku_info = model('goods_sku')->getInfo([ [ 'sku_id', '=', $goods_sku_id ] ], 'sku_id,goods_id,sku_name,sku_no,sku_image,spec_name');
- $goods_sku_data_info = model('store_goods_sku')->getInfo([ [ 'sku_id', '=', $goods_sku_id ], [ 'store_id', '=', $store_id ] ], '*');
- $goods_stock = $goods_sku_data_info[ 'real_stock' ] ?? 0;
- $goods_sku_data = [];
- $goods_sku_data[ 'inventory_num' ] = $goods_num;
- $goods_sku_data[ 'inventory_remark' ] = $goods_remark;
- $goods_sku_data[ 'goods_id' ] = $goods_sku_info[ 'goods_id' ];
- $goods_sku_data[ 'goods_sku_id' ] = $goods_sku_id;
- $goods_sku_data[ 'goods_sku_name' ] = $goods_sku_info[ 'sku_name' ];
- $goods_sku_data[ 'goods_sku_no' ] = $goods_sku_info[ 'sku_no' ];
- $goods_sku_data[ 'goods_sku_spec' ] = $goods_sku_info[ 'spec_name' ];
- $goods_sku_data[ 'goods_img' ] = $goods_sku_info[ 'sku_image' ];
- $goods_sku_data[ 'stock' ] = numberFormat($goods_stock);
- model('stock_inventory_goods')->add(array_merge($goods_sku_data, $common_data));
- }
- //主动调用审核
- $inventory_params = array (
- 'inventory_id' => $inventory_id,
- 'site_id' => $site_id,
- 'user_info' => $user_info
- );
- $audit_result = $this->audit($inventory_params);
- if ($audit_result[ 'code' ] < 0) {
- model('stock_inventory')->rollback();
- return $audit_result;
- }
- model('stock_inventory')->commit();
- return $this->success();
- } catch (\Exception $e) {
- model('stock_inventory')->rollback();
- return $this->error($e->getMessage() . $e->getFile() . $e->getLine());
- }
- }
- /**
- * 通过审核
- * @param $params
- */
- public function audit($params)
- {
- $inventory_id = $params[ 'inventory_id' ];
- $site_id = $params[ 'site_id' ];
- $user_info = $params[ 'user_info' ];
- $condition = array (
- [ 'inventory_id', '=', $inventory_id ],
- [ 'site_id', '=', $site_id ]
- );
- $info = model('stock_inventory')->getInfo($condition);
- if (empty($info))
- return $this->error([], '找不到可审核的单据');
- $data = array (
- 'status' => 1
- );
- model('stock_inventory')->update($data, $condition);
- $store_id = $info[ 'store_id' ];
- $result = $this->complete([ 'inventory_id' => $inventory_id, 'site_id' => $site_id, 'store_id' => $store_id, 'user_info' => $user_info ]);
- return $result;
- }
- /**
- * 单据通过审核
- * @param $params
- */
- public function complete($params)
- {
- $inventory_id = $params[ 'inventory_id' ];
- $user_info = $params[ 'user_info' ] ?? [];
- $site_id = $params[ 'site_id' ];
- $condition = array (
- [ 'inventory_id', '=', $inventory_id ],
- [ 'site_id', '=', $site_id ]
- );
- $info = model('stock_inventory')->getInfo($condition);
- if (empty($info))
- return $this->error([], '找不到可审核的单据');
- $stock_inventory_goods_list = model('stock_inventory_goods')->getList($condition, '*');
- if (empty($stock_inventory_goods_list))
- return $this->error([], '找不到可审核的单据');
- $store_id = $info[ 'store_id' ];
- $stat_data = $this->stat([ 'inventory_id' => $inventory_id, 'store_id' => $store_id ])[ 'data' ] ?? [];
- $data = array (
- 'kinds_num' => $stat_data[ 'kinds_num' ],
- 'kinds_profit_num' => $stat_data[ 'kinds_profit_num' ],
- 'kinds_loss_num' => $stat_data[ 'kinds_loss_num' ],
- 'kinds_even_num' => $stat_data[ 'kinds_even_num' ],
- 'num' => $stat_data[ 'num' ],
- 'profit_num' => $stat_data[ 'profit_num' ],
- 'loss_num' => $stat_data[ 'loss_num' ],
- 'even_num' => $stat_data[ 'even_num' ],
- 'profitloss_num' => $stat_data[ 'profitloss_num' ],
- 'inventory_cost_money' => $stat_data[ 'inventory_cost_money' ],
- 'profitloss_sale_money' => $stat_data[ 'profitloss_sale_money' ],
- );
- model('stock_inventory')->update($data, $condition);
- $inventory_goods_list = $stat_data[ 'inventory_goods_list' ] ?? [];
- $goods_model = new \app\model\goods\Goods();
- $store_goods_model = new StoreGoods();
- foreach ($inventory_goods_list as $k => $v) {
- $item_sku_id = $v[ 'goods_sku_id' ];
- $item_goods_id = $v[ 'goods_id' ];
- $input_array = [];
- $output_array = [];
- $item_condition = array (
- [ 'inventory_id', '=', $inventory_id ],
- [ 'goods_sku_id', '=', $item_sku_id ]
- );
- $item_data = array (
- 'inventory_id' => $inventory_id,
- 'goods_id' => $v[ 'goods_id' ],
- 'goods_sku_id' => $v[ 'goods_sku_id' ],
- 'stock' => $v[ 'stock' ],
- 'inventory_num' => $v[ 'inventory_num' ],
- 'inventory_remark' => $v[ 'inventory_remark' ] ?? '',
- 'profitloss_num' => $v[ 'profitloss_num' ],
- 'inventory_cost_money' => $v[ 'inventory_cost_money' ],
- 'profitloss_sale_money' => $v[ 'profitloss_sale_money' ],
- );
- model('stock_inventory_goods')->update($item_data, $item_condition);
- $store_goods_sku_condition = array (
- [ 'sku_id', '=', $item_sku_id ],
- [ 'store_id', '=', $store_id ]
- );
- $store_sku_info = $store_goods_model->getStoreGoodsSkuInfo($store_goods_sku_condition)[ 'data' ] ?? [];
- $store_sku_stock = $store_sku_info[ 'real_stock' ] ?? 0;
- $inventory_num = $v[ 'inventory_num' ];
- $goods_sku_condition = array (
- [ 'sku_id', '=', $item_sku_id ],
- );
- $sku_info = $goods_model->getGoodsSkuInfo($goods_sku_condition, 'sku_name, unit')[ 'data' ] ?? [];
- $item_price = $store_sku_info[ 'cost_price' ] ?? 0;
- $item_unit = $store_sku_info[ 'unit' ] ?? '件';
- $diff = abs($inventory_num - $store_sku_stock);
- if ($diff != 0) {
- if ($inventory_num > $store_sku_stock) {
- $input_array[] = [
- 'goods_id' => $item_goods_id,
- 'goods_sku_id' => $item_sku_id,
- 'goods_sku_name' => $sku_info[ 'sku_name' ],
- 'goods_unit' => $item_unit,
- 'goods_num' => $diff,
- 'goods_price' => $item_price,
- ];
- } else if ($inventory_num < $store_sku_stock) {
- $output_array[] = [
- 'goods_id' => $item_goods_id,
- 'goods_sku_id' => $item_sku_id,
- 'goods_sku_name' => $sku_info[ 'sku_name' ],
- 'goods_unit' => $item_unit,
- 'goods_num' => $diff,
- 'goods_price' => $item_price,
- ];
- }
- $document = new Document();
- $document_params = array (
- 'inventory_id' => $inventory_id,
- 'store_id' => $store_id,
- 'user_info' => $user_info,
- 'site_id' => $site_id
- );
- if (!empty($input_array)) {
- $document_params[ 'document_type' ] = 'PANYING';
- $document_params[ 'goods_sku_list' ] = $input_array;
- $result = $document->addDocument($document_params);
- }
- if (!empty($output_array)) {
- $document_params[ 'document_type' ] = 'PANKUI';
- $document_params[ 'goods_sku_list' ] = $output_array;
- $document_params[ 'is_out_stock' ] = 1;
- $result = $document->addDocument($document_params);
- }
- if ($result[ 'code' ] < 0) {
- return $result;
- }
- }
- }
- return $this->success();
- }
- /**
- * 数据统计以及整理
- * @param $params
- * @return array
- */
- public function stat($params)
- {
- $inventory_id = $params[ 'inventory_id' ];
- $condition = array (
- [ 'inventory_id', '=', $inventory_id ]
- );
- $info = model('stock_inventory')->getInfo($condition);
- $store_id = $info[ 'store_id' ];
- $kinds_num = $kinds_profit_num = $kinds_loss_num = $kinds_even_num = $num = $profit_num = $loss_num = $even_num = $profitloss_num = $inventory_cost_money = $profitloss_sale_money = 0;
- $stock_inventory_goods_list = model('stock_inventory_goods')->getList($condition, '*');
- $store_goods_model = new StoreGoods();
- $inventory_goods_list = [];
- foreach ($stock_inventory_goods_list as $k => $v) {
- $kinds_num++;
- $sku_id = $v[ 'goods_sku_id' ];
- $goods_id = $v[ 'goods_id' ];
- $store_sku_condition = array (
- [ 'store_id', '=', $store_id ],
- [ 'sku_id', '=', $sku_id ]
- );
- $v[ 'stock' ] = numberFormat($v[ 'stock' ]);
- $v[ 'inventory_num' ] = numberFormat($v[ 'inventory_num' ]);
- $v[ 'profitloss_num' ] = numberFormat($v[ 'profitloss_num' ]);
- $sku_info = model('goods_sku')->getInfo([ [ 'sku_id', '=', $sku_id ] ]);
- $item_info = $store_goods_model->getStoreGoodsSkuInfo($store_sku_condition)[ 'data' ] ?? [];
- $item_price = $item_info[ 'price' ] ?? 0;//销售价
- $item_cost_price = $item_info[ 'cost_price' ] ?? 0;// 成本价
- $item_stock = $item_info[ 'real_stock' ] ?? 0;//实物库存
- // $item_sale_stock = $item_info['stock'] ?? 0;//销售库存
- // $item_total_cost_money = $item_cost_price * $item_stock;//总成本价
- $item_total_sale_money = $item_price * $item_stock;//总销售价
- $inventory_num = $v[ 'inventory_num' ];//盘点数量
- $item_inventory_cost_money = $inventory_num * $item_cost_price;
- $inventory_cost_money += $item_inventory_cost_money;//盘点总成本价
- $ing_total_sale_money = $inventory_num * $item_price;//盘点总销售价
- $num += $inventory_num;//盘点总数
- $item_profitloss_num = $inventory_num - $item_stock;
- $item_profitloss_sale_money = 0;
- if ($item_profitloss_num == 0) {//持平
- $kinds_even_num++;
- $even_num += abs($item_profitloss_num);
- } else if ($item_profitloss_num > 0) {//盘盈数
- $kinds_profit_num++;
- $profit_num += abs($item_profitloss_num);
- $item_profitloss_sale_money = $ing_total_sale_money - $item_total_sale_money;
- } else {//盘亏数
- $kinds_loss_num++;
- $loss_num += abs($item_profitloss_num);
- }
- $profitloss_num += $item_profitloss_num;
- $profitloss_sale_money += $item_profitloss_sale_money;
- $inventory_goods_list[ $sku_id ] = [
- 'goods_id' => $goods_id,
- 'goods_sku_id' => $sku_id,
- 'goods_sku_name' => $sku_info[ 'sku_name' ],
- 'goods_sku_no' => $sku_info[ 'sku_no' ],
- 'goods_unit' => $sku_info[ 'unit' ],
- 'stock' => numberFormat($item_stock),
- 'inventory_num' => numberFormat($inventory_num),
- // 'goods_price' => $item_info['cost_price'],
- 'profitloss_num' => numberFormat($item_profitloss_num),
- 'inventory_cost_money' => $item_inventory_cost_money,
- 'profitloss_sale_money' => $item_profitloss_sale_money,
- ];
- }
- $data = array (
- 'kinds_num' => $kinds_num,
- 'kinds_profit_num' => $kinds_profit_num,
- 'kinds_loss_num' => $kinds_loss_num,
- 'kinds_even_num' => $kinds_even_num,
- 'num' => $num,
- 'profit_num' => $profit_num,
- 'loss_num' => $loss_num,
- 'even_num' => $even_num,
- 'profitloss_num' => $profitloss_num,
- 'inventory_cost_money' => $inventory_cost_money,
- 'profitloss_sale_money' => $profitloss_sale_money,
- 'inventory_goods_list' => $inventory_goods_list
- );
- return $this->success($data);
- }
- /**
- * 库存盘点单列表
- * @param array $conditionstock_document
- * @param number $page
- * @param string $page_size
- * @param string $order
- * @param string $field
- */
- public function getInventoryPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
- {
- $list = model('stock_inventory')->pageList($condition, $field, $order, $page, $page_size);
- foreach ($list as $k => $v) {
- if (isset($v[ 'num' ])) {
- $list[ $k ][ 'num' ] = numberFormat($list[ $k ][ 'num' ]);
- }
- if (isset($v[ 'profit_num' ])) {
- $list[ $k ][ 'profit_num' ] = numberFormat($list[ $k ][ 'profit_num' ]);
- }
- if (isset($v[ 'loss_num' ])) {
- $list[ $k ][ 'loss_num' ] = numberFormat($list[ $k ][ 'loss_num' ]);
- }
- if (isset($v[ 'even_num' ])) {
- $list[ $k ][ 'even_num' ] = numberFormat($list[ $k ][ 'even_num' ]);
- }
- if (isset($v[ 'profitloss_num' ])) {
- $list[ $k ][ 'profitloss_num' ] = numberFormat($list[ $k ][ 'profitloss_num' ]);
- }
- }
- return $this->success($list);
- }
- /**
- * 单据详情
- * @param array $condition
- * @param string $field
- */
- public function getInventoryInfo($condition = [], $field = '*')
- {
- $inventory_info = model('stock_inventory')->getInfo($condition, $field);
- if (!empty($inventory_info)) {
- if (isset($inventory_info[ 'num' ])) {
- $inventory_info[ 'num' ] = numberFormat($inventory_info[ 'num' ]);
- }
- if (isset($inventory_info[ 'profit_num' ])) {
- $inventory_info[ 'profit_num' ] = numberFormat($inventory_info[ 'profit_num' ]);
- }
- if (isset($inventory_info[ 'loss_num' ])) {
- $inventory_info[ 'loss_num' ] = numberFormat($inventory_info[ 'loss_num' ]);
- }
- if (isset($inventory_info[ 'even_num' ])) {
- $inventory_info[ 'even_num' ] = numberFormat($inventory_info[ 'even_num' ]);
- }
- if (isset($inventory_info[ 'profitloss_num' ])) {
- $inventory_info[ 'profitloss_num' ] = numberFormat($inventory_info[ 'profitloss_num' ]);
- }
- //单据产品项
- $inventory_goods_list = model('stock_inventory_goods')->getList([
- [ 'inventory_id', '=', $inventory_info[ 'inventory_id' ] ]
- ]);
- foreach ($inventory_goods_list as $k => $v) {
- $inventory_goods_list[ $k ][ 'stock' ] = numberFormat($inventory_goods_list[ $k ][ 'stock' ]);
- $inventory_goods_list[ $k ][ 'inventory_num' ] = numberFormat($inventory_goods_list[ $k ][ 'inventory_num' ]);
- $inventory_goods_list[ $k ][ 'profitloss_num' ] = numberFormat($inventory_goods_list[ $k ][ 'profitloss_num' ]);
- }
- $inventory_info[ 'goods_sku_list_array' ] = $inventory_goods_list;
- $inventory_info[ 'goods_count' ] = count($inventory_info[ 'goods_sku_list_array' ]);
- $inventory_info[ 'create_time' ] = date('Y-m-d H:i:s', $inventory_info[ 'create_time' ]);
- }
- return $this->success($inventory_info);
- }
- }
|