<?php /** * 创建订单 * User: tangxingguo * Date: 2018/3/5 * Time: 2018年3月5日10:27:31 */ namespace Apicp\Controller\Order; use Com\PackageValidate; use Common\Common\Cache; use Common\Common\Order; use VcySDK\Member; use VcySDK\Service; use VcySDK\Enterprise; class CreateController extends AbstractController { /** * 商品类型:续费 */ const PRODUCT_TYPE_RENEW = 1; /** * 商品类型:空间容量 */ const PRODUCT_TYPE_DISK = 2; /** * 商品类型:流量 */ const PRODUCT_TYPE_NETWORK = 3; /** * 商品类型:扩充人员 */ const PRODUCT_TYPE_USER = 4; /** * Create * @author tangxingguo * @desc 创建订单接口 * @param Int product_type:true 商品类型(1=续费;2=空间容量;3=流量;4=扩充人数);当空间容量与流量同时购买的情况,product_type传2 或 3 均可 * @param Int user_num 人数 * @param Int years 年数 * @param Int disk 空间 * @param Int network 流量 * @param Int remaind_day 剩余天数(扩充人数情况下必须) * @param Int price:true 价格 * @return array|bool 商品信息 array( 'order_id' => 123, // 订单ID 'order_desc' => '扩充人数', // 订单内容 'total_price' => 24518, // 订单总金额(单位:分) 'order_sn' => '20180117170840644', // 订单编号 'order_type' => 4, // 订单类型(1=购买「业绩比拼」应用,2=扩充「业绩比拼」应用使用人数,3=购买「员圈直播」并发人数,4=购买「员圈」应用,5=扩充「员圈」应用使用人数,6=购买空间/流量扩展包) 'created' => 1517486261770, // 创建时间 'buy_content' => array( // 购买内容 'user_num' => 100, // 购买人数(续费、扩充人数时值有效;续费时返回总人数,扩充人数时返回扩充的人数) 'years' => 1, // 购买年数(续费时值有效) 'disk' => 1, // 购买的空间容量(购买空间时值有效) 'network' => 1, // 购买的流量(购买流量时值有效) ), ) */ public function Index_post() { // 请求数据 $postData = I('post.'); // 验证规则 $rules = [ 'product_type' => 'require|integer', 'price' => 'require|integer', 'user_num' => 'integer', 'years' => 'integer|in:1,2,3', 'disk' => 'integer', 'network' => 'integer', 'remaind_day' => 'integer', ]; // 验证请求数据 $validate = new PackageValidate(); $validate->postData = $postData; $validate->validateParams($rules); // 格式化请求参数 $params= $this->_formatPostData($postData); // 提交订单 $orderServ = &Order::instance(); $orderDetail = $orderServ->addOrder($params); // 购买内容 $buyContent = json_decode($orderDetail['ordContent'], true); // 返回参数 $this->_result = [ 'order_id' => $orderDetail['ordId'], 'order_desc' => $orderDetail['ordTitle'], 'total_price' => $orderDetail['ordTotalPrice'], 'order_sn' => $orderDetail['ordCode'], 'order_type' => $orderDetail['ordType'], 'created' => $orderDetail['ordCreated'], 'buy_content' => [ 'user_num' => isset($buyContent['personAmount']) ? $buyContent['personAmount'] : 0, 'years' => isset($buyContent['year']) ? $buyContent['year'] : 0, 'disk' => isset($buyContent['disk']) ? $buyContent['disk'] : 0, 'network' => isset($buyContent['network']) ? $buyContent['network'] : 0, ], ]; } /** * 格式化请求参数 * @author tangxingguo * @param array $postData 请求参数 * @return array */ private function _formatPostData($postData) { // 参数初始化 $params = [ 'ordTotalPrice' => $postData['price'], 'eaId' => $this->_login->user['eaId'], ]; if (!empty($this->_login->user['eaMobile'])) { $params['eaMobile'] = $this->_login->user['eaMobile']; } if (!empty($this->_login->user['eaRealname'])) { $params['eaRealname'] = $this->_login->user['eaRealname']; } // 企业信息 $sdk = new Enterprise(Service::instance()); $epDetail = $sdk->detail(); // 实时人数信息 $memberSdk = new Member(Service::instance()); $memberStatus = $memberSdk->memberStatusCount([]); // 企业内的人数,evUsedUserTotal是昨天的使用人数,更新为实时人数 $epDetail['evUsedUserTotal'] = $memberStatus['amount']; // 参数校验 switch ($postData['product_type']) { // 开通、续费员圈应用 case self::PRODUCT_TYPE_RENEW: if (!isset($postData['user_num'], $postData['years'])) { E('_ERR_ORDER_PARAMS_MISS'); } // 人数检查,购买的人数 需 大于当前使用的人数 $userTotal = $postData['user_num']; if ($userTotal < $epDetail['evUsedUserTotal']) { E('_ERR_ORDER_USER_NUM_FAIL'); } $params['prCostKey'] = 'yq_app_rule'; $params['year'] = $postData['years']; $params['num'] = $postData['user_num']; break; // 扩充人数 case self::PRODUCT_TYPE_USER: if (!isset($postData['user_num']) || !isset($postData['remaind_day'])) { E('_ERR_ORDER_PARAMS_MISS'); } // 人数检查,总付费人数 需 大于当前使用的人数 if ($epDetail['evUsedUserTotal'] > $epDetail['evAvailableUserTotal'] + $postData['user_num']) { E('_ERR_ORDER_USER_NUM_FAIL'); } $params['prCostKey'] = 'yq_persons_rule'; $params['num'] = $postData['user_num']; $params['remaindDay'] = $postData['remaind_day']; break; // 空间容量 case self::PRODUCT_TYPE_DISK: // 流量 case self::PRODUCT_TYPE_NETWORK: if (!isset($postData['network']) && !isset($postData['disk'])) { E('_ERR_ORDER_PARAMS_MISS'); } // 值校验,以100G位单位出售 if (isset($postData['network'])) { if ($postData['network'] % 100 > 0) { E('_ERR_ORDER_NETWORK_FAIL'); } $params['network'] = $postData['network']; } if (isset($postData['disk'])) { $params['disk'] = $postData['disk']; } $params['prCostKey'] = 'space_flow_rule'; break; } return $params; } }