Files
littleTiger/application/admin/logic/StockLogic.php
2019-02-28 19:48:21 +08:00

242 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Created by PhpStorm.
* User: lpy
* Date: 2018/8/16
* Time: 18:13
*/
namespace app\admin\logic;
use think\Page;
use think\AjaxPage;
use app\common\util\TpshopException;
class StockLogic
{
private $stockChangeType = [
0=>'订单出库',
1=>'商品录入',
2=>'退货入库',
3=>'盘点更新'
];
/**
* 获取出入库日志
* @return array
*/
public function getStockList()
{
$map = array();
$map['stock'] = array('gt',0); //默认获取入库日志
$mtype = I('mtype');
if(-1 == $mtype){
$map['stock'] = array('lt',0);
}
$goods_name = I('goods_name');
if($goods_name){
$map['goods_name'] = array('like',"%$goods_name%");
}
$ctime = urldecode(I('ctime'));
if($ctime){
$gap = explode(' - ', $ctime);
$map['ctime'] = array(array('gt',strtotime($gap[0])),array('lt',strtotime($gap[1])));
}
$model = M('stock_log');
$count = $model->where($map)->count();
$Page = new Page($count,20);
$show = $Page->show();
$stock_list = $model->where($map)->order('id desc')->limit($Page->firstRow.','.$Page->listRows)->select();
return array('pager'=>$Page,'page'=>$show, 'stock_list'=>$stock_list, 'stockChangeType'=>$this->stockChangeType);
}
/**
* 获取库存预警列表
* @return array
*/
public function getAjaxLowStockWarn()
{
$map = $this->get_map();
$warning_storage = tpCache('basic.warning_storage') ?: 10; //获取库存预警值默认为10
$goods_model = M('Goods');
$map['store_count'] = array('Lt', $warning_storage);
//获取无规格的的商品库存小于预警值的数量
$num1 = $goods_model->alias(a)
->whereNotExists('select `goods_id` from `tp_spec_goods_price` WHERE `goods_id`= a.goods_id')
->where($map)->count();
//查询无规格的库存小于预警值的商品信息
$sql = $goods_model->alias(a)
->whereNotExists('select `goods_id` from `tp_spec_goods_price` WHERE `goods_id`= a.goods_id')
->where($map)->field('goods_id, goods_sn, goods_name, cat_id, brand_id, store_count , NULL as key_name, NULL as item_id')
->fetchSql(true)->select();
unset($map['store_count']); //无需再判断goods中的store_count
//获取有规格库存小于预警值的数量
$num2 = $goods_model->alias(a)
->join('spec_goods_price b',"a.goods_id=b.goods_id AND b.store_count < $warning_storage")
->where($map)->count();
$count = $num1 + $num2;
$Page = new AjaxPage($count,20);
$show = $Page->show();
//合并查询有无规格的库存小于预警值的商品
$goodsList = $goods_model->alias(a)
->join('spec_goods_price b',"a.goods_id=b.goods_id AND b.store_count < $warning_storage")
->field('a.goods_id, a.goods_sn, a.goods_name, a.cat_id, a.brand_id, b.store_count, b.key_name, b.item_id')
->union($sql)->where($map)->order('store_count asc')->limit($Page->firstRow.','.$Page->listRows)->select();
$catList = M('goods_category')->field('id,name')->select();
$brandList = M('brand')->field('id,name')->select();
$catList = convert_arr_key($catList, 'id');
$brandList= convert_arr_key($brandList, 'id');
return array('pager'=>$Page, 'page'=>$show, 'catList'=>$catList, 'brand_list'=>$brandList, 'goodsList'=>$goodsList);
}
/**
* 库存盘点ajax获取库存列表
*/
public function getAjaxAlterStock()
{
$goods_model = M('Goods');
$map = $this->get_map();
//获取无规格的的商品数量
$num1 = $goods_model->alias(a)
->whereNotExists('select `goods_id` from `tp_spec_goods_price` WHERE `goods_id`= a.goods_id')
->where($map)->count();
//获取有规格数量
$num2 = $goods_model->alias(a)
->join('spec_goods_price b',"a.goods_id=b.goods_id")
->where($map)->count();
$count = $num1 + $num2;
$Page = new AjaxPage($count,20);
$show = $Page->show();
//查询无规格的商品
$sql = $goods_model->alias(a)
->whereNotExists('select `goods_id` from `tp_spec_goods_price` WHERE `goods_id`= a.goods_id')
->where($map)->field('goods_id, goods_sn, goods_name, cat_id, brand_id, store_count , NULL as key_name, NULL as item_id')
->fetchSql(true)->select();
//合并查询有无规格商品
$goodsList = $goods_model->alias(a)
->join('spec_goods_price b',"a.goods_id=b.goods_id")
->field('a.goods_id, a.goods_sn, a.goods_name, a.cat_id, a.brand_id, b.store_count, b.key_name, b.item_id')
->union($sql)->where($map)->limit($Page->firstRow.','.$Page->listRows)->select();
$catList = M('goods_category')->field('id,name')->select();
$brandList = M('brand')->field('id,name')->select();
$catList = convert_arr_key($catList, 'id');
$brandList= convert_arr_key($brandList, 'id');
return array('pager'=>$Page, 'page'=>$show, 'catList'=>$catList, 'brand_list'=>$brandList, 'goodsList'=>$goodsList);
}
/**
* 库存盘点(快速修改库存)
*/
public function doChangeStockVal($admin_id)
{
$ids = I('ids');
$data = I('data/d',''); //有值则为批量修改
$num = I('num/d');
if('' !== $data){
$num = $data;
}
if(!stripos($ids, ',')){ //ids参数中必带有
return array('status'=>0, 'msg'=>'修改失败');
}
$temp_arr = explode(',', $ids);
$item_ids= array_filter($temp_arr,function($val){if(stripos($val, '_')) return true;});
$goods_ids =array_filter(array_diff($temp_arr, $item_ids), function ($val){if(is_numeric($val)) return true;}); //保存无规格商品的goods_id array
$item_ids = array_map(function($val){return substr($val,5);}, $item_ids);//保存规格商品的item_id
$item_ids = implode(',',$item_ids);
//批量修改
try{
$goods_model = M('Goods');
$stock_log1=$stock_log2 =array();
$ctime = time();
if($item_ids){ //对规格商品进行库存修改
$spec_model = M('SpecGoodsPrice');
$spec_info = $spec_model->alias('a')
->where('a.item_id','in',$item_ids)->join('Goods g', 'a.goods_id=g.goods_id')
->field('a.goods_id, a.store_count, a.key_name, g.goods_name')
->select(); //获取规格商品信息
$stock_log1 = array_map(function($val) use ($num, $admin_id, $ctime){ //生成规格商品的stock_log记录
$val['stock'] = $num - $val['store_count']; //库存修改量
$val['muid'] = $admin_id;
$val['goods_spec'] = $val['key_name'];
$val['change_type'] = 3; //操作类型3库存盘点
$val['ctime'] = $ctime;
unset($val['key_name']);
unset($val['store_count']);
return $val;
},$spec_info);
$spec_model->where('item_id','in', $item_ids)->update(['store_count'=>$num]); //更新spec_goods_price的store_count
$goods_id = $spec_model->where('item_id','in',$item_ids)->field('goods_id')->select(); //找出规格商品对应的goods_id
$goods_id = array_unique(get_arr_column($goods_id,'goods_id')); //找出需要修改的规格商品的goods_id
$data = array();
foreach ($goods_id as $value) //获取规格商品的总库存
{
$count = $spec_model->where('goods_id',$value)->sum('store_count');
$data[] = array('store_count'=>$count,'goods_id'=>$value);
}
D('Goods')->saveAll($data); //更新规格商品的总库存
}
if($goods_ids){ //对无规格商品进行库存修改
$goods_info = $goods_model->where('goods_id','in', implode(',',$goods_ids))->field('goods_id, store_count, goods_name')->select();//获取原先库存量
$stock_log2 = array_map(function($val) use ($num, $admin_id, $ctime){ //生成无规格商品的stock_log记录
$val['stock'] = $num - $val['store_count']; //库存修改量
$val['muid'] = $admin_id;
$val['change_type'] = 3; //操作类型3库存盘点
$val['ctime'] = $ctime;
unset($val['store_count']);
return $val;
},$goods_info);
$goods_model->where('goods_id','in', implode(',',$goods_ids))->update(['store_count'=>$num]); //更新库存
}
//TODO stock_log表添加字段change_type `change_type` tinyint(2) NOT NULL COMMENT '更改操作类型 默认0订单出库 1商品录入 2退货入库 3盘点更改'
//记录stock_log
$stock_log = array_merge($stock_log1,$stock_log2);
D('stock_log')->saveAll($stock_log);
}catch (TpshopException $t){
$error = $t->getErrorArr();
return array('status'=>0 , 'msg'=>$error);
}
return array('status'=>1 , 'msg'=>'修改成功');
}
/**
* 获取搜索条件 在ajaxLowStockWarnajaxAlterStock中使用
*/
private function get_map(){
$map = array();
$intro = I('intro/s','');
$brand_id = I('brand_id/d','');
$is_on_sale = I('is_on_sale/d','');
$key_word = I('key_word') ? trim(I('key_word')) : '';
$cat_id = I('cat_id/d','');
if(!empty($intro))
{
$map[$intro] = array('EQ', 1);
}
if(!empty($brand_id)){
$map['brand_id'] = array('EQ', $brand_id);
}
if('' !==$is_on_sale){
$map['is_on_sale'] = array('EQ', $is_on_sale);
}
if(!empty($key_word ))
{
$map['goods_name|goods_sn'] = array('LIKE', "%$key_word%");
}
if(!empty($cat_id))
{
$grandson_ids = getCatGrandson($cat_id);
$map['cat_id'] = array('IN',$grandson_ids);
}
return $map;
}
}