ShopOrderLogic.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace app\workerapi\logic\shops;
  3. use app\common\logic\BaseLogic;
  4. use app\common\model\article\Article;
  5. use app\common\model\decorate\DecoratePage;
  6. use app\common\model\decorate\DecorateTabbar;
  7. use app\common\model\setting\PostageRegion;
  8. use app\common\model\shops\ShopAddress;
  9. use app\common\model\shops\ShopCart;
  10. use app\common\model\shops\ShopGoods;
  11. use app\common\model\shops\ShopGoodSpecsInventory;
  12. use app\common\model\shops\ShopOrderGoods;
  13. use app\common\model\shops\ShopOrders;
  14. use app\common\model\user\UserAddress;
  15. use app\common\service\ConfigService;
  16. use app\common\service\FileService;
  17. use think\db\Query;
  18. use think\Exception;
  19. use think\facade\Db;
  20. /**
  21. * 订单
  22. */
  23. class ShopOrderLogic extends BaseLogic
  24. {
  25. /**
  26. * 提交订单
  27. * @param array $params
  28. * @return array|false
  29. */
  30. public static function submitOrder($params)
  31. {
  32. Db::startTrans();
  33. try {
  34. //获取购物车商品
  35. $shop_carts = ShopCart::whereIn('id',$params['shop_cart_id'])->where('worker_id',$params['user_id'])->select()->toArray();
  36. if(empty($shop_carts)){
  37. throw new Exception('购物车商品不存在');
  38. }
  39. //生成订单编号
  40. $sn = generate_sn(ShopOrders::class, 'sn');
  41. $shop_order_goods = array();
  42. $amount_total = 0;//总价
  43. $amount = 0;//应支付价格
  44. //验证商品库存是否存在
  45. foreach ($shop_carts as $v){
  46. $inventory = ShopGoodSpecsInventory::where('id',$v['goods_specs_inventory_id'])->findOrEmpty();
  47. $shop_good = ShopGoods::where('id',$v['shop_goods_id'])->findOrEmpty()->toArray();
  48. if($inventory->remaining_inventory<$v['number']){
  49. throw new Exception($shop_good['goods_name'].'库存不足');
  50. }
  51. //新增订单商品镜像
  52. $shop_order_goods[] = [
  53. 'sn'=>$sn,
  54. 'shop_goods_id'=>$shop_good['id'],
  55. 'goods_category_ids' => $shop_good['goods_category_ids'],
  56. 'goods_category_id' => $shop_good['goods_category_id'],
  57. 'goods_name' => $shop_good['goods_name'],
  58. 'goods_image' => $shop_good['goods_image'],
  59. 'goods_banners' => $shop_good['goods_banners'],
  60. 'company_name' => $shop_good['company_name'],
  61. 'description' => $shop_good['description'],
  62. 'specs_type' => $shop_good['specs_type'],
  63. 'custom_attribute_items'=>json_encode($shop_good['custom_attribute_items'],JSON_UNESCAPED_UNICODE),
  64. 'goods_specs_inventory_id'=>$v['goods_specs_inventory_id'],
  65. 'specs'=>json_encode($inventory->specs,JSON_UNESCAPED_UNICODE),
  66. 'number'=>$v['number'],
  67. 'service_total'=>$inventory->service_total,
  68. 'service_fee'=>$inventory->service_fee
  69. ];
  70. //减少商品库存
  71. $inventory->remaining_inventory = $inventory->remaining_inventory-$v['number'];
  72. $inventory->save();
  73. $amount_total += $inventory['service_total'];
  74. $amount += $inventory['service_fee'];
  75. }
  76. //生成订单
  77. $order = ShopOrders::create([
  78. 'shop_order_type' => 1,
  79. 'worker_id' => $params['user_id'],
  80. 'sn' => $sn,
  81. 'real_name' => $params['real_name'],
  82. 'mobile' => $params['mobile'],
  83. 'address' => $params['address'],
  84. 'pay_status' => 0,
  85. 'paw_way' => 2,
  86. 'order_terminal' => $params['terminal'],
  87. 'amount_total' => $amount_total,
  88. 'order_amount' => $amount,
  89. ]);
  90. //生成订单商品镜像
  91. $ShopOrderGoods = new ShopOrderGoods();
  92. $ShopOrderGoods->saveAll($shop_order_goods);
  93. //清除购物车商品
  94. ShopCart::whereIn('id',$params['shop_cart_id'])->delete();
  95. Db::commit();
  96. } catch (\Exception $e) {
  97. self::setError($e->getMessage());
  98. return false;
  99. }
  100. return [
  101. 'order_id' => (int)$order['id'],
  102. ];
  103. }
  104. /**
  105. * @notes 获取详情
  106. * @param $params
  107. * @return array
  108. * @author likeadmin
  109. * @date 2024/07/18 13:51
  110. */
  111. public static function detail($params): array
  112. {
  113. $detail = ShopOrders::with(['orderGoods'=>function(Query $query){
  114. $query->field(['sn','goods_name','goods_image','number','service_fee','company_name','delivery_type','shop_goods_type','goods_specs_inventory_id','specs_type','custom_attribute_items','specs'])->append(['spec_arr','delivery_type_text','shop_goods_type_text']);
  115. }])->field('id, sn, real_name,mobile, address,pay_time, paw_way,pay_sn, pay_status, refund_status, refund_transaction_id,create_time,shop_order_type,amount_total, order_amount')
  116. ->append(['pay_way_text','pay_status_text','refund_status_text'])->where(['sn'=> $params['sn'],'worker_id'=>$params['worker_id']])->findOrEmpty()->toArray();
  117. $orderGoodsArr = [];
  118. $companyNameArr = array_unique(array_column($detail['orderGoods'],'company_name'));
  119. foreach($companyNameArr as $val) {
  120. $orderGoods = [];
  121. foreach ($detail['orderGoods'] as $goodVal) {
  122. if($val == $goodVal['company_name']){
  123. unset($goodVal['goodsSpecsInventory'], $goodVal['custom_attribute_items'], $goodVal['specs'], $goodVal['sn'], $goodVal['goods_specs_inventory_id'],$goodVal['company_name']);
  124. $orderGoods[] = $goodVal;
  125. }
  126. }
  127. if(!empty($orderGoods)){
  128. $orderGoodsArr[] = [
  129. 'company_name' => $val,
  130. 'goods' => $orderGoods
  131. ];
  132. }
  133. }
  134. $detail['orderGoods'] = $orderGoodsArr;
  135. return $detail;
  136. }
  137. public static function cancelOrder($params):bool
  138. {
  139. Db::startTrans();
  140. try {
  141. $orderModel = ShopOrders::where([
  142. 'shop_order_type' => 1,
  143. 'worker_id' => $params['worker_id'],
  144. 'sn'=>$params['sn']
  145. ])->findOrEmpty();
  146. if($orderModel->isEmpty()){
  147. throw new \Exception('订单不存在或不是待支付状态');
  148. }
  149. $orderModel->shop_order_type = 0;
  150. $orderModel->save();
  151. Db::commit();
  152. return true;
  153. } catch (\Exception $e) {
  154. Db::rollback();
  155. self::setError($e->getMessage());
  156. return false;
  157. }
  158. }
  159. }