Orders.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php namespace App\Models;
  2. use Illuminate\Database\Eloquent\Factories\HasFactory;
  3. use Illuminate\Database\Eloquent\Model;
  4. use App\Models\Traits\Orders\Status as OrdersStatus;
  5. use App\Models\Product;
  6. use App\Models\Product\Skus as ProductSkus;
  7. use Illuminate\Support\Facades\DB;
  8. /**
  9. * 需求模型
  10. *
  11. */
  12. class Orders extends Model
  13. {
  14. use HasFactory,OrdersStatus;
  15. // 与模型关联的表名
  16. protected $table = 'orders';
  17. // 是否主动维护时间戳
  18. public $timestamps = false;
  19. // 定义时间戳字段名
  20. // const CREATED_AT = 'insert_time';
  21. // const UPDATED_AT = 'update_time';
  22. /**
  23. * 添加数据
  24. *
  25. */
  26. public function add($data)
  27. {
  28. // 时间
  29. if( empty($data['insert_time']) ) $data['insert_time'] = time();
  30. if( empty($data['update_time']) ) $data['update_time'] = time();
  31. // 写入数据表
  32. $id = $this->query()->insertGetId($data);
  33. // 返回结果
  34. return $id;
  35. }
  36. /**
  37. * 添加数据
  38. *
  39. */
  40. public function edit($id,$data)
  41. {
  42. // 更新时间
  43. if( empty($data['update_time']) ) $data['update_time'] = time();
  44. // 写入数据表
  45. $result = $this->query()->where([['id','=',$id]])->update($data);
  46. // 返回结果
  47. return $id;
  48. }
  49. /**
  50. * 编码转id
  51. *
  52. * @param string $code 编码
  53. *
  54. */
  55. public function codeToId($code){
  56. return intval(str_ireplace('kldd','',$code));
  57. }
  58. /**
  59. * id转编码
  60. *
  61. * @param int $id 编码
  62. *
  63. */
  64. public function idToCode($id){
  65. return 'kldd'. str_pad($id, 9, '0', STR_PAD_LEFT);;
  66. }
  67. /**
  68. * 取消订单
  69. *
  70. * @param int $id 订单ID
  71. * @param int $status 订单状态
  72. * @param OrdersProduct $OrdersProduct 子订单模型
  73. */
  74. public function setOrderStatus($id,$status,$OrdersProduct){
  75. // 查询数据
  76. $result = $this->edit($id,['status'=>$status]);
  77. // 提示新增失败
  78. if( !$result ) {
  79. // 提示信息
  80. return ['error'=>'订单修改失败'];
  81. }
  82. // 查询数据
  83. $result = $OrdersProduct->query()->where([['order_id','=',$id]])->update(['status'=>$status,'update_time'=>time()]);
  84. // 提示新增失败
  85. if( !$result ) {
  86. // 提示信息
  87. return ['error'=>'子订单修改失败'];json_send(['code'=>'error','msg'=>'取消失败','data'=>['error'=>'']]);
  88. }
  89. // 如果是取消订单,恢复库存
  90. if( $status == 4 ) $this->restoreProductStock($id,$OrdersProduct);
  91. // 进行操作
  92. return ['success'=>'成功'];
  93. }
  94. /**
  95. * 取消优惠券关联订单
  96. *
  97. * @param int $orderTime 订单时间
  98. * @param int $uid 客户ID
  99. * @param OrdersProduct $OrdersProduct 子订单模型
  100. * @param CustomScore $CustomScore 客户积分
  101. */
  102. public function cancelRelate($orderTime,$uid,$OrdersProduct,$CustomScore){
  103. // 模型实例
  104. $CouponRewardRule = new \App\Models\CouponRewardRule();
  105. $CustomCoupon = new \App\Models\CustomCoupon();
  106. $CouponRewardProduct = new \App\Models\CouponRewardProduct();
  107. // 获取配置列表
  108. $ruleList = $CouponRewardRule->query()->where([['start_time','<=',$orderTime],['end_time','>=',$orderTime]])->get(['id','name','std_num','remove_custom','city_ids','status','start_time','end_time','coupon_id']);
  109. // 如果有活动列表
  110. foreach ($ruleList as $value) {
  111. // 查询客户是否有该优惠券
  112. $havaCoupon = $CustomCoupon->query()->where([['custom_uid','=',$uid],['coupon_id','=',$value['coupon_id']]])->first(['id','status','order_id']);
  113. // 没有优惠券,跳过
  114. if( !$havaCoupon ) continue;
  115. // 通过配置ID获取对应的商品范围
  116. $productList = $CouponRewardProduct->getListByRule($value['id']);
  117. // 获取客户 规定时段内订单的商品ID以及购买数量
  118. $orderList = $OrdersProduct->query()->where([['custom_uid','=',$uid],['status','=',1],['insert_time','>=',$value['start_time']],['insert_time','<=',$value['end_time']]])->get(['product_id','buy_num'])->toArray();
  119. // 计算商品总量
  120. $total = 0;
  121. // 循环商品范围
  122. foreach ($productList as $scope) {
  123. // 循环订单产品
  124. foreach ($orderList as $order) {
  125. // 如果产品不相等
  126. if( $scope['product_id'] != $order['product_id'] ) continue;
  127. // 相等的计算总量
  128. $total += $scope['product_units'] * $order['buy_num'];
  129. }
  130. }
  131. // 判断总数还是达标,跳过
  132. if( $total >= $value['std_num'] ) continue;
  133. // 剩余的达不到条件,如果有优惠券,未使用的的作废
  134. if( $havaCoupon['status'] == 0 ) {
  135. // 作废
  136. $CustomCoupon->edit($havaCoupon['id'],['status'=>4]);
  137. // 作废成功
  138. continue;
  139. }
  140. // 优惠券有订单信息
  141. if( $havaCoupon['order_id'] ) {
  142. // 获取优惠券关联的订单
  143. $oldData = $this->query()->where([['id','=',$havaCoupon['order_id']],['custom_uid','=',$uid]])->first(['id','order_score','status','custom_uid','insert_time']);
  144. // 如果订单不存在
  145. if( !$oldData ) continue;
  146. // 如果订单状态已取消
  147. if( $oldData['status'] == 4 ) continue;
  148. // 取消订单
  149. $result = $this->setOrderStatus($havaCoupon['order_id'],4,$OrdersProduct);
  150. // 取消失败
  151. if( isset($result['error']) ) return ['error'=>$result['error']];
  152. // 撤回订单
  153. if( $oldData['order_score'] > 0 ) {
  154. // 如果扣减失败
  155. $result = $CustomScore->trade($oldData['custom_uid'],$oldData['id'],($oldData['order_score']*-1),6,1);
  156. // 提示新增失败
  157. if( isset($result['error']) ) return ['error'=>$result['error']];
  158. }
  159. }
  160. }
  161. // 默认成功
  162. return ['success'=>'操作成功'];
  163. }
  164. /**
  165. * 根据订单ID恢复产品库存
  166. * @param int $orderId 订单OD
  167. * @param OrdersProduct $OrdersProduct 子订单模型
  168. *
  169. */
  170. private function restoreProductStock($orderId,$OrdersProduct){
  171. // 产品SKU
  172. $ProductSkus = new ProductSkus();
  173. // 产品SKU
  174. $Product = new Product();
  175. // 通过订单ID获取对应的产品
  176. $orderProducts = $OrdersProduct->query()->where([['order_id','=',$orderId]])->select(['product_id','sku_attr_names','buy_num'])->get()->toArray();
  177. // 循环产品
  178. foreach ($orderProducts as $value) {
  179. // 没有产品就不执行
  180. if( !$value['product_id'] ) continue;
  181. // 恢复库存
  182. $ProductSkus->query([['product_id','=',$value['product_id']],['sku_attr_names','=',$value['sku_attr_names']]])->update(['stock'=>DB::raw('stock+'.$value['buy_num'])]);
  183. // 恢复库存
  184. $Product->edit($value['product_id'],['stock'=>DB::raw('stock+'.$value['buy_num'])]);
  185. }
  186. // 恢复库存
  187. return true;
  188. }
  189. }