mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-22 18:35:35 +08:00
560 lines
18 KiB
PHP
560 lines
18 KiB
PHP
<?php
|
||
/**
|
||
* Copyright © ShopeX (http://www.shopex.cn). All rights reserved.
|
||
* See LICENSE file for license details.
|
||
*/
|
||
|
||
/**
|
||
* 基础物料_查询数据Lib类
|
||
*
|
||
* @version 1.0
|
||
*/
|
||
|
||
class material_basic_select
|
||
{
|
||
public $schema = array();
|
||
|
||
function __construct()
|
||
{
|
||
$this->_basicMaterialObj = app::get('material')->model('basic_material');
|
||
$this->schema = $this->_basicMaterialObj->get_schema();
|
||
|
||
$this->db = kernel::database();
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 获取主表数据[step 1]
|
||
* @param String $cols
|
||
* @param Array $filter
|
||
* @param intval $offset
|
||
* @param intval $limit
|
||
* @param Array $orderby
|
||
* @return Array
|
||
*/
|
||
public function getlist($cols='*', $filter, $offset=0, $limit=-1, $orderby=null)
|
||
{
|
||
$sql_order = '';
|
||
if($orderby) $sql_order = ' ORDER BY ' . (is_array($orderby) ? implode($orderby,' ') : $orderby);
|
||
|
||
$cols = $this->get_cols($cols);#格式化字段
|
||
|
||
#sql
|
||
$sql = "SELECT ".$cols." FROM ".DB_PREFIX."material_basic_material WHERE ". $this->filter($filter). $sql_order;
|
||
$data = kernel::database()->selectlimit($sql, $limit, $offset);
|
||
|
||
return $data;
|
||
}
|
||
|
||
public function dump($cols='*', $filter)
|
||
{
|
||
$cols = $this->get_cols($cols);#格式化字段
|
||
|
||
#sql
|
||
$sql = "SELECT ".$cols." FROM ".DB_PREFIX."material_basic_material WHERE ". $this->filter($filter);
|
||
$data = kernel::database()->selectrow($sql);
|
||
|
||
return $data;
|
||
}
|
||
|
||
public function count($filter)
|
||
{
|
||
#sql
|
||
$sql = "SELECT count(*) AS num FROM ".DB_PREFIX."material_basic_material WHERE ". $this->filter($filter);
|
||
$data = kernel::database()->selectrow($sql);
|
||
|
||
return $data['num'];
|
||
}
|
||
|
||
/*------------------------------------------------------ */
|
||
//-- 格式化字段
|
||
/*------------------------------------------------------ */
|
||
public function get_cols($cols='*')
|
||
{
|
||
if(trim($cols) == '*')
|
||
{
|
||
$cols = "bm_id, material_bn, material_name, visibled, type";
|
||
}
|
||
else
|
||
{
|
||
$field = explode(',', $cols);
|
||
$cols_tmp = array();
|
||
|
||
foreach ($field as $key => $k_val)
|
||
{
|
||
$k_val = trim($k_val);
|
||
|
||
if($this->schema['columns'][$k_val])
|
||
{
|
||
$cols_tmp[] = $k_val;
|
||
}
|
||
}
|
||
$cols = implode(',', $cols_tmp);
|
||
}
|
||
|
||
$cols = str_replace('bm_id', 'bm_id AS product_id', $cols);
|
||
$cols = str_replace('material_bn', 'material_bn AS bn', $cols);
|
||
$cols = str_replace('material_name', 'material_name AS name', $cols);
|
||
$cols = str_replace('visibled', 'visibled AS visibility', $cols);
|
||
|
||
return $cols;
|
||
}
|
||
|
||
/*------------------------------------------------------ */
|
||
//-- 格式化查询条件
|
||
/*------------------------------------------------------ */
|
||
public function filter($filter, $tableAlias=null, $baseWhere=null)
|
||
{
|
||
$dbeav_filter_ret = '1';
|
||
|
||
if(is_array($filter) && !empty($filter))
|
||
{
|
||
foreach($filter AS $k => $v)
|
||
{
|
||
list($k_field, $k_type) = explode('|', $k);
|
||
if(!isset($this->schema['columns'][$k_field]))
|
||
{
|
||
unset($filter[$k]); //todo: 过滤不存在于dbschema里的filter
|
||
}
|
||
}
|
||
|
||
$dbeav_filter = kernel::single('dbeav_filter');
|
||
$dbeav_filter_ret = $dbeav_filter->dbeav_filter_parser($filter, $tableAlias, $baseWhere, $this->_basicMaterialObj);
|
||
}
|
||
|
||
return $dbeav_filter_ret;
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 获取主表与扩展表数据[step 2]
|
||
* @param String $cols
|
||
* @param Array $filter
|
||
* @param intval $offset
|
||
* @param intval $limit
|
||
* @param Array $orderby
|
||
* @return Array $filter
|
||
*/
|
||
public function getlist_ext($cols='*', $filter, $offset=0, $limit=-1, $orderby=null)
|
||
{
|
||
$mExtObj = app::get('material')->model('basic_material_ext');
|
||
$ext_schema = $mExtObj->get_schema();
|
||
|
||
$sql_order = '';
|
||
|
||
$cols = $this->get_cols_ext($cols, $ext_schema);#格式化字段
|
||
|
||
$where_sql = $this->get_filter_ext($filter, $ext_schema);#查询条件
|
||
|
||
#sql
|
||
$sql = "SELECT ".$cols." FROM ".DB_PREFIX."material_basic_material AS a
|
||
LEFT JOIN ".DB_PREFIX."material_basic_material_ext AS b ON a.bm_id=b.bm_id
|
||
WHERE ".$where_sql . $sql_order;
|
||
|
||
$data = kernel::database()->selectlimit($sql, $limit, $offset);
|
||
|
||
return $data;
|
||
}
|
||
|
||
public function dump_ext($cols='*', $filter)
|
||
{
|
||
$mExtObj = app::get('material')->model('basic_material_ext');
|
||
$ext_schema = $mExtObj->get_schema();
|
||
|
||
$cols = $this->get_cols_ext($cols, $ext_schema);#格式化字段
|
||
|
||
$where_sql = $this->get_filter_ext($filter, $ext_schema);#查询条件
|
||
|
||
#sql
|
||
$sql = "SELECT ".$cols." FROM ".DB_PREFIX."material_basic_material AS a
|
||
LEFT JOIN ".DB_PREFIX."material_basic_material_ext AS b ON a.bm_id=b.bm_id
|
||
WHERE ".$where_sql;
|
||
$data = kernel::database()->selectrow($sql);
|
||
return $data;
|
||
}
|
||
|
||
/*------------------------------------------------------ */
|
||
//-- 格式化扩展字段
|
||
/*------------------------------------------------------ */
|
||
public function get_cols_ext($cols='*', $ext_schema)
|
||
{
|
||
if(trim($cols) == '*')
|
||
{
|
||
$cols = "bm_id, material_bn, material_name, serial_number, visibled, type, retail_price, cost, weight, unit, specifications, brand_id, cat_id";
|
||
}
|
||
|
||
$field = explode(',', $cols);
|
||
$cols_tmp = array();
|
||
|
||
foreach ($field as $key => $k_val)
|
||
{
|
||
$k_val = trim($k_val);
|
||
|
||
if($this->schema['columns'][$k_val] && $k_val != 'cat_id')
|
||
{
|
||
$cols_tmp[] = 'a.'.$k_val;
|
||
}
|
||
elseif($ext_schema['columns'][$k_val])
|
||
{
|
||
$cols_tmp[] = 'b.'.$k_val;
|
||
}
|
||
}
|
||
$cols = implode(',', $cols_tmp);
|
||
|
||
$cols = str_replace('bm_id', 'bm_id AS product_id', $cols);
|
||
$cols = str_replace('material_bn', 'material_bn AS bn', $cols);
|
||
$cols = str_replace('material_name', 'material_name AS name', $cols);
|
||
$cols = str_replace('visibled', 'visibled AS visibility', $cols);
|
||
$cols = str_replace('retail_price', 'retail_price AS price', $cols);#销售价格
|
||
|
||
return $cols;
|
||
}
|
||
|
||
/*------------------------------------------------------ */
|
||
//-- 格式化查询扩展条件
|
||
/*------------------------------------------------------ */
|
||
public function get_filter_ext($filter, $ext_schema)
|
||
{
|
||
$where = array('1');
|
||
if(!empty($filter))
|
||
{
|
||
foreach ($filter as $key => $val)
|
||
{
|
||
list($k_field, $k_type) = explode('|', $key);
|
||
|
||
if($this->schema['columns'][$k_field])
|
||
{
|
||
$where[] = $this->getMultiFilter('a.' . $k_field, $k_type, $val);
|
||
}
|
||
elseif($ext_schema['columns'][$k_field])
|
||
{
|
||
$where[] = $this->getMultiFilter('b.' . $k_field, $k_type, $val);
|
||
}
|
||
}
|
||
}
|
||
$where_sql = implode(" AND ", $where);
|
||
|
||
return $where_sql;
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 获取主表与库存表数据[step 3]
|
||
* @param String $cols
|
||
* @param Array $filter
|
||
* @param intval $offset
|
||
* @param intval $limit
|
||
* @param Array $orderby
|
||
* @return Array $filter
|
||
*/
|
||
public function getlist_stock($cols='*', $filter, $offset=0, $limit=-1, $orderby=null)
|
||
{
|
||
$basicMaterialStockObj = app::get('material')->model('basic_material_stock');
|
||
$stock_schema = $basicMaterialStockObj->get_schema();
|
||
|
||
$sql_order = '';#默认不支持排序
|
||
|
||
$cols = $this->get_cols_stock($cols, $stock_schema);#格式化字段
|
||
|
||
$where_sql = $this->get_filter_ext($filter, $stock_schema);#查询条件
|
||
|
||
#sql
|
||
$sql = "SELECT ".$cols." FROM ".DB_PREFIX."material_basic_material AS a
|
||
LEFT JOIN ".DB_PREFIX."material_basic_material_stock AS b ON a.bm_id=b.bm_id
|
||
WHERE ".$where_sql . $sql_order;
|
||
$data = kernel::database()->selectlimit($sql, $limit, $offset);
|
||
|
||
return $data;
|
||
}
|
||
|
||
public function dump_stock($cols='*', $filter)
|
||
{
|
||
$mExtObj = app::get('material')->model('basic_material_stock');
|
||
$ext_schema = $mExtObj->get_schema();
|
||
|
||
$cols = $this->get_cols_stock($cols, $ext_schema);#格式化字段
|
||
|
||
$where_sql = $this->get_filter_ext($filter, $ext_schema);#查询条件
|
||
|
||
#sql
|
||
$sql = "SELECT ".$cols." FROM ".DB_PREFIX."material_basic_material AS a
|
||
LEFT JOIN ".DB_PREFIX."material_basic_material_stock AS b ON a.bm_id=b.bm_id
|
||
WHERE ".$where_sql;
|
||
$data = kernel::database()->selectrow($sql);
|
||
|
||
return $data;
|
||
}
|
||
|
||
/*------------------------------------------------------ */
|
||
//-- 格式化库存字段
|
||
/*------------------------------------------------------ */
|
||
public function get_cols_stock($cols='*', $stock_schema)
|
||
{
|
||
if(trim($cols) == '*')
|
||
{
|
||
$cols = "bm_id, material_bn, material_name, visibled, type, store, store_freeze,
|
||
alert_store, last_modified, real_store_lastmodify, max_store_lastmodify";
|
||
}
|
||
|
||
$field = explode(',', $cols);
|
||
$cols_tmp = array();
|
||
|
||
foreach ($field as $key => $k_val)
|
||
{
|
||
$k_val = trim($k_val);
|
||
|
||
if($this->schema['columns'][$k_val])
|
||
{
|
||
$cols_tmp[] = 'a.'.$k_val;
|
||
}
|
||
elseif($stock_schema['columns'][$k_val])
|
||
{
|
||
$cols_tmp[] = 'b.'.$k_val;
|
||
}
|
||
}
|
||
$cols = implode(',', $cols_tmp);
|
||
|
||
$cols = str_replace('bm_id', 'bm_id AS product_id', $cols);
|
||
$cols = str_replace('material_bn', 'material_bn AS bn', $cols);
|
||
$cols = str_replace('material_name', 'material_name AS name', $cols);
|
||
$cols = str_replace('visibled', 'visibled AS visibility', $cols);
|
||
|
||
return $cols;
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 统计
|
||
* @param Array $filter
|
||
* @return Array
|
||
*/
|
||
public function countAnother($filter=null)
|
||
{
|
||
$strWhere = '';
|
||
|
||
$count = ' count(*) ';
|
||
if(isset($filter['product_group']))
|
||
{
|
||
$count = ' COUNT(DISTINCT a.bm_id) ';
|
||
}
|
||
|
||
if(isset($filter['branch_id']))
|
||
{
|
||
if (is_array($filter['branch_id']))
|
||
{
|
||
$strWhere = ' AND b.branch_id IN ('.implode(',', $filter['branch_id']).') ';
|
||
}
|
||
else
|
||
{
|
||
$strWhere = ' AND b.branch_id = '.$filter['branch_id'];
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if ($filter['branch_ids'])
|
||
{
|
||
if (is_array($filter['branch_ids']))
|
||
{
|
||
$strWhere = ' AND b.branch_id IN ('.implode(',', $filter['branch_ids']).') ';
|
||
}
|
||
else
|
||
{
|
||
$strWhere = ' AND b.branch_id = '.$filter['branch_ids'];
|
||
}
|
||
}
|
||
}
|
||
|
||
$sql = 'SELECT count(*) AS num FROM '.DB_PREFIX.'material_basic_material AS a
|
||
LEFT JOIN '.DB_PREFIX.'ome_branch_product AS b ON a.bm_id = b.product_id
|
||
WHERE 1 ' . $strWhere;
|
||
|
||
$row = $this->db->selectrow($sql);
|
||
|
||
return intval($row['num']);
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 获取库存详情
|
||
* @param intval $product_id
|
||
* @return Array
|
||
*/
|
||
function products_detail($product_id)
|
||
{
|
||
$libBranchProductPos = kernel::single('ome_branch_product_pos');
|
||
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
|
||
|
||
#基础物料详情
|
||
$pro = $this->dump_stock('*', array('bm_id'=>$product_id));
|
||
|
||
#基础物料对应库存详情
|
||
$sql = 'SELECT p.product_id,p.branch_id,p.arrive_store,p.store,p.store_freeze,p.safe_store,p.is_locked, bc.name as branch_name
|
||
FROM '.DB_PREFIX.'ome_branch_product as p
|
||
LEFT JOIN '.DB_PREFIX.'ome_branch as bc ON bc.branch_id=p.branch_id
|
||
WHERE p.product_id='.$product_id;
|
||
$branch_product = $this->db->select($sql);
|
||
|
||
foreach($branch_product as $key=>$val)
|
||
{
|
||
$pos_string ='';
|
||
$posLists = $libBranchProductPos->get_pos($val['product_id'], $val['branch_id']);
|
||
if(count($posLists) > 0){
|
||
foreach($posLists as $pos){
|
||
$pos_string .= $pos['store_position'].",";
|
||
}
|
||
$branch_product[$key]['store_position'] = substr($pos_string,0,strlen($pos_string)-1);
|
||
}
|
||
|
||
//根据仓库ID、基础物料ID获取该物料仓库级的预占
|
||
$branch_product[$key]['store_freeze'] = $basicMStockFreezeLib->getBranchFreeze($val['product_id'], $val['branch_id']);
|
||
}
|
||
|
||
$pro['branch_product'] = $branch_product;
|
||
|
||
return $pro;
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 模糊搜索
|
||
* @param string $keywords
|
||
* @return Array
|
||
*/
|
||
function search_stockinfo($keywords, $branch_type, $limit = -1)
|
||
{
|
||
$basicMaterialBarcode = kernel::single('material_basic_material_barcode');
|
||
|
||
ini_set('memory_limit','128M');
|
||
|
||
if(empty($keywords))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
$limit_sql = '';
|
||
if($limit > 0)
|
||
{
|
||
$limit_sql = " limit ".$limit;
|
||
}
|
||
|
||
//增加是否是自有仓的库存查询,只显示自有仓储类型数据
|
||
$whereStr = '';
|
||
if($branch_type == 'selfwms'){
|
||
$is_super = kernel::single('desktop_user')->is_super();
|
||
$branch_ids = kernel::single('wms_branch')->getBranchwmsByUser($is_super);
|
||
$branch_ids = $branch_ids ?: [0];
|
||
$whereStr .= " AND b.branch_id in (".implode(',',$branch_ids).")";
|
||
}
|
||
|
||
$bm_ids = array();
|
||
//按物料名称,编码查询
|
||
$sql = "SELECT a.bm_id FROM ".DB_PREFIX."material_basic_material AS a
|
||
WHERE a.visibled=1 AND (a.material_bn like '%". $keywords ."%' OR a.material_name like '%". $keywords ."%')";
|
||
$result = $this->db->select($sql);
|
||
foreach ($result as $key => $val)
|
||
{
|
||
$bm_ids[] = $val['bm_id'];
|
||
}
|
||
|
||
//按条码查询
|
||
$tmp_bm_id = $basicMaterialBarcode->getIdByBarcode($keywords);
|
||
if($tmp_bm_id){
|
||
$bm_ids[] = $tmp_bm_id;
|
||
}
|
||
|
||
if(empty($bm_ids))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
$basicMStorageLifeLib = kernel::single('material_storagelife');
|
||
|
||
#库存
|
||
$ids = implode(',', $bm_ids);
|
||
$sql = "SELECT a.bm_id AS product_id, a.material_name AS name, a.material_bn AS bn, a.visibled AS visibility,
|
||
bpt.store, b.name AS branch, b.branch_id
|
||
FROM ".DB_PREFIX."material_basic_material AS a
|
||
LEFT JOIN ".DB_PREFIX."ome_branch_product AS bpt ON(a.bm_id=bpt.product_id)
|
||
LEFT JOIN ".DB_PREFIX."ome_branch AS b ON(bpt.branch_id=b.branch_id)
|
||
WHERE a.bm_id IN (".$ids.") " . $whereStr. $limit_sql;
|
||
$product_info = $this->db->select($sql);
|
||
|
||
#货位
|
||
$branch_product_posObj = kernel::single('ome_branch_product_pos');
|
||
foreach($product_info as $key => $val)
|
||
{
|
||
$pos_string ='';
|
||
$posLists = $branch_product_posObj->get_pos($val['product_id'], $val['branch_id']);
|
||
if(count($posLists) > 0)
|
||
{
|
||
foreach($posLists as $pos)
|
||
{
|
||
$pos_string .= $pos['store_position'].",";
|
||
}
|
||
|
||
$product_info[$key]['store_position'] = substr($pos_string, 0, strlen($pos_string)-1);
|
||
}
|
||
|
||
#查询关联的条形码
|
||
$product_info[$key]['barcode'] = $basicMaterialBarcode->getBarcodeById($val['product_id']);
|
||
|
||
#检查基础物料是否是保质期类型
|
||
$get_material_conf = $basicMStorageLifeLib->checkStorageLifeById($val['product_id']);
|
||
if($get_material_conf)
|
||
{
|
||
$get_storage_life = $basicMStorageLifeLib->getStorageLifeBatchList($val['product_id'], $val['branch_id']);
|
||
if($get_storage_life)
|
||
{
|
||
foreach ($get_storage_life as $key_j => $val)
|
||
{
|
||
$product_info[$key]['in_num'] += $val['in_num'];
|
||
$product_info[$key]['balance_num'] += $val['balance_num'];
|
||
|
||
#预警库存
|
||
if($val['warn_date'] <= time())
|
||
{
|
||
$product_info[$key]['warn_num'] += $val['balance_num'];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return $product_info;
|
||
}
|
||
|
||
/**
|
||
*解析搜索类型
|
||
*
|
||
**/
|
||
function getMultiFilter($col, $type, $var)
|
||
{
|
||
if(is_array($var) && ($type == '' || $type == 'nequal'))
|
||
{
|
||
$type = 'in';
|
||
}
|
||
elseif($type == '')
|
||
{
|
||
$type = 'nequal';
|
||
}
|
||
|
||
$FilterArray= array('than'=>' > '.$var,
|
||
'lthan'=>' < '.$var,
|
||
'nequal'=>' = \''.$var.'\'',
|
||
'noequal'=>' <> \''.$var.'\'',
|
||
'tequal'=>' = \''.$var.'\'',
|
||
'sthan'=>' <= '.$var,
|
||
'bthan'=>' >= '.$var,
|
||
'has'=>' like \'%'.$var.'%\'',
|
||
'head'=>' like \''.$var.'%\'',
|
||
'foot'=>' like \'%'.$var.'\'',
|
||
'nohas'=>' not like \'%'.$var.'%\'',
|
||
'between'=>" {$col}>=".$var[0].' and '." {$col}<".$var[1],
|
||
'in' =>" in ('".implode("','",(array)$var)."') ",
|
||
'notin' =>" not in ('".implode("','",(array)$var)."') ",
|
||
);
|
||
|
||
return $type == 'between' ? $FilterArray[$type] : $col . $FilterArray[$type];
|
||
}
|
||
}
|