// +---------------------------------------------------------------------- namespace app\adminapi\controller; use app\Request; use app\services\order\StoreOrderCartInfoServices; use app\services\order\StoreOrderCreateServices; use app\services\order\StoreOrderRefundServices; use app\services\order\StoreOrderServices; use app\services\system\UpgradeServices; use app\services\user\UserBillServices; use app\services\user\UserBrokerageServices; use app\services\user\UserMoneyServices; use app\services\user\UserBrokerageFrozenServices; use think\facade\Db; class UpgradeController { /** * @var UpgradeServices */ private $services; /** * UpgradeController constructor. * @param UpgradeServices $services */ public function __construct(UpgradeServices $services) { $this->services = $services; } /** * 升级程序页面 * @param Request $request * @return \think\response\View */ public function index(Request $request) { $data = $this->upData(); $Title = "CRMEB升级程序"; $Powered = "Powered by CRMEB"; //获取当前版本号 $version_now = $this->getversion('.version')['version']; $version_new = $data['new_version']; $isUpgrade = true; $executeIng = false; return view('/upgrade/step1', [ 'title' => $Title, 'powered' => $Powered, 'version_now' => $version_now, 'version_new' => $version_new, 'isUpgrade' => json_encode($isUpgrade), 'executeIng' => json_encode($executeIng), 'next' => 1, 'action' => 'upgrade' ]); } /** * 获取当前版本号 * @return array */ public function getversion($str) { $version_arr = []; $curent_version = @file(app()->getRootPath() . $str); foreach ($curent_version as $val) { list($k, $v) = explode('=', $val); $version_arr[$k] = $v; } return $version_arr; } /** * 写入升级过程 * @param string $field * @param int $n * @return bool */ public function setIsUpgrade(string $field, int $n = 0) { $upgrade = parse_ini_file(public_path('upgrade') . '.upgrade'); if ($n) { if (!is_array($upgrade)) { $upgrade = []; } $string = ''; foreach ($upgrade as $key => $item) { $string .= $key . '=' . $item . "\r\n"; } $string .= $field . '=' . $n . "\r\n"; file_put_contents(public_path('upgrade') . '.upgrade', $string); return true; } else { if (!is_array($upgrade)) { return false; } return isset($upgrade[$field]); } } public function upgrade(Request $request) { list($sleep, $page, $prefix) = $request->getMore([ ['sleep', 0], ['page', 1], ['prefix', 'eb_'], ], true); $data = $this->upData(); $code_now = $this->getversion('.version')['version_code']; if ($data['new_code'] == $code_now) { return app('json')->success(['sleep' => -1]); } $sql_arr = []; foreach ($data['update_sql'] as $items) { if ($items['code'] > $code_now) { $sql_arr[] = $items; } } //sql 执行完成,开始执行修改数据 if (!isset($sql_arr[$sleep])) { // $limit = 100; // if (!$this->setIsUpgrade('money')) { // $res = $this->handleMoney((int)$sleep, (int)$page, (int)$limit); // return app('json')->success($res); // } elseif (!$this->setIsUpgrade('brokerage')) { // $res = $this->handleBrokerage((int)$sleep, (int)$page, (int)$limit); // return app('json')->success($res); // } elseif (!$this->setIsUpgrade('orderRefund')) { // $res = $this->handleOrderRefund((int)$sleep, (int)$page, (int)$limit); // return app('json')->success($res); // } else { // file_put_contents(app()->getRootPath() . '.version', "version=" . $data['new_version'] . "\nversion_code=" . $data['new_code']); // return app('json')->success(['sleep' => -1]); // } // $limit = 100; // if (!$this->setIsUpgrade('cartInfo')) { // $res = $this->handleCartInfo((int)$sleep, (int)$page, (int)$limit); // return app('json')->success($res); // } else { // file_put_contents(app()->getRootPath() . '.version', "version=" . $data['new_version'] . "\nversion_code=" . $data['new_code'] . "\napp_id=ze7x9rxsv09l6pvsyo" . "\napp_key=fuF7U9zaybLa5gageVQzxtxQMFnvU2OI"); // $this->services->generateSignature(); // return app('json')->success(['sleep' => -1]); // } file_put_contents(app()->getRootPath() . '.version', "version=" . $data['new_version'] . "\nversion_code=" . $data['new_code'] . "\nplatform=CRMEB\napp_id=ze7x9rxsv09l6pvsyo" . "\napp_key=fuF7U9zaybLa5gageVQzxtxQMFnvU2OI"); $this->services->generateSignature(); return app('json')->success(['sleep' => -1]); } $sql = $sql_arr[$sleep]; Db::startTrans(); try { if ($sql['type'] == 1) { if (isset($sql['findSql']) && $sql['findSql']) { $table = $prefix . $sql['table']; $findSql = str_replace('@table', $table, $sql['findSql']); if (!empty(Db::query($findSql))) { $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表已存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } if (isset($sql['sql']) && $sql['sql']) { $upSql = $sql['sql']; $upSql = str_replace('@table', $table, $upSql); Db::execute($upSql); $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表添加成功'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } elseif ($sql['type'] == 2) { if (isset($sql['findSql']) && $sql['findSql']) { $table = $prefix . $sql['table']; $findSql = str_replace('@table', $table, $sql['findSql']); if (empty(Db::query($findSql))) { $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表不存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } if (isset($sql['sql']) && $sql['sql']) { $upSql = $sql['sql']; $upSql = str_replace('@table', $table, $upSql); Db::execute($upSql); $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表删除成功'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } elseif ($sql['type'] == 3) { if (isset($sql['findSql']) && $sql['findSql']) { $table = $prefix . $sql['table']; $findSql = str_replace('@table', $table, $sql['findSql']); if (!empty(Db::query($findSql))) { $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表中' . $sql['field'] . '已存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } if (isset($sql['sql']) && $sql['sql']) { $upSql = $sql['sql']; $upSql = str_replace('@table', $table, $upSql); Db::execute($upSql); $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表中' . $sql['field'] . '字段添加成功'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } elseif ($sql['type'] == 4) { if (isset($sql['findSql']) && $sql['findSql']) { $table = $prefix . $sql['table']; $findSql = str_replace('@table', $table, $sql['findSql']); if (empty(Db::query($findSql))) { $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表中' . $sql['field'] . '不存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } if (isset($sql['sql']) && $sql['sql']) { $upSql = $sql['sql']; $upSql = str_replace('@table', $table, $upSql); Db::execute($upSql); $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表中' . $sql['field'] . '字段修改成功'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } elseif ($sql['type'] == 5) { if (isset($sql['findSql']) && $sql['findSql']) { $table = $prefix . $sql['table']; $findSql = str_replace('@table', $table, $sql['findSql']); if (empty(Db::query($findSql))) { $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表中' . $sql['field'] . '不存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } if (isset($sql['sql']) && $sql['sql']) { $upSql = $sql['sql']; $upSql = str_replace('@table', $table, $upSql); Db::execute($upSql); $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . '表中' . $sql['field'] . '字段删除成功'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } elseif ($sql['type'] == 6) { $table = $prefix . $sql['table'] ?? ''; $whereTable = $prefix . $sql['whereTable'] ?? ''; if (isset($sql['findSql']) && $sql['findSql']) { $findSql = str_replace('@table', $table, $sql['findSql']); if (!empty(Db::query($findSql))) { $item['table'] = $prefix . $sql['table']; $item['status'] = 1; $item['error'] = $table . '表中此数据已存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } if (isset($sql['sql']) && $sql['sql']) { $upSql = $sql['sql']; $upSql = str_replace('@table', $table, $upSql); if (isset($sql['whereSql']) && $sql['whereSql']) { $whereSql = str_replace('@whereTable', $whereTable, $sql['whereSql']); $tabId = Db::query($whereSql)[0]['tabId'] ?? 0; if (!$tabId) { $item['table'] = $whereTable; $item['status'] = 1; $item['error'] = '查询父类ID不存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } $upSql = str_replace('@tabId', $tabId, $upSql); } if (Db::execute($upSql)) { $item['table'] = $table; $item['status'] = 1; $item['error'] = '数据添加成功'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } } elseif ($sql['type'] == 7) { $table = $prefix . $sql['table'] ?? ''; $whereTable = $prefix . $sql['whereTable'] ?? ''; if (isset($sql['findSql']) && $sql['findSql']) { $findSql = str_replace('@table', $table, $sql['findSql']); if (empty(Db::query($findSql))) { $item['table'] = $prefix . $sql['table']; $item['status'] = 1; $item['error'] = $table . '表中此数据不存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } if (isset($sql['sql']) && $sql['sql']) { $upSql = $sql['sql']; $upSql = str_replace('@table', $table, $upSql); if (isset($sql['whereSql']) && $sql['whereSql']) { $whereSql = str_replace('@whereTable', $whereTable, $sql['whereSql']); $tabId = Db::query($whereSql)[0]['tabId'] ?? 0; if (!$tabId) { $item['table'] = $whereTable; $item['status'] = 1; $item['error'] = '查询父类ID不存在'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } $upSql = str_replace('@tabId', $tabId, $upSql); } if (Db::execute($upSql)) { $item['table'] = $table; $item['status'] = 1; $item['error'] = '数据修改成功'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } } elseif ($sql['type'] == 8) { } elseif ($sql['type'] == -1) { $table = $prefix . $sql['table']; if (isset($sql['sql']) && $sql['sql']) { $upSql = $sql['sql']; $upSql = str_replace('@table', $table, $upSql); if (isset($sql['new_table']) && $sql['new_table']) { $new_table = $prefix . $sql['new_table']; $upSql = str_replace('@new_table', $new_table, $upSql); } Db::execute($upSql); $item['table'] = $table; $item['status'] = 1; $item['error'] = $table . ' sql执行成功'; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); Db::commit(); return app('json')->success($item); } } } catch (\Throwable $e) { $item['table'] = $prefix . $sql['table']; $item['status'] = 0; $item['sleep'] = $sleep + 1; $item['add_time'] = date('Y-m-d H:i:s', time()); $item['error'] = $e->getMessage(); Db::rollBack(); return app('json')->success($item); } } /** * 处理历史余额数据 * @param int $sleep * @param int $page * @param int $limit * @return mixed */ public function handleMoney(int $sleep = 1, int $page = 1, int $limit = 100) { /** @var UserBillServices $userBillServics */ $userBillServics = app()->make(UserBillServices::class); $where = ['category' => 'now_money', 'type' => ['pay_product', 'pay_product_refund', 'system_add', 'system_sub', 'recharge', 'lottery_use', 'lottery_add']]; $list = $userBillServics->getList($where, '*', $page, $limit, [], 'id asc'); if ($list) { $allData = $data = []; foreach ($list as $item) { $data = [ 'uid' => $item['uid'], 'link_id' => $item['link_id'], 'pm' => $item['pm'], 'title' => $item['title'], 'type' => $item['type'], 'number' => $item['number'], 'balance' => $item['balance'], 'mark' => $item['mark'], 'add_time' => strtotime($item['add_time']), ]; $allData[] = $data; } if ($allData) { /** @var UserMoneyServices $userMoneyServices */ $userMoneyServices = app()->make(UserMoneyServices::class); $userMoneyServices->saveAll($allData); } $info['table'] = 'user_money'; $info['status'] = 1; $info['error'] = '余额数据更新成功'; $info['sleep'] = $sleep + 1; $info['page'] = $page + 1; $info['add_time'] = date('Y-m-d H:i:s', time()); return $info; } else { $this->setIsUpgrade('money', 1); $info['table'] = 'user_money'; $info['status'] = 1; $info['error'] = '余额数据更新成功'; $info['sleep'] = $sleep + 1; $info['page'] = 1; $info['add_time'] = date('Y-m-d H:i:s', time()); return $info; } } /** * 处理历史佣金数据 * @param int $sleep * @param int $page * @param int $limit * @return mixed */ public function handleBrokerage(int $sleep = 1, int $page = 1, int $limit = 100) { /** @var UserBillServices $userBillServics */ $userBillServics = app()->make(UserBillServices::class); $where = ['category' => ['', 'now_money'], 'type' => ['brokerage', 'brokerage_user', 'extract', 'refund', 'extract_fail']]; $list = $userBillServics->getList($where, '*', $page, $limit, [], 'id asc'); if ($list) { $allData = $data = []; /** @var $brokerageFrozenServices */ $brokerageFrozenServices = app()->make(UserBrokerageFrozenServices::class); $frozenList = $brokerageFrozenServices->getColumn([['uill_id', 'in', array_column($list, 'id')], ['frozen_time', '>', time()]], 'uill_id,frozen_time', 'uill_id'); foreach ($list as $item) { if (in_array($item['type'], ['brokerage_user', 'extract', 'refund', 'extract_fail'])) { $type = $item['type']; } else { if (strpos($item['mark'], '二级')) { $type = 'two_brokerage'; } else { $type = 'one_brokerage'; } } $data = [ 'uid' => $item['uid'], 'link_id' => $item['link_id'], 'pm' => $item['pm'], 'title' => $item['title'], 'type' => $type, 'number' => $item['number'], 'balance' => $item['balance'], 'mark' => $item['mark'], 'frozen_time' => $frozenList[$item['id']]['frozen_time'] ?? 0, 'add_time' => strtotime($item['add_time']), ]; $allData[] = $data; } if ($allData) { /** @var UserBrokerageServices $userBrokerageServices */ $userBrokerageServices = app()->make(UserBrokerageServices::class); $userBrokerageServices->saveAll($allData); } $info['table'] = 'user_brokerage'; $info['status'] = 1; $info['error'] = '佣金数据更新成功'; $info['sleep'] = $sleep + 1; $info['page'] = $page + 1; $info['add_time'] = date('Y-m-d H:i:s', time()); return $info; } else { $this->setIsUpgrade('brokerage', 1); $info['table'] = 'user_brokerage'; $info['status'] = 1; $info['error'] = '佣金数据更新成功'; $info['sleep'] = $sleep + 1; $info['page'] = 1; $info['add_time'] = date('Y-m-d H:i:s', time()); return $info; } } /** * 处理历史退款数据 * @param int $sleep * @param int $page * @param int $limit * @return mixed * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function handleOrderRefund(int $sleep = 1, int $page = 1, int $limit = 100) { /** @var StoreOrderServices $storeOrderServices */ $storeOrderServices = app()->make(StoreOrderServices::class); $list = $storeOrderServices->getSplitOrderList(['refund_status' => [1, 2], ['refund_type' => [1, 2, 4, 5, 6]]], ['*'], [], $page, $limit, 'id asc'); $allData = $refundOrderData = []; if ($list) { /** @var StoreOrderCreateServices $storeOrderCreateServices */ $storeOrderCreateServices = app()->make(StoreOrderCreateServices::class); /** @var StoreOrderCartInfoServices $storeOrderCartInfoServices */ $storeOrderCartInfoServices = app()->make(StoreOrderCartInfoServices::class); $time = time(); foreach ($list as $order) { //生成退款订单 $refundOrderData['uid'] = $order['uid']; $refundOrderData['store_id'] = $order['store_id']; $refundOrderData['store_order_id'] = $order['id']; $refundOrderData['order_id'] = $storeOrderCreateServices->getNewOrderId(''); $refundOrderData['refund_num'] = $order['total_num']; $refundOrderData['refund_type'] = $order['refund_type']; $refundOrderData['refund_price'] = $order['pay_price']; $refundOrderData['refunded_price'] = 0; $refundOrderData['refund_explain'] = $order['refund_reason_wap_explain']; $refundOrderData['refund_img'] = $order['refund_reason_wap_img']; $refundOrderData['refund_reason'] = $order['refund_reason_wap']; $refundOrderData['refund_express'] = $order['refund_express']; $refundOrderData['refunded_time'] = $order['refund_type'] == 6 ? $order['refund_reason_time'] : 0; $refundOrderData['add_time'] = $order['refund_reason_time']; $cartInfos = $storeOrderCartInfoServices->getCartColunm(['oid' => $order['id']], 'id,cart_id,cart_num,cart_info'); foreach ($cartInfos as &$cartInfo) { $cartInfo['cart_info'] = is_string($cartInfo['cart_info']) ? json_decode($cartInfo['cart_info'], true) : $cartInfo['cart_info']; } $refundOrderData['cart_info'] = json_encode(array_column($cartInfos, 'cart_info')); $allData[] = $refundOrderData; } if ($allData) { /** @var StoreOrderRefundServices $storeOrderRefundServices */ $storeOrderRefundServices = app()->make(StoreOrderRefundServices::class); $storeOrderRefundServices->saveAll($allData); } $info['table'] = 'store_order_refund'; $info['status'] = 1; $info['error'] = '退款数据更新成功'; $info['sleep'] = $sleep + 1; $info['page'] = $page + 1; $info['add_time'] = date('Y-m-d H:i:s', time()); return $info; } else { $this->setIsUpgrade('orderRefund', 1); $info['table'] = 'store_order_refund'; $info['status'] = 1; $info['error'] = '退款数据更新成功'; $info['sleep'] = $sleep + 1; $info['page'] = 1; $info['add_time'] = date('Y-m-d H:i:s', time()); return $info; } } /** * 更新订单商品表 * @param int $sleep * @param int $page * @param int $limit * @return array */ public function handleCartInfo(int $sleep = 1, int $page = 1, int $limit = 100) { /** @var StoreOrderCartInfoServices $storeOrderCartInfoServices */ $storeOrderCartInfoServices = app()->make(StoreOrderCartInfoServices::class); $list = $storeOrderCartInfoServices->selectList(['uid' => 0], 'id,oid', $page, $limit)->toArray(); $allData = $cartData = []; if ($list) { /** @var StoreOrderServices $storeOrderServices */ $storeOrderServices = app()->make(StoreOrderServices::class); $uids = $storeOrderServices->getColumn([['id','in',array_column($list,'oid')]],'uid','id'); foreach ($list as $cart) { $cartData['id'] = $cart['id']; $cartData['uid'] = $uids[$cart['oid']] ?? 0; $allData[] = $cartData; } if ($allData) { $storeOrderCartInfoServices->saveAll($allData); } $info['table'] = 'store_order_cart_info'; $info['status'] = 1; $info['error'] = '订单商品数据更新成功'; $info['sleep'] = $sleep + 1; $info['page'] = $page + 1; } else { $this->setIsUpgrade('cartInfo', 1); $info['table'] = 'store_order_cart_info'; $info['status'] = 1; $info['error'] = '订单商品数据更新成功'; $info['sleep'] = $sleep + 1; $info['page'] = 1; } $info['add_time'] = date('Y-m-d H:i:s', time()); return $info; } /** * 升级数据 * @return mixed */ public function upData() { $data['new_version'] = 'CRMEB-BZ v4.6.0'; $data['new_code'] = 460; $data['update_sql'] = []; return $data; } /** * 升级列表 * @return mixed */ public function upgradeList() { return app('json')->success($this->services->getUpgradeList()); } /** * 可升级列表 * @return mixed */ public function upgradeableList() { return app('json')->success($this->services->getUpgradeableList()); } /** * 可升级列表 * @return mixed */ public function agreement() { return app('json')->success($this->services->getAgreement()); } /** * 下载升级包 * @param $packageKey * @return mixed */ public function download($packageKey) { if (empty($packageKey)) { return app('json')->fail(100100); } $this->services->packageDownload($packageKey); return app('json')->success(); } /** * 升级进度 * @return mixed */ public function progress() { $result = $this->services->getProgress(); return app('json')->success($result); } /** * 获取升级状态 * @return mixed */ public function upgradeStatus() { $data = $this->services->getUpgradeStatus(); return app('json')->success($data); } /** * 升级记录 * @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException */ public function upgradeLogList() { $data = $this->services->getUpgradeLogList(); return app('json')->success($data); } /** * 导出备份 * @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException */ public function export($id, $type) { if (!$id || !$type) { return app('json')->fail(100026); } return app('json')->success($this->services->export((int)$id, $type)); } }