From 9319b2ba2b705104737da2c039de3dadb6bda4ef Mon Sep 17 00:00:00 2001 From: fengxinyhyl Date: Fri, 15 Mar 2024 17:36:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E8=B4=B9=E8=80=85=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=8E=B7=E5=8F=96=E8=B5=84=E4=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common/dao/user/UserAssetsDao.php | 12 +- app/common/dao/user/UserAssetsLogDao.php | 13 +- app/common/model/user/UserAssetsLog.php | 5 + .../store/product/ProductRepository.php | 6 +- .../user/UserAssetsLogRepository.php | 147 +++++++++++++++++- .../user/UserAssetsRepository.php | 73 ++++++++- app/controller/api/Auth.php | 3 + crmeb/listens/pay/CustomizePaySuccess.php | 8 + 8 files changed, 237 insertions(+), 30 deletions(-) diff --git a/app/common/dao/user/UserAssetsDao.php b/app/common/dao/user/UserAssetsDao.php index e17ff31..7d1b750 100644 --- a/app/common/dao/user/UserAssetsDao.php +++ b/app/common/dao/user/UserAssetsDao.php @@ -14,26 +14,18 @@ namespace app\common\dao\user; use app\common\dao\BaseDao; -use app\common\model\BaseModel; +use app\common\model\user\UserAssets; use app\common\model\user\UserSpreadLog; class UserAssetsDao extends BaseDao { - protected function getModel(): string { - return UserSpreadLog::class; + return UserAssets::class; } public function add($uid, $spread_uid, $old_spread_uid, $admin_id = 0) { $this->create(compact('uid', 'spread_uid', 'admin_id', 'old_spread_uid')); } - - public function search($where) - { - return UserSpreadLog::getDB()->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) { - $query->where('uid', $where['uid']); - })->order('create_time DESC'); - } } diff --git a/app/common/dao/user/UserAssetsLogDao.php b/app/common/dao/user/UserAssetsLogDao.php index 1f0391a..297f6dd 100644 --- a/app/common/dao/user/UserAssetsLogDao.php +++ b/app/common/dao/user/UserAssetsLogDao.php @@ -14,15 +14,13 @@ namespace app\common\dao\user; use app\common\dao\BaseDao; -use app\common\model\BaseModel; -use app\common\model\user\UserSpreadLog; +use app\common\model\user\UserAssetsLog; class UserAssetsLogDao extends BaseDao { - protected function getModel(): string { - return UserSpreadLog::class; + return UserAssetsLog::class; } public function add($uid, $spread_uid, $old_spread_uid, $admin_id = 0) @@ -30,10 +28,5 @@ class UserAssetsLogDao extends BaseDao $this->create(compact('uid', 'spread_uid', 'admin_id', 'old_spread_uid')); } - public function search($where) - { - return UserSpreadLog::getDB()->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) { - $query->where('uid', $where['uid']); - })->order('create_time DESC'); - } + } diff --git a/app/common/model/user/UserAssetsLog.php b/app/common/model/user/UserAssetsLog.php index 464b8b2..e127832 100644 --- a/app/common/model/user/UserAssetsLog.php +++ b/app/common/model/user/UserAssetsLog.php @@ -17,6 +17,11 @@ use app\common\model\BaseModel; class UserAssetsLog extends BaseModel { + // 设置json类型字段 + protected $json = ['ext']; + + // 设置JSON数据返回数组 + protected $jsonAssoc = true; public static function tablePk(): ?string { diff --git a/app/common/repositories/store/product/ProductRepository.php b/app/common/repositories/store/product/ProductRepository.php index 7d60dc1..9d42dc9 100755 --- a/app/common/repositories/store/product/ProductRepository.php +++ b/app/common/repositories/store/product/ProductRepository.php @@ -1123,7 +1123,11 @@ class ProductRepository extends BaseRepository public function apiProductDetail(array $where, int $productType, ?int $activityId, $userInfo = null) { - $field = 'is_show,product_id,mer_id,image,slider_image,store_name,store_info,unit_name,price,cost,ot_price,stock,sales,video_link,product_type,extension_type,old_product_id,rate,guarantee_template_id,temp_id,once_max_count,pay_limit,once_min_count,integral_rate,delivery_way,delivery_free,type,cate_id,svip_price_type,svip_price,mer_svip_status'; + $field = 'is_show,product_id,mer_id,image,slider_image,store_name,store_info, + unit_name,price,cost,ot_price,stock,sales,video_link,product_type,extension_type, + old_product_id,rate,guarantee_template_id,temp_id,once_max_count,pay_limit,once_min_count, + integral_rate,delivery_way,delivery_free,type,cate_id,svip_price_type, + svip_price,mer_svip_status,cash_rate,base'; $with = [ 'attr', 'content' => function($query) { diff --git a/app/common/repositories/user/UserAssetsLogRepository.php b/app/common/repositories/user/UserAssetsLogRepository.php index bb6876c..aa35ae5 100644 --- a/app/common/repositories/user/UserAssetsLogRepository.php +++ b/app/common/repositories/user/UserAssetsLogRepository.php @@ -13,27 +13,164 @@ namespace app\common\repositories\user; -use app\common\dao\user\UserSpreadLogDao; +use app\common\dao\user\UserAssetsLogDao; use app\common\repositories\BaseRepository; +use app\common\repositories\store\product\ProductAssistRepository; +use app\common\repositories\store\product\ProductRepository; +use think\facade\Log; /** - * @mixin UserSpreadLogDao + * @mixin UserAssetsLogDao */ class UserAssetsLogRepository extends BaseRepository { - public function __construct(UserSpreadLogDao $dao) + const ASSET_TYPE_CONSUME = 1; // 消费积分 + const ASSET_TYPE_SHARE_POINT = 2; // 分红点 + const ASSET_TYPE_WELFARE = 3; // 福利积分 + const ASSET_TYPE_HUITONG = 4; // 惠通宝 + const ASSET_TYPE_CONTRIBUTION = 5; // 贡献值 + + const CHANGE_TYPE_ORDER_GET = 1; // 订单获取 + const CHANGE_TYPE_SIGN = 2; // 签到 + const CHANGE_TYPE_SHARE = 3; // 分红 + const CHANGE_TYPE_ORDER_PAY = 4; // 订单消费 + const CHANGE_TYPE_SPREAD = 5; // 推广 + const CHANGE_TYPE_CULTIVATE = 6; // 培育 + const CHANGE_TYPE_TRANSFER = 7; // 赠与 + const CHANGE_TYPE_EXCHANGE = 8; // 兑换 + + const STATUS_FROZEN = 0; // 冻结 + const STATUS_SUCCESS = 1; // 成功 + const STATUS_REFUND = 2; // 退款 + + public function __construct(UserAssetsLogDao $dao, UserAssetsRepository $userAssetsRepository, ProductRepository $productRepository) + { + $this->dao = $dao; + $this->userAssetsRepository = $userAssetsRepository; + $this->productRepository = $productRepository; + } + + /** + * notes 获取资产变动类型 + * @return string[] + * @create 2024/3/15 15:30 + * @update 2024/3/15 15:30 + * @author zhangkxiang + * @editor + */ + public function getChangeType() { - $this->dao = $dao; + return array( + self::CHANGE_TYPE_ORDER_GET => "订单获取", + self::CHANGE_TYPE_SIGN => "签到", + self::CHANGE_TYPE_SHARE => "分红", + self::CHANGE_TYPE_ORDER_PAY => "订单消费", + self::CHANGE_TYPE_SPREAD => "推广", + self::CHANGE_TYPE_CULTIVATE => "培育", + self::CHANGE_TYPE_TRANSFER => "赠与", + self::CHANGE_TYPE_EXCHANGE => "兑换", + ); } public function getList(array $where, $page, $limit) { $query = $this->dao->search($where); $count = $query->count(); - $list = $query->page($page, $limit)->with(['spread' => function ($query) { + $list = $query->page($page, $limit)->with(['spread' => function ($query) { $query->field('uid,nickname,avatar'); }])->select(); return compact('count', 'list'); } + + + /** + * notes 用户支付订单时间处理 + * @param $groupOrder + * @create 2024/3/15 17:22 + * @update 2024/3/15 17:22 + * @author zhangkxiang + * @editor + */ + public function userPayEvent($groupOrder) + { + $logList = array(); + $consume = $welfare = $huitong = $contribution = 0; + // 循环groupOrder, 按照商家订单处理 + foreach ($groupOrder['orderList'] as $orderItem) { + $base = 0; + // 1. 本人的消费积分 + $logList[] = array( + 'uid' => $groupOrder['uid'], + 'asset_type' => self::ASSET_TYPE_CONSUME, + 'type' => self::CHANGE_TYPE_ORDER_GET, + 'status' => self::STATUS_FROZEN, + 'order_id' => $orderItem['order_id'], + 'count' => $orderItem['pay_price'], + ); + $consume += $orderItem['pay_price']; + + foreach ($orderItem['orderProduct'] as $orderProduct) { + // 获取商品详情(奖励积分 + $product = $this->productRepository->detail($orderProduct['product_id'], null); + Log::info("product" . json_encode($product)); + $rate = floatval($orderProduct['total_price']) / floatval($orderProduct['product_price']) * 100; + if ($rate >= $product['cash_rate']) { + $base += $product['base']; + } + } + + // 如果该订单奖励基数大于0 + if($base){ + // 2. 本人的福利积分 + $orderWelfare = round($base * 0.1, 2); + $welfare+= $orderWelfare; + $logList[] = array( + 'uid' => $groupOrder['uid'], + 'asset_type' => self::ASSET_TYPE_WELFARE, + 'type' => self::CHANGE_TYPE_ORDER_GET, + 'status' => self::STATUS_FROZEN, + 'order_id' => $orderItem['order_id'], + 'count' => $orderWelfare, + ); + + // 3. 本人的惠通宝 + $orderHuitong = round($base * 0.05, 2); + $huitong+= $orderHuitong; + $logList[] = array( + 'uid' => $groupOrder['uid'], + 'asset_type' => self::ASSET_TYPE_HUITONG, + 'type' => self::CHANGE_TYPE_ORDER_GET, + 'status' => self::STATUS_FROZEN, + 'order_id' => $orderItem['order_id'], + 'count' => $orderHuitong, + ); + + // 4. 本人的贡献值 + $orderContribution = round($base * 0.01, 2); + $contribution+= $orderContribution; + $logList[] = array( + 'uid' => $groupOrder['uid'], + 'asset_type' => self::ASSET_TYPE_HUITONG, + 'type' => self::CHANGE_TYPE_ORDER_GET, + 'status' => self::STATUS_FROZEN, + 'order_id' => $orderItem['order_id'], + 'count' => $orderContribution, + ); + } + } + $this->addLog($logList); + $this->userAssetsRepository->orderEvent($groupOrder['uid'], self::STATUS_FROZEN, compact('consume', 'welfare', 'huitong', 'contribution')); + } + + public function addLog($list) + { + $this->dao->insertAll($list); + } + + + public function userRefund() + { + + } } diff --git a/app/common/repositories/user/UserAssetsRepository.php b/app/common/repositories/user/UserAssetsRepository.php index a2a8b72..506baac 100644 --- a/app/common/repositories/user/UserAssetsRepository.php +++ b/app/common/repositories/user/UserAssetsRepository.php @@ -13,27 +13,92 @@ namespace app\common\repositories\user; -use app\common\dao\user\UserSpreadLogDao; +use app\common\dao\user\UserAssetsDao; use app\common\repositories\BaseRepository; +use think\db\exception\DataNotFoundException; +use think\db\exception\DbException; +use think\db\exception\ModelNotFoundException; /** - * @mixin UserSpreadLogDao + * @mixin UserAssetsDao */ class UserAssetsRepository extends BaseRepository { - public function __construct(UserSpreadLogDao $dao) + + + public function __construct(UserAssetsDao $dao) { $this->dao = $dao; } + public function getList(array $where, $page, $limit) { $query = $this->dao->search($where); $count = $query->count(); - $list = $query->page($page, $limit)->with(['spread' => function ($query) { + $list = $query->page($page, $limit)->with(['spread' => function ($query) { $query->field('uid,nickname,avatar'); }])->select(); return compact('count', 'list'); } + + + /** + * notes 订单状态发生变更,影响用户资产 + * @param $uid + * @param $status + * @param $data + * @throws DataNotFoundException + * @throws DbException + * @throws ModelNotFoundException + * @create 2024/3/15 17:23 + * @update 2024/3/15 17:23 + * @author zhangkxiang + * @editor + */ + public function orderEvent($uid, $status, $data = array()) + { + $assets = array(); + $info = $this->dao->get($uid); + if($info){ + // 购买订单获得冻结资产 + if($status == UserAssetsLogRepository::STATUS_FROZEN) { + $assets = array( + 'consume_frozen' => $info['consume_frozen'] + $data['consume'], + 'welfare_frozen' => $info['welfare_frozen'] + $data['welfare'], + 'huitong_frozen' => $info['huitong_frozen'] + $data['huitong'], + 'contribution_frozen' => $info['contribution_frozen'] + $data['contribution'], + ); + }elseif ($status == UserAssetsLogRepository::STATUS_SUCCESS){ + $assets = array( + 'consume' => $info['consume'] + $data['consume'], + 'welfare' => $info['welfare'] + $data['welfare'], + 'huitong' => $info['huitong'] + $data['huitong'], + 'contribution' => $info['contribution'] + $data['contribution'], + 'consume_frozen' => $info['consume_frozen'] - $data['consume'], + 'welfare_frozen' => $info['welfare_frozen'] - $data['welfare'], + 'huitong_frozen' => $info['huitong_frozen'] - $data['huitong'], + 'contribution_frozen' => $info['contribution_frozen'] - $data['contribution'], + ); + }elseif ($status == UserAssetsLogRepository::STATUS_REFUND){ + $assets = array( + 'consume_frozen' => $info['consume_frozen'] - $data['consume'], + 'welfare_frozen' => $info['welfare_frozen'] - $data['welfare'], + 'huitong_frozen' => $info['huitong_frozen'] - $data['huitong'], + 'contribution_frozen' => $info['contribution_frozen'] - $data['contribution'], + ); + } + $this->dao->update($uid, $assets); + }else{ + $assets = array( + 'uid' => $uid, + 'consume_frozen' => $data['consume'] ?? 0, + 'welfare_frozen' => $data['welfare'] ?? 0, + 'huitong_frozen' => $data['huitong'] ?? 0, + 'contribution_frozen' => $data['contribution'] ?? 0, + ); + $this->dao->create($assets); + } + } } diff --git a/app/controller/api/Auth.php b/app/controller/api/Auth.php index 928d8fd..7b9ac10 100644 --- a/app/controller/api/Auth.php +++ b/app/controller/api/Auth.php @@ -53,6 +53,9 @@ class Auth extends BaseController { public function test() { + $json = '{"groupOrder":{"group_order_id":23,"group_order_sn":"wxo1710483254425346241","uid":3,"total_postage":"0.00","total_price":"0.10","total_num":1,"integral":0,"integral_price":"0.00","give_integral":0,"coupon_price":"0.00","real_name":"\u5f20\u51ef\u7fd4","user_phone":"18362705640","user_address":"\u6c5f\u82cf\u5357\u4eac\u5e02\u6816\u971e\u533a\u5c27\u5316\u8857\u9053\u4e1c\u57ce\u4e16\u5bb6(\u5357\u4eac\u5e02\u6816\u971e\u533a\u5c27\u8fb0\u8def3\u53f7)24\u680b501","pay_price":"0.10","pay_postage":"0.00","cost":"0.00","coupon_id":"","give_coupon_ids":[],"paid":1,"pay_time":"2024-03-15 14:14:20","pay_type":2,"create_time":"2024-03-15 14:14:14","is_remind":0,"is_del":0,"is_combine":0,"orderList":[{"order_id":24,"main_id":0,"group_order_id":23,"order_sn":"wxo1710483254425346241","uid":3,"spread_uid":0,"top_uid":0,"district_id":3378,"real_name":"\u5f20\u51ef\u7fd4","user_phone":"18362705640","user_address":"\u6c5f\u82cf\u5357\u4eac\u5e02\u6816\u971e\u533a\u5c27\u5316\u8857\u9053\u4e1c\u57ce\u4e16\u5bb6(\u5357\u4eac\u5e02\u6816\u971e\u533a\u5c27\u8fb0\u8def3\u53f7)24\u680b501","cart_id":"52","total_num":1,"total_price":"0.10","total_postage":"0.00","pay_price":"0.10","pay_postage":"0.00","is_selfbuy":0,"extension_one":"0.00","extension_two":"0.00","commission_rate":"5.0000","integral":0,"integral_price":"0.00","give_integral":0,"coupon_id":"","coupon_price":"0.00","platform_coupon_price":"0.00","svip_discount":"0.00","order_type":0,"paid":1,"pay_time":"2024-03-15 14:14:20","pay_type":2,"create_time":"2024-03-15 14:14:14","status":0,"delivery_type":null,"is_virtual":0,"delivery_name":null,"delivery_id":null,"mark":"","remark":null,"admin_mark":null,"verify_code":null,"verify_time":null,"verify_service_id":null,"transaction_id":null,"activity_type":0,"order_extend":null,"mer_id":6,"reconciliation_id":0,"cost":"0.00","is_del":0,"is_system_del":0,"verify_status":0,"user":{"uid":3,"wechat_user_id":3,"account":"18362705640","pwd":"$2y$10$wYWu1Xc.pUqVwldOM3C\/EenyUPFg8DGlVbZuT.H9cIh.YtANOFmK6","real_name":"","sex":0,"birthday":null,"card_id":"","mark":"","label_id":[],"group_id":0,"nickname":"\u5fae\u4fe1\u7528\u6237","avatar":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg\/132","phone":"18362705640","addres":null,"cancel_time":null,"create_time":"2024-03-09 22:48:59","last_time":"2024-03-11 21:36:37","last_ip":"180.98.131.161","now_money":"8780.00","brokerage_price":"0.00","status":1,"spread_uid":2,"spread_time":"2024-03-09 22:48:59","spread_limit":null,"brokerage_level":0,"user_type":"routine","promoter_time":null,"is_promoter":0,"main_uid":0,"pay_count":9,"pay_price":"1400.00","spread_count":0,"spread_pay_count":0,"spread_pay_price":"0.00","integral":1400,"member_level":0,"member_value":0,"count_start":0,"count_fans":0,"is_svip":-1,"svip_endtime":null,"svip_save_money":"0.00"},"orderProduct":[{"order_product_id":24,"order_id":24,"uid":3,"cart_id":52,"product_id":203,"extension_one":"0.00","extension_two":"0.00","integral":0,"integral_price":"0.00","integral_total":0,"coupon_price":"0.00","platform_coupon_price":null,"svip_discount":"0.00","postage_price":"0.00","product_sku":"78c5e599c2a0","is_refund":0,"product_num":1,"product_type":0,"activity_id":203,"refund_num":1,"is_reply":0,"cost":"0.00","product_price":"0.10","total_price":"0.10","cart_info":{"product":{"product_id":203,"cate_id":17,"image":"http:\/\/b2.njrenzhou.com\/uploads\/def\/20240314\/e3c14a605d720c3429b6793abbb74e4b.jpg","store_name":"\u6d4b\u8bd5\u5546\u54c1","is_show":1,"status":1,"is_del":0,"unit_name":"\u7247","price":"0.10","mer_status":1,"temp_id":6,"give_coupon_ids":[],"is_gift_bag":0,"is_used":1,"product_type":0,"old_product_id":0,"integral_rate":-1,"delivery_way":"2","delivery_free":0,"type":0,"extend":"","pay_limit":0,"once_max_count":0,"once_min_count":0,"mer_svip_status":1,"svip_price_type":0,"temp":{"shipping_template_id":6,"name":"\u9ed8\u8ba4\u6a21\u677f","type":1,"appoint":0,"undelivery":0,"mer_id":6,"is_default":0,"sort":0,"create_time":"2022-04-24 15:29:04","info":null,"region":[],"undelives":null,"free":[]}},"productAttr":{"image":"http:\/\/b2.njrenzhou.com\/uploads\/def\/20240314\/e3c14a605d720c3429b6793abbb74e4b.jpg","extension_one":"0.00","extension_two":"0.00","product_id":203,"stock":195,"price":"0.10","unique":"78c5e599c2a0","sku":"","volume":"0.00","weight":"0.00","ot_price":"0.00","cost":"0.00","svip_price":"0.00","show_svip_price":false,"bc_extension_one":0,"bc_extension_two":0},"product_type":0},"create_time":"2024-03-15 14:14:14"}]}],"user":{"uid":3,"wechat_user_id":3,"account":"18362705640","pwd":"$2y$10$wYWu1Xc.pUqVwldOM3C\/EenyUPFg8DGlVbZuT.H9cIh.YtANOFmK6","real_name":"","sex":0,"birthday":null,"card_id":"","mark":"","label_id":[],"group_id":0,"nickname":"\u5fae\u4fe1\u7528\u6237","avatar":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg\/132","phone":"18362705640","addres":null,"cancel_time":null,"create_time":"2024-03-09 22:48:59","last_time":"2024-03-11 21:36:37","last_ip":"180.98.131.161","now_money":"8780.00","brokerage_price":"0.00","status":1,"spread_uid":2,"spread_time":"2024-03-09 22:48:59","spread_limit":null,"brokerage_level":0,"user_type":"routine","promoter_time":null,"is_promoter":0,"main_uid":0,"pay_count":9,"pay_price":"1400.00","spread_count":0,"spread_pay_count":0,"spread_pay_price":"0.00","integral":1400,"member_level":0,"member_value":0,"count_start":0,"count_fans":0,"is_svip":-1,"svip_endtime":null,"svip_save_money":"0.00"}}}'; + event("order.paySuccess", json_decode($json, true)); + return app('json')->success(); // $data = [ // 'tempId' => '', // 'id' => '', diff --git a/crmeb/listens/pay/CustomizePaySuccess.php b/crmeb/listens/pay/CustomizePaySuccess.php index 1f5a76b..8795d5b 100644 --- a/crmeb/listens/pay/CustomizePaySuccess.php +++ b/crmeb/listens/pay/CustomizePaySuccess.php @@ -11,6 +11,7 @@ namespace crmeb\listens\pay; use app\common\repositories\store\order\StoreGroupOrderRepository; use app\common\repositories\store\order\StoreOrderRepository; +use app\common\repositories\user\UserAssetsLogRepository; use crmeb\interfaces\ListenerInterface; use think\facade\Log; @@ -20,5 +21,12 @@ class CustomizePaySuccess implements ListenerInterface public function handle($data): void { Log::info('支付成功' . json_encode($data)); + if(isset($data['groupOrder']) and $data['groupOrder']){ + /** + * @var UserAssetsLogRepository $repository + */ + $repository = app()->make(UserAssetsLogRepository::class); + $repository->userPayEvent($data['groupOrder']); + } } }