Commit d828c06a authored by chenchuanwen's avatar chenchuanwen

Merge branch 'lyz_goods_storage' of git.shenbd.com:qm-develop/shenbd into lyz_goods_storage

parents 965035ca 4da0ae28
...@@ -28,6 +28,7 @@ class GoodsController extends \Our\Controller_AbstractIndex { ...@@ -28,6 +28,7 @@ class GoodsController extends \Our\Controller_AbstractIndex {
$this->goodsService->addBrowseRecord($this->req[\Our\NameConst::data],$this->memberId); $this->goodsService->addBrowseRecord($this->req[\Our\NameConst::data],$this->memberId);
$this->success(array_merge($goodsInfo,array('store'=>$store,'recomndGoods'=>$recomndGoods,'evaluation'=>$evaluation,'groups'=>$groups,'share'=>$share),$coupons)); $this->success(array_merge($goodsInfo,array('store'=>$store,'recomndGoods'=>$recomndGoods,'evaluation'=>$evaluation,'groups'=>$groups,'share'=>$share),$coupons));
} }
/** /**
* 获取商品列表 * 获取商品列表
*/ */
......
...@@ -201,4 +201,8 @@ class HomeController extends \Our\Controller_AbstractIndex{ ...@@ -201,4 +201,8 @@ class HomeController extends \Our\Controller_AbstractIndex{
} }
} }
public function writeToFileAction(){
\Business\User\AddressServiceModel::getInstance()->writeToFile();
}
} }
\ No newline at end of file
...@@ -7,7 +7,7 @@ namespace Lock; ...@@ -7,7 +7,7 @@ namespace Lock;
* Description: * Description:
*/ */
interface ILock{ interface ILock{
const EXPIRE = 5; const EXPIRE = 1;
public function getLock($key, $timeout = self::EXPIRE); public function getLock($key, $timeout = self::EXPIRE);
......
...@@ -12,22 +12,30 @@ class RedisLock implements \Lock\ILock{ ...@@ -12,22 +12,30 @@ class RedisLock implements \Lock\ILock{
public function __construct() public function __construct()
{ {
$this->lockRedis = \Redis\Db0\LockRedisModel::getInstance(); $this->lockRedis = \Redis\Db1\LockRedisModel::getInstance();
}
public function getMicrotime(){
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
return $msectime;
} }
public function getLock($key, $timeout=self::EXPIRE) public function getLock($key, $timeout=self::EXPIRE)
{ {
$waitime = 20000; $currMicroTime = $this->getMicrotime();
$totalWaitime = 0; $is_lock = $this->lockRedis->tableSetnx($key, $currMicroTime+10);
$time = $timeout*1000000; // 不能获取锁
while ($totalWaitime < $time && false == $this->lockRedis->update($key, 1, $timeout)){ if(!$is_lock){
usleep($waitime); //判断锁是否过期
$totalWaitime += $waitime; $lock_time = $this->lockRedis->tableCacheGet($key);
} // 锁已过期,删除锁,重新获取
if ($totalWaitime >= $time){ if($currMicroTime>(float)$lock_time){
\Our\Log::getInstance()->write($key.' can not get lock for waiting '.$timeout.'s.'); $this->releaseLock($key);
throw new Exception('can not get lock for waiting '.$timeout.'s.'); $is_lock = $this->lockRedis->tableSetnx($key, $currMicroTime+$timeout);
}
} }
return $is_lock? true : false;
} }
public function releaseLock($key) public function releaseLock($key)
......
...@@ -48,27 +48,22 @@ class OrderConfirmUtil { ...@@ -48,27 +48,22 @@ class OrderConfirmUtil {
private $couponCacheFlag = false; private $couponCacheFlag = false;
/** public function addOrder($data,$memberId,$currentAddress){
* 添加订单 $isLock = \Lock\RedisLock::getInstance()->getLock('addOrder');
* @param $data if($isLock){
* @param $memberId $storeCartData = $this->checkPostData($data,$memberId,$currentAddress);
* @param $currentAddress //return $storeCartData;
* @param string $formId 小程序微信支付支付表单id if(CURRENTVERSION==\Our\NameConst::versionDefault){
* @return array $storeCartData = $this->checkDeliveryTypeAndPayway($storeCartData);
* @throws \Exception }else{
* User: King <358887571@qq.com> $storeCartData = $this->checkDeliveryTypeAndPaywayNew($storeCartData);
* Date: 2018/12/25 0025 }
* Time: 下午 3:01 $result = $this->saveOrderInfo($storeCartData);
*/ \Lock\RedisLock::getInstance()->releaseLock('addOrder');
public function addOrder($data, $memberId, $currentAddress, $formId = ''){ return $result;
$storeCartData = $this->checkPostData($data,$memberId,$currentAddress);
//return $storeCartData;
if(CURRENTVERSION==\Our\NameConst::versionDefault){
$storeCartData = $this->checkDeliveryTypeAndPayway($storeCartData);
}else{ }else{
$storeCartData = $this->checkDeliveryTypeAndPaywayNew($storeCartData); \Error\ErrorModel::throwException(\Error\CodeConfigModel::addOrderFrequently);
} }
return $this->saveOrderInfo($storeCartData, $formId);
} }
...@@ -82,10 +77,10 @@ class OrderConfirmUtil { ...@@ -82,10 +77,10 @@ class OrderConfirmUtil {
* @throws \Exception * @throws \Exception
*/ */
public function checkPostData($data,$memberId,$currentAddress){ public function checkPostData($data,$memberId,$currentAddress){
$dbName = \Our\DbNameConst::masterDBConnectName; $dbName = \Our\DbNameConst::salveDBConnectName;
$this->memberId = $memberId; $this->memberId = $memberId;
$this->member = \DAO\MemberModel::getInstance()->getInfo($this->memberId); $this->member = \DAO\MemberModel::getInstance()->getInfo($this->memberId);
$this ->address = $this->checkCurrentAddress($currentAddress,$this->memberId); $this->address = $this->checkCurrentAddress($currentAddress,$this->memberId);
//if($this ->address['addressId'] == ) //if($this ->address['addressId'] == )
$this->postData = json_decode($data['param'],true); $this->postData = json_decode($data['param'],true);
if(!$this->postData){ if(!$this->postData){
...@@ -346,7 +341,7 @@ class OrderConfirmUtil { ...@@ -346,7 +341,7 @@ class OrderConfirmUtil {
*/ */
public function checkDeliveryTypeAndPaywayNew($storeCartData){ public function checkDeliveryTypeAndPaywayNew($storeCartData){
$cartService = \Business\Cart\CartServiceModel::getInstance(); $cartService = \Business\Cart\CartServiceModel::getInstance();
$storeCartData = $cartService->getDeliveryTypeForCartNew($this->address,$storeCartData,\Our\DbNameConst::masterDBConnectName,true); $storeCartData = $cartService->getDeliveryTypeForCartNew($this->address,$storeCartData,\Our\DbNameConst::salveDBConnectName,true);
$currentTime = time(); $currentTime = time();
$todayTime = strtotime(date('Y-m-d',time())); $todayTime = strtotime(date('Y-m-d',time()));
$tomorrowTime = $todayTime + \Our\ApiConst::oneDaySecond; $tomorrowTime = $todayTime + \Our\ApiConst::oneDaySecond;
...@@ -769,6 +764,7 @@ class OrderConfirmUtil { ...@@ -769,6 +764,7 @@ class OrderConfirmUtil {
$memberCouponDao = \DAO\Coupon\MemberCouponModel::getInstance(); $memberCouponDao = \DAO\Coupon\MemberCouponModel::getInstance();
$couponService = \Business\Coupon\CouponServiceModel::getInstance(); $couponService = \Business\Coupon\CouponServiceModel::getInstance();
\Our\RedisHelper::delCachedFunction(\Redis\Db13\MemberCouponRedisModel::getInstance(),array(&$memberCouponDao, 'getList'),array(),array($this->memberId)); \Our\RedisHelper::delCachedFunction(\Redis\Db13\MemberCouponRedisModel::getInstance(),array(&$memberCouponDao, 'getList'),array(),array($this->memberId));
\Redis\Db13\MemberCouponRedisModel::getInstance()->tableDel(\Our\NameConst::memberCounponListPrefix.$this->memberId);
foreach($this->storeIds as $tempStoreId){ foreach($this->storeIds as $tempStoreId){
\Our\RedisHelper::delCachedFunction(\Redis\Db13\CouponRedisModel::getInstance(), array(&$couponService, 'getStoreCouponsById'),array(),array($tempStoreId."_".$this->memberId)); \Our\RedisHelper::delCachedFunction(\Redis\Db13\CouponRedisModel::getInstance(), array(&$couponService, 'getStoreCouponsById'),array(),array($tempStoreId."_".$this->memberId));
} }
...@@ -917,11 +913,13 @@ class OrderConfirmUtil { ...@@ -917,11 +913,13 @@ class OrderConfirmUtil {
\Our\RedisHelper::delCachedFunction(\Redis\Db4\PBundlingRedisModel::getInstance(),array(&$pbundlingInstance, 'getList'),array(),array($storeId)); \Our\RedisHelper::delCachedFunction(\Redis\Db4\PBundlingRedisModel::getInstance(),array(&$pbundlingInstance, 'getList'),array(),array($storeId));
} }
} }
$this->updateGoodsStorageToDBAndCache($goodsCommonIds,$goodsIds,$blIds,$goodsNewList,$op,$updateSaleNumFlag); //$this->updateGoodsStorageToDBAndCache($goodsCommonIds,$goodsIds,$blIds,$goodsNewList,$op,$updateSaleNumFlag);
$this->updateGoodsStorageToCache($goodsCommonIds,$goodsIds,$blIds,$goodsNewList,$op,$updateSaleNumFlag);
return true; return true;
} }
/** /**
* 更新库存信息到数据库
* @param $goodsCommons * @param $goodsCommons
* @param $goodsList * @param $goodsList
* @param $blGoodsList * @param $blGoodsList
...@@ -932,7 +930,7 @@ class OrderConfirmUtil { ...@@ -932,7 +930,7 @@ class OrderConfirmUtil {
* @throws \Error\OurExceptionModel * @throws \Error\OurExceptionModel
* @throws \Exception * @throws \Exception
*/ */
public function updateGoodsStorageToDBAndCache($goodsCommons,$goodsList,$blGoodsList,$goodsNewList,$op=\Our\ApiConst::minus,$updateSaleNumFlag=true){ public function updateGoodsStorageToDB($goodsCommons,$goodsList,$blGoodsList,$goodsNewList,$op=\Our\ApiConst::minus,$updateSaleNumFlag=true){
if($blGoodsList){ if($blGoodsList){
$dbName = \Our\DbNameConst::masterDBConnectName; $dbName = \Our\DbNameConst::masterDBConnectName;
$pBundlingDao = \DAO\PBundlingModel::getInstance($dbName); $pBundlingDao = \DAO\PBundlingModel::getInstance($dbName);
...@@ -953,7 +951,77 @@ class OrderConfirmUtil { ...@@ -953,7 +951,77 @@ class OrderConfirmUtil {
\Error\ErrorModel::throwException(\Error\CodeConfigModel::goodsStorageToDBFailedForOrder); \Error\ErrorModel::throwException(\Error\CodeConfigModel::goodsStorageToDBFailedForOrder);
} }
} }
return true;
}
/**
* 更新库存信息到缓存
* @param $goodsCommons
* @param $goodsList
* @param $blGoodsList
* @param $goodsNewList
* @param int $op
* @param bool $updateSaleNumFlag
* @return bool
* @throws \Error\OurExceptionModel
* @throws \Exception
*/
public function updateGoodsStorageToCache($goodsCommons,$goodsList,$blGoodsList,$goodsNewList,$op=\Our\ApiConst::minus,$updateSaleNumFlag=true){
$pBundlingDao = \DAO\PBundlingModel::getInstance();
$goodsDao = \DAO\GoodsModel::getInstance();
if($blGoodsList){
foreach($blGoodsList as $key=>$blGoods){
$pBundlingCacheResult = $pBundlingDao->opBlGoodsStorage($key,$blGoods['blStorage'],$op);//组合销售库存删减
if($pBundlingCacheResult===false){
\Error\ErrorModel::throwException(\Error\CodeConfigModel::blGoodsStorageToCacheFailedForOrder);
}
$pBundlingDao->addChangedPBundlingStorage(serialize(array('bl_id'=>$key,'bl_storage'=>$blGoods['blStorage'],'op'=>$op)));
}
}
if($goodsCommons&&$goodsList){
$resultGoodsCache = $goodsDao->opOnlineStorageGoodsByGoodsCommonIds($goodsList,$op,$updateSaleNumFlag);
if(!$resultGoodsCache){
\Error\ErrorModel::throwException(\Error\CodeConfigModel::goodsStorageToCacheFailedForOrder);
}
}
\Our\Common::redisPublish('\Business\Goods\GoodsCommonServiceModel','updateAllStorageForPublish',array());
return true;
}
/**
* @param $goodsCommons
* @param $goodsList
* @param $blGoodsList
* @param $goodsNewList
* @param int $op
* @param bool $updateSaleNumFlag
* @return bool
* @throws \Error\OurExceptionModel
* @throws \Exception
*/
public function updateGoodsStorageToDBAndCache($goodsCommons,$goodsList,$blGoodsList,$goodsNewList,$op=\Our\ApiConst::minus,$updateSaleNumFlag=true){
if($blGoodsList){
$dbName = \Our\DbNameConst::masterDBConnectName;
$pBundlingDao = \DAO\PBundlingModel::getInstance($dbName);
$pBundlingResult = $pBundlingDao->updateBlStorage($blGoodsList);
if(!$pBundlingResult){
\Error\ErrorModel::throwException(\Error\CodeConfigModel::blGoodsStorageToDBFailedForOrder);
}
}
if($goodsCommons&&$goodsList){
$dbName = \Our\DbNameConst::masterDBConnectName;
$goodsDao = \DAO\GoodsModel::getInstance($dbName);
$goodsCommonDao = \DAO\GoodsCommonModel::getInstance($dbName);
$resultGoodsCommon = $goodsCommonDao->updateGoodsStorage($goodsCommons,$op,$updateSaleNumFlag);
$resultGoods = $goodsDao->updateGoodsStorage($goodsNewList,$op);
if(!($resultGoodsCommon&&$resultGoods)){
\Error\ErrorModel::throwException(\Error\CodeConfigModel::goodsStorageToDBFailedForOrder);
}
}
if($blGoodsList){ if($blGoodsList){
foreach($blGoodsList as $key=>$blGoods){ foreach($blGoodsList as $key=>$blGoods){
$pBundlingCacheResult = $pBundlingDao->opBlGoodsStorage($key,$blGoods['blStorage'],$op);//组合销售库存删减 $pBundlingCacheResult = $pBundlingDao->opBlGoodsStorage($key,$blGoods['blStorage'],$op);//组合销售库存删减
...@@ -1014,8 +1082,7 @@ class OrderConfirmUtil { ...@@ -1014,8 +1082,7 @@ class OrderConfirmUtil {
//第一步:获取购物车可展示优惠券信息 //第一步:获取购物车可展示优惠券信息
$memberCouponDao = \DAO\Coupon\MemberCouponModel::getInstance(\Our\DbNameConst::masterDBConnectName); $memberCouponDao = \DAO\Coupon\MemberCouponModel::getInstance(\Our\DbNameConst::masterDBConnectName);
$whereSql = ' coupon_state ='.\Our\ApiConst::couponUnused.' and member_id ='.$memberId.' and out_time > '.time(); $memberCouponArray = $memberCouponDao->getMemberCouponByMemberIdWithOuttime($memberId);
$memberCouponArray = $memberCouponDao->getList($whereSql,'coupon_id');
if(!$memberCouponArray){ if(!$memberCouponArray){
$storeCartData['couponList'] = array(); $storeCartData['couponList'] = array();
return $storeCartData; return $storeCartData;
......
...@@ -68,6 +68,8 @@ class NameConst { ...@@ -68,6 +68,8 @@ class NameConst {
const nearbyStoreGoodsPrefix = 'nearbyStoreGoods_'; const nearbyStoreGoodsPrefix = 'nearbyStoreGoods_';
const memberCounponListPrefix = 'unusedMemberCouponList_';
const cityCode = 'cityCode'; const cityCode = 'cityCode';
const lat = 'lat'; const lat = 'lat';
const lng = 'lng'; const lng = 'lng';
...@@ -132,6 +134,8 @@ class NameConst { ...@@ -132,6 +134,8 @@ class NameConst {
const onlineStorageBlGoodsPrefix = 'onlineStorageBlGoods';//组合销售库存前缀 const onlineStorageBlGoodsPrefix = 'onlineStorageBlGoods';//组合销售库存前缀
const onlineStorageBlGoodsOriginPrefix = 'onlineStorageBlGoodsOrigin';//组合销售本身库存前缀
const storeCoverPrefix = 'storeCover_'; const storeCoverPrefix = 'storeCover_';
const storeMiddleAdvsPrefix = 'storeMiddleAdvs_'; const storeMiddleAdvsPrefix = 'storeMiddleAdvs_';
...@@ -202,6 +206,12 @@ class NameConst { ...@@ -202,6 +206,12 @@ class NameConst {
const xp='xp'; const xp='xp';
const win='win'; const win='win';
const pBundlingStorageRedisPrefix = 'pBundlingStorage_';
const goodsStorageRedisPrefix = 'goodsStorage_';
const changedPBundlingStoragePrefix = 'changedPBundlingStorage';
const changedGoodsStoragePrefix = 'changedGoodsStorage';
} }
?> ?>
\ No newline at end of file
...@@ -843,12 +843,12 @@ class CartServiceModel extends \Business\AbstractModel{ ...@@ -843,12 +843,12 @@ class CartServiceModel extends \Business\AbstractModel{
} }
//第一步:获取购物车可展示优惠券信息 //第一步:获取购物车可展示优惠券信息
$memberCouponDao = \DAO\Coupon\MemberCouponModel::getInstance(); $memberCouponDao = \DAO\Coupon\MemberCouponModel::getInstance();
$whereSql = ' coupon_state ='.\Our\ApiConst::couponUnused.' and member_id ='.$memberId.' and out_time > '.time(); $memberCouponArray = $memberCouponDao->getMemberCouponByMemberIdWithOuttime($memberId);
$memberCouponArray = $memberCouponDao->getList($whereSql,'coupon_id');
if(!$memberCouponArray){ if(!$memberCouponArray){
$storeCartData['couponList'] = array(); $storeCartData['couponList'] = array();
return $storeCartData; return $storeCartData;
} }
$couponStoreIds = $storeCartData['storeIds']; $couponStoreIds = $storeCartData['storeIds'];
$couponStoreIds[] = \Our\ApiConst::zero; $couponStoreIds[] = \Our\ApiConst::zero;
$couponIds = array_column($memberCouponArray,'coupon_id'); $couponIds = array_column($memberCouponArray,'coupon_id');
......
...@@ -185,6 +185,7 @@ class CouponServiceModel extends \Business\AbstractModel{ ...@@ -185,6 +185,7 @@ class CouponServiceModel extends \Business\AbstractModel{
$couponDao->db->doCommit(); $couponDao->db->doCommit();
//\Our\RedisHelper::delCachedFunction(\Redis\Db13\MemberCouponRedisModel::getInstance(), array(&$memberCouponDao, 'getList'),array(),array($where['couponId'])); //\Our\RedisHelper::delCachedFunction(\Redis\Db13\MemberCouponRedisModel::getInstance(), array(&$memberCouponDao, 'getList'),array(),array($where['couponId']));
\Our\RedisHelper::delCachedFunction(\Redis\Db13\MemberCouponRedisModel::getInstance(), array(&$memberCouponDao, 'getList'),array(),array($memberId)); \Our\RedisHelper::delCachedFunction(\Redis\Db13\MemberCouponRedisModel::getInstance(), array(&$memberCouponDao, 'getList'),array(),array($memberId));
\Redis\Db13\MemberCouponRedisModel::getInstance()->tableDel(\Our\NameConst::memberCounponListPrefix.$memberId);
\Our\RedisHelper::delCachedFunction(\Redis\Db13\CouponRedisModel::getInstance(), array(&$this, 'getStoreCouponsById'),array(),array($coupon['store_id']."_".$memberId)); \Our\RedisHelper::delCachedFunction(\Redis\Db13\CouponRedisModel::getInstance(), array(&$this, 'getStoreCouponsById'),array(),array($coupon['store_id']."_".$memberId));
return true; return true;
} }
...@@ -238,6 +239,7 @@ class CouponServiceModel extends \Business\AbstractModel{ ...@@ -238,6 +239,7 @@ class CouponServiceModel extends \Business\AbstractModel{
} }
} }
\Our\RedisHelper::delCachedFunction(\Redis\Db13\MemberCouponRedisModel::getInstance(), array(&$memberCouponDao, 'getList'),array(),array($memberId)); \Our\RedisHelper::delCachedFunction(\Redis\Db13\MemberCouponRedisModel::getInstance(), array(&$memberCouponDao, 'getList'),array(),array($memberId));
\Redis\Db13\MemberCouponRedisModel::getInstance()->tableDel(\Our\NameConst::memberCounponListPrefix.$memberId);
$couponDao->db->doCommit(); $couponDao->db->doCommit();
return true; return true;
} }
......
...@@ -585,7 +585,18 @@ class GoodsCommonServiceModel extends \Business\AbstractModel ...@@ -585,7 +585,18 @@ class GoodsCommonServiceModel extends \Business\AbstractModel
$activities = \DAO\SaleMemberModel::getInstance()->isJoinStore($commonInfo['store_id'],$memberId); $activities = \DAO\SaleMemberModel::getInstance()->isJoinStore($commonInfo['store_id'],$memberId);
//商品表 //商品表
$goodsInstance = \DAO\GoodsModel::getInstance(); $goodsInstance = \DAO\GoodsModel::getInstance();
$goods = \Our\RedisHelper::cachedFunction(\Redis\Db4\GoodsRedisModel::getInstance(),array(&$goodsInstance, 'getListAndSetStorage'),array($goodsCommonId,'goods_id,goods_price,goods_marketprice,goods_image,goods_storage,goods_spec,goods_state,goods_verify,is_del'),\Our\ApiConst::oneDaySecond,array($goodsCommonId)); $goods = \Our\RedisHelper::cachedFunction(\Redis\Db4\GoodsRedisModel::getInstance(),array(&$goodsInstance, 'getListAndSetStorage'),array($goodsCommonId,'goods_id,goods_price,goods_marketprice,goods_image,goods_storage,goods_spec,goods_state,goods_verify,is_transport,transport_id,snapshot_id,is_del'),\Our\ApiConst::oneDaySecond,array($goodsCommonId));
$resetGoods = array();
foreach($goods as $tempGoods){
unset($tempGoods['goods_state']);
unset($tempGoods['goods_verify']);
unset($tempGoods['is_del']);
unset($tempGoods['is_transport']);
unset($tempGoods['transport_id']);
unset($tempGoods['snapshot_id']);
array_push($resetGoods,$tempGoods);
}
$goods = $resetGoods;
//商品图片表 //商品图片表
$goodsImagesInstance = \DAO\GoodsImagesModel::getInstance(); $goodsImagesInstance = \DAO\GoodsImagesModel::getInstance();
$image = \Our\RedisHelper::cachedFunction(\Redis\Db4\GoodsImagesRedisModel::getInstance(),array(&$goodsImagesInstance, 'getListByCommonId'),array($goodsCommonId,'attr_name,attr_value,goods_image'),\Our\ApiConst::oneDaySecond,array($goodsCommonId)); $image = \Our\RedisHelper::cachedFunction(\Redis\Db4\GoodsImagesRedisModel::getInstance(),array(&$goodsImagesInstance, 'getListByCommonId'),array($goodsCommonId,'attr_name,attr_value,goods_image'),\Our\ApiConst::oneDaySecond,array($goodsCommonId));
...@@ -1452,6 +1463,47 @@ class GoodsCommonServiceModel extends \Business\AbstractModel ...@@ -1452,6 +1463,47 @@ class GoodsCommonServiceModel extends \Business\AbstractModel
/**
* 更新从缓存链表中更新商品库存
* @return bool
*/
public function updateGoodsStorageByRedisList(){
$goodsModel = \DAO\GoodsModel::getInstance();
for($i=0;$i<2000;$i++){
$goodsStr = $goodsModel->getChangedGoodsStorage();
\Our\Log::getInstance()->write($goodsStr,'/data/log/apptest');
if($goodsStr){
$goods = unserialize($goodsStr);
$goodsModel->setDb(\Our\DbNameConst::masterDBConnectName);
$goodsModel->db->doTransaction();
$goodsUpdateResult = $goodsModel->updateStorageByRedis($goods);
if(!$goodsUpdateResult){
$goodsModel->db->doRollback();
}
$goodsCommonUpdateResult = \DAO\GoodsCommonModel::getInstance()->updateStorageByRedis($goods);
if(!$goodsCommonUpdateResult){
$goodsModel->db->doRollback();
}
$goodsModel->db->doCommit();
}else{
break;
}
}
return true;
}
/**
* 更新所有商品库存
* @return bool
*/
public function updateAllStorageForPublish(){
\Our\Log::getInstance()->write('1执行失败','/data/log/apptest');
$this->updateGoodsStorageByRedisList();
\Our\Log::getInstance()->write('2执行失败','/data/log/apptest');
\DAO\PBundlingModel::getInstance()->updateStorageByRedisList();
return true;
}
private static $_instance = null; private static $_instance = null;
......
...@@ -215,11 +215,11 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -215,11 +215,11 @@ class StoreServiceModel extends \Business\AbstractModel{
$storeMember['fav_type'] = \Our\ApiConst::one; $storeMember['fav_type'] = \Our\ApiConst::one;
$storeMembers[] = $storeMember; $storeMembers[] = $storeMember;
$favoritesStoreDao = \DAO\FavoritesStoreModel::getInstance(); $favoritesStoreDao = \DAO\FavoritesStoreModel::getInstance();
$one = $favoritesStoreDao->getOne('store_id',array('store_id'=>$storeId,'member_id'=>$memberId,'fav_type'=>\Our\ApiConst::one),'');
$result = $favoritesStoreDao->insertAll($storeMembers); $result = $favoritesStoreDao->insertAll($storeMembers);
if($result) { if($result && !$one) {
$favoritesStoreDao->updateStoreCollecitonsCache(array($storeId),$memberId,2); $favoritesStoreDao->updateStoreCollecitonsCache(array($storeId),$memberId,2);
} }
}else{ }else{
$sess=\Yaf\Session::getInstance(); $sess=\Yaf\Session::getInstance();
$scan_store_ids = $sess->get('scan_store_ids'); $scan_store_ids = $sess->get('scan_store_ids');
...@@ -572,34 +572,34 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -572,34 +572,34 @@ class StoreServiceModel extends \Business\AbstractModel{
* @param $memberId * @param $memberId
*/ */
public function updateFavoritesStore($param,$memberId){ public function updateFavoritesStore($param,$memberId){
if(!(isset($param['storeId'])&&$param['storeId'])){ // if(!(isset($param['storeId'])&&$param['storeId'])){
\Error\ErrorModel::throwException(\Error\CodeConfigModel::emptyScanStoreId); // \Error\ErrorModel::throwException(\Error\CodeConfigModel::emptyScanStoreId);
} // }
$storeId = trim($param['storeId']); // $storeId = trim($param['storeId']);
$storeInfo = \DAO\StoreModel::getInstance()->get($storeId,false); // $storeInfo = \DAO\StoreModel::getInstance()->get($storeId,false);
if(!$storeInfo){ // if(!$storeInfo){
\Error\ErrorModel::throwException(\Error\CodeConfigModel::emptyScanStoreInfo); // \Error\ErrorModel::throwException(\Error\CodeConfigModel::emptyScanStoreInfo);
} // }
$storeMembers = array(); // $storeMembers = array();
$storeMember = array(); // $storeMember = array();
$storeMember['store_id'] = $storeId; // $storeMember['store_id'] = $storeId;
$storeMember['member_id'] = $memberId; // $storeMember['member_id'] = $memberId;
$storeMember['fav_from'] = \Our\ApiConst::scanFavor; // $storeMember['fav_from'] = \Our\ApiConst::scanFavor;
$storeMember['fav_type'] = \Our\ApiConst::one; // $storeMember['fav_type'] = \Our\ApiConst::one;
$storeMembers[] = $storeMember; // $storeMembers[] = $storeMember;
$favoritesStoreDao = \DAO\FavoritesStoreModel::getInstance(); // $favoritesStoreDao = \DAO\FavoritesStoreModel::getInstance();
//
$one = $favoritesStoreDao->getOne('store_id',array('store_id'=>$storeId,'member_id'=>$memberId,'fav_type'=>\Our\ApiConst::one,'fav_from'=>\Our\ApiConst::scanFavor),''); // $one = $favoritesStoreDao->getOne('store_id',array('store_id'=>$storeId,'member_id'=>$memberId,'fav_type'=>\Our\ApiConst::one),'');
if(!$one) { // if(!$one) {
$result = $favoritesStoreDao->insertAll($storeMembers); // $result = $favoritesStoreDao->insertAll($storeMembers);
if(!$result){ // if(!$result){
\Error\ErrorModel::throwException(\Error\CodeConfigModel::saveScanStoreInfoFailed); // \Error\ErrorModel::throwException(\Error\CodeConfigModel::saveScanStoreInfoFailed);
} // }
$favoritesStoreDao->updateStoreCollecitonsCache(array($storeId),$memberId,2); // $favoritesStoreDao->updateStoreCollecitonsCache(array($storeId),$memberId,2);
$favoritesDao = \DAO\FavoritesStoreModel::getInstance(); // $favoritesDao = \DAO\FavoritesStoreModel::getInstance();
\Our\RedisHelper::delCachedFunction(\Redis\Db6\FavoritesStoreRedisModel::getInstance(),array(&$favoritesDao, 'getOne'),array(),array($memberId)); // \Our\RedisHelper::delCachedFunction(\Redis\Db6\FavoritesStoreRedisModel::getInstance(),array(&$favoritesDao, 'getOne'),array(),array($memberId));
//
} // }
return true; return true;
......
...@@ -369,15 +369,15 @@ class MemberServiceModel extends \Business\AbstractModel ...@@ -369,15 +369,15 @@ class MemberServiceModel extends \Business\AbstractModel
$favoritesStoreDao = \DAO\FavoritesStoreModel::getInstance(); $favoritesStoreDao = \DAO\FavoritesStoreModel::getInstance();
$storeIds = array_column($scan_store_ids,'store_id'); $storeIds = array_column($scan_store_ids,'store_id');
//$list = $favoritesStoreDao->selectList(array('store_id'=>array('in',$storeIds),'member_id'=>$memberId,'fav_type'=>0),'store_id'); //$list = $favoritesStoreDao->selectList(array('store_id'=>array('in',$storeIds),'member_id'=>$memberId,'fav_type'=>0),'store_id');
$list = $favoritesStoreDao->selectList(array('store_id'=>array('in',$storeIds),'member_id'=>$memberId,'fav_type'=>\Our\ApiConst::one,'fav_from'=>\Our\ApiConst::scanFavor),'store_id'); $list = $favoritesStoreDao->selectList(array('store_id'=>array('in',$storeIds),'member_id'=>$memberId,'fav_type'=>\Our\ApiConst::one),'store_id');
$storeIds2 = $list ? array_column($list, 'store_id') : []; $storeIds2 = $list ? array_column($list, 'store_id') : [];
$storeIds = array_diff($storeIds,$storeIds2); $storeIds = array_diff($storeIds,$storeIds2);
if($storeIds) { $result = $favoritesStoreDao->insertAll($storeMembers);
$result = $favoritesStoreDao->insertAll($storeMembers); if(!$result){
if(!$result){ \Our\Log::getInstance()->write(json_encode($storeMembers).'扫码数据写入失败');
\Our\Log::getInstance()->write(json_encode($storeMembers).'扫码数据写入失败'); return false;
return false; }
} if($storeIds && $result) {
$favoritesStoreDao->updateStoreCollecitonsCache($storeIds,$memberId,2); $favoritesStoreDao->updateStoreCollecitonsCache($storeIds,$memberId,2);
} }
......
...@@ -69,6 +69,51 @@ class AreaModel extends \DAO\AbstractModel { ...@@ -69,6 +69,51 @@ class AreaModel extends \DAO\AbstractModel {
return $areaList; return $areaList;
} }
public function writeToFile(){
$this->setDb($this->dbName);
$where = array('area_deep'=>array('neq',3));
$where= $this->db->getSqlWhereByArray($where);
$areaList = $this->db->select(\Our\NameConst::allField)->from($this->_tableName)->where($where)->order('area_deep','asc')->fetchAll();
$where = array('area_deep'=>3);
$areaSubList = $this->db->select(\Our\NameConst::allField)->from($this->_tableName)->where($where)->limit(0,3000)->order('area_id','asc')->fetchAll();
var_dump(count($areaSubList));
$proInfoList = array();
foreach($areaList as $area){
if($area['area_deep']==1){
$proInfoList[$area['area_id']]['area_name'] = $area['area_name'];
}else{
$city = array();
$city['city_name'] = $area['area_name'];
$city['city_id'] = $area['area_id'];
$proInfoList[$area['area_parent_id']]['list'][] = $city;
}
}
$newAreaList = array();
foreach($areaSubList as $area){
$newAreaList[$area['area_parent_id']][]= $area['area_name'];
}
$returnList = array();
$proList = array();
foreach($proInfoList as $proInfo){
$return = array();
$return['name'] = $proInfo['area_name'];
$return['city'] = array();
if($proInfo['list']){
foreach($proInfo['list'] as $city){
$newCity= array();
$newCity['name'] = $city['city_name'];
$newCity['area'] = $newAreaList[$city['city_id']]?$newAreaList[$city['city_id']]:array();
var_dump($newCity);
array_push($return['city'],$newCity);
}
}
$returnList[] = $return;
}
\Our\Log::getInstance()->write(json_encode($returnList),'/data/log/appcity');
return $returnList;
}
public function getCityListWithoutCounty(){ public function getCityListWithoutCounty(){
$addressRedis = AddressRedisModel::getInstance(); $addressRedis = AddressRedisModel::getInstance();
$cityList = $addressRedis->find('cityListWithoutCounty'); $cityList = $addressRedis->find('cityListWithoutCounty');
......
...@@ -41,7 +41,6 @@ class MemberCouponModel extends \DAO\AbstractModel{ ...@@ -41,7 +41,6 @@ class MemberCouponModel extends \DAO\AbstractModel{
*/ */
public function getListByMemberId($memberId,$couponIds){ public function getListByMemberId($memberId,$couponIds){
$whereSql = ' member_id = '.$memberId .' and coupon_id in ('.implode(',',$couponIds).')'; $whereSql = ' member_id = '.$memberId .' and coupon_id in ('.implode(',',$couponIds).')';
$result = $this->getList($whereSql);
return $result; return $result;
} }
...@@ -59,6 +58,34 @@ class MemberCouponModel extends \DAO\AbstractModel{ ...@@ -59,6 +58,34 @@ class MemberCouponModel extends \DAO\AbstractModel{
return $memberCoupons; return $memberCoupons;
} }
/**
* 获取当前用户未领取的有效优惠券
* @param $where
* @param $memberId
* @return array
*/
public function getMemberCouponByMemberIdWithOuttime($memberId){
$memberCouponRedisModel = \Redis\Db13\MemberCouponRedisModel::getInstance();
$memberCoupons = $memberCouponRedisModel->tableCacheGet(\Our\NameConst::memberCounponListPrefix.$memberId);
if($memberCoupons){
$newMemberCouponArray = array();
foreach($memberCoupons as $tempMemberCoupon){
if($tempMemberCoupon['out_time']>=TIMESTAMP){
$newMemberCouponArray[] =$tempMemberCoupon;
}
}
return $newMemberCouponArray;
}
$where = ' coupon_state ='.\Our\ApiConst::couponUnused.' and member_id ='.$memberId;
$where .= ' and out_time > '.TIMESTAMP;
$field = 'coupon_id,add_time,out_time';
$memberCoupons = $this->getList($where , $field);
if($memberCoupons){
$memberCouponRedisModel->tableCacheSet(\Our\NameConst::memberCounponListPrefix.$memberId,$memberCoupons,\Our\ApiConst::oneDaySecond);
}
return $memberCoupons;
}
public function getValidMemberCoupon($where,$memberId){ public function getValidMemberCoupon($where,$memberId){
if(!$memberId){ if(!$memberId){
$this->errorCode = \Error\CodeConfigModel::emptyMemberCouponMemberId; $this->errorCode = \Error\CodeConfigModel::emptyMemberCouponMemberId;
......
...@@ -39,7 +39,7 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -39,7 +39,7 @@ class GoodsModel extends \DAO\AbstractModel {
* @return mixed * @return mixed
*/ */
public function updateStorage($goodsId, $num, $op) { public function updateStorage($goodsId, $num, $op) {
$this->setDb(); $this->setDb(\Our\DbNameConst::masterDBConnectName);
$whereSql = 'goods_id='.$goodsId; $whereSql = 'goods_id='.$goodsId;
if($op==1){ //调整库存 if($op==1){ //调整库存
$updateSql = 'goods_storage = goods_storage'.($num<0 ? '-'.(-$num) : '+'.$num); $updateSql = 'goods_storage = goods_storage'.($num<0 ? '-'.(-$num) : '+'.$num);
...@@ -51,6 +51,26 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -51,6 +51,26 @@ class GoodsModel extends \DAO\AbstractModel {
return $this->db->update($this->_tableName)->query($updateAllSql); return $this->db->update($this->_tableName)->query($updateAllSql);
} }
public function updateStorageByRedis($goods){
$this->setDb(\Our\DbNameConst::masterDBConnectName);
$sql = 'UPDATE '.$this->_tableName.' set goods_edittime = '.TIMESTAMP.',goods_storage = ';
if($goods['op']==\Our\ApiConst::set){
$sql .= $goods['goods_storage'] ;
}else{
$sql .= 'goods_storage '.\Our\ArrayConst::ops[$goods['op']].$goods['goods_storage'] ;
/*if($goods['sale_num']){
$sql .= ' sale'
}*/
}
$sql .= ' where goods_id = '.$goods['goods_id'];
\Our\Log::getInstance()->write($sql.' 执行失败','/data/log/apptest');
$result = $this->db->update($this->_tableName)->query($sql);
if($result===false){
\Our\Log::getInstance()->write($sql.' 执行失败');
}
return $result;
}
/** /**
* *
* 分页获取商品列表 * 分页获取商品列表
...@@ -122,6 +142,14 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -122,6 +142,14 @@ class GoodsModel extends \DAO\AbstractModel {
return $goods; return $goods;
} }
public function getOnelineOneWithStorage($goodsId,$field= \Our\NameConst::allField){
$goodsInfo = $this->getOnlineOne($goodsId,$field);
if($goodsInfo){
}
return array();
}
public function validAddCartGoods($where,$storageFlag = false){ public function validAddCartGoods($where,$storageFlag = false){
$goods = $this->getOnlineOne($where['goodsId'],$this->cartGoodsField); $goods = $this->getOnlineOne($where['goodsId'],$this->cartGoodsField);
if(!$goods){ if(!$goods){
...@@ -174,7 +202,7 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -174,7 +202,7 @@ class GoodsModel extends \DAO\AbstractModel {
* 获取商品是否在售,如果在售还返回对应库存信息 * 获取商品是否在售,如果在售还返回对应库存信息
* @param $goodsId * @param $goodsId
*/ */
public function getOnlineStorageGoods($goodsId){ /*public function getOnlineStorageGoods($goodsId){
$goodsRedis = \Redis\Db4\GoodsRedisModel::getInstance(); $goodsRedis = \Redis\Db4\GoodsRedisModel::getInstance();
$onlineStorageGoodsKey = \Our\NameConst::onlineStorageGoodsPrefix.$goodsId; $onlineStorageGoodsKey = \Our\NameConst::onlineStorageGoodsPrefix.$goodsId;
$onlineStorageGoods = $goodsRedis->tableHGAll($onlineStorageGoodsKey); $onlineStorageGoods = $goodsRedis->tableHGAll($onlineStorageGoodsKey);
...@@ -194,8 +222,27 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -194,8 +222,27 @@ class GoodsModel extends \DAO\AbstractModel {
$goodsRedis->tableHMGet($onlineStorageGoodsKey,$data,\Our\ApiConst::tenDaySecond); $goodsRedis->tableHMGet($onlineStorageGoodsKey,$data,\Our\ApiConst::tenDaySecond);
return $data; return $data;
} }
}*/
/**
* 更新需要更新缓存的链表
* @param $pBundling
*/
public function addChangedGoodsStorage($pBundling){
$goodsRedisDao = \Redis\Db4\GoodsRedisModel::getInstance();
$goodsRedisDao->tableLPush(\Our\NameConst::changedGoodsStoragePrefix,$pBundling);
} }
/**
* 获取需要更新缓存的链表数据
*/
public function getChangedGoodsStorage(){
$goodsRedisDao = \Redis\Db4\GoodsRedisModel::getInstance();
return $goodsRedisDao->tableLPop(\Our\NameConst::changedGoodsStoragePrefix);
}
/** /**
* 更新商品库存缓存以及更新销量 * 更新商品库存缓存以及更新销量
* @param $goodsList 商品列表 * @param $goodsList 商品列表
...@@ -204,12 +251,17 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -204,12 +251,17 @@ class GoodsModel extends \DAO\AbstractModel {
*/ */
public function opOnlineStorageGoodsByGoodsCommonIds($goodsList,$op = \Our\ApiConst::minus,$updateSaleNumFalg = true){ public function opOnlineStorageGoodsByGoodsCommonIds($goodsList,$op = \Our\ApiConst::minus,$updateSaleNumFalg = true){
$goodsRedis = \Redis\Db4\GoodsRedisModel::getInstance(); $goodsRedis = \Redis\Db4\GoodsRedisModel::getInstance();
if($updateSaleNumFalg){ $goodsCommonRedis = \Redis\Db4\GoodsCommonRedisModel::getInstance();
$goodsCommonRedis = \Redis\Db4\GoodsCommonRedisModel::getInstance(); $onlineGoodsCommonSaleNumKey = \Our\NameConst::onlineGoodsCommonSaleNumPrefix;
$onlineGoodsCommonSaleNumKey = \Our\NameConst::onlineGoodsCommonSaleNumPrefix; /*if($updateSaleNumFalg){
} }*/
$goodsCommonList = $this->getOnlineStorageGoodsByGoodsCommonIds(array_keys($goodsList)); $goodsCommonList = $this->getOnlineStorageGoodsByGoodsCommonIds(array_keys($goodsList));
foreach($goodsCommonList as $goodsCommonId=>$goodsCommonsTemp){ foreach($goodsCommonList as $goodsCommonId=>$goodsCommonsTemp){
$isLock = \Lock\RedisLock::getInstance()->getLock(\Our\NameConst::goodsStorageRedisPrefix.$goodsCommonId);
if(!$isLock){
\Lock\RedisLock::getInstance()->releaseLock(\Our\NameConst::goodsStorageRedisPrefix.$goodsCommonId);
return false;
}
$newGoodsList = array(); $newGoodsList = array();
$totalGoodsNum = \Our\ApiConst::zero; $totalGoodsNum = \Our\ApiConst::zero;
foreach($goodsCommonsTemp as $goodsId=>$temp){ foreach($goodsCommonsTemp as $goodsId=>$temp){
...@@ -221,16 +273,29 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -221,16 +273,29 @@ class GoodsModel extends \DAO\AbstractModel {
}else if($op == \Our\ApiConst::set){ }else if($op == \Our\ApiConst::set){
$temp['goodsStorage'] = $goodsList[$goodsCommonId][$goodsId]['goodsNum']; $temp['goodsStorage'] = $goodsList[$goodsCommonId][$goodsId]['goodsNum'];
}else{ }else{
\Lock\RedisLock::getInstance()->releaseLock(\Our\NameConst::goodsStorageRedisPrefix.$goodsCommonId);
return false; return false;
} }
$totalGoodsNum += $goodsList[$goodsCommonId][$goodsId]['goodsNum']; $totalGoodsNum += $goodsList[$goodsCommonId][$goodsId]['goodsNum'];
$updateGoods = array(
'goods_id'=>$goodsId,
'goods_commonid'=>$goodsCommonId,
'goods_storage'=>$goodsList[$goodsCommonId][$goodsId]['goodsNum'],
'op'=>$op
);
if($updateSaleNumFalg&&$op!=\Our\ApiConst::set){
$updateGoods['sale_num'] = $goodsList[$goodsCommonId][$goodsId]['goodsNum'];
}
$this->addChangedGoodsStorage(serialize($updateGoods));
} }
$newGoodsList[$goodsId]= serialize($temp); $newGoodsList[$goodsId]= serialize($temp);
} }
if($newGoodsList){ if($newGoodsList){
$onlineStorageGoodsKey = \Our\NameConst::onlineStorageGoodsPrefix.$goodsCommonId; $onlineStorageGoodsKey = \Our\NameConst::onlineStorageGoodsPrefix.$goodsCommonId;
$result = $goodsRedis->tableHMSet($onlineStorageGoodsKey,$newGoodsList,\Our\ApiConst::tenDaySecond); $result = $goodsRedis->tableHMSet($onlineStorageGoodsKey,$newGoodsList,\Our\ApiConst::tenDaySecond);
if(!$result){ if(!$result){
\Lock\RedisLock::getInstance()->releaseLock(\Our\NameConst::goodsStorageRedisPrefix.$goodsCommonId);
return false; return false;
} }
...@@ -255,12 +320,12 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -255,12 +320,12 @@ class GoodsModel extends \DAO\AbstractModel {
} }
} }
\DAO\PBundlingModel::getInstance()->deletePBundlingByGoodsCommonId($goodsCommonId); \DAO\PBundlingModel::getInstance()->deletePBundlingByGoodsCommonId($goodsCommonId);
\Lock\RedisLock::getInstance()->releaseLock(\Our\NameConst::goodsStorageRedisPrefix.$goodsCommonId);
} }
return true; return true;
} }
/** /**
* 根据商品CommonId获取库存信息 * 根据商品CommonId获取库存信息
* @param $goodsCommonIds * @param $goodsCommonIds
...@@ -288,7 +353,7 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -288,7 +353,7 @@ class GoodsModel extends \DAO\AbstractModel {
$sql = \Our\Common::format(' goods_commonid in ({0})',implode(',',$noRedisGoodsCommonIds)); $sql = \Our\Common::format(' goods_commonid in ({0})',implode(',',$noRedisGoodsCommonIds));
$field = 'goods_commonid,goods_id,goods_storage,goods_state,goods_verify,is_del'; $field = 'goods_commonid,goods_id,goods_storage,goods_state,goods_verify,is_del';
} }
if($sql&&$field){ if(isset($sql)&&isset($field)){
$goodsArray = $this->getList($sql,$field); $goodsArray = $this->getList($sql,$field);
$goodsCommonList = array(); $goodsCommonList = array();
$goodsList = array(); $goodsList = array();
...@@ -354,18 +419,9 @@ class GoodsModel extends \DAO\AbstractModel { ...@@ -354,18 +419,9 @@ class GoodsModel extends \DAO\AbstractModel {
if($goods['goods_state'] == \Our\ApiConst::onlineGoodsState && $goods['goods_verify'] == \Our\ApiConst::onlineGoodsVerify && $goods['is_del'] == \Our\ApiConst::onlineGoodsDel){ if($goods['goods_state'] == \Our\ApiConst::onlineGoodsState && $goods['goods_verify'] == \Our\ApiConst::onlineGoodsVerify && $goods['is_del'] == \Our\ApiConst::onlineGoodsDel){
$onlineFlag = \Our\ApiConst::one; $onlineFlag = \Our\ApiConst::one;
} }
unset($goodsList[$key]['goods_state']);
unset($goodsList[$key]['goods_verify']);
unset($goodsList[$key]['is_del']);
$data[$goods['goods_id']] = serialize(array('onlineFlag'=>$onlineFlag,'goodsStorage'=>$goods['goods_storage'])); $data[$goods['goods_id']] = serialize(array('onlineFlag'=>$onlineFlag,'goodsStorage'=>$goods['goods_storage']));
} }
$goodsRedis->tableHMSet($onlineStorageGoodsKey,$data,\Our\ApiConst::tenDaySecond); $goodsRedis->tableHMSet($onlineStorageGoodsKey,$data,\Our\ApiConst::tenDaySecond);
}else{
foreach ($goodsList as $key => $goods){
unset($goodsList[$key]['goods_state']);
unset($goodsList[$key]['goods_verify']);
unset($goodsList[$key]['is_del']);
}
} }
} }
......
...@@ -80,6 +80,8 @@ class GoodsCommonModel extends \DAO\AbstractModel { ...@@ -80,6 +80,8 @@ class GoodsCommonModel extends \DAO\AbstractModel {
return $saleNum; return $saleNum;
} }
/** /**
* 删除销量缓存 * 删除销量缓存
* @param $goodsCommonId * @param $goodsCommonId
...@@ -255,6 +257,28 @@ class GoodsCommonModel extends \DAO\AbstractModel { ...@@ -255,6 +257,28 @@ class GoodsCommonModel extends \DAO\AbstractModel {
} }
public function updateStorageByRedis($goods){
$this->setDb(\Our\DbNameConst::masterDBConnectName);
$sql = 'UPDATE '.$this->_tableName.' set goods_edittime = '.TIMESTAMP.',goods_storage = ';
if($goods['op']==\Our\ApiConst::set){
$sql .= $goods['goods_storage'] ;
}else{
$sql .= 'goods_storage '.\Our\ArrayConst::ops[$goods['op']].$goods['goods_storage'] ;
if($goods['sale_num']){
$sql .= ' , sale_num = sale_num '.($goods['op']==\Our\ApiConst::plus?'-':'+').' '.$goods['sale_num'];
}
}
$sql .= ' where goods_commonid = '.$goods['goods_commonid'];
\Our\Log::getInstance()->write($sql.' 执行失败','/data/log/apptest');
$result = $this->db->update($this->_tableName)->query($sql);
if($result===false){
\Our\Log::getInstance()->write($sql.' 执行失败');
}
return $result;
}
public function updateGoodsStorage($dataList , $op = \Our\ApiConst::minus,$updateSaleNumFlag = false){ public function updateGoodsStorage($dataList , $op = \Our\ApiConst::minus,$updateSaleNumFlag = false){
$datas = array_values($dataList); $datas = array_values($dataList);
$this->setDb(\Our\DbNameConst::masterDBConnectName); $this->setDb(\Our\DbNameConst::masterDBConnectName);
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
namespace DAO; namespace DAO;
use Error\CodeConfigModel;
class PBundlingModel extends \DAO\AbstractModel { class PBundlingModel extends \DAO\AbstractModel {
...@@ -92,6 +94,8 @@ class PBundlingModel extends \DAO\AbstractModel { ...@@ -92,6 +94,8 @@ class PBundlingModel extends \DAO\AbstractModel {
$pBundling = $this->findById($blId,$field); $pBundling = $this->findById($blId,$field);
if($pBundling){ if($pBundling){
$storage = $pBundling['bl_storage']; $storage = $pBundling['bl_storage'];
$bundingGoodsWhere['bl_id'] = $blId;
$bundlingGoodsList = \DAO\PBundlingGoodsModel::getInstance()->getList($this->pBundingGoodsField,$bundingGoodsWhere);
$pBundlingRedis->tableHSet(\Our\NameConst::onlineStorageBlGoodsPrefix,$blId,$pBundling['bl_storage'],\Our\ApiConst::oneDaySecond); $pBundlingRedis->tableHSet(\Our\NameConst::onlineStorageBlGoodsPrefix,$blId,$pBundling['bl_storage'],\Our\ApiConst::oneDaySecond);
}else{ }else{
$storage = \Our\ApiConst::zero; $storage = \Our\ApiConst::zero;
...@@ -160,9 +164,91 @@ class PBundlingModel extends \DAO\AbstractModel { ...@@ -160,9 +164,91 @@ class PBundlingModel extends \DAO\AbstractModel {
public function getPBundlingCacheByBlId($blId){ public function getPBundlingCacheByBlId($blId){
$pBundlingDao = \Redis\Db4\PBundlingRedisModel::getInstance(); $pBundlingDao = \Redis\Db4\PBundlingRedisModel::getInstance();
return $pBundlingDao->getByKeys('gid_'.$blId); $result = $pBundlingDao->getByKeys('gid_'.$blId);
if($result){
return $result['result'];
}
return false;
}
/**
* 更新组合销售缓存
* @param $blId
* @param $blStorage
* @param int $op
* @return bool
* @throws \Error\OurExceptionModel
* @throws \Exception
*/
public function updatePBundlingStorageCacheByBlId($blId,$blStorage,$op=\Our\ApiConst::minus){
$isLock = \Lock\RedisLock::getInstance()->getLock(\Our\NameConst::pBundlingStorageRedisPrefix.$blId);
if(!$isLock){
\Error\ErrorModel::throwException(\Error\CodeConfigModel::serverBusy);
}
$pBundlingRedisDao = \Redis\Db4\PBundlingRedisModel::getInstance();
$result = $pBundlingRedisDao->getByKeys('gid_'.$blId);
if(!$result){
\Lock\RedisLock::getInstance()->releaseLock(\Our\NameConst::pBundlingStorageRedisPrefix.$blId);
return false;
}
$pBundling = $result['result'];
$key = $result['key'];
if($op == \Our\ApiConst::minus){
$pBundling['bl_storage'] = $pBundling['bl_storage']-$blStorage;
if($pBundling['bl_storage']-$blStorage<\Our\ApiConst::zero){
\Lock\RedisLock::getInstance()->releaseLock(\Our\NameConst::pBundlingStorageRedisPrefix.$blId);
\Error\ErrorModel::throwException(\Our\CodeConfigModel::pBundlingNoStorageForOrder);
}
$pBundling['bl_origin_storage'] = $pBundling['bl_origin_storage']-$blStorage;
}else if($op == \Our\ApiConst::plus){
$pBundling['bl_storage'] = $pBundling['bl_storage']+$blStorage;
$pBundling['bl_origin_storage'] = $pBundling['bl_origin_storage']+$blStorage;
}
\Lock\RedisLock::getInstance()->releaseLock(\Our\NameConst::pBundlingStorageRedisPrefix.$blId);
return $pBundlingRedisDao->setNoPrefix($key,$pBundling,\Our\ApiConst::oneDaySecond);
}
/**
* 更新需要更新缓存的链表
* @param $pBundling
*/
public function addChangedPBundlingStorage($pBundling){
$pBundlingRedisDao = \Redis\Db4\PBundlingRedisModel::getInstance();
$pBundlingRedisDao->tableLPush(\Our\NameConst::changedPBundlingStoragePrefix,$pBundling);
}
/**
* 获取需要更新缓存的链表数据
*/
public function getChangedPbundlingStorage(){
$pBundlingRedisDao = \Redis\Db4\PBundlingRedisModel::getInstance();
return $pBundlingRedisDao->tableLPop(\Our\NameConst::changedPBundlingStoragePrefix);
}
public function updateStorageByRedisList(){
$this->setDb(\Our\DbNameConst::masterDBConnectName);
for($i=0;$i<2000;$i++){
$pbundlingStr = $this->getChangedPbundlingStorage();
if(!$pbundlingStr){
break;
}
$pbundling = unserialize($pbundlingStr);
if($pbundling['op'] != \Our\ApiConst::set){
$sql = \Our\Common::format("UPDATE {$this->_tableName} set bl_storage = bl_storage {2} {0} where bl_id = {1} ",$pbundling['bl_storage'],$pbundling['bl_id'],\Our\ArrayConst::ops[$pbundling['op']]);
}else{
$sql = \Our\Common::format("UPDATE {$this->_tableName} set bl_storage = {0} where bl_id = {1} ",$pbundling['bl_storage'],$pbundling['bl_id']);
}
$one = $this->db->update($this->_tableName)->query($sql);
if($one===false){
\Our\Log::getInstance()->write($sql.' 执行失败');
}
}
return true;
} }
public function deletePBundlingByBlId($blId){ public function deletePBundlingByBlId($blId){
$pBundlingDao = \Redis\Db4\PBundlingRedisModel::getInstance(); $pBundlingDao = \Redis\Db4\PBundlingRedisModel::getInstance();
$pBundlingDao->tableDelAll($pBundlingDao->tableKeys('gid_'.$blId)); $pBundlingDao->tableDelAll($pBundlingDao->tableKeys('gid_'.$blId));
......
...@@ -151,7 +151,7 @@ class GoodsStorageModel extends \DAO\AbstractModel { ...@@ -151,7 +151,7 @@ class GoodsStorageModel extends \DAO\AbstractModel {
* 获取商品是否在售,如果在售还返回对应库存信息 * 获取商品是否在售,如果在售还返回对应库存信息
* @param $goodsId * @param $goodsId
*/ */
public function getOnlineStorageGoods($goodsId){ /*public function getOnlineStorageGoods($goodsId){
$goodsRedis = \Redis\Db4\GoodsRedisModel::getInstance(); $goodsRedis = \Redis\Db4\GoodsRedisModel::getInstance();
$onlineStorageGoodsKey = \Our\NameConst::onlineStorageGoodsPrefix.$goodsId; $onlineStorageGoodsKey = \Our\NameConst::onlineStorageGoodsPrefix.$goodsId;
$onlineStorageGoods = $goodsRedis->tableHGAll($onlineStorageGoodsKey); $onlineStorageGoods = $goodsRedis->tableHGAll($onlineStorageGoodsKey);
...@@ -170,7 +170,7 @@ class GoodsStorageModel extends \DAO\AbstractModel { ...@@ -170,7 +170,7 @@ class GoodsStorageModel extends \DAO\AbstractModel {
$goodsRedis->tableHMGet($onlineStorageGoodsKey,$data,\Our\ApiConst::tenDaySecond); $goodsRedis->tableHMGet($onlineStorageGoodsKey,$data,\Our\ApiConst::tenDaySecond);
return $data; return $data;
} }
} }*/
/** /**
* 更新商品缓存 * 更新商品缓存
......
...@@ -105,6 +105,7 @@ class CodeConfigModel ...@@ -105,6 +105,7 @@ class CodeConfigModel
const notHaveAccess = 10117; const notHaveAccess = 10117;
const sellerJoinUpdateFailed = 10118; const sellerJoinUpdateFailed = 10118;
const passwordLenLimit = 10119; const passwordLenLimit = 10119;
const redisLockedFailed = 10120;
//访问错误 //访问错误
const illegalAccess = 200001; const illegalAccess = 200001;
...@@ -326,7 +327,9 @@ class CodeConfigModel ...@@ -326,7 +327,9 @@ class CodeConfigModel
const beyondRecieverTime=300144; const beyondRecieverTime=300144;
const payTypeUpdateError = 30145; const payTypeUpdateError = 30145;
const beyongRefundAmount = 300146; const beyongRefundAmount = 300146;
const cancelRefundMoneyError = 300147; const addOrderFrequently = 300147;
const cancelRefundMoneyError = 300148;
const serverBusy = 300149;
//店铺相关错误码 //店铺相关错误码
//商品分类 //商品分类
...@@ -482,7 +485,7 @@ class CodeConfigModel ...@@ -482,7 +485,7 @@ class CodeConfigModel
self::emptyDeviceUniqueCode => '设备唯一识别码不能为空', self::emptyDeviceUniqueCode => '设备唯一识别码不能为空',
self::addMemberInfoFailed => '注册保存用户信息失败', self::addMemberInfoFailed => '注册保存用户信息失败',
self::wrongMobileFormat => '手机号码格式错误', self::wrongMobileFormat => '手机号码格式错误',
self::registerMobileExist => '您的手机号码已经存在', self::registerMobileExist => '该手机号码已注册',
self::emptyUserType => '用户来源不能为空', self::emptyUserType => '用户来源不能为空',
self::wrongUserType => '用户只能来自微博、QQ、微信', self::wrongUserType => '用户只能来自微博、QQ、微信',
self::emptyUserAvatar => '第三方用户头像不能为空', self::emptyUserAvatar => '第三方用户头像不能为空',
...@@ -539,7 +542,8 @@ class CodeConfigModel ...@@ -539,7 +542,8 @@ class CodeConfigModel
self::sellerNameUpdateFailed => '更换手机时卖家手机号码更新失败', self::sellerNameUpdateFailed => '更换手机时卖家手机号码更新失败',
self::notHaveAccess => '您没有权限使用', self::notHaveAccess => '您没有权限使用',
self::sellerJoinUpdateFailed => '更换手机时卖家手机号码更新失败', self::sellerJoinUpdateFailed => '更换手机时卖家手机号码更新失败',
self::passwordLenLimit => '密码为6~16位的数字或字母组合', self::passwordLenLimit => '密码长度不能小于6位',
self::redisLockedFailed => '获取redis锁失败',
//商品相关 //商品相关
self::emptyCommonId => '商品主键不能为空', self::emptyCommonId => '商品主键不能为空',
self::goodsNotExist => '商品不存在', self::goodsNotExist => '商品不存在',
...@@ -835,7 +839,9 @@ class CodeConfigModel ...@@ -835,7 +839,9 @@ class CodeConfigModel
self::beyondRecieverTime=>'设置收货时间不能早于当前时间', self::beyondRecieverTime=>'设置收货时间不能早于当前时间',
self::payTypeUpdateError=> '更新支付类型失败', self::payTypeUpdateError=> '更新支付类型失败',
self::beyongRefundAmount=>'退款金额不能超过可退款金额', self::beyongRefundAmount=>'退款金额不能超过可退款金额',
self::addOrderFrequently => '操作太频繁,请稍后重试',
self::cancelRefundMoneyError=>'退款有误,请于商家联系', self::cancelRefundMoneyError=>'退款有误,请于商家联系',
self::serverBusy => '服务器繁忙,请稍后重试',
//销售员 //销售员
self::emptySaleGoodsId => '商品id不能为空', self::emptySaleGoodsId => '商品id不能为空',
self::emptySaleGoods => '销售商品不存在', self::emptySaleGoods => '销售商品不存在',
......
...@@ -15,6 +15,7 @@ class ErrorModel { ...@@ -15,6 +15,7 @@ class ErrorModel {
* @throws \Exception * @throws \Exception
*/ */
public static function throwException($code, $message = null) { public static function throwException($code, $message = null) {
\Lock\RedisLock::getInstance()->releaseLock('addOrder');
if (!$message) { if (!$message) {
$codeConfig = \Error\CodeConfigModel::getCodeConfig(); $codeConfig = \Error\CodeConfigModel::getCodeConfig();
if (empty($codeConfig[$code])) { if (empty($codeConfig[$code])) {
......
...@@ -36,6 +36,9 @@ class LinkMySQLModel{ ...@@ -36,6 +36,9 @@ class LinkMySQLModel{
public static function get($database='resources.database.slave.params') { public static function get($database='resources.database.slave.params') {
if ( empty(self::$_configs[$database]) ) { if ( empty(self::$_configs[$database]) ) {
if($database===true){
$database = 'resources.database.params';
}
$config = \Yaf\Registry::get('config')->get($database); $config = \Yaf\Registry::get('config')->get($database);
$config = $config->toArray(); $config = $config->toArray();
self::$_configs[$database]=$config; self::$_configs[$database]=$config;
......
...@@ -89,7 +89,8 @@ class AbstractModel { ...@@ -89,7 +89,8 @@ class AbstractModel {
* @return * @return
*/ */
public function del($key) { public function del($key) {
return $this->getRedis()->del($this->_addPrefix($key)); $keyNew = $this->_addPrefix($key);
return $this->getRedis()->del($keyNew);
} }
public function delAll($data){ public function delAll($data){
return $this->getRedis()->del($data); return $this->getRedis()->del($data);
...@@ -135,10 +136,21 @@ class AbstractModel { ...@@ -135,10 +136,21 @@ class AbstractModel {
return $this->getRedis()->get($this->_addPrefix($key)); return $this->getRedis()->get($this->_addPrefix($key));
} }
public function setnx($key, $value,$expire=\Our\ApiConst::zero){
$res=$this->getRedis()->setnx($this->_addPrefix($key),$value);
if($expire>0){
$this->getRedis()->expire($this->_addPrefix($key),$expire);
}
return $res;
}
public function getNoPrefix($key){ public function getNoPrefix($key){
return $this->getRedis()->get($key); return $this->getRedis()->get($key);
} }
public function setNoPrefix($key,$value,$expire=0){
return $this->getRedis()->set($key,$value,$expire);
}
/** /**
* redis自增1 * redis自增1
* *
......
<?php <?php
namespace Redis\Db0; namespace Redis\Db1;
/** /**
* User: liuyuzhen * User: liuyuzhen
* Date: 2018/8/20 * Date: 2018/8/20
* Time: 10:30 * Time: 10:30
* Description: * Description:
*/ */
class LockRedisModel extends \Redis\Db0\AbstractModel { class LockRedisModel extends \Redis\Db1\AbstractModel {
/** /**
* 表名 * 表名
* *
...@@ -72,6 +72,10 @@ class LockRedisModel extends \Redis\Db0\AbstractModel { ...@@ -72,6 +72,10 @@ class LockRedisModel extends \Redis\Db0\AbstractModel {
return $this->del($this->calcKey($h)); return $this->del($this->calcKey($h));
} }
public function tableSetnx($id,$data,$experio=\Our\ApiConst::zero){
$res=$this->setnx($this->calcKey($id), $data,$experio);
return $res;
}
public function tableExpire($key,$experio=0){ public function tableExpire($key,$experio=0){
return $this->expire($this->calcKey($key),$experio); return $this->expire($this->calcKey($key),$experio);
} }
......
...@@ -39,9 +39,9 @@ class AbstractModel extends \Redis\AbstractModel { ...@@ -39,9 +39,9 @@ class AbstractModel extends \Redis\AbstractModel {
$str = $str[0]; $str = $str[0];
$result = $this->getNoPrefix($str); $result = $this->getNoPrefix($str);
if($this->is_serialized($result)){ if($this->is_serialized($result)){
return unserialize($result); $result = unserialize($result);
} }
return $result; return array('key'=>$str,'result'=>$result);
}else{ }else{
return false; return false;
} }
......
This diff is collapsed.
...@@ -12,8 +12,7 @@ config.url.resourcesHost = "http://api.shenbd.com" ...@@ -12,8 +12,7 @@ config.url.resourcesHost = "http://api.shenbd.com"
config.url.userHost = "" config.url.userHost = ""
; ;
; ; oss 域名 ; ; oss 域名
config.url.ossHost = "https://img.shenbd.com" config.url.ossHost = "https://qmoss-01.oss-cn-hangzhou.aliyuncs.com"
;config.url.ossHost = "https://qmoss-01.oss-cn-hangzhou.aliyuncs.com"
; ;
; ;推送域名 ; ;推送域名
config.url.pushHost="172.16.142.15:9503"; config.url.pushHost="172.16.142.15:9503";
...@@ -37,8 +36,8 @@ config.url.resourcesHost = "http://api.shenbd.com" ...@@ -37,8 +36,8 @@ config.url.resourcesHost = "http://api.shenbd.com"
; 用户中心host ; 用户中心host
config.url.userHost = "" config.url.userHost = ""
config.url.ossHost = "https://img.shenbd.com" ; oss 域名
;config.url.ossHost = "https://qmoss-01.oss-cn-hangzhou.aliyuncs.com" config.url.ossHost = "https://qmoss-01.oss-cn-hangzhou.aliyuncs.com"
;推送域名 ;推送域名
config.url.pushHost="127.0.0.1:9503"; config.url.pushHost="127.0.0.1:9503";
...@@ -55,9 +54,9 @@ config.url.convert=/usr/local/bin/wkhtmltoimage ...@@ -55,9 +54,9 @@ config.url.convert=/usr/local/bin/wkhtmltoimage
config.url.resourcesHost = "http://apitest.shenbd.com" config.url.resourcesHost = "http://apitest.shenbd.com"
; 用户中心host ; 用户中心host
config.url.userHost = "" config.url.userHost = ""
config.url.ossHost = "https://imgpre.shenbd.com"
; oss 域名 ; oss 域名
;config.url.ossHost = "https://qmoss-01.oss-cn-hangzhou.aliyuncs.com" config.url.ossHost = "https://qmoss-01.oss-cn-hangzhou.aliyuncs.com"
;推送域名 ;推送域名
config.url.pushHost="127.0.0.1:9503"; config.url.pushHost="127.0.0.1:9503";
...@@ -75,9 +74,9 @@ config.url.source="/www/web/testadmin_shenbd_com/public_html/data/upload/" ...@@ -75,9 +74,9 @@ config.url.source="/www/web/testadmin_shenbd_com/public_html/data/upload/"
config.url.resourcesHost = "http://apitest.qm.com" config.url.resourcesHost = "http://apitest.qm.com"
; 用户中心host ; 用户中心host
config.url.userHost = "" config.url.userHost = ""
config.url.ossHost = "https://img.shenbd.com"
; oss 域名 ; oss 域名
;config.url.ossHost = "http://qmoss-01.oss-cn-hangzhou.aliyuncs.com" config.url.ossHost = "http://qmoss-01.oss-cn-hangzhou.aliyuncs.com"
;推送域名 ;推送域名
config.url.pushHost="127.0.0.1:9503"; config.url.pushHost="127.0.0.1:9503";
...@@ -91,16 +90,11 @@ config.url.resourcesHost = "http://test.qm.com" ...@@ -91,16 +90,11 @@ config.url.resourcesHost = "http://test.qm.com"
config.url.userHost = "" config.url.userHost = ""
; oss 域名 ; oss 域名
config.url.ossHost = "https://img.shenbd.com" config.url.ossHost = "http://qmoss-01.oss-cn-hangzhou.aliyuncs.com"
;推送域名 ;推送域名
config.url.pushHost="127.0.0.1:9503"; config.url.pushHost="127.0.0.1:9503";
config.url.indexUrl="/www/web/test_qm_com/application/library/React"
config.url.libary="/www/web/test_qm_com/application/library"
config.url.source="/www/web/test_qm_com/public_html/data/upload/"
;config.url.source="E:/WAMP/www/www.qm.com/data/upload/" ;config.url.source="E:/WAMP/www/www.qm.com/data/upload/"
; 文件目录 ; 文件目录
;店铺图片报错目录 ;店铺图片报错目录
...@@ -122,10 +116,10 @@ config.url.resourcesHost = "http://local.qm.com" ...@@ -122,10 +116,10 @@ config.url.resourcesHost = "http://local.qm.com"
config.url.userHost = "" config.url.userHost = ""
; oss 域名 ; oss 域名
config.url.ossHost = "https://imgpre.shenbd.com" config.url.ossHost = "http://qmoss-01.oss-cn-hangzhou.aliyuncs.com"
;推送域名 ;推送域名
config.url.pushHost="192.168.1.201:9503"; config.url.pushHost="127.0.0.1:9503";
config.url.convert="/usr/local/bin/wkhtmltoimage"; config.url.convert="/usr/local/bin/wkhtmltoimage";
......
...@@ -7,7 +7,7 @@ define("APP_ENV",ini_get('yaf.environ')); ...@@ -7,7 +7,7 @@ define("APP_ENV",ini_get('yaf.environ'));
if(APP_ENV=='develop'){ if(APP_ENV=='develop'){
error_reporting(E_ALL); error_reporting(E_ALL);
} }
if(APP_ENV=='test' || APP_ENV=='pre' ||APP_ENV=='ccwdevelop' || APP_ENV=='product' || APP_ENV=='productone'){ if(APP_ENV=='test' || APP_ENV=='pre' ||APP_ENV=='ccwdevelop' || APP_ENV=='product' || APP_ENV=='productone'|| APP_ENV=='lyztest' ){
if(isset($_POST['data']['debug'])&&!empty($_POST['data']['debug'])){ if(isset($_POST['data']['debug'])&&!empty($_POST['data']['debug'])){
// define("DEBUG",1); // define("DEBUG",1);
error_reporting(E_ALL); error_reporting(E_ALL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment