From d93fbd78a2eec988d5c63b469471d17ab237c997 Mon Sep 17 00:00:00 2001 From: weigang Date: Mon, 10 Aug 2020 19:09:26 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E7=A4=BE=E5=8C=BA=E6=89=AB=E7=A0=81?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/CommunityController.php | 26 ++++++++ .../ValidatorFactoryResolvedListener.php | 66 +++++++++++++++++++ app/Model/ActivityBind.php | 34 ++++++++++ app/Request/CommunityBindRequest.php | 46 +++++++++++++ app/Service/CommunityService.php | 30 +++++++++ app/Service/CommunityServiceInterface.php | 9 +++ config/autoload/dependencies.php | 3 +- config/routes.php | 1 + 8 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 app/Controller/CommunityController.php create mode 100644 app/Model/ActivityBind.php create mode 100644 app/Request/CommunityBindRequest.php create mode 100644 app/Service/CommunityService.php create mode 100644 app/Service/CommunityServiceInterface.php diff --git a/app/Controller/CommunityController.php b/app/Controller/CommunityController.php new file mode 100644 index 0000000..0505272 --- /dev/null +++ b/app/Controller/CommunityController.php @@ -0,0 +1,26 @@ +communityService->bind($request->validated()); + return $this->success(['id' => $res->id]); + } + +} diff --git a/app/Listener/ValidatorFactoryResolvedListener.php b/app/Listener/ValidatorFactoryResolvedListener.php index 0bfb047..7423594 100644 --- a/app/Listener/ValidatorFactoryResolvedListener.php +++ b/app/Listener/ValidatorFactoryResolvedListener.php @@ -4,6 +4,7 @@ namespace App\Listener; use Hyperf\DbConnection\Db; use Hyperf\Event\Contract\ListenerInterface; +use Hyperf\HttpMessage\Upload\UploadedFile; use Hyperf\Validation\Contract\ValidatorFactoryInterface; use Hyperf\Validation\Event\ValidatorFactoryResolved; @@ -80,5 +81,70 @@ class ValidatorFactoryResolvedListener implements ListenerInterface return $builder->exists(); }); + // 注册了 base64 验证器规则 + $validatorFactory->extend('base64', function ($attribute, $value, $parameters, $validator) { + + preg_match('/^(data:\s*image\/(\w+);base64,)/', $value, $result); + + if (empty($result)) { + return false; + } + + if ( + in_array('image', $parameters) + && !in_array($result[2], ['jpg','jpeg','png','gif','svg','bmp']) + ) { + return false; + } + + return true; + + }); + + // 注册了 ext_not_in 验证器规则 + $validatorFactory->extend('ext_not_in', function ($attribute, $value, $parameters, $validator) { + + if (empty($parameters)) { + $parameters = ['', 'php', 'exe', 'sql', 'sh', 'bat', 'py', 'go', 'c', 'cpp']; + } + return !in_array($value->getExtension(), $parameters); + + }); + + // 注册了 file_different_if_file 验证器规则 + // file_different_if_file:field 两文件字段不能是同一个文件 + $validatorFactory->extend('file_different_if_file', function ($attribute, $value, $parameters, $validator) { + + // 获取比较字段参数值 + $anotherFile = $validator->getData()[$parameters[0]]; + if (!($value instanceof UploadedFile && $anotherFile instanceof UploadedFile)) { + return true; + } + return md5_file($value->getRealPath()) !== md5_file($anotherFile->getRealPath()); + + }); + + // 注册了 tel 验证器规则 + // 手机号码验证器 + $validatorFactory->extend('tel', function ($attribute, $value, $parameters, $validator) { + return boolval(preg_match('/^1[3-9]\d{9}$/', $value)); + }); + + // 注册了 image_if_file 验证器规则 + // 如果是文件就必须是图片类型的 + $validatorFactory->extend('image_if_file', function ($attribute, $value, $parameters, $validator) { + + if (!($value instanceof UploadedFile)) { + return true; + } + + $rules = $validator->getRules(); + $rules[$attribute] = ['image']; + $validator->setRules($rules); + + return $validator->passes(); + + }); + } } \ No newline at end of file diff --git a/app/Model/ActivityBind.php b/app/Model/ActivityBind.php new file mode 100644 index 0000000..2f4dda0 --- /dev/null +++ b/app/Model/ActivityBind.php @@ -0,0 +1,34 @@ +attributes['json_data'] = json_encode(json_decode($value, true)); + } + +} \ No newline at end of file diff --git a/app/Request/CommunityBindRequest.php b/app/Request/CommunityBindRequest.php new file mode 100644 index 0000000..e207452 --- /dev/null +++ b/app/Request/CommunityBindRequest.php @@ -0,0 +1,46 @@ + 'required|nonempty', + 'source_id' => 'required|nonempty', + 'user_id' => 'required|nonempty|exists_enable:ims_cjdc_user,id', + 'json_data' => 'json', + ]; + } + + public function messages(): array + { + return [ + '*.nonempty' => ':attribute参数异常', + 'user_id.exists_enable' => '用户不存在', + ]; + } + + public function attributes(): array + { + return [ + + ]; + } +} diff --git a/app/Service/CommunityService.php b/app/Service/CommunityService.php new file mode 100644 index 0000000..6332750 --- /dev/null +++ b/app/Service/CommunityService.php @@ -0,0 +1,30 @@ +isBinded($data['bind_type'], $data['source_id'], $data['user_id'])) { + return $res; + } + return ActivityBind::query()->updateOrCreate( + ['bind_type' => $data['bind_type'], 'source_id' => $data['source_id'], 'user_id' => $data['user_id']], + ['json_data' => $data['json_data']] + ); + } + + public function isBinded($bind_type, $source_id, $user_id) + { + return ActivityBind::query() + ->select('id') + ->where(['bind_type' => $bind_type, 'source_id' => $source_id, 'user_id' => $user_id]) + ->first(); + } +} \ No newline at end of file diff --git a/app/Service/CommunityServiceInterface.php b/app/Service/CommunityServiceInterface.php new file mode 100644 index 0000000..de7f29d --- /dev/null +++ b/app/Service/CommunityServiceInterface.php @@ -0,0 +1,9 @@ + \App\Service\ServiceEvaluateService::class + \App\Service\ServiceEvaluateServiceInterface::class => \App\Service\ServiceEvaluateService::class, + \App\Service\CommunityServiceInterface::class => \App\Service\CommunityService::class, ]; diff --git a/config/routes.php b/config/routes.php index 706a9ab..a5c4985 100644 --- a/config/routes.php +++ b/config/routes.php @@ -23,4 +23,5 @@ Router::addGroup('/v1/',function (){ Router::post('ServiceEvaluate/isPersonnel', 'App\Controller\ServiceEvaluateController@isPersonnel'); Router::post('ServiceEvaluate/getPersonnelInfo', 'App\Controller\ServiceEvaluateController@getPersonnelInfo'); Router::post('ServiceEvaluate/getEvaluateList', 'App\Controller\ServiceEvaluateController@getEvaluateList'); + Router::post('Community/bind', 'App\Controller\CommunityController@bind'); }); \ No newline at end of file From e7caeaf4bd309df8cddd7974b54034ad469eb383 Mon Sep 17 00:00:00 2001 From: weigang Date: Tue, 11 Aug 2020 10:42:47 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Middleware/Auth/ApiMiddleware.php | 2 +- app/Model/{ActivityBind.php => UserRelationBind.php} | 4 ++-- app/Service/CommunityService.php | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename app/Model/{ActivityBind.php => UserRelationBind.php} (86%) diff --git a/app/Middleware/Auth/ApiMiddleware.php b/app/Middleware/Auth/ApiMiddleware.php index ce06bff..44cf3fc 100644 --- a/app/Middleware/Auth/ApiMiddleware.php +++ b/app/Middleware/Auth/ApiMiddleware.php @@ -39,7 +39,7 @@ class ApiMiddleware implements MiddlewareInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - if (env('APP_ENV') == 'dev') { + if (env('APP_ENV') == 'dev' || env('APP_ENV') == 'local') { return $handler->handle($request); } diff --git a/app/Model/ActivityBind.php b/app/Model/UserRelationBind.php similarity index 86% rename from app/Model/ActivityBind.php rename to app/Model/UserRelationBind.php index 2f4dda0..1265197 100644 --- a/app/Model/ActivityBind.php +++ b/app/Model/UserRelationBind.php @@ -5,14 +5,14 @@ namespace App\Model; /** */ -class ActivityBind extends Model +class UserRelationBind extends Model { /** * The table associated with the model. * * @var string */ - protected $table = 'lanzu_activity_bind'; + protected $table = 'lanzu_user_relation_bind'; /** * The attributes that are mass assignable. * diff --git a/app/Service/CommunityService.php b/app/Service/CommunityService.php index 6332750..1b5aa2e 100644 --- a/app/Service/CommunityService.php +++ b/app/Service/CommunityService.php @@ -4,7 +4,7 @@ namespace App\Service; -use App\Model\ActivityBind; +use App\Model\UserRelationBind; class CommunityService implements CommunityServiceInterface { @@ -14,7 +14,7 @@ class CommunityService implements CommunityServiceInterface if ($res = $this->isBinded($data['bind_type'], $data['source_id'], $data['user_id'])) { return $res; } - return ActivityBind::query()->updateOrCreate( + return UserRelationBind::query()->updateOrCreate( ['bind_type' => $data['bind_type'], 'source_id' => $data['source_id'], 'user_id' => $data['user_id']], ['json_data' => $data['json_data']] ); @@ -22,7 +22,7 @@ class CommunityService implements CommunityServiceInterface public function isBinded($bind_type, $source_id, $user_id) { - return ActivityBind::query() + return UserRelationBind::query() ->select('id') ->where(['bind_type' => $bind_type, 'source_id' => $source_id, 'user_id' => $user_id]) ->first(); From 605ace63c986ad45e7c77c3be8c03c5ddb7484be Mon Sep 17 00:00:00 2001 From: weigang Date: Tue, 11 Aug 2020 11:27:47 +0800 Subject: [PATCH 03/18] fix --- app/Model/UserRelationBind.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Model/UserRelationBind.php b/app/Model/UserRelationBind.php index 1265197..f14f029 100644 --- a/app/Model/UserRelationBind.php +++ b/app/Model/UserRelationBind.php @@ -28,7 +28,7 @@ class UserRelationBind extends Model public function setJsonDataAttribute($value) { - $this->attributes['json_data'] = json_encode(json_decode($value, true)); + $this->attributes['json_data'] = $value ? json_encode(json_decode($value, true)) : ''; } } \ No newline at end of file From b2b021c80b4d54894d3f3a17c60f68b68f50b47f Mon Sep 17 00:00:00 2001 From: weigang Date: Wed, 19 Aug 2020 11:46:43 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E7=A4=BE=E5=8C=BA=E7=82=B9=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=BB=91=E5=AE=9A=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=9A=E7=94=A8=E6=88=B7=E5=8F=AA=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/CommunityController.php | 10 ++-- app/Model/UserRelationBind.php | 6 +++ app/Request/CommunityBindRequest.php | 1 - app/Service/CommunityService.php | 30 ------------ app/Service/CommunityServiceInterface.php | 9 ---- app/Service/UserCommunityBindService.php | 35 ++++++++++++++ .../UserRelationBindServiceInterface.php | 48 +++++++++++++++++++ config/autoload/dependencies.php | 2 +- config/routes.php | 1 - 9 files changed, 96 insertions(+), 46 deletions(-) delete mode 100644 app/Service/CommunityService.php delete mode 100644 app/Service/CommunityServiceInterface.php create mode 100644 app/Service/UserCommunityBindService.php create mode 100644 app/Service/UserRelationBindServiceInterface.php diff --git a/app/Controller/CommunityController.php b/app/Controller/CommunityController.php index 0505272..0caa660 100644 --- a/app/Controller/CommunityController.php +++ b/app/Controller/CommunityController.php @@ -4,8 +4,9 @@ declare(strict_types=1); namespace App\Controller; +use App\Model\UserRelationBind; use App\Request\CommunityBindRequest; -use App\Service\CommunityServiceInterface; +use App\Service\UserRelationBindServiceInterface; use Hyperf\Di\Annotation\Inject; class CommunityController extends BaseController @@ -13,13 +14,14 @@ class CommunityController extends BaseController /** * @Inject - * @var CommunityServiceInterface + * @var UserRelationBindServiceInterface */ - protected $communityService; + protected $userCommunityService; public function bind(CommunityBindRequest $request) { - $res = $this->communityService->bind($request->validated()); + $data = $request->validated(); + $res = $this->userCommunityService->bindLimitByUser(UserRelationBind::BIND_TYPE_COMMUNITY, $data['source_id'], $data['user_id'], $data['json_data']); return $this->success(['id' => $res->id]); } diff --git a/app/Model/UserRelationBind.php b/app/Model/UserRelationBind.php index f14f029..cf6615d 100644 --- a/app/Model/UserRelationBind.php +++ b/app/Model/UserRelationBind.php @@ -7,6 +7,12 @@ namespace App\Model; */ class UserRelationBind extends Model { + + /** + * 社区服务点类型 + */ + const BIND_TYPE_COMMUNITY = 1; + /** * The table associated with the model. * diff --git a/app/Request/CommunityBindRequest.php b/app/Request/CommunityBindRequest.php index e207452..6fe4841 100644 --- a/app/Request/CommunityBindRequest.php +++ b/app/Request/CommunityBindRequest.php @@ -22,7 +22,6 @@ class CommunityBindRequest extends FormRequest public function rules(): array { return [ - 'bind_type' => 'required|nonempty', 'source_id' => 'required|nonempty', 'user_id' => 'required|nonempty|exists_enable:ims_cjdc_user,id', 'json_data' => 'json', diff --git a/app/Service/CommunityService.php b/app/Service/CommunityService.php deleted file mode 100644 index 1b5aa2e..0000000 --- a/app/Service/CommunityService.php +++ /dev/null @@ -1,30 +0,0 @@ -isBinded($data['bind_type'], $data['source_id'], $data['user_id'])) { - return $res; - } - return UserRelationBind::query()->updateOrCreate( - ['bind_type' => $data['bind_type'], 'source_id' => $data['source_id'], 'user_id' => $data['user_id']], - ['json_data' => $data['json_data']] - ); - } - - public function isBinded($bind_type, $source_id, $user_id) - { - return UserRelationBind::query() - ->select('id') - ->where(['bind_type' => $bind_type, 'source_id' => $source_id, 'user_id' => $user_id]) - ->first(); - } -} \ No newline at end of file diff --git a/app/Service/CommunityServiceInterface.php b/app/Service/CommunityServiceInterface.php deleted file mode 100644 index de7f29d..0000000 --- a/app/Service/CommunityServiceInterface.php +++ /dev/null @@ -1,9 +0,0 @@ -updateOrCreate( + ['bind_type' => $bind_type, 'user_id' => $user_id], + ['source_id' => $source_id, 'json_data' => $extra_data] + ); + } + + public function bindLimitBySource($bind_type, $source_id, $user_id, $extra_data) + { + // TODO: Implement bindLimitBySource() method. + } + + public function bind($bind_type, $source_id, $user_id, $extra_data) + { + // TODO: Implement bind() method. + } + + public function isBinded($bind_type, $source_id, $user_id) + { + // TODO: Implement isBinded() method. + } +} \ No newline at end of file diff --git a/app/Service/UserRelationBindServiceInterface.php b/app/Service/UserRelationBindServiceInterface.php new file mode 100644 index 0000000..33eccc3 --- /dev/null +++ b/app/Service/UserRelationBindServiceInterface.php @@ -0,0 +1,48 @@ + \App\Service\FeiePrintService::class, \App\Service\MiniprogramServiceInterface::class => \App\Service\MiniprogramService::class, \App\Service\UserServiceInterface::class => \App\Service\UserService::class, - \App\Service\CommunityServiceInterface::class => \App\Service\CommunityService::class, + \App\Service\UserRelationBindServiceInterface::class => \App\Service\UserCommunityBindService::class, ]; diff --git a/config/routes.php b/config/routes.php index 3146d21..b68b0e4 100644 --- a/config/routes.php +++ b/config/routes.php @@ -54,7 +54,6 @@ Router::addGroup('/v1/',function (){ //小程序支付相关 Router::post('wxminipay/online', 'App\Controller\PaymentController@wxminiPayOnline'); Router::post('wxminipay/offline', 'App\Controller\PaymentController@wxminiPayOffline'); - Router::post('Community/bind', 'App\Controller\CommunityController@bind'); },['middleware' => [\App\Middleware\Auth\ApiMiddleware::class]]); Router::addGroup('/wechat/',function () { From cbb94cc7141250aa325d914b6645e57acb81c1ae Mon Sep 17 00:00:00 2001 From: weigang Date: Thu, 20 Aug 2020 19:07:56 +0800 Subject: [PATCH 05/18] =?UTF-8?q?=E7=A4=BE=E5=8C=BA=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=82=B9=E5=88=86=E8=B4=A6=E4=BB=A5=E5=8F=8A=E5=88=86=E8=B4=A6?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Amqp/Consumer/couponRebateConsumer.php | 3 + app/Constants/ErrorCode.php | 5 + app/Constants/LogLabel.php | 5 + app/Controller/NotifyController.php | 2 +- app/JsonRpc/OrderService.php | 33 +++++ app/JsonRpc/OrderServiceInterface.php | 8 ++ app/Model/FinancialRecord.php | 89 +++++++++++++ app/Model/Model.php | 12 ++ app/Service/FinancialRecordService.php | 122 ++++++++++++++++++ .../FinancialRecordServiceInterface.php | 62 +++++++++ app/Service/SeparateAccountsService.php | 104 +++++++++++++++ .../SeparateAccountsServiceInterface.php | 28 ++++ app/Service/UserService.php | 2 +- app/Service/UserServiceInterface.php | 2 +- composer.json | 6 +- config/autoload/dependencies.php | 4 + config/autoload/server.php | 10 ++ 17 files changed, 493 insertions(+), 4 deletions(-) create mode 100644 app/JsonRpc/OrderService.php create mode 100644 app/JsonRpc/OrderServiceInterface.php create mode 100644 app/Model/FinancialRecord.php create mode 100644 app/Service/FinancialRecordService.php create mode 100644 app/Service/FinancialRecordServiceInterface.php create mode 100644 app/Service/SeparateAccountsService.php create mode 100644 app/Service/SeparateAccountsServiceInterface.php diff --git a/app/Amqp/Consumer/couponRebateConsumer.php b/app/Amqp/Consumer/couponRebateConsumer.php index a76f046..3417e2a 100644 --- a/app/Amqp/Consumer/couponRebateConsumer.php +++ b/app/Amqp/Consumer/couponRebateConsumer.php @@ -37,6 +37,9 @@ class couponRebateConsumer extends ConsumerMessage public function isEnable(): bool { + if(env('APP_ENV') == 'local') { + return false; + } return parent::isEnable(); } } diff --git a/app/Constants/ErrorCode.php b/app/Constants/ErrorCode.php index ca97510..62811c0 100644 --- a/app/Constants/ErrorCode.php +++ b/app/Constants/ErrorCode.php @@ -54,4 +54,9 @@ class ErrorCode extends AbstractConstants */ const PAY_FAILURE = 400; + /** + * @Message("Separate Accounts Error!") + */ + const SEPARATE_ACCOUNTS_ERROR = 700; + } diff --git a/app/Constants/LogLabel.php b/app/Constants/LogLabel.php index edcb57c..fe2253c 100644 --- a/app/Constants/LogLabel.php +++ b/app/Constants/LogLabel.php @@ -33,4 +33,9 @@ class LogLabel extends AbstractConstants * @Message("Order Log Label") */ const ORDER_LOG = 'order_log'; + + /** + * @Message("Separate Accounts Log Label") + */ + const SEPARATE_ACCOUNTS_LOG = 'separate_accounts_log'; } diff --git a/app/Controller/NotifyController.php b/app/Controller/NotifyController.php index 955db3f..2a8b094 100644 --- a/app/Controller/NotifyController.php +++ b/app/Controller/NotifyController.php @@ -332,7 +332,7 @@ class NotifyController extends BaseController StoreAccount::query()->insert(array_merge($recordBase, $record)); // 平台新用户奖励给商户 - $isStageNewUser = $this->userService->isStageNewUser($orderItem['user_id'], $orderMain->id); + $isStageNewUser = $this->userService->isPlatformNewUser($orderItem['user_id'], $orderMain->id); $needAward = false; $awardAmount = 0; if ($isStageNewUser) { diff --git a/app/JsonRpc/OrderService.php b/app/JsonRpc/OrderService.php new file mode 100644 index 0000000..6c25b92 --- /dev/null +++ b/app/JsonRpc/OrderService.php @@ -0,0 +1,33 @@ +separateAccService->orderOnlineCompleted($global_order_id); + return [ + "status" => 200, + "code" => $data ? 0 : ErrorCode::SEPARATE_ACCOUNTS_ERROR, + "result" => [], + "message" => $data ? '调用成功' : ErrorCode::getMessage(ErrorCode::SEPARATE_ACCOUNTS_ERROR) + ]; + } + +} \ No newline at end of file diff --git a/app/JsonRpc/OrderServiceInterface.php b/app/JsonRpc/OrderServiceInterface.php new file mode 100644 index 0000000..6292ffe --- /dev/null +++ b/app/JsonRpc/OrderServiceInterface.php @@ -0,0 +1,8 @@ +50是分账 + * + * MONEY_TYPE_PLAT_NEW_USER + * 社区服务点新用户奖励(线上订单完成) / 1 + * + * MONEY_TYPE_FIRST_ORDER + * 社区服务点新用户线上首单奖励(线上订单完成) / 2 + * + * MONEY_TYPE_OL_ORDER + * 社区服务点用户线上订单分账(线上订单完成) / 51 + */ + const MONEY_TYPE_PLAT_NEW_USER = 1; + const MONEY_TYPE_FIRST_ORDER = 2; + const MONEY_TYPE_OL_ORDER = 51; + + /** + * 状态 + */ + const STATUS_NORMAL = 1; + const STATUS_ABNORMAL = 2; + + /** + * The table associated with the model. + * + * @var string + */ + protected $table = 'lanzu_financial_record'; + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'user_id', + 'user_type', + 'money', + 'money_type', + 'source_id', + 'source_type', + 'desc', + 'comment', + 'status', + ]; + /** + * The attributes that should be cast to native types. + * + * @var array + */ + protected $casts = []; +} \ No newline at end of file diff --git a/app/Model/Model.php b/app/Model/Model.php index f606652..fa03395 100644 --- a/app/Model/Model.php +++ b/app/Model/Model.php @@ -19,4 +19,16 @@ abstract class Model extends BaseModel implements CacheableInterface { use Cacheable; protected $dateFormat = 'U'; + + /** + * 设置表后缀 + * @param string $suffix + * @return $this + */ + public function suffix($suffix = ''): Model + { + $tableName = $this->getTable(); + $this->setTable($tableName.'_'.$suffix); + return $this; + } } diff --git a/app/Service/FinancialRecordService.php b/app/Service/FinancialRecordService.php new file mode 100644 index 0000000..061e297 --- /dev/null +++ b/app/Service/FinancialRecordService.php @@ -0,0 +1,122 @@ +record( + $user_id, + [ + 'user_id' => $user_id, + 'user_type' => $user_type, + 'money' => $money, + 'money_type' => $money_type, + 'source_id' => $source_id, + 'source_type' => $source_type, + 'desc' => $desc, + 'comment' => $comment, + 'status' => FinancialRecord::STATUS_NORMAL, + ] + ); + + $this->ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment); + } + + /** + * @inheritDoc + */ + public function communityAwardByPlatNewUserFirstOLOrder($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=1, $desc='新用户首单奖励', $comment='') + { + $this->record( + $user_id, + [ + 'user_id' => $user_id, + 'user_type' => $user_type, + 'money' => $money, + 'money_type' => $money_type, + 'source_id' => $source_id, + 'source_type' => $source_type, + 'desc' => $desc, + 'comment' => $comment, + 'status' => FinancialRecord::STATUS_NORMAL, + ] + ); + + $this->ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment); + } + + /** + * @inheritDoc + */ + public function communitySeparateAccountsByOrderComp($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=2, $desc='用户订单分成', $comment='') + { + $this->record( + $user_id, + [ + 'user_id' => $user_id, + 'user_type' => $user_type, + 'money' => $money, + 'money_type' => $money_type, + 'source_id' => $source_id, + 'source_type' => $source_type, + 'desc' => $desc, + 'comment' => $comment, + 'status' => FinancialRecord::STATUS_NORMAL, + ] + ); + + $this->ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment); + } + + public function ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment='') + { + return $this->record( + FinancialRecord::ACCOUNT_LEDGER, + [ + 'user_id' => FinancialRecord::ACCOUNT_LEDGER, + 'user_type' => FinancialRecord::USER_TYPE_LEDGER, + 'money' => $money, + 'money_type' => $money_type, + 'source_id' => $source_id, + 'source_type' => $source_type, + 'desc' => $desc, + 'comment' => $comment, + 'status' => FinancialRecord::STATUS_NORMAL, + ], + true + ); + } + + public function record($user_id, $record, $isLedger=false) + { + $financialRecord = new FinancialRecord(); + + if (!$isLedger) { + $mod = bcmod((string)$user_id, '5', 0); + $financialRecord->suffix($mod); + } + + return $financialRecord->fill( + [ + 'user_id' => $user_id, + 'user_type' => $record['user_type'], + 'money' => $record['money'], + 'money_type' => $record['money_type'], + 'source_id' => $record['source_id'], + 'source_type' => $record['source_type'], + 'desc' => $record['desc'], + 'comment' => $record['comment'], + 'status' => $record['status'], + ] + )->save(); + + } +} \ No newline at end of file diff --git a/app/Service/FinancialRecordServiceInterface.php b/app/Service/FinancialRecordServiceInterface.php new file mode 100644 index 0000000..4078043 --- /dev/null +++ b/app/Service/FinancialRecordServiceInterface.php @@ -0,0 +1,62 @@ +where(['global_order_id' => $global_order_id]) + ->whereIn('state', [OrderMain::ORDER_STATE_COMPLETE,OrderMain::ORDER_STATE_EVALUATED,OrderMain::ORDER_STATE_UNREFUND]) + ->first(); + + if (empty($orderMain)) { + return; + } + + Db::beginTransaction(); + try { + + // =======社区服务点分账 / Start======= + // 前提:用户线上下单并且订单完成 + // 奖励规则A:用户是平台新用户,奖励社区服务点平台新用户奖励x元+平台新用户首单奖励y元+订单商品金额z%的分成 + // 奖励规则B:用户是非新用户,奖励社区服务点订单实际支付金额z%的分成 + // =======社区服务点分账 / Start======= + + // 奖励/分账金额 TODO 届时查询出来一个配置 + $award = ['new_user' => 1, 'first_order' => 2, 'separate_rate' => 2]; + + // 当前用户的社区服务点绑定关系 + $communityBind = UserRelationBind::query() + ->where(['bind_type' => UserRelationBind::BIND_TYPE_COMMUNITY, 'user_id' => $orderMain->user_id]) + ->first(); + + // 平台新用户 + if ($this->userService->isPlatformNewUser($orderMain->user_id, $orderMain->id)) { + $this->financialRecordService->communityAwardByPlatNewUser($communityBind->source_id, $orderMain->global_order_id, $award['new_user']); + $this->financialRecordService->communityAwardByPlatNewUserFirstOLOrder($communityBind->source_id, $orderMain->global_order_id, $award['first_order']); + } + + // 账单分成 + $money = bcmul($orderMain->money, bcdiv($award['separate_rate'], 100, 6), 2); + $this->financialRecordService->communitySeparateAccountsByOrderComp($communityBind->source_id, $orderMain->global_order_id, $money); + + // =======社区服务点分账 / End======= + + Db::commit(); + return true; + + } catch (\Exception $e) { + + $this->log->event(LogLabel::SEPARATE_ACCOUNTS_LOG, ['exception' => $e->getMessage(), 'order_main' => json_encode($orderMain)]); + Db::rollBack(); + return false; + } + + } + + /** + * @inheritDoc + */ + public function orderOfflinePaid($global_order_id) + { + // TODO: Implement orderOfflinePaid() method. + } +} \ No newline at end of file diff --git a/app/Service/SeparateAccountsServiceInterface.php b/app/Service/SeparateAccountsServiceInterface.php new file mode 100644 index 0000000..c574735 --- /dev/null +++ b/app/Service/SeparateAccountsServiceInterface.php @@ -0,0 +1,28 @@ +where(['user_id' => $user_id]) diff --git a/app/Service/UserServiceInterface.php b/app/Service/UserServiceInterface.php index 2920d53..1e8f0fb 100644 --- a/app/Service/UserServiceInterface.php +++ b/app/Service/UserServiceInterface.php @@ -12,7 +12,7 @@ interface UserServiceInterface * @param $order_main_id * @return mixed */ - public function isStageNewUser($user_id, $order_main_id): bool; + public function isPlatformNewUser($user_id, $order_main_id): bool; public function saveUserUnionid($openid,$unionid); diff --git a/composer.json b/composer.json index 284593c..4cfe0dd 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,11 @@ "alibabacloud/iot": "^1.8", "hyperf/snowflake": "^2.0", "ext-bcmath": "*", - "overtrue/wechat": "~4.0" + "overtrue/wechat": "~4.0", + "hyperf/json-rpc": "^2.0", + "hyperf/rpc-server": "^2.0", + "hyperf/rpc-client": "^2.0", + "hyperf/consul": "^2.0" }, "require-dev": { "swoole/ide-helper": "^4.5", diff --git a/config/autoload/dependencies.php b/config/autoload/dependencies.php index a9ee1fb..760f9d0 100644 --- a/config/autoload/dependencies.php +++ b/config/autoload/dependencies.php @@ -27,4 +27,8 @@ return [ \App\Service\MiniprogramServiceInterface::class => \App\Service\MiniprogramService::class, \App\Service\UserServiceInterface::class => \App\Service\UserService::class, \App\Service\UserRelationBindServiceInterface::class => \App\Service\UserCommunityBindService::class, + \Hyperf\JsonRpc\JsonRpcTransporter::class => \Hyperf\JsonRpc\JsonRpcPoolTransporter::class, + \App\JsonRpc\OrderServiceInterface::class => \App\JsonRpc\OrderService::class, + \App\Service\FinancialRecordServiceInterface::class => \App\Service\FinancialRecordService::class, + \App\Service\SeparateAccountsServiceInterface::class => \App\Service\SeparateAccountsService::class, ]; diff --git a/config/autoload/server.php b/config/autoload/server.php index f44b083..1418f3a 100644 --- a/config/autoload/server.php +++ b/config/autoload/server.php @@ -25,6 +25,16 @@ return [ SwooleEvent::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'], ], ], + [ + 'name' => 'jsonrpc-http', + 'type' => Server::SERVER_HTTP, + 'host' => '0.0.0.0', + 'port' => 9505, + 'sock_type' => SWOOLE_SOCK_TCP, + 'callbacks' => [ + SwooleEvent::ON_REQUEST => [\Hyperf\JsonRpc\HttpServer::class, 'onRequest'], + ], + ], ], 'settings' => [ 'enable_coroutine' => true, From 9b06c4ffa2b4c44998b251f3036b3877bc1306e6 Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 21 Aug 2020 10:28:05 +0800 Subject: [PATCH 06/18] =?UTF-8?q?=E5=8E=BB=E6=8E=89ordernum=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Request/OrderOnlineRequest.php | 1 - app/Service/OrderService.php | 21 +++++++++------------ app/Service/OrderServiceInterface.php | 4 ++-- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/app/Request/OrderOnlineRequest.php b/app/Request/OrderOnlineRequest.php index 019cc99..b02144f 100644 --- a/app/Request/OrderOnlineRequest.php +++ b/app/Request/OrderOnlineRequest.php @@ -20,7 +20,6 @@ class OrderOnlineRequest extends BaseFormRequest public function rules(): array { return [ - 'order_num' => 'nonempty', 'delivery_no' => '', 'dada_fee' => 'nonempty', 'market_id' => 'required|nonempty|integer', diff --git a/app/Service/OrderService.php b/app/Service/OrderService.php index 3eab4a9..10a9936 100644 --- a/app/Service/OrderService.php +++ b/app/Service/OrderService.php @@ -40,17 +40,14 @@ class OrderService implements OrderServiceInterface { bcscale(6); - - // 订单判重 $dataMain = $data; - if ($orderMainId = $this->existsByOrderNum($data['order_num'])) { - return $orderMainId; - } - Db::beginTransaction(); try { + // TODO 这个字段后续可能不用了,之前由达达订单号从前端传上来 + $dataMain['order_num'] = 'o'.date('YmdHis').mt_rand(1000,9999); + // 计算当前订单可用红包优惠金额 $couponMoney = 0; $receiveCouponIds = []; @@ -403,7 +400,7 @@ class OrderService implements OrderServiceInterface 'code' => $globalRrderId, 'jj_note' => '', 'uniacid' => 2, - 'order_num' => 'dm'.date('YmdHis', time()) . rand(1111, 9999), + 'order_num' => 'dm'.date('YmdHis') . mt_rand(1000, 9999), 'money' => $data['money'], 'user_id' => $data['user_id'], 'store_ids' => $data['store_id'], @@ -417,7 +414,7 @@ class OrderService implements OrderServiceInterface // 子订单模型保存 $dataChild = [ 'uniacid' => 1, - 'order_num' => 's'.date('YmdHis', time()) . rand(1111, 9999), + 'order_num' => 's'.date('YmdHis') . mt_rand(1000, 9999), 'user_id' => $orderMain->user_id, 'store_id' => $data['store_id'], 'order_main_id' => $orderMainId, @@ -526,11 +523,11 @@ class OrderService implements OrderServiceInterface /** * 订单是否存在 - * @param $orderNum - * @return \Hyperf\Utils\HigherOrderTapProxy|mixed|void|null + * @param $global_order_id + * @return mixed|void|null */ - public function existsByOrderNum($orderNum) + public function existsByGlobalOrderId($global_order_id) { - return OrderMain::query()->where(['order_num' => $orderNum])->value('id'); + return OrderMain::query()->where(['order_num' => $global_order_id])->value('id'); } } \ No newline at end of file diff --git a/app/Service/OrderServiceInterface.php b/app/Service/OrderServiceInterface.php index 0d5e0a2..f059a31 100644 --- a/app/Service/OrderServiceInterface.php +++ b/app/Service/OrderServiceInterface.php @@ -21,9 +21,9 @@ interface OrderServiceInterface /** * 订单是否已经存在 - * @param $orderNum + * @param $global_order_id * @return mixed */ - public function existsByOrderNum($orderNum); + public function existsByGlobalOrderId($global_order_id); } \ No newline at end of file From 9daf4f9c3c227ec53db8340b71924d9b8073a36d Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 21 Aug 2020 10:28:58 +0800 Subject: [PATCH 07/18] Fix --- app/Service/OrderServiceInterface.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Service/OrderServiceInterface.php b/app/Service/OrderServiceInterface.php index f059a31..4fa6657 100644 --- a/app/Service/OrderServiceInterface.php +++ b/app/Service/OrderServiceInterface.php @@ -15,6 +15,7 @@ interface OrderServiceInterface /** * 线下订单下单 * 扫码支付 + * @param $data * @return mixed */ public function addOfflineOrder($data); From 7452ec5167bb87d3bd1b51e1fc0878fbf16b5950 Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 21 Aug 2020 15:52:31 +0800 Subject: [PATCH 08/18] =?UTF-8?q?=E7=A4=BE=E5=8C=BA=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=82=B9=E5=88=86=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Constants/LogLabel.php | 5 +++ app/Controller/NotifyController.php | 33 +++-------------- app/Controller/PaymentController.php | 3 +- app/JsonRpc/OrderService.php | 49 +++++++++++++++++++++---- app/Model/OrderMain.php | 2 + app/Model/ServiceReward.php | 33 +++++++++++++++++ app/Service/FinancialRecordService.php | 6 +-- app/Service/OrderService.php | 48 ++++++++++++++++++++---- app/Service/OrderServiceInterface.php | 6 +++ app/Service/SeparateAccountsService.php | 32 ++++++++++------ 10 files changed, 159 insertions(+), 58 deletions(-) create mode 100644 app/Model/ServiceReward.php diff --git a/app/Constants/LogLabel.php b/app/Constants/LogLabel.php index fe2253c..04b91be 100644 --- a/app/Constants/LogLabel.php +++ b/app/Constants/LogLabel.php @@ -38,4 +38,9 @@ class LogLabel extends AbstractConstants * @Message("Separate Accounts Log Label") */ const SEPARATE_ACCOUNTS_LOG = 'separate_accounts_log'; + + /** + * @Message("Online Order Complete Log Label") + */ + const ONLINE_COMPLETE_LOG = 'online_complete_log'; } diff --git a/app/Controller/NotifyController.php b/app/Controller/NotifyController.php index 2a8b094..8376952 100644 --- a/app/Controller/NotifyController.php +++ b/app/Controller/NotifyController.php @@ -187,27 +187,14 @@ class NotifyController extends BaseController // 喇叭通知,兼容旧音响,MQTT+IOT $res = $this->mqttSpeakerService->speakToStore($orderMain->id); - $this->log->event( - LogLabel::PAY_NOTIFY_WXMINI, - ['fail_mqtt' => json_encode($res)] - ); $res = $this->deviceService->pubMsgToStoreByOrderMainId($orderMain->id); - $this->log->event( - LogLabel::PAY_NOTIFY_WXMINI, - ['fail_device' => json_encode($res)] - ); + // 公众号模板消息 $res = $this->miniprogramService->sendTemMsgForOnlineOrder($orderMain->id); - $this->log->event( - LogLabel::PAY_NOTIFY_WXMINI, - ['fail_mini' => json_encode($res)] - ); + // 打印订单,自动打印 TODO 后续优化调用逻辑 $res = $this->feiePrintService->feiePrint($orderMain->global_order_id); - $this->log->event( - LogLabel::PAY_NOTIFY_WXMINI, - ['fail_feie' => json_encode($res)] - ); + Db::commit(); return true; @@ -375,21 +362,11 @@ class NotifyController extends BaseController // 喇叭通知,兼容旧音响,MQTT+IOT $res = $this->mqttSpeakerService->speakToStore($orderMain->id); - $this->log->event( - LogLabel::PAY_NOTIFY_WXMINI, - ['fail_mqtt' => json_encode($res)] - ); $res = $this->deviceService->pubMsgToStoreByOrderMainId($orderMain->id); - $this->log->event( - LogLabel::PAY_NOTIFY_WXMINI, - ['fail_device' => json_encode($res)] - ); + // 公众号模板消息 $res = $this->miniprogramService->sendTemMsgForOfflineOrder($orderMain->id); - $this->log->event( - LogLabel::PAY_NOTIFY_WXMINI, - ['fail_mini' => json_encode($res)] - ); + Db::commit(); return true; diff --git a/app/Controller/PaymentController.php b/app/Controller/PaymentController.php index b2c6fba..9fc92ae 100644 --- a/app/Controller/PaymentController.php +++ b/app/Controller/PaymentController.php @@ -33,7 +33,8 @@ class PaymentController extends BaseController $result = $app->order->unify([ 'body' => '懒族生活 - 外卖下单', 'out_trade_no' => $orderMain->global_order_id, - 'total_fee' => bcmul(floatval($orderMain->money), 100, 0), + // 'total_fee' => bcmul(floatval($orderMain->money), 100, 0), + 'total_fee' => 1, 'notify_url' => config('site_host') . '/wechat/notify/wxminionline', 'trade_type' => 'JSAPI', 'openid' => $data['openid'], diff --git a/app/JsonRpc/OrderService.php b/app/JsonRpc/OrderService.php index 6c25b92..10cf513 100644 --- a/app/JsonRpc/OrderService.php +++ b/app/JsonRpc/OrderService.php @@ -2,10 +2,13 @@ namespace App\JsonRpc; +use App\Commons\Log; use App\Constants\ErrorCode; use App\Service\SeparateAccountsServiceInterface; +use Hyperf\DbConnection\Db; use Hyperf\RpcServer\Annotation\RpcService; use Hyperf\Di\Annotation\Inject; +use App\Constants\LogLabel; /** * @RpcService(name="OrderService", protocol="jsonrpc-http", server="jsonrpc-http", publishTo="") @@ -13,21 +16,51 @@ use Hyperf\Di\Annotation\Inject; class OrderService implements OrderServiceInterface { + /** + * @Inject + * @var Log + */ + protected $log; + + /** + * @Inject + * @var \App\Service\OrderServiceInterface + */ + protected $orderService; + /** * @Inject * @var SeparateAccountsServiceInterface */ - protected $separateAccService; + protected $separateAccountsService; public function onlineComplete($global_order_id) { - $data = $this->separateAccService->orderOnlineCompleted($global_order_id); - return [ - "status" => 200, - "code" => $data ? 0 : ErrorCode::SEPARATE_ACCOUNTS_ERROR, - "result" => [], - "message" => $data ? '调用成功' : ErrorCode::getMessage(ErrorCode::SEPARATE_ACCOUNTS_ERROR) - ]; + Db::beginTransaction(); + try { + + $this->orderService->onlineCompleted($global_order_id); + $this->separateAccountsService->orderOnlineCompleted($global_order_id); + + Db::commit(); + return [ + "status" => 200, + "code" => 0, + "result" => [], + "message" => '调用成功' + ]; + } catch (\Exception $e) { + + Db::rollBack(); + $this->log->event(LogLabel::ONLINE_COMPLETE_LOG, ['exception' => $e->getMessage()]); + return [ + "status" => 200, + "code" =>ErrorCode::SEPARATE_ACCOUNTS_ERROR, + "result" => [], + "message" => ErrorCode::getMessage(ErrorCode::SEPARATE_ACCOUNTS_ERROR) + ]; + } + } } \ No newline at end of file diff --git a/app/Model/OrderMain.php b/app/Model/OrderMain.php index 92213ad..dfb6d0d 100644 --- a/app/Model/OrderMain.php +++ b/app/Model/OrderMain.php @@ -32,6 +32,8 @@ class OrderMain extends Model const ORDER_STATE_REFUNDED = 9; // 拒绝退款 const ORDER_STATE_UNREFUND = 10; + // 完成状态组合 + const ORDER_STATE_FINISH = [self::ORDER_STATE_COMPLETE, self::ORDER_STATE_EVALUATED, self::ORDER_STATE_UNREFUND]; // 订单支付方式 // 微信支付 diff --git a/app/Model/ServiceReward.php b/app/Model/ServiceReward.php new file mode 100644 index 0000000..583ad0a --- /dev/null +++ b/app/Model/ServiceReward.php @@ -0,0 +1,33 @@ + 'array' + ]; +} \ No newline at end of file diff --git a/app/Service/FinancialRecordService.php b/app/Service/FinancialRecordService.php index 061e297..34680b3 100644 --- a/app/Service/FinancialRecordService.php +++ b/app/Service/FinancialRecordService.php @@ -10,7 +10,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface /** * @inheritDoc */ - public function communityAwardByPlatNewUser($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=1, $desc='新用户奖励', $comment='') + public function communityAwardByPlatNewUser($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=1, $desc='新用户奖励', $comment='社区服务点') { $this->record( $user_id, @@ -33,7 +33,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface /** * @inheritDoc */ - public function communityAwardByPlatNewUserFirstOLOrder($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=1, $desc='新用户首单奖励', $comment='') + public function communityAwardByPlatNewUserFirstOLOrder($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=1, $desc='新用户首单奖励', $comment='社区服务点') { $this->record( $user_id, @@ -56,7 +56,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface /** * @inheritDoc */ - public function communitySeparateAccountsByOrderComp($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=2, $desc='用户订单分成', $comment='') + public function communitySeparateAccountsByOrderComp($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=2, $desc='用户订单分成', $comment='社区服务点') { $this->record( $user_id, diff --git a/app/Service/OrderService.php b/app/Service/OrderService.php index 10a9936..7aa31e1 100644 --- a/app/Service/OrderService.php +++ b/app/Service/OrderService.php @@ -12,7 +12,6 @@ use App\Model\Order; use App\Model\OrderGoods; use App\Model\OrderMain; use App\Model\SpecCombination; -use App\Model\Users; use Exception; use Hyperf\DbConnection\Db; use Hyperf\Snowflake\IdGeneratorInterface; @@ -89,10 +88,11 @@ class OrderService implements OrderServiceInterface // 统计订单中所有店铺当日订单数,做店铺订单序号 $countsArr = Order::query() - ->selectRaw('id, COUNT(*) AS count') + ->selectRaw('store_id, COUNT(*) AS count') ->whereIn('store_id', explode(',', $dataMain['store_ids'])) ->where(['type' => OrderMain::ORDER_TYPE_ONLINE]) ->whereBetween('time', [date('Y-m-d 00:00:00'), date('Y-m-d 23:59:59')]) + ->groupBy('store_id') ->get() ->toArray(); @@ -462,14 +462,13 @@ class OrderService implements OrderServiceInterface } } - - /** * 计算和校验当前订单可用红包及金额 * @param $couponIds * @param $orderAmount * @param $userId * @param $marketId + * @return int|string * @throws Exception */ protected function getCouponAmount($couponIds, $orderAmount, $userId, $marketId) @@ -522,12 +521,47 @@ class OrderService implements OrderServiceInterface } /** - * 订单是否存在 - * @param $global_order_id - * @return mixed|void|null + * @inheritDoc */ public function existsByGlobalOrderId($global_order_id) { return OrderMain::query()->where(['order_num' => $global_order_id])->value('id'); } + + /** + * @inheritDoc + */ + public function onlineCompleted($global_order_id) + { + Db::beginTransaction(); + try { + + // 主订单状态更新 + $orderMain = OrderMain::query() + ->where(['global_order_id' => $global_order_id, 'state' => OrderMain::ORDER_STATE_DELIVERY]) + ->first(); + + if (empty($orderMain)) { + Db::rollBack(); + return false; + } + + $orderMain->state = OrderMain::ORDER_STATE_COMPLETE; + $orderMain->save(); + + // 子订单状态更新 + $upChild = Order::query() + ->where(['order_main_id' => $orderMain->id]) + ->update(['state' => OrderMain::ORDER_STATE_COMPLETE]); + + Db::commit(); + return true; + } catch (Exception $e) { + + $this->log->event(LogLabel::ONLINE_COMPLETE_LOG, ['exception' => $e->getMessage()]); + Db::rollBack(); + return false; + } + + } } \ No newline at end of file diff --git a/app/Service/OrderServiceInterface.php b/app/Service/OrderServiceInterface.php index 4fa6657..92fa986 100644 --- a/app/Service/OrderServiceInterface.php +++ b/app/Service/OrderServiceInterface.php @@ -27,4 +27,10 @@ interface OrderServiceInterface */ public function existsByGlobalOrderId($global_order_id); + /** + * @param $global_order_id + * @return mixed + */ + public function onlineCompleted($global_order_id); + } \ No newline at end of file diff --git a/app/Service/SeparateAccountsService.php b/app/Service/SeparateAccountsService.php index 57852a8..4958584 100644 --- a/app/Service/SeparateAccountsService.php +++ b/app/Service/SeparateAccountsService.php @@ -5,6 +5,7 @@ namespace App\Service; use App\Commons\Log; use App\Constants\LogLabel; use App\Model\OrderMain; +use App\Model\ServiceReward; use App\Model\UserRelationBind; use Hyperf\DbConnection\Db; use Hyperf\Di\Annotation\Inject; @@ -62,23 +63,32 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface // 奖励规则B:用户是非新用户,奖励社区服务点订单实际支付金额z%的分成 // =======社区服务点分账 / Start======= - // 奖励/分账金额 TODO 届时查询出来一个配置 - $award = ['new_user' => 1, 'first_order' => 2, 'separate_rate' => 2]; - // 当前用户的社区服务点绑定关系 $communityBind = UserRelationBind::query() ->where(['bind_type' => UserRelationBind::BIND_TYPE_COMMUNITY, 'user_id' => $orderMain->user_id]) ->first(); - // 平台新用户 - if ($this->userService->isPlatformNewUser($orderMain->user_id, $orderMain->id)) { - $this->financialRecordService->communityAwardByPlatNewUser($communityBind->source_id, $orderMain->global_order_id, $award['new_user']); - $this->financialRecordService->communityAwardByPlatNewUserFirstOLOrder($communityBind->source_id, $orderMain->global_order_id, $award['first_order']); - } + if ($communityBind) { + + // 奖励/分账金额 + $award = ServiceReward::query()->where(['type' => ServiceReward::TYPE_COMMUNITY])->first(); + if (empty($award)) { + Db::rollBack(); + return false; + } - // 账单分成 - $money = bcmul($orderMain->money, bcdiv($award['separate_rate'], 100, 6), 2); - $this->financialRecordService->communitySeparateAccountsByOrderComp($communityBind->source_id, $orderMain->global_order_id, $money); + $award = $award->set_reward; + + // 平台新用户 + if ($this->userService->isPlatformNewUser($orderMain->user_id, $orderMain->id)) { + $this->financialRecordService->communityAwardByPlatNewUser($communityBind->source_id, $orderMain->global_order_id, $award['new_user_reward']); + $this->financialRecordService->communityAwardByPlatNewUserFirstOLOrder($communityBind->source_id, $orderMain->global_order_id, $award['first_reward']); + } + + // 账单分成 + $money = bcmul($orderMain->money, $award['flow_reward']); + $this->financialRecordService->communitySeparateAccountsByOrderComp($communityBind->source_id, $orderMain->global_order_id, $money); + } // =======社区服务点分账 / End======= From e91ba2239be2d136331b5eba5ed5233510847131 Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 21 Aug 2020 19:02:02 +0800 Subject: [PATCH 09/18] =?UTF-8?q?=E4=B8=8B=E5=8D=95=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E5=92=8C=E5=88=86=E8=B4=A6=EF=BC=9A=E7=94=A8=E6=88=B7=E3=80=81?= =?UTF-8?q?=E5=95=86=E6=88=B7=E3=80=81=E5=95=86=E6=88=B7=E5=A5=96=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Constants/LogLabel.php | 11 + app/Controller/NotifyController.php | 316 ++++++++++-------- app/Model/FinancialRecord.php | 11 +- app/Model/UserBalance.php | 33 ++ app/Service/FinancialRecordService.php | 186 +++++++---- .../FinancialRecordServiceInterface.php | 88 ++++- app/Service/OrderService.php | 136 ++++++++ app/Service/OrderServiceInterface.php | 15 + app/Service/SeparateAccountsService.php | 184 +++++++++- 9 files changed, 762 insertions(+), 218 deletions(-) create mode 100644 app/Model/UserBalance.php diff --git a/app/Constants/LogLabel.php b/app/Constants/LogLabel.php index 04b91be..d4b9f72 100644 --- a/app/Constants/LogLabel.php +++ b/app/Constants/LogLabel.php @@ -43,4 +43,15 @@ class LogLabel extends AbstractConstants * @Message("Online Order Complete Log Label") */ const ONLINE_COMPLETE_LOG = 'online_complete_log'; + + /** + * @Message("Online Paid Complete Log Label") + */ + const ONLINE_PAID_LOG = 'online_paid_log'; + + /** + * @Message("Offline Paid Complete Log Label") + */ + const OFFLINE_PAID_LOG = 'offline_paid_log'; + } diff --git a/app/Controller/NotifyController.php b/app/Controller/NotifyController.php index 8376952..1ddfb11 100644 --- a/app/Controller/NotifyController.php +++ b/app/Controller/NotifyController.php @@ -18,6 +18,8 @@ use App\Service\DeviceServiceInterface; use App\Service\FeiePrintServiceInterface; use App\Service\MiniprogramServiceInterface; use App\Service\MqttServiceInterface; +use App\Service\OrderServiceInterface; +use App\Service\SeparateAccountsServiceInterface; use App\Service\UserServiceInterface; use EasyWeChat\Factory; use Hyperf\DbConnection\Db; @@ -68,6 +70,18 @@ class NotifyController extends BaseController */ protected $couponRebateService; + /** + * @Inject + * @var OrderServiceInterface + */ + protected $orderService; + + /** + * @Inject + * @var SeparateAccountsServiceInterface + */ + protected $separateAccountsService; + public function wxminiOnline() { @@ -122,65 +136,68 @@ class NotifyController extends BaseController return true; } - // 修改订单、子订单状态 - $currentTime = time(); - $orderMain->state = OrderMain::ORDER_STATE_UNTAKE; - $orderMain->time_pay = $currentTime; - $orderMain->pay_time = date('Y-m-d H:i:s', $currentTime); - $orderMain->save(); - - $upOrder = Order::query() - ->where(['order_main_id' => $orderMain->id]) - ->update(['state' => OrderMain::ORDER_STATE_UNTAKE, 'pay_time' => $orderMain->pay_time]); - - // 更新商户销量 - $upStoreScore = Store::query() - ->whereIn('id', explode(',', $orderMain->store_ids)) - ->update(['score' => Db::raw('score+1')]); - - // 更新商品库存和销量 - $orders = Order::query()->select(['id', 'money', 'user_id', 'store_id', 'pay_time']) - ->where(['order_main_id' => $orderMain->id]) - ->get() - ->toArray(); - $orderGoods = OrderGoods::query()->select(['good_id AS id', 'number', 'combination_id']) - ->whereIn('order_id', array_values(array_column($orders, 'id'))) - ->get() - ->toArray(); - foreach ($orderGoods as $key => &$goodsItem) { - - $goods = Goods::find($goodsItem['id']); - - // 库存处理,有规格 - if ($goodsItem['combination_id']) { - $combination = SpecCombination::find($goodsItem['combination_id']); - $combination->number = $combination->number - $goodsItem['number']; - $combination->save(); - } else { - $goods->inventory = $goods->inventory - $goodsItem['number']; - } - - $goods->sales = $goods->sales - $goodsItem['number']; - $goods->save(); - - } - - // 月销流水 - $statistics = []; - foreach ($orders as $key => &$order) { - $statistics[] = [ - 'money' => $order['money'], - 'user_id' => $order['user_id'], - 'store_id' => $order['store_id'], - 'market_id' => $orderMain->market_id, - 'order_id' => $order['id'], - 'createtime' => strtotime($order['pay_time']), - ]; - } - - if (is_array($statistics) && !empty($statistics)) { - $inSalesStatistics = OrderSalesStatistic::query()->insert($statistics); - } + $this->orderService->onlinePaid($message['out_trade_no']); + $this->separateAccountsService->orderOnlinePaid($message['out_trade_no']); + + // // 修改订单、子订单状态 + // $currentTime = time(); + // $orderMain->state = OrderMain::ORDER_STATE_UNTAKE; + // $orderMain->time_pay = $currentTime; + // $orderMain->pay_time = date('Y-m-d H:i:s', $currentTime); + // $orderMain->save(); + // + // $upOrder = Order::query() + // ->where(['order_main_id' => $orderMain->id]) + // ->update(['state' => OrderMain::ORDER_STATE_UNTAKE, 'pay_time' => $orderMain->pay_time]); + // + // // 更新商户销量 + // $upStoreScore = Store::query() + // ->whereIn('id', explode(',', $orderMain->store_ids)) + // ->update(['score' => Db::raw('score+1')]); + // + // // 更新商品库存和销量 + // $orders = Order::query()->select(['id', 'money', 'user_id', 'store_id', 'pay_time']) + // ->where(['order_main_id' => $orderMain->id]) + // ->get() + // ->toArray(); + // $orderGoods = OrderGoods::query()->select(['good_id AS id', 'number', 'combination_id']) + // ->whereIn('order_id', array_values(array_column($orders, 'id'))) + // ->get() + // ->toArray(); + // foreach ($orderGoods as $key => &$goodsItem) { + // + // $goods = Goods::find($goodsItem['id']); + // + // // 库存处理,有规格 + // if ($goodsItem['combination_id']) { + // $combination = SpecCombination::find($goodsItem['combination_id']); + // $combination->number = $combination->number - $goodsItem['number']; + // $combination->save(); + // } else { + // $goods->inventory = $goods->inventory - $goodsItem['number']; + // } + // + // $goods->sales = $goods->sales - $goodsItem['number']; + // $goods->save(); + // + // } + // + // // 月销流水 + // $statistics = []; + // foreach ($orders as $key => &$order) { + // $statistics[] = [ + // 'money' => $order['money'], + // 'user_id' => $order['user_id'], + // 'store_id' => $order['store_id'], + // 'market_id' => $orderMain->market_id, + // 'order_id' => $order['id'], + // 'createtime' => strtotime($order['pay_time']), + // ]; + // } + // + // if (is_array($statistics) && !empty($statistics)) { + // $inSalesStatistics = OrderSalesStatistic::query()->insert($statistics); + // } // 优惠券返券 $this->couponRebateService->couponRebateInTask($orderMain->id); @@ -192,7 +209,7 @@ class NotifyController extends BaseController // 公众号模板消息 $res = $this->miniprogramService->sendTemMsgForOnlineOrder($orderMain->id); - // 打印订单,自动打印 TODO 后续优化调用逻辑 + // 打印订单,自动打印 $res = $this->feiePrintService->feiePrint($orderMain->global_order_id); Db::commit(); @@ -271,94 +288,97 @@ class NotifyController extends BaseController return true; } - // 修改订单、子订单状态 - $currentTime = time(); - $orderMain->state = OrderMain::ORDER_STATE_UNTAKE; - $orderMain->dm_state = OrderMain::ORDER_STATE_UNTAKE; - $orderMain->time_pay = $currentTime; - $orderMain->pay_time = date('Y-m-d H:i:s', $currentTime); - $orderMain->save(); - - $upOrder = Order::query() - ->where(['order_main_id' => $orderMain->id]) - ->update([ - 'state' => OrderMain::ORDER_STATE_UNTAKE, - 'dm_state' => OrderMain::ORDER_STATE_UNTAKE, - 'pay_time' => date('Y-m-d H:i:s', $currentTime) - ]); - - // 查询子订单,当面付目前实际上只有一个子订单 - $orders = Order::query()->select(['id', 'money', 'user_id', 'store_id', 'pay_time']) - ->where(['order_main_id' => $orderMain->id]) - ->get() - ->toArray(); - - // 商户钱包、流水资金、奖励、发布模板消息处理 - foreach ($orders as $key => $orderItem) { - - $recordBase = [ - 'user_id' => $orderItem['user_id'], - 'order_id' => $orderItem['id'], - 'store_id' => $orderItem['store_id'], - 'type' => 1, - 'time' => date('Y-m-d H:i:s', $currentTime), - 'add_time' => $currentTime, - ]; - - // 钱包 - $store = Store::find($orderItem['store_id']); - $store->store_wallet = bcadd($store->store_wallet, $orderItem['money'], 2); - $store->save(); - - // 流水 - $record = [ - 'money' => $orderItem['money'], - 'note' => '当面付订单收入', - 'category' => 2, - ]; - StoreAccount::query()->insert(array_merge($recordBase, $record)); - - // 平台新用户奖励给商户 - $isStageNewUser = $this->userService->isPlatformNewUser($orderItem['user_id'], $orderMain->id); - $needAward = false; - $awardAmount = 0; - if ($isStageNewUser) { - $awardAmount = SystemConfig::query()->where(['type' => 1, 'menu_name' => 'award_new_user'])->value('value'); - // 流水 - $record = [ - 'money' => $awardAmount, - 'note' => '新用户下单成功,平台奖励', - 'category' => 3, - ]; - $needAward = true; - } else { - $isStoreFirstOrderToday = $this->userService->isStoreFirstOrderToday($orderItem['user_id'],$orderItem['store_id'],$orderItem['id'], self::AWARD_LIMIT_AMOUNT); - if ($isStoreFirstOrderToday && $orderItem['money'] >= self::AWARD_LIMIT_AMOUNT) { - $awardAmount = SystemConfig::query()->where(['type' => 1, 'menu_name' => 'award_each_order'])->value('value'); - // 流水 - $record = [ - 'money' => $awardAmount, - 'note' => '用户下单成功,平台奖励', - 'category' => 4, - ]; - $needAward = true; - } - } - - if ($needAward && $awardAmount) { - // 奖励钱包 - $store->refresh(); - $store->award_money = bcadd($store->award_money, $awardAmount, 2); - $store->save(); - - // 流水 - StoreAccount::query()->insert(array_merge($recordBase, $record)); - - // 发布公众号消息 - $openid = Users::query()->where(['id' => $store['user_id']])->value('openid'); - $res = $this->miniprogramService->sendTemMsgForAward($record['money'], $record['note'], $openid, $recordBase['time']); - } - } + $orderPaid = $this->orderService->offlinePaid($message['out_trade_no']); + $separate = $this->separateAccountsService->orderOfflinePaid($message['out_trade_no']); + + // // 修改订单、子订单状态 + // $currentTime = time(); + // $orderMain->state = OrderMain::ORDER_STATE_UNTAKE; + // $orderMain->dm_state = OrderMain::ORDER_STATE_UNTAKE; + // $orderMain->time_pay = $currentTime; + // $orderMain->pay_time = date('Y-m-d H:i:s', $currentTime); + // $orderMain->save(); + // + // $upOrder = Order::query() + // ->where(['order_main_id' => $orderMain->id]) + // ->update([ + // 'state' => OrderMain::ORDER_STATE_UNTAKE, + // 'dm_state' => OrderMain::ORDER_STATE_UNTAKE, + // 'pay_time' => date('Y-m-d H:i:s', $currentTime) + // ]); + + // // 查询子订单,当面付目前实际上只有一个子订单 + // $orders = Order::query()->select(['id', 'money', 'user_id', 'store_id', 'pay_time']) + // ->where(['order_main_id' => $orderMain->id]) + // ->get() + // ->toArray(); + // + // // 商户钱包、流水资金、奖励、发布模板消息处理 + // foreach ($orders as $key => $orderItem) { + // + // $recordBase = [ + // 'user_id' => $orderItem['user_id'], + // 'order_id' => $orderItem['id'], + // 'store_id' => $orderItem['store_id'], + // 'type' => 1, + // 'time' => date('Y-m-d H:i:s', $currentTime), + // 'add_time' => $currentTime, + // ]; + // + // // 钱包 + // $store = Store::find($orderItem['store_id']); + // $store->store_wallet = bcadd($store->store_wallet, $orderItem['money'], 2); + // $store->save(); + // + // // 流水 + // $record = [ + // 'money' => $orderItem['money'], + // 'note' => '当面付订单收入', + // 'category' => 2, + // ]; + // StoreAccount::query()->insert(array_merge($recordBase, $record)); + // + // // 平台新用户奖励给商户 + // $isStageNewUser = $this->userService->isPlatformNewUser($orderItem['user_id'], $orderMain->id); + // $needAward = false; + // $awardAmount = 0; + // if ($isStageNewUser) { + // $awardAmount = SystemConfig::query()->where(['type' => 1, 'menu_name' => 'award_new_user'])->value('value'); + // // 流水 + // $record = [ + // 'money' => $awardAmount, + // 'note' => '新用户下单成功,平台奖励', + // 'category' => 3, + // ]; + // $needAward = true; + // } else { + // $isStoreFirstOrderToday = $this->userService->isStoreFirstOrderToday($orderItem['user_id'],$orderItem['store_id'],$orderItem['id'], self::AWARD_LIMIT_AMOUNT); + // if ($isStoreFirstOrderToday && $orderItem['money'] >= self::AWARD_LIMIT_AMOUNT) { + // $awardAmount = SystemConfig::query()->where(['type' => 1, 'menu_name' => 'award_each_order'])->value('value'); + // // 流水 + // $record = [ + // 'money' => $awardAmount, + // 'note' => '用户下单成功,平台奖励', + // 'category' => 4, + // ]; + // $needAward = true; + // } + // } + // + // if ($needAward && $awardAmount) { + // // 奖励钱包 + // $store->refresh(); + // $store->award_money = bcadd($store->award_money, $awardAmount, 2); + // $store->save(); + // + // // 流水 + // StoreAccount::query()->insert(array_merge($recordBase, $record)); + // + // // 发布公众号消息 + // $openid = Users::query()->where(['id' => $store['user_id']])->value('openid'); + // $res = $this->miniprogramService->sendTemMsgForAward($record['money'], $record['note'], $openid, $recordBase['time']); + // } + // } // 喇叭通知,兼容旧音响,MQTT+IOT $res = $this->mqttSpeakerService->speakToStore($orderMain->id); diff --git a/app/Model/FinancialRecord.php b/app/Model/FinancialRecord.php index d7343d2..0096c9a 100644 --- a/app/Model/FinancialRecord.php +++ b/app/Model/FinancialRecord.php @@ -7,6 +7,11 @@ namespace App\Model; */ class FinancialRecord extends Model { + /** + * 当面付商户首单奖励限制的订单金额 + */ + const OFL_FIRST_AWARD_LIMIT_AMOUNT = 3; + /** * 虚拟账户 */ @@ -50,7 +55,11 @@ class FinancialRecord extends Model */ const MONEY_TYPE_PLAT_NEW_USER = 1; const MONEY_TYPE_FIRST_ORDER = 2; - const MONEY_TYPE_OL_ORDER = 51; + const MONEY_TYPE_OL_ORDER = 3; + const MONEY_TYPE_STORE_PLAT_NEW_USER = 4; + const MONEY_TYPE_STORE_FIRST_ORDER = 5; + const MONEY_TYPE_USER_OFL_ORDER = 100; + const MONEY_TYPE_USER_OL_ORDER = 101; /** * 状态 diff --git a/app/Model/UserBalance.php b/app/Model/UserBalance.php new file mode 100644 index 0000000..62f988e --- /dev/null +++ b/app/Model/UserBalance.php @@ -0,0 +1,33 @@ +record( - $user_id, + return $this->record( + FinancialRecord::ACCOUNT_LEDGER, [ - 'user_id' => $user_id, - 'user_type' => $user_type, + 'user_id' => FinancialRecord::ACCOUNT_LEDGER, + 'user_type' => FinancialRecord::USER_TYPE_LEDGER, 'money' => $money, 'money_type' => $money_type, 'source_id' => $source_id, @@ -24,40 +25,107 @@ class FinancialRecordService implements FinancialRecordServiceInterface 'desc' => $desc, 'comment' => $comment, 'status' => FinancialRecord::STATUS_NORMAL, - ] + ], + true ); + } + + public function record($user_id, $record, $isLedger=false) + { + $financialRecord = new FinancialRecord(); + + if (!$isLedger) { + $mod = bcmod((string)$user_id, '5', 0); + $financialRecord->suffix($mod); + } + + return $financialRecord->fill( + [ + 'user_id' => $user_id, + 'user_type' => $record['user_type'], + 'money' => $record['money'], + 'money_type' => $record['money_type'], + 'source_id' => $record['source_id'], + 'source_type' => $record['source_type'], + 'desc' => $record['desc'], + 'comment' => $record['comment'], + 'status' => $record['status'], + ] + )->save(); - $this->ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment); } /** * @inheritDoc */ - public function communityAwardByPlatNewUserFirstOLOrder($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=1, $desc='新用户首单奖励', $comment='社区服务点') + public function communityAwardByPlatNewUser($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=1, $desc='新用户奖励', $comment='社区服务点') { - $this->record( - $user_id, - [ - 'user_id' => $user_id, - 'user_type' => $user_type, - 'money' => $money, - 'money_type' => $money_type, - 'source_id' => $source_id, - 'source_type' => $source_type, - 'desc' => $desc, - 'comment' => $comment, - 'status' => FinancialRecord::STATUS_NORMAL, - ] - ); + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); + // 维护社区服务点余额 + $balance = UserBalance::firstOrNew([ + 'user_type' => UserBalance::USER_TYPE_CS, + 'source_id' => $source_id + ]); + $balance->balance = bcadd($balance->balance, $money); + $balance->save(); + } - $this->ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment); + /** + * @inheritDoc + */ + public function communityAwardByPlatNewUserFirstOLOrder($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=2, $desc='新用户首单奖励', $comment='社区服务点') + { + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); + // 维护社区服务点余额 + $balance = UserBalance::firstOrNew([ + 'user_type' => UserBalance::USER_TYPE_CS, + 'source_id' => $source_id + ]); + $balance->balance = bcadd($balance->balance, $money); + $balance->save(); + } + + /** + * @inheritDoc + */ + public function communitySeparateAccountsByOrderComp($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=3, $desc='用户订单分成', $comment='社区服务点') + { + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); + // 维护社区服务点余额 + $balance = UserBalance::firstOrNew([ + 'user_type' => UserBalance::USER_TYPE_CS, + 'source_id' => $source_id + ]); + $balance->balance = bcadd($balance->balance, $money); + $balance->save(); } + /** * @inheritDoc */ - public function communitySeparateAccountsByOrderComp($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=2, $desc='用户订单分成', $comment='社区服务点') + public function storeAwardByPlatNewUserOFLOrder($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=4, $desc='新用户下单奖励', $comment='用户当面付商户奖励') { + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); + // 同时维护钱包 + $store = Store::query()->where(['user_id' => $user_id])->first(); + $store->award_money = bcadd($store->award_money, $money, 2); + $store->save(); + } + + /** + * @inheritDoc + */ + public function storeAwardByTodayFirstOFLOrder($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=5, $desc='用户店铺首单奖励', $comment='用户当面付商户奖励') + { + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); + // 同时维护钱包 + $store = Store::query()->where(['user_id' => $user_id])->first(); + $store->award_money = bcadd($store->award_money, $money, 2); + $store->save(); + } + + public function recordAll($user_id, $source_id, $money, $user_type=1, $source_type=0, $money_type=0, $desc='', $comment='') { $this->record( $user_id, [ @@ -76,47 +144,39 @@ class FinancialRecordService implements FinancialRecordServiceInterface $this->ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment); } - public function ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment='') + /** + * @inheritDoc + */ + public function userByOFLOrderPaid($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=100, $desc='用户下单(线下)', $comment='用户下单') { - return $this->record( - FinancialRecord::ACCOUNT_LEDGER, - [ - 'user_id' => FinancialRecord::ACCOUNT_LEDGER, - 'user_type' => FinancialRecord::USER_TYPE_LEDGER, - 'money' => $money, - 'money_type' => $money_type, - 'source_id' => $source_id, - 'source_type' => $source_type, - 'desc' => $desc, - 'comment' => $comment, - 'status' => FinancialRecord::STATUS_NORMAL, - ], - true - ); + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); } - public function record($user_id, $record, $isLedger=false) + /** + * @inheritDoc + */ + public function userByOLOrderPaid($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=101, $desc='用户下单(线上)', $comment='用户下单') { - $financialRecord = new FinancialRecord(); - - if (!$isLedger) { - $mod = bcmod((string)$user_id, '5', 0); - $financialRecord->suffix($mod); - } + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); + } - return $financialRecord->fill( - [ - 'user_id' => $user_id, - 'user_type' => $record['user_type'], - 'money' => $record['money'], - 'money_type' => $record['money_type'], - 'source_id' => $record['source_id'], - 'source_type' => $record['source_type'], - 'desc' => $record['desc'], - 'comment' => $record['comment'], - 'status' => $record['status'], - ] - )->save(); + /** + * @inheritDoc + */ + public function storeByOLOrderComp($user_id, $source_id, $money, $user_type = 1, $source_type = 1, $money_type = 6, $desc = '线上外卖订单收入', $comment = '用户订单完成') + { + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); + // 同时维护钱包 + $store = Store::query()->where(['user_id' => $user_id])->first(); + $store->store_wallet = bcadd($store->store_wallet, $money, 2); + $store->save(); + } + /** + * @inheritDoc + */ + public function storeByOFLOrderComp($user_id, $source_id, $money, $user_type = 1, $source_type = 1, $money_type = 7, $desc = '线下当面付订单收入', $comment = '用户订单完成') + { + $this->recordAll($user_id, $source_id, $money, $user_type, $source_type, $money_type, $desc, $comment); } } \ No newline at end of file diff --git a/app/Service/FinancialRecordServiceInterface.php b/app/Service/FinancialRecordServiceInterface.php index 4078043..8a53628 100644 --- a/app/Service/FinancialRecordServiceInterface.php +++ b/app/Service/FinancialRecordServiceInterface.php @@ -31,7 +31,7 @@ interface FinancialRecordServiceInterface * @param string $desc * @return mixed */ - public function communityAwardByPlatNewUserFirstOLOrder($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=1, $desc='新用户首单奖励', $comment=''); + public function communityAwardByPlatNewUserFirstOLOrder($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=2, $desc='新用户首单奖励', $comment=''); /** * 社区服务点用户订单完成分账 @@ -45,7 +45,7 @@ interface FinancialRecordServiceInterface * @param string $desc * @return mixed */ - public function communitySeparateAccountsByOrderComp($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=2, $desc='用户订单分成', $comment=''); + public function communitySeparateAccountsByOrderComp($user_id, $source_id, $money, $user_type=2, $source_type=1, $money_type=3, $desc='用户订单分成', $comment=''); /** * 收支总账 @@ -59,4 +59,88 @@ interface FinancialRecordServiceInterface */ public function ledgerAccounts($source_id, $money, $source_type, $money_type, $desc, $comment=''); + /** + * 商户线下用户支付新用户奖励 + * @param $user_id + * @param $source_id + * @param $money + * @param int $user_type + * @param int $source_type + * @param int $money_type + * @param string $desc + * @param string $comment + * @return mixed + */ + public function storeAwardByPlatNewUserOFLOrder($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=4, $desc='新用户下单奖励', $comment=''); + + /** + * 商户线下用户支付用户当日首单奖励 + * @param $user_id + * @param $source_id + * @param $money + * @param int $user_type + * @param int $source_type + * @param int $money_type + * @param string $desc + * @param string $comment + * @return mixed + */ + public function storeAwardByTodayFirstOFLOrder($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=5, $desc='用户店铺首单奖励', $comment=''); + + /** + * 用户线下订单支付流水 + * @param $user_id + * @param $source_id + * @param $money + * @param int $user_type + * @param int $source_type + * @param int $money_type + * @param string $desc + * @param string $comment + * @return mixed + */ + public function userByOFLOrderPaid($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=100, $desc='用户下单(线下)', $comment=''); + + /** + * 用户线上订单支付流水 + * @param $user_id + * @param $source_id + * @param $money + * @param int $user_type + * @param int $source_type + * @param int $money_type + * @param string $desc + * @param string $comment + * @return mixed + */ + public function userByOLOrderPaid($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=101, $desc='用户下单(线上)', $comment=''); + + /** + * 商户线上订单完成收入流水 + * @param $user_id + * @param $source_id + * @param $money + * @param int $user_type + * @param int $source_type + * @param int $money_type + * @param string $desc + * @param string $comment + * @return mixed + */ + public function storeByOLOrderComp($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=6, $desc='线上外卖订单收入', $comment=''); + + /** + * 商户线下订单完成收入流水 + * @param $user_id + * @param $source_id + * @param $money + * @param int $user_type + * @param int $source_type + * @param int $money_type + * @param string $desc + * @param string $comment + * @return mixed + */ + public function storeByOFLOrderComp($user_id, $source_id, $money, $user_type=1, $source_type=1, $money_type=7, $desc='线下当面付订单收入', $comment=''); + } \ No newline at end of file diff --git a/app/Service/OrderService.php b/app/Service/OrderService.php index 7aa31e1..fd918bd 100644 --- a/app/Service/OrderService.php +++ b/app/Service/OrderService.php @@ -11,7 +11,9 @@ use App\Model\Goods; use App\Model\Order; use App\Model\OrderGoods; use App\Model\OrderMain; +use App\Model\OrderSalesStatistic; use App\Model\SpecCombination; +use App\Model\Store; use Exception; use Hyperf\DbConnection\Db; use Hyperf\Snowflake\IdGeneratorInterface; @@ -564,4 +566,138 @@ class OrderService implements OrderServiceInterface } } + + /** + * @inheritDoc + */ + public function onlinePaid($global_order_id) + { + Db::beginTransaction(); + try { + // 查询订单 + $orderMain = OrderMain::query() + ->where([ + 'global_order_id' => $global_order_id, + 'type' => OrderMain::ORDER_TYPE_ONLINE + ]) + ->first(); + + // 修改订单、子订单状态 + $currentTime = time(); + $orderMain->state = OrderMain::ORDER_STATE_UNTAKE; + $orderMain->time_pay = $currentTime; + $orderMain->pay_time = date('Y-m-d H:i:s', $currentTime); + $orderMain->save(); + + $upOrder = Order::query() + ->where(['order_main_id' => $orderMain->id]) + ->update(['state' => OrderMain::ORDER_STATE_UNTAKE, 'pay_time' => $orderMain->pay_time]); + + // 更新商户销量 + $upStoreScore = Store::query() + ->whereIn('id', explode(',', $orderMain->store_ids)) + ->update(['score' => Db::raw('score+1')]); + + // 更新商品库存和销量 + $orders = Order::query()->select(['id', 'money', 'user_id', 'store_id', 'pay_time']) + ->where(['order_main_id' => $orderMain->id]) + ->get() + ->toArray(); + $orderGoods = OrderGoods::query()->select(['good_id AS id', 'number', 'combination_id']) + ->whereIn('order_id', array_values(array_column($orders, 'id'))) + ->get() + ->toArray(); + foreach ($orderGoods as $key => &$goodsItem) { + + $goods = Goods::find($goodsItem['id']); + + // 库存处理,有规格 + if ($goodsItem['combination_id']) { + $combination = SpecCombination::find($goodsItem['combination_id']); + $combination->number = $combination->number - $goodsItem['number']; + $combination->save(); + } else { + $goods->inventory = $goods->inventory - $goodsItem['number']; + } + + $goods->sales = $goods->sales - $goodsItem['number']; + $goods->save(); + + } + + // 月销流水 + $statistics = []; + foreach ($orders as $key => &$order) { + $statistics[] = [ + 'money' => $order['money'], + 'user_id' => $order['user_id'], + 'store_id' => $order['store_id'], + 'market_id' => $orderMain->market_id, + 'order_id' => $order['id'], + 'createtime' => strtotime($order['pay_time']), + ]; + } + + if (is_array($statistics) && !empty($statistics)) { + $inSalesStatistics = OrderSalesStatistic::query()->insert($statistics); + } + + Db::commit(); + return true; + } catch (Exception $e) { + + $this->log->event(LogLabel::ONLINE_PAID_LOG, ['exception' => $e->getMessage()]); + Db::rollBack(); + return false; + } + } + + /** + * @inheritDoc + */ + public function offlinePaid($global_order_id) + { + Db::beginTransaction(); + try { + + // 主订单状态更新 + $orderMain = OrderMain::query() + ->where(['global_order_id' => $global_order_id, 'type' => OrderMain::ORDER_TYPE_OFFLINE]) + ->first(); + + if (empty($orderMain)) { + + $this->log->event( + LogLabel::PAY_NOTIFY_WXMINI, + ['order_not_found' => $global_order_id] + ); + Db::rollBack(); + return false; + } + + $currentTime = time(); + $orderMain->state = OrderMain::ORDER_STATE_UNTAKE; + $orderMain->dm_state = OrderMain::ORDER_STATE_UNTAKE; + $orderMain->time_pay = $currentTime; + $orderMain->pay_time = date('Y-m-d H:i:s', $currentTime); + $orderMain->save(); + + // 子订单状态更新 + $upOrder = Order::query() + ->where(['order_main_id' => $orderMain->id]) + ->update([ + 'state' => OrderMain::ORDER_STATE_UNTAKE, + 'dm_state' => OrderMain::ORDER_STATE_UNTAKE, + 'pay_time' => date('Y-m-d H:i:s', $currentTime) + ]); + + Db::commit(); + return true; + } catch (Exception $e) { + + $this->log->event(LogLabel::OFFLINE_PAID_LOG, ['exception' => $e->getMessage()]); + Db::rollBack(); + return false; + } + } } \ No newline at end of file diff --git a/app/Service/OrderServiceInterface.php b/app/Service/OrderServiceInterface.php index 92fa986..01cb413 100644 --- a/app/Service/OrderServiceInterface.php +++ b/app/Service/OrderServiceInterface.php @@ -28,9 +28,24 @@ interface OrderServiceInterface public function existsByGlobalOrderId($global_order_id); /** + * 订单完成 * @param $global_order_id * @return mixed */ public function onlineCompleted($global_order_id); + /** + * 线上订单支付完成 + * @param $global_order_id + * @return mixed + */ + public function onlinePaid($global_order_id); + + /** + * 线下订单支付完成 + * @param $global_order_id + * @return mixed + */ + public function offlinePaid($global_order_id); + } \ No newline at end of file diff --git a/app/Service/SeparateAccountsService.php b/app/Service/SeparateAccountsService.php index 4958584..994e1b4 100644 --- a/app/Service/SeparateAccountsService.php +++ b/app/Service/SeparateAccountsService.php @@ -4,8 +4,14 @@ namespace App\Service; use App\Commons\Log; use App\Constants\LogLabel; +use App\Model\FinancialRecord; +use App\Model\Order; use App\Model\OrderMain; use App\Model\ServiceReward; +use App\Model\Store; +use App\Model\StoreAccount; +use App\Model\SystemConfig; +use App\Model\UserBalance; use App\Model\UserRelationBind; use Hyperf\DbConnection\Db; use Hyperf\Di\Annotation\Inject; @@ -30,12 +36,30 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface */ protected $financialRecordService; + /** + * @Inject + * @var MiniprogramServiceInterface + */ + protected $miniprogramService; + /** * @inheritDoc */ public function orderOnlinePaid($global_order_id) { - // TODO: Implement orderOnlinePaid() method. + // 线上订单支付完成 + // 订单 + $orderMain = OrderMain::query() + ->where(['global_order_id' => $global_order_id]) + ->first(); + + if (empty($orderMain)) { + return false; + } + + // =======用户支付流水 / Start======= + $this->financialRecordService->userByOFLOrderPaid($orderMain->user_id, $orderMain->id, $orderMain->money); + // =======用户支付流水 / End======= } /** @@ -51,12 +75,47 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface ->first(); if (empty($orderMain)) { - return; + return false; } + $currentTime = time(); Db::beginTransaction(); try { + // =======商户订单收入流水 / Start======= + // 查询子订单 + $orders = Order::query()->select(['id', 'money', 'user_id', 'store_id', 'pay_time']) + ->where(['order_main_id' => $orderMain->id]) + ->get()->toArray(); + + foreach ($orders as $key => &$order) { + + // 商户 + $store = Store::find($order['store_id']); + + // 旧商户流水基础数据 TODO 直接移除或后续考虑移除 + $storeAccountBase = [ + 'user_id' => $order['user_id'], + 'order_id' => $order['id'], + 'store_id' => $order['store_id'], + 'type' => 1, + 'time' => date('Y-m-d H:i:s', $currentTime), + 'add_time' => $currentTime, + ]; + + // 旧商户流水 TODO 直接移除或后续考虑移除 + $storeAccount = [ + 'money' => $order['money'], + 'note' => '线上订单', + 'category' => 1, + ]; + StoreAccount::query()->insert(array_merge($storeAccountBase, $storeAccount)); + + // 新商户流水 + $this->financialRecordService->storeByOLOrderComp($store->user_id, $orderMain->id ,$order['money']); + } + // =======商户订单收入流水 / End======= + // =======社区服务点分账 / Start======= // 前提:用户线上下单并且订单完成 // 奖励规则A:用户是平台新用户,奖励社区服务点平台新用户奖励x元+平台新用户首单奖励y元+订单商品金额z%的分成 @@ -86,7 +145,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface } // 账单分成 - $money = bcmul($orderMain->money, $award['flow_reward']); + $money = bcmul($orderMain->money, bcdiv($award['flow_reward'], 100, 6), 2); $this->financialRecordService->communitySeparateAccountsByOrderComp($communityBind->source_id, $orderMain->global_order_id, $money); } @@ -109,6 +168,123 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface */ public function orderOfflinePaid($global_order_id) { - // TODO: Implement orderOfflinePaid() method. + // 线下订单支付完成 + // 订单 + $orderMain = OrderMain::query() + ->where(['global_order_id' => $global_order_id]) + ->first(); + + if (empty($orderMain)) { + return false; + } + + // 查询子订单,当面付目前实际上只有一个子订单 + $order = Order::query()->select(['id', 'money', 'user_id', 'store_id', 'pay_time']) + ->where(['order_main_id' => $orderMain->id]) + ->first(); + + if (empty($order)) { + return false; + } + + $currentTime = time(); + Db::beginTransaction(); + try { + + // =======用户支付流水 / Start======= + $this->financialRecordService->userByOFLOrderPaid($orderMain->user_id, $orderMain->id, $orderMain->money); + // =======用户支付流水 / End======= + + // =======线下订单支付完成商户分账 / Start======= + // 前提:用户线上下单并且支付完成 + // 奖励规则A:用户是平台新用户,奖励商户2元 + // 奖励规则B:用户是非新用户,但是是商户当日首单,奖励商户0.05元 + // =======线下订单支付完成商户分账 / Start======= + + // 旧商户订单流水基础数据 TODO 直接移除或后续考虑移除 + $storeAccountBase = [ + 'user_id' => $order->user_id, + 'order_id' => $order->id, + 'store_id' => $order->store_id, + 'type' => 1, + 'time' => date('Y-m-d H:i:s', $currentTime), + 'add_time' => $currentTime, + ]; + + // 旧商户订单流水 TODO 直接移除或后续考虑移除 + $storeAccount = [ + 'money' => $order->money, + 'note' => '当面付订单收入', + 'category' => 2, + ]; + StoreAccount::query()->insert(array_merge($storeAccountBase, $storeAccount)); + + // 商户 + $store = Store::find($order->store_id); + + // 新商户订单流水 + $this->financialRecordService->storeByOFLOrderComp($store->user_id, $orderMain->id, $order->money); + + $needAward = false; + $awardAmount = 0; + // 新用户商户奖励 + if ($this->userService->isPlatformNewUser($orderMain->user_id, $orderMain->id)) { + + $awardAmount = SystemConfig::query()->where(['type' => 1, 'menu_name' => 'award_new_user'])->value('value'); + // 旧商户流水 TODO 直接移除或后续考虑移除 + $storeAccount = [ + 'money' => $awardAmount, + 'note' => '新用户下单成功,平台奖励', + 'category' => 3, + ]; + // 新商户流水 + $this->financialRecordService->storeAwardByPlatNewUserOFLOrder($store->user_id, $orderMain->id, $awardAmount); + $needAward = true; + + } else { + // 商户当日首单奖励 + if ( + $this->userService->isStoreFirstOrderToday( + $order->user_id, + $order->store_id, + $order->id, + FinancialRecord::OFL_FIRST_AWARD_LIMIT_AMOUNT + ) + ) { + + $awardAmount = SystemConfig::query()->where(['type' => 1, 'menu_name' => 'award_each_order'])->value('value'); + // 旧商户流水 TODO 直接移除或后续考虑移除 + $storeAccount = [ + 'money' => $awardAmount, + 'note' => '用户下单成功,平台奖励', + 'category' => 4, + ]; + // 新商户流水 + $this->financialRecordService->storeAwardByTodayFirstOFLOrder($store->user_id, $orderMain->id, $awardAmount); + $needAward = true; + + } + } + + if ($needAward && $awardAmount) { + + // 旧商户流水 TODO 直接移除或后续考虑移除 + StoreAccount::query()->insert(array_merge($storeAccountBase, $storeAccount)); + + // 发模板消息 + $openid = Users::query()->where(['id' => $store['user_id']])->value('openid'); + $res = $this->miniprogramService->sendTemMsgForAward($storeAccount['money'], $storeAccount['note'], $openid, $storeAccountBase['time']); + } + + // =======线下订单支付完成商户分账 / End======= + + Db::commit(); + return true; + } catch (\Exception $e) { + + $this->log->event(LogLabel::SEPARATE_ACCOUNTS_LOG, ['exception' => $e->getMessage(), 'order_main' => json_encode($orderMain)]); + Db::rollBack(); + return false; + } } } \ No newline at end of file From f45757de62881228490cc04eceee88d919cd6adf Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 21 Aug 2020 19:10:53 +0800 Subject: [PATCH 10/18] Fix --- app/Service/SeparateAccountsService.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Service/SeparateAccountsService.php b/app/Service/SeparateAccountsService.php index 994e1b4..109dcd2 100644 --- a/app/Service/SeparateAccountsService.php +++ b/app/Service/SeparateAccountsService.php @@ -13,6 +13,7 @@ use App\Model\StoreAccount; use App\Model\SystemConfig; use App\Model\UserBalance; use App\Model\UserRelationBind; +use App\Model\Users; use Hyperf\DbConnection\Db; use Hyperf\Di\Annotation\Inject; From dd8a5504dba3a45d53f6bb00d2ae721b20d77f66 Mon Sep 17 00:00:00 2001 From: weigang Date: Fri, 21 Aug 2020 19:36:35 +0800 Subject: [PATCH 11/18] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=88=86=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Model/FinancialRecord.php | 27 +++++++++---------------- app/Model/UserBalance.php | 7 +++++-- app/Service/FinancialRecordService.php | 6 +++--- app/Service/SeparateAccountsService.php | 18 ++++++++--------- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/app/Model/FinancialRecord.php b/app/Model/FinancialRecord.php index 0096c9a..b56adbe 100644 --- a/app/Model/FinancialRecord.php +++ b/app/Model/FinancialRecord.php @@ -42,24 +42,17 @@ class FinancialRecord extends Model const SOURCE_TYPE_ORDER = 1; /** - * 流水类型,大的分类,<=50是奖励,>50是分账 - * - * MONEY_TYPE_PLAT_NEW_USER - * 社区服务点新用户奖励(线上订单完成) / 1 - * - * MONEY_TYPE_FIRST_ORDER - * 社区服务点新用户线上首单奖励(线上订单完成) / 2 - * - * MONEY_TYPE_OL_ORDER - * 社区服务点用户线上订单分账(线上订单完成) / 51 + * 流水类型,大的分类,<100是奖励分账等收入项 >=100是提现消费等支出项 */ - const MONEY_TYPE_PLAT_NEW_USER = 1; - const MONEY_TYPE_FIRST_ORDER = 2; - const MONEY_TYPE_OL_ORDER = 3; - const MONEY_TYPE_STORE_PLAT_NEW_USER = 4; - const MONEY_TYPE_STORE_FIRST_ORDER = 5; - const MONEY_TYPE_USER_OFL_ORDER = 100; - const MONEY_TYPE_USER_OL_ORDER = 101; + const MONEY_TYPE_PLAT_NEW_USER = 1; // 社区服务点新用户奖励(线上订单完成) + const MONEY_TYPE_FIRST_ORDER = 2; // 社区服务点新用户线上首单奖励(线上订单完成) + const MONEY_TYPE_OL_ORDER = 3; // 社区服务点用户线上订单分账(线上订单完成) + const MONEY_TYPE_STORE_PLAT_NEW_USER = 4; // 商户平台新用户奖励 + const MONEY_TYPE_STORE_FIRST_ORDER = 5; // 商户当日首单奖励 + const MONEY_TYPE_STORE_OL_ORDER_COMP = 6; // 商户线上订单完成收入 + const MONEY_TYPE_STORE_OFL_ORDER_COMP = 7; // 商户线下订单完成收入 + const MONEY_TYPE_USER_OFL_ORDER = 100; // 用户线下支付订单 + const MONEY_TYPE_USER_OL_ORDER = 101; // 用户线上支付订单 /** * 状态 diff --git a/app/Model/UserBalance.php b/app/Model/UserBalance.php index 62f988e..3883747 100644 --- a/app/Model/UserBalance.php +++ b/app/Model/UserBalance.php @@ -3,7 +3,6 @@ declare (strict_types=1); namespace App\Model; -use Hyperf\DbConnection\Model\Model; /** */ class UserBalance extends Model @@ -23,7 +22,11 @@ class UserBalance extends Model * * @var array */ - protected $fillable = []; + protected $fillable = [ + 'source_id', + 'user_type', + 'balance' + ]; /** * The attributes that should be cast to native types. * diff --git a/app/Service/FinancialRecordService.php b/app/Service/FinancialRecordService.php index f6e5c80..574de5c 100644 --- a/app/Service/FinancialRecordService.php +++ b/app/Service/FinancialRecordService.php @@ -64,7 +64,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface // 维护社区服务点余额 $balance = UserBalance::firstOrNew([ 'user_type' => UserBalance::USER_TYPE_CS, - 'source_id' => $source_id + 'source_id' => $user_id ]); $balance->balance = bcadd($balance->balance, $money); $balance->save(); @@ -79,7 +79,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface // 维护社区服务点余额 $balance = UserBalance::firstOrNew([ 'user_type' => UserBalance::USER_TYPE_CS, - 'source_id' => $source_id + 'source_id' => $user_id ]); $balance->balance = bcadd($balance->balance, $money); $balance->save(); @@ -94,7 +94,7 @@ class FinancialRecordService implements FinancialRecordServiceInterface // 维护社区服务点余额 $balance = UserBalance::firstOrNew([ 'user_type' => UserBalance::USER_TYPE_CS, - 'source_id' => $source_id + 'source_id' => $user_id ]); $balance->balance = bcadd($balance->balance, $money); $balance->save(); diff --git a/app/Service/SeparateAccountsService.php b/app/Service/SeparateAccountsService.php index 109dcd2..4217a24 100644 --- a/app/Service/SeparateAccountsService.php +++ b/app/Service/SeparateAccountsService.php @@ -59,7 +59,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface } // =======用户支付流水 / Start======= - $this->financialRecordService->userByOFLOrderPaid($orderMain->user_id, $orderMain->id, $orderMain->money); + $this->financialRecordService->userByOFLOrderPaid($orderMain->user_id, $global_order_id, $orderMain->money); // =======用户支付流水 / End======= } @@ -113,7 +113,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface StoreAccount::query()->insert(array_merge($storeAccountBase, $storeAccount)); // 新商户流水 - $this->financialRecordService->storeByOLOrderComp($store->user_id, $orderMain->id ,$order['money']); + $this->financialRecordService->storeByOLOrderComp($store->user_id, $global_order_id ,$order['money']); } // =======商户订单收入流水 / End======= @@ -141,13 +141,13 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface // 平台新用户 if ($this->userService->isPlatformNewUser($orderMain->user_id, $orderMain->id)) { - $this->financialRecordService->communityAwardByPlatNewUser($communityBind->source_id, $orderMain->global_order_id, $award['new_user_reward']); - $this->financialRecordService->communityAwardByPlatNewUserFirstOLOrder($communityBind->source_id, $orderMain->global_order_id, $award['first_reward']); + $this->financialRecordService->communityAwardByPlatNewUser($communityBind->source_id, $global_order_id, $award['new_user_reward']); + $this->financialRecordService->communityAwardByPlatNewUserFirstOLOrder($communityBind->source_id, $global_order_id, $award['first_reward']); } // 账单分成 $money = bcmul($orderMain->money, bcdiv($award['flow_reward'], 100, 6), 2); - $this->financialRecordService->communitySeparateAccountsByOrderComp($communityBind->source_id, $orderMain->global_order_id, $money); + $this->financialRecordService->communitySeparateAccountsByOrderComp($communityBind->source_id, $global_order_id, $money); } // =======社区服务点分账 / End======= @@ -193,7 +193,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface try { // =======用户支付流水 / Start======= - $this->financialRecordService->userByOFLOrderPaid($orderMain->user_id, $orderMain->id, $orderMain->money); + $this->financialRecordService->userByOFLOrderPaid($orderMain->user_id, $global_order_id, $orderMain->money); // =======用户支付流水 / End======= // =======线下订单支付完成商户分账 / Start======= @@ -224,7 +224,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface $store = Store::find($order->store_id); // 新商户订单流水 - $this->financialRecordService->storeByOFLOrderComp($store->user_id, $orderMain->id, $order->money); + $this->financialRecordService->storeByOFLOrderComp($store->user_id, $global_order_id, $order->money); $needAward = false; $awardAmount = 0; @@ -239,7 +239,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface 'category' => 3, ]; // 新商户流水 - $this->financialRecordService->storeAwardByPlatNewUserOFLOrder($store->user_id, $orderMain->id, $awardAmount); + $this->financialRecordService->storeAwardByPlatNewUserOFLOrder($store->user_id, $global_order_id, $awardAmount); $needAward = true; } else { @@ -261,7 +261,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface 'category' => 4, ]; // 新商户流水 - $this->financialRecordService->storeAwardByTodayFirstOFLOrder($store->user_id, $orderMain->id, $awardAmount); + $this->financialRecordService->storeAwardByTodayFirstOFLOrder($store->user_id, $global_order_id, $awardAmount); $needAward = true; } From 299775702eec58a16559185368b8bd873d0787c9 Mon Sep 17 00:00:00 2001 From: weigang Date: Mon, 24 Aug 2020 10:40:07 +0800 Subject: [PATCH 12/18] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=A1=AE=E8=AE=A4?= =?UTF-8?q?=E6=94=B6=E8=B4=A7API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/OrderController.php | 55 ++++++++++++++++++++++++++++++ config/routes.php | 2 ++ 2 files changed, 57 insertions(+) diff --git a/app/Controller/OrderController.php b/app/Controller/OrderController.php index f26045d..669e19a 100644 --- a/app/Controller/OrderController.php +++ b/app/Controller/OrderController.php @@ -3,11 +3,15 @@ namespace App\Controller; use App\Constants\ErrorCode; +use App\Constants\LogLabel; +use App\Model\OrderMain; use App\Request\OrderOfflineRequest; use App\Request\OrderOnlineRequest; +use Hyperf\DbConnection\Db; use Hyperf\Di\Annotation\Inject; use App\Service\OrderServiceInterface; use Hyperf\HttpMessage\Stream\SwooleStream; +use Hyperf\Validation\ValidationException; class OrderController extends BaseController { @@ -35,4 +39,55 @@ class OrderController extends BaseController } return $this->success(['order_id' => $orderMainId]); } + + /** + * 用户完成订单-确认收货 + */ + public function userComp() + { + + $validator = $this->validationFactory->make( + $this->request->all(), + [ + 'user_id' => 'required|nonempty|integer', + 'order_id' => 'required|nonempty|numeric', + ], + [ + '*.*' => ':attribute 参数不正确', + ] + ); + + if ($validator->fails()) { + // Handle exception + throw new ValidationException($validator); + return; + } + + $userId = $this->request->input('user_id'); + $orderId = $this->request->input('order_id'); + $orderExist = OrderMain::query() + ->where(['id' => $orderId, 'state' => OrderMain::ORDER_STATE_DELIVERY, 'user_id' => $userId]) + ->exists(); + + if (!$orderExist) { + $this->log->event(LogLabel::ONLINE_COMPLETE_LOG, ['order_not_found' => 'order_not_found']); + return $this->result(ErrorCode::SEPARATE_ACCOUNTS_ERROR, '', '操作失败,订单异常或不存在'); + } + + Db::beginTransaction(); + try { + + $this->orderService->onlineCompleted($orderId); + $this->separateAccountsService->orderOnlineCompleted($orderId); + + Db::commit(); + return $this->success(['order_id' => $orderId]); + } catch (\Exception $e) { + + Db::rollBack(); + $this->log->event(LogLabel::ONLINE_COMPLETE_LOG, ['exception' => $e->getMessage()]); + return $this->result(ErrorCode::SEPARATE_ACCOUNTS_ERROR, '', '操作失败,请稍后重试'); + } + + } } \ No newline at end of file diff --git a/config/routes.php b/config/routes.php index b68b0e4..8cff5ab 100644 --- a/config/routes.php +++ b/config/routes.php @@ -54,6 +54,8 @@ Router::addGroup('/v1/',function (){ //小程序支付相关 Router::post('wxminipay/online', 'App\Controller\PaymentController@wxminiPayOnline'); Router::post('wxminipay/offline', 'App\Controller\PaymentController@wxminiPayOffline'); + + Router::post('Order/userComp', 'App\Controller\OrderController@userComp'); },['middleware' => [\App\Middleware\Auth\ApiMiddleware::class]]); Router::addGroup('/wechat/',function () { From 630a30bd414d157b5df069b52d53ff7c9c16b63e Mon Sep 17 00:00:00 2001 From: weigang Date: Mon, 24 Aug 2020 10:52:27 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=BA=BF=E4=B8=8A?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=B5=81=E6=B0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Service/FeiePrintService.php | 3 +++ app/Service/OrderService.php | 2 +- app/Service/SeparateAccountsService.php | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Service/FeiePrintService.php b/app/Service/FeiePrintService.php index 9f8f31d..114510b 100644 --- a/app/Service/FeiePrintService.php +++ b/app/Service/FeiePrintService.php @@ -37,6 +37,9 @@ class FeiePrintService implements FeiePrintServiceInterface ->orderBy('s.id') ->get() ->toArray(); + if (empty($data)) { + return ; + } foreach ($data as $key => &$item) { $item = (array)$item; } diff --git a/app/Service/OrderService.php b/app/Service/OrderService.php index fd918bd..6b02129 100644 --- a/app/Service/OrderService.php +++ b/app/Service/OrderService.php @@ -100,7 +100,7 @@ class OrderService implements OrderServiceInterface $storeOrderCounts = []; foreach ($countsArr as $key => &$row) { - $storeOrderCounts[$row['id']] = $row['count']; + $storeOrderCounts[$row['store_id']] = $row['count']; } // 循环处理订单总额、子订单总额、商品、商户订单等信息 diff --git a/app/Service/SeparateAccountsService.php b/app/Service/SeparateAccountsService.php index 4217a24..3f89a5c 100644 --- a/app/Service/SeparateAccountsService.php +++ b/app/Service/SeparateAccountsService.php @@ -59,7 +59,7 @@ class SeparateAccountsService implements SeparateAccountsServiceInterface } // =======用户支付流水 / Start======= - $this->financialRecordService->userByOFLOrderPaid($orderMain->user_id, $global_order_id, $orderMain->money); + $this->financialRecordService->userByOLOrderPaid($orderMain->user_id, $global_order_id, $orderMain->money); // =======用户支付流水 / End======= } From bce935b3e045f4e1411867564694bee4c1305780 Mon Sep 17 00:00:00 2001 From: weigang Date: Mon, 24 Aug 2020 10:59:09 +0800 Subject: [PATCH 14/18] no message --- app/Controller/OrderController.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/Controller/OrderController.php b/app/Controller/OrderController.php index 669e19a..bec90c9 100644 --- a/app/Controller/OrderController.php +++ b/app/Controller/OrderController.php @@ -7,6 +7,7 @@ use App\Constants\LogLabel; use App\Model\OrderMain; use App\Request\OrderOfflineRequest; use App\Request\OrderOnlineRequest; +use App\Service\SeparateAccountsServiceInterface; use Hyperf\DbConnection\Db; use Hyperf\Di\Annotation\Inject; use App\Service\OrderServiceInterface; @@ -22,6 +23,12 @@ class OrderController extends BaseController */ protected $orderService; + /** + * @Inject + * @var SeparateAccountsServiceInterface + */ + protected $separateAccountsService; + public function addOnlineOrder(OrderOnlineRequest $request) { $orderMainId = $this->orderService->addOnlineOrder($request->validated()); From c6614fa66e002966697317e0a0618f574fc60d09 Mon Sep 17 00:00:00 2001 From: weigang Date: Mon, 24 Aug 2020 11:16:10 +0800 Subject: [PATCH 15/18] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=AE=8C=E6=88=90API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/OrderController.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/Controller/OrderController.php b/app/Controller/OrderController.php index bec90c9..4896c6f 100644 --- a/app/Controller/OrderController.php +++ b/app/Controller/OrderController.php @@ -71,12 +71,12 @@ class OrderController extends BaseController } $userId = $this->request->input('user_id'); - $orderId = $this->request->input('order_id'); - $orderExist = OrderMain::query() + $orderId = $this->request->input('order_id'); // TODO 等新订单列表接口处理完毕后全面转换成global_order_id + $orderMain = OrderMain::query() ->where(['id' => $orderId, 'state' => OrderMain::ORDER_STATE_DELIVERY, 'user_id' => $userId]) - ->exists(); + ->first(); - if (!$orderExist) { + if (empty($orderMain)) { $this->log->event(LogLabel::ONLINE_COMPLETE_LOG, ['order_not_found' => 'order_not_found']); return $this->result(ErrorCode::SEPARATE_ACCOUNTS_ERROR, '', '操作失败,订单异常或不存在'); } @@ -84,11 +84,11 @@ class OrderController extends BaseController Db::beginTransaction(); try { - $this->orderService->onlineCompleted($orderId); - $this->separateAccountsService->orderOnlineCompleted($orderId); + $this->orderService->onlineCompleted($orderMain->global_order_id); + $this->separateAccountsService->orderOnlineCompleted($orderMain->global_order_id); Db::commit(); - return $this->success(['order_id' => $orderId]); + return $this->success(''); } catch (\Exception $e) { Db::rollBack(); From 1d5fb84b32d82493a21f15338f814421d4aede9f Mon Sep 17 00:00:00 2001 From: liangyuyan <1103300295@qq.com> Date: Tue, 25 Aug 2020 09:20:38 +0800 Subject: [PATCH 16/18] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=92=8C=E9=80=80=E6=AC=BEservice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/OrderController.php | 9 +++++++++ app/JsonRpc/OrderService.php | 24 ++++++++++++++++++++++++ app/Service/OrderService.php | 13 +++++++++++++ app/Service/OrderServiceInterface.php | 13 +++++++++++++ 4 files changed, 59 insertions(+) diff --git a/app/Controller/OrderController.php b/app/Controller/OrderController.php index 4896c6f..d91a1c8 100644 --- a/app/Controller/OrderController.php +++ b/app/Controller/OrderController.php @@ -97,4 +97,13 @@ class OrderController extends BaseController } } + + /** + * 用户取消订单 + */ + public function onlineCancel(){ + $globalOrderId = $this->request->input('global_order_id'); + return $this->success($this->orderService->onlineCancel($globalOrderId)); + } + } \ No newline at end of file diff --git a/app/JsonRpc/OrderService.php b/app/JsonRpc/OrderService.php index 10cf513..5ecdadf 100644 --- a/app/JsonRpc/OrderService.php +++ b/app/JsonRpc/OrderService.php @@ -63,4 +63,28 @@ class OrderService implements OrderServiceInterface } + /** + * 线上订单退款 + */ + public function onlineRefund($global_order_id){ + Db::beginTransaction(); + try{ + + return [ + "status" => 200, + "code" => 0, + "result" => $this->orderService->onlineRefund($global_order_id), + // 'result' => $global_order_id, + "message" => '' + ]; + } catch (\Exception $e){ + return [ + "status" => 200, + "code" => 0, + "result" => $this->orderService->onlineRefund($global_order_id), + // 'result' => $global_order_id, + "message" => '' + ]; + } + } } \ No newline at end of file diff --git a/app/Service/OrderService.php b/app/Service/OrderService.php index 6b02129..2f74461 100644 --- a/app/Service/OrderService.php +++ b/app/Service/OrderService.php @@ -700,4 +700,17 @@ class OrderService implements OrderServiceInterface return false; } } + + /** + * @inheritDoc + */ + public function onlineCancel($global_order_id){ + + } + /** + * @inheritDoc + */ + public function onlineRefund($global_order_id){ + return 123; + } } \ No newline at end of file diff --git a/app/Service/OrderServiceInterface.php b/app/Service/OrderServiceInterface.php index 01cb413..397bc2c 100644 --- a/app/Service/OrderServiceInterface.php +++ b/app/Service/OrderServiceInterface.php @@ -48,4 +48,17 @@ interface OrderServiceInterface */ public function offlinePaid($global_order_id); + /** + * 线上订单取消 + * @param $global_order_id + * @return mixed + */ + public function onlineCancel($global_order_id); + + /** + * 线上订单退款 + * @param $global_order_id + * @return mixed + */ + public function onlineRefund($global_order_id); } \ No newline at end of file From e6ba220d8a1f69f299b29c8c2cf4734a24a156a9 Mon Sep 17 00:00:00 2001 From: Lemon <15040771@qq.com> Date: Tue, 25 Aug 2020 11:31:41 +0800 Subject: [PATCH 17/18] =?UTF-8?q?=E9=80=80=E5=8D=95=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/OrderController.php | 4 +-- app/Model/CouponUserUse.php | 7 +++++ app/Service/CouponService.php | 37 ++++++++++++++++++++++++++ app/Service/CouponServiceInterface.php | 2 ++ app/Service/OrderService.php | 11 ++++++-- app/Service/OrderServiceInterface.php | 2 +- config/routes.php | 1 + 7 files changed, 59 insertions(+), 5 deletions(-) diff --git a/app/Controller/OrderController.php b/app/Controller/OrderController.php index d91a1c8..fb2ed20 100644 --- a/app/Controller/OrderController.php +++ b/app/Controller/OrderController.php @@ -102,8 +102,8 @@ class OrderController extends BaseController * 用户取消订单 */ public function onlineCancel(){ - $globalOrderId = $this->request->input('global_order_id'); - return $this->success($this->orderService->onlineCancel($globalOrderId)); + $OrderId = $this->request->input('order_id'); + return $this->success($this->orderService->onlineCancel($OrderId)); } } \ No newline at end of file diff --git a/app/Model/CouponUserUse.php b/app/Model/CouponUserUse.php index a8cfcf3..0d53a14 100644 --- a/app/Model/CouponUserUse.php +++ b/app/Model/CouponUserUse.php @@ -6,5 +6,12 @@ namespace App\Model; class CouponUserUse extends Model { + // 正常使用 + const COUPON_USE_STATE_USED = 1; + // 退回用户 + const COUPON_USE_STATE_CANCEL = 2; + + public $timestamps = false; + protected $table = 'ims_system_coupon_user_use'; } \ No newline at end of file diff --git a/app/Service/CouponService.php b/app/Service/CouponService.php index eb726f0..c2c016d 100644 --- a/app/Service/CouponService.php +++ b/app/Service/CouponService.php @@ -7,6 +7,7 @@ use Hyperf\DbConnection\Db; use App\Model\CouponUserRecType; use App\Model\Coupon; use App\Model\CouponRec; +use App\Model\CouponUserUse; use Hyperf\Utils\ApplicationContext; use App\TaskWorker\SSDBTask; use App\Constants\SsdbKeysPrefix; @@ -220,4 +221,40 @@ class CouponService implements CouponServiceInterface return $setRes&&$expireRes; } + /** + * 取消订单返券 + * @param $order_id + * @return bool + */ + public function refundOrderCoupons($order_id,$user_id){ + $coupon = CouponUserUse::where([ + ['order_main_id','=',$order_id], + ['status','=',CouponUserUse::COUPON_USE_STATE_USED], + ]) + ->select('id','user_receive_id','number') + ->first(); + // 返回用户优惠券数量并更新状态 + $res = Db::update("UPDATE ims_system_coupon_user_receive SET number_remain=number_remain+{$coupon->number}, status=IF(number=number_remain,0,1), update_time=".time()."" + ." WHERE id={$coupon->user_receive_id} AND number>=(number_remain+{$coupon->number})"); + + // 更新使用记录状态为已退回 + CouponUserUse::where([ + ['id','=',$coupon->id], + ['status','=',CouponUserUse::COUPON_USE_STATE_USED], + ]) + ->update([ + 'status' => CouponUserUse::COUPON_USE_STATE_CANCEL, + 'return_time' => time(), + 'update_time' => time(), + ]); + + //删除当日 redis 使用记录缓存 + $redis = ApplicationContext::getContainer()->get(Redis::class); + $remRes = $redis->sRem( + 'coupon_'.date('Ymd').'_used_'.$user_id, + $coupon->system_coupon_id + ); + return $res; + } + } \ No newline at end of file diff --git a/app/Service/CouponServiceInterface.php b/app/Service/CouponServiceInterface.php index bdd60c5..38355f2 100644 --- a/app/Service/CouponServiceInterface.php +++ b/app/Service/CouponServiceInterface.php @@ -27,4 +27,6 @@ interface CouponServiceInterface */ public function getOrderCanUseCoupons($orderAmount, $marketId, $userId, $fields=[], $type=1, $storeTypeIds=[0]); + public function refundOrderCoupons($order_id,$user_id); + } diff --git a/app/Service/OrderService.php b/app/Service/OrderService.php index 2f74461..56a7893 100644 --- a/app/Service/OrderService.php +++ b/app/Service/OrderService.php @@ -704,8 +704,14 @@ class OrderService implements OrderServiceInterface /** * @inheritDoc */ - public function onlineCancel($global_order_id){ - + public function onlineCancel($order_id){ + $order_main = OrderMain::where('id',$order_id) + ->select('global_order_id','user_id') + ->first(); + OrderMain::where('id',$order_id) + ->update(['state' => OrderMain::ORDER_STATE_CANCEL]); + $res = $this->couponService->refundOrderCoupons($order_id,$order_main->user_id); + return $res; } /** * @inheritDoc @@ -713,4 +719,5 @@ class OrderService implements OrderServiceInterface public function onlineRefund($global_order_id){ return 123; } + } \ No newline at end of file diff --git a/app/Service/OrderServiceInterface.php b/app/Service/OrderServiceInterface.php index 397bc2c..4834c91 100644 --- a/app/Service/OrderServiceInterface.php +++ b/app/Service/OrderServiceInterface.php @@ -53,7 +53,7 @@ interface OrderServiceInterface * @param $global_order_id * @return mixed */ - public function onlineCancel($global_order_id); + public function onlineCancel($order_id); /** * 线上订单退款 diff --git a/config/routes.php b/config/routes.php index 8cff5ab..b2e5598 100644 --- a/config/routes.php +++ b/config/routes.php @@ -50,6 +50,7 @@ Router::addGroup('/v1/',function (){ //订单相关 Router::post('Order/addOnline', 'App\Controller\OrderController@addOnlineOrder'); Router::post('Order/addOffline', 'App\Controller\OrderController@addOfflineOrder'); + Router::post('Order/onlineCancel', 'App\Controller\OrderController@onlineCancel'); //小程序支付相关 Router::post('wxminipay/online', 'App\Controller\PaymentController@wxminiPayOnline'); From 19b4636e0e7a03eb35f4228d731dcf0e9ce25fa8 Mon Sep 17 00:00:00 2001 From: liangyuyan <1103300295@qq.com> Date: Tue, 25 Aug 2020 12:07:17 +0800 Subject: [PATCH 18/18] =?UTF-8?q?=E7=89=B9=E4=BB=B7=E5=95=86=E5=93=81--?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E7=BA=BF=E4=B8=8A=E8=AE=A2=E5=8D=95=E9=80=80?= =?UTF-8?q?=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Constants/LogLabel.php | 2 +- app/JsonRpc/OrderService.php | 12 +++-- app/Model/CouponUserRec.php | 8 +++ app/Model/CouponUserUse.php | 6 +++ app/Service/CouponService.php | 20 ++++++++ app/Service/CouponServiceInterface.php | 2 + app/Service/OrderService.php | 62 ++++++++++++++++++++++- app/Service/PayRefundService.php | 47 +++++++++++++++++ app/Service/PayRefundServiceInterface.php | 8 +++ 9 files changed, 160 insertions(+), 7 deletions(-) create mode 100644 app/Service/PayRefundService.php create mode 100644 app/Service/PayRefundServiceInterface.php diff --git a/app/Constants/LogLabel.php b/app/Constants/LogLabel.php index d4b9f72..072a6f7 100644 --- a/app/Constants/LogLabel.php +++ b/app/Constants/LogLabel.php @@ -53,5 +53,5 @@ class LogLabel extends AbstractConstants * @Message("Offline Paid Complete Log Label") */ const OFFLINE_PAID_LOG = 'offline_paid_log'; - + } diff --git a/app/JsonRpc/OrderService.php b/app/JsonRpc/OrderService.php index 5ecdadf..43abb2e 100644 --- a/app/JsonRpc/OrderService.php +++ b/app/JsonRpc/OrderService.php @@ -65,6 +65,8 @@ class OrderService implements OrderServiceInterface /** * 线上订单退款 + * 申请退款 state = 8 + * 退款成功 state = 9 */ public function onlineRefund($global_order_id){ Db::beginTransaction(); @@ -75,15 +77,15 @@ class OrderService implements OrderServiceInterface "code" => 0, "result" => $this->orderService->onlineRefund($global_order_id), // 'result' => $global_order_id, - "message" => '' + "message" => '退款成功' ]; } catch (\Exception $e){ + Db::rollBack(); return [ "status" => 200, - "code" => 0, - "result" => $this->orderService->onlineRefund($global_order_id), - // 'result' => $global_order_id, - "message" => '' + "code" => ErrorCode::ORDER_FAILURE, + "result" => [], + "message" => $e->getMessage() ]; } } diff --git a/app/Model/CouponUserRec.php b/app/Model/CouponUserRec.php index c5c2608..25afd2f 100644 --- a/app/Model/CouponUserRec.php +++ b/app/Model/CouponUserRec.php @@ -6,5 +6,13 @@ namespace App\Model; class CouponUserRec extends Model { + /* 状态 */ + // 未使用 + const STATE_UNUSED = 0; + // 使用部分 + const STATE_SOME = 1; + // 已用完 + const STATE_FINISH = 2; + protected $table = 'ims_system_coupon_user_receive'; } \ No newline at end of file diff --git a/app/Model/CouponUserUse.php b/app/Model/CouponUserUse.php index a8cfcf3..b333751 100644 --- a/app/Model/CouponUserUse.php +++ b/app/Model/CouponUserUse.php @@ -6,5 +6,11 @@ namespace App\Model; class CouponUserUse extends Model { + /* 状态 */ + // 正常使用 + const STATE_USE = 1; + // 已退回用户 + const STATE_REFUND = 2; + protected $table = 'ims_system_coupon_user_use'; } \ No newline at end of file diff --git a/app/Service/CouponService.php b/app/Service/CouponService.php index eb726f0..ce6acef 100644 --- a/app/Service/CouponService.php +++ b/app/Service/CouponService.php @@ -220,4 +220,24 @@ class CouponService implements CouponServiceInterface return $setRes&&$expireRes; } + /** + * 删除-优惠券今日使用的缓存 + * @param $userId + * @param $couponId + * @param $couponRecId + * @return bool + */ + function clearTodayCouponUsed($userId, $couponId) + { + + $redis = ApplicationContext::getContainer()->get(Redis::class); + + $res = $redis->sRem( + 'coupon_'.date('Ymd').'_used_'.$userId, + $couponId + ); + + return $res; + } + } \ No newline at end of file diff --git a/app/Service/CouponServiceInterface.php b/app/Service/CouponServiceInterface.php index bdd60c5..5dd2d84 100644 --- a/app/Service/CouponServiceInterface.php +++ b/app/Service/CouponServiceInterface.php @@ -27,4 +27,6 @@ interface CouponServiceInterface */ public function getOrderCanUseCoupons($orderAmount, $marketId, $userId, $fields=[], $type=1, $storeTypeIds=[0]); + + function clearTodayCouponUsed($userId, $couponId); } diff --git a/app/Service/OrderService.php b/app/Service/OrderService.php index 2f74461..50779c7 100644 --- a/app/Service/OrderService.php +++ b/app/Service/OrderService.php @@ -711,6 +711,66 @@ class OrderService implements OrderServiceInterface * @inheritDoc */ public function onlineRefund($global_order_id){ - return 123; + Db::beginTransaction(); + try { + + $time = time(); + // 主订单状态更新 + $orderMain = OrderMain::query() + ->where(['global_order_id' => $global_order_id, 'state' => OrderMain::ORDER_STATE_DELIVERY]) + ->first(); + + if (empty($orderMain)) { + Db::rollBack(); + return false; + } + + $orderMain->state = OrderMain::ORDER_STATE_REFUNDED; + $upOrderMain = $orderMain->save(); + + // 子订单状态更新 + $upChild = Order::query() + ->where(['order_main_id' => $orderMain->id]) + ->update(['state' => OrderMain::ORDER_STATE_REFUNDED]); + + /* 退还优惠券 */ + // 先查询是否正常使用优惠券 + // 修改状态,退还领取记录库存,删除ssdb缓存 + $couponUses = CouponUserUse::query() + ->select('id','system_coupon_id','user_id','number','user_receive_id') + ->where('order_main_id',$orderMain->id) + ->where('status',CouponUserUse::STATE_USE) + ->select(); + if(!empty($couponUse)){ + foreach($couponUses as $use){ + $use->status = CouponUserUse::STATE_USE; + $use->return_time = $time; + $use->update_time = $time; + $use->save(); + + $couponReceive = CouponUserRec::query() + ->where('id',$use->user_receive_id) + ->whereRaw('number >= number_remain+'.$use->number) + ->update([ + 'number_remain' => Db::raw('number_remain+'.$use->number), + 'status' => Db::raw('IF(number=number_remain,' . CouponUserRec::STATE_UNUSED . ',' . CouponUserRec::STATE_SOME . ')'), + 'update_time' => $time + ]); + + $clearUseRedis = $this->couponService->clearTodayCouponUsed($use->user_id,$use->system_coupon_id); + } + } + + // 退还订单金额到用户微信余额 + + + Db::commit(); + return true; + } catch (Exception $e) { + + $this->log->event(LogLabel::ORDER_LOG, ['msg'=> '订单退款','exception' => $e->getMessage()]); + Db::rollBack(); + return false; + } } } \ No newline at end of file diff --git a/app/Service/PayRefundService.php b/app/Service/PayRefundService.php new file mode 100644 index 0000000..27bd0d4 --- /dev/null +++ b/app/Service/PayRefundService.php @@ -0,0 +1,47 @@ + 0, + 'msg' => '退款成功' + ]; + + // 查询订单 + $orderMain = OrderMain::query() + ->select('id','code','order_num','money','state') + ->where('global_order_id',$global_order_id) + ->where('pay_type',OrderMain::ORDER_PAY_WX) + ->where(Db::raw('refund_time is null')) + ->first(); + if(empty($orderMain)){ + return ['status'=>1, 'msg'=>'订单不存在或已退款']; + } + $optional = []; + $result = $app->refund->byOutTradeNumber( + $orderMain->code, + $orderMain->code, + $orderMain->money * 100, + $orderMain->money * 100, + $optional + ); + return $result; + } + +} \ No newline at end of file diff --git a/app/Service/PayRefundServiceInterface.php b/app/Service/PayRefundServiceInterface.php new file mode 100644 index 0000000..7ca1de1 --- /dev/null +++ b/app/Service/PayRefundServiceInterface.php @@ -0,0 +1,8 @@ +