model('branch_product');
$oBranch = app::get('ome')->model('branch');
$is_super = kernel::single('desktop_user')->is_super();
if (!$is_super){
$branch_ids = $oBranch->getBranchByUser(true);
if ($branch_ids){
$base_filter['branch_id'] = $branch_ids;
}else{
$base_filter['branch_id'] = 'false';
}
}
$sub_menu = array(
0 => array('label'=>app::get('base')->_('全部'),'optional'=>false,
'href'=>'index.php?app=wms&ctl=admin_stock&act=index',
)
);
$i=0;
foreach($sub_menu as $k=>$v){
if (!IS_NULL($v['filter'])){
$v['filter'] = array_merge($v['filter'], $base_filter);
}
if($k==0){
$sub_menu[$k]['addon']=$basicMaterialSelect->countAnother($base_filter);
}else if($k==1){
$sub_menu[$k]['addon']=$branch_productObj->countlist($base_filter);
}
$sub_menu[$k]['filter'] = $v['filter']?$v['filter']:null;
$sub_menu[$k]['href'] = $v['href'].'&view='.$i++;
}
return $sub_menu;
}
/**
* 自有仓储库存查看列表
*
*/
function index()
{
$is_super = kernel::single('desktop_user')->is_super();
$branch_ids = kernel::single('wms_branch')->getBranchwmsByUser($is_super);
if ($branch_ids){
$base_filter['branch_id'] = $branch_ids;
}else{
$base_filter['branch_id'] = 'false';
}
$actions = array(
array(
'label' => '批量设置安全库存',
'href'=>'index.php?app=wms&ctl=admin_stock&act=batch_safe_store',
'target' => "dialog::{width:700,height:400,title:'批量设置安全库存'}",
),
);
//只显示设置保质期的基础物料
if(app::get('material')->getConf('show.use_expire_material') == 1 && $_GET['expire'] == '1')
{
$label = '显示全部基础物料';
$filter_val = 0;
$base_filter['use_expire'] = 1;
}
else
{
$label = '只显示保质期物料';
$filter_val = 1;
unset($base_filter['use_expire']);
}
$actions['use_expire'] = array(
'label' => $label,
'href'=>'index.php?app=wms&ctl=admin_stock&act=show_expire_material&p[0]=' . $filter_val . '&p[1]=1',
);
$params = array(
'title'=>'基础物料列表',
'base_filter' => $base_filter,
'actions' => $actions,
'use_buildin_new_dialog' => false,
'use_buildin_set_tag'=>false,
'use_buildin_recycle'=>false,
'use_buildin_export'=>true,
'use_buildin_import'=>false,
'use_buildin_filter'=>true,
'use_buildin_selectrow'=>true,
'use_view_tab' => true,
'object_method'=>array('count'=>'countlist','getlist'=>'getlist')
);
$this->finder('wms_mdl_basic_material', $params);
}
/**
* 库存查询相关方法,2011.11.01更新
*/
function search(){
if($_POST['stock_search']){
$keywords = addslashes(trim($_POST['stock_search']));
$stockObj = kernel::single('wms_stock');
$data = $stockObj->search_stockinfo($keywords,'selfwms');
$str = ''.$keywords.'';
foreach ($data as &$row) {
$row['bn'] = str_replace($keywords,$str,$row['bn']);
$row['barcode'] = str_replace($keywords,$str,$row['barcode']);
$row['name'] = str_replace($keywords,$str,$row['name']);
}
$basicMaterial = kernel::single('material_info');
$info = $basicMaterial->get_material_info($keywords);
foreach($data as &$row){
$row['brand_name'] = $info['brand_name'];
$row['spec_info'] = $info['specifications'];
}
$this->pagedata['data'] = $data;
$this->pagedata['keywords'] = $keywords;
}
$this->page("admin/stock/search.html");
}
/**
* 批量设置安全库存
*/
public function batch_safe_store() {
//批量设置任务
if($_POST) {
$this -> batch_safe_store_set();
}
$branch_list = array();
$branch_id = 0;
$order_label = '';
$io = '';
$suObj = app::get('purchase')->model('supplier');
$data = $suObj->getList('supplier_id, name','',0,-1);
$branchObj = kernel::single('wms_branch');
// 获取操作员管辖仓库
$is_super = kernel::single('desktop_user')->is_super();
$selfbranch_id = $branchObj->getBranchwmsByUser($is_super);
$brObj = app::get('ome')->model('branch');
$row = $brObj->getList('branch_id, name',array('branch_id'=>$selfbranch_id),0,-1);
$this->pagedata['branch_list'] = $branch_list;
$is_super = 1;
$this->pagedata['is_super'] = $is_super;
$this->pagedata['supplier'] = $data;
$operator = kernel::single('desktop_user')->get_name();
$this->pagedata['operator'] = $operator;
$this->pagedata['branch'] = $row;
$this->pagedata['branchid'] = $branch_id;
$this->pagedata['sel_branch_id'] = intval($_GET['branch_id']);
$this->pagedata['cur_date'] = date('Ymd',time()).$order_label;
$this->pagedata['io'] = $io;
$this->pagedata['finder_id'] = $_GET['finder_id'];
$this->display("admin/stock/batch_safe_store.html");
}
/**
* 批量安全库存设置保存
*
*/
public function batch_safe_store_set()
{
$basicMaterialSelect = kernel::single('material_basic_select');
$page_no = intval($_POST['page_no']); // 分页处理
$page_size = 10;
$filter['branch_id'] = intval($_POST['branch']);//仓库
//$filter['is_locked'] = '0';//跳过已经锁定的商品
$filter['filter_sql'] = "( is_locked is null or is_locked = '0')";//修复当是否锁定字段为null的部分信息更新不到的问题
$init_all = intval($_POST['init_all']);
$init_type = intval($_POST['init_type']);//1固定数量,2按销量计算
$safe_store = intval($_POST['safe_store']);
$supply_type = intval($_POST['supply_type']);//1固定订货周期 2供应商补货
$last_modified = time();
if($init_all == 2) {//设置安全库存为0的商品
$filter['safe_store'] = 0;
} elseif($init_all == 3) {//设置选定的商品
if($_POST['product_ids'] == '_ALL_') {
$preFilter = explode(',', $_POST['selcondition']);
foreach($preFilter as $val) {
$oneFilter = explode('|', $val);
if($searchIndex = strpos($oneFilter[0], '_search')) {
$key = substr($oneFilter[0], 1, $searchIndex-1);
$compare[$key] = $oneFilter[1];
} else {
$key = $compare[$oneFilter[0]] ? $oneFilter[0] . '|' . $compare[$oneFilter[0]] : $oneFilter[0];
#基础物料名称_模糊搜索
if($key == 'material_name')
{
$key .= '|has';
}
$anotherFilter[$key] = $oneFilter[1];
}
}
$productData = $basicMaterialSelect->getlist('bm_id', $anotherFilter);
$product_ids = array();
foreach($productData as $key=>$_v){
if(!in_array($_v['product_id'], $product_ids)) {
$product_ids[] = $_v['product_id'];
}
}
$filter['product_id|in'] = $product_ids;
} else {
$filter['product_id|in'] = explode(',', $_POST['product_ids']);
}
}
$oBranchPorduct = app::get('ome')->model('branch_product');
if($init_type == 1) {//固定数量设置
$result = $oBranchPorduct->update(array('safe_store' => $safe_store, 'last_modified' => $last_modified), $filter);
$this->batch_upd_products();
echo('finish');
die();
}elseif($init_type == 2) {//按销量计算
$days = intval($_POST['days']);
$hour = intval($_POST['hour']);
//所有供应商的到货天数
if ($supply_type == 2) {
$oSupplier = app::get('purchase')->model('supplier');
$suppliers = $oSupplier->getList('supplier_id,arrive_days');
foreach ($suppliers as $v) {
$this->suppliers[$v['supplier_id']] = $v['arrive_days'];
}
}
$branch_products = $oBranchPorduct->getList('product_id', $filter, $page_no * $page_size, $page_size);
if (!$branch_products) {
$this->batch_upd_products();
echo('finish');
die();
} else {
if ($page_no == 0) {
$total_products = $oBranchPorduct->count($filter);
echo(ceil($total_products / $page_size));
}
}
for ($i = 0; $i < sizeof($branch_products); $i++) {
$safe_store = $this->calc_safe_store($branch_products[$i]['product_id'], $days, $hour, $filter['branch_id'], $supply_type);
$filter['product_id'] = $branch_products[$i]['product_id'];
$oBranchPorduct->update(array('safe_store' => $safe_store, 'last_modified' => $last_modified), $filter);
}
} else {
echo('Fatal error:init_type is null');
}
die();
// echo "";
}
/**
* 批量更新标志位,增加库存告警颜色提示
*/
public function batch_upd_products() {
$branchObj = kernel::single('wms_branch');
// 获取操作员管辖仓库
$is_super = kernel::single('desktop_user')->is_super();
$selfbranch_id = $branchObj->getBranchwmsByUser($is_super);
$sql = 'UPDATE sdb_material_basic_material_stock SET alert_store=0';
kernel::database()->exec($sql);
$sql = 'UPDATE sdb_material_basic_material_stock SET alert_store=999 WHERE bm_id IN
(
SELECT product_id FROM sdb_ome_branch_product
WHERE safe_store>(store - store_freeze + arrive_store) AND branch_id in ('.implode(',',$selfbranch_id).')
)
';
kernel::database()->exec($sql);
}
/**
* 计算商品的日平均销量
* @param int $product_id 商品ID
* @param int $days 天数,1-30
* @param int $hour 时间点,0-23
*/
public function calc_product_vol($product_id,$days,$hour,$branch_id){
$end_time = strtotime(date('Y-m-d '.$hour.':00:00'));
if(date('H')<$hour) {
$end_time = strtotime('-1 days',$end_time);
}
$start_time = strtotime('-'.$days.' days',$end_time);
/**
* sdb_ome_iostock type_id
* 3 销售出库
* 100 赠品出库
* 300 样品出库
* 7 直接出库
* 6 盘亏
* 5 残损出库
*/
$oIostock = app::get('ome')->model('iostock');
$sql = 'SELECT sum(nums) as total FROM sdb_ome_iostock AS A
LEFT JOIN sdb_ome_delivery_items_detail AS B ON A.original_item_id = B.item_detail_id
WHERE A.type_id=3
AND A.branch_id='.$branch_id.'
AND B.product_id='.$product_id.'
AND A.create_time>='.$start_time.'
AND A.create_time<='.$end_time.' ';
$sale_volumes = $oIostock -> db -> select($sql);
$sale_volumes = ceil($sale_volumes[0]['total']/$days);
return $sale_volumes;
}
/**
* 计算商品的安全库存数
* @param int $product_id 商品ID
* @param int $days 天数,1-30
* @param int $hour 时间点,0-23
*/
public function calc_safe_store($product_id,$days,$hour,$branch_id,$supply_type){
$arrive_days = $days;
//最近几天的日平均销量
$sale_volumes = $this -> calc_product_vol($product_id,$days,$hour,$branch_id);
//返回安全库存数
$safe_store = 0;
if($arrive_days) {
$safe_store = $sale_volumes * $arrive_days;
}
return $safe_store;
}
/**
* 基础物料保质期批次列表
* @return void
*/
function show_storage_life()
{
$branch_id = $_POST['branch_id'];
$bm_id = $_POST['bm_id'];
if(empty($branch_id) || empty($bm_id))
{
die('无效操作,请检查!');
}
$basicMStorageLifeLib = kernel::single('material_storagelife');
#基础物料保质期开关
$material_conf = $basicMStorageLifeLib->checkStorageLifeById($bm_id);
if(!$material_conf)
{
die('基础物料保质期开关未开启!');
}
#保质期批次列表
$storage_life_list = $basicMStorageLifeLib->getStorageLifeBatchList($bm_id, $branch_id);
$this->pagedata['branch_id'] = $branch_id;
$this->pagedata['bm_id'] = $bm_id;
$this->pagedata['storage_life_list'] = $storage_life_list;
$this->page('admin/stock/storage_life_list.html');
}
/**
* 只显示设置保质期的基础物料
* @param $filter_val
* @return void
*/
function show_expire_material($filter_val)
{
$this->begin('index.php?app=wms&ctl=admin_stock&act=index&expire=1');
if($filter_val == 1)
{
$value = 1;
}
else
{
$value = 0;
}
app::get('material')->setConf('show.use_expire_material', $value);
$this->end(true,'设置成功');
}
/**
* 导出基础物料对应自有仓库关联的保质期批次
* @param $bm_id
* @param $branch_id
* @return void
*/
function export_expire($bm_id, $branch_id)
{
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=".date('Ymd').".csv");
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
if(empty($branch_id) || empty($bm_id))
{
die('无效操作,请检查!');
}
$type = $_GET['type'];
#保质期批次列表
if($type == 'warn_date')
{
$sql = "SELECT * FROM sdb_material_basic_material_storage_life
WHERE bm_id='". $bm_id ."' AND branch_id='". $branch_id ."' AND warn_date<=" . time();
$storage_life_list = kernel::database()->select($sql);
}
else
{
$basicMStorageLifeLib = kernel::single('material_storagelife');
$storage_life_list = $basicMStorageLifeLib->getStorageLifeBatchList($bm_id, $branch_id);
}
#基础物料明细
$basicMaterialObj = app::get('material')->model('basic_material');
$basicMaterialRow = $basicMaterialObj->dump(array('bm_id'=>$bm_id), 'material_name');
#导出标题
$data_title = array();
$data_title[] = kernel::single('base_charset')->utf2local('*:序号');
$data_title[] = kernel::single('base_charset')->utf2local('*:保质期条码');
$data_title[] = kernel::single('base_charset')->utf2local('*:物料编码');
$data_title[] = kernel::single('base_charset')->utf2local('*:物料名称');
$data_title[] = kernel::single('base_charset')->utf2local('*:生产日期');
$data_title[] = kernel::single('base_charset')->utf2local('*:过期日期');
$data_title[] = kernel::single('base_charset')->utf2local('*:预警日期');
$data_title[] = kernel::single('base_charset')->utf2local('*:入库数量');
$data_title[] = kernel::single('base_charset')->utf2local('*:剩余数量');
$data_title[] = kernel::single('base_charset')->utf2local('*:预占数量');
#数据格式化
$data_list = array();
$material_name = kernel::single('base_charset')->utf2local($basicMaterialRow['material_name']);
foreach ($storage_life_list as $key => $val)
{
$data_list[$key] = array(
'key' => $key+1,
'expire_bn' => $val['expire_bn'],
'material_bn' => $val['material_bn'],
'material_name' => $material_name,
'production_date' => date('Y-m-d', $val['production_date']),
'expiring_date' => date('Y-m-d H:i:s', $val['expiring_date']),
'warn_date' => date('Y-m-d H:i:s', $val['warn_date']),
'in_num' => $val['in_num'],
'balance_num' => $val['balance_num'],
'freeze_num' => $val['freeze_num'],
);
}
unset($storage_life_list, $basicMaterialRow);
#output
echo '"'.implode('","', $data_title).'"';
echo "\n";
foreach ($data_list as $key => $val)
{
echo '"'.implode('","', $val).'"';
echo "\n";
}
}
/**
* 基础物料保质期批次列表[预警库存]
* @return void
*/
function show_warn_storage_life()
{
$branch_id = $_POST['branch_id'];
$bm_id = $_POST['bm_id'];
if(empty($branch_id) || empty($bm_id))
{
die('无效操作,请检查!');
}
$basicMStorageLifeLib = kernel::single('material_storagelife');
#基础物料保质期开关
$material_conf = $basicMStorageLifeLib->checkStorageLifeById($bm_id);
if(!$material_conf)
{
die('基础物料保质期开关未开启!');
}
#保质期批次列表
$sql = "SELECT * FROM sdb_material_basic_material_storage_life
WHERE bm_id='". $bm_id ."' AND branch_id='". $branch_id ."' AND warn_date<=" . time();
$storage_life_list = kernel::database()->select($sql);
$this->pagedata['branch_id'] = $branch_id;
$this->pagedata['bm_id'] = $bm_id;
$this->pagedata['storage_life_list'] = $storage_life_list;
$this->page('admin/stock/show_warn_storage_life.html');
}
}
?>