| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351 | <?php/** * Created by PhpStorm. * User: hp * Date: 2017/11/22 * Time: 11:36 */namespace App\Http\Controllers\Channel\SendOrder;use App\Http\Controllers\Channel\BaseController;use App\Http\Controllers\Channel\SendOrder\Transformers\SendOrderTransformer;use App\Modules\Book\Services\BookConfigService;use App\Modules\Book\Services\ChapterService;use App\Modules\Channel\Services\ChannelService;use App\Modules\OfficialAccount\Services\ForceSubscribeService;use App\Modules\Promotion\Services\PromotionService;use App\Modules\SendOrder\Services\SendOrderService;use App\Modules\Statistic\Services\WapVisitStatService;use App\Modules\Trade\Services\OrderService;use App\Modules\User\Services\UserService;use DB;use  Hashids;use Illuminate\Http\Request;class SendOrderController extends BaseController{    /**     * @apiDefine sendOrder 派单     */    /**     * @apiVersion 1.0.0     * @api {GET} sendOrder/getSendOrders 获取派单列表     * @apiGroup sendOrder     * @apiName getSendOrders     * @apiParam{Number}  [sendOrder_id]  派单id(可不传)     * @apiParam{Number}  [book_id]  书本id(可不传)     * @apiParam{String}  [name]  派单名称(可不传)     * @apiParam{String}  [book_name] 书名(可不传)     * @apiParam{String}  [start_time] 开始时间(可不传)     * @apiParam{String}  [end_time] 结束时间(可不传)     * @apiParam{String}  [pre_send_date_start] 预计发布时间开始(可不传)     * @apiParam{String}  [pre_send_date_end] 预计发布时间结束(可不传)     * @apiParam{String}  [promotion_point] 派单源 微信(默认)or浏览器(微信:1,浏览器:2)     * @apiSuccess {Number}  id 派单id.     * @apiSuccess {String}  distribution_channel_id 渠道id     * @apiSuccess {String}  entrance 入口     * @apiSuccess {String}  name 渠道名称     * @apiSuccess {Number}  book_id 书本id     * @apiSuccess {String}  channel_type 渠道类型     * @apiSuccess {Number}  document_cover_id  文案封面id     * @apiSuccess {Number}  headline_id  标题id     * @apiSuccess {Number}  body_template_id ID. 内容模板id     * @apiSuccess {Number}  original_guide_id  原文引导id     * @apiSuccess {Number}  qr_code_id  二维码     * @apiSuccess {Number}  subscribe_chapter_id 关注章节ID     * @apiSuccess {Number}  document_end_chapter_seq 结束章节序号     * @apiSuccess {String}  book_name 图书名称     * @apiSuccess {String}  chapter_name 章节名称     * @apiSuccess {String}  updated_at 更新时间     * @apiSuccess {String}  created_at 创建时间     * @apiSuccess {String}  pre_send_date 预计发布时间     * @apiSuccess {String}  sex_preference 性别偏好     * @apiSuccess {String}  subscribe_chapter_name 关注章节名称     * @apiSuccess {String}  subscribe_chapter_seq 关注章节序号     * @apiSuccess {Number}  remark 备注     * @apiSuccess {Number}  star_num 星星数     * @apiSuccess {Number}  cost 成本     * @apiSuccess {Number}  totalChargeAmount 充值总额数     * @apiSuccess {Number}  registerNum 注册数     * @apiSuccess {Number}  payUserNum 付费用户数     * @apiSuccess {Number}  clickNum 点击数数     * @apiSuccess {Number}  browserClickNum 浏览器端pv     * @apiSuccess {Number}  browserClickNumUV 浏览器端uv     * @apiSuccess {Number}  fansNum 粉丝数     * @apiSuccess {Number}  promotion_page_id  推广页面id     * @apiSuccess {String}  redirect_url 重定向url     * @apiSuccess {String}  qrcode 二维码     * @apiSuccess {String}  domain 域名     * @apiSuccess {String}  consumeTotalFee 派单下的消费的币的总和     * @apiSuccess {String}  consumeChargeFee 派单下的消费的充值币     * @apiSuccess {String}  consumeRewardFee 派单下的消费的奖励币     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *     *         "data": [     *           {     *               "id": 5,     *               "distribution_channel_id": null,     *               "entrance": "书架",     *               "name": "acai",     *              "book_id": null,     *              "channel_type": "AUTHENTICATED",     *               "chapter_id": null,     *              "document_cover_id": null,     *               "headline_id": null,     *               "body_template_id": null,     *               "original_guide_id": null,     *               "subscribe_chapter_id": null,     *               "book_name": null,     *               "document_end_chapter_seq"=12.     *               "sex_preference": "男频",     *               "chapter_name": null,     *               "updated_at": "2017-11-22 14:40:46",     *               "created_at": "2017-11-22 14:40:46",     *               "pre_send_date": "2018/11/12"     *               "subscribe_chapter_name": null,     *               "subscribe_chapter_seq": null,     *               "remark": "0",     *              "star_num": 0,     *              "fansNum": 0,     *              "cost":1111     *              "totalChargeAmount": 0,     *              "registerNum": 0,     *              "payUserNum": 0,     *              "clickNum": 0,     *              "promotion_page_id": 1111,     *              "redirect_url": ""     *              "qrcode": ""     *              "domain":"leque"     *             "toatlOrderCount":12,     *             "vipOrderCount":12,     *             "normalOrderCount":12,     *            },     *           {     *              "id": 11,     *             "distribution_channel_id": 123,     *             "entrance": null,     *             "name": "acai",     *             "book_id": 111,     *             "cost":1111     *             "channel_type": "AUTHENTICATED",     *             "chapter_id": 1111,     *             "document_cover_id": 899,     *             "headline_id": 12334,     *             "body_template_id": 3455,     *             "document_end_chapter_seq"=12.     *             "original_guide_id": 344,     *             "subscribe_chapter_id": 11111,     *             "book_name": "dpcq",     *             "sex_preference": "男频",     *             "chapter_name": "ssss",     *              "domain":"leque"     *             "updated_at": "2017-11-22 14:40:46",     *             "created_at": "2017-11-22 14:40:46",     *             "subscribe_chapter_name": null,     *             "subscribe_chapter_seq": null,     *             "remark": "0",     *             "star_num": 0,     *             "fansNum": 0,     *             "totalChargeAmount": 0,     *             "addUserNum": 0,     *             "payUserNum": 0,     *             "clickNum": 0,     *             "toatlOrderCount":12,     *             "vipOrderCount":12,     *             "normalOrderCount":12,     *             "promotion_page_id": null,     *             "redirect_url": ""     *             "qrcode": ""     *            }     *        ],     *          "meta": {     *                 "total": 1,     *                 "per_page": 15,     *                 "current_page": 1,     *                 "last_page": 1,     *                 "next_page_url": "",     *                 "prev_page_url": ""     *             }     *     }     */    function getSendOrders(Request $request)    {        $distribution_channel_id = $this->getChannelId();        $name = $request->has('name') ? $request->input('name') : '';        $book_id = $request->has('book_id') ? $request->input('book_id') : '';        $book_name = $request->has('book_name') ? $request->input('book_name') : '';        $id = $sendOrderId = $request->has('sendOrder_id') ? $request->input('sendOrder_id') : '';        $promotion_type = $request->has('promotion_type') ? $request->input('promotion_type') : '';        $import_company_name = $request->has('company_name') ? $request->input('company_name') : '';        $pre_send_date_end = $request->has('pre_send_date_end') ? $request->input('pre_send_date_end') : '';        $pre_send_date_start = $request->has('pre_send_date_start') ? $request->input('pre_send_date_start') : '';        $start_time = $request->has('start_time') && !empty($request->input('start_time')) ? $request->input('start_time') : '';        $end_time = $request->has('end_time') && !empty($request->input('end_time')) ? date('Y-m-d H:i:s', strtotime($request->input('end_time')) + 86400 - 1) : '';        $promotion_point = $request->has('promotion_point') ? $request->input('promotion_point') : 1;        //$data = SendOrderService::getSendOrders($bookId, $distribution_channel_id, $name, $bookName, $sendOrderId, $start_time, $end_time, false);        $data = SendOrderService::search(compact(            'book_id',            'distribution_channel_id',            'name',            'pre_send_date_end',            'import_company_name',            'pre_send_date_start',            'promotion_type',            'pre_send_date',            'book_name',            'start_time',            'end_time',            'id',            'promotion_point'        ));        $send_order_export_special_channel = env('SEND_ORDER_EXPORT_SPECIAL_CHANNEL');        $isExistSpecialChannel = in_array($distribution_channel_id, explode(',', $send_order_export_special_channel));        foreach ($data as $item) {            $itemName = $item->name;            if ($isExistSpecialChannel) {                if (strpos($itemName, "-")) {                    $strs = explode('-', $itemName);                    if (count($strs) == 4) {                        $date = $this->getFormatDate($strs[2], $item->created_at);                        $strs[2] = date('Y/m/d', strtotime($date));                        $itemName = implode('-', $strs);                        if (!$item->pre_send_date) {                            $item->pre_send_date = $date;                        }                    } elseif (count($strs) == 6) {                        $date = $this->getFullDate($strs[2], $strs[3], $strs[4], $item->created_at);                        if (!$item->pre_send_date) {                            $item->pre_send_date = $date;                        }                        $itemName = $strs[0] . '-' . $strs[1] . '-' . $date . '-' . $strs[5];                    }                }            }            $sendOrderId = $item->id;            $item->name = $itemName;            $browser_visit_info = SendOrderService::getBrowserUvAndPv($sendOrderId);            $item->browserClickNum = $browser_visit_info['pv'];            $item->browserClickNumUV = $browser_visit_info['uv'];            $item->clickNum = SendOrderService::getPv($sendOrderId);            $item->clickNumUV = SendOrderService::getUv($sendOrderId);//uv            $item->payUserNum = OrderService::getPayUserNum($sendOrderId);            $item->registerNum = UserService::getPromotionTotal($sendOrderId);            $item->fansNum = ForceSubscribeService::getNewFansNum($sendOrderId);            $item->continue_read_uv = SendOrderService::getContinueTotalReadUv($item->id);            if ($promotion_point == 2) {                $item->promotion_url = 'https://bsite' . encodeDistributionChannelId($distribution_channel_id) . '.leyuee.com/yun/' . $item->id;            } else {                $item->promotion_url = 'https://site' . encodeDistributionChannelId($distribution_channel_id) . '.' . $this->getDomainByBid($item->book_id) . '/yun/' . $item->id;            }            $item->totalChargeAmount = (float)OrderService::getAmount(['send_order_id' => $sendOrderId]);//            $item->totalChargeAmount = OrderService::getPromotionRegUserRechargeAmount(['send_order_id' => $item->id]);            $item->qrcode = "";//"data:image/png;base64," . base64_encode(QrCode::format('png')->size(200)->generate($promotion_url));//            $bookOrderInfo = BookOrderService::getSendorderTotal($sendOrderId, $start_time, $end_time);//            $chapterOrderInfo = ChapterOrderService::getSendorderTotal($sendOrderId, $start_time, $end_time);            $item->consumeChargeFee = 0;//$bookOrderInfo['charge_balance'] + $chapterOrderInfo['charge_balance'];            $item->consumeRewardFee = 0;//$bookOrderInfo['reward_balance'] + $chapterOrderInfo['reward_balance'];;            $item->consumeTotalFee = 0;//$item->consumeChargeFee + $item->consumeRewardFee;        }        return response()->pagination(new SendOrderTransformer, $data);    }    function getFullDate($year, $month, $day, $created_at = '')    {        if (strlen($year) != 4) {            if ($created_at) {                $year = date('Y', strtotime($created_at));            } else {                $year = date('Y');            }        }        if (strlen($month) == 1) {            $month = '0' . $month;        }        if (strlen($day) == 1) {            $day = '0' . $day;        }        $date = $year . $month . $day;        $date = date('Y/m/d', strtotime($date));        return $date;    }    function getFormatDate($date, $created_at = '')    {        $count = strlen($date);        if ($created_at) {            $year = date('Y', strtotime($created_at));        } else {            $year = date('Y');        }        if (2 == $count) {            $date = $year . '0' . $date[0] . '0' . $date[1];        } elseif (3 == $count) {            if (0 === strpos($date, '0')) {                $date = $year . substr($date, 0, 2) . '0' . $date[2];            } else {                $date = $year . '0' . $date;            }        } elseif (4 == $count) {            $date = $year . $date;        }        return $date;    }    /**     * 根据图书id获取域名     * @param $bid     */    function getDomainByBid($bid = '')    {        $domain = 'leyuee.com';        //如果图书id为空,则返回默认的域名        if (!empty($bid)) {            $bookConfig = BookConfigService::getBookById($bid);            if ($bookConfig) {                $domain = $bookConfig->promotion_domain;            }        }        return $domain;    }    /**     * @apiVersion 1.0.0     * @apiDescription 派单列表导出     * @api {GET} sendOrder/exportSendOrders 派单列表导出     * @apiGroup sendOrder     * @apiName exportSendOrders     * @apiParam{Number}  [sendOrder_id]  派单id(可不传)     * @apiParam{Number}  [book_id]  书本id(可不传)     * @apiParam{String}  [book_name] 书名(可不传)     * @apiParam{String}  [name]  派单名称(可不传)     * @apiParam{String}  [pre_send_date_start] 预计发布时间开始(可不传)     * @apiParam{String}  [pre_send_date_end] 预计发布时间结束(可不传)     * @apiParam{String}  [start_time] 开始时间(可不传)     * @apiParam{String}  [end_time] 结束时间(可不传)     * @apiParam{String}  [promotion_point] 派单源 微信(默认)or浏览器(微信:1,浏览器:2)     * @apiSuccess {Number}  id 派单id.     * @apiSuccess {String}  distribution_channel_id 渠道id     * @apiSuccess {String}  entrance 入口     * @apiSuccess {String}  name 渠道名称     * @apiSuccess {Number}  book_id 书本id     * @apiSuccess {String}  channel_type 渠道类型     * @apiSuccess {Number}  document_cover_id  文案封面id     * @apiSuccess {Number}  headline_id  标题id     * @apiSuccess {Number}  body_template_id ID. 内容模板id     * @apiSuccess {Number}  original_guide_id  原文引导id     * @apiSuccess {Number}  subscribe_chapter_id 关注章节ID     * @apiSuccess {String}  book_name 图书名称     * @apiSuccess {String}  chapter_name 章节名称     * @apiSuccess {Number}  cost 成本     * @apiSuccess {String}  updated_at 更新时间     * @apiSuccess {String}  created_at 创建时间     * @apiSuccess {String}  subscribe_chapter_name 关注章节名称     * @apiSuccess {String}  subscribe_chapter_seq 关注章节序号     * @apiSuccess {Number}  remark 备注     * @apiSuccess {Number}  star_num 星星数     * @apiSuccess {Number}  totalChargeAmount 充值总额数     * @apiSuccess {Number}  registerNum 注册数     * @apiSuccess {Number}  payUserNum 付费用户数     * @apiSuccess {Number}  clickNum 点击数数     * @apiSuccess {Number}  fansNum 粉丝数     * @apiSuccess {Number}  promotion_page_id  推广页面id     * @apiSuccess {String}  redirect_url 重定向url     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *     *         "data": [     *           {     *               "id": 5,     *               "distribution_channel_id": null,     *               "entrance": "书架",     *               "name": "acai",     *              "book_id": null,     *              "channel_type": "AUTHENTICATED",     *              "chapter_id": null,     *              "document_cover_id": null,     *               "headline_id": null,     *               "body_template_id": null,     *               "original_guide_id": null,     *                "subscribe_chapter_id": null,     *                "book_name": null,     *                "chapter_name": null,     *                "updated_at": "2017-11-22 14:40:46",     *                "created_at": "2017-11-22 14:40:46",     *                "subscribe_chapter_name": null,     *                "subscribe_chapter_seq": null,     *                "remark": "0",     *                "star_num": 0,     *                "fansNum": 0,     *               "cost":111,     *              "totalChargeAmount": 0,     *              "registerNum": 0,     *              "payUserNum": 0,     *              "clickNum": 0,     *                "promotion_page_id": 1111,     *               "redirect_url": ""     *            },     *           {     *              "id": 11,     *             "distribution_channel_id": 123,     *             "entrance": null,     *             "name": "acai",     *             "book_id": 111,     *             "channel_type": "AUTHENTICATED",     *             "chapter_id": 1111,     *             "document_cover_id": 899,     *             "headline_id": 12334,     *             "body_template_id": 3455,     *             "original_guide_id": 344,     *             "subscribe_chapter_id": 11111,     *             "book_name": "dpcq",     *             "cost":1111     *             "chapter_name": "ssss",     *             "updated_at": "2017-11-22 14:40:46",     *             "created_at": "2017-11-22 14:40:46",     *             "subscribe_chapter_name": null,     *             "subscribe_chapter_seq": null,     *             "remark": "0",     *             "star_num": 0,     *              "fansNum": 0,     *              "totalChargeAmount": 0,     *              "addUserNum": 0,     *              "payUserNum": 0,     *              "clickNum": 0,     *             "promotion_page_id": null,     *             "redirect_url": ""     *            }     *        ],     *          "meta": {     *                 "total": 1,     *                 "per_page": 15,     *                 "current_page": 1,     *                 "last_page": 1,     *                 "next_page_url": "",     *                 "prev_page_url": ""     *             }     *     }     */    function exportSendOrders(Request $request)    {        set_time_limit(0);        $distribution_channel_id = $this->getChannelId();        $name = $request->has('name') ? $request->input('name') : '';        $book_id = $request->has('book_id') ? $request->input('book_id') : '';        $book_name = $request->has('book_name') ? $request->input('book_name') : '';        $id = $request->has('sendOrder_id') ? $request->input('sendOrder_id') : '';        $promotion_type = $request->has('promotion_type') ? $request->input('promotion_type') : '';        $pre_send_date_end = $request->has('pre_send_date_end') ? $request->input('pre_send_date_end') : '';        $import_company_name = $request->has('company_name') ? $request->input('company_name') : '';        $pre_send_date_start = $request->has('pre_send_date_start') ? $request->input('pre_send_date_start') : '';        $start_time = $request->has('start_time') && !empty($request->input('start_time')) ? $request->input('start_time') : '';        $promotion_point = $request->has('promotion_point') ? $request->input('promotion_point') : 1;        $send_order_export_special_channel = env('SEND_ORDER_EXPORT_SPECIAL_CHANNEL');        $isExistSpecialChannel = in_array($distribution_channel_id, explode(',', $send_order_export_special_channel));        $end_time = $request->has('end_time') && !empty($request->input('end_time')) ? date('Y-m-d H:i:s', strtotime(trim($request->input('end_time'))) + 86400 - 1) : '';        //$data = SendOrderService::getSendOrders($bookId, $distribution_channel_id, $name, $bookName, $sendOrderId, $start_time, $end_time, true);        $data = SendOrderService::search(compact('book_id', 'distribution_channel_id', 'name', 'import_company_name', 'pre_send_date_end', 'pre_send_date_start', 'promotion_type', 'book_name', 'start_time', 'end_time', 'id', 'promotion_point'), true);        header("Content-type:application/vnd.ms-excel");        header("Content-Disposition:attachment;filename=" . "派单列表" . date("YmdHis") . ".csv");        $specialChannelIdStats = env('SPECIAL_CHANNEL_STATS', 211);        if ($isExistSpecialChannel) {            if (in_array($distribution_channel_id, explode(',', $specialChannelIdStats))) {                echo mb_convert_encoding("\"推广名称\",\"预计发送时间\",\"推广员\",\"书名\",\"点击数\",\"新增用户\",\"注册用户数\",\"新增关注\",\"新增关注率\",\"新关成本\",\"付费用户\",\"首充用户数\",\"成本\",\"累计充值\",\"累计充值成本率\",\"72小时累计充值总额\",\"72小时累计充值回本率\",\"7日充值总额\",\"公司名称\",\"总粉丝数\",\"累计UV大于20的时间\",\"推广位置\",\"小说来源\",\"推广链接\",\"章节名称\",\"充值总额\",\"充值成本率\",\"30日充值总额\",\"30日回本率\",\"24小时充值总额\",\"24小时回本率\",\"72小时充值总额\",\"72小时回本率\",\"30日累计充值总额\",\"30日累计充值回本率\",\"60日累计充值总额\",\"创建时间\",\"首日累计订阅人数\",\"首日累计订阅总额\",\"三日累计订阅人数\",\"三日累计订阅总额\",\"累计订阅人数\",\"累计订阅总额\"\r\n", 'GBK', 'UTF-8');            } else {                echo mb_convert_encoding("\"推广名称\",\"预计发送时间\",\"推广员\",\"书名\",\"点击数\",\"新增用户\",\"注册用户数\",\"新增关注\",\"新增关注率\",\"新关成本\",\"付费用户\",\"首充用户数\",\"成本\",\"累计充值\",\"累计充值成本率\",\"72小时累计充值总额\",\"72小时累计充值回本率\",\"7日充值总额\",\"公司名称\",\"总粉丝数\",\"累计UV大于20的时间\",\"推广位置\",\"小说来源\",\"推广链接\",\"章节名称\",\"充值总额\",\"充值成本率\",\"30日充值总额\",\"30日回本率\",\"24小时充值总额\",\"24小时回本率\",\"72小时充值总额\",\"72小时回本率\",\"30日累计充值总额\",\"30日累计充值回本率\",\"60日累计充值总额\",\"创建时间\"\r\n", 'GBK', 'UTF-8');            }        } else {            echo mb_convert_encoding("\"推广名称\",\"推广链接\",\"书名\",\"章节名称\",\"点击数\",\"新增用户\",\"注册用户数\",\"新增关注\",\"新增关注率\",\"付费用户\",\"首充用户数\",\"充值总额\",\"成本\",\"充值成本率\",\"24小时充值总额\",\"24小时回本率\",\"72小时充值总额\",\"72小时回本率\",\"30日累计充值总额\",\"60日累计充值总额\",\"创建时间\"\r\n", 'GBK', 'UTF-8');        }        if ($data) {            foreach ($data as $item) {                $item->clickNum = SendOrderService::getPv($item->id);                $item->clickNumUV = SendOrderService::getUv($item->id);//uv                $item->payUserNum = OrderService::getPayUserNum($item->id);                $item->fansNum = ForceSubscribeService::getNewFansNum($item->id);                $item->registerNum = UserService::getPromotionTotal($item->id);                $item->totalChargeAmount = (float)OrderService::getAmount(['send_order_id' => $item->id]);//                $item->totalChargeAmount = OrderService::getPromotionRegUserRechargeAmount(['send_order_id' => $item->id]);                $itemName = $item->name;                $promotionUrl = "https://site" . $distribution_channel_id . "." . ($this->getDomainByBid($item->book_id ? $item->book_id : '')) . "/yun/" . $item->id;                /*$stats_obj = SendOrderStat::where('send_order_id',$item->id)->first();                $item->one_day_recharge = $stats_obj->recharge_amount_in_one_day;                $item->three_days_recharge = $stats_obj->recharge_amount_in_three_days;*/                //计算123 渠道号的 24小时 、72小时、7天,30日充值成本和回本                $oneDayChargeAmount = 'NAV';                $threeDayChargeAmount = 'NAV';                $sevenDayChargeAmount = 'NAV';                $thirtyDayChargeAmount = 'NAV';                $promotionRegUserRecharge = 0;  //累计充值                $promotionRegUserRechargeAmountInOneMonth = 0; //30天累计充值                $promotionRegUserRechargeAmountInTwoMonth = 0; //60天累计充值                $promotionRegUserRechargeAmountInThreeDays = 0; //72小时累计充值                $firstChargeUserNum = SendOrderService::getFirstChargeUserNum($item->id);                $uv20Time = $item->send_time;//SendOrderService::getUv20Time($item->id);                if ($uv20Time) {                    $send_time_24h_later = strtotime($uv20Time) + 86400;                    $send_time_72h_later = strtotime($uv20Time) + 3 * 86400;                    $send_time_7d_later = strtotime($uv20Time) + 7 * 86400;                    $send_time_30d_later = strtotime($uv20Time) + 30 * 86400;                    $promotionRegUserRecharge = OrderService::getPromotionRegUserRechargeAmount(['send_order_id' => $item->id]);                    $promotionRegUserRechargeAmountInOneMonth = OrderService::getPromotionRegUserRechargeAmount(['send_order_id' => $item->id, 'end_time' => date("Y-m-d H:i:s", strtotime($uv20Time) + 30 * 86400)]);                    $promotionRegUserRechargeAmountInThreeDays = OrderService::getPromotionRegUserRechargeAmount(['send_order_id' => $item->id, 'end_time' => date("Y-m-d H:i:s", strtotime($uv20Time) + 3 * 86400)]);                    $promotionRegUserRechargeAmountInTwoMonth = OrderService::getPromotionRegUserRechargeAmount(['send_order_id' => $item->id, 'end_time' => date("Y-m-d H:i:s", strtotime($uv20Time) + 60 * 86400)]);                    //计算24小时内的充值                    if ($send_time_24h_later < time()) {                        $selctEndTime = date('Y-m-d H:i:s', $send_time_24h_later);                        $oneDayChargeAmount = OrderService::getAmount(['send_order_id' => $item->id, 'begin_time' => $uv20Time, 'end_time' => $selctEndTime]);                    }                    //计算72小时内的充值                    if ($send_time_72h_later < time()) {                        $selctEndTime = date('Y-m-d H:i:s', $send_time_72h_later);                        $threeDayChargeAmount = OrderService::getAmount(['send_order_id' => $item->id, 'begin_time' => $uv20Time, 'end_time' => $selctEndTime]);                    }                    //计算7日内的充值                    if ($send_time_7d_later < time()) {                        $selctEndTime = date('Y-m-d H:i:s', $send_time_7d_later);                        $sevenDayChargeAmount = OrderService::getAmount(['send_order_id' => $item->id, 'begin_time' => $uv20Time, 'end_time' => $selctEndTime]);                    }                    //计算30日内的充值                    if ($send_time_30d_later < time()) {                        $selctEndTime = date('Y-m-d H:i:s', $send_time_30d_later);                        $thirtyDayChargeAmount = OrderService::getAmount(['send_order_id' => $item->id, 'begin_time' => $uv20Time, 'end_time' => $selctEndTime]);                    }                }                if ($isExistSpecialChannel) {                    $promotionSource = '-';                    if (strpos($itemName, "-")) {                        $strs = explode('-', $itemName);                        if (count($strs) == 4) {                            $date = $this->getFormatDate($strs[2], $item->created_at);                            $date = date('Y/m/d', strtotime($date));                            $promotionSource = $strs[1];                            echo("\"" . mb_convert_encoding($strs[0], "GBK", "UTF-8") . "\",");                            echo("\"" . $date . "\",");                            echo("\"" . mb_convert_encoding($strs[3], "GBK", "UTF-8") . "\",");                        } elseif (count($strs) == 6) {                            $promotionSource = $strs[1];                            $date = $this->getFullDate($strs[2], $strs[3], $strs[4], $item->created_at);                            echo("\"" . mb_convert_encoding($strs[0], "GBK", "UTF-8") . "\",");                            echo("\"" . $date . "\",");                            echo("\"" . mb_convert_encoding($strs[5], "GBK", "UTF-8") . "\",");                        } else {                            echo("\"" . mb_convert_encoding($itemName, "GBK", "UTF-8") . "\",");                            echo("\"" . mb_convert_encoding('-', "GBK", "UTF-8") . "\",");                            echo("\"" . mb_convert_encoding('-', "GBK", "UTF-8") . "\",");                        }                    } else {                        echo("\"" . mb_convert_encoding($itemName, "GBK", "UTF-8") . "\",");                        echo("\"" . mb_convert_encoding('-', "GBK", "UTF-8") . "\",");                        echo("\"" . mb_convert_encoding('-', "GBK", "UTF-8") . "\",");                    }                    echo("\"" . mb_convert_encoding($item->book_name ? $item->book_name : '书名为空', "GBK", "UTF-8") . "\",");                    echo("\"" . $item->clickNum . "\",");                    echo("\"" . $item->clickNumUV . "\",");                    echo("\"" . $item->registerNum . "\",");                    echo("\"" . $item->fansNum . "\",");                    echo("\"" . ($this->getPersentAmount($item->fansNum, $item->registerNum)) . "\",");                    echo("\"" . ((int)$item->fansNum != 0 ? round($item->cost / $item->fansNum, 2) : 0) . "\",");                    echo("\"" . $item->payUserNum . "\",");                    echo("\"" . $firstChargeUserNum . "\",");                    echo("\"" . $item->cost . "\",");                    echo("\"" . $promotionRegUserRecharge . "\",");                    echo("\"" . ($this->getPersentAmount($promotionRegUserRecharge, $item->cost)) . "\",");                    echo("\"" . mb_convert_encoding($promotionRegUserRechargeAmountInThreeDays, "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($this->getPersentAmount($promotionRegUserRechargeAmountInThreeDays, $item->cost), "GBK", "UTF-8") . "\",");                    echo("\"" . $sevenDayChargeAmount . "\",");                    echo("\"" . mb_convert_encoding($item->import_company_name ? $item->import_company_name : '未填', "GBK", "UTF-8") . "\",");                    echo("\"" . $item->fansNum . "\",");                    echo("\"" . mb_convert_encoding($uv20Time ? $uv20Time : '未到20', "GBK", "UTF-8") . "\",");                    echo("\"" . $promotionSource . "\",");                    $cpSource = '未知';                    if ($item->book_id) {                        $bookConfig = BookConfigService::getBookById($item->book_id);                        if ($bookConfig) {                            $cpSource = $bookConfig->cp_source;                        }                    }                    echo("\"" . mb_convert_encoding($cpSource, "GBK", "UTF-8") . "\",");                    echo("\"" . $promotionUrl . "\",");                    echo("\"" . mb_convert_encoding($item->chapter_name ? $item->chapter_name : '章节名称为空', "GBK", "UTF-8") . "\",");                    echo("\"" . $item->totalChargeAmount . "\",");                    echo("\"" . ($this->getPersentAmount($item->totalChargeAmount, $item->cost)) . "\",");                    echo("\"" . mb_convert_encoding($thirtyDayChargeAmount, "GBK", "UTF-8") . "\",");                    echo("\"" . ($this->getPersentAmount($thirtyDayChargeAmount, $item->cost)) . "\",");                    echo("\"" . mb_convert_encoding($oneDayChargeAmount, "GBK", "UTF-8") . "\",");                    echo("\"" . ($this->getPersentAmount($oneDayChargeAmount, $item->cost)) . "\",");                    echo("\"" . mb_convert_encoding($threeDayChargeAmount, "GBK", "UTF-8") . "\",");                    echo("\"" . ($this->getPersentAmount($threeDayChargeAmount, $item->cost)) . "\",");                    echo("\"" . $promotionRegUserRechargeAmountInOneMonth . "\",");                    //30日累计充值回本率                    echo("\"" . mb_convert_encoding($this->getPersentAmount($promotionRegUserRechargeAmountInOneMonth, $item->cost), "GBK", "UTF-8") . "\",");                    echo("\"" . $promotionRegUserRechargeAmountInTwoMonth . "\",");                    //echo("\"" . $item->created_at->toDateTimeString() . "\"\r\n");                    if (in_array($distribution_channel_id, explode(',', $specialChannelIdStats))) {                        echo("\"" . $item->created_at->toDateTimeString() . "\",");                        if ($item->send_time) {                            $special_stats_date = date('Y-m-d', strtotime($item->send_time));                        } else {                            $special_stats_date = '';                        }                        $special_stats = WapVisitStatService::getSpecialChannelIdStats($item->id, $special_stats_date);                        echo("\"" . $special_stats['first_day_subscribe_num'] . "\",");                        echo("\"" . $special_stats['first_day_subscribe_amount'] . "\",");                        echo("\"" . $special_stats['three_day_subscribe_num'] . "\",");                        echo("\"" . $special_stats['three_day_subscribe_amount'] . "\",");                        echo("\"" . $special_stats['total_subscribe_num'] . "\",");                        echo("\"" . $special_stats['total_subscribe_amount'] . "\"\r\n");                    } else {                        echo("\"" . $item->created_at->toDateTimeString() . "\"\r\n");                    }                } else {                    echo("\"" . mb_convert_encoding($itemName, "GBK", "UTF-8") . "\",");                    echo("\"" . $promotionUrl . "\",");                    echo("\"" . mb_convert_encoding($item->book_name ? $item->book_name : '书名为空', "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($item->chapter_name ? $item->chapter_name : '章节名称为空', "GBK", "UTF-8") . "\",");                    echo("\"" . $item->clickNum . "\",");                    echo("\"" . $item->clickNumUV . "\",");                    echo("\"" . $item->registerNum . "\",");                    echo("\"" . $item->fansNum . "\",");                    echo("\"" . ($this->getPersentAmount($item->fansNum, $item->registerNum)) . "\",");                    echo("\"" . $item->payUserNum . "\",");                    echo("\"" . $firstChargeUserNum . "\",");                    echo("\"" . $item->totalChargeAmount . "\",");                    echo("\"" . $item->cost . "\",");                    echo("\"" . ($this->getPersentAmount($item->totalChargeAmount, $item->cost)) . "\",");                    echo("\"" . mb_convert_encoding($oneDayChargeAmount, "GBK", "UTF-8") . "\",");                    echo("\"" . ($this->getPersentAmount($oneDayChargeAmount, $item->cost)) . "\",");                    echo("\"" . mb_convert_encoding($threeDayChargeAmount, "GBK", "UTF-8") . "\",");                    echo("\"" . ($this->getPersentAmount($threeDayChargeAmount, $item->cost)) . "\",");                    echo("\"" . $promotionRegUserRechargeAmountInOneMonth . "\",");                    echo("\"" . $promotionRegUserRechargeAmountInTwoMonth . "\",");                    echo("\"" . $item->created_at->toDateTimeString() . "\"\r\n");                }            }        }        exit();    }    /**     * 计算成本率     * @param $amount 充值金额     * @param $cost 成本     * @return int|string     */    function getPersentAmount($amount, $cost)    {        if (is_numeric($amount)) {            if (abs($cost) < 0.01) {                $persentResult = '100%';            } else {                $persentResult = round(($amount / $cost) * 100, 2) . '%';            }        } else {            $persentResult = '0%';        }        return $persentResult;    }    /**     * @apiVersion 1.0.0     * @apiDescription 更新派单星级数和备注     * @api {POST} sendOrder/updateStarNumAndRemark 更新派单星级数和备注     * @apiGroup sendOrder     * @apiName updateStarNumAndRemark     * @apiParam{Number} id 派单id.     * @apiParam{Number} distribution_channel_id 渠道id.     * @apiParam{Number} star_num 派单星级数     * @apiParam{String} remark 派单备注     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *         "data":[]     *     }     */    function updateStarNumAndRemark(Request $request)    {        $distribution_channel_id = $this->getChannelId();        $id = $request->has('id') ? $request->input('id') : '';        $remark = $request->has('remark') ? $request->input('remark') : '';        $starNum = $request->has('star_num') ? $request->input('star_num') : '';        if (empty($id) || empty($distribution_channel_id) || empty($starNum)) {            return response()->error("PARAM_EMPTY");        }        if (!is_numeric($starNum)) {            return response()->error("PARAM_ERROR");        }        $data = SendOrderService::updateStarNumAndRemark($id, $distribution_channel_id, $starNum, $remark);        if ($data) {            return response()->success();        }        return response()->error("HANDLE_FAILED");    }    /**     * @apiVersion 1.0.0     * @apiDescription 生成一个章节内容的派单     * @api {POST} sendOrder/createFromChapter 生成一个章节内容的派单     * @apiGroup sendOrder     * @apiName createFromChapter     * @apiParam   {String}  name 派单渠道名称.     * @apiParam{Number} cost 成本.     * @apiParam   {String}  distribution_channel_id 渠道id     * @apiParam   {String}  channel_type 派单渠道类型.(允许值: AUTHENTICATED, UNAUTHENTICATED)     * @apiParam   {String}  book_id  书本id     * @apiParam   {String} promotion_type 推广类型[INTERVAL、EXTERVAL]. 内部、外部     * @apiParam   {String}  book_name  书本名称     * @apiParam   {String}  chapter_id  章节id     * @apiParam   {String}  qr_code_id 二维码id.     * @apiParam   {String}  chapter_name  章节名称     * @apiParam   {String}  headline_id  推广标题id     * @apiParam   {String}  body_template_id 内容模板id     * @apiParam   {String}  document_cover_id  文案封面id     * @apiParam   {String}  original_guide_id  原文引导ID.     * @apiParam   {String}  subscribe_chapter_id  强制订阅章节id     * @apiParam   {String}  subscribe_chapter_name  强制订阅章节名称     * @apiParam   {String}  subscribe_chapter_seq 强制订阅章节序号     * @apiParam   {String}  document_end_chapter_seq 最后章节序号     * @apiParam   {String}  sex_preference 性别偏向     * @apiParam{String}  [promotion_point] 派单源 微信(默认)or浏览器(微信:1,浏览器:2)     * @apiSuccess {Number}  id 派单id     * @apiSuccess {String}  promotion_url  推广链接     * @apiSuccess {String}  name 派单名称     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *         "data":{"id":5,"promotion_url":"http:\/\/www . xs . com\/promotion\/index\/123456","name":"派单名称"}     *     }     */    function createFromChapter(Request $request)    {        $distribution_channel_id = $this->getChannelId();        $name = $request->has('name') ? $request->input('name') : '';        $promotion_type = $request->has('promotion_type') ? $request->input('promotion_type') : '';        $cost = $request->has('cost') ? $request->input('cost') : 0;        $book_id = $request->has('book_id') ? $request->input('book_id') : '';        $book_name = $request->has('book_name') ? $request->input('book_name') : '';        $chapter_id = $request->has('chapter_id') ? $request->input('chapter_id') : '';        $qr_code_id = $request->has('qr_code_id') ? $request->input('qr_code_id') : '';        $headline_id = $request->has('headline_id') ? $request->input('headline_id') : '';        $chapter_name = $request->has('chapter_name') ? $request->input('chapter_name') : '';        $channel_type = $request->has('channel_type') ? $request->input('channel_type') : '';        $sex_preference = $request->has('sex_preference') ? $request->input('sex_preference') : '';        $body_template_id = $request->has('body_template_id') ? $request->input('body_template_id') : '';        $document_cover_id = $request->has('document_cover_id') ? $request->input('document_cover_id') : '';        $original_guide_id = $request->has('original_guide_id') ? $request->input('original_guide_id') : '';        $subscribe_chapter_id = $request->has('subscribe_chapter_id') ? $request->input('subscribe_chapter_id') : '';        $subscribe_chapter_seq = $request->has('subscribe_chapter_seq') ? $request->input('subscribe_chapter_seq') : '';        $subscribe_chapter_name = $request->has('subscribe_chapter_name') ? $request->input('subscribe_chapter_name') : '';        $document_end_chapter_seq = $request->has('document_end_chapter_seq') ? $request->input('document_end_chapter_seq') : '';        if (!$name || !$channel_type || !$promotion_type || !$book_id || !$book_name || !$sex_preference || !$document_end_chapter_seq || !$chapter_id || !$chapter_name || !$original_guide_id || !$headline_id || !$body_template_id || !$document_cover_id || !$document_cover_id || !$subscribe_chapter_id || !$subscribe_chapter_name || !$subscribe_chapter_seq) return response()->error('PARAM_EMPTY');        if (empty($qr_code_id)) {            $qr_code_id = 0;        }        $promotion_point = $request->has('promotion_point') ? $request->input('promotion_point') : 1;        if (!in_array($promotion_point, [1, 2])) {            $promotion_point = 1;        }        $redirect_url = "/reader?bid={$book_id}&cid={$chapter_id}";        $book_id = Hashids::decode($book_id)[0];        if ($book_id == 2423 && time() >= strtotime('2018-10-10 00:00:00') && time() <= strtotime('2018-10-15 00:00:00')) {            return response()->error('CONTENT_MAINTAIN');        }        if ($promotion_point == 2) {            $domain = 'leyuee.com';        } else {            $domain = $this->getDomainByBid($book_id);        }        $charge_type = $this->getBookChargeTypeByBid($book_id);        $sendOrder = SendOrderService::createFromChapter(compact('name', 'channel_type', 'promotion_type', 'charge_type', 'cost', 'qr_code_id', 'domain', 'sex_preference', 'book_id', 'book_name', 'chapter_id', 'chapter_name', 'document_end_chapter_seq', 'original_guide_id', 'headline_id', 'body_template_id', 'document_cover_id', 'subscribe_chapter_id', 'subscribe_chapter_name', 'subscribe_chapter_seq', 'distribution_channel_id', 'redirect_url', 'promotion_point'));        if ($promotion_point == 2) {            $promotion_url = 'https://bsite' . encodeDistributionChannelId($distribution_channel_id) . '.leyuee.com/yun/' . $sendOrder->id;        } else {            $promotion_url = 'https://site' . encodeDistributionChannelId($distribution_channel_id) . '.' . $this->getDomainByBid($book_id) . '/yun/' . $sendOrder->id;        }        return response()->success(['id' => $sendOrder->id, 'promotion_url' => $promotion_url, 'name' => $name]);    }    /**     * 通过推广模板图片生成     * @param Request $request     * @return mixed     */    function createFromPromotionImageTemplate(Request $request)    {        $distribution_channel_id = $this->getChannelId();        $book_id = $request->has('book_id') ? $request->input('book_id') : '';        $cost = $request->has('cost') ? $request->input('cost') : '';        $name = $request->has('name') ? $request->input('name') : '';        $book_name = $request->has('book_name') ? $request->input('book_name') : '';        $promotion_point = $request->has('promotion_point') ? $request->input('promotion_point') : '';        $promotion_type = $request->has('promotion_type') ? $request->input('promotion_type') : '';        $channel_type = $request->has('channel_type') ? $request->input('channel_type') : '';        $chapter_name = $request->has('chapter_name') ? $request->input('chapter_name') : '';        $chapter_id = $request->has('chapter_id') ? $request->input('chapter_id') : '';        $headline_id = $request->has('headline_id') ? $request->input('headline_id') : ''; //标题        $image_id = $request->has('template_image_id') ? $request->input('template_image_id') : ''; //模板图片id        $original_guide_id = $request->has('original_guide_id') ? $request->input('original_guide_id') : ''; //原文引导        $subscribe_chapter_seq = $request->has('subscribe_chapter_seq') ? $request->input('subscribe_chapter_seq') : '';        $subscribe_chapter_name = $request->has('subscribe_chapter_name') ? $request->input('subscribe_chapter_name') : '';        $subscribe_chapter_id = $request->has('subscribe_chapter_id') ? $request->input('subscribe_chapter_id') : '';        // 文案标题,推广图模板,原文引导,推广图模式        $redirect_url = "/reader?bid={$book_id}&cid={$chapter_id}";        $book_id = Hashids::decode($book_id)[0];        $domain = $this->getDomainByBid($book_id);        $charge_type = $this->getBookChargeTypeByBid($book_id);        if ($book_id == 2423 && time() >= strtotime('2018-10-10 00:00:00') && time() <= strtotime('2018-10-15 00:00:00')) {            return response()->error('CONTENT_MAINTAIN');        }        if (!$headline_id || !$original_guide_id || !$image_id || !$chapter_name || !$book_id || !$subscribe_chapter_id || !$subscribe_chapter_name || !$subscribe_chapter_seq || !$chapter_id || !$channel_type || !$promotion_type || !$name || !$promotion_point || !$book_name) {            return response()->error('PARAM_EMPTY');        } else {            $sendOrder = SendOrderService::createFromChapter(compact('book_id', 'book_name', 'subscribe_chapter_seq', 'subscribe_chapter_name', 'subscribe_chapter_id', 'chapter_name', 'promotion_type', 'promotion_point', 'name', 'cost', 'channel_type', 'headline_id', 'original_guide_id', 'chapter_id', 'charge_type', 'domain', 'distribution_channel_id', 'redirect_url'));            $promotion_url = 'https://site' . encodeDistributionChannelId($distribution_channel_id) . '.' . $this->getDomainByBid($book_id) . '/yun/' . $sendOrder->id;            return response()->success(['id' => $sendOrder->id, 'promotion_url' => $promotion_url]);        }    }    /**     * 根据图书id获取图书的收费类型     * @param string $bid     */    function getBookChargeTypeByBid($bid = '')    {        $charge_type = '';        $bookConfig = BookConfigService::getBookById($bid);        if ($bookConfig) {            $charge_type = $bookConfig->charge_type;        }        return $charge_type;    }    /**     * @apiVersion 1.0.0     * @apiDescription 生成目录中的章节的派单     * @api {POST} sendOrder/createFromDirectory 生成一个目录的派单     * @apiGroup sendOrder     * @apiName createFromDirectory     * @apiParam {String} name 派单渠道名称.     * @apiParam{Number} cost 成本.     * @apiParam {String} channel_type 派单渠道类型.(允许值: AUTHENTICATED, UNAUTHENTICATED)     * @apiParam {String} book_id  书本id     * @apiParam {String} promotion_type 推广类型[INTERVAL、EXTERVAL]. 内部、外部     * @apiParam {String} qr_code_id 二维码id.     * @apiParam {String} book_name  书本名称     * @apiParam {String} chapter_id  章节id     * @apiParam {String} chapter_name  章节名称     * @apiParam {String}  subscribe_chapter_id  强制订阅章节id     * @apiParam {String}  subscribe_chapter_name  强制订阅章节名称     * @apiParam {String}  subscribe_chapter_seq 强制订阅章节序号     * @apiParam{String}  [promotion_point] 派单源 微信(默认)or浏览器(微信:1,浏览器:2)     * @apiSuccess {Number}  id 派单id     * @apiSuccess {String}  promotion_url  推广链接     * @apiSuccess {String}  name 派单名称     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *         "data":{"id":5,"promotion_url":"http:\/\/www . xs . com\/promotion\/index\/123456","name":"派单名称"}     *     }     */    function createFromDirectory(Request $request)    {        $distribution_channel_id = $this->getChannelId();        $name = $request->has('name') ? $request->input('name') : '';        $cost = $request->has('cost') ? $request->input('cost') : 0;        $book_id = $request->has('book_id') ? $request->input('book_id') : '';        $book_name = $request->has('book_name') ? $request->input('book_name') : '';        $chapter_id = $request->has('chapter_id') ? $request->input('chapter_id') : '';        $qr_code_id = $request->has('qr_code_id') ? $request->input('qr_code_id') : '';        $chapter_name = $request->has('chapter_name') ? $request->input('chapter_name') : '';        $channel_type = $request->has('channel_type') ? $request->input('channel_type') : '';        $promotion_type = $request->has('promotion_type') ? $request->input('promotion_type') : '';        $subscribe_chapter_id = $request->has('subscribe_chapter_id') ? $request->input('subscribe_chapter_id') : '';        $subscribe_chapter_seq = $request->has('subscribe_chapter_seq') ? $request->input('subscribe_chapter_seq') : '';        $subscribe_chapter_name = $request->has('subscribe_chapter_name') ? $request->input('subscribe_chapter_name') : '';        $promotion_point = $request->has('promotion_point') ? $request->input('promotion_point') : 1;        if (!in_array($promotion_point, [1, 2])) {            $promotion_point = 1;        }        if (!$name || !$channel_type || !$promotion_type || !$book_id || !$book_name || !$chapter_id || !$chapter_name || !$subscribe_chapter_id || !$subscribe_chapter_seq || !$subscribe_chapter_name) return response()->error('PARAM_EMPTY');        if (empty($qr_code_id)) {            $qr_code_id = 0;        }        $redirect_url = "/reader?bid={$book_id}&cid={$chapter_id}";        $book_id = Hashids::decode($book_id)[0];        if ($book_id == 2423 && time() >= strtotime('2018-10-10 00:00:00') && time() <= strtotime('2018-10-15 00:00:00')) {            return response()->error('CONTENT_MAINTAIN');        }        if ($promotion_point == 2) {            $domain = 'leyuee.com';        } else {            $domain = $this->getDomainByBid($book_id);        }        $charge_type = $this->getBookChargeTypeByBid($book_id);        $sendOrder = SendOrderService::createFromDirectory(compact(            'name',            'channel_type',            'promotion_type',            'charge_type',            'cost',            'domain',            'book_id',            'qr_code_id',            'book_name',            'chapter_id',            'subscribe_chapter_id',            'subscribe_chapter_name',            'subscribe_chapter_seq',            'chapter_name',            'distribution_channel_id',            'redirect_url',            'promotion_point'        ));//        $promotion_url = '/yun/' . $sendOrder->id;        if ($promotion_point == 2) {            $promotion_url = 'https://bsite' . encodeDistributionChannelId($distribution_channel_id) . '.leyuee.com/yun/' . $sendOrder->id;        } else {            $promotion_url = 'https://site' . encodeDistributionChannelId($distribution_channel_id) . '.' . $this->getDomainByBid($book_id) . '/yun/' . $sendOrder->id;        }        return response()->success(['id' => $sendOrder->id, 'promotion_url' => $promotion_url, 'name' => $name]);    }    function uploadSendOrders(Request $request)    {        if (!$request->hasFile('sendOrderFile')) {            return response()->error('PARAM_EMPTY');        }        $qr_code_id = 0;        $channel_type = 'AUTHENTICATED';        $distribution_channel_id = $this->getChannelId();        $file_name = date('YmdHis') . '.csv';        $file = $request->file('sendOrderFile');        if (null != $file) {            $path = $request->sendOrderFile->storeAs('sendorder', $file_name);            $path = storage_path('app/' . $path);            header("Content-type:application/vnd.ms-excel");            header("Content-Disposition:attachment;filename=" . "派单信息" . date("YmdHis") . ".csv");            echo mb_convert_encoding("\"派单id\",\"渠道名称\",\"成本\",\"预计发送时间\",\"粉丝数\",\"图书名称\",\"图书id\",\"原文链接章节\",\"内外部\",\"公司名称\",\"代理商名称\",\"代理商介绍\",\"原文链接\"\r\n", 'GBK', 'UTF-8');            $file = fopen($path, "r");            //遍历读取每一行数据            $currentIndex = 0;            while ($data = fgetcsv($file)) {                \Log::info($data);                if (!$data[6]) continue;                if ($currentIndex > 0) {                    $date = $this->getFormatDate($data[2]);                    $date = date('Y-m-d', strtotime($date));                    $data[2] = $date;                    $name = mb_convert_encoding(trim($data[0]), "UTF-8", "GBK") . '-' . +trim($data[1]) . '-' . trim($data[2]) . '-' . mb_convert_encoding(trim($data[3]), "UTF-8", "GBK");                    $cost = $data[4];                    $fan_num = (int)(trim($data[5]) * 10000);                    \Log::info($fan_num);                    $book_name = mb_convert_encoding(trim($data[6]), "UTF-8", "GBK");                    $book_id = trim($data[7]);                    $chapter_sqp = trim($data[8]);                    $reciver_promotion_type = mb_convert_encoding(trim($data[9]), "UTF-8", "GBK");                    $import_company_name = mb_convert_encoding(trim($data[10]), "UTF-8", "GBK");                    $agent_name = mb_convert_encoding(trim($data[11]), "UTF-8", "GBK");                    $agent_intro = mb_convert_encoding(trim($data[12]), "UTF-8", "GBK");                    $chapter = ChapterService::getChapterInfoByBidAndSeq($book_id, $chapter_sqp);                    $chapter_id = $chapter->id;                    $chapter_name = $chapter->name;                    $promotion_type = ($reciver_promotion_type == '内部') ? 'INTERNAL' : 'EXTERNAL';                    $domain = $this->getDomainByBid($book_id);                    $charge_type = $this->getBookChargeTypeByBid($book_id);                    $book_id = Hashids::encode($book_id);                    $redirect_url = "/reader?bid=$book_id&cid=$chapter_id";                    $book_id = Hashids::decode($book_id)[0];                    if (!$name || !$channel_type || !$promotion_type || !$book_id || !$book_name || !$chapter_id || !$chapter_name || !$import_company_name || !$fan_num) {                        return response()->error('PARAM_EMPTY');                    }                    $pre_send_date = $date;                    $sendOrder = SendOrderService::createFromDirectory(compact('name', 'channel_type', 'promotion_type', 'pre_send_date', 'import_company_name', 'fan_num', 'charge_type', 'cost', 'domain', 'book_id', 'qr_code_id', 'book_name', 'chapter_id', 'chapter_name', 'distribution_channel_id', 'redirect_url'));                    $promotion_url = 'https://site' . encodeDistributionChannelId($distribution_channel_id) . '.' . $this->getDomainByBid($book_id) . '/yun/' . $sendOrder->id;                    $send_order_id = $sendOrder->id;                    if ($agent_name && $agent_intro) {                        $created_at = date("Y-m-d H:i:s");                        $updated_at = date("Y-m-d H:i:s");                        $params = compact('send_order_id', 'agent_name', 'agent_intro', 'created_at', 'updated_at');                        DB::table('agent_info')->insert($params);                    }                    echo("\"" . $sendOrder->id . "\",");                    echo("\"" . mb_convert_encoding($name, "GBK", "UTF-8") . "\",");                    echo("\"" . $cost . "\",");                    echo("\"" . date('Y/m/d', strtotime($date)) . "\",");                    echo("\"" . $fan_num . "\",");                    echo("\"" . mb_convert_encoding($book_name, "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($book_id, "GBK", "UTF-8") . "\",");                    echo("\"" . $chapter_id . "\",");                    echo("\"" . mb_convert_encoding($reciver_promotion_type, "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($import_company_name, "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($agent_name ? $agent_name : "未知", "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($agent_intro ? $agent_intro : "未知", "GBK", "UTF-8") . "\",");                    echo("\"" . $promotion_url . "\"\r\n");                }                $currentIndex++;            }        }        exit();    }    /**     * @apiVersion 1.0.0     * @apiDescription 生成一个页面推广的派单     * @api {POST} sendOrder/createFromPage 生成一个页面推广的派单     * @apiGroup sendOrder     * @apiName createFromPage     * @apiParam{Number} cost 成本.     * @apiParam{String} name 派单渠道名称.     * @apiParam{String} promotion_type 推广类型[INTERVAL、EXTERVAL]. 内部、外部     * @apiParam{String} qr_code_id 二维码id.     * @apiParam{String} channel_type 派单渠道类型.(允许值: AUTHENTICATED, UNAUTHENTICATED)     * @apiParam{String} page_id  页面ID     * @apiParam{String}  [promotion_point] 派单源 微信(默认)or浏览器(微信:1,浏览器:2)     * @apiSuccess {Number}  id 派单id     * @apiSuccess {String}  promotion_url  推广链接     * @apiSuccess {String}  name 派单名称     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *         "data":{"id":5,"promotion_url":"http:\/\/www . xs . com\/promotion\/index\/123456","name":"派单名称"}     *     }     */    function createFromPage(Request $request)    {        $name = $request->has('name') ? $request->input('name') : '';        $cost = $request->has('cost') ? $request->input('cost') : 0;        $promotion_type = $request->has('promotion_type') ? $request->input('promotion_type') : '';        $page_id = $request->has('page_id') ? $request->input('page_id') : '';        $qr_code_id = $request->has('qr_code_id') ? $request->input('qr_code_id') : '';        $channel_type = $request->has('channel_type') ? $request->input('channel_type') : '';        $page = PromotionService::getById($page_id);        if (!$name || !$channel_type || !$page_id || !$page) return response()->error('PARAM_EMPTY');        if (empty($qr_code_id)) {            $qr_code_id = 0;        }        $promotion_point = $request->has('promotion_point') ? $request->input('promotion_point') : 1;        if (in_array($promotion_point, [1, 2])) {            $promotion_point = 1;        }        $entrance = $page->title;        $redirect_url = $page->link;        $distribution_channel_id = $this->getChannelId();        $domain = $this->getDomainByBid();        $sendOrder = SendOrderService::createFromPage(compact('name', 'channel_type', 'promotion_type', 'cost', 'qr_code_id', 'domain', 'page_id', 'entrance', 'distribution_channel_id', 'redirect_url', 'promotion_point'));//        $promotion_url = '/yun/' . $sendOrder->id;        if ($promotion_point == 2) {            $promotion_url = 'https://bsite' . encodeDistributionChannelId($distribution_channel_id) . '.leyuee.com/yun/' . $sendOrder->id;        } else {            $promotion_url = 'https://site' . encodeDistributionChannelId($distribution_channel_id) . '.leyuee.com/yun/' . $sendOrder->id;        }        //$promotion_url = 'https://'.$site . encodeDistributionChannelId($distribution_channel_id) . '.' . $this->getDomainByBid('') . '/yun/' . $sendOrder->id;        return response()->success(['id' => $sendOrder->id, 'promotion_url' => $promotion_url, 'name' => $name]);    }    /**     * @apiVersion 1.0.0     * @apiDescription 更新派单     * @api {POST} sendOrder/updateSendOrderInfo 更新派单     * @apiGroup sendOrder     * @apiName updateSendOrderInfo     * @apiParam {Number} id 派单id.     * @apiParam {String} name 派单名称     * @apiParam {Number} cost 派单成本     * @apiParam {String} channel_type 派单渠道类型.(允许值: AUTHENTICATED, UNAUTHENTICATED)     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *         "data":[]     *     }     */    function updateSendOrderInfo(Request $request)    {        $distribution_channel_id = $this->getChannelId();        $id = $request->has('id') ? $request->input('id') : '';        $name = $request->has('name') ? $request->input('name') : '';        $cost = $request->has('cost') ? $request->input('cost') : '';        $channel_type = $request->has('channel_type') ? $request->input('channel_type') : '';        $promotion_type = $request->has('promotion_type') ? $request->input('promotion_type') : '';        $subscribe_chapter_seq = $request->input('subscribe_chapter_seq', '');        if (empty($name) && empty($channel_type) && empty($cost) && empty($promotion_type)) {            return response()->error("PARAM_EMPTY");        }        $subscribe_chapter = [];        if ($subscribe_chapter_seq) {            $send_orders = SendOrderService::getById($id);            $bid = $send_orders->book_id;            $chapter_info = ChapterService::getChapterInfoByBidAndSeq($bid, $subscribe_chapter_seq);            if (!$chapter_info) {                return response()->error('PARAM_ERROR');            }            $subscribe_chapter_id = $chapter_info->id;            $subscribe_chapter['subscribe_chapter_id'] = $subscribe_chapter_id;            $subscribe_chapter['subscribe_chapter_seq'] = $subscribe_chapter_seq;            $subscribe_chapter['subscribe_chapter_name'] = $chapter_info->name;        }        $pre_send_date = null;        $send_order_export_special_channel = env('SEND_ORDER_EXPORT_SPECIAL_CHANNEL');        $isExistSpecialChannel = in_array($distribution_channel_id, explode(',', $send_order_export_special_channel));        if ($isExistSpecialChannel && $name && strpos($name, "-")) {            $strs = explode('-', $name);            if (count($strs) == 4) {                $date = $this->getFormatDate($strs[2]);                $date = date('Y-m-d', strtotime($date));                $pre_send_date = $date;            }        }        $data = SendOrderService::updateSendOrderInfo($id, $distribution_channel_id, $name, $pre_send_date, $channel_type, $cost, $promotion_type, $subscribe_chapter);        if ($data) {            return response()->success();        } else {            return response()->error("HANDLE_FAILED");        }    }    /**     * @apiVersion 1.0.0     * @apiDescription 删除派单     * @api {POST} sendOrder/removeSendOrder 删除派单     * @apiGroup sendOrder     * @apiName removeSendOrder     * @apiParam {Number}  id 派单id.     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *         "data":[]     *     }     */    function removeSendOrder(Request $request)    {        $distribution_channel_id = $this->getChannelId();        $id = $request->has('id') ? $request->input('id') : '';        $data = SendOrderService::removeSendOrder($id, $distribution_channel_id);        if ($data) {            return response()->success();        } else {            return response()->error("HANDLE_FAILED");        }    }    /**     * @apiVersion 1.0.0     * @apiDescription 设置成本     * @api {POST} sendOrder/setCost 设置成本     * @apiGroup sendOrder     * @apiName setCost     * @apiParam{Number}id 派单id.     * @apiParam{Number}cost 成本.     * @apiSuccessExample {json} Success-Response:     *     *     {     *         "code": 0,     *         "msg": "",     *         "data":[]     *     }     */    function setCost(Request $request)    {        $distribution_channel_id = $this->getChannelId();        $id = $request->has('id') ? $request->input('id') : '';        $cost = $request->has('cost') ? $request->input('cost') : '';        if (empty($id) || empty($cost)) {            return response()->error("PARAM_EMPTY");        }        if (!is_numeric($cost)) {            return response()->error("PARAM_ERROR");        }        $data = SendOrderService::setSendOrderCost($id, $distribution_channel_id, $cost);        if ($data) {            return response()->success(compact('cost'));        } else {            return response()->error("HANDLE_FAILED");        }    }    /**     * 匹配原文链接     * @param Request $request     */    static function checkOriginUrl(Request $request)    {        if (!$request->hasFile('orginUrlFile')) {            return response()->error('PARAM_EMPTY');        }        $file_name = date('YmdHis') . '.csv';        $file = $request->file('orginUrlFile');        if (null != $file) {            $path = $request->orginUrlFile->storeAs('orginUrl', $file_name);            $path = storage_path('app/' . $path);            header("Content-type:application/vnd.ms-excel");            header("Content-Disposition:attachment;filename=" . "原文链接" . date("YmdHis") . ".csv");            echo mb_convert_encoding("\"公众号\",\"正确原文链接\",\"预览图文链接\",\"链接中解析到的url\",\"是否匹配\"\r\n", 'GBK', 'UTF-8');            $file = fopen($path, "r");            //遍历读取每一行数据            $currentIndex = 0;            while ($data = fgetcsv($file)) {                \Log::info('data---1:' . json_encode($data));                if (!$data[0] || !$data[1] || !$data[2]) continue;                if ($currentIndex > 0) {                    \Log::info('data---2:' . $data[2]);                    $data[2] = str_replace('https', 'http', $data[2]);                    $data[2] = str_replace('http', 'https', $data[2]);                    $content = ChannelService::getContentByUrl($data[2]);                    \Log::info($content);                    $searchUrl = '';                    $findStrEnd = ';';                    $findStrBegin = 'msg_source_url =';                    //解析页面中的msg_source_url的内容                    $startIndex = strpos($content, $findStrBegin);                    if ($startIndex > 0) {                        \Log::info('开始进入了');                        $endIndex = strpos($content, $findStrEnd, $startIndex);                        if ($endIndex > $startIndex) {                            $startIndex = $startIndex + strlen($findStrBegin) + 2;                            $searchUrl = substr($content, $startIndex, $endIndex - $startIndex - 1);                        }                        //判断解析到的msg_source_url是否加密                        \Log::info($searchUrl);                        $url_items = parse_url($searchUrl);                        \Log::info($url_items);                        $distribution_channel_id = str_replace('site', '', explode('.', $url_items['host'])[0]);                        if (!is_numeric($distribution_channel_id)) {                            $deal_distribution_channel_id = decodeDistributionChannelId($distribution_channel_id);                            //需要解密                            $searchUrl = str_replace('site' . $distribution_channel_id, 'site' . $deal_distribution_channel_id, $searchUrl);                        }                    }                    //判断上传的url是否加密                    $deal_url = $data[1];                    $url_items = parse_url($deal_url);                    $distribution_channel_id = str_replace('site', '', explode('.', $url_items['host'])[0]);                    //需要解密                    if (!is_numeric($distribution_channel_id)) {                        $deal_distribution_channel_id = decodeDistributionChannelId($distribution_channel_id);                        $deal_url = str_replace('site' . $distribution_channel_id, 'site' . $deal_distribution_channel_id, $deal_url);                    }                    $isMatch = ($searchUrl == $deal_url) ? '匹配' : '不匹配';                    $data[0] = mb_convert_encoding(trim($data[0]), "UTF-8", "GBK");                    echo("\"" . mb_convert_encoding($data[0], "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($data[1], "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($data[2], "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($searchUrl ? $searchUrl : '未找到', "GBK", "UTF-8") . "\",");                    echo("\"" . mb_convert_encoding($isMatch, "GBK", "UTF-8") . "\"\r\n");                }                $currentIndex++;            }        }        exit();    }    /**     * 加密、解密原文链接     * @param Request $request     */    function decryptOrEncrptOriginUrl(Request $request)    {        $originUrl = $request->has('origin_url') ? $request->input('origin_url') : '';        if (empty($originUrl)) {            return response()->error("PARAM_EMPTY");        }        $url_items = parse_url($originUrl);        $distribution_channel_id = str_replace('site', '', explode('.', $url_items['host'])[0]);        //需要加密        if (is_numeric($distribution_channel_id)) {            $deal_distribution_channel_id = encodeDistributionChannelId($distribution_channel_id);            //需要解密        } else {            $deal_distribution_channel_id = decodeDistributionChannelId($distribution_channel_id);        }        $originUrl = str_replace('site' . $distribution_channel_id, 'site' . $deal_distribution_channel_id, $originUrl);        return response()->success(['originUrl' => $originUrl]);    }}
 |