/b2b/core/model/trading/mdl.wholesaleSingle.php
PHP | 617 lines | 504 code | 74 blank | 39 comment | 69 complexity | 832264109d905822be3ec3debba82a67 MD5 | raw file
- <?php
- /**
- * mdl_wholesale
- *
- * @uses shopObject
- * @package trading
- * @version $Id: mdl.wholesale.php 1985 2008-09-03 06:36:02Z flaboy $
- * @copyright 2003-2007 ShopEx
- * @author liujy <liujy@shopex.cn>
- * @license Commercial
- */
- require_once('shopObject.php');
- class mdl_wholesaleSingle extends shopObject {
- var $idColumn = 'wss_id'; //??id??
- var $textColumn = 'name';
- var $defaultCols = 'name,wss_update_time';
- var $adminCtl = 'sale/wholesaleSingle';
- var $defaultOrder = array('wss_id','desc');
- var $tableName = 'sdb_wholesale_single';
- var $pmt_pre = array(
- 1 => 'discount',
- 2 => 'lessMoney',
- 3 => 'fixedPrice');
- var $_mlvid = NULL;
- function getColumns(){
- return array(
- 'wss_id'=>array('label'=>'????ID','class'=>'span-2'), /* ??ID */
- 'name'=>array('label'=>'??????','class'=>'span-9'), /* ?????? */
- //'wss_name'=>array('label'=>'??????','class'=>'span-9'), /* ?????? */
- 'wss_update_time'=>array('label'=>'??????','class'=>'span-3','type'=>'time:SDATE_STIME'), /* ???????? */
- );
- }
- function getFieldById($id, $aField=array('*')){
- return $this->db->selectrow('SELECT '.implode(',',$aField).' FROM sdb_wholesale_single WHERE wss_id='.intval($id));
- }
- //---------------------------------------------------------------------------
- function apply_action($func, &$trading_item, $config) {
- call_user_func_array(array(&$this,'_rule_ws_'.$func),array(&$trading_item,$config));
- }
- function _rule_ws_discount(&$trading_item, $discount){
- $trading_item['price'] = ($trading_item['sale_price'] * $discount>0)?($trading_item['sale_price'] * $discount):$trading_item['sale_price'];
- }
- function _rule_ws_lessMoney(&$trading_item, $money){
- $trading_item['price'] = ($trading_item['sale_price'] - $money>0)?($trading_item['sale_price'] - $money):0;
- }
- function _rule_ws_fixedSale_Price($trading_item, $money){
- $trading_item['price'] = ($money>0)?$money:0;
- }
- function _apply_ws_params(&$trading){
- $totalPrice = 0;
- $aSingleItems = array();
- foreach($trading['products'] as $p_k=>$product){
- $aParams=$product['wss_params'];
- if(($product['ws_policy']{0}&WS_SINGLE_ENABLE)&&isset($aParams)){
- $ifApply = false;
- foreach($aParams as $r_k=>$rule){
- if($product['nums']>=$aParams[$r_k]['num']){
- if(($product['nums']<$aParams[$r_k+1]['num'])||($r_k==count($aParams)-1)){
- $this->apply_action($this->pmt_pre[$rule['distype']],$trading['products'][$p_k],$aParams[$r_k]['discount']);
- if($trading['products'][$p_k]['price']<=$trading['products'][$p_k]['m_price']){
- $ifApply = true;
- }else{
- $trading['products'][$p_k]['price'] = $trading['products'][$p_k]['m_price'];
- }
- break;
- }
- }else{
- break;
- }
- }
- if($ifApply){
- $aSingleItems[] = $p_k;
- $trading['products'][$p_k]['amount'] = $trading['products'][$p_k]['price'] * $trading['products'][$p_k]['nums'];
- $totalPrice += $trading['products'][$p_k]['amount'];
- }
- }
- }
- $aSingleItems = array_unique($aSingleItems);
- $trading['ws_pdt'] = array_merge($trading['ws_pdt'], $aSingleItems);
- $trading['ws_single'] = array(
- 'totalPrice' => $totalPrice,
- 'items' => $aSingleItems);
- }
- function _get_pdt_ws_params(&$trading) {
- $aGid = array();
- foreach($trading['products'] as $k => $prows){
- if($prows['ws_policy']{0}&WS_SINGLE_ENABLE){
- $aGid[] = $prows['goods_id'];
-
- }
- }
- if($aGid){
- $aGid = array_unique($aGid);
- $sSql = 'select goods_id,wss_params from sdb_goods where goods_id in ('.implode(',',$aGid).')';
- foreach($this->db->select($sSql) as $rows){
- foreach($trading['products'] as $k => $prows){
- if($rows['goods_id']==$prows['goods_id']){
- if(isset($rows['wss_params'])){
- $trading['products'][$k]['wss_params'] = unserialize($rows['wss_params']);
- }
- }
- }
- }
- }
- }
-
- function apply_ws_rule(&$trading, $mlvid) {
- $this->_mlvid = $mlvid;
- $this->_get_pdt_ws_params($trading);
- $this->_apply_ws_params($trading);
- }
- //??---------------------------------------------------------------------------
- function getWholesaleByIds($aPara) {
- return $this->db->select('select * from sdb_wholesale_single where wss_id in ('.implode(',',$aPara).')');
- }
- function bindGoods($wssId, $bindGoods) {
- foreach ($bindGoods as $goodsId) {
- $aData['wss_id'] = $wssId;
- $aData['goods_id'] = $goodsId;
- $aRs = $this->db->query("SELECT * FROM sdb_ws_goods WHERE 0");
- $sSql = $this->db->getInsertSql($aRs,$aData);
- if (!$this->db->exec($sSql)) {
- return false;
- }
- }
- }
- function bindCat($wssId, $cat_id, $aBrand){
- $aData['wss_id'] = $wssId;
- $aData['cat_id'] = $cat_id;
- foreach($aBrand as $brand_id){
- $aData['brand_id'] = $brand_id;
- $rs = $this->db->exec('SELECT * FROM sdb_ws_goods_cat WHERE 0=1');
- $sSql = $this->db->getInsertSql($rs, $aData);
- if (!$this->db->exec($sSql)) {
- return false;
- }
- }
- }
- function execWholesale($aData){
- if(trim($aData['wss_name']) == ''){
- trigger_error("??????????",E_USER_ERROR);
- return false;
- exit;
- }
- $updater = array();
- $filter = array(1);
- $updater[] = 'ws_policy=\'11\''; //??????????????11?????????
- switch ($aData['ws_bind']) {
- case 0:
- break;
- case 1:
- //???? 1,2,3
- $filter = array('goods_id'=>$aData['bind']['bindGoods']);
- break;
- case 2:
- //??????
-
- $filter = array('cat_id'=>$aData['bind']['cat_id'],
- 'brand_id'=>$aData['bind']['brand_id']);
- break;
- case 3:
- //????
-
- $filter = array('brand_id'=>$aData['bind']['all_brand_id']);
- break;
- case 4:
- //???????
-
- $filter = array('cat_id'=>$aData['bind']['first_cat_id']);
- break;
- default:
- break;
- }
- $oProducts = $this->system->loadModel('goods/products');
- $updater[] = 'wss_params=\''.serialize($aData['wss_params']).'\'';
- $sSql = 'update sdb_goods set '.implode(',',$updater).' where '.$oProducts->_filter($filter);
-
- $this->db->exec($sSql);
- return true;
- }
-
- function addWholesale($aData) {
- $aTmp['name'] = $aData['name'];
- $aTmp['wss_name'] = $aData['wss_name'];
- $aTmp['wss_params'] = serialize($aData['wss_params']);
- $aTmp['wss_update_time'] = time();
- $aTmp['goods_range'] = $aData['goods_range'];
- $aTmp['member_range'] = $aData['member_range'];
- if(!empty($aData['wss_id'])){
- $aTmp['wss_id'] = $aData['wss_id'];
- $aRs = $this->db->query('SELECT * FROM sdb_wholesale_single WHERE '.$this->_filter(array('wss_id'=>$aTmp['wss_id'])));
- $sSql = $this->db->getUpdateSql($aRs,$aTmp,true);
- }else{
- $aRs = $this->db->query('SELECT * FROM sdb_wholesale_single WHERE 0');
- $sSql = $this->db->getInsertSql($aRs,$aTmp);
- }
-
- $rs = $this->db->exec($sSql);
- if($rs){
- if(empty($aData['wss_id'])){
- return $this->db->lastInsertId();
- }
- return true;
- }else{
- return false;
- }
- }
- function getWholesaleName($wsParams){ //??????????????????????????
- if(is_array($wsParams)){
- $aDescs = array();
- foreach($wsParams as $k => $v){
- switch($v['distype']){
- case 1:
- if($v['discount'] != 1){
- $aDecs[] = '?'.$v['num'].'??'.($v['discount']*100).'%';
- }else{
- if($v['num'] > 1){
- $limit_quantity = '?'.$v['num'].$lstDesc.'???';
- }
- }
- break;
- case 2:
- $aDecs[] = '?'.$v['num'].'?????'.$v['discount'].'?';
- break;
- case 3:
- $aDecs[] = '?'.$v['num'].'????'.$v['discount'].'?';
- break;
- }
- }
- if(!empty($limit_quantity)){
- if(empty($aDecs)){
- $aDecs[] = $limit_quantity;
- }else{
- $aDecs[0] = "?????????" . $aDecs[0];
- array_unshift($aDecs,$limit_quantity);
- }
- }
- $sDescs = implode('?',$aDecs);
-
- }
- return $sDescs;
- }
-
- /*
- * apply_wholesale2goods
- * ????????????????????????????
- *
- * @params $wss_id int ???id
- * @params $filter array ???id?????????array(1)
- *
- * @return boolen
- */
- function apply_wholesale2goods($wss_id,$filter){
- $oProducts = $this->system->loadModel('goods/products');
- $wholesale_info = $this->getFieldById($wss_id,array("wss_params"));
- $aRs = $this->db->query("SELECT * FROM sdb_goods WHERE ".$oProducts->_filter($filter));
- $sSql = $this->db->getUpdateSql($aRs,$wholesale_info);
- if($sSql){
- return $this->db->exec($sSql);
- }
- return true;
- }
-
- //???????????
- function getProductByRang($data){
- $mdl_cat = $this->system->loadModel('goods/productCat');
-
- $data = unserialize($data);
-
-
- $goods_id = array();
- $where = array();
- switch($data['ws_bind']){
- case 0:
- return 'all';
- break;
- case 1:
- $where[] = 'goods_id IN ('.join(',',$data['bindGoods']).')';
- break;
- case 2:
- $cat_id = $mdl_cat->getSubCatId($data['cat_id']);
- $cat_id[] = $data['cat_id'];
- $where[] = '( brand_id IN ('.join(',',$data['brand_id']).') AND cat_id IN ('.join(',',$cat_id).') )';
- break;
- case 3:
- $where[] = 'brand_id IN ('.join(',',$data['all_brand_id']).')';
- break;
- case 4:
- foreach($data['all_cat_id'] as $v){
- $cat_id = $mdl_cat->getSubCatId($v);
- $all_cat_id[] = $v;
- // if($cat_id){
- // $all_cat_id = array_merge($all_cat_id,$cat_id);
- // }
- }
- $where[] = 'cat_id IN ('.join(',',$all_cat_id).')';
- break;
- }
-
- if(!empty($where)){
- $where_str = 'WHERE '.join(' OR ',$where);
- }else{
- $where_str = '';
- }
-
- $sql = 'SELECT goods_id FROM sdb_goods '.$where_str;
- $row = $this->db->select($sql);
- $goods_id = array();
- foreach($row as $v){
- $goods_id[] = $v['goods_id'];
- }
- return join(',',$goods_id);
- }
-
- function getMemberByRange($member_range){
- $member_range = unserialize($member_range);
-
- switch($member_range['bind_type']){
- case 0:
- return 'all';
- break;
- case 1:
- $where = 'WHERE member_lv_id IN ('.join(',',$member_range['memlv_id']).')';
- break;
- case 2:
- $where = 'WHERE member_id IN ('.join(',',$member_range['member_id']).')';
- break;
- }
-
- $sql = 'SELECT member_id FROM sdb_members '.$where;
- $row = $this->db->select($sql);
-
- foreach($row as $v){
- $member_id[] = $v['member_id'];
- }
- return join(',',$member_id);
- }
-
- function check_relation($data){
- $goods = $this->getProductByRang(serialize($data['goods_range']));
- $member = $this->getMemberByRange(serialize($data['member_range']));
- $where = '';
- if($data['wss_id']){
- $where.= ' AND g.wss_id != '.$data['wss_id'];
- }
-
- if($goods == 'all'){
- $where.= ' AND g.goods_id = 0';
- }else{
- $where.= ' AND g.goods_id IN ('.$goods.')';
- }
-
- if($member == 'all'){
- $where.= ' AND m.member_id = 0';
- }else{
- $where.= ' AND m.member_id IN ('.$member.')';
- }
- //????????????????????
- $sql = 'SELECT g.wss_id,g.goods_id,m.member_id FROM sdb_wss_goods AS g LEFT JOIN sdb_wss_member AS m ON g.wss_id = m.wss_id WHERE 1'.$where;
- $row = $this->db->select($sql);
- if($row){
- return false;
- }else{
- return true;
- }
- }
-
- function save_relation($data){
- $goods = $this->getProductByRang(serialize($data['goods_range']));
- $member = $this->getMemberByRange(serialize($data['member_range']));
- $where = '';
- if(!$data['wss_id']){
- return false;
- }
-
- if($goods == 'all'){
- $goods_id[] = 0;
- }else{
- $goods_id = explode(',',$goods);
- }
-
- if($member == 'all'){
- $member_id[] = 0;
- }else{
- $member_id = explode(',',$member);
- }
-
- //?????????????
- $sql = 'DELETE FROM sdb_wss_goods WHERE wss_id = '.$data['wss_id'];
- $this->db->exec($sql);
-
- $sql = 'DELETE FROM sdb_wss_member WHERE wss_id = '.$data['wss_id'];
- $this->db->exec($sql);
-
- //????
- foreach($goods_id as $v){
- $sql = 'INSERT INTO sdb_wss_goods SET wss_id = '.$data['wss_id'].',goods_id = '.$v;
- $this->db->exec($sql);
- }
- foreach($member_id as $v){
- $sql = 'INSERT INTO sdb_wss_member SET wss_id = '.$data['wss_id'].',member_id = '.$v;
- $this->db->exec($sql);
- }
- return true;
- }
-
- function process_good_use_rule(&$goods){
- //?????????????????????????
- if($_COOKIE['MEMBER']){
- $member = explode('-',$_COOKIE['MEMBER']);
- }else{
- $member[] = 0;
- }
- $memberObj = $this->system->loadModel('member/account');
- if(!($memberInfo = $memberObj->verify($member[0],$member[2]))){
- $wss_id = null;
- }else{
- $member_id = $member[0];
- $wss_id = $this->get_use_rule($goods['goods_id'],$member_id);
- }
-
- if($wss_id){
- $goods['ws_policy'] = '11';
- $rule = $this->instance($wss_id);
- $goods['wss_params'] = $rule['wss_params'];
- }else{
- $goods['ws_policy'] = '01';
- $goods['wss_params'] = null;
- }
-
- }
-
- function get_use_rule($goods_id,$member_id){
- $sql = 'SELECT g.wss_id,g.goods_id FROM sdb_wss_goods AS g LEFT JOIN sdb_wss_member AS m on g.wss_id = m.wss_id WHERE g.goods_id IN ('.$goods_id.',0) AND m.member_id IN ('.$member_id.',0) AND g.disabled = "false"';
- $row = $this->db->select($sql);
-
- if(!$row || count($row)>1){
- return null;
- }else{
- return $row[0]['wss_id'];
- }
- }
-
- //???????????sdb_wss_goods,sdb_wss_member????
- function pre_delete($filter){
- $this->disabledMark = 'recycle';
- $wss_id = array();
- $sSql = "SELECT wss_id FROM sdb_wholesale_single WHERE " . $this->_filter($filter);
- if($aRet = $this->db->select($sSql)){
- foreach($aRet as $v){
- $wss_id[] = $v['wss_id'];
- }
- }
- if(!empty($wss_id)){
- $this->db->exec('DELETE FROM sdb_wss_member WHERE wss_id IN ('.implode($wss_id,',').')');
- $this->db->exec('DELETE FROM sdb_wss_goods WHERE wss_id IN ('.implode($wss_id,',').')');
- }
- }
-
- function ifIntersectActivity($data){
- $goods = $this->getProductByRang(serialize($data['goods_range']));
- $member = $this->getMemberByRange(serialize($data['member_range']));
-
- if($member == 'all' && $goods == 'all'){
- //????????????????????????
- $sql = 'SELECT * FROM sdb_kickback_setting WHERE pub="true" AND end_time > '.time();
- $row_k = $this->db->select($sql);
- $sql = 'SELECT * FROM sdb_order_activity WHERE end_time > '.time();
- $row_o = $this->db->select($sql);
- if($row_k || $row_o){
- return true;
- }else{
- return false;
- }
- }else{
- //?????????????????????????
- $kickback = $this->getIntersectKickback($member,$goods);
- $activity = $this->getIntersectActivity($member,$goods);
- if($kickback || $activity){
- return true;
- }else{
- return false;
- }
- }
- }
-
- function getIntersectKickback($member,$goods){
- $sql = 'SELECT * FROM sdb_kickback_setting WHERE pub="true" AND end_time > '.time();
- $row = $this->db->select($sql);
- $mdl_kickback = $this->system->loadModel('trading/kickback');
-
- //????????????
- $list = array();
- foreach($row as $v){
- $member_kickback = $mdl_kickback->getMemberByRange($v['members_range']);
- if($member_kickback == 'all'){
- $list[] = $v;
- }elseif($member == 'all'){
- $list[] = $v;
- }else{
- $member_kickback = explode(',',$member_kickback);
- $member_now = explode(',',$member);
-
- $member_intersect = array_intersect($member_now,$member_kickback);
- if(!empty($member_intersect)){
- $list[] = $v;
- }
- }
- }
-
- //??????????
- $intersect = array();
- if(!empty($list)){
- foreach($list as $v){
- $goods_kick = $mdl_kickback->getProductByRang($v['goods_rang']);
-
- if($goods_kick == 'all'){
- $intersect[] = $v;
- }elseif($goods == 'all'){
- $intersect[] = $v;
- }else{
- $goods_kick = explode(',',$goods_kick);
- $goods = explode(',',$goods);
-
- $goods_intersect = array_intersect($goods,$goods_kick);
- if(!empty($goods_intersect)){
- $intersect[] = $v;
- }
- }
- }
- return empty($intersect)?null:$intersect;
- }else{
- return null;
- }
- }
-
- function getIntersectActivity($member,$goods){
- $mdl_orderactivity = $this->system->loadModel('trading/orderactivity');
- $sql = 'SELECT * FROM sdb_order_activity WHERE end_time > '.time();
- $row = $this->db->select($sql);
-
- $list = array();
- if($member == 'all'){
- return empty($row)?null:$row;
- }else{
- if($row){
- foreach($row as $v){
- $member_activity = $mdl_orderactivity->getMemberByRange($v['member_range']);
-
- if($member_activity == 'all'){
- $list[] = $v;
- }else{
- $member_activity = explode(',',$member_activity);
- $member_now = explode(',',$member);
-
- $member_intersect = array_intersect($member_activity,$member_now);
- if(!empty($member_intersect)){
- $list[] = $v;
- }
- }
- }
- return empty($list)?null:$list;
- }
- }
- }
-
- function checkInputData($data){
- if(empty($data['name'])){
- return '??????';
- }
- return null;
- }
-
- function ifMeetRule($data,$member_id){
- $error_log = array();
- foreach($data['products'] as $v){
- $sql = 'SELECT * FROM sdb_products WHERE bn = "'.$v['bn'].'"';
- $product = $this->db->selectrow($sql);
-
- $wss_id = $this->get_use_rule($product['goods_id'],$member_id);
- if($wss_id){
- $wss = $this->instance($wss_id);
- $wss_params = unserialize($wss['wss_params']);
- $limit = $wss_params[0]['num'];
- if($v['num'] < $limit){
- $error_log[] = '???'.$v['bn'].'??????????';
- }
- }
- }
- return $error_log;
- }
- }
- ?>