ConvertService.class.php 8.46 KB
<?php
/**
 * PrizeService.class.php
 * 奖品申请表
 * @author: zhoutao
 * @version: $Id$
 * @copyright: vchangyi.com
 */
namespace Common\Service;

use Common\Common\Msg;
use Common\Model\ConvertModel;
use Common\Model\ConvertProcessModel;
use Common\Model\PrizeModel;
use VcySDK\Integral;
use VcySDK\Service;

class ConvertService extends AbstractService
{

    // 库存+1
    const STOCK_PLUS_ONE = 1;

    // 构造方法
    public function __construct()
    {

        parent::__construct();
        $this->_d = new ConvertModel();
    }

    /**
     * 微信端查询符合条件的奖品兑换记录总数
     * @param $conds
     * @return array|bool
     */
    public function countWxPrizeConvert($conds)
    {
        return $this->_d->countWxPrizeConvert($conds);
    }

    /**
     * 微信端查询奖品兑换分页列表
     * @param $conds
     * @param null $pageOption
     * @param array $orderOption
     * @return mixed
     */
    public function getWxPrizeConvertPageList($conds, $pageOption = null, $orderOption = array())
    {

        return $this->_d->getWxPrizeConvertPageList($conds, $pageOption, $orderOption);
    }

    /**
     * 管理平台查询符合条件的奖品兑换记录总数
     * @param $conds
     * @return array|bool
     */
    public function countPrizeConvert($conds)
    {
        return $this->_d->countPrizeConvert($conds);
    }

    /**
     * 管理平台查询奖品兑换分页列表
     * @param $conds
     * @param null $pageOption
     * @param array $orderOption
     * @return mixed
     */
    public function getPrizeConvertPageList($conds, $pageOption = null, $orderOption = array())
    {
        return $this->_d->getPrizeConvertPageList($conds, $pageOption, $orderOption);
    }

    /**
     * 微信端查询奖品兑换详情
     * @param $conds
     * @return mixed
     */
    public function getWxPrizeConvertDetailByParams($conds) {
        return $this->_d->getWxPrizeConvertDetailByParams($conds);
    }


    /**
     * 取消奖品兑换
     * @param $reqData
     * @return bool
     */
    public function prizeConvertCanel($reqData) {

        $nowDateTime = MILLI_TIME;
        $nowFormatDateTime = rgmdate(NOW_TIME, 'Y-m-d H:i');

        $memUid = $reqData['memUid'];

        $params = array(
            'uid' => $memUid,
            'ic_id' => $reqData['ic_id']
        );

        $prizeConvertInfo = $this->_d->get_by_conds($params);

        if(empty($prizeConvertInfo)) {
            $this->_set_error("_ERR_CONVERT_NOT_EXIST_ERROR");
            return false;
        }

        // 取消兑换的记录已被管理员处理 获取 已取消
        if($prizeConvertInfo['convert_status'] != ConvertModel::CONVERT_STATUS_ING) {
            if (in_array($prizeConvertInfo['convert_status'], [ConvertModel::CONVERT_STATUS_AGREE, ConvertModel::CONVERT_STATUS_DEFUSE])) {
                $this->_set_error('_ERR_CANEL_RECORD_ALREADY_PROCESSED_ERROR');
            } elseif ($prizeConvertInfo['convert_status'] == ConvertModel::CONVERT_STATUS_CANCEL) {
                $this->_set_error('_ERR_CANEL_RECORD_ALREADY_CANELED');
            }
            return false;
        }

        $PrizeModel = new PrizeModel();
        $ConvertProcessModel = new ConvertProcessModel();

        $prizeInfo = $PrizeModel->getWithOutDeleted($prizeConvertInfo['ia_id']);

        $this->_d->start_trans();
        $PrizeModel->start_trans();
        $ConvertProcessModel->start_trans();

        try {

            // 库存退回
            $PrizeModel->changeReserve($prizeConvertInfo['ia_id'], self::STOCK_PLUS_ONE);

            // 发送取消兑换申请成功消息
            $this->__sendCanelSuccessMsg($memUid, $prizeInfo, $prizeConvertInfo, $nowFormatDateTime);

            // 更新兑换申请记录状态: 已取消
            $this->__modifyConvertStatus($prizeConvertInfo);

            // 插入申请进度记录表
            $this->__insertConvertProcess($reqData, $memUid, $nowDateTime, $prizeConvertInfo, $ConvertProcessModel);

            // 调用UC积分兑换退回接口
            $this->__integralReturn($reqData, $memUid, $prizeConvertInfo, $prizeInfo);

            $this->_d->commit();
            $PrizeModel->commit();
            $ConvertProcessModel->commit();

        } catch (\Exception $e) {
            \Think\Log::record("ic_id : " . $reqData['ic_id']);
            \Think\Log::record("取消兑换申请失败" . var_export($e, true));

            $this->_d->rollback();
            $PrizeModel->rollback();
            $ConvertProcessModel->rollback();

            $this->__sendCanelFailedMsg($memUid, $prizeInfo, $prizeConvertInfo, $nowFormatDateTime);

            $this->_set_error('_ERR_CANEL_FAILED_ERROR');

            return false;
        }

        return true;
    }

    /**
     * 发送取消兑换申请成功通知
     * @param $memUid
     * @param $prizeInfo
     * @param $prizeConvertInfo
     * @param $nowDateTime
     */
    private function __sendCanelSuccessMsg($memUid, $prizeInfo, $prizeConvertInfo, $nowDateTime)
    {
        $smgUtil = new Msg();
        $smgUtil->sendNews($memUid, [], [], [
            [
                'title' => '您已成功取消奖品兑换申请',
                'description' => "奖品名称:" . $prizeInfo['name']
                    . "\n兑换编号:" . $prizeConvertInfo['number']
                    . "\n取消时间:" . $nowDateTime,
                'url' => frontUrl('/app/page/integral/apply-detail', ['ic_id' => $prizeConvertInfo['ic_id']])
            ]
        ]);
    }

    /**
     * 取消失败通知
     * @param $memUid
     * @param $prizeInfo
     * @param $prizeConvertInfo
     * @param $nowDateTime
     * @internal param $nowDateTimeq
     */
    private function __sendCanelFailedMsg($memUid, $prizeInfo, $prizeConvertInfo, $nowDateTime)
    {
        $smgUtil = new Msg();

        $smgUtil->sendNews($memUid, [], [], [
            [
                'title' => '由于系统原因,您的奖品兑换申请取消失败,如需继续取消,请再次操作',
                'description' => "奖品名称:" . $prizeInfo['name']
                    . "\n兑换编号:" . $prizeConvertInfo['number']
                    . "\n取消时间:" . $nowDateTime,
                'url' => frontUrl('/app/page/integral/apply-detail', ['ic_id' => $prizeConvertInfo['ic_id']])
            ]
        ]);
    }

    /**
     * 积分退回
     * @param $reqData
     * @param $memUid
     * @param $prizeConvertInfo
     * @param $prizeInfo
     */
    private function __integralReturn($reqData, $memUid, $prizeConvertInfo, $prizeInfo)
    {

        $integralSdk = new Integral(Service::instance());
        $ucResult = $integralSdk->integralExchange([
            'memUid' => $memUid,
            'integral' => $prizeConvertInfo['integral'],
            'businessId' => $prizeConvertInfo['ic_id'],
            'milOptType' => Integral::MANUAL_EXCHAGE_BACK_INTEGRAL,
            'isAdmin' => Integral::IS_ADMIN_FALSE,
            'prizeName' => $prizeInfo['name'],
            'remark' => '【取消兑换】' . $prizeInfo['name'],
            'milCreateMemUid' => $memUid,
            'milCreateMemUsername' => $reqData['memUsername'],
            'msgIdentifier' => APP_IDENTIFIER,

            // 动作标识 积分中心 根据 UC 配置的
            'businessKey' => 'integral_center',
            'businessAct' => 'convert_back'
        ]);

        \Think\Log::record("积分退回 ucResult : " . var_export($ucResult, true), \Think\Log::DEBUG);
    }

    /**
     * 更新兑换申请记录状态
     * @param $prizeConvertInfo
     */
    private function __modifyConvertStatus($prizeConvertInfo)
    {
        $convertUpadteData = array(
            'convert_status' => ConvertModel::CONVERT_STATUS_CANCEL
        );
        $this->update($prizeConvertInfo['ic_id'], $convertUpadteData);
    }

    /**
     * 插入申请进度记录表
     * @param $reqData
     * @param $memUid
     * @param $nowDateTime
     * @param $prizeConvertInfo
     * @param $ConvertProcessModel
     */
    private function __insertConvertProcess($reqData, $memUid, $nowDateTime, $prizeConvertInfo, $ConvertProcessModel)
    {
        $processData = array(
            'uid' => $memUid,
            'ic_id' => $reqData['ic_id'],
            'operate' => ConvertProcessModel::CONVERT_STATUS_CANCEL,
            'operating_time' => $nowDateTime,
            'integral' => $prizeConvertInfo['integral'],
            'mark' => empty($reqData['mark']) ? '' : $reqData['mark'],
        );

        $ConvertProcessModel->insert($processData);
    }

}