OrderLogic.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. <?php
  2. namespace addons\Happiness\common\logic\order;
  3. use addons\Happiness\common\enums\HappinessEnum;
  4. use addons\Happiness\common\enums\HappinessRewardEnum;
  5. use addons\Happiness\common\models\HappinessAgent;
  6. use addons\Happiness\common\models\HappinessBusiness;
  7. use addons\Happiness\common\models\HappinessGoods;
  8. use addons\Happiness\common\models\HappinessGoodsRanking;
  9. use addons\Happiness\common\models\HappinessOrder;
  10. use addons\Happiness\common\models\HappinessStoreCommission;
  11. use addons\Happiness\common\models\HappinessStoreUser;
  12. use addons\Happiness\common\models\HappinessStore;
  13. use addons\Happiness\common\models\HappinessStoreCensus;
  14. use addons\Happiness\common\models\HappinessStoreGoods;
  15. use addons\Happiness\common\models\HappinessStoreGoodsAttr;
  16. use addons\Happiness\common\models\HappinessStoreStatistics;
  17. use addons\Happiness\common\service\CommissionService;
  18. use addons\Happiness\common\service\LockUserService;
  19. use common\enums\OrderStatusEnum;
  20. use common\enums\ShippingTypeEnum;
  21. use common\enums\StatusEnum;
  22. use common\models\order\OrderMarketing;
  23. use Exception;
  24. class OrderLogic
  25. {
  26. //记录门店会员信息
  27. public function setUserData($params, $order)
  28. {
  29. try {
  30. //查询门店是否已存在该用户信息
  31. $user_info = HappinessStoreUser::getOne([
  32. ['mall_id' => $params['mall_id']],
  33. ['user_id' => $params['user_id']],
  34. ['store_id' => $params['store_id']],
  35. ]);
  36. $is_add = false;
  37. if (empty($user_info)) {
  38. $user_info = new HappinessStoreUser();
  39. $user_info->mall_id = $params['mall_id'];
  40. $user_info->user_id = $params['user_id'];
  41. $user_info->store_id = $params['store_id'];
  42. $user_info->loadDefaultValues();
  43. $is_add = true;
  44. }
  45. $user_info->last_time = $order['pay_time'];
  46. $user_info->order_nums += 1;
  47. $user_info->pay_nums += 1;
  48. $user_info->pay_money += $order['pay_money'];
  49. if (!$user_info->save()) throw new Exception('记录门店会员信息失败');
  50. if ($is_add) {
  51. //维护门店数据
  52. HappinessStore::updateAllCounters(['user_nums' => 1], ['mall_id' => $params['mall_id'], 'id' => $params['store_id']]);
  53. HappinessStoreCensus::setData([
  54. 'mall_id' => $params['mall_id'],
  55. 'store_id' => $params['store_id'],
  56. 'add_user_nums' => 1,
  57. 'date_time' => date('Y-m-d', time()),
  58. ]);
  59. }
  60. return true;
  61. } catch (\Exception $e) {
  62. var_dump($e->getMessage());
  63. \Yii::error($e->getMessage());
  64. throw new Exception($e->getMessage());
  65. }
  66. }
  67. //记录门店订单收益
  68. public function setStoreCommission($params, $order)
  69. {
  70. $trans = \Yii::$app->db->beginTransaction();
  71. try {
  72. //获取幸福小店基础配置
  73. $setting = \Yii::$app->services->setting->addons->get($params['mall_id'], HappinessEnum::ADDONS_NAME, 'basic');
  74. $commission_params = [
  75. 'mall_id' => $params['mall_id'],
  76. 'store_id' => $params['store_id'],
  77. 'user_id' => $params['user_id'],
  78. 'order_no' => $order['order_no'],
  79. 'order_money' => $order['goods_price'],
  80. 'pay_money' => $order['pay_money'],
  81. 'discount_money' => bcsub($order['original_goods_price'], $order['goods_price'], 2),
  82. 'is_settlement' => 0,
  83. 'status' => 1,
  84. 'settle_type' => $setting['settle_type'],
  85. 'score_money' => $order['score_money'] ?? 0,
  86. 'type'=>$params['type']??1,
  87. ];
  88. $service_charge = 0;
  89. $setting['settle_type']=2;
  90. switch ($setting['settle_type']) {
  91. case 1: //门店商品售价
  92. $amount_received = $order['original_goods_price'];
  93. break;
  94. case 2: //订单实际支付
  95. $amount_received = $order['pay_money'];
  96. break;
  97. case 3: //商品成本+运费
  98. $amount_received = array_sum(array_column($order['detail'], 'cost_price')) + $order['shipping_money'];
  99. break;
  100. case 4: //订单实际支付+积分抵扣
  101. $amount_received = $order['pay_money'] + $order['score_money'];
  102. break;
  103. }
  104. $store_total_commission=0;
  105. foreach ($order['detail'] as $key => $value) {
  106. //库存扣减
  107. $happiness_goods_attr = HappinessStoreGoodsAttr::getOne([
  108. ['mall_id' => $params['mall_id']],
  109. ['store_id' => $params['store_id']],
  110. ['attr_id' => $value['goods_attr_id']],
  111. ['status' => StatusEnum::ENABLED],
  112. ['is_on_sale' => 1],
  113. ]);
  114. $happiness_goods_attr->stock -= $value['num'];
  115. $happiness_goods_attr->save();
  116. $happiness_goods = HappinessStoreGoods::getOne([
  117. ['mall_id' => $params['mall_id']],
  118. ['store_id' => $params['store_id']],
  119. ['goods_id' => $value['goods_id']],
  120. ['status' => StatusEnum::ENABLED],
  121. ['is_on_sale' => 1],
  122. ]);
  123. $happiness_goods->stock -= $value['num'];
  124. $happiness_goods->sales_num += $value['num'];
  125. $happiness_goods->save();
  126. $happiness_goods=HappinessGoods::getOne([
  127. ['mall_id' => $params['mall_id']],
  128. ['goods_id' => $value['goods_id']],
  129. ['status' => StatusEnum::ENABLED],
  130. ['is_on_sale' => 1],
  131. ]);
  132. if(empty($happiness_goods))
  133. {
  134. //取最后一条数据
  135. $happiness_goods=HappinessGoods::find()->where(['mall_id' => $params['mall_id'],'goods_id' =>
  136. $value['goods_id']])->orderBy('id desc')->one();
  137. }
  138. $store_scale=bcdiv($happiness_goods->store_scale,100,4);
  139. $goods_price=bcmul($value['goods_price'],$store_scale,2);
  140. $store_total_commission =bcadd($goods_price,$store_total_commission,2);
  141. //维护商品销量数据
  142. HappinessGoods::updateAllCounters(['sales_num' => $value['num']], ['mall_id' => $params['mall_id'], 'goods_id' => $value['goods_id']]);
  143. HappinessGoodsRanking::setData([
  144. 'mall_id' => $params['mall_id'],
  145. 'store_id' => $params['store_id'],
  146. 'goods_id' => $value['goods_id'],
  147. 'sales_money' => $value['goods_price'],
  148. 'status' => StatusEnum::ENABLED,
  149. ]);
  150. }
  151. if ($setting['service_fee'] == 1) $service_charge = bcmul($store_total_commission, $setting['platform_ratio']/100, 2);
  152. $amount_received = bcsub($store_total_commission, $service_charge, 2);
  153. $commission_params['all_commission'] = $store_total_commission;//总佣金
  154. $commission_arr=[];//佣金计算
  155. //扣除店主分享和用户分享收益
  156. $share_commission=0;
  157. $commission_params['store_share_commission'] =0;
  158. $commission_params['share_commission'] =0;
  159. $commission_params['store_scale']=$setting['store_share_scale'];
  160. if (!empty($params['parent_id'])) {
  161. $store_parent = HappinessStore::findOne([
  162. ['mall_id' => $params['mall_id']],
  163. ['user_id' => $params['parent_id']],
  164. ['status' => StatusEnum::ENABLED],
  165. ]);
  166. if($store_parent && !empty($setting['store_share_scale']) && $params['store_id'] == $store_parent['id'])
  167. {
  168. //店主分享收益
  169. $share_commission=bcmul($order['pay_money'], bcdiv($setting['store_share_scale'],100,4), 2);
  170. $commission_params['store_share_commission']=$share_commission;
  171. $commission_arr[]=[
  172. 'user_id'=>$store_parent['user_id'],
  173. 'money'=>$share_commission,
  174. 'order_id'=>$order['id'],
  175. 'order_no'=>$order['order_no'],
  176. 'commission_type'=>HappinessRewardEnum::COMMISSION_TYPE_SHARE,
  177. 'commission_status'=>HappinessRewardEnum::NO_SETTLE,
  178. 'remark'=>'用户('.$store_parent['user_id'].')(店主)获得小店分享收益',
  179. 'store_id'=>$params['store_id'],
  180. 'mall_id'=>$params['mall_id'],
  181. 'order_money' => $order['pay_money'],
  182. ];
  183. }
  184. else
  185. {
  186. //用户分享收益
  187. $share_commission=bcmul($order['pay_money'], bcdiv($setting['share_scale'],100,4), 2);
  188. $commission_arr[]=[
  189. 'user_id'=>$params['parent_id'],
  190. 'money'=>$share_commission,
  191. 'order_id'=>$order['id'],
  192. 'order_no'=>$order['order_no'],
  193. 'commission_type'=>HappinessRewardEnum::COMMISSION_TYPE_SHARE,
  194. 'commission_status'=>HappinessRewardEnum::NO_SETTLE,
  195. 'remark'=>'用户('.$params['parent_id'].')获得小店分享收益',
  196. 'store_id'=>$params['store_id'],
  197. 'mall_id'=>$params['mall_id'],
  198. 'order_money' => $order['pay_money'],
  199. ];
  200. }
  201. }
  202. $amount_received=bcsub($amount_received,$share_commission,2);
  203. $commission_params['amount_received'] = $amount_received;//小店实收货款 //需要扣除店主分享和用户分享收益
  204. $commission_params['service_charge'] = $service_charge;
  205. $commission_params['platform_ratio'] = $setting['platform_ratio'];
  206. $commission_params['share_commission'] = $share_commission;
  207. $commissionService=new CommissionService(['mall_id' => $params['mall_id']]);
  208. $commission_arr2=$commissionService->calculateAndRecord($order,$params);
  209. $commission_arr=array_merge($commission_arr,$commission_arr2);
  210. //维护门店数据
  211. HappinessStore::updateAllCounters(['total_order_money' => $order['pay_money'], 'total_num' => 1, 'unsettled_amount' => $commission_params['amount_received']], ['mall_id' => $params['mall_id'], 'id' => $params['store_id']]);
  212. //记录佣金记录
  213. if(!empty($commission_arr))
  214. {
  215. foreach ($commission_arr as $value)
  216. {
  217. $res=$commissionService->record($value);
  218. if($res===false)
  219. {
  220. throw new \Exception($commissionService->getError());
  221. }
  222. }
  223. }
  224. $res = HappinessStoreCommission::setData($commission_params);
  225. if (!$res) throw new Exception(HappinessStoreCommission::$static_error);
  226. //记录每日数据
  227. $res = HappinessStoreCensus::setData([
  228. 'mall_id' => $params['mall_id'],
  229. 'store_id' => $params['store_id'],
  230. 'order_nums' => 1,
  231. 'sales_money' => $order['pay_money'],
  232. 'date_time' => date('Y-m-d', time()),
  233. ]);
  234. if (!$res) throw new Exception(HappinessStoreCensus::$static_error);
  235. $trans->commit();
  236. return true;
  237. } catch (\Exception $e) {
  238. $trans->rollBack();
  239. \Yii::error($e->getMessage().$e->getFile());
  240. throw new Exception($e->getMessage());
  241. }
  242. }
  243. //解冻收益
  244. public function frozeCommission($params, $order)
  245. {
  246. try {
  247. $froze_commission_data = HappinessStoreCommission::getOne([
  248. ['mall_id' => $params['mall_id']],
  249. ['store_id' => $params['store_id']],
  250. ['order_no' => $order['order_no']],
  251. ['is_settlement' => 0],
  252. ]);
  253. if (empty($froze_commission_data)) throw new Exception('查无此收益数据');
  254. $froze_commission_data->is_settlement = 1;
  255. //获取门店信息
  256. $store_info = HappinessStore::getOne([
  257. ['mall_id' => $params['mall_id']],
  258. ['id' => $params['store_id']],
  259. ]);
  260. if (empty($store_info)) throw new Exception('查无此门店');
  261. $store_info->total_money += $froze_commission_data->amount_received;
  262. $store_info->balance += $froze_commission_data->amount_received;
  263. $store_info->total_settled_amount += $froze_commission_data->amount_received;
  264. $store_info->unsettled_amount -= $froze_commission_data->amount_received;
  265. if (!$froze_commission_data->save()) throw new Exception('维护收益数据失败');
  266. if (!$store_info->save()) throw new Exception('维护门店数据失败');
  267. HappinessStoreStatistics::updateIncomeMoney($store_info, $froze_commission_data->amount_received);
  268. //记录每日数据
  269. HappinessStoreCensus::setData([
  270. 'mall_id' => $params['mall_id'],
  271. 'store_id' => $params['store_id'],
  272. 'date_time' => date('Y-m-d', time()),
  273. 'settlement_commission' => $froze_commission_data->amount_received,
  274. ]);
  275. //记录门店店主小店收益
  276. $commissionService=new CommissionService(['mall_id' => $params['mall_id']]);
  277. $store_user_id=HappinessStore::findOne(['mall_id' => $params['mall_id'], 'id' => $params['store_id']])['user_id'];
  278. $res=$commissionService->statsItem( [
  279. 'mall_id' => $params['mall_id'],
  280. 'store_id' => $params['store_id'],
  281. 'order_id' => $order['id'],
  282. 'order_no' => $order['order_no'],
  283. 'order_money' => $order['pay_money'],
  284. 'user_id' => $store_user_id,
  285. 'money'=>$froze_commission_data->amount_received
  286. ],'store_money');
  287. if (!$res) throw new Exception($commissionService->getError());
  288. return true;
  289. } catch (\Exception $e) {
  290. \Yii::error($e->getMessage());
  291. throw new Exception($e->getMessage());
  292. }
  293. }
  294. //售后维护订单数据
  295. public function refundChangeData($params, $order_detail, $order)
  296. {
  297. $trans = \Yii::$app->db->beginTransaction();
  298. try {
  299. //获取收益信息
  300. $commission_data = HappinessStoreCommission::getOne([
  301. ['mall_id' => $params['mall_id']],
  302. ['store_id' => $params['store_id']],
  303. ['order_no' => $order['order_no']],
  304. ['is_settlement' => 0],
  305. ]);
  306. if (empty($commission_data)) throw new Exception('查无此收益信息');
  307. //获取门店信息
  308. $store_info = HappinessStore::getOne([
  309. ['mall_id' => $params['mall_id']],
  310. ['id' => $params['store_id']],
  311. ]);
  312. //获取下单用户信息
  313. $user_info = HappinessStoreUser::getOne([
  314. ['mall_id' => $params['mall_id']],
  315. ['user_id' => $params['user_id']],
  316. ['store_id' => $params['store_id']],
  317. ]);
  318. //如果订单已完全售后完成
  319. if ($order['is_feedback'] == 2) {
  320. $store_info->unsettled_amount -= $commission_data->amount_received;
  321. $store_info->total_num -= 1;
  322. $store_info->total_order_money -= $commission_data->amount_received;
  323. $user_info->refund_nums += 1;
  324. $user_info->refund_money += $order['pay_money'];
  325. $commission_data->is_settlement = -1;
  326. } else {
  327. //获取marketing数据
  328. $order_marketing = OrderMarketing::getOne([
  329. ['order_detail_id' => $order_detail['id']]
  330. ]);
  331. // $user_info->refund_money += $order_detail['goods_price'];
  332. switch ($commission_data->settle_type) {
  333. case 1: //门店商品售价
  334. $amount_received = $order_detail['original_goods_price'];
  335. break;
  336. case 2: //订单实际支付
  337. $amount_received = $order_detail['goods_price'];
  338. break;
  339. case 3: //商品成本+运费
  340. $amount_received = $order_detail['cost_price'];
  341. break;
  342. case 4: //订单实际支付+积分抵扣
  343. $score_money = 0;
  344. if (!empty($order_marketing['deduct_currency'])) $score_money = $order_marketing['deduct_currency']['score']['money'];
  345. $amount_received = bcadd($order_detail['goods_price'], $score_money, 2);
  346. break;
  347. }
  348. if ($commission_data->service_charge > 0) {
  349. $service_charge = bcmul($amount_received, $commission_data->platform_ratio/100, 2);
  350. $amount_received = bcsub($amount_received, $service_charge, 2);
  351. }
  352. $commission_data->amount_received -= $amount_received;
  353. $store_info->unsettled_amount -= $amount_received;
  354. $store_info->total_order_money -= $amount_received;
  355. }
  356. if (!$commission_data->save()) throw new Exception('维护资金数据失败');
  357. if (!$user_info->save()) throw new Exception('维护门店用户数据失败');
  358. if (!$store_info->save()) throw new Exception('维护门店数据失败');
  359. //库存退回
  360. $happiness_goods_attr = HappinessStoreGoodsAttr::getOne([
  361. ['mall_id' => $params['mall_id']],
  362. ['store_id' => $params['store_id']],
  363. ['attr_id' => $order_detail['goods_attr_id']],
  364. ['status' => StatusEnum::ENABLED],
  365. ['is_on_sale' => 1],
  366. ]);
  367. $happiness_goods_attr->stock += $order_detail['num'];
  368. $happiness_goods_attr->save();
  369. $happiness_goods = HappinessStoreGoods::getOne([
  370. ['mall_id' => $params['mall_id']],
  371. ['store_id' => $params['store_id']],
  372. ['goods_id' => $order_detail['goods_id']],
  373. ['status' => StatusEnum::ENABLED],
  374. ['is_on_sale' => 1],
  375. ]);
  376. $happiness_goods->stock += $order_detail['num'];
  377. $happiness_goods->save();
  378. $trans->commit();
  379. return true;
  380. } catch (\Exception $e) {
  381. $trans->rollBack();
  382. throw new Exception($e->getMessage());
  383. }
  384. }
  385. }