PageRenderTime 33ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/b2b/core/model/trading/mdl.wholesaleSingle.php

http://phpfor.googlecode.com/
PHP | 617 lines | 504 code | 74 blank | 39 comment | 69 complexity | 832264109d905822be3ec3debba82a67 MD5 | raw file
  1. <?php
  2. /**
  3. * mdl_wholesale
  4. *
  5. * @uses shopObject
  6. * @package trading
  7. * @version $Id: mdl.wholesale.php 1985 2008-09-03 06:36:02Z flaboy $
  8. * @copyright 2003-2007 ShopEx
  9. * @author liujy <liujy@shopex.cn>
  10. * @license Commercial
  11. */
  12. require_once('shopObject.php');
  13. class mdl_wholesaleSingle extends shopObject {
  14. var $idColumn = 'wss_id'; //??id??
  15. var $textColumn = 'name';
  16. var $defaultCols = 'name,wss_update_time';
  17. var $adminCtl = 'sale/wholesaleSingle';
  18. var $defaultOrder = array('wss_id','desc');
  19. var $tableName = 'sdb_wholesale_single';
  20. var $pmt_pre = array(
  21. 1 => 'discount',
  22. 2 => 'lessMoney',
  23. 3 => 'fixedPrice');
  24. var $_mlvid = NULL;
  25. function getColumns(){
  26. return array(
  27. 'wss_id'=>array('label'=>'????ID','class'=>'span-2'), /* ??ID */
  28. 'name'=>array('label'=>'??????','class'=>'span-9'), /* ?????? */
  29. //'wss_name'=>array('label'=>'??????','class'=>'span-9'), /* ?????? */
  30. 'wss_update_time'=>array('label'=>'??????','class'=>'span-3','type'=>'time:SDATE_STIME'), /* ???????? */
  31. );
  32. }
  33. function getFieldById($id, $aField=array('*')){
  34. return $this->db->selectrow('SELECT '.implode(',',$aField).' FROM sdb_wholesale_single WHERE wss_id='.intval($id));
  35. }
  36. //---------------------------------------------------------------------------
  37. function apply_action($func, &$trading_item, $config) {
  38. call_user_func_array(array(&$this,'_rule_ws_'.$func),array(&$trading_item,$config));
  39. }
  40. function _rule_ws_discount(&$trading_item, $discount){
  41. $trading_item['price'] = ($trading_item['sale_price'] * $discount>0)?($trading_item['sale_price'] * $discount):$trading_item['sale_price'];
  42. }
  43. function _rule_ws_lessMoney(&$trading_item, $money){
  44. $trading_item['price'] = ($trading_item['sale_price'] - $money>0)?($trading_item['sale_price'] - $money):0;
  45. }
  46. function _rule_ws_fixedSale_Price($trading_item, $money){
  47. $trading_item['price'] = ($money>0)?$money:0;
  48. }
  49. function _apply_ws_params(&$trading){
  50. $totalPrice = 0;
  51. $aSingleItems = array();
  52. foreach($trading['products'] as $p_k=>$product){
  53. $aParams=$product['wss_params'];
  54. if(($product['ws_policy']{0}&WS_SINGLE_ENABLE)&&isset($aParams)){
  55. $ifApply = false;
  56. foreach($aParams as $r_k=>$rule){
  57. if($product['nums']>=$aParams[$r_k]['num']){
  58. if(($product['nums']<$aParams[$r_k+1]['num'])||($r_k==count($aParams)-1)){
  59. $this->apply_action($this->pmt_pre[$rule['distype']],$trading['products'][$p_k],$aParams[$r_k]['discount']);
  60. if($trading['products'][$p_k]['price']<=$trading['products'][$p_k]['m_price']){
  61. $ifApply = true;
  62. }else{
  63. $trading['products'][$p_k]['price'] = $trading['products'][$p_k]['m_price'];
  64. }
  65. break;
  66. }
  67. }else{
  68. break;
  69. }
  70. }
  71. if($ifApply){
  72. $aSingleItems[] = $p_k;
  73. $trading['products'][$p_k]['amount'] = $trading['products'][$p_k]['price'] * $trading['products'][$p_k]['nums'];
  74. $totalPrice += $trading['products'][$p_k]['amount'];
  75. }
  76. }
  77. }
  78. $aSingleItems = array_unique($aSingleItems);
  79. $trading['ws_pdt'] = array_merge($trading['ws_pdt'], $aSingleItems);
  80. $trading['ws_single'] = array(
  81. 'totalPrice' => $totalPrice,
  82. 'items' => $aSingleItems);
  83. }
  84. function _get_pdt_ws_params(&$trading) {
  85. $aGid = array();
  86. foreach($trading['products'] as $k => $prows){
  87. if($prows['ws_policy']{0}&WS_SINGLE_ENABLE){
  88. $aGid[] = $prows['goods_id'];
  89. }
  90. }
  91. if($aGid){
  92. $aGid = array_unique($aGid);
  93. $sSql = 'select goods_id,wss_params from sdb_goods where goods_id in ('.implode(',',$aGid).')';
  94. foreach($this->db->select($sSql) as $rows){
  95. foreach($trading['products'] as $k => $prows){
  96. if($rows['goods_id']==$prows['goods_id']){
  97. if(isset($rows['wss_params'])){
  98. $trading['products'][$k]['wss_params'] = unserialize($rows['wss_params']);
  99. }
  100. }
  101. }
  102. }
  103. }
  104. }
  105. function apply_ws_rule(&$trading, $mlvid) {
  106. $this->_mlvid = $mlvid;
  107. $this->_get_pdt_ws_params($trading);
  108. $this->_apply_ws_params($trading);
  109. }
  110. //??---------------------------------------------------------------------------
  111. function getWholesaleByIds($aPara) {
  112. return $this->db->select('select * from sdb_wholesale_single where wss_id in ('.implode(',',$aPara).')');
  113. }
  114. function bindGoods($wssId, $bindGoods) {
  115. foreach ($bindGoods as $goodsId) {
  116. $aData['wss_id'] = $wssId;
  117. $aData['goods_id'] = $goodsId;
  118. $aRs = $this->db->query("SELECT * FROM sdb_ws_goods WHERE 0");
  119. $sSql = $this->db->getInsertSql($aRs,$aData);
  120. if (!$this->db->exec($sSql)) {
  121. return false;
  122. }
  123. }
  124. }
  125. function bindCat($wssId, $cat_id, $aBrand){
  126. $aData['wss_id'] = $wssId;
  127. $aData['cat_id'] = $cat_id;
  128. foreach($aBrand as $brand_id){
  129. $aData['brand_id'] = $brand_id;
  130. $rs = $this->db->exec('SELECT * FROM sdb_ws_goods_cat WHERE 0=1');
  131. $sSql = $this->db->getInsertSql($rs, $aData);
  132. if (!$this->db->exec($sSql)) {
  133. return false;
  134. }
  135. }
  136. }
  137. function execWholesale($aData){
  138. if(trim($aData['wss_name']) == ''){
  139. trigger_error("??????????",E_USER_ERROR);
  140. return false;
  141. exit;
  142. }
  143. $updater = array();
  144. $filter = array(1);
  145. $updater[] = 'ws_policy=\'11\''; //??????????????11?????????
  146. switch ($aData['ws_bind']) {
  147. case 0:
  148. break;
  149. case 1:
  150. //???? 1,2,3
  151. $filter = array('goods_id'=>$aData['bind']['bindGoods']);
  152. break;
  153. case 2:
  154. //??????
  155. $filter = array('cat_id'=>$aData['bind']['cat_id'],
  156. 'brand_id'=>$aData['bind']['brand_id']);
  157. break;
  158. case 3:
  159. //????
  160. $filter = array('brand_id'=>$aData['bind']['all_brand_id']);
  161. break;
  162. case 4:
  163. //???????
  164. $filter = array('cat_id'=>$aData['bind']['first_cat_id']);
  165. break;
  166. default:
  167. break;
  168. }
  169. $oProducts = $this->system->loadModel('goods/products');
  170. $updater[] = 'wss_params=\''.serialize($aData['wss_params']).'\'';
  171. $sSql = 'update sdb_goods set '.implode(',',$updater).' where '.$oProducts->_filter($filter);
  172. $this->db->exec($sSql);
  173. return true;
  174. }
  175. function addWholesale($aData) {
  176. $aTmp['name'] = $aData['name'];
  177. $aTmp['wss_name'] = $aData['wss_name'];
  178. $aTmp['wss_params'] = serialize($aData['wss_params']);
  179. $aTmp['wss_update_time'] = time();
  180. $aTmp['goods_range'] = $aData['goods_range'];
  181. $aTmp['member_range'] = $aData['member_range'];
  182. if(!empty($aData['wss_id'])){
  183. $aTmp['wss_id'] = $aData['wss_id'];
  184. $aRs = $this->db->query('SELECT * FROM sdb_wholesale_single WHERE '.$this->_filter(array('wss_id'=>$aTmp['wss_id'])));
  185. $sSql = $this->db->getUpdateSql($aRs,$aTmp,true);
  186. }else{
  187. $aRs = $this->db->query('SELECT * FROM sdb_wholesale_single WHERE 0');
  188. $sSql = $this->db->getInsertSql($aRs,$aTmp);
  189. }
  190. $rs = $this->db->exec($sSql);
  191. if($rs){
  192. if(empty($aData['wss_id'])){
  193. return $this->db->lastInsertId();
  194. }
  195. return true;
  196. }else{
  197. return false;
  198. }
  199. }
  200. function getWholesaleName($wsParams){ //??????????????????????????
  201. if(is_array($wsParams)){
  202. $aDescs = array();
  203. foreach($wsParams as $k => $v){
  204. switch($v['distype']){
  205. case 1:
  206. if($v['discount'] != 1){
  207. $aDecs[] = '?'.$v['num'].'??'.($v['discount']*100).'%';
  208. }else{
  209. if($v['num'] > 1){
  210. $limit_quantity = '?'.$v['num'].$lstDesc.'???';
  211. }
  212. }
  213. break;
  214. case 2:
  215. $aDecs[] = '?'.$v['num'].'?????'.$v['discount'].'?';
  216. break;
  217. case 3:
  218. $aDecs[] = '?'.$v['num'].'????'.$v['discount'].'?';
  219. break;
  220. }
  221. }
  222. if(!empty($limit_quantity)){
  223. if(empty($aDecs)){
  224. $aDecs[] = $limit_quantity;
  225. }else{
  226. $aDecs[0] = "?????????" . $aDecs[0];
  227. array_unshift($aDecs,$limit_quantity);
  228. }
  229. }
  230. $sDescs = implode('?',$aDecs);
  231. }
  232. return $sDescs;
  233. }
  234. /*
  235. * apply_wholesale2goods
  236. * ????????????????????????????
  237. *
  238. * @params $wss_id int ???id
  239. * @params $filter array ???id?????????array(1)
  240. *
  241. * @return boolen
  242. */
  243. function apply_wholesale2goods($wss_id,$filter){
  244. $oProducts = $this->system->loadModel('goods/products');
  245. $wholesale_info = $this->getFieldById($wss_id,array("wss_params"));
  246. $aRs = $this->db->query("SELECT * FROM sdb_goods WHERE ".$oProducts->_filter($filter));
  247. $sSql = $this->db->getUpdateSql($aRs,$wholesale_info);
  248. if($sSql){
  249. return $this->db->exec($sSql);
  250. }
  251. return true;
  252. }
  253. //???????????
  254. function getProductByRang($data){
  255. $mdl_cat = $this->system->loadModel('goods/productCat');
  256. $data = unserialize($data);
  257. $goods_id = array();
  258. $where = array();
  259. switch($data['ws_bind']){
  260. case 0:
  261. return 'all';
  262. break;
  263. case 1:
  264. $where[] = 'goods_id IN ('.join(',',$data['bindGoods']).')';
  265. break;
  266. case 2:
  267. $cat_id = $mdl_cat->getSubCatId($data['cat_id']);
  268. $cat_id[] = $data['cat_id'];
  269. $where[] = '( brand_id IN ('.join(',',$data['brand_id']).') AND cat_id IN ('.join(',',$cat_id).') )';
  270. break;
  271. case 3:
  272. $where[] = 'brand_id IN ('.join(',',$data['all_brand_id']).')';
  273. break;
  274. case 4:
  275. foreach($data['all_cat_id'] as $v){
  276. $cat_id = $mdl_cat->getSubCatId($v);
  277. $all_cat_id[] = $v;
  278. // if($cat_id){
  279. // $all_cat_id = array_merge($all_cat_id,$cat_id);
  280. // }
  281. }
  282. $where[] = 'cat_id IN ('.join(',',$all_cat_id).')';
  283. break;
  284. }
  285. if(!empty($where)){
  286. $where_str = 'WHERE '.join(' OR ',$where);
  287. }else{
  288. $where_str = '';
  289. }
  290. $sql = 'SELECT goods_id FROM sdb_goods '.$where_str;
  291. $row = $this->db->select($sql);
  292. $goods_id = array();
  293. foreach($row as $v){
  294. $goods_id[] = $v['goods_id'];
  295. }
  296. return join(',',$goods_id);
  297. }
  298. function getMemberByRange($member_range){
  299. $member_range = unserialize($member_range);
  300. switch($member_range['bind_type']){
  301. case 0:
  302. return 'all';
  303. break;
  304. case 1:
  305. $where = 'WHERE member_lv_id IN ('.join(',',$member_range['memlv_id']).')';
  306. break;
  307. case 2:
  308. $where = 'WHERE member_id IN ('.join(',',$member_range['member_id']).')';
  309. break;
  310. }
  311. $sql = 'SELECT member_id FROM sdb_members '.$where;
  312. $row = $this->db->select($sql);
  313. foreach($row as $v){
  314. $member_id[] = $v['member_id'];
  315. }
  316. return join(',',$member_id);
  317. }
  318. function check_relation($data){
  319. $goods = $this->getProductByRang(serialize($data['goods_range']));
  320. $member = $this->getMemberByRange(serialize($data['member_range']));
  321. $where = '';
  322. if($data['wss_id']){
  323. $where.= ' AND g.wss_id != '.$data['wss_id'];
  324. }
  325. if($goods == 'all'){
  326. $where.= ' AND g.goods_id = 0';
  327. }else{
  328. $where.= ' AND g.goods_id IN ('.$goods.')';
  329. }
  330. if($member == 'all'){
  331. $where.= ' AND m.member_id = 0';
  332. }else{
  333. $where.= ' AND m.member_id IN ('.$member.')';
  334. }
  335. //????????????????????
  336. $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;
  337. $row = $this->db->select($sql);
  338. if($row){
  339. return false;
  340. }else{
  341. return true;
  342. }
  343. }
  344. function save_relation($data){
  345. $goods = $this->getProductByRang(serialize($data['goods_range']));
  346. $member = $this->getMemberByRange(serialize($data['member_range']));
  347. $where = '';
  348. if(!$data['wss_id']){
  349. return false;
  350. }
  351. if($goods == 'all'){
  352. $goods_id[] = 0;
  353. }else{
  354. $goods_id = explode(',',$goods);
  355. }
  356. if($member == 'all'){
  357. $member_id[] = 0;
  358. }else{
  359. $member_id = explode(',',$member);
  360. }
  361. //?????????????
  362. $sql = 'DELETE FROM sdb_wss_goods WHERE wss_id = '.$data['wss_id'];
  363. $this->db->exec($sql);
  364. $sql = 'DELETE FROM sdb_wss_member WHERE wss_id = '.$data['wss_id'];
  365. $this->db->exec($sql);
  366. //????
  367. foreach($goods_id as $v){
  368. $sql = 'INSERT INTO sdb_wss_goods SET wss_id = '.$data['wss_id'].',goods_id = '.$v;
  369. $this->db->exec($sql);
  370. }
  371. foreach($member_id as $v){
  372. $sql = 'INSERT INTO sdb_wss_member SET wss_id = '.$data['wss_id'].',member_id = '.$v;
  373. $this->db->exec($sql);
  374. }
  375. return true;
  376. }
  377. function process_good_use_rule(&$goods){
  378. //?????????????????????????
  379. if($_COOKIE['MEMBER']){
  380. $member = explode('-',$_COOKIE['MEMBER']);
  381. }else{
  382. $member[] = 0;
  383. }
  384. $memberObj = $this->system->loadModel('member/account');
  385. if(!($memberInfo = $memberObj->verify($member[0],$member[2]))){
  386. $wss_id = null;
  387. }else{
  388. $member_id = $member[0];
  389. $wss_id = $this->get_use_rule($goods['goods_id'],$member_id);
  390. }
  391. if($wss_id){
  392. $goods['ws_policy'] = '11';
  393. $rule = $this->instance($wss_id);
  394. $goods['wss_params'] = $rule['wss_params'];
  395. }else{
  396. $goods['ws_policy'] = '01';
  397. $goods['wss_params'] = null;
  398. }
  399. }
  400. function get_use_rule($goods_id,$member_id){
  401. $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"';
  402. $row = $this->db->select($sql);
  403. if(!$row || count($row)>1){
  404. return null;
  405. }else{
  406. return $row[0]['wss_id'];
  407. }
  408. }
  409. //???????????sdb_wss_goods,sdb_wss_member????
  410. function pre_delete($filter){
  411. $this->disabledMark = 'recycle';
  412. $wss_id = array();
  413. $sSql = "SELECT wss_id FROM sdb_wholesale_single WHERE " . $this->_filter($filter);
  414. if($aRet = $this->db->select($sSql)){
  415. foreach($aRet as $v){
  416. $wss_id[] = $v['wss_id'];
  417. }
  418. }
  419. if(!empty($wss_id)){
  420. $this->db->exec('DELETE FROM sdb_wss_member WHERE wss_id IN ('.implode($wss_id,',').')');
  421. $this->db->exec('DELETE FROM sdb_wss_goods WHERE wss_id IN ('.implode($wss_id,',').')');
  422. }
  423. }
  424. function ifIntersectActivity($data){
  425. $goods = $this->getProductByRang(serialize($data['goods_range']));
  426. $member = $this->getMemberByRange(serialize($data['member_range']));
  427. if($member == 'all' && $goods == 'all'){
  428. //????????????????????????
  429. $sql = 'SELECT * FROM sdb_kickback_setting WHERE pub="true" AND end_time > '.time();
  430. $row_k = $this->db->select($sql);
  431. $sql = 'SELECT * FROM sdb_order_activity WHERE end_time > '.time();
  432. $row_o = $this->db->select($sql);
  433. if($row_k || $row_o){
  434. return true;
  435. }else{
  436. return false;
  437. }
  438. }else{
  439. //?????????????????????????
  440. $kickback = $this->getIntersectKickback($member,$goods);
  441. $activity = $this->getIntersectActivity($member,$goods);
  442. if($kickback || $activity){
  443. return true;
  444. }else{
  445. return false;
  446. }
  447. }
  448. }
  449. function getIntersectKickback($member,$goods){
  450. $sql = 'SELECT * FROM sdb_kickback_setting WHERE pub="true" AND end_time > '.time();
  451. $row = $this->db->select($sql);
  452. $mdl_kickback = $this->system->loadModel('trading/kickback');
  453. //????????????
  454. $list = array();
  455. foreach($row as $v){
  456. $member_kickback = $mdl_kickback->getMemberByRange($v['members_range']);
  457. if($member_kickback == 'all'){
  458. $list[] = $v;
  459. }elseif($member == 'all'){
  460. $list[] = $v;
  461. }else{
  462. $member_kickback = explode(',',$member_kickback);
  463. $member_now = explode(',',$member);
  464. $member_intersect = array_intersect($member_now,$member_kickback);
  465. if(!empty($member_intersect)){
  466. $list[] = $v;
  467. }
  468. }
  469. }
  470. //??????????
  471. $intersect = array();
  472. if(!empty($list)){
  473. foreach($list as $v){
  474. $goods_kick = $mdl_kickback->getProductByRang($v['goods_rang']);
  475. if($goods_kick == 'all'){
  476. $intersect[] = $v;
  477. }elseif($goods == 'all'){
  478. $intersect[] = $v;
  479. }else{
  480. $goods_kick = explode(',',$goods_kick);
  481. $goods = explode(',',$goods);
  482. $goods_intersect = array_intersect($goods,$goods_kick);
  483. if(!empty($goods_intersect)){
  484. $intersect[] = $v;
  485. }
  486. }
  487. }
  488. return empty($intersect)?null:$intersect;
  489. }else{
  490. return null;
  491. }
  492. }
  493. function getIntersectActivity($member,$goods){
  494. $mdl_orderactivity = $this->system->loadModel('trading/orderactivity');
  495. $sql = 'SELECT * FROM sdb_order_activity WHERE end_time > '.time();
  496. $row = $this->db->select($sql);
  497. $list = array();
  498. if($member == 'all'){
  499. return empty($row)?null:$row;
  500. }else{
  501. if($row){
  502. foreach($row as $v){
  503. $member_activity = $mdl_orderactivity->getMemberByRange($v['member_range']);
  504. if($member_activity == 'all'){
  505. $list[] = $v;
  506. }else{
  507. $member_activity = explode(',',$member_activity);
  508. $member_now = explode(',',$member);
  509. $member_intersect = array_intersect($member_activity,$member_now);
  510. if(!empty($member_intersect)){
  511. $list[] = $v;
  512. }
  513. }
  514. }
  515. return empty($list)?null:$list;
  516. }
  517. }
  518. }
  519. function checkInputData($data){
  520. if(empty($data['name'])){
  521. return '??????';
  522. }
  523. return null;
  524. }
  525. function ifMeetRule($data,$member_id){
  526. $error_log = array();
  527. foreach($data['products'] as $v){
  528. $sql = 'SELECT * FROM sdb_products WHERE bn = "'.$v['bn'].'"';
  529. $product = $this->db->selectrow($sql);
  530. $wss_id = $this->get_use_rule($product['goods_id'],$member_id);
  531. if($wss_id){
  532. $wss = $this->instance($wss_id);
  533. $wss_params = unserialize($wss['wss_params']);
  534. $limit = $wss_params[0]['num'];
  535. if($v['num'] < $limit){
  536. $error_log[] = '???'.$v['bn'].'??????????';
  537. }
  538. }
  539. }
  540. return $error_log;
  541. }
  542. }
  543. ?>