$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()); } } }