Ejemplo n.º 1
0
 public function run(array $params)
 {
     global $f3;
     // 1. reset 整个数据库
     printLog('Begin Reset Database', 'ResetData');
     $dbEngine = DataMapper::getDbEngine();
     // 解析 sql 文件,导入数据
     $sqlFileContent = file_get_contents(CONSOLE_PATH . '/../install/Asset/data/bzfshop.sql');
     $sqlFileContent = SqlHelper::removeComment($sqlFileContent);
     $sqlArray = SqlHelper::splitToSqlArray($sqlFileContent, ';');
     unset($sqlFileContent);
     foreach ($sqlArray as $sqlQuery) {
         $queryObject = $dbEngine->prepare($sqlQuery);
         $queryObject->execute();
         unset($sqlQuery);
         unset($queryObject);
     }
     unset($sqlArray);
     printLog('End Reset Database', 'ResetData');
     // 2. 删除 /data 目录下的所有目录
     printLog('remove everything under /data', 'ResetData');
     $this->removeAllDirInsideDir($f3->get('sysConfig[data_path_root]'));
     // 3. 删除 RunTime 目录下所有目录
     printLog('remove everything in Runtime', 'ResetData');
     $this->removeAllDirInsideDir($f3->get('sysConfig[runtime_path]') . DIRECTORY_SEPARATOR . 'Log/');
     $this->removeAllDirInsideDir($f3->get('sysConfig[runtime_path]') . DIRECTORY_SEPARATOR . 'Smarty/');
     $this->removeAllDirInsideDir($f3->get('sysConfig[runtime_path]') . DIRECTORY_SEPARATOR . 'Temp/');
     // 4. 清除 F3 的缓存
     $f3->clear('CACHE');
     printLog('ResetData Done', 'ResetData');
 }
Ejemplo n.º 2
0
 public function run(array $params)
 {
     global $f3;
     $goodsBasicService = new GoodsBasicService();
     $goods = $goodsBasicService->loadGoodsById('20');
     $sql = 'update ' . DataMapper::tableName('goods') . ' set goods_after_service = ? ';
     $dbEngine = DataMapper::getDbEngine();
     $dbEngine->exec($sql, array(1 => $goods['goods_after_service']));
 }
Ejemplo n.º 3
0
 /**
  * 记录帐户变动
  * @param   int    $userId        用户id
  * @param   float  $userMoney     可用余额变动
  * @param   float  $frozenMoney   冻结余额变动
  * @param   int    $rankPoints    等级积分变动
  * @param   int    $payPoints     消费积分变动
  * @param   string $changeDesc    变动说明
  * @param   int    $changeType    变动类型:参见常量文件
  *
  * @return  void
  */
 function logChange($userId, $userMoney = 0, $frozenMoney = 0, $rankPoints = 0, $payPoints = 0, $changeDesc = '', $changeType = AccountLog::ACT_OTHER, $adminUserId = 0)
 {
     /* 插入帐户变动记录 */
     $accountLogInfo = array('user_id' => $userId, 'user_money' => $userMoney, 'frozen_money' => $frozenMoney, 'rank_points' => $rankPoints, 'pay_points' => $payPoints, 'change_time' => Time::gmTime(), 'change_desc' => $changeDesc, 'change_type' => $changeType, 'admin_user_id' => $adminUserId);
     // 插入一条记录
     $dataMapper = new DataMapper('account_log');
     $dataMapper->copyFrom($accountLogInfo);
     $dataMapper->save();
     // 更新用户信息
     $sql = "UPDATE " . DataMapper::tableName('users') . " SET user_money = user_money + ('{$userMoney}')," . " frozen_money = frozen_money + ('{$frozenMoney}')," . " rank_points = rank_points + ('{$rankPoints}')," . " pay_points = pay_points + ('{$payPoints}')" . " WHERE user_id = ? Order By user_id asc LIMIT 1 ";
     $dbEngine = DataMapper::getDbEngine();
     $dbEngine->exec($sql, $userId);
 }
Ejemplo n.º 4
0
 public function run(array $params)
 {
     global $f3;
     // 每次处理多少条记录
     $batchProcessCount = 100;
     $baseService = new BaseService();
     $totalGoodsCount = $baseService->_countArray('goods', null);
     // 记录处理开始
     for ($offset = 0; $offset < $totalGoodsCount; $offset += $batchProcessCount) {
         $goodsArray = $baseService->_fetchArray('goods', 'goods_id', null, array('order' => 'goods_id asc'), $offset, $batchProcessCount);
         foreach ($goodsArray as $goodsItem) {
             $sql = "update " . DataMapper::tableName('goods') . ' set ' . ' user_buy_number = (select sum(goods_number) from ' . DataMapper::tableName('order_goods') . ' where goods_id = ? )' . ' ,user_pay_number = (select sum(goods_number) from ' . DataMapper::tableName('order_goods') . ' where goods_id = ? and order_goods_status > 0)' . ' where goods_id = ? order by goods_id asc limit 1 ';
             $dbEngine = DataMapper::getDbEngine();
             $dbEngine->exec($sql, array(1 => $goodsItem['goods_id'], $goodsItem['goods_id'], $goodsItem['goods_id']));
         }
         unset($goodsArray);
         printLog('calculate goods buy number offset : ' . $offset);
     }
     printLog('calculate goods buy number finished , offset : ' . $offset);
 }
Ejemplo n.º 5
0
        public function doUpdate($currentVersion)
        {
            // 更新数据库表
            $sqlFileContent = <<<SQL
-- 创建 cron 任务列表
CREATE TABLE IF NOT EXISTS `bzf_cron_task` (
  `task_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(32) DEFAULT NULL COMMENT '哪个用户添加的',
  `task_name` varchar(16) DEFAULT NULL COMMENT '任务名称',
  `task_desc` varchar(128) DEFAULT NULL COMMENT '任务描述',
  `task_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '任务设定时间',
  `task_run_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '任务实际运行时间',
  `task_class` varchar(128) NOT NULL COMMENT '任务的PHP Class',
  `task_param` text DEFAULT NULL,
  `search_param` varchar(64) DEFAULT NULL COMMENT '用于任务搜索',
  `return_code` int DEFAULT 0 COMMENT '任务设定时间',
  `return_message` varchar(128) DEFAULT NULL COMMENT '任务返回消息',

  PRIMARY KEY (`task_id`)
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

ALTER TABLE `bzf_cron_task` ADD INDEX ( `task_name` ) ;
ALTER TABLE `bzf_cron_task` ADD INDEX ( `task_time` ) ;
ALTER TABLE `bzf_cron_task` ADD INDEX ( `task_run_time` ) ;
ALTER TABLE `bzf_cron_task` ADD INDEX ( `search_param` ) ;
ALTER TABLE `bzf_cron_task` ADD INDEX ( `return_code` ) ;

-- 记录管理员的行为
CREATE TABLE IF NOT EXISTS `bzf_admin_log` (
  `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` mediumint(8) unsigned NOT NULL ,
  `user_name` varchar(60) DEFAULT NULL ,
  `operate` varchar(16) DEFAULT NULL COMMENT '操作名称',
  `operate_desc` varchar(128) DEFAULT NULL COMMENT '操作描述',
  `operate_time` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '操作时间',
  `operate_data` text DEFAULT NULL COMMENT '操作的数据记录',
  PRIMARY KEY (`log_id`)
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
ALTER TABLE `bzf_admin_log` ADD INDEX ( `user_id` ) ;
ALTER TABLE `bzf_admin_log` ADD INDEX ( `operate` ) ;
ALTER TABLE `bzf_admin_log` ADD INDEX ( `operate_time` ) ;

-- 修改价格表,增加价格说明
ALTER TABLE `bzf_goods` ADD `shop_price_notice` VARCHAR( 32 ) NULL DEFAULT NULL COMMENT '价格说明' AFTER `shop_price`;
ALTER TABLE `bzf_goods` ADD `type_id` SMALLINT( 5 ) NOT NULL DEFAULT '0' COMMENT '商品类型' AFTER `cat_id`;

-- 修改 brand 表
ALTER TABLE `bzf_brand` CHANGE `sort_order` `sort_order` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT '0';
ALTER TABLE `bzf_brand` CHANGE `brand_logo` `brand_logo` VARCHAR( 128 ) NULL DEFAULT NULL ;
ALTER TABLE `bzf_brand` CHANGE `brand_desc` `brand_desc` VARCHAR( 255 ) NULL DEFAULT NULL ;
ALTER TABLE `bzf_brand` ADD `is_custom` int NULL DEFAULT 0 COMMENT '是否自定义页面';
ALTER TABLE `bzf_brand` ADD `custom_page` TEXT NULL DEFAULT NULL COMMENT '品牌自定义页面';

-- 增加 goods_attr 表记录商品的属性值
CREATE TABLE IF NOT EXISTS `bzf_goods_attr` (
  `goods_attr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `goods_id` int(10) unsigned NOT NULL DEFAULT '0',
  `attr_item_id` int(10) unsigned NOT NULL DEFAULT '0',
  `attr_item_value` varchar(128) NULL,
  PRIMARY KEY (`goods_attr_id`),
  KEY `goods_id` (`goods_id`),
  KEY `attr_item_id` (`attr_item_id`),
  KEY `attr_item_value` (`attr_item_value`)
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

SQL;
            $dbEngine = DataMapper::getDbEngine();
            // 解析 sql 文件,导入数据
            $sqlFileContent = SqlHelper::removeComment($sqlFileContent);
            $sqlArray = SqlHelper::splitToSqlArray($sqlFileContent, ';');
            unset($sqlFileContent);
            foreach ($sqlArray as $sqlQuery) {
                $queryObject = $dbEngine->prepare($sqlQuery);
                $queryObject->execute();
                unset($sqlQuery);
                unset($queryObject);
            }
            unset($sqlArray);
            // 权限管理
            $metaPrivilegeService = new MetaPrivilegeService();
            // 删除不用的权限
            $metaPrivilegeService->removePrivilegeItem('manage_goods_attrgroup_listattrgroup');
            $metaPrivilegeService->removePrivilegeItem('manage_goods_attrgroup_create');
            $metaPrivilegeService->removePrivilegeItem('manage_goods_attrgroup_edit');
            // 添加执行权限
            $privilegeGroup = $metaPrivilegeService->loadPrivilegeGroup('manage_misc');
            $metaPrivilegeService->savePrivilegeItem($privilegeGroup['meta_id'], 'manage_misc_cron', '定时任务', '管理系统的定时任务');
            $privilegeGroup = $metaPrivilegeService->loadPrivilegeGroup('manage_account');
            $metaPrivilegeService->savePrivilegeItem($privilegeGroup['meta_id'], 'manage_account_admin_listlog', '管理员日志', '查看管理员的操作日志');
            $privilegeGroup = $metaPrivilegeService->loadPrivilegeGroup('manage_goods');
            $metaPrivilegeService->savePrivilegeItem($privilegeGroup['meta_id'], 'manage_goods_brand_listbrand', '商品品牌', '管理商品品牌');
            $metaPrivilegeService->savePrivilegeItem($privilegeGroup['meta_id'], 'manage_goods_type_listtype', '商品类型', '管理商品类型');
            // 把版本设置为 1.0.1
            ManageThemePlugin::saveOptionValue('version', $this->targetVersion);
            return true;
        }
Ejemplo n.º 6
0
 /**
  * 删除订单 order_info 已经后面对应的所有 order_goods 记录
  *
  * @return boolean 成功 true,失败 false
  *
  * @param int $orderId 订单ID号
  *
  */
 public function removeOrderInfo($orderId)
 {
     // 参数验证
     $validator = new Validator(array('orderId' => $orderId));
     $orderId = $validator->required()->digits()->min(1)->validate('orderId');
     $this->validate($validator);
     $orderInfo = $this->loadOrderInfoById($orderId);
     if (Order::OS_UNCONFIRMED != $orderInfo['order_status']) {
         //只有 OS_UNCONFIRMED 的订单才允许删除
         return false;
     }
     $dbEngine = DataMapper::getDbEngine();
     try {
         $dbEngine->begin();
         // 先删除所有的 order_goods 记录
         $this->removeAllOrderGoods($orderId);
         // 删除 orderInfo 记录
         $orderInfo->erase();
         $dbEngine->commit();
     } catch (Exception $e) {
         $dbEngine->rollback();
         return false;
     }
     return true;
 }
Ejemplo n.º 7
0
 /**
  * 标记订单已经支付
  *
  * @param int    $orderId 订单数字ID
  * @param int    $payId   支付类型,比如 4 代表财付通,5代表支付宝
  * @param string $payType 支付类型,比如 alipay, tenpay
  * @param string $payNo   支付方返回的交易编号,比如支付宝返回的交易号
  */
 public function markOrderInfoPay($orderId, $payId, $payType, $payNo, $note = '', $username = '******')
 {
     global $logger;
     // 参数验证
     $validator = new Validator(array('orderId' => $orderId, 'payId' => $payId));
     $orderId = $validator->required()->digits()->min(1)->validate('orderId');
     $payId = $validator->required()->digits()->min(1)->validate('payId');
     $this->validate($validator);
     // 订单操作,需要保证事务
     $dbEngine = DataMapper::getDbEngine();
     try {
         $dbEngine->begin();
         // 更新 order_info
         $orderBasicService = new Order();
         $orderInfo = $orderBasicService->loadOrderInfoById($orderId);
         if ($orderInfo->isEmpty()) {
             $logger->addLogInfo(\Core\Log\Base::ERROR, 'PAYMENT', __CLASS__ . '-' . __FUNCTION__ . ' invalid order_id [' . $orderId . ']');
             throw new \InvalidArgumentException('invalid order_id [' . $orderId . ']');
         }
         $currentGmTime = Time::gmTime();
         $orderInfo->order_status = Order::OS_CONFIRMED;
         $orderInfo->pay_status = Order::PS_PAYED;
         $orderInfo->update_time = $currentGmTime;
         $orderInfo->confirm_time = $currentGmTime;
         $orderInfo->pay_time = $currentGmTime;
         $orderInfo->pay_id = $payId;
         $orderInfo->pay_type = $payType;
         $orderInfo->pay_no = $payNo;
         $orderInfo->money_paid = $orderInfo->order_amount;
         $orderInfo->save();
         // 更新 order_goods
         $orderGoodsService = new Goods();
         $orderGoodsService->markOrderGoodsPay($orderInfo);
         if (empty($note)) {
             $note = '[' . $payType . ']付款确认';
         }
         //记录订单操作日志
         $orderActionService = new Action();
         $orderActionService->logOrderAction($orderId, 0, Order::OS_CONFIRMED, Order::PS_PAYED, Goods::OGS_PAY, $note, $username, 0, $orderInfo['shipping_status']);
         // 提交事务
         $dbEngine->commit();
         // 记录成功日志
         $logger->addLogInfo(\Core\Log\Base::INFO, 'PAYMENT', __CLASS__ . '-' . __FUNCTION__ . ' success order_id [' . $orderId . ']');
     } catch (Exception $e) {
         // 记录异常日志
         $logger->addLogInfo(\Core\Log\Base::ERROR, 'PAYMENT', print_r($e->getTrace(), true));
         $dbEngine->rollback();
     }
     // 由于商品库存发生变化,我们需要清除商品缓存,显示新的库存
     // 注意: 这个操作绝对不能在前面的 Transaction 中操作,防止对数据库性能造成巨大影响
     $orderGoodsArray = $orderBasicService->fetchOrderGoodsArray($orderId);
     $goodsIdArray = array();
     foreach ($orderGoodsArray as $orderGoodsItem) {
         $goodsIdArray[] = $orderGoodsItem['goods_id'];
     }
     $goodsIdArray = array_unique($goodsIdArray);
     foreach ($goodsIdArray as $goodsId) {
         // 清除商品的缓存,确保库存数据显示是正确的
         ClearHelper::clearGoodsCacheById($goodsId);
     }
 }
Ejemplo n.º 8
0
 /**
  * 把购物车中的信息保存到数据库订单中,如果订单已经存在,则更新订单数据,
  * 注意:这个方法必须在购物车计算完成之后调用,否则无法正确保存计算之后的数据
  *
  * @return mixed 失败返回 false,成功返回订单记录
  *
  * @param int    $userId   用户的数字 ID
  * @param string $username 用户名
  */
 public function saveOrder($userId, $username)
 {
     // 参数验证
     $validator = new Validator(array('userId' => $userId));
     $userId = $validator->required()->digits()->min(1)->validate('userId');
     $this->validate($validator);
     $orderBasicService = new OrderBasicService();
     $orderId = isset($this->cartContext->orderInfo) ? $this->cartContext->orderInfo['order_id'] : null;
     // 不允许创建空订单
     if (!$orderId && $this->cartContext->isEmpty()) {
         return false;
     }
     // 是否需要新建订单
     $isNewOrder = false;
     //检查这个 order_info 是否合法
     if ($orderId) {
         $orderInfo = $orderBasicService->loadOrderInfoById($orderId);
         // 不存在的 order_info 或者 已经付款了的订单不能再用了
         if ($orderInfo->isEmpty() || OrderBasicService::PS_UNPAYED != $orderInfo->pay_status) {
             $orderId = null;
             $isNewOrder = true;
         }
     } else {
         $isNewOrder = true;
     }
     // 创建 order_info 记录
     $orderInfoArray = $this->cartContext->orderInfoValue;
     $orderInfoArray['user_id'] = $userId;
     $orderInfoArray['order_status'] = OrderBasicService::OS_UNCONFIRMED;
     $orderInfoArray['pay_status'] = OrderBasicService::PS_UNPAYED;
     if (!$orderId) {
         // 新订单,生成 add_time 和 order_sn
         $orderInfoArray['add_time'] = Time::gmTime();
         $orderInfoArray['order_sn'] = OrderBasicService::generateOrderSn();
         $orderInfoArray['system_id'] = Cart::$cartSystemId;
         // 记录订单来自于哪个系统
     } elseif ($this->cartContext->isOrderAmountChange()) {
         // 去支付网关支付,如果订单金额发生变化都需要重新生成一次 order_sn ,因为订单金额如果发生变化,支付网关会拒绝支付
         $orderInfoArray['order_sn'] = OrderBasicService::generateOrderSn();
     } else {
         // do nothing
     }
     // 我们需要数据库事务的保障
     $dbEngine = DataMapper::getDbEngine();
     $dbEngine->begin();
     // 记录余额支付
     $oldSurplus = $this->cartContext->orderInfo ? $this->cartContext->orderInfo['surplus'] : 0;
     $newSurplus = $this->cartContext->getValue('surplus') > 0 ? $this->cartContext->getValue('surplus') : 0;
     // 记录使用红包
     $oldBonusId = $this->cartContext->orderInfo ? $this->cartContext->orderInfo['bonus_id'] : 0;
     $newBonusId = $this->cartContext->getValue('bonus_id') > 0 ? $this->cartContext->getValue('bonus_id') : 0;
     // 创建订单或者更新 order_info
     $orderInfo = $orderBasicService->saveOrderInfo($orderId, $orderInfoArray);
     // 创建订单失败,返回 false
     if ($orderInfo->isEmpty()) {
         goto out_fail;
     }
     // 处理余额支付
     if ($oldSurplus != $newSurplus) {
         // 前后发生了支付余额的改变
         $accountLog = new AccountLog();
         if ($oldSurplus > 0) {
             // 把之前的余额退还
             $accountLog->logChange($userId, $oldSurplus, 0, 0, 0, '退还余额,订单:' . $orderInfo['order_id'], AccountLog::ACT_OTHER);
         }
         if ($newSurplus > 0) {
             // 使用余额
             $accountLog->logChange($userId, -1 * $newSurplus, 0, 0, 0, '使用余额,订单:' . $orderInfo['order_id'], AccountLog::ACT_OTHER);
         }
         // 由于修改了用户信息,需要 reload 用户数据
         AuthHelper::reloadAuthUser();
     }
     // 处理红包支付
     if ($oldBonusId != $newBonusId) {
         // 红包支付前后发生了变化
         $bonusService = new Bonus();
         if ($oldBonusId > 0) {
             //退还之前使用的红包
             $bonusService->unUseBonus($oldBonusId);
         }
         if ($newBonusId > 0) {
             // 使用新的红包
             $bonusService->useBonus($newBonusId, $orderInfo['order_id']);
         }
     }
     // 创建 orderRefer 对象,记录订单的来源
     $orderReferService = new OrderReferService();
     $orderRefer = $orderReferService->loadOrderReferByOrderId($orderInfo['order_id']);
     // order_refer 记录创建一次之后就不会再修改了
     if ($orderRefer->isEmpty()) {
         // 新的 order_refer 记录,设置 order_id 值
         $orderRefer->order_id = $orderInfo['order_id'];
         $orderRefer->create_time = Time::gmTime();
         $orderRefer->login_type = AuthHelper::getLoginType();
         global $f3;
         $orderReferArray = ReferHelper::parseOrderRefer($f3);
         if (!empty($orderReferArray)) {
             unset($orderReferArray['refer_id']);
             //清除掉危险字段
             unset($orderReferArray['order_id']);
             //清除掉危险字段
             $orderRefer->copyFrom($orderReferArray);
         }
         $orderRefer->save();
         // 保存 order_refer 记录
     }
     // 取得数据库中已经存在的 order_goods 列表
     $dbOrderGoodsArray = array();
     if ($orderId > 0) {
         $dbOrderGoodsArray = $orderBasicService->fetchOrderGoodsArray($orderId);
     }
     $stillExistOrderGoodsIdArray = array();
     // 在购物车中仍然存在的 orderGoods 对象
     // 创建 orderInfo 对应的 order_goods 对象
     foreach ($this->cartContext->orderGoodsArray as $orderGoodsItem) {
         $orderGoodsValueArray = array();
         $orderGoodsValueArray['order_id'] = $orderInfo['order_id'];
         //从 goods 中复制属性
         $orderGoodsValueArray['goods_id'] = $orderGoodsItem->goods['goods_id'];
         $orderGoodsValueArray['goods_admin_user_id'] = $orderGoodsItem->goods['admin_user_id'];
         $orderGoodsValueArray['goods_admin_user_name'] = $orderGoodsItem->goods['admin_user_name'];
         $orderGoodsValueArray['goods_name'] = $orderGoodsItem->goods['goods_name_short'];
         $orderGoodsValueArray['goods_sn'] = $orderGoodsItem->goods['goods_sn'];
         $orderGoodsValueArray['warehouse'] = $orderGoodsItem->goods['warehouse'];
         $orderGoodsValueArray['shelf'] = $orderGoodsItem->goods['shelf'];
         $orderGoodsValueArray['market_price'] = $orderGoodsItem->goods['market_price'];
         $orderGoodsValueArray['shop_price'] = $orderGoodsItem->goods['shop_price'];
         $orderGoodsValueArray['shipping_fee'] = $orderGoodsItem->goods['shipping_fee'];
         $orderGoodsValueArray['is_real'] = $orderGoodsItem->goods['is_real'];
         $orderGoodsValueArray['extension_code'] = $orderGoodsItem->goods['extension_code'];
         $orderGoodsValueArray['suppliers_id'] = $orderGoodsItem->goods['suppliers_id'];
         $orderGoodsValueArray['suppliers_price'] = $orderGoodsItem->goods['suppliers_price'];
         $orderGoodsValueArray['suppliers_shipping_fee'] = $orderGoodsItem->goods['suppliers_shipping_fee'];
         // 合并一些因为计算而覆盖的值
         $orderGoodsValueArray = array_merge($orderGoodsValueArray, $orderGoodsItem->orderGoodsValue);
         $orderGoodsId = null;
         if (!$isNewOrder && $orderGoodsItem->orderGoods) {
             // 如果不是新订单,并且已经存在的 order_goods,做更新
             $orderGoodsId = $orderGoodsItem->orderGoods['rec_id'];
             $stillExistOrderGoodsIdArray[] = $orderGoodsId;
         } else {
             // 新建的 order_goods,我们需要取得它的 CPS 信息,CPS 信息只在一开始加入,后面不会再被修改了
             $cpsArray = ReferHelper::getCpsParam($orderRefer, $orderInfo, $orderGoodsValueArray);
             if (!empty($cpsArray)) {
                 $orderGoodsValueArray['cps_rate'] = isset($cpsArray['cps_rate']) ? $cpsArray['cps_rate'] : 0;
                 $orderGoodsValueArray['cps_fix_fee'] = isset($cpsArray['cps_fix_fee']) ? $cpsArray['cps_fix_fee'] : 0;
             }
         }
         $orderGoods = $orderBasicService->saveOrderGoods($orderGoodsId, $orderInfo['order_id'], $orderGoodsValueArray);
         if ($orderGoods->isEmpty()) {
             //创建失败
             goto out_fail;
         }
     }
     // 删除已经被用户删除的 order_goods
     foreach ($dbOrderGoodsArray as $dbOrderGoodsItem) {
         // 这个 order_goods 已经不存在了,删除它
         if (!in_array($dbOrderGoodsItem['rec_id'], $stillExistOrderGoodsIdArray)) {
             $orderBasicService->removeOrderGoods($dbOrderGoodsItem['rec_id']);
         }
     }
     // 记录订单操作日志
     $orderActionService = new OrderActionService();
     $orderActionService->logOrderAction($orderInfo['order_id'], 0, OrderBasicService::OS_UNCONFIRMED, OrderBasicService::PS_UNPAYED, OrderGoodsService::OGS_UNPAY, '订单创建或更新', $username, 0, 0);
     $dbEngine->commit();
     return $orderInfo;
     // 返回创建的订单
     out_fail:
     $dbEngine->rollback();
     return false;
 }
Ejemplo n.º 9
0
 /**
  * 统计每个商品分类有多少商品,不计算子分类的商品数量(比如 A 下面有 B, C 分类,
  * 这里计算的 A 包含的商品数量不计算 B, C 的在内)
  *
  * @param int $ttl 缓存时间
  *
  * @return array
  * 格式  array(array(cat_id, goods_count), ...)
  */
 public function calcCategoryGoodsCount($ttl = 0)
 {
     $dbEngine = DataMapper::getDbEngine();
     return $dbEngine->exec('select cat_id, count(1) as goods_count from ' . DataMapper::tableName('goods') . ' group by cat_id ', null, $ttl);
 }
Ejemplo n.º 10
0
 /**
  * 取得一个商品在某个属性组中的属性
  *
  * @param  int $groupId
  * @param  int $goods_id
  * @param int  $ttl
  *
  * @return array|null
  */
 public function fetchGoodsAttributeArrayOfAttrGroup($groupId, $goods_id, $ttl = 0)
 {
     // 参数验证
     $validator = new Validator(array('groupId' => $groupId, 'goods_id' => $goods_id, 'ttl' => $ttl));
     $groupId = $validator->required()->digits()->min(1)->validate('groupId');
     $goods_id = $validator->required()->digits()->min(1)->validate('goods_id');
     $ttl = $validator->digits()->min(0)->validate('ttl');
     $this->validate($validator);
     // 取得商品的属性
     $sql = "SELECT a.*, " . "g.goods_attr_id, g.attr_value, g.attr_price " . 'FROM ' . DataMapper::tableName('meta') . ' AS a ' . 'LEFT JOIN ' . DataMapper::tableName('goods_attr') . ' AS g ON a.meta_id = g.attr_id and g.goods_id = ? ' . "WHERE a.parent_meta_id = ? and a.meta_type = ? " . 'ORDER BY a.meta_sort_order, g.attr_price, g.goods_attr_id';
     $dbEngine = DataMapper::getDbEngine();
     $result = $dbEngine->exec($sql, array(1 => $goods_id, $groupId, GoodsAttrItem::META_TYPE), $ttl);
     if (empty($result)) {
         // 没有属性,则返回
         return null;
     }
     // 处理属性,属性分为 2 类,一类用于显示,一类用于选择价格
     $attrubuteArray = array();
     $attrubuteArray['prop'] = array();
     //属性  0: 直接用于显示的属性
     $attrubuteArray['spec'] = array();
     //规格 1: 用户单选属性,不同价格   2: 用户多选属性,不同价格
     foreach ($result as $attrItem) {
         $attrData = GoodsAttrItem::decodeGoodsAttrItemData($attrItem['meta_data']);
         if (GoodsAttrItem::ATTR_TYPE_DISPLAY == $attrData['attr_type']) {
             // 只是用于显示的属性
             $attrubuteArray['prop'][$attrItem['meta_id']] = array('name' => $attrItem['meta_name'], 'value' => $attrItem['attr_value'], 'goods_attr_id' => $attrItem['goods_attr_id'], 'attr_input_type' => $attrData['attr_input_type'], 'attr_type' => $attrData['attr_type'], 'attr_desc' => $attrItem['meta_desc'], 'meta_id' => $attrItem['meta_id']);
         } else {
             // 用于选择不同价格的属性
             $attrubuteArray['spec'][$attrItem['meta_id']]['meta_id'] = $attrItem['meta_id'];
             $attrubuteArray['spec'][$attrItem['meta_id']]['attr_input_type'] = $attrData['attr_input_type'];
             $attrubuteArray['spec'][$attrItem['meta_id']]['attr_type'] = $attrData['attr_type'];
             $attrubuteArray['spec'][$attrItem['meta_id']]['attr_desc'] = $attrItem['meta_desc'];
             $attrubuteArray['spec'][$attrItem['meta_id']]['name'] = $attrItem['meta_name'];
             $attrubuteArray['spec'][$attrItem['meta_id']]['values'][] = array('label' => $attrItem['attr_value'], 'price' => $attrItem['attr_price'], 'goods_attr_id' => $attrItem['goods_attr_id']);
         }
     }
     return $attrubuteArray;
 }
Ejemplo n.º 11
0
 /**
  * 标记 order_goods 记录为已经支付状态
  *
  * @param $orderId
  */
 public function markOrderGoodsPay($orderInfo)
 {
     // 参数验证
     $validator = new Validator(array('orderId' => $orderInfo['order_id']));
     $orderId = $validator->required()->digits()->min(1)->validate('orderId');
     $this->validate($validator);
     // 设置 order_goods 的状态
     $sql = 'update ' . DataMapper::tableName('order_goods') . ' set order_goods_status = ' . Goods::OGS_PAY . ', update_time = ' . Time::gmTime() . ' where order_id = ? ';
     $dbEngine = DataMapper::getDbEngine();
     $dbEngine->exec($sql, $orderId);
     $goodsCommentService = new GoodsCommentService();
     $userBasicService = new UserBasicSerivce();
     $userInfo = $userBasicService->loadUserById($orderInfo['user_id']);
     $orderBasicService = new OrderBasicService();
     $orderGoodsArray = $orderBasicService->fetchOrderGoodsArray($orderId);
     foreach ($orderGoodsArray as $orderGoodsItem) {
         // 更新商品的销售数量
         $this->updateGoodsUserPayCount($orderGoodsItem['goods_id'], $orderGoodsItem['goods_number']);
         // 更新商品的库存
         $this->updateGoodsGoodsNumber($orderGoodsItem['goods_id'], $orderGoodsItem['goods_attr'], $orderGoodsItem['goods_number']);
         // 添加一个 goods_comment 记录
         if (!$goodsCommentService->isOrderGoodsCommentExist($orderGoodsItem['rec_id'])) {
             $goodsComment = $goodsCommentService->loadGoodsCommentById(0);
             $goodsComment->create_time = Time::gmTime();
             $goodsComment->rec_id = $orderGoodsItem['rec_id'];
             $goodsComment->goods_id = $orderGoodsItem['goods_id'];
             $goodsComment->goods_price = $orderGoodsItem['goods_price'];
             $goodsComment->goods_number = $orderGoodsItem['goods_number'];
             $goodsComment->goods_attr = $orderGoodsItem['goods_attr'];
             $goodsComment->comment_rate = 5;
             // 用户不评论,我们默认为好评,显示
             $goodsComment->is_show = 1;
             // 用户不评论,我们默认为好评,显示
             $goodsComment->user_id = $userInfo['user_id'];
             $goodsComment->user_name = $userInfo['user_name'];
             $goodsComment->save();
         }
     }
 }
Ejemplo n.º 12
0
 /**
  * 删除一个属性组
  *
  * @param int $meta_id
  */
 public function removeGoodsTypeAttrGroup($meta_id)
 {
     $attrGroup = $this->loadGoodsTypeAttrGroupById($meta_id);
     // 把 Group 下的 Item 都设置为 没有Group
     $sql = 'update ' . DataMapper::tableName('meta') . ' set meta_key = "" where meta_type = ? and meta_key = ?';
     $dbEngine = DataMapper::getDbEngine();
     $dbEngine->exec($sql, array(1 => self::META_TYPE_GOODS_TYPE_ATTR_ITEM, strval($meta_id)));
     // 删除 Group 自身
     $attrGroup->erase();
 }
Ejemplo n.º 13
0
 public function post($f3)
 {
     // 权限检查
     $this->requirePrivilege('manage_order_settle');
     // 参数验证
     $validator = new Validator($f3->get('POST'));
     $payTimeStart = $validator->required()->digits()->validate('payTimeStart');
     $payTimeEnd = $validator->required()->digits()->validate('payTimeEnd');
     $suppliers_id = $validator->required()->digits()->validate('suppliers_id');
     if (!$this->validate($validator)) {
         goto out;
     }
     $orderGoodsIdArray = $validator->validate('orderGoodsIdArray');
     $memo = $validator->validate('memo');
     if (empty($orderGoodsIdArray) || !is_array($orderGoodsIdArray)) {
         $this->addFlashMessage('没有订单需要结算');
         goto out;
     }
     // 取得供货商的信息
     $userSupplierService = new UserSupplierService();
     $supplier = $userSupplierService->loadSupplierById($suppliers_id);
     if ($supplier->isEmpty()) {
         $this->addFlashMessage('供货商不存在');
         goto out;
     }
     // 取得所有 order_goods 记录
     $orderGoodsService = new OrderGoodsService();
     $orderGoodsArray = $orderGoodsService->_fetchArray('order_goods', 'rec_id, order_goods_status, goods_number,suppliers_id, suppliers_price, suppliers_shipping_fee, suppliers_refund, shipping_id', array(array(QueryBuilder::buildInCondition('rec_id', $orderGoodsIdArray))), array('order' => 'rec_id asc'), 0, $f3->get('sysConfig[max_query_record_count]'), 0);
     //最多限制 max_query_record_count 条记录
     if (empty($orderGoodsArray)) {
         $this->addFlashMessage('没有订单需要结算');
         goto out;
     }
     // 检查订单,计算订单结算金额
     $totalGoodsPrice = 0;
     $totalShippingFee = 0;
     $totalRefund = 0;
     $totalOrderGoodsCount = 0;
     //剔除非法的 orderGoodsId
     $invalidOrderGoodsIdArray = array();
     foreach ($orderGoodsArray as $orderGoodsItem) {
         if (OrderGoodsService::OGS_UNPAY == $orderGoodsItem['order_goods_status'] || $orderGoodsItem['suppliers_id'] != $suppliers_id || $orderGoodsItem['shipping_id'] <= 0) {
             // 非法订单,剔除掉
             $invalidOrderGoodsIdArray[] = $orderGoodsItem['rec_id'];
             continue;
         }
         $totalGoodsPrice += $orderGoodsItem['goods_number'] * $orderGoodsItem['suppliers_price'];
         $totalShippingFee += $orderGoodsItem['suppliers_shipping_fee'];
         $totalRefund += $orderGoodsItem['suppliers_refund'];
         $totalOrderGoodsCount++;
     }
     //剔除非法的 orderGoodsId
     $orderGoodsIdArray = array_diff($orderGoodsIdArray, $invalidOrderGoodsIdArray);
     if (empty($orderGoodsIdArray)) {
         $this->addFlashMessage('没有订单需要结算');
         goto out;
     }
     // 取得当前结算的管理员
     $authAdminUser = AuthHelper::getAuthUser();
     $dbEngine = DataMapper::getDbEngine();
     try {
         // 我们这里需要事务保障
         $dbEngine->begin();
         //创建 order_settle 记录
         $orderSettleService = new OrderSettleService();
         $orderSettle = $orderSettleService->loadOrderSettleBySettleId(0);
         $orderSettle->user_id = $authAdminUser['user_id'];
         $orderSettle->user_name = $authAdminUser['user_name'];
         $orderSettle->settle_start_time = $payTimeStart;
         $orderSettle->settle_end_time = $payTimeEnd;
         $orderSettle->suppliers_id = $suppliers_id;
         $orderSettle->suppliers_name = $supplier['suppliers_name'];
         $orderSettle->suppliers_goods_price = $totalGoodsPrice;
         $orderSettle->suppliers_shipping_fee = $totalShippingFee;
         $orderSettle->suppliers_refund = $totalRefund;
         $orderSettle->create_time = Time::gmTime();
         $orderSettle->memo = $memo;
         $orderSettle->save();
         // 更新 order_goods ,设置上 settle_id
         $sql = "update " . DataMapper::tableName('order_goods') . ' set settle_id = ? where ' . QueryBuilder::buildInCondition('rec_id', $orderGoodsIdArray);
         $dbEngine->exec($sql, $orderSettle->settle_id);
         $dbEngine->commit();
         $this->addFlashMessage('成功创建结算记录');
     } catch (\Exception $e) {
         $dbEngine->rollback();
         $this->addFlashMessage('数据库读写错误');
     }
     out:
     // 回到结算页面
     RouteHelper::reRoute($this, RouteHelper::getRefer(), false);
 }