OrderValidate.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\validate\merchant;
  12. use think\Validate;
  13. use app\common\repositories\store\order\MerchantOrderCreateRepository;
  14. class OrderValidate extends Validate
  15. {
  16. protected $rule = [
  17. 'id|订单id' => 'require|number',
  18. 'uid|用户id' => 'require|number',
  19. 'cart_ids|购物车ids' => 'require|array',
  20. 'address_id|地址id' => 'number',
  21. 'delivery_way|配送方式' => 'require|number|in:0,1,4',
  22. 'use_coupon|使用优惠券' => 'array',
  23. 'is_free_shipping|是否免运费' => 'require|number',
  24. 'use_integral|使用积分' => 'require|number',
  25. 'tourist_unique_key' | '游客唯一标识' => 'require',
  26. 'key' => 'require',
  27. 'mark' => 'max:255',
  28. 'pay_type|支付方式' => 'require',
  29. 'old_pay_price|支付价格' => 'require|float|egt:0|elt:999999.99',
  30. 'phone|手机号' => 'mobile|requireIf:pay_type,balance', // 余额支付时必须
  31. 'sms_code|验证码' => 'length:4|number|requireIf:pay_type,balance', // 余额支付时必须
  32. 'auth_code|条码号' => 'requireIf:pay_type,weixinBarCode|requireIf:pay_type,alipayBarCode', // 条码支付时必须
  33. 'part_start|预约开始时段' => 'require',
  34. 'part_end|预约结束时段' => 'require',
  35. 'order_type|服务方式' =>'require|number',
  36. 'real_name|预约人姓名' =>'require',
  37. 'user_phone|预约人手机号' =>'require|mobile',
  38. 'user_address|预约人地址' =>'requireIf:order_type,0',
  39. 'order_extend|表单信息' =>'array',
  40. 'reservation_date|预约日期' =>'require|dateFormat:Y-m-d',
  41. ];
  42. protected $message = [
  43. 'uid.require' => '用户id不能为空',
  44. 'uid.number' => '用户id格式错误',
  45. 'cart_ids.require' => '购物车ids不能为空',
  46. 'cart_ids.array' => '购物车ids格式错误',
  47. 'address_id.require' => '地址id不能为空',
  48. 'address_id.number' => '地址id格式错误',
  49. 'delivery_way.require' => '配送方式不能为空',
  50. 'delivery_way.number' => '配送方式格式错误',
  51. 'use_coupon.require' => '使用优惠券不能为空',
  52. 'use_coupon.array' => '使用优惠券格式错误',
  53. 'is_free_shipping.require' => '是否免运费不能为空',
  54. 'is_free_shipping.number' => '是否免运费格式错误',
  55. 'use_integral.require' => '使用积分不能为空',
  56. 'use_integral.number' => '使用积分格式错误',
  57. 'key.require' => '订单操作超时,请刷新页面'
  58. ];
  59. protected $scene = [
  60. 'orderCheck' => ['uid', 'cart_ids', 'address_id', 'delivery_way', 'use_coupon', 'is_free_shipping', 'use_integral'],
  61. 'config' => ['uid'],
  62. 'orderCreate' => [
  63. 'uid',
  64. 'cart_ids',
  65. 'address_id',
  66. 'delivery_way',
  67. 'use_coupon',
  68. 'key',
  69. 'pay_type',
  70. 'mark',
  71. 'old_pay_price'
  72. ],
  73. 'orderPay' => ['id', 'uid', 'pay_type', 'phone', 'sms_code', 'auth_code'],
  74. 'payStatus' => ['id', 'uid', 'pay_type'],
  75. 'reschedule' => ['order_type', 'real_name', 'user_phone', 'user_address', 'order_extend','reservation_date','part_start', 'part_end'],
  76. 'reservation_time' => ['reservation_date', 'part_start', 'part_end']
  77. ];
  78. public function sceneCheck(array $data): bool
  79. {
  80. if (!$this->scene('orderCheck')->check($data)) {
  81. return false;
  82. }
  83. if ($data['uid'] != 0 && !empty($data['tourist_unique_key'])) {
  84. $this->error = '用户id和游客唯一标识不能同时存在';
  85. return false;
  86. }
  87. if ($data['uid'] == 0 && empty($data['tourist_unique_key'])) {
  88. $this->error = '游客唯一标识不能为空';
  89. return false;
  90. }
  91. return true;
  92. }
  93. public function sceneCreate(array $data, $merchant): bool
  94. {
  95. if (!$this->scene('orderCreate')->check($data)) {
  96. return false;
  97. }
  98. if ($data['uid'] != 0 && !empty($data['tourist_unique_key'])) {
  99. $this->error = '用户id和游客唯一标识不能同时存在';
  100. return false;
  101. }
  102. if ($data['uid'] == 0 && empty($data['tourist_unique_key'])) {
  103. $this->error = '游客唯一标识不能为空';
  104. return false;
  105. }
  106. if ($data['delivery_way'] == 0 && empty($data['address_id'])) {
  107. $this->error = '地址id不能为空';
  108. return false;
  109. }
  110. if ($data['pay_type'] == 'offline') {
  111. if (!systemConfig('offline_switch')) {
  112. $this->error = '未开启线下支付功能';
  113. return false;
  114. }
  115. if (!(($merchant['offline_switch']) ?? '')) {
  116. $this->error = '该店铺未开启线下支付';
  117. return false;
  118. }
  119. }
  120. return true;
  121. }
  122. public function scenePayConfig(array $data): bool
  123. {
  124. if (!$this->scene('config')->check($data)) {
  125. return false;
  126. }
  127. return true;
  128. }
  129. public function scenePay(array $data, $groupOrder): bool
  130. {
  131. if (!$this->scene('orderPay')->check($data)) {
  132. return false;
  133. }
  134. if (!in_array($data['pay_type'], MerchantOrderCreateRepository::PAY_TYPE)) {
  135. $this->error = '请选择正确的支付方式';
  136. return false;
  137. }
  138. if (!$groupOrder) {
  139. $this->error = '订单不存在或已支付';
  140. return false;
  141. }
  142. if ($data['pay_type'] == 'offline') {
  143. if (count($groupOrder['orderList']) > 1) {
  144. $this->error = '线下支付仅支持同店铺商品';
  145. return false;
  146. }
  147. if (!systemConfig('offline_switch')) {
  148. $this->error = '未开启线下支付功能';
  149. return false;
  150. }
  151. if (!(($groupOrder['orderList'][0]->merchant['offline_switch']) ?? '')) {
  152. $this->error = '该店铺未开启线下支付';
  153. return false;
  154. }
  155. }
  156. if ($data['pay_type'] == 'balance' && $data['uid'] == 0) {
  157. $this->error = '游客不能使用余额支付,请检查支付方式';
  158. return false;
  159. }
  160. return true;
  161. }
  162. public function sceneStatus(array $data): bool
  163. {
  164. if (!$this->scene('payStatus')->check($data)) {
  165. return false;
  166. }
  167. return true;
  168. }
  169. public function sceneReservationReschedule(array $data): bool
  170. {
  171. if (!$this->scene('reschedule')->check($data)) {
  172. return false;
  173. }
  174. return true;
  175. }
  176. public function sceneOnlyReservationTime(array $data): bool
  177. {
  178. if (!$this->scene('reservation_time')->check($data)) {
  179. return false;
  180. }
  181. return true;
  182. }
  183. }