ShopOrderLogic.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  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. $addressInfo = ShopAddress::field('area,address,house_number,contact_number,contact_people')->findOrEmpty($params['address_id']);
  40. if($addressInfo->isEmpty()){
  41. throw new \Exception('收货地址不存在');
  42. }
  43. //生成订单编号
  44. $sn = generate_sn(ShopOrders::class, 'sn');
  45. $shop_order_goods = array();
  46. $amount_total = 0;//总价
  47. $amount = 0;//应支付价格
  48. //验证商品库存是否存在
  49. foreach ($shop_carts as $v){
  50. $inventory = ShopGoodSpecsInventory::where('id',$v['goods_specs_inventory_id'])->findOrEmpty();
  51. $shop_good = ShopGoods::where('id',$v['shop_goods_id'])->findOrEmpty()->toArray();
  52. if($inventory->remaining_inventory<$v['number']){
  53. throw new Exception($shop_good['goods_name'].'库存不足');
  54. }
  55. //新增订单商品镜像
  56. $shop_order_goods[] = [
  57. 'sn'=>$sn,
  58. 'shop_goods_id'=>$shop_good['id'],
  59. 'goods_category_ids' => $shop_good['goods_category_ids'],
  60. 'goods_category_id' => $shop_good['goods_category_id'],
  61. 'goods_name' => $shop_good['goods_name'],
  62. 'goods_image' => $shop_good['goods_image'],
  63. 'goods_banners' => $shop_good['goods_banners'],
  64. 'company_name' => $shop_good['company_name'],
  65. 'description' => $shop_good['description'],
  66. 'specs_type' => $shop_good['specs_type'],
  67. 'custom_attribute_items'=>json_encode($shop_good['custom_attribute_items'],JSON_UNESCAPED_UNICODE),
  68. 'goods_specs_inventory_id'=>$v['goods_specs_inventory_id'],
  69. 'specs'=>json_encode($inventory->specs,JSON_UNESCAPED_UNICODE),
  70. 'number'=>$v['number'],
  71. 'service_total'=>$inventory->service_total,
  72. 'service_fee'=>$inventory->service_fee
  73. ];
  74. //减少商品库存
  75. $inventory->remaining_inventory = $inventory->remaining_inventory-$v['number'];
  76. $inventory->save();
  77. $amount_total += $inventory['service_total']*$v['number'];
  78. $amount += $inventory['service_fee']*$v['number'];
  79. }
  80. //生成订单
  81. $order = ShopOrders::create([
  82. 'shop_order_type' => 1,
  83. 'worker_id' => $params['user_id'],
  84. 'sn' => $sn,
  85. 'real_name' => $addressInfo->contact_people,
  86. 'mobile' => $addressInfo->contact_number,
  87. 'address' => trim($addressInfo->area .$addressInfo->address . $addressInfo->house_number),
  88. 'pay_status' => 0,
  89. 'paw_way' => 2,
  90. 'order_terminal' => $params['terminal'],
  91. 'amount_total' => $amount_total,
  92. 'order_amount' => $amount,
  93. 'address_json' => $addressInfo->toArray()
  94. ]);
  95. //生成订单商品镜像
  96. $ShopOrderGoods = new ShopOrderGoods();
  97. $ShopOrderGoods->saveAll($shop_order_goods);
  98. //清除购物车商品
  99. ShopCart::whereIn('id',$params['shop_cart_id'])->delete();
  100. Db::commit();
  101. } catch (\Exception $e) {
  102. Db::rollback();
  103. self::setError($e->getMessage());
  104. return false;
  105. }
  106. return [
  107. 'order_id' => (int)$order['id'],
  108. ];
  109. }
  110. /**
  111. * @notes 获取详情
  112. * @param $params
  113. * @return array
  114. * @author likeadmin
  115. * @date 2024/07/18 13:51
  116. */
  117. public static function detail($params): array
  118. {
  119. $detail = ShopOrders::with(['orderGoods'=>function(Query $query){
  120. $query->field(['sn','goods_name','goods_image','number','service_fee','service_total','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']);
  121. }])->withCount('orderlogistic')->field('id, sn, real_name,mobile, address,address_json,pay_time, paw_way,pay_sn, pay_status, refund_status, refund_transaction_id,create_time,shop_order_type,amount_total, order_amount')
  122. ->append(['pay_way_text','pay_status_text','refund_status_text'])->where(['sn'=> $params['sn'],'worker_id'=>$params['worker_id']])->findOrEmpty()->toArray();
  123. if(empty($detail)){
  124. return [];
  125. }
  126. $orderGoodsArr = [];
  127. $companyNameArr = array_unique(array_column($detail['orderGoods'],'company_name'));
  128. foreach($companyNameArr as $val) {
  129. $orderGoods = [];
  130. foreach ($detail['orderGoods'] as $goodVal) {
  131. if($val == $goodVal['company_name']){
  132. unset($goodVal['goodsSpecsInventory'], $goodVal['custom_attribute_items'], $goodVal['specs'], $goodVal['sn'], $goodVal['goods_specs_inventory_id'],$goodVal['company_name']);
  133. $orderGoods[] = $goodVal;
  134. }
  135. }
  136. if(!empty($orderGoods)){
  137. $orderGoodsArr[] = [
  138. 'company_name' => $val,
  139. 'goods' => $orderGoods
  140. ];
  141. }
  142. }
  143. $detail['orderGoods'] = $orderGoodsArr;
  144. return $detail;
  145. }
  146. public static function cancelOrder($params):bool
  147. {
  148. Db::startTrans();
  149. try {
  150. $orderModel = ShopOrders::with('orderGoods.goodsSpecsInventory')->where([
  151. 'shop_order_type' => 1,
  152. 'worker_id' => $params['worker_id'],
  153. 'sn'=>$params['sn']
  154. ])->findOrEmpty();
  155. if($orderModel->isEmpty()){
  156. throw new \Exception('订单不存在或不是待支付状态');
  157. }
  158. if($orderModel->orderGoods()->count() === 0){
  159. throw new \Exception('订单商品不存在');
  160. }
  161. $updateData = [];
  162. foreach($orderModel->orderGoods as $goods){
  163. if(isset($goods->goodsSpecsInventory->remaining_inventory)){
  164. $updateData[$goods->goodsSpecsInventory->id] = ['remaining_inventory'=> $goods->goodsSpecsInventory->remaining_inventory+= $goods['number']];
  165. }
  166. }
  167. if(!empty($updateData)){
  168. ShopGoodSpecsInventory::updateWhenCase($updateData);
  169. }
  170. $orderModel->shop_order_type = 0;
  171. $orderModel->save();
  172. Db::commit();
  173. return true;
  174. } catch (\Exception $e) {
  175. Db::rollback();
  176. self::setError($e->getMessage());
  177. return false;
  178. }
  179. }
  180. /**
  181. * 物流详情
  182. * @param $params
  183. * @return array
  184. */
  185. public static function logisticDetail($params): array
  186. {
  187. try{
  188. $detail = ShopOrders::with(['orderGoods'=>function(Query $query){
  189. $query->field(['sn','shop_goods_id','goods_name','goods_image','company_name','delivery_type','shop_goods_type'])->append(['delivery_type_text','shop_goods_type_text']);
  190. },'orderlogistic' =>function (Query $query){
  191. $query->field(['id','order_id','express_id','shop_goods_id','logistic_number','logistic_status'])->append(['logistic_status_text']);
  192. $query->with('express');
  193. }])->field('id, sn')->where(['sn'=> $params['sn'],'worker_id'=>$params['worker_id']])->findOrEmpty()->toArray();
  194. if(empty($detail)){
  195. throw new \Exception('订单不存在');
  196. }
  197. $orderGoodsArr = [];
  198. $companyNameArr = array_unique(array_column($detail['orderGoods'],'company_name'));
  199. foreach($companyNameArr as $val) {
  200. $orderGoods = [];
  201. foreach ($detail['orderGoods'] as $goodVal) {
  202. if($val == $goodVal['company_name'] && !isset($orderGoods[$goodVal['shop_goods_id']])){
  203. unset($goodVal['goodsSpecsInventory'], $goodVal['custom_attribute_items'], $goodVal['specs'], $goodVal['sn'], $goodVal['goods_specs_inventory_id'],$goodVal['company_name']);
  204. $goodVal['logistic'] = [];
  205. foreach($detail['orderlogistic'] as $logisticVal){
  206. if($goodVal['shop_goods_id'] == $logisticVal['shop_goods_id']){
  207. $logisticVal['expresss_name'] = $logisticVal['express']['name'];
  208. unset($logisticVal['express']);
  209. $goodVal['logistic'][] = $logisticVal;
  210. }
  211. }
  212. $orderGoods[$goodVal['shop_goods_id']] = $goodVal;
  213. }
  214. }
  215. if(!empty($orderGoods)){
  216. $orderGoodsArr[] = [
  217. 'company_name' => $val,
  218. 'goods' =>array_values( $orderGoods)
  219. ];
  220. }
  221. }
  222. return $orderGoodsArr;
  223. } catch(\Exception $e){
  224. self::setError($e->getMessage());
  225. return [];
  226. }
  227. }
  228. /**
  229. * 确认收货
  230. * @param $params
  231. * @return bool
  232. */
  233. public static function confirmReceipt($params):bool
  234. {
  235. try{
  236. Db::startTrans();
  237. $orderModel = ShopOrders::where([
  238. 'shop_order_type' => 2,
  239. 'worker_id' => $params['worker_id'],
  240. 'sn'=>$params['sn']
  241. ])->findOrEmpty();
  242. if($orderModel->isEmpty()){
  243. throw new \Exception('订单不存在或不是待收货状态');
  244. }
  245. $orderModel->shop_order_type = 4;
  246. $orderModel->save();
  247. Db::commit();
  248. return true;
  249. }catch(\Exception $e){
  250. Db::rollback();
  251. self::setError($e->getMessage());
  252. return false;
  253. }
  254. }
  255. public static function deleteOrder($params):bool
  256. {
  257. try{
  258. $orderModel = ShopOrders::where([
  259. 'shop_order_type' => 0,
  260. 'worker_id' => $params['worker_id'],
  261. 'sn' => $params['sn']
  262. ])->findOrEmpty();
  263. if($orderModel->isEmpty()){
  264. throw new \Exception('订单不存在');
  265. }
  266. $orderModel->delete();
  267. return true;
  268. } catch(\Exception $e){
  269. self::setError($e->getMessage());
  270. return false;
  271. }
  272. }
  273. }