| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
- <?php
- namespace addons\SecondaryCard\common\service;
- use addons\SecondaryCard\common\enums\SecondaryCardEnum;
- use addons\SecondaryCard\common\models\SecondaryCard;
- use addons\SecondaryCard\common\models\SecondaryCardOrder;
- use addons\SecondaryCard\common\models\SecondaryCardRedemptionCode;
- use common\components\export\CsvTool;
- use common\enums\DownloadEnum;
- use common\enums\RedisKeyEnum;
- use common\enums\StatusEnum;
- use common\helpers\LockHelper;
- use common\helpers\StringHelper;
- use common\models\common\Download;
- use common\models\mall\MallAddons;
- use common\traits\ErrorTrait;
- class SecondaryCardRedemptionCodeService
- {
- use ErrorTrait;
- public static function getList($params)
- {
- $params['where'][] = ['mall_id' => $params['mall_id']];
- $params['where'][] = ['secondary_card_id' => $params['secondary_card_id']];
- $params['where'][] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
- if (isset($params['is_use']) && $params['is_use'] !== '') {
- $params['where'][] = ['is_use' => $params['is_use']];
- }
- if (!empty($params['code'])) {
- $params['where'][] = ['like', 'code', trim($params['code'])];
- }
- if (!empty($params['remarks'])) {
- $params['where'][] = ['like', 'remarks', trim($params['remarks'])];
- }
- $params['order'] = 'id DESC';
- $params['with'] = ['secondaryCard', 'secondaryCardOrder'];
- if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
- $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
- $params['order'] = $params['sort_column'] . ' ' . $sort_order;
- }
- $pageData = SecondaryCardRedemptionCode::listPage($params, false);
- if (!empty($pageData['list'])) {
- $o2o_store_ids = [];
- $o2o_store_list = [];
- foreach ($pageData['list'] as $item) {
- switch ($item['create_source_type']) {
- case 1:
- $o2o_store_ids[] = $item['create_source_id'];
- break;
- }
- }
- if (!empty($o2o_store_ids) && MallAddons::isInstall($params['mall_id'], 'Store')) {
- $o2o_store_list = SecondaryCardService::getO2OStoreList($o2o_store_ids);
- }
- $mall_name = \Yii::$app->services->setting->mall->get($params['mall_id'], 'basic.name');
- foreach ($pageData['list'] as &$item) {
- $item['source'] = '';
- $item['order_no'] = $item['secondaryCardOrder']['order_no'] ?? '';
- switch ($item['create_source_type']) {
- case 0:
- $item['source'] = $mall_name;
- break;
- case 1:
- $item['source'] = $o2o_store_list[$item['create_source_id']]['store_name'] ?? '';
- break;
- }
- unset($item['secondaryCardOrder']);
- unset($item['secondaryCard']);
- }
- }
- $pageData['export_list'] = SecondaryCardRedemptionCode::getExportFields();
- return $pageData;
- }
- public static function del($params)
- {
- $lock_key = RedisKeyEnum::suffix(SecondaryCardEnum::LOCK_SECONDARY_CARD, $params['secondary_card_id']);
- $identification = uniqid();
- $t = \Yii::$app->db->beginTransaction();
- try {
- if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new \Exception('当前访问人数过多');
- $counts = 1;
- if (is_array($params['id'])) {
- $counts = count($params['id']);
- }
- $res = SecondaryCardRedemptionCode::updateAll(['status' => StatusEnum::DELETE], ['id' => $params['id'], 'mall_id' => $params['mall_id']]);
- if (empty($res)) {
- throw new \Exception('更新失败');
- }
- $secondary_card = SecondaryCard::findOne(['id' => $params['secondary_card_id'], 'mall_id' => $params['mall_id']]);
- $secondary_card->max_times += $counts;
- $secondary_card->save();
- $t->commit();
- LockHelper::uLock($lock_key, $identification);
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- LockHelper::uLock($lock_key, $identification);
- return $e->getMessage();
- }
- }
- public static function add($params)
- {
- $t = \Yii::$app->db->beginTransaction();
- $lock_key = RedisKeyEnum::suffix(SecondaryCardEnum::LOCK_SECONDARY_CARD, $params['secondary_card_id']);
- $identification = uniqid();
- try {
- if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new \Exception('当前访问人数过多');
- $secondary_card = SecondaryCard::findOne(['id' => $params['secondary_card_id'], 'mall_id' => $params['mall_id']]);
- if (empty($secondary_card)) {
- throw new \Exception('次卡不存在');
- }
- $temp_max_times = $secondary_card->max_times;
- $secondary_card->max_times -= $params['num'];
- if ($secondary_card->max_times < 0) {
- $secondary_card->max_times = 0;
- $params['num'] = $temp_max_times;
- }
- $secondary_card->save();
- for ($i = 0; $i < $params['num']; $i++) {
- while (true) {
- if (!empty($params['code_pre'])) {
- $code = $params['code_pre'] . StringHelper::generateRandCode(9);
- } else {
- $rand = mt_rand(1000, 9999);
- $code = StringHelper::generateRandCode(9);
- $code = $code . $rand;
- }
- $res = SecondaryCardRedemptionCode::findOne(['mall_id' => $params['mall_id'], 'code' => $code, 'status' => StatusEnum::ENABLED]);
- if (empty($res)) {
- break;
- }
- }
- $add_data = [
- 'mall_id' => $params['mall_id'],
- 'remarks' => $params['remarks'],
- 'use_type' => $params['use_type'],
- 'secondary_card_id' => $params['secondary_card_id'],
- 'create_source_type' => $params['create_source_type'],
- 'create_source_id' => $params['create_source_id'],
- 'code' => $code,
- ];
- SecondaryCardRedemptionCode::setData($add_data);
- }
- $t->commit();
- LockHelper::uLock($lock_key, $identification);
- return true;
- } catch (\Exception $e) {
- $t->rollBack();
- LockHelper::uLock($lock_key, $identification);
- return true;
- }
- }
- public static function exportHandle($data)
- {
- $download_id = $data['download_id'] ?? 0;
- $download = Download::findOne(['id' => $download_id]);
- if ($download) {
- try {
- $params = json_decode($download->params, true);
- $filename = $download->name;
- $type = $download->type;
- $fields = $params['fields'];
- $fields_arr = SecondaryCardRedemptionCode::getExportFields();
- $have_select_field_arr = [];
- foreach ($fields as $value) {
- $have_select_field_arr[] = $fields_arr[$value];
- }
- $csv = new CsvTool();
- $csv->filename = $filename;
- $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
- $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
- $csv->header = $have_select_field_arr;
- $params['order'] = 'id DESC';
- if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
- $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
- $params['order'] = $params['sort_column'] . ' ' . $sort_order;
- }
- $model = SecondaryCardRedemptionCode::find();
- $model->where(['mall_id' => $params['mall_id'], 'secondary_card_id' => $params['secondary_card_id'], 'status' => StatusEnum::ENABLED]);
- if (isset($params['is_use']) && $params['is_use'] !== '') {
- $model->andWhere(['is_use' => $params['is_use']]);
- }
- if (!empty($params['code'])) {
- $model->andWhere(['like', 'code', trim($params['code'])]);
- }
- if (!empty($params['remarks'])) {
- $model->andWhere(['like', 'remarks', trim($params['remarks'])]);
- }
- $model->with(['secondaryCard', 'secondaryCardOrder']);
- $model->orderBy('id DESC');
- if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
- $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
- $model->orderBy($params['sort_column'] . ' ' . $sort_order);
- }
- $mall_name = \Yii::$app->services->setting->mall->get($params['mall_id'], 'basic.name');
- foreach ($model->batch() as $list) {
- $o2o_store_ids = [];
- $o2o_store_list = [];
- foreach ($list as $item) {
- switch ($item['create_source_type']) {
- case 1:
- $o2o_store_ids[] = $item['create_source_id'];
- break;
- }
- }
- if (!empty($o2o_store_ids) && MallAddons::isInstall($params['mall_id'], 'Store')) {
- $o2o_store_list = SecondaryCardService::getO2OStoreList($o2o_store_ids);
- }
- $csv->data = array_map(function ($code_item) use ($fields, $o2o_store_list, $mall_name) {
- $row = [];
- //遍历所选字段
- foreach ($fields as $field) {
- if (in_array($field, ['use_time', 'created_at'])) {
- $row[] = !empty($code_item[$field]) ? date('Y-m-d H:i:s', $code_item[$field]) : '';
- } elseif (in_array($field, ['is_use'])) {
- $row[] = $code_item['is_use'] == 1 ? '已使用' : '未使用';
- } elseif (in_array($field, ['source'])) {
- $source_str = '';
- switch ($code_item['create_source_type']) {
- case 0:
- $source_str = $mall_name;
- break;
- case 1:
- $source_str = $o2o_store_list[$code_item['create_source_id']]['store_name'] ?? '';
- break;
- }
- $row[] = $source_str;
- } elseif (in_array($field, ['order_no'])) {
- $row[] = $code_item['secondaryCardOrder']['order_no'] ?? '';
- } else {
- $row[] = !empty($code_item[$field]) ? $code_item[$field] : '';
- }
- }
- return $row;
- }, $list);
- $csv->export();
- }
- $csv->updateDown($download, $params['mall_id']);
- return true;
- } catch (\Exception $e) {
- $download->status = 3;
- $res = $download->save();
- self::setStaticError($e->getMessage());
- return false;
- }
- }
- }
- public static function exportHandleSync($data)
- {
- try {
- $params = $data;
- $fields = $params['fields'];
- $fields_arr = SecondaryCardRedemptionCode::getExportFields();
- $have_select_field_arr = [];
- $post_fields_arr = explode(',', $fields);
- foreach ($post_fields_arr as $value) {
- $have_select_field_arr[] = $fields_arr[$value];
- }
- $csv = new CsvTool();
- $csv->export_mode = $data['export_mode'];
- $csv->filename = $data['filename'];
- $csv->export_mode = $data['export_mode'];
- $csv->header = $have_select_field_arr;
- $params['order'] = 'id DESC';
- if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
- $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
- $params['order'] = $params['sort_column'] . ' ' . $sort_order;
- }
- $model = SecondaryCardRedemptionCode::find();
- $model->where(['mall_id' => $params['mall_id'], 'secondary_card_id' => $params['secondary_card_id'], 'status' => StatusEnum::ENABLED]);
- if (isset($params['is_use']) && $params['is_use'] !== '') {
- $model->andWhere(['is_use' => $params['is_use']]);
- }
- if (!empty($params['code'])) {
- $model->andWhere(['code' => trim($params['code'])]);
- }
- if (!empty($params['remarks'])) {
- $model->andWhere(['remarks' => trim($params['remarks'])]);
- }
- $model->with(['secondaryCard', 'secondaryCardOrder']);
- $model->orderBy('id DESC');
- if (!empty($params['sort_column']) && !empty($params['sort_order'])) {
- $sort_order = $params['sort_order'] == 'ascending' ? 'asc' : 'desc';
- $model->orderBy($params['sort_column'] . ' ' . $sort_order);
- }
- $mall_name = \Yii::$app->services->setting->mall->get($params['mall_id'], 'basic.name');
- $list = $model->all();
- $o2o_store_ids = [];
- $o2o_store_list = [];
- foreach ($list as $item) {
- switch ($item['secondaryCard']['create_source_type']) {
- case 1:
- $o2o_store_ids[] = $item['create_source_id'];
- break;
- }
- }
- if (!empty($o2o_store_ids) && MallAddons::isInstall($params['mall_id'], 'Store')) {
- $o2o_store_list = SecondaryCardService::getO2OStoreList($o2o_store_ids);
- }
- foreach ($list as $code_item) {
- $row = [];
- //遍历所选字段
- foreach ($post_fields_arr as $field) {
- if (in_array($field, ['use_time', 'created_at'])) {
- $row[] = !empty($code_item[$field]) ? date('Y-m-d H:i:s', $code_item[$field]) : '';
- } elseif (in_array($field, ['is_use'])) {
- $row[] = $code_item['is_use'] == 1 ? '已使用' : '未使用';
- } elseif (in_array($field, ['source'])) {
- $source_str = '';
- switch ($code_item['secondaryCard']['create_source_type']) {
- case 0:
- $source_str = $mall_name;
- break;
- case 1:
- $source_str = $o2o_store_list[$code_item['secondaryCard']['create_source_id']]['store_name'] ?? '';
- break;
- }
- $row[] = $source_str;
- } elseif (in_array($field, ['order_no'])) {
- $row[] = $code_item['secondaryCardOrder']['order_no'] ?? '';
- } else {
- $row[] = !empty($code_item[$field]) ? $code_item[$field] : '';
- }
- }
- $data[] = $row;
- }
- $csv->data = $data;
- $csv->export();
- return true;
- } catch (\Exception $e) {
- self::setStaticError($e->getMessage());
- return false;
- }
- }
- public static function exchangeCode($params)
- {
- $lock_key = $params['code'];
- $identification = uniqid();
- $t = \Yii::$app->db->beginTransaction();
- try {
- if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new \Exception('当前访问人数过多');
- $where = [
- ['mall_id' => $params['mall_id']],
- ['code' => $params['code']],
- ['status' => StatusEnum::ENABLED],
- ];
- if (!empty($params['secondary_card_id'])) {
- $where[] = ['secondary_card_id' => $params['secondary_card_id']];
- }
- $model = SecondaryCardRedemptionCode::getOne($where, false);
- if (empty($model)) throw new \Exception('兑换码不存在');
- if (!empty($model['user_id'])) throw new \Exception('兑换码已被别人兑换');
- $secondary_card = SecondaryCard::getOne([['id' => $model['secondary_card_id'], 'mall_id' => $params['mall_id']]], false);
- if (empty($secondary_card)) throw new \Exception('次卡不存在');
- if (empty($secondary_card['is_on_sales'])) throw new \Exception('次卡已下架');
- $secondary_card->total_redemption += 1;
- $secondary_card->save();
- $time = time();
- if (!empty($secondary_card['sell_time_start']) && $time < $secondary_card['sell_time_start']) {
- throw new \Exception('次卡售卖时间还没开始');
- }
- if (!empty($secondary_card['sell_time_end']) && $time > $secondary_card['sell_time_end']) {
- $secondary_card->is_on_sales = 0;
- $secondary_card->save();
- throw new \Exception('次卡售卖时间已结束');
- }
- if ($secondary_card['expire_type'] == SecondaryCardEnum::EXPIRE_TYPE_APPOINT) {
- if (strtotime($secondary_card['end_at'] . ' 23:59:59') <= $secondary_card['sell_time_start']) {
- throw new \Exception('次卡的有效期结束时间小于次卡售卖的开始时间');
- }
- }
- $order_no = SecondaryCardOrder::getOrderNo();
- if ($order_no == false) {
- throw new \Exception('生成卡号失败');
- }
- $params['order_no'] = $order_no;
- $params['clerk_code'] = SecondaryCardOrderService::getClerkCode($params['mall_id']);
- $params['open_type'] = SecondaryCardEnum::OPEN_TYPE_EXCHANGE;
- $params['pay_money'] = 0;
- $params['start_time'] = SecondaryCardOrderService::getStartTime($secondary_card['expire_type'], $time, $secondary_card['begin_at']);
- $params['expire_time'] = SecondaryCardOrderService::getExpireTime($secondary_card['expire_type'], $time, $secondary_card['end_at'], $secondary_card['expire_day']);
- $params['open_time'] = $time;
- $params['verifiable_times'] = $secondary_card['verifiable_times'];
- $params['use_type'] = $secondary_card['use_type'];
- $params['secondary_card_id'] = $model['secondary_card_id'];
- $params['create_source_type'] = $model['create_source_type'];
- $params['create_source_id'] = $model['create_source_id'];
- $secondary_card_order = SecondaryCardOrder::setData($params);
- if (empty($secondary_card_order)) {
- throw new \Exception(SecondaryCardOrder::getStaticError());
- }
- $model->user_id = $params['user_id'];
- $model->is_use = SecondaryCardEnum::YES_USE;
- $model->use_time = $time;
- $model->order_no = $order_no;
- $model->save();
- LockHelper::uLock($lock_key, $identification);
- $t->commit();
- return ['order_id' => $secondary_card_order->id];
- } catch (\Exception $e) {
- LockHelper::uLock($lock_key, $identification);
- $t->rollBack();
- throw new \Exception($e->getMessage());
- }
- }
- }
|