StoreOrderCartInfoServices.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\services\order;
  12. use crmeb\utils\Str;
  13. use app\services\BaseServices;
  14. use crmeb\services\CacheService;
  15. use app\dao\order\StoreOrderCartInfoDao;
  16. /**
  17. * Class StoreOrderCartInfoServices
  18. * @package app\services\order
  19. * @method array getCartColunm(array $where, string $field, ?string $key) 获取购物车信息以数组返回
  20. * @method array getCartInfoList(array $where, array $field) 获取购物车详情列表
  21. * @method getSplitCartNum(array $cart_id)
  22. * @method getOne(array $where, ?string $field = '*', array $with = []) 根据条件获取一条数据
  23. */
  24. class StoreOrderCartInfoServices extends BaseServices
  25. {
  26. /**
  27. * StoreOrderCartInfoServices constructor.
  28. * @param StoreOrderCartInfoDao $dao
  29. */
  30. public function __construct(StoreOrderCartInfoDao $dao)
  31. {
  32. $this->dao = $dao;
  33. }
  34. /**
  35. * 清空订单商品缓存
  36. * @param int $oid
  37. * @return bool
  38. * @throws \Psr\SimpleCache\InvalidArgumentException
  39. */
  40. public function clearOrderCartInfo(int $oid)
  41. {
  42. return CacheService::delete(md5('store_order_cart_info_' . $oid));
  43. }
  44. /**
  45. * 获取指定订单下的商品详情
  46. * @param int $oid
  47. * @return array|mixed
  48. */
  49. public function getOrderCartInfo(int $oid)
  50. {
  51. $cartInfo = CacheService::get(md5('store_order_cart_info_' . $oid));
  52. if ($cartInfo) return $cartInfo;
  53. $cart_info = $this->dao->getColumn(['oid' => $oid], 'cart_info', 'cart_id');
  54. $info = [];
  55. foreach ($cart_info as $k => $v) {
  56. $_info = is_string($v) ? json_decode($v, true) : $v;
  57. if (!isset($_info['productInfo'])) $_info['productInfo'] = [];
  58. //缩略图处理
  59. if (isset($_info['productInfo']['attrInfo'])) {
  60. $_info['productInfo']['attrInfo'] = get_thumb_water($_info['productInfo']['attrInfo']);
  61. }
  62. $_info['productInfo'] = get_thumb_water($_info['productInfo']);
  63. $_info['refund_num'] = $this->dao->sum(['cart_id' => $_info['id']], 'refund_num');
  64. $info[$k]['cart_info'] = $_info;
  65. unset($_info);
  66. }
  67. CacheService::set(md5('store_order_cart_info_' . $oid), $info);
  68. return $info;
  69. }
  70. /**
  71. * 查找购物车里的所有商品标题
  72. * @param int $oid
  73. * @param $cartId
  74. * @param false $goodsNum
  75. * @return bool|mixed|string
  76. * @throws \think\db\exception\DataNotFoundException
  77. * @throws \think\db\exception\DbException
  78. * @throws \think\db\exception\ModelNotFoundException
  79. */
  80. public function getCarIdByProductTitle(int $oid, $cartId, $goodsNum = false)
  81. {
  82. $key = md5('store_order_cart_product_title_' . $oid . '_' . is_array($cartId) ? implode('_', $cartId) : $cartId);
  83. $title = CacheService::get($key);
  84. if (!$title) {
  85. $orderCart = $this->dao->getCartInfoList(['oid' => $oid, 'cart_id' => $cartId], ['cart_info']);
  86. foreach ($orderCart as $item) {
  87. if (isset($item['cart_info']['productInfo']['store_name'])) {
  88. if ($goodsNum && isset($item['cart_info']['cart_num'])) {
  89. $title .= $item['cart_info']['productInfo']['store_name'] . ' * ' . $item['cart_info']['cart_num'] . ' | ';
  90. } else {
  91. $title .= $item['cart_info']['productInfo']['store_name'] . '|';
  92. }
  93. }
  94. }
  95. if ($title) {
  96. $title = substr($title, 0, strlen($title) - 1);
  97. }
  98. CacheService::set($key, $title);
  99. }
  100. return $title ?: '';
  101. }
  102. /**
  103. * 获取打印订单的商品信息
  104. * @param array $cartId
  105. * @return array
  106. * @throws \think\db\exception\DataNotFoundException
  107. * @throws \think\db\exception\DbException
  108. * @throws \think\db\exception\ModelNotFoundException
  109. */
  110. public function getCartInfoPrintProduct(array $cartId)
  111. {
  112. $cartInfo = $this->dao->getCartInfoList(['cart_id' => $cartId], ['cart_info']);
  113. $product = [];
  114. foreach ($cartInfo as $item) {
  115. $value = is_string($item['cart_info']) ? json_decode($item['cart_info'], true) : $item['cart_info'];
  116. $value['productInfo']['store_name'] = $value['productInfo']['store_name'] ?? "";
  117. $value['productInfo']['store_name'] = Str::substrUTf8($value['productInfo']['store_name'], 10, 'UTF-8', '');
  118. $product[] = $value;
  119. }
  120. return $product;
  121. }
  122. /**
  123. * 获取产品返佣金额
  124. * @param array $cartId
  125. * @param bool $type true = 一级返佣, fasle = 二级返佣
  126. * @return string
  127. */
  128. public function getProductBrokerage(array $cartId, bool $type = true)
  129. {
  130. $cartInfo = $this->dao->getCartInfoList(['cart_id' => $cartId], ['cart_info']);
  131. $oneBrokerage = '0';//一级返佣金额
  132. $twoBrokerage = '0';//二级返佣金额
  133. $sumProductPrice = '0';//非指定返佣商品总金额
  134. foreach ($cartInfo as $value) {
  135. $cartNum = $value['cart_info']['cart_num'] ?? 0;
  136. if (isset($value['cart_info']['productInfo'])) {
  137. $productInfo = $value['cart_info']['productInfo'];
  138. //指定返佣金额
  139. if (isset($productInfo['is_sub']) && $productInfo['is_sub'] == 1) {
  140. $oneBrokerage = bcadd($oneBrokerage, bcmul($cartNum, $productInfo['attrInfo']['brokerage'] ?? 0, 2), 2);
  141. $twoBrokerage = bcadd($twoBrokerage, bcmul($cartNum, $productInfo['attrInfo']['brokerage_two'] ?? 0, 2), 2);
  142. } else {
  143. //比例返佣
  144. if (isset($productInfo['attrInfo'])) {
  145. $sumProductPrice = bcadd($sumProductPrice, bcmul($cartNum, $productInfo['attrInfo']['price'] ?? 0, 2), 2);
  146. } else {
  147. $sumProductPrice = bcadd($sumProductPrice, bcmul($cartNum, $productInfo['price'] ?? 0, 2), 2);
  148. }
  149. }
  150. }
  151. }
  152. if ($type) {
  153. //获取后台一级返佣比例
  154. $storeBrokerageRatio = sys_config('store_brokerage_ratio');
  155. //一级返佣比例 小于等于零时直接返回 不返佣
  156. if ($storeBrokerageRatio <= 0) {
  157. return $oneBrokerage;
  158. }
  159. //计算获取一级返佣比例
  160. $brokerageRatio = bcdiv($storeBrokerageRatio, 100, 4);
  161. $brokeragePrice = bcmul($sumProductPrice, $brokerageRatio, 2);
  162. //固定返佣 + 比例返佣 = 一级总返佣金额
  163. return bcadd($oneBrokerage, $brokeragePrice, 2);
  164. } else {
  165. //获取二级返佣比例
  166. $storeBrokerageTwo = sys_config('store_brokerage_two');
  167. //二级返佣比例小于等于0 直接返回
  168. if ($storeBrokerageTwo <= 0) {
  169. return $twoBrokerage;
  170. }
  171. //计算获取二级返佣比例
  172. $brokerageRatio = bcdiv($storeBrokerageTwo, 100, 4);
  173. $brokeragePrice = bcmul($sumProductPrice, $brokerageRatio, 2);
  174. //固定返佣 + 比例返佣 = 二级总返佣金额
  175. return bcadd($twoBrokerage, $brokeragePrice, 2);
  176. }
  177. }
  178. /**
  179. * 保存购物车info
  180. * @param $oid
  181. * @param $uid
  182. * @param array $cartInfo
  183. * @return int
  184. */
  185. public function setCartInfo($oid, $uid, array $cartInfo)
  186. {
  187. $group = [];
  188. foreach ($cartInfo as $cart) {
  189. $group[] = [
  190. 'oid' => $oid,
  191. 'uid' => $uid,
  192. 'cart_id' => $cart['id'],
  193. 'product_id' => $cart['productInfo']['id'],
  194. 'cart_info' => json_encode($cart),
  195. 'cart_num' => $cart['cart_num'],
  196. 'surplus_num' => $cart['cart_num'],
  197. 'unique' => md5($cart['id'] . '' . $oid)
  198. ];
  199. }
  200. return $this->dao->saveAll($group);
  201. }
  202. /**
  203. * 订单创建成功之后计算订单(实际优惠、积分、佣金、上级、上上级)
  204. * @param $oid
  205. * @param array $cartInfo
  206. * @return bool
  207. */
  208. public function updateCartInfo($oid, array $cartInfo)
  209. {
  210. foreach ($cartInfo as $cart) {
  211. $group = [
  212. 'cart_info' => json_encode($cart)
  213. ];
  214. $this->dao->update(['oid' => $oid, 'cart_id' => $cart['id']], $group);
  215. }
  216. return true;
  217. }
  218. /**
  219. * 商品编号
  220. * @param $cartId
  221. * @return array
  222. */
  223. public function getCartIdsProduct($cartId)
  224. {
  225. return $this->dao->getColumn([['cart_id', 'in', $cartId]], 'product_id', 'oid');
  226. }
  227. /**
  228. * 获取某个订单还可以拆分商品 split_status 0:未拆分1:部分拆分2:拆分完成
  229. * @param int $oid
  230. * @param string $field
  231. * @param string $key
  232. * @return array
  233. */
  234. public function getSplitCartList(int $oid, string $field = '*', string $key = 'cart_id')
  235. {
  236. $cartInfo = $this->dao->getColumn([['oid', '=', $oid], ['split_status', 'IN', [0, 1]]], $field, $key);
  237. foreach ($cartInfo as &$item) {
  238. if ($field == 'cart_info') {
  239. $item = is_string($item) ? json_decode($item, true) : $item;
  240. } else {
  241. if (isset($item['cart_info'])) $item['cart_info'] = is_string($item['cart_info']) ? json_decode($item['cart_info'], true) : $item['cart_info'];
  242. if (isset($item['cart_num']) && !$item['cart_num']) {//兼容之前老数据
  243. $item['cart_num'] = $item['cart_info']['cart_num'] ?? 0;
  244. }
  245. }
  246. }
  247. return $cartInfo;
  248. }
  249. /**
  250. * 获取可退款商品
  251. * @param int $oid
  252. * @param string $field
  253. * @param string $key
  254. * @return array
  255. */
  256. public function getRefundCartList(int $oid, string $field = '*', string $key = '')
  257. {
  258. $cartInfo = array_merge($this->dao->getColumn(['oid' => $oid], $field, 'id'));
  259. foreach ($cartInfo as $key => &$item) {
  260. if ($field == 'cart_info') {
  261. $item = is_string($item) ? json_decode($item, true) : $item;
  262. } else {
  263. if (isset($item['cart_info'])) $item['cart_info'] = is_string($item['cart_info']) ? json_decode($item['cart_info'], true) : $item['cart_info'];
  264. if (isset($item['cart_num']) && !$item['cart_num']) {//兼容之前老数据
  265. $item['cart_num'] = $item['cart_info']['cart_num'] ?? 0;
  266. }
  267. }
  268. $surplus = (int)bcsub((string)$item['cart_num'], (string)$item['refund_num'], 0);
  269. if ($surplus > 0) {
  270. $item['surplus_num'] = $surplus;
  271. } else {
  272. unset($cartInfo['key']);
  273. }
  274. }
  275. return $cartInfo;
  276. }
  277. }